@flexkit/studio 0.2.27 → 0.2.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/{activity-nav-button-DIYOSLHR.js → activity-nav-button-E4I4YC3X.js} +2 -2
  2. package/dist/{activity-nav-button-DIYOSLHR.js.map → activity-nav-button-E4I4YC3X.js.map} +1 -1
  3. package/dist/chat-page-UT5M3PM3.js +4 -0
  4. package/dist/{chat-page-4YW4GADV.js.map → chat-page-UT5M3PM3.js.map} +1 -1
  5. package/dist/{chunk-2IFBQNWA.js → chunk-5LGIALCK.js} +2 -2
  6. package/dist/{chunk-2IFBQNWA.js.map → chunk-5LGIALCK.js.map} +1 -1
  7. package/dist/{chunk-I4UFLN53.js → chunk-6A6NT3H3.js} +3 -3
  8. package/dist/{chunk-I4UFLN53.js.map → chunk-6A6NT3H3.js.map} +1 -1
  9. package/dist/{chunk-FVNVNXEV.js → chunk-7AN2E6TU.js} +2 -2
  10. package/dist/{chunk-FVNVNXEV.js.map → chunk-7AN2E6TU.js.map} +1 -1
  11. package/dist/{chunk-RP2CTEIL.js → chunk-AZG72R2F.js} +3 -3
  12. package/dist/{chunk-RP2CTEIL.js.map → chunk-AZG72R2F.js.map} +1 -1
  13. package/dist/{chunk-4ZRVKNBI.js → chunk-BIFQCOZD.js} +2 -2
  14. package/dist/{chunk-4ZRVKNBI.js.map → chunk-BIFQCOZD.js.map} +1 -1
  15. package/dist/{chunk-JPZFJHZP.js → chunk-BRGTUEFL.js} +2 -2
  16. package/dist/{chunk-JPZFJHZP.js.map → chunk-BRGTUEFL.js.map} +1 -1
  17. package/dist/{chunk-DZTBKBD6.js → chunk-BSUCDQYM.js} +3 -3
  18. package/dist/{chunk-DZTBKBD6.js.map → chunk-BSUCDQYM.js.map} +1 -1
  19. package/dist/{chunk-LG2KGSQ4.js → chunk-D3TJCUTA.js} +2 -2
  20. package/dist/{chunk-LG2KGSQ4.js.map → chunk-D3TJCUTA.js.map} +1 -1
  21. package/dist/{chunk-KOAZBC6O.js → chunk-ERCVR23U.js} +2 -2
  22. package/dist/{chunk-KOAZBC6O.js.map → chunk-ERCVR23U.js.map} +1 -1
  23. package/dist/{chunk-54WDEDM4.js → chunk-FRTHKTAS.js} +2 -2
  24. package/dist/{chunk-54WDEDM4.js.map → chunk-FRTHKTAS.js.map} +1 -1
  25. package/dist/{chunk-TWALS64F.js → chunk-H534S4KD.js} +3 -3
  26. package/dist/{chunk-TWALS64F.js.map → chunk-H534S4KD.js.map} +1 -1
  27. package/dist/{chunk-HAU76X63.js → chunk-RZZOOPEF.js} +3 -3
  28. package/dist/{chunk-HAU76X63.js.map → chunk-RZZOOPEF.js.map} +1 -1
  29. package/dist/chunk-T44KNWQD.js +10 -0
  30. package/dist/chunk-T44KNWQD.js.map +1 -0
  31. package/dist/{chunk-IA5Z6LYD.js → chunk-U6VZY3V2.js} +2 -2
  32. package/dist/chunk-U6VZY3V2.js.map +1 -0
  33. package/dist/{chunk-OM2SSOTB.js → chunk-UET5IDEW.js} +3 -3
  34. package/dist/{chunk-OM2SSOTB.js.map → chunk-UET5IDEW.js.map} +1 -1
  35. package/dist/{chunk-ZA2LLGNZ.js → chunk-ZUGTNE5M.js} +2 -2
  36. package/dist/{chunk-ZA2LLGNZ.js.map → chunk-ZUGTNE5M.js.map} +1 -1
  37. package/dist/{entry-XXLNSL6Q.js → entry-QGRB2B7V.js} +2 -2
  38. package/dist/{entry-XXLNSL6Q.js.map → entry-QGRB2B7V.js.map} +1 -1
  39. package/dist/index.css +15 -0
  40. package/dist/index.js +2 -2
  41. package/dist/{list-52ORZRD5.js → list-L6YZSBWF.js} +3 -3
  42. package/dist/{list-52ORZRD5.js.map → list-L6YZSBWF.js.map} +1 -1
  43. package/dist/{list-EFL32GDI.js → list-OPL5OO32.js} +2 -2
  44. package/dist/{list-EFL32GDI.js.map → list-OPL5OO32.js.map} +1 -1
  45. package/dist/{pages-VIE6KUBE.js → pages-K4XZAMXY.js} +3 -3
  46. package/dist/{pages-VIE6KUBE.js.map → pages-K4XZAMXY.js.map} +1 -1
  47. package/dist/{plugin-pages-HTXOLHG2.js → plugin-pages-RCWAF6VC.js} +2 -2
  48. package/dist/{plugin-pages-HTXOLHG2.js.map → plugin-pages-RCWAF6VC.js.map} +1 -1
  49. package/dist/record-links-R7OV4VVH.js +2 -0
  50. package/dist/{record-links-NPBFSAHR.js.map → record-links-R7OV4VVH.js.map} +1 -1
  51. package/dist/{root-2AXD4MNR.js → root-36COMEVE.js} +2 -2
  52. package/dist/{root-2AXD4MNR.js.map → root-36COMEVE.js.map} +1 -1
  53. package/dist/{root-27HUK3RU.js → root-3M4DIRWC.js} +2 -2
  54. package/dist/{root-27HUK3RU.js.map → root-3M4DIRWC.js.map} +1 -1
  55. package/dist/{root-K7JKAYLS.js → root-HETKL6EN.js} +2 -2
  56. package/dist/{root-K7JKAYLS.js.map → root-HETKL6EN.js.map} +1 -1
  57. package/dist/{root-2QPYALTV.js → root-L6Y4PSSA.js} +3 -3
  58. package/dist/{root-2QPYALTV.js.map → root-L6Y4PSSA.js.map} +1 -1
  59. package/dist/{root-M62U2FKR.js → root-R4Y6L62R.js} +3 -3
  60. package/dist/{root-M62U2FKR.js.map → root-R4Y6L62R.js.map} +1 -1
  61. package/dist/{root-7ZAUENIS.js → root-XMZYVO37.js} +3 -3
  62. package/dist/{root-7ZAUENIS.js.map → root-XMZYVO37.js.map} +1 -1
  63. package/dist/{search-FJUNXO53.js → search-UXL3U2EH.js} +2 -2
  64. package/dist/{search-FJUNXO53.js.map → search-UXL3U2EH.js.map} +1 -1
  65. package/dist/skills-pages-KEXNO6DN.js +2 -0
  66. package/dist/skills-pages-KEXNO6DN.js.map +1 -0
  67. package/dist/{source-INDEOHP7.js → source-CWVJGMEZ.js} +2 -2
  68. package/dist/{source-INDEOHP7.js.map → source-CWVJGMEZ.js.map} +1 -1
  69. package/package.json +3 -3
  70. package/dist/chat-page-4YW4GADV.js +0 -4
  71. package/dist/chunk-32M62H3K.js +0 -8
  72. package/dist/chunk-32M62H3K.js.map +0 -1
  73. package/dist/chunk-IA5Z6LYD.js.map +0 -1
  74. package/dist/record-links-NPBFSAHR.js +0 -2
  75. package/dist/skills-pages-Q6NGTRVW.js +0 -2
  76. package/dist/skills-pages-Q6NGTRVW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/apps/ai/markdown-editor.tsx","../src/apps/ai/skills-pages.tsx"],"names":["isDarkTheme","root","editorChrome","EditorView","themeExtensions","dark","darkTheme","lightTheme","readOnlyExtensions","readOnly","EditorState","contentAttributes","options","attributes","MarkdownEditor","ariaDescribedBy","ariaInvalid","ariaLabel","ariaLabelledBy","className","onBlur","onChange","onSave","placeholder","value","parentRef","useRef","viewRef","themeCompartmentRef","Compartment","readOnlyCompartmentRef","a11yCompartmentRef","onBlurRef","onChangeRef","onSaveRef","valueRef","useEffect","parent","view","lineNumbers","highlightActiveLineGutter","highlightSpecialChars","history","foldGutter","drawSelection","dropCursor","indentOnInput","bracketMatching","highlightActiveLine","highlightSelectionMatches","markdown","languages","keymap","defaultKeymap","historyKeymap","searchKeymap","foldKeymap","indentWithTab","Prec","update","placeholderExtension","resizeObserver","themeObserver","current","jsx","SKILLS_PAGE_SIZE","SKILL_SKELETON_ROWS","SkillListSkeleton","jsxs","row","Skeleton","skillMarkdownComponents","children","_node","props","part","useProjectApi","currentProjectId","useConfig","useMemo","createApiClient","PageMessage","InfiniteScrollSentinel","onVisible","sentinelRef","onVisibleRef","node","observer","entries","entry","getSkillVisibilityLabel","skill","spaceLabelById","SkillLogo","PluginLogo","GraduationCapIcon","SkillsPage","api","projectId","navigate","useNavigate","search","setSearch","useState","canMutate","useCanMutate","hasActiveFilters","getSkillsKey","pageIndex","previousPage","paths","skillPages","isLoading","setSize","size","useSWRInfinite","fetcher","skills","page","hasMore","isLoadingMore","isInitialLoading","handleLoadMore","currentSize","emptyMessage","content","Alert","AlertDescription","CatalogHeader","Input","event","Button","Link","Plus","PermissionTooltip","LoaderCircle","FieldError","id","message","FieldHintLabel","hint","htmlFor","Label","Tooltip","TooltipTrigger","Info","TooltipContent","SkillPageHeader","actions","title","Fragment","SidebarTrigger","Separator","ArrowLeft","SkillDetailSkeleton","field","SkillContentPane","showContentError","validationMessage","viewMode","setViewMode","fieldId","useId","isOverLimit","preview","Markdown","Tabs","TabsList","TabsTrigger","PenLine","Eye","ScrollArea","SkillForm","mode","onSaved","name","setName","description","setDescription","setContent","visibility","setVisibility","spaceId","setSpaceId","isSaving","setIsSaving","isSavingRef","setMessage","touched","setTouched","spacesData","useSWR","auth","useAuth","userSpaceCodes","selectableSpaces","space","contentError","validation","isValid","showNameError","showDescriptionError","saveLabel","save","input","result","toast","error","handleSubmit","deleteSkill","Trash2","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","ReadOnlyCodeSkill","forking","setForking","forkError","setForkError","fork","response","Badge","CreateSkillPage","SkillDetailPage","skillId","useParams","data","mutate"],"mappings":"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","file":"skills-pages-KEXNO6DN.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useRef } from 'react';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { languages } from '@codemirror/language-data';\nimport { bracketMatching, foldGutter, foldKeymap, indentOnInput } from '@codemirror/language';\nimport { highlightSelectionMatches, searchKeymap } from '@codemirror/search';\nimport { Compartment, EditorState, Prec } from '@codemirror/state';\nimport {\n drawSelection,\n dropCursor,\n EditorView,\n highlightActiveLine,\n highlightActiveLineGutter,\n highlightSpecialChars,\n keymap,\n lineNumbers,\n placeholder as placeholderExtension,\n} from '@codemirror/view';\nimport { lightTheme, darkTheme } from './markdown-editor-themes';\n\nexport interface MarkdownEditorProps {\n ariaDescribedBy?: string;\n ariaInvalid?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n className?: string;\n onBlur?: () => void;\n onChange?: (_value: string) => void;\n onSave?: () => void;\n placeholder?: string;\n readOnly?: boolean;\n value: string;\n}\n\nfunction isDarkTheme(): boolean {\n const root = document.documentElement;\n\n return (\n root.getAttribute('data-theme') === 'dark' || root.classList.contains('dark') || root.style.colorScheme === 'dark'\n );\n}\n\nconst editorChrome = EditorView.theme({\n '&': {\n fontSize: '13px',\n height: '100%',\n maxHeight: '100%',\n maxWidth: '100%',\n minHeight: '0',\n minWidth: '0',\n width: '100%',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-scroller': {\n height: '100%',\n lineHeight: '1.6',\n minHeight: '0',\n minWidth: '0',\n overflow: 'auto',\n width: '100%',\n },\n '.cm-content': {\n fontSize: '13px',\n fontStyle: 'normal',\n fontWeight: '400',\n minWidth: '0 !important',\n padding: '12px 0',\n },\n '.cm-line, .cm-line span': {\n fontSize: 'inherit',\n fontStyle: 'inherit',\n fontWeight: 'inherit',\n lineHeight: 'inherit',\n },\n '.cm-gutters': {\n borderRight: '1px solid transparent',\n },\n '.cm-foldPlaceholder': {\n backgroundColor: 'transparent',\n border: 'none',\n },\n});\n\nfunction themeExtensions(dark: boolean) {\n return [dark ? darkTheme : lightTheme, editorChrome];\n}\n\nfunction readOnlyExtensions(readOnly: boolean) {\n return [EditorState.readOnly.of(readOnly), EditorView.editable.of(!readOnly)];\n}\n\nfunction contentAttributes(options: {\n ariaDescribedBy?: string;\n ariaInvalid?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n readOnly?: boolean;\n}): { [name: string]: string } {\n const attributes: { [name: string]: string } = {\n 'aria-multiline': 'true',\n role: 'textbox',\n };\n\n if (options.ariaLabel) {\n attributes['aria-label'] = options.ariaLabel;\n }\n\n if (options.ariaLabelledBy) {\n attributes['aria-labelledby'] = options.ariaLabelledBy;\n }\n\n if (options.ariaDescribedBy) {\n attributes['aria-describedby'] = options.ariaDescribedBy;\n }\n\n if (options.ariaInvalid) {\n attributes['aria-invalid'] = 'true';\n }\n\n if (options.readOnly) {\n attributes['aria-readonly'] = 'true';\n }\n\n return attributes;\n}\n\nexport function MarkdownEditor({\n ariaDescribedBy,\n ariaInvalid,\n ariaLabel,\n ariaLabelledBy,\n className,\n onBlur,\n onChange,\n onSave,\n placeholder,\n readOnly = false,\n value,\n}: MarkdownEditorProps): JSX.Element {\n const parentRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const themeCompartmentRef = useRef(new Compartment());\n const readOnlyCompartmentRef = useRef(new Compartment());\n const a11yCompartmentRef = useRef(new Compartment());\n const onBlurRef = useRef(onBlur);\n const onChangeRef = useRef(onChange);\n const onSaveRef = useRef(onSave);\n const valueRef = useRef(value);\n\n onBlurRef.current = onBlur;\n onChangeRef.current = onChange;\n onSaveRef.current = onSave;\n valueRef.current = value;\n\n useEffect(() => {\n const parent = parentRef.current;\n\n if (!parent) {\n return;\n }\n\n const view = new EditorView({\n parent,\n state: EditorState.create({\n doc: valueRef.current,\n extensions: [\n lineNumbers(),\n highlightActiveLineGutter(),\n highlightSpecialChars(),\n history(),\n foldGutter(),\n drawSelection(),\n dropCursor(),\n EditorState.allowMultipleSelections.of(true),\n indentOnInput(),\n bracketMatching(),\n highlightActiveLine(),\n highlightSelectionMatches(),\n EditorView.lineWrapping,\n markdown({ codeLanguages: languages }),\n keymap.of([...defaultKeymap, ...historyKeymap, ...searchKeymap, ...foldKeymap, indentWithTab]),\n Prec.highest(\n keymap.of([\n {\n key: 'Mod-s',\n run: () => {\n onSaveRef.current?.();\n\n return true;\n },\n },\n ])\n ),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current?.(update.state.doc.toString());\n }\n\n if (update.focusChanged && !update.view.hasFocus) {\n onBlurRef.current?.();\n }\n }),\n themeCompartmentRef.current.of(themeExtensions(isDarkTheme())),\n readOnlyCompartmentRef.current.of(readOnlyExtensions(readOnly)),\n a11yCompartmentRef.current.of(\n EditorView.contentAttributes.of(\n contentAttributes({\n ariaDescribedBy,\n ariaInvalid,\n ariaLabel,\n ariaLabelledBy,\n readOnly,\n })\n )\n ),\n ...(placeholder ? [placeholderExtension(placeholder)] : []),\n ],\n }),\n });\n\n viewRef.current = view;\n\n const resizeObserver = new ResizeObserver(() => {\n view.requestMeasure();\n });\n\n resizeObserver.observe(parent);\n\n const themeObserver = new MutationObserver(() => {\n view.dispatch({\n effects: themeCompartmentRef.current.reconfigure(themeExtensions(isDarkTheme())),\n });\n });\n\n themeObserver.observe(document.documentElement, {\n attributeFilter: ['class', 'data-theme', 'style'],\n attributes: true,\n });\n\n return () => {\n resizeObserver.disconnect();\n themeObserver.disconnect();\n view.destroy();\n viewRef.current = null;\n };\n // Mount once; later prop changes are applied through compartments / document transactions.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- editor view is created once\n }, []);\n\n useEffect(() => {\n const view = viewRef.current;\n\n if (!view) {\n return;\n }\n\n view.dispatch({\n effects: themeCompartmentRef.current.reconfigure(themeExtensions(isDarkTheme())),\n });\n // Imported palettes live at module scope; this re-applies them after tsup/HMR.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- theme extensions change on hot reload\n }, [lightTheme, darkTheme]);\n\n useEffect(() => {\n const view = viewRef.current;\n\n if (!view) {\n return;\n }\n\n const current = view.state.doc.toString();\n\n if (current === value) {\n return;\n }\n\n view.dispatch({\n changes: { from: 0, to: current.length, insert: value },\n });\n }, [value]);\n\n useEffect(() => {\n const view = viewRef.current;\n\n if (!view) {\n return;\n }\n\n view.dispatch({\n effects: [\n readOnlyCompartmentRef.current.reconfigure(readOnlyExtensions(readOnly)),\n a11yCompartmentRef.current.reconfigure(\n EditorView.contentAttributes.of(\n contentAttributes({\n ariaDescribedBy,\n ariaInvalid,\n ariaLabel,\n ariaLabelledBy,\n readOnly,\n })\n )\n ),\n ],\n });\n }, [ariaDescribedBy, ariaInvalid, ariaLabel, ariaLabelledBy, readOnly]);\n\n return (\n <div className={className ?? 'fk:h-full fk:min-h-0 fk:min-w-0 fk:w-full fk:overflow-hidden'} ref={parentRef} />\n );\n}\n","import type { FormEvent, JSX } from 'react';\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { ArrowLeft, Eye, GraduationCapIcon, Info, LoaderCircle, PenLine, Plus, Trash2 } from 'lucide-react';\nimport Markdown, { type Components } from 'react-markdown';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { useCanMutate } from '../../core/permissions';\nimport { useConfig } from '../../core/config/config-context';\nimport { MAX_SKILL_CONTENT_LENGTH } from './skill-limits';\nimport {\n Alert,\n AlertDescription,\n Badge,\n Button,\n Input,\n Label,\n PermissionTooltip,\n ScrollArea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Separator,\n SidebarTrigger,\n Skeleton,\n Tabs,\n TabsList,\n TabsTrigger,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { createApiClient, fetcher, paths, type ApiClient } from './api';\nimport { MarkdownEditor } from './markdown-editor';\nimport { CatalogHeader } from './plugin-pages';\nimport type { AutomationVisibility, ProjectSpace, Skill, SkillInput, SkillsList } from './types';\nimport { PluginLogo } from './plugin-logo';\n\nconst SKILLS_PAGE_SIZE = 25;\n\nconst SKILL_SKELETON_ROWS: { descriptionWidth: string; id: string; nameWidth: string }[] = [\n { descriptionWidth: 'fk:w-44', id: 'skill-a', nameWidth: 'fk:w-28' },\n { descriptionWidth: 'fk:w-52', id: 'skill-b', nameWidth: 'fk:w-20' },\n { descriptionWidth: 'fk:w-40', id: 'skill-c', nameWidth: 'fk:w-36' },\n { descriptionWidth: 'fk:w-48', id: 'skill-d', nameWidth: 'fk:w-24' },\n { descriptionWidth: 'fk:w-36', id: 'skill-e', nameWidth: 'fk:w-32' },\n { descriptionWidth: 'fk:w-56', id: 'skill-f', nameWidth: 'fk:w-16' },\n];\n\nfunction SkillListSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:grid fk:grid-cols-1 fk:gap-x-16 fk:gap-y-1 fk:lg:grid-cols-2\">\n <span className=\"fk:sr-only\">Loading skills</span>\n {SKILL_SKELETON_ROWS.map((row) => (\n <div className=\"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:px-3 fk:py-2\" key={row.id}>\n <Skeleton className=\"fk:size-10 fk:shrink-0 fk:rounded-lg\" />\n <span className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-1.5\">\n <Skeleton className={`fk:h-4 ${row.nameWidth}`} />\n <Skeleton className={`fk:h-4 ${row.descriptionWidth}`} />\n </span>\n </div>\n ))}\n </div>\n );\n}\n\nconst skillMarkdownComponents: Components = {\n code({ children, className, node: _node, ...props }) {\n const isFenced = typeof className === 'string' && className.split(' ').some((part) => part.startsWith('language-'));\n\n if (isFenced) {\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n }\n\n return (\n <code\n className=\"fk:rounded fk:bg-muted fk:px-1.5 fk:py-0.5 fk:font-mono fk:text-[0.875em] fk:font-medium fk:before:content-none fk:after:content-none fk:corner-squircle\"\n {...props}\n >\n {children}\n </code>\n );\n },\n};\n\nfunction useProjectApi(): { api: ApiClient | null; projectId: string | undefined } {\n const { currentProjectId } = useConfig();\n const api = useMemo(() => (currentProjectId ? createApiClient(currentProjectId) : null), [currentProjectId]);\n\n return { api, projectId: currentProjectId };\n}\n\nfunction PageMessage({ children }: { children: string }): JSX.Element {\n return (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground fk:corner-squircle\">\n {children}\n </div>\n );\n}\n\nfunction InfiniteScrollSentinel({ onVisible }: { onVisible: () => void }): JSX.Element {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const onVisibleRef = useRef(onVisible);\n\n onVisibleRef.current = onVisible;\n\n useEffect(() => {\n const node = sentinelRef.current;\n\n if (!node) {\n return;\n }\n\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n onVisibleRef.current();\n }\n });\n\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n return <div aria-hidden className=\"fk:h-px\" ref={sentinelRef} />;\n}\n\nfunction getSkillVisibilityLabel(skill: Skill, spaceLabelById: Map<string, string>): string {\n if (skill.visibility === 'space') {\n return (skill.spaceId ? spaceLabelById.get(skill.spaceId) : undefined) ?? 'Space';\n }\n\n if (skill.visibility === 'personal') {\n return 'Personal';\n }\n\n return 'Project';\n}\n\nfunction SkillLogo({ skill }: { skill: Skill }): JSX.Element {\n if (skill.logoUrl) {\n return <PluginLogo className=\"fk:size-10 fk:rounded-lg\" src={skill.logoUrl} />;\n }\n\n return (\n <span className=\"fk:flex fk:size-10 fk:shrink-0 fk:items-center fk:justify-center fk:rounded-lg fk:bg-muted fk:text-muted-foreground fk:corner-squircle\">\n <GraduationCapIcon className=\"fk:size-5\" />\n </span>\n );\n}\n\nexport function SkillsPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const navigate = useNavigate();\n const [search, setSearch] = useState('');\n const canMutate = useCanMutate();\n const hasActiveFilters = search.trim().length > 0;\n\n const getSkillsKey = (pageIndex: number, previousPage: SkillsList | null): string | null => {\n if (!projectId) {\n return null;\n }\n\n if (previousPage && !previousPage.hasMore) {\n return null;\n }\n\n return paths(projectId).skills({\n limit: SKILLS_PAGE_SIZE,\n offset: pageIndex * SKILLS_PAGE_SIZE,\n search: search.trim() || undefined,\n });\n };\n const { data: skillPages, isLoading, setSize, size } = useSWRInfinite<SkillsList>(getSkillsKey, fetcher);\n const skills = skillPages?.flatMap((page) => page.skills) ?? [];\n const lastPage = skillPages?.[skillPages.length - 1];\n const hasMore = lastPage?.hasMore ?? false;\n const isLoadingMore = skillPages !== undefined && size > skillPages.length;\n const isInitialLoading = isLoading && skills.length === 0;\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to view skills.</PageMessage>;\n }\n\n function handleLoadMore(): void {\n void setSize((currentSize) => currentSize + 1);\n }\n\n let emptyMessage = 'No skills yet.';\n\n if (hasActiveFilters) {\n emptyMessage = 'No skills match your search.';\n }\n\n let content: JSX.Element = (\n <div className=\"fk:grid fk:grid-cols-1 fk:gap-x-16 fk:gap-y-1 fk:lg:grid-cols-2\">\n {skills.map((skill) => (\n <button\n key={skill.id}\n type=\"button\"\n onClick={() => navigate(skill.id)}\n className=\"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-3 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:corner-squircle\"\n >\n <SkillLogo skill={skill} />\n <span className=\"fk:min-w-0 fk:flex-1\">\n <span className=\"fk:block fk:truncate fk:text-sm fk:font-medium\">{skill.name}</span>\n <span className=\"fk:block fk:truncate fk:text-sm fk:text-muted-foreground\">{skill.description}</span>\n </span>\n </button>\n ))}\n </div>\n );\n\n if (isInitialLoading) {\n content = <SkillListSkeleton />;\n } else if (skills.length === 0) {\n content = (\n <Alert>\n <AlertDescription>{emptyMessage}</AlertDescription>\n </Alert>\n );\n }\n\n return (\n <main className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">\n <CatalogHeader />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6\">\n <div>\n <h2 className=\"fk:text-2xl fk:font-semibold\">Skills for your agents</h2>\n <p className=\"fk:mt-2 fk:text-muted-foreground\">\n Reusable Markdown instructions that agents load when relevant, or always when attached to an automation.\n </p>\n </div>\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-3\">\n <Input\n aria-label=\"Search skills\"\n className=\"fk:w-full fk:max-w-xs\"\n placeholder=\"Search skills…\"\n value={search}\n onChange={(event) => {\n void setSize(1);\n setSearch(event.target.value);\n }}\n />\n {canMutate ? (\n <Button asChild className=\"fk:ml-auto\" size=\"sm\">\n <Link to=\"new\">\n <Plus />\n New Skill\n </Link>\n </Button>\n ) : (\n <PermissionTooltip disabled>\n <Button className=\"fk:ml-auto\" disabled size=\"sm\">\n <Plus />\n New Skill\n </Button>\n </PermissionTooltip>\n )}\n </div>\n {content}\n {hasMore && !isLoadingMore ? <InfiniteScrollSentinel onVisible={handleLoadMore} /> : null}\n {isLoadingMore ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Loading more skills...</span>\n </div>\n ) : null}\n </div>\n </div>\n </main>\n );\n}\n\nfunction FieldError({ className, id, message }: { className?: string; id?: string; message: string }): JSX.Element {\n return (\n <p className={`fk:text-sm fk:text-destructive ${className ?? ''}`} id={id}>\n {message}\n </p>\n );\n}\n\nfunction FieldHintLabel({\n children,\n hint,\n htmlFor,\n id,\n}: {\n children: string;\n hint: string;\n htmlFor?: string;\n id?: string;\n}): JSX.Element {\n return (\n <div className=\"fk:mb-1.5 fk:pl-2.5 fk:flex fk:items-center fk:gap-1\">\n <Label htmlFor={htmlFor} id={id}>\n {children}\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n aria-label={`About ${children.toLowerCase()}`}\n className=\"fk:rounded-sm fk:text-muted-foreground hover:fk:text-foreground fk:corner-squircle\"\n type=\"button\"\n >\n <Info className=\"fk:size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"fk:max-w-xs\">{hint}</TooltipContent>\n </Tooltip>\n </div>\n );\n}\n\nfunction SkillPageHeader({ actions, title }: { actions?: JSX.Element; title: string | JSX.Element }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:shrink-0 fk:w-fit\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Skills\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SkillDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:overflow-hidden fk:pb-3\">\n <span className=\"fk:sr-only\">Loading skill</span>\n <SkillPageHeader actions={<Skeleton className=\"fk:h-8 fk:w-24\" />} title={<Skeleton className=\"fk:h-5 fk:w-40\" />} />\n <div className=\"fk:m-auto fk:flex fk:min-h-0 fk:w-full fk:max-w-6xl fk:flex-1 fk:flex-col fk:gap-8 fk:px-6\">\n <div className=\"fk:grid fk:shrink-0 fk:gap-3 fk:lg:grid-cols-[minmax(0,1fr)_minmax(0,1.6fr)_auto]\">\n {['name', 'description'].map((field) => (\n <div className=\"fk:flex fk:flex-col fk:gap-2\" key={field}>\n <Skeleton className=\"fk:h-4 fk:w-20\" />\n <Skeleton className=\"fk:h-9 fk:w-full\" />\n </div>\n ))}\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <Skeleton className=\"fk:h-4 fk:w-20\" />\n <Skeleton className=\"fk:h-9 fk:w-32\" />\n </div>\n </div>\n <div className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col fk:gap-1.5\">\n <Skeleton className=\"fk:h-4 fk:w-16\" />\n <Skeleton className=\"fk:min-h-48 fk:flex-1 fk:rounded-md\" />\n </div>\n </div>\n </div>\n );\n}\n\nexport function SkillContentPane({\n content,\n onBlur,\n onChange,\n onSave,\n readOnly = false,\n showContentError,\n validationMessage,\n}: {\n content: string;\n onBlur?: () => void;\n onChange?: (_value: string) => void;\n onSave?: () => void;\n readOnly?: boolean;\n showContentError?: boolean;\n validationMessage?: string;\n}): JSX.Element {\n const [viewMode, setViewMode] = useState<'preview' | 'write'>('write');\n const fieldId = useId();\n const isOverLimit = content.length > MAX_SKILL_CONTENT_LENGTH;\n let preview: JSX.Element;\n\n if (content.trim()) {\n preview = <Markdown components={skillMarkdownComponents}>{content}</Markdown>;\n } else {\n preview = <p className=\"fk:text-muted-foreground\">Nothing to preview.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-1.5\">\n <div className=\"fk:pl-3.25 fk:flex fk:shrink-0 fk:items-center fk:gap-1\">\n <Label htmlFor={fieldId} id={`${fieldId}-label`}>\n Content\n </Label>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n aria-label=\"About skill content\"\n className=\"fk:rounded-sm fk:text-muted-foreground hover:fk:text-foreground fk:corner-squircle\"\n type=\"button\"\n >\n <Info className=\"fk:size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"fk:max-w-sm\">\n The skill itself, in Markdown. Write it like instructions for a capable colleague: procedures, rules,\n examples, and edge cases. Attached skills are always loaded; other visible skills are loaded on demand.\n </TooltipContent>\n </Tooltip>\n </div>\n <div\n className={`fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:ml-0.75 fk:overflow-hidden fk:rounded-md fk:border ${showContentError ? 'fk:border-destructive' : ''} fk:corner-squircle`}\n >\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:justify-between fk:gap-2 fk:border-b fk:px-2.5 fk:py-1\">\n <Tabs\n value={viewMode}\n onValueChange={(value) => {\n setViewMode(value === 'preview' ? 'preview' : 'write');\n }}\n >\n <TabsList>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"fk:inline-flex\">\n <TabsTrigger aria-label=\"Write\" className=\"fk:px-2.5\" value=\"write\">\n <PenLine className=\"fk:size-3.5\" />\n </TabsTrigger>\n </span>\n </TooltipTrigger>\n <TooltipContent>Write</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"fk:inline-flex\">\n <TabsTrigger aria-label=\"Preview\" className=\"fk:px-2.5\" value=\"preview\">\n <Eye className=\"fk:size-3.5\" />\n </TabsTrigger>\n </span>\n </TooltipTrigger>\n <TooltipContent>Preview</TooltipContent>\n </Tooltip>\n </TabsList>\n </Tabs>\n <span className={isOverLimit ? 'fk:text-xs fk:text-destructive' : 'fk:text-xs fk:text-muted-foreground'}>\n {content.length.toLocaleString()} / {MAX_SKILL_CONTENT_LENGTH.toLocaleString()}\n </span>\n </div>\n <div className=\"fk:min-h-0 fk:min-w-0 fk:flex-1 fk:overflow-hidden\" hidden={viewMode !== 'write'}>\n <MarkdownEditor\n ariaDescribedBy={showContentError ? `${fieldId}-error` : undefined}\n ariaInvalid={showContentError}\n ariaLabelledBy={`${fieldId}-label`}\n className=\"fk:h-full fk:min-h-0 fk:min-w-0 fk:w-full fk:overflow-hidden\"\n readOnly={readOnly}\n value={content}\n onBlur={onBlur}\n onChange={onChange}\n onSave={onSave}\n />\n </div>\n {viewMode === 'preview' ? (\n <ScrollArea className=\"fk:min-h-0 fk:flex-1\">\n <div className=\"fk:prose fk:prose-sm fk:dark:prose-invert fk:max-w-none fk:px-4 fk:py-3\">{preview}</div>\n </ScrollArea>\n ) : null}\n {showContentError && validationMessage ? (\n <FieldError className=\"fk:border-t fk:px-3 fk:py-2\" id={`${fieldId}-error`} message={validationMessage} />\n ) : null}\n </div>\n </div>\n );\n}\n\ninterface SkillFormProps {\n api: ApiClient;\n mode: 'create' | 'edit';\n onSaved: (_skill?: Skill) => void;\n projectId: string;\n skill?: Skill;\n}\n\nexport function SkillForm({ api, mode, onSaved, projectId, skill }: SkillFormProps): JSX.Element {\n const [name, setName] = useState(skill?.name ?? '');\n const [description, setDescription] = useState(skill?.description ?? '');\n const [content, setContent] = useState(skill?.content ?? '');\n const [visibility, setVisibility] = useState<AutomationVisibility>(skill?.visibility ?? 'project');\n const [spaceId, setSpaceId] = useState<string | null>(skill?.spaceId ?? null);\n const [isSaving, setIsSaving] = useState(false);\n const isSavingRef = useRef(false);\n const [message, setMessage] = useState('');\n const [touched, setTouched] = useState({ content: false, description: false, name: false });\n const navigate = useNavigate();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(paths(projectId).spaces, fetcher);\n const [, auth] = useAuth();\n const canMutate = useCanMutate();\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only spaces the caller belongs to are offered; the server rejects\n // bindings to spaces outside the caller's membership anyway.\n const selectableSpaces = (spacesData?.spaces ?? []).filter((space) => userSpaceCodes.includes(space.code));\n let contentError = '';\n\n if (!content.trim()) {\n contentError = 'Content is required';\n } else if (content.length > MAX_SKILL_CONTENT_LENGTH) {\n contentError = `Content must be at most ${String(MAX_SKILL_CONTENT_LENGTH)} characters`;\n }\n\n const validation = {\n content: contentError,\n description: description.trim() ? '' : 'Description is required',\n name: name.trim() ? '' : 'Name is required',\n space: visibility === 'space' && !spaceId ? 'Select a space' : '',\n };\n const isValid = !validation.content && !validation.description && !validation.name && !validation.space;\n const showNameError = touched.name && Boolean(validation.name);\n const showDescriptionError = touched.description && Boolean(validation.description);\n const showContentError = touched.content && Boolean(validation.content);\n const title = mode === 'create' ? 'New Skill' : (skill?.name ?? 'Skill');\n let saveLabel = 'Update skill';\n\n if (isSaving) {\n saveLabel = 'Saving...';\n } else if (mode === 'create') {\n saveLabel = 'Create skill';\n }\n\n async function save(): Promise<void> {\n if (!canMutate || isSavingRef.current) {\n return;\n }\n\n if (!isValid) {\n setTouched({ content: true, description: true, name: true });\n\n return;\n }\n\n isSavingRef.current = true;\n setIsSaving(true);\n setMessage('');\n\n const input: SkillInput = {\n content,\n description,\n name,\n spaceId: visibility === 'space' ? spaceId : null,\n visibility,\n };\n\n try {\n const result =\n mode === 'create' || !skill ? await api.createSkill(input) : await api.updateSkill(skill.id, input);\n\n if (!result.success) {\n setMessage(Array.isArray(result.errorMessage) ? result.errorMessage.join(', ') : result.errorMessage);\n\n return;\n }\n\n toast.success(mode === 'create' || !skill ? 'Skill created.' : 'Skill saved.');\n onSaved(result.skill);\n } catch (error) {\n setMessage(error instanceof Error ? error.message : 'Failed to save skill.');\n } finally {\n isSavingRef.current = false;\n setIsSaving(false);\n }\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>): Promise<void> {\n event.preventDefault();\n await save();\n }\n\n async function deleteSkill(): Promise<void> {\n if (!skill || !canMutate || isSavingRef.current) {\n return;\n }\n\n isSavingRef.current = true;\n setIsSaving(true);\n setMessage('');\n\n try {\n const result = await api.deleteSkill(skill.id);\n\n if (!result.success) {\n setMessage(Array.isArray(result.errorMessage) ? result.errorMessage.join(', ') : result.errorMessage);\n\n return;\n }\n\n navigate('..', { relative: 'path' });\n } catch (error) {\n setMessage(error instanceof Error ? error.message : 'Failed to delete skill.');\n } finally {\n isSavingRef.current = false;\n setIsSaving(false);\n }\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SkillPageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-3\">\n {!isValid ? (\n <span className=\"fk:text-xs fk:text-muted-foreground\">Complete the required fields to save</span>\n ) : null}\n {mode === 'edit' && skill ? (\n <Button disabled={isSaving || !canMutate} size=\"sm\" type=\"button\" variant=\"outline\" onClick={() => void deleteSkill()}>\n <Trash2 />\n Delete\n </Button>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button disabled={isSaving || !isValid || !canMutate} form=\"skill-editor-form\" size=\"sm\" type=\"submit\">\n {saveLabel}\n </Button>\n </PermissionTooltip>\n </div>\n }\n title={title}\n />\n {message ? (\n <div className=\"fk:shrink-0 fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-3 fk:text-sm fk:text-destructive fk:corner-squircle\">\n {message}\n </div>\n ) : null}\n <form\n className=\"fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-6 fk:w-full fk:max-w-6xl fk:m-auto fk:gap-8 fk:px-4\"\n id=\"skill-editor-form\"\n onSubmit={(event) => void handleSubmit(event)}\n >\n <div className=\"fk:grid fk:min-w-0 fk:shrink-0 fk:gap-3 fk:px-0.75 fk:lg:grid-cols-[minmax(0,1fr)_minmax(0,1.6fr)_auto]\">\n <div>\n <FieldHintLabel hint=\"Identifying label for this skill\" htmlFor=\"skill-name\">\n Name\n </FieldHintLabel>\n <Input\n aria-describedby={showNameError ? 'skill-name-error' : undefined}\n aria-invalid={showNameError}\n className={showNameError ? 'fk:border-destructive focus-visible:fk:ring-destructive' : ''}\n id=\"skill-name\"\n value={name}\n onBlur={() => setTouched((current) => ({ ...current, name: true }))}\n onChange={(event) => setName(event.target.value)}\n />\n {showNameError ? <FieldError id=\"skill-name-error\" message={validation.name} /> : null}\n </div>\n <div>\n <FieldHintLabel\n hint=\"One or two sentences describing when to use this skill. Agents rely on it to decide whether the skill applies to their current task.\"\n htmlFor=\"skill-description\"\n >\n Description\n </FieldHintLabel>\n <Input\n aria-describedby={showDescriptionError ? 'skill-description-error' : undefined}\n aria-invalid={showDescriptionError}\n className={showDescriptionError ? 'fk:border-destructive focus-visible:fk:ring-destructive' : ''}\n id=\"skill-description\"\n placeholder=\"e.g. Rules for writing product descriptions in our brand voice\"\n value={description}\n onBlur={() => setTouched((current) => ({ ...current, description: true }))}\n onChange={(event) => setDescription(event.target.value)}\n />\n {showDescriptionError ? <FieldError id=\"skill-description-error\" message={validation.description} /> : null}\n </div>\n <div>\n <FieldHintLabel\n hint=\"Who can see and use this skill. Space skills are only visible to members of the selected space and only usable by automations in that space; personal skills are private to you.\"\n htmlFor=\"skill-visibility\"\n >\n Visibility\n </FieldHintLabel>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Select\n value={visibility}\n onValueChange={(value) => {\n setVisibility(value === 'space' || value === 'personal' ? value : 'project');\n\n if (value !== 'space') {\n setSpaceId(null);\n }\n }}\n >\n <SelectTrigger aria-label=\"Visibility\" className=\"fk:w-fit fk:min-w-26\" id=\"skill-visibility\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"start\">\n <SelectItem value=\"project\">Project</SelectItem>\n <SelectItem disabled={selectableSpaces.length === 0} value=\"space\">\n Space\n </SelectItem>\n <SelectItem value=\"personal\">Personal</SelectItem>\n </SelectContent>\n </Select>\n {visibility === 'space' ? (\n <Select\n value={spaceId ?? ''}\n onValueChange={(value) => {\n setSpaceId(value || null);\n }}\n >\n <SelectTrigger aria-label=\"Space\" className=\"fk:w-fit fk:min-w-34\">\n <SelectValue placeholder=\"Select a space\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n {selectableSpaces.map((space) => (\n <SelectItem key={space.id} value={space.id}>\n {space.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\n {visibility === 'space' && validation.space ? <FieldError message={validation.space} /> : null}\n </div>\n </div>\n <SkillContentPane\n content={content}\n showContentError={showContentError}\n validationMessage={validation.content}\n onBlur={() => setTouched((current) => ({ ...current, content: true }))}\n onChange={setContent}\n onSave={() => {\n void save();\n }}\n />\n </form>\n </div>\n );\n}\n\nfunction ReadOnlyCodeSkill({\n projectId,\n skill,\n spaceLabelById,\n}: {\n skill: Skill;\n projectId: string;\n spaceLabelById: Map<string, string>;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const navigate = useNavigate();\n const [forking, setForking] = useState(false);\n const [forkError, setForkError] = useState('');\n\n async function fork(): Promise<void> {\n setForking(true);\n setForkError('');\n let response: Response;\n\n try {\n response = await fetch(`/api/flexkit/${projectId}/skills/${skill.id}/fork`, { method: 'POST', credentials: 'include' });\n } catch {\n setForkError('Unable to create a copy. Try again.');\n setForking(false);\n\n return;\n }\n\n setForking(false);\n\n if (!response.ok) {\n setForkError('Unable to create a copy. Check your permissions.');\n\n return;\n }\n\n navigate('..', { relative: 'path' });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SkillPageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Badge variant=\"secondary\">{skill.source === 'plugin' ? 'Plugin' : 'Code'}</Badge>\n {skill.source === 'plugin' && <Button type=\"button\" disabled={forking || !canMutate} onClick={() => void fork()} size=\"sm\">Edit a copy</Button>}\n </div>\n }\n title={skill.name}\n />\n <div className=\"fk:flex fk:flex-col fk:h-full fk:px-4 fk:gap-3 fk:max-w-6xl fk:m-auto\">\n <div className=\"fk:shrink-0 fk:rounded-md fk:border fk:bg-muted/30 fk:px-3 fk:py-2 fk:corner-squircle\">\n <p className=\"fk:text-sm fk:font-medium\">Version-controlled skill</p>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n {skill.source === 'plugin' ? 'This skill is managed by its plugin. Edit a copy to create a personal Studio skill.' : 'Edit this skill in your repository and re-sync it from the Custom Tools settings.'}\n </p>\n </div>\n <div className=\"fk:grid fk:min-w-0 fk:shrink-0 fk:gap-3 fk:lg:grid-cols-[minmax(0,1fr)_minmax(0,1.6fr)_auto]\">\n <div>\n <FieldHintLabel hint=\"Identifying label for this skill\" htmlFor=\"skill-name\">\n Name\n </FieldHintLabel>\n <Input\n className=\"fk:opacity-100!\"\n disabled={true}\n id=\"skill-name\"\n value={skill.name}\n />\n </div>\n <div>\n <FieldHintLabel\n hint=\"One or two sentences describing when to use this skill. Agents rely on it to decide whether the skill applies to their current task.\"\n htmlFor=\"skill-description\"\n >\n Description\n </FieldHintLabel>\n <Input\n className=\"fk:opacity-100!\"\n disabled={true}\n id=\"skill-description\"\n placeholder=\"e.g. Rules for writing product descriptions in our brand voice\"\n value={skill.description}\n />\n </div>\n <div>\n <FieldHintLabel\n hint=\"Who can see and use this skill. Space skills are only visible to members of the selected space and only usable by automations in that space; personal skills are private to you.\"\n htmlFor=\"skill-visibility\"\n >\n Visibility\n </FieldHintLabel>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Select\n disabled={true}\n value={skill.visibility}\n >\n <SelectTrigger aria-label=\"Visibility\" className=\"fk:w-fit fk:min-w-26 fk:opacity-100!\" id=\"skill-visibility\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"start\">\n <SelectItem value=\"project\">Project</SelectItem>\n <SelectItem disabled={!skill.spaceId} value=\"space\">\n Space\n </SelectItem>\n <SelectItem value=\"personal\">Personal</SelectItem>\n </SelectContent>\n </Select>\n {skill.visibility === 'space' ? (\n <Select\n disabled={true}\n value={skill.spaceId ?? ''}\n >\n <SelectTrigger aria-label=\"Space\" className=\"fk:w-fit fk:min-w-34 fk:opacity-100!\">\n <SelectValue placeholder=\"Select a space\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n <SelectItem value={skill.spaceId ?? ''}>\n {getSkillVisibilityLabel(skill, spaceLabelById)}\n </SelectItem>\n </SelectContent>\n </Select>\n ) : null}\n </div>\n </div>\n </div>\n {forkError && <p role=\"alert\">{forkError}</p>}\n <SkillContentPane content={skill.content} readOnly />\n </div>\n </div>\n );\n}\n\nexport function CreateSkillPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const navigate = useNavigate();\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to create skills.</PageMessage>;\n }\n\n return (\n <SkillForm api={api} mode=\"create\" projectId={projectId} onSaved={() => navigate('..', { relative: 'path' })} />\n );\n}\n\nexport function SkillDetailPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const { skillId } = useParams<{ skillId: string }>();\n const { data, error, isLoading, mutate } = useSWR<{ skill: Skill }>(\n projectId && skillId ? paths(projectId).skill(skillId) : null,\n fetcher\n );\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(projectId ? paths(projectId).spaces : null, fetcher);\n\n if (!projectId || !api || !skillId) {\n return <PageMessage>Select a skill.</PageMessage>;\n }\n\n if (error) {\n return <PageMessage>Failed to load skill.</PageMessage>;\n }\n\n if (isLoading || !data?.skill) {\n return <SkillDetailSkeleton />;\n }\n\n const spaceLabelById = new Map((spacesData?.spaces ?? []).map((space) => [space.id, space.label]));\n\n if (data.skill.source !== 'studio') {\n return <ReadOnlyCodeSkill projectId={projectId} skill={data.skill} spaceLabelById={spaceLabelById} />;\n }\n\n return (\n <SkillForm\n api={api}\n mode=\"edit\"\n projectId={projectId}\n skill={data.skill}\n onSaved={(skill) => {\n if (skill) {\n void mutate({ skill }, { revalidate: false });\n } else {\n void mutate();\n }\n }}\n />\n );\n}\n"]}
@@ -1,2 +1,2 @@
1
- import'./index.css';import {c as c$2}from'./chunk-FVNVNXEV.js';import {e,c as c$1,b as b$1,j as j$1,o,m,k as k$1,h,f as f$1}from'./chunk-LG2KGSQ4.js';import'./chunk-2NXQF2F7.js';import {c}from'./chunk-CAZ6EUR2.js';import'./chunk-HAU76X63.js';import {b}from'./chunk-V7C4EHK3.js';import'./chunk-I4UFLN53.js';import'./chunk-XMOSCJOI.js';import {j,k,i,f,m as m$1,a,n,l,b as b$4}from'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import'./chunk-TWALS64F.js';import {g}from'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import {na,Tc,Vc,qa,O,e as e$2,s,_,o as o$1}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$3,c as c$3,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$2}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useEffect}from'react';import {formatDistance}from'date-fns';import {ExternalLinkIcon,LoaderCircle,RefreshCwIcon,BookOpenIcon,ArrowLeft}from'lucide-react';import {useParams,useNavigate,Link}from'react-router-dom';import me from'swr';import Se from'swr/infinite';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var Ne=2e3;function be({actions:f,title:i}){return jsxs(Fragment,{children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4",children:[jsxs(b$3,{children:[jsx(c$3,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h1",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:i}),f]}),jsx(b$2,{asChild:true,className:"fk:w-fit fk:shrink-0",size:"sm",variant:"ghost",children:jsxs(Link,{relative:"path",to:"..",children:[jsx(ArrowLeft,{className:"fk:mr-2 fk:size-4"}),"All documents"]})})]})}function we(){return jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6",children:[jsx("span",{className:"fk:sr-only",children:"Loading document"}),jsx(t,{className:"fk:h-6 fk:w-64"}),jsx(t,{className:"fk:h-4 fk:w-96"}),jsx(t,{className:"fk:h-32 fk:w-full"})]})}function ce({children:f}){return jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:f})}function ye({projectId:f,source:i}){let h=i.currentVersion?.status==="published"?i.currentVersion:null,n=h?.passageCount??0,u=h?.id??null,N=o=>{if(!u||o*b$4>=n)return null;let l=o*b$4;return `${c$1(f).passages(i.id,{from:l,to:Math.min(l+b$4-1,n-1)})}&version=${encodeURIComponent(u)}`},{data:b,error:S,isLoading:x,setSize:p,size:r}=Se(N,b$1,{revalidateFirstPage:false}),d=b?.flatMap(o=>o.passages)??[],v=d.length;return useEffect(()=>{p(1);},[p,u]),n===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Passages appear here once the document is indexed."}):S?jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The passages could not be loaded."}):jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3",children:[d.map(o=>{let l$1=l(o.locator);return jsxs("article",{className:"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle",children:[jsxs("header",{className:"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground",children:[jsxs("span",{className:"fk:font-medium",children:["#",String(o.order+1)]}),l$1?jsx("span",{className:"fk:truncate",children:l$1}):null]}),jsx("p",{className:"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed",children:o.text})]},o.id)}),x?jsxs("div",{className:"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Loading passages\u2026"]}):null,v<n&&!x?jsxs(b$2,{className:"fk:w-fit",size:"sm",variant:"outline",onClick:()=>{p(r+1);},children:["Show more (",String(v)," of ",String(n),")"]}):null]})}function Te({api:f,onSaved:i,projectId:h$1,source:n$1}){let u=b(),[,N]=g(),{data:b$3}=me(c$1(h$1).spaces,b$1),S=N.user?.spaces??[],x=b$3?.spaces??[],p=x.filter(a=>S.includes(a.code)),r=n$1.spaces.filter(a=>!S.includes(a)),[d,v]=useState(n$1.title),[o,l]=useState(false),s$1=d.trim()!==n$1.title&&d.trim().length>0;useEffect(()=>{v(n$1.title);},[n$1.title]);async function m(a){if(u){l(true);try{let g=await f.updateSource(n$1.id,a);i(g.source),f$1();}catch(g){qa.error(h(g,"The document could not be updated."));}finally{l(false);}}}let k=!u||o||r.length>0,w="This project has no spaces yet, so every member can read it.";return x.length>0&&(w="You are not a member of any space in this project."),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-5",children:[r.length>0?jsx(Tc,{children:jsxs(Vc,{children:["This document is shared with spaces you are not a member of (",r.join(", "),"), so only an owner or a member of all of them can change it."]})}):null,jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-title",children:"Title"}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(s,{className:"fk:max-w-md",disabled:k,id:"knowledge-title",maxLength:a,value:d,onChange:a=>v(a.target.value),onKeyDown:a=>{a.key==="Enter"&&s$1&&(a.preventDefault(),m({title:d.trim()}));}}),s$1?jsx(b$2,{disabled:k,size:"sm",variant:"outline",onClick:()=>{m({title:d.trim()});},children:"Save"}):null]}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:"The agent cites the document by this title."})]}),jsxs("label",{className:"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3",children:[jsx(_,{checked:n$1.agentVisible,disabled:k,onCheckedChange:a=>{m({agentVisible:a});}}),jsxs("span",{className:"fk:flex fk:flex-col",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Visible to the agent"}),jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:"Off keeps the document in the list for people but out of the agent's searches."})]})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Spaces"}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:n$1.spaces.length===0?"Every project member can read this document. Pick spaces to limit it to their members.":"Only members of the selected spaces (and the agent working for them) can read this document."}),p.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:w}):jsx("div",{className:"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2",children:p.map(a=>jsxs("label",{className:"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm",children:[jsx(o$1,{checked:n$1.spaces.includes(a.code),disabled:k,onCheckedChange:()=>{m({spaces:n(n$1.spaces,a.code)});}}),a.label]},a.id))})]})]})}function Xe(){let{api:f$1,projectId:i$1}=e(),{sourceId:h$1}=useParams(),n=useNavigate(),u=b(),N=c(),[b$3,S]=useState(false),[x,p]=useState(false),{data:r,error:d,isLoading:v$1,mutate:o$1}=me(i$1&&h$1?c$1(i$1).source(h$1):null,b$1,{refreshInterval:N&&b$3?Ne:0});if(useEffect(()=>{S(r?j(r.source,r.job):false);},[r]),!i$1||!f$1||!h$1)return jsx(j$1,{children:"Select a document."});if(d&&!r)return jsx(j$1,{children:"This document does not exist or is not shared with you."});if(v$1||!r)return jsx(we,{});let{job:l,source:s}=r,m$2=k(s,l),k$2=s.currentVersion,w=x;async function a(){p(true);try{let c=await f$1.reingestSource(s.id);qa.success("Re-indexing started."),await o$1({job:c.job,source:{...s,status:"processing"}},{revalidate:!0});}catch(c){qa.error(h(c,"The document could not be re-indexed."));}finally{p(false);}}let g=[{label:"Type",value:i(s)}];return s.originUrl&&g.push({label:"Address",value:jsxs("a",{className:"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2",href:s.originUrl,rel:"noreferrer",target:"_blank",children:[jsx("span",{className:"fk:truncate",children:s.originUrl}),jsx(ExternalLinkIcon,{className:"fk:size-3.5 fk:shrink-0"})]})}),s.size!==null&&g.push({label:"Size",value:f(s.size)}),g.push({label:"Added",value:formatDistance(new Date(s.createdAt),new Date,{addSuffix:true})}),k$2?.publishedAt&&g.push({label:"Indexed",value:formatDistance(new Date(k$2.publishedAt),new Date,{addSuffix:true})}),jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3",children:[jsx(be,{actions:jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(na,{disabled:!u,children:jsxs(b$2,{disabled:!u||w||m$2.tone==="busy",size:"sm",variant:"outline",onClick:()=>{a();},children:[x?jsx(LoaderCircle,{className:"fk:animate-spin"}):jsx(RefreshCwIcon,{}),"Re-index"]})}),jsx(o,{isBusy:w,source:s,trigger:"page",onRemoved:()=>n("..",{relative:"path"})})]}),title:s.title}),jsx("div",{className:"fk:min-h-0 fk:flex-1 fk:overflow-auto",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6",children:[jsxs("section",{className:"fk:flex fk:items-start fk:gap-4",children:[jsx(m,{source:s}),jsxs("div",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[jsx(k$1,{label:m$2.label,tone:m$2.tone}),jsx("span",{className:"fk:text-sm fk:text-muted-foreground",children:m$2.detail})]}),l?.error?.hint&&(m$2.tone==="error"||l.state==="failed")?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:l.error.hint}):null,jsx("dl",{className:"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm",children:g.map(c=>jsxs("div",{className:"fk:contents",children:[jsx("dt",{className:"fk:text-muted-foreground",children:c.label}),jsx("dd",{className:"fk:min-w-0 fk:truncate",children:c.value})]},c.label))}),k$2&&k$2.warnings.length>0?jsx(Tc,{children:jsx(Vc,{children:jsx("ul",{className:"fk:list-disc fk:pl-4",children:k$2.warnings.map(c=>jsx("li",{children:m$1(c)},c))})})}):null]})]}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsx(ce,{children:"Settings"}),jsx(Te,{api:f$1,projectId:i$1,source:s,onSaved:c=>{o$1({job:l,source:c},{revalidate:false});}})]}),jsx(v,{}),jsx("section",{className:"fk:flex fk:flex-col fk:gap-4",children:jsx(c$2,{api:f$1,projectId:i$1,source:s})}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx(ce,{children:"Passages"})]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"The document is split into passages the agent searches and cites. Each one keeps its page, slide or section so a citation points back to the right place."}),jsx(ye,{projectId:i$1,source:s})]})]})})]})}export{Xe as Source};//# sourceMappingURL=source-INDEOHP7.js.map
2
- //# sourceMappingURL=source-INDEOHP7.js.map
1
+ import'./index.css';import {c as c$2}from'./chunk-7AN2E6TU.js';import {e,c as c$1,b as b$1,j as j$1,o,m,k as k$1,h,f as f$1}from'./chunk-D3TJCUTA.js';import'./chunk-2NXQF2F7.js';import {c}from'./chunk-CAZ6EUR2.js';import'./chunk-RZZOOPEF.js';import {b}from'./chunk-V7C4EHK3.js';import'./chunk-6A6NT3H3.js';import'./chunk-XMOSCJOI.js';import {j,k,i,f,m as m$1,a,n,l,b as b$4}from'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import'./chunk-H534S4KD.js';import {g}from'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import {na,Tc,Vc,qa,O,e as e$2,s,_,o as o$1}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$3,c as c$3,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$2}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useEffect}from'react';import {formatDistance}from'date-fns';import {ExternalLinkIcon,LoaderCircle,RefreshCwIcon,BookOpenIcon,ArrowLeft}from'lucide-react';import {useParams,useNavigate,Link}from'react-router-dom';import me from'swr';import Se from'swr/infinite';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var Ne=2e3;function be({actions:f,title:i}){return jsxs(Fragment,{children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4",children:[jsxs(b$3,{children:[jsx(c$3,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h1",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:i}),f]}),jsx(b$2,{asChild:true,className:"fk:w-fit fk:shrink-0",size:"sm",variant:"ghost",children:jsxs(Link,{relative:"path",to:"..",children:[jsx(ArrowLeft,{className:"fk:mr-2 fk:size-4"}),"All documents"]})})]})}function we(){return jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6",children:[jsx("span",{className:"fk:sr-only",children:"Loading document"}),jsx(t,{className:"fk:h-6 fk:w-64"}),jsx(t,{className:"fk:h-4 fk:w-96"}),jsx(t,{className:"fk:h-32 fk:w-full"})]})}function ce({children:f}){return jsx("h3",{className:"fk:text-sm fk:font-semibold fk:tracking-tight",children:f})}function ye({projectId:f,source:i}){let h=i.currentVersion?.status==="published"?i.currentVersion:null,n=h?.passageCount??0,u=h?.id??null,N=o=>{if(!u||o*b$4>=n)return null;let l=o*b$4;return `${c$1(f).passages(i.id,{from:l,to:Math.min(l+b$4-1,n-1)})}&version=${encodeURIComponent(u)}`},{data:b,error:S,isLoading:x,setSize:p,size:r}=Se(N,b$1,{revalidateFirstPage:false}),d=b?.flatMap(o=>o.passages)??[],v=d.length;return useEffect(()=>{p(1);},[p,u]),n===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Passages appear here once the document is indexed."}):S?jsx("p",{className:"fk:text-sm fk:text-destructive",children:"The passages could not be loaded."}):jsxs("div",{className:"fk:flex fk:flex-col fk:gap-3",children:[d.map(o=>{let l$1=l(o.locator);return jsxs("article",{className:"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle",children:[jsxs("header",{className:"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground",children:[jsxs("span",{className:"fk:font-medium",children:["#",String(o.order+1)]}),l$1?jsx("span",{className:"fk:truncate",children:l$1}):null]}),jsx("p",{className:"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed",children:o.text})]},o.id)}),x?jsxs("div",{className:"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Loading passages\u2026"]}):null,v<n&&!x?jsxs(b$2,{className:"fk:w-fit",size:"sm",variant:"outline",onClick:()=>{p(r+1);},children:["Show more (",String(v)," of ",String(n),")"]}):null]})}function Te({api:f,onSaved:i,projectId:h$1,source:n$1}){let u=b(),[,N]=g(),{data:b$3}=me(c$1(h$1).spaces,b$1),S=N.user?.spaces??[],x=b$3?.spaces??[],p=x.filter(a=>S.includes(a.code)),r=n$1.spaces.filter(a=>!S.includes(a)),[d,v]=useState(n$1.title),[o,l]=useState(false),s$1=d.trim()!==n$1.title&&d.trim().length>0;useEffect(()=>{v(n$1.title);},[n$1.title]);async function m(a){if(u){l(true);try{let g=await f.updateSource(n$1.id,a);i(g.source),f$1();}catch(g){qa.error(h(g,"The document could not be updated."));}finally{l(false);}}}let k=!u||o||r.length>0,w="This project has no spaces yet, so every member can read it.";return x.length>0&&(w="You are not a member of any space in this project."),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-5",children:[r.length>0?jsx(Tc,{children:jsxs(Vc,{children:["This document is shared with spaces you are not a member of (",r.join(", "),"), so only an owner or a member of all of them can change it."]})}):null,jsxs("div",{className:"fk:flex fk:flex-col fk:gap-1.5",children:[jsx(e$2,{htmlFor:"knowledge-title",children:"Title"}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(s,{className:"fk:max-w-md",disabled:k,id:"knowledge-title",maxLength:a,value:d,onChange:a=>v(a.target.value),onKeyDown:a=>{a.key==="Enter"&&s$1&&(a.preventDefault(),m({title:d.trim()}));}}),s$1?jsx(b$2,{disabled:k,size:"sm",variant:"outline",onClick:()=>{m({title:d.trim()});},children:"Save"}):null]}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:"The agent cites the document by this title."})]}),jsxs("label",{className:"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3",children:[jsx(_,{checked:n$1.agentVisible,disabled:k,onCheckedChange:a=>{m({agentVisible:a});}}),jsxs("span",{className:"fk:flex fk:flex-col",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Visible to the agent"}),jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:"Off keeps the document in the list for people but out of the agent's searches."})]})]}),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:"Spaces"}),jsx("p",{className:"fk:text-xs fk:text-muted-foreground",children:n$1.spaces.length===0?"Every project member can read this document. Pick spaces to limit it to their members.":"Only members of the selected spaces (and the agent working for them) can read this document."}),p.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:w}):jsx("div",{className:"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2",children:p.map(a=>jsxs("label",{className:"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm",children:[jsx(o$1,{checked:n$1.spaces.includes(a.code),disabled:k,onCheckedChange:()=>{m({spaces:n(n$1.spaces,a.code)});}}),a.label]},a.id))})]})]})}function Xe(){let{api:f$1,projectId:i$1}=e(),{sourceId:h$1}=useParams(),n=useNavigate(),u=b(),N=c(),[b$3,S]=useState(false),[x,p]=useState(false),{data:r,error:d,isLoading:v$1,mutate:o$1}=me(i$1&&h$1?c$1(i$1).source(h$1):null,b$1,{refreshInterval:N&&b$3?Ne:0});if(useEffect(()=>{S(r?j(r.source,r.job):false);},[r]),!i$1||!f$1||!h$1)return jsx(j$1,{children:"Select a document."});if(d&&!r)return jsx(j$1,{children:"This document does not exist or is not shared with you."});if(v$1||!r)return jsx(we,{});let{job:l,source:s}=r,m$2=k(s,l),k$2=s.currentVersion,w=x;async function a(){p(true);try{let c=await f$1.reingestSource(s.id);qa.success("Re-indexing started."),await o$1({job:c.job,source:{...s,status:"processing"}},{revalidate:!0});}catch(c){qa.error(h(c,"The document could not be re-indexed."));}finally{p(false);}}let g=[{label:"Type",value:i(s)}];return s.originUrl&&g.push({label:"Address",value:jsxs("a",{className:"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2",href:s.originUrl,rel:"noreferrer",target:"_blank",children:[jsx("span",{className:"fk:truncate",children:s.originUrl}),jsx(ExternalLinkIcon,{className:"fk:size-3.5 fk:shrink-0"})]})}),s.size!==null&&g.push({label:"Size",value:f(s.size)}),g.push({label:"Added",value:formatDistance(new Date(s.createdAt),new Date,{addSuffix:true})}),k$2?.publishedAt&&g.push({label:"Indexed",value:formatDistance(new Date(k$2.publishedAt),new Date,{addSuffix:true})}),jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3",children:[jsx(be,{actions:jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(na,{disabled:!u,children:jsxs(b$2,{disabled:!u||w||m$2.tone==="busy",size:"sm",variant:"outline",onClick:()=>{a();},children:[x?jsx(LoaderCircle,{className:"fk:animate-spin"}):jsx(RefreshCwIcon,{}),"Re-index"]})}),jsx(o,{isBusy:w,source:s,trigger:"page",onRemoved:()=>n("..",{relative:"path"})})]}),title:s.title}),jsx("div",{className:"fk:min-h-0 fk:flex-1 fk:overflow-auto",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6",children:[jsxs("section",{className:"fk:flex fk:items-start fk:gap-4",children:[jsx(m,{source:s}),jsxs("div",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-2",children:[jsx(k$1,{label:m$2.label,tone:m$2.tone}),jsx("span",{className:"fk:text-sm fk:text-muted-foreground",children:m$2.detail})]}),l?.error?.hint&&(m$2.tone==="error"||l.state==="failed")?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:l.error.hint}):null,jsx("dl",{className:"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm",children:g.map(c=>jsxs("div",{className:"fk:contents",children:[jsx("dt",{className:"fk:text-muted-foreground",children:c.label}),jsx("dd",{className:"fk:min-w-0 fk:truncate",children:c.value})]},c.label))}),k$2&&k$2.warnings.length>0?jsx(Tc,{children:jsx(Vc,{children:jsx("ul",{className:"fk:list-disc fk:pl-4",children:k$2.warnings.map(c=>jsx("li",{children:m$1(c)},c))})})}):null]})]}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsx(ce,{children:"Settings"}),jsx(Te,{api:f$1,projectId:i$1,source:s,onSaved:c=>{o$1({job:l,source:c},{revalidate:false});}})]}),jsx(v,{}),jsx("section",{className:"fk:flex fk:flex-col fk:gap-4",children:jsx(c$2,{api:f$1,projectId:i$1,source:s})}),jsx(v,{}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-4",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(BookOpenIcon,{className:"fk:size-4 fk:text-muted-foreground"}),jsx(ce,{children:"Passages"})]}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"The document is split into passages the agent searches and cites. Each one keeps its page, slide or section so a citation points back to the right place."}),jsx(ye,{projectId:i$1,source:s})]})]})})]})}export{Xe as Source};//# sourceMappingURL=source-CWVJGMEZ.js.map
2
+ //# sourceMappingURL=source-CWVJGMEZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-INDEOHP7.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-CWVJGMEZ.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexkit/studio",
3
- "version": "0.2.27",
3
+ "version": "0.2.29",
4
4
  "description": "Flexkit Studio - Build custom internal tools like PIMs, CRMs, and ERPs with a flexible React UI and a graph-backed API",
5
5
  "keywords": [
6
6
  "flexkit",
@@ -170,7 +170,7 @@
170
170
  "use-stick-to-bottom": "1.1.6",
171
171
  "uuid": "^9.0.1",
172
172
  "zod": "4.4.3",
173
- "@flexkit/agent-protocol": "^0.3.11",
173
+ "@flexkit/agent-protocol": "^0.3.12",
174
174
  "@flexkit/schema": "0.2.15"
175
175
  },
176
176
  "peerDependencies": {
@@ -198,7 +198,7 @@
198
198
  "test:performance": "tsup --config tests/performance.config.ts && node --test build/tests/list-performance.test.js build/tests/editor-preview.test.js",
199
199
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
200
200
  "ui:add": "pnpm dlx shadcn@latest add",
201
- "test:core": "tsup --config tests/core.config.ts && node --test build/tests/json-schema-to-zod.test.js build/tests/icon-name.test.js build/tests/project-schemas.test.js build/tests/rating-preview.test.js build/tests/last-project.test.js build/tests/proxy-target.test.js build/tests/project-label.test.js build/tests/hosted-session.test.js build/tests/bff-session.test.js build/tests/project-schema-key.test.js build/tests/schema-deploy-watch.test.js build/tests/app-sessions.test.js build/tests/electron-api.test.js build/tests/error-reporter.test.js build/tests/product-events.test.js build/tests/login-providers.test.js",
201
+ "test:core": "tsup --config tests/core.config.ts && node --test build/tests/json-schema-to-zod.test.js build/tests/icon-name.test.js build/tests/project-schemas.test.js build/tests/rating-preview.test.js build/tests/last-project.test.js build/tests/proxy-target.test.js build/tests/project-label.test.js build/tests/hosted-session.test.js build/tests/bff-session.test.js build/tests/project-schema-key.test.js build/tests/schema-deploy-watch.test.js build/tests/app-sessions.test.js build/tests/electron-api.test.js build/tests/error-reporter.test.js build/tests/product-events.test.js build/tests/login-providers.test.js build/tests/line-diff.test.js",
202
202
  "test:ai": "tsup --config tests/ai.config.ts && node --test build/tests/ai/*.test.js",
203
203
  "test:knowledge": "tsup --config tests/knowledge.config.ts && node --test build/tests/knowledge/*.test.js",
204
204
  "test:graph": "tsup --config tests/graph.config.ts && node --test build/tests/graph/*.test.js",
@@ -1,4 +0,0 @@
1
- import'./index.css';import {a}from'./chunk-ZA2LLGNZ.js';import {f as f$2,b,c,g as g$1,a as a$1,e as e$1,d}from'./chunk-CSUHZFEP.js';import {x,A,u,t,H,o,m,l,n,p,y,r,s,w,v as v$1,k,e as e$2,G,D,B,g as g$2,j,h,f as f$3,z,F,I,E,q}from'./chunk-32M62H3K.js';import'./chunk-QSTWBKPN.js';import {a as a$2,c as c$2,b as b$2}from'./chunk-ELOJGLAR.js';import {c as c$3}from'./chunk-2IFBQNWA.js';import {g,f as f$1,a as a$4}from'./chunk-IA5Z6LYD.js';import'./chunk-LG2KGSQ4.js';import'./chunk-2NXQF2F7.js';import'./chunk-V7C4EHK3.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import {f}from'./chunk-TWALS64F.js';import'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import {Rb,O,Pb,ab,bb,db,Xb,_b,Yb,Zb,$b,ac,cc,dc,ec,Vb,hc,ic,lc,jc,kc,Kc,gc}from'./chunk-DGIY4SKN.js';import'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$1,c as c$1,e}from'./chunk-USNXQOMJ.js';import {b as b$3}from'./chunk-6NRQMG26.js';import {a as a$3}from'./chunk-O2QMYUPS.js';import {useRef,useMemo,useState,useEffect,useLayoutEffect}from'react';import {LoaderCircle,CornerDownRightIcon,CheckIcon,CopyIcon,PencilIcon}from'lucide-react';import {useParams,useNavigate}from'react-router-dom';import ie,{useSWRConfig}from'swr';import {jsx,jsxs}from'react/jsx-runtime';function jt(e,t){let r=Date.parse(e.createdAt)-Date.parse(t.createdAt);return Number.isFinite(r)&&r!==0?r:e.createdAt!==t.createdAt?e.createdAt<t.createdAt?-1:1:e.id===t.id?0:e.id<t.id?-1:1}function le(e){return [...new Map(e.map(r=>[r.id,r])).values()].sort(jt)}function ke(e,t){if(!t)return e;if(!e)return t;let r=new Set(t.messages.map(c=>c.id)),a=t.messages[t.messages.length-1],s=e.messages.filter(c=>!r.has(c.id)&&(!a||jt(c,a)>0));return s.length===0?t:{...t,messages:le([...t.messages,...s])}}function an(e){return e==="pending"||e==="streaming"||e==="awaiting_approval"}function Qt(e){return e==="queued"||e==="steering"}function Ce(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(r.role==="assistant"){if(!an(r.status))break;return {after:e.slice(t+1),before:e.slice(0,t),live:r}}}return {after:[],before:e,live:null}}function _e(e){return e==="steering"?"Picked up at the next step":e==="queued"?"Sends when this turn ends":null}function Ot(e){let t=new Set;for(let r of e)if(!(r.role!=="assistant"||!Array.isArray(r.parts)))for(let a of r.parts){let s=a.type==="data-mid-turn-message"?a.data?.messageId:null;typeof s=="string"&&t.add(s);}return t}function ve(e){return e.find(t=>t.role==="user"&&t.status==="queued"&&t.kind!=="monitor_event")??null}function $t(e){return e.streaming&&!e.hasDraft?"stop":"send"}var mn=6e4,qt=15e3;function hn(e){if(!e)return 0;if(Ce(e.messages).live||ve(e.messages))return y;if(!e.messages.some(a=>a.role==="assistant"&&a.status==="complete"))return (e.monitors?.length??0)>0?qt:0;let r=new Date(e.chat.lastMessageAt??e.chat.updatedAt).getTime();return Date.now()-r<mn?y:(e.monitors?.length??0)>0?qt:0}function An(e,t,r){return {chat:{createdAt:r,id:e,lastMessageAt:r,modelId:t,title:null,updatedAt:r},messages:[],pendingApproval:null}}function Xt(e,t,r,a,s,c){return e||(t?{chat:t,messages:[],pendingApproval:null}:r||An(a,s,c))}function zt(e,t){let r=new Set([t.userMessage.id,t.assistantMessage.id]);return {...e,messages:le([...e.messages.filter(a=>!r.has(a.id)),t.userMessage,t.assistantMessage])}}function kn(e,t){return {...e,messages:le([...e.messages.filter(r=>r.id!==t.id),t])}}function Cn(e,t,r){return t?ke(e[t],r):r}function vn(e){return e==="awaiting_approval"?"awaiting_approval":e==="complete"?"success":e==="failed"?"failed":"running"}function Le({attachments:e$1=[],label:t,text:r}){let{textInput:a}=Pb(),[s,c]=useState(false),u=r.trim().length>0;async function C(){await navigator.clipboard.writeText(r),c(true),setTimeout(()=>c(false),1500);}return jsxs("div",{className:"fk:group fk:ml-auto fk:flex fk:w-fit fk:max-w-[70%] fk:flex-col fk:items-end fk:gap-1",children:[jsx(q,{attachments:e$1}),u?jsx("div",{className:"fk:whitespace-pre-wrap fk:rounded-xl fk:bg-muted fk:dark:bg-white/20 fk:px-3.5 fk:py-2 fk:text-base fk:corner-squircle",children:r}):null,t?jsxs("span",{className:"fk:inline-flex fk:items-center fk:gap-1 fk:text-xs fk:text-muted-foreground",children:[jsx(CornerDownRightIcon,{className:"fk:size-3 fk:shrink-0"}),t]}):null,jsxs("div",{className:u?"fk:flex fk:gap-0.5 fk:opacity-0 fk:transition-opacity fk:group-hover:opacity-100":"fk:hidden",children:[jsxs(b$1,{children:[jsx(c$1,{asChild:true,children:jsx(b$3,{"aria-label":"Copy prompt",className:"fk:size-6 fk:text-muted-foreground",size:"icon",variant:"ghost",onClick:()=>{C();},children:s?jsx(CheckIcon,{className:"fk:size-3.5"}):jsx(CopyIcon,{className:"fk:size-3.5"})})}),jsx(e,{children:"Copy"})]}),jsxs(b$1,{children:[jsx(c$1,{asChild:true,children:jsx(b$3,{"aria-label":"Edit prompt",className:"fk:size-6 fk:text-muted-foreground",size:"icon",variant:"ghost",onClick:()=>a.setInput(r),children:jsx(PencilIcon,{className:"fk:size-3.5"})})}),jsx(e,{children:"Edit"})]})]})]})}function Wt(e){let r=e.find(a=>a.type==="data-suggested-prompt")?.data?.prompt;return typeof r=="string"&&r.trim()?r:null}function Vt({prompt:e}){let{textInput:t}=Pb();return jsx("div",{className:"fk:flex fk:justify-start",children:jsxs("button",{className:"fk:inline-flex fk:max-w-full fk:items-center fk:gap-1.5 fk:rounded-full fk:border fk:border-border/70 fk:bg-muted/40 fk:px-3 fk:py-1.5 fk:text-left fk:text-sm fk:text-muted-foreground fk:transition-colors fk:hover:border-border fk:hover:bg-muted fk:hover:ext-foreground fk:corner-squircle",title:"Use as your next message",type:"button",onClick:()=>t.setInput(e),children:[jsx(CornerDownRightIcon,{className:"fk:size-3 fk:shrink-0"}),jsx("span",{className:"fk:truncate",children:e})]})})}function yn({api:e,part:t,partIndex:r,parts:a}){return t.type.startsWith("tool-")?t.state==="output-error"?jsx(G,{message:t.errorText??"The tool call failed."}):null:jsx(F,{api:e,part:t,partIndex:r,parts:a})}function Gt({api:e,message:t,showSuggestion:r$1=false}){if(t.kind==="monitor_event"){let u=r(t);return u?jsx(s,{data:u,error:t.error}):null}if(t.kind==="plugin_connected"){let u=w(t.parts);return u?jsx(v$1,{data:u,error:t.error,label:_e(t.status)}):null}if(t.role==="user")return jsx(Le,{attachments:k(t.parts),label:_e(t.status),text:t.textContent});let a=(Array.isArray(t.parts)?t.parts:[]).filter(u=>!e$2(u)&&!(u.type.startsWith("tool-")&&u.state!=="output-error")),s$1=a.some(u=>u.type==="data-turn-error"),c=r$1&&!t.error?Wt(a):null;return a.length===0&&!t.error?null:jsxs("div",{className:"fk:w-full fk:min-w-0 fk:space-y-8",children:[a.map((u,C)=>jsx(yn,{api:e,part:u,partIndex:C,parts:a},u.toolCallId??`${t.id}-${C.toString()}`)),t.error&&!s$1?jsx(G,{message:t.error}):null,c?jsx(Vt,{prompt:c}):null]})}function Sn({api:e,chatId:t,detail:r,message:a,onMidTurnDelivered:s,onStatusChange:c,onTurnUpdated:u,questionAnsweredSignal:C}){let $=vn(a.status),y=a.workflowRunId?e.getAgentChatStreamUrl(t,a.workflowRunId):"",[H,x]=useState(0),[p,A]=useState(false),[S,R]=useState({}),B$1=useRef(null),{message:m,status:M}=D(y,{decidedApprovals:S,recordStatus:$,resumeToken:H,suppressApprovalPause:p}),D$1=useMemo(()=>m?[{...m,parts:m.parts.filter(d=>!e$2(d))}]:[],[m]),q=B(D$1),j$1=useRef(u);j$1.current=u;let X=useRef(c);X.current=c;let N=useMemo(()=>({answerQuestion:async(d,O)=>{let{question:K}=await e.answerAgentChatQuestion(t,d,O);return A(true),x(V=>V+1),j$1.current(),K??null},onApprovalDecided:(d,O)=>{d&&O&&O!=="pending"&&R(K=>({...K,[d]:O})),!(d&&B$1.current===d)&&(d&&(B$1.current=d),A(true),x(K=>K+1),j$1.current());}}),[e,t]);useEffect(()=>{x(0),A(false),B$1.current=null,R({});},[a.id]);let f=useRef(C);useEffect(()=>{C!==f.current&&(f.current=C,C?.messageId===a.id&&(A(true),x(d=>d+1)));},[a.id,C]),useEffect(()=>{p&&a.status==="streaming"&&A(false);},[a.status,p]),useEffect(()=>{(M==="finished"||M==="paused")&&j$1.current();},[M]);let _=(m?.parts??[]).filter(d=>d.type==="data-mid-turn-message").map(d=>String(d.data?.messageId??"")).join(`
2
- `),W=useRef(s);W.current=s,useEffect(()=>{_&&W.current(_.split(`
3
- `));},[_]);let i=!p&&a.status!=="streaming"&&(a.status==="awaiting_approval"||M==="paused"||g$2(m)||j(m)),Q=useMemo(()=>new Set(h(m)),[m]),U=r.pendingApproval&&!Q.has(r.pendingApproval.id)?r.pendingApproval:null,J=m?.parts[m.parts.length-1],b=J?.type==="text"&&J.state==="streaming",Z=j(m)?"Waiting for your answer":"Awaiting approval",L=i?Z:f$3(m)??"Thinking",I$1=i?M!=="finished"&&M!=="error":M==="streaming"&&!b;useEffect(()=>{X.current({label:L,visible:I$1});},[L,I$1]);let ee=!!U&&i,oe=M==="finished"?Wt(q.flatMap(d=>d.parts)):null;return q.length===0&&!ee?jsx(z.Provider,{value:N,children:null}):jsx(z.Provider,{value:N,children:jsxs("div",{className:"fk:w-full fk:min-w-0 fk:space-y-8",children:[q.map(d=>jsx("div",{className:"fk:space-y-8 fk:min-w-0",children:d.parts.map((O,K)=>jsx(F,{api:e,part:O,partIndex:K,parts:d.parts},K))},d.id)),U&&ee?jsx(I,{api:e,message:E(U)}):null,oe?jsx(Vt,{prompt:oe}):null]})})}function Mn({draftKey:e}){let{textInput:t}=Pb(),{setInput:r,value:a}=t,s=useRef(null);return useLayoutEffect(()=>{if(s.current===e){c$2(e,a);return}s.current=e;let c=b$2(e);c!==a&&r(c);},[e,r,a]),null}function wn({api:e,effort:t,modelKey:r,modelPending:a,models:s,onEffortChange:c$1,onError:u,onModelChange:C,onSend:$,onStop:y,placeholder:H,sending:x,streaming:p$1}){let{attachments:A,textInput:S}=Pb(),R=o(e,u),{currentProjectId:B}=f(),{data:m$1,error:M}=ie(B?`/api/flexkit/${B}/plugins`:null,f$1),D=useRef(false),q=s.filter(i=>!i.deprecated||b(i)===r),j=c(s,r),X=e$1(j),N=d(j,t),f$2=S.value.trim().length>0||A.files.length>0,_=$t({hasDraft:f$2,streaming:p$1}),W=f$2&&!R.isUploading&&!x&&!a;return jsxs(Xb,{accept:n,className:"fk:mx-auto fk:max-w-4xl",maxFileSize:l,maxFiles:m,multiple:true,onError:i=>u(i.message),onSubmit:({text:i})=>{let Q=i?.trim()??"",U=R.getUploaded(A.files.map(b=>b.id));if(!Q&&U.length===0||R.isUploading||x||D.current||a||!m$1&&!M&&B)return Promise.reject(new Error("The message cannot be sent right now."));let J=c$3(Q,m$1?.plugins??[]);return J?(S.setInput(J.tokens.reduce((b,Z)=>b.split(Z).join(""),i)),u(`That looks like a ${J.label}. It was removed from your message: connect ${J.plugin.name} from its connect card or AI \u2192 Marketplace instead, where it is stored encrypted and never shown to the agent.`),Promise.reject(new Error("The message contains a plugin token."))):(D.current=true,S.clear(),$(Q,U).catch(b=>{throw S.setInput(i),b}).finally(()=>{D.current=false;}))},children:[A.files.length>0?jsx(_b,{children:jsx(p,{uploads:R})}):null,jsx(Yb,{children:jsx(Zb,{disabled:x,placeholder:H})}),jsxs($b,{children:[jsxs(ac,{children:[jsxs(cc,{children:[jsx(dc,{"aria-label":"Add attachments",className:"fk:border-0 fk:bg-border fk:corner-round",disabled:x,tooltip:"Add photos or files"}),jsx(ec,{children:jsx(Vb,{})})]}),q.length>0?jsxs(hc,{value:r??void 0,onValueChange:C,children:[jsx(ic,{"aria-label":"Model",className:"fk:min-w-44",children:jsx(lc,{placeholder:"Model"})}),jsx(jc,{children:q.map(i=>jsx(kc,{value:b(i),children:i.name},b(i)))})]}):null,X.length>1&&N?jsxs(hc,{value:N,onValueChange:c$1,children:[jsx(ic,{"aria-label":"Reasoning effort",className:"fk:min-w-28",children:jsx(lc,{placeholder:"Effort"})}),jsx(jc,{children:X.map(i=>jsx(kc,{value:i.value,children:i.label},i.value))})]}):null]}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-3",children:[jsx(Kc,{disabled:x,onAudioRecorded:async(i,Q)=>{let{text:U}=await e.transcribeAgentAudio(i,Q);return U},onError:i=>u(i.message),onTranscriptionChange:i=>{u(null),S.setInput(a$4(S.value,i));}}),jsx(gc,{className:"fk:corner-round",disabled:_==="stop"?false:!W,status:_==="stop"?"streaming":void 0,onStop:()=>{y();}})]})]})]})}var Ue={chatId:null,error:null,loading:false,older:[],page:null},In=3e3;function Tn({api:e,chatId:t,projectId:r,pendingFollowUp:a,pendingMessage:s,questionAnsweredSignal:c,resolveDetail:u}){let{data:C,mutate:$}=ie(t?g(r).agentChat(t):null,f$1,{refreshInterval:0}),y=u(C),[H$1,x]=useState(Ue),p=H$1.chatId===t?H$1:Ue,A=useRef(t);A.current=t;let S=(o,v)=>x(w=>{if(w.chatId!==o&&A.current!==o)return w;let F=w.chatId===o?w:{...Ue,chatId:o};return {...F,...v(F)}}),R=useRef({chatId:null,messages:[]}),B=y?.messages;useEffect(()=>{let o=R.current,v=B??[];if(R.current={chatId:t,messages:v},!t||o.chatId!==t)return;let w=new Set(v.map(k=>k.id)),F=o.messages.filter(k=>!w.has(k.id));F.length>0&&S(t,k=>({older:le([...k.older,...F])}));},[t,B]);let m=new Set(y?.messages.map(o=>o.id)??[]),M=[...p.older.filter(o=>!m.has(o.id)),...y?.messages??[]],D=useRef(y);D.current=y;let q=useRef(void 0);ie(t?`${g(r).agentChat(t)}?view=status`:null,f$1,{refreshInterval:()=>hn(D.current),onSuccess:o=>{let v=JSON.stringify(o),w=q.current;q.current=v;let{current:F}=D,k=F?[...F.messages].reverse().find(te=>te.role==="assistant"):void 0;(w&&w!==v||k&&o.latestMessage&&(k.id!==o.latestMessage.id||k.status!==o.latestMessage.status||k.workflowRunId!==o.latestMessage.workflowRunId||F?.chat.updatedAt!==o.chat.updatedAt))&&$();}});let j=async()=>{let o=p.page?.cursor??y?.nextCursor;if(!t||!o||p.loading)return;let v=t;S(v,()=>({error:null,loading:true}));try{let w=await f$1(`${g(r).agentChat(v)}?before=${encodeURIComponent(o)}`);S(v,F=>({loading:!1,older:le([...w.messages,...F.older]),page:{cursor:w.nextCursor??null,hasMore:w.hasMore??!1}}));}catch{S(v,()=>({error:"Could not load earlier messages. Try again.",loading:false}));}},{after:X,before:N,live:f}=Ce(M),[_,W]=useState({ids:[],messageId:""}),i=Ot(M);for(let o of f&&_.messageId===f.id?_.ids:[])i.add(o);let Q=X.filter(o=>Qt(o.status)&&!i.has(o.id)),U=N.filter(o=>!i.has(o.id)),b=(!f&&!s?ve(M):null)?.id??null,[Z,L]=useState(0),I=useRef(null);useEffect(()=>{if(!t||!b||I.current===b)return;I.current=b;let o=false,v=null;return e.startQueuedAgentChatMessage(t,b).then(()=>{},()=>{v=setTimeout(()=>{o||L(w=>w+1);},In);}).finally(()=>{I.current=null,$();}),()=>{o=true,v&&clearTimeout(v);}},[e,t,$,b,Z]);let[ee,oe]=useState(null),d=f&&ee?.messageId===f.id?ee.status:null;if(t&&!y&&!s)return jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:justify-center fk:gap-2 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Loading chat..."]});let O=!!s||!!f,K=[...U].reverse().find(o=>o.role==="assistant")?.id??null,V=f?d?.label??"Thinking":"Sending",se=f?d?.visible??true:true;return jsxs(ab,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:[jsx(bb,{className:"fk:gap-0 fk:p-0",children:jsxs("div",{className:"fk:mx-auto fk:w-full fk:max-w-4xl fk:space-y-5 fk:pb-6 fk:pr-4",children:[p.page?.hasMore??y?.hasMore?jsx(b$3,{variant:"ghost",disabled:p.loading,onClick:()=>{j();},children:p.loading?"Loading\u2026":"Load earlier messages"}):null,p.error?jsx("p",{role:"alert",children:p.error}):null,U.map(o=>jsx(Gt,{api:e,message:o,showSuggestion:!O&&o.id===K},o.id)),f&&t&&y?jsx(Sn,{api:e,chatId:t,detail:y,message:f,onMidTurnDelivered:o=>W({ids:o,messageId:f.id}),onStatusChange:o=>oe({messageId:f.id,status:o}),onTurnUpdated:()=>{$();},questionAnsweredSignal:c}):null,s&&!f?jsx(Le,{attachments:s.attachments,text:s.text}):null,O?jsx(H,{label:V,visible:se}):null,Q.map(o=>jsx(Gt,{api:e,message:o},o.id)),a&&f?jsx(Le,{attachments:a.attachments,text:a.text}):null]})}),jsx(db,{})]})}var Jt=["Where should we begin?","Ready when you are","What\u2019s on the agenda today?","What\u2019s on your mind today?"];function Pn(e){return [`How can I help, ${e}?`,`Good to see you, ${e}.`,`Hey, ${e}. Ready to dive in?`]}function xn(e){let t=e?[...Jt,...Pn(e)]:Jt;return t[Math.floor(Math.random()*t.length)]??"How can I help?"}var Zt="flexkit-ai:lastModelId",Ke="flexkit-ai:lastEffort";function bn(){if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(Zt);return e?{effort:localStorage.getItem(Ke),modelKey:e}:null}catch{return null}}function En(e){return e.selectedModelKey?{effort:e.selectedEffort,modelKey:e.selectedModelKey}:e.awaitingChatModel?{effort:null,modelKey:null}:e.chatSelection?{effort:e.selectedEffort??e.chatSelection.effort,modelKey:e.chatSelection.modelKey}:e.lastUsed?{effort:e.selectedEffort??e.lastUsed.effort,modelKey:e.lastUsed.modelKey}:{effort:e.selectedEffort,modelKey:e.defaultModelKey}}function Rn(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(Zt,e.modelKey),e.effort?localStorage.setItem(Ke,e.effort):localStorage.removeItem(Ke);}catch{}}function Dn({projectId:e}){let{data:t,isLoading:r}=ie(g(e).agentProfile(),f$1),a=useMemo(()=>r?null:xn(t?.preferredName??null),[t,r]);return jsx("div",{className:"fk:flex fk:flex-col fk:items-center fk:pb-2 fk:text-center",children:jsx("h2",{className:"fk:text-2xl fk:font-semibold",children:a??"\xA0"})})}function er(){let{api:e$1,projectId:t$1}=x(),{currentProject:r,projectSummaries:a$4}=f(),{chatId:s}=useParams(),c$2=useNavigate(),u$1=a(),{mutate:C}=useSWRConfig(),{data:$}=ie(t$1?g(t$1).tools():null,f$1),{data:y}=ie(t$1&&s?g(t$1).agentChat(s):null,f$1),H=useRef({});function x$1(l){return Cn(H.current,s,l)}let p=x$1(y),A$1=useMemo(()=>$?.tools.models??[],[$]),[S,R]=useState(null),[B,m]=useState(null),M=useRef(null),[D,q]=useState(bn),[j,X]=useState(false),N=useRef(false),[f$3,_]=useState(null),W=f$3&&f$3.chatId===s?f$3:void 0,[i,Q]=useState(null),[U,J]=useState(null),b$2=i&&i.chatId===s?i:void 0,[Z,L]=useState(null),I=p?.chat.modelId??null,ee=!!s&&p===void 0,oe=useMemo(()=>f$2(I,A$1)??(I?{effort:null,modelKey:I}:null),[I,A$1]),d=useMemo(()=>{let l=A$1.find(h=>!h.deprecated);return l?b(l):null},[A$1]),O$1=useMemo(()=>{let l=c(A$1,D?.modelKey??null);return D&&l&&!l.deprecated?D:null},[A$1,D]),{effort:K,modelKey:V}=En({awaitingChatModel:ee,chatSelection:oe,defaultModelKey:d,lastUsed:O$1,selectedEffort:B,selectedModelKey:S}),se=V?g$1({effort:K,modelKey:V},A$1):null,o=ee&&!S;useEffect(()=>{M.current=null,R(null),m(null),L(null);},[s]),useEffect(()=>{S===a$1&&I&&I!==a$1&&I!==M.current&&(R(null),m(null));},[I,S]);function v$1(l){q(l),Rn(l);}function w(l){M.current=l===a$1?I:null,R(l),m(null),v$1({effort:null,modelKey:l});}function F(l){m(l),V&&v$1({effort:l,modelKey:V});}if(!t$1||!e$1)return jsx("div",{className:"fk:flex fk:h-full fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground",children:"Select a project to chat with the agent."});let k=e$1,te=t$1,en=r?.title??a$4.find(l=>l.id===t$1)?.name??"your project",Fe=!s&&!W,ce=!!(p&&Ce(p.messages).live);async function tn(l,h,z){Q({attachments:z,chatId:l,text:h});try{let T=await k.sendAgentChatFollowUp(l,{attachments:z,content:h,modelId:se});if("question"in T){J({messageId:T.question.chatMessageId}),await C(g(te).agentChat(l));return}await He(l,T);}finally{Q(null);}}async function He(l,h){await C(g(te).agentChat(l),z=>{let T=Xt(ke(H.current[l],z),null,y,l,se,"turn"in h?h.turn.userMessage.createdAt:h.followUp.message.createdAt),ae="turn"in h?zt(T,h.turn):kn(T,h.followUp.message);return H.current[l]=ae,ae},{revalidate:false});}let nn={onConnected:async l=>{if(!s)return;let h=s;try{await He(h,await k.announcePluginConnected(h,l));}catch(z){L(z instanceof Error?z.message:"The agent could not continue after the connection.");}}};async function Be(l,h){if(N.current)throw new Error("A message is already being sent.");if(o)throw new Error("This chat is still loading.");N.current=true,X(true),L(null);let z=p?ve(p.messages):null;if(s&&(ce||z)){try{!ce&&z&&await k.startQueuedAgentChatMessage(s,z.id).catch(()=>{}),await tn(s,l,h);}catch(T){throw L(T instanceof Error?T.message:"Failed to send the message."),T}finally{N.current=false,X(false);}return}_({attachments:h,chatId:s,text:l});try{let T=s?{chat:null,turn:await k.sendAgentChatMessage(s,{attachments:h,content:l,modelId:se})}:await k.startAgentChat({attachments:h,content:l,modelId:se}),{chat:ae,turn:je}=T,fe=s??ae.id;await C(g(te).agentChat(fe),sn=>{let Qe=zt(Xt(ke(H.current[fe],sn),ae,y,fe,se,je.userMessage.createdAt),je);return H.current[fe]=Qe,Qe},{revalidate:!1}),ae&&c$2(`${u$1}/chats/${ae.id}`),_(null);}catch(T){throw _(null),L(T instanceof Error?T.message:"Failed to send the message."),T}finally{N.current=false,X(false);}}async function rn(){if(s)try{await k.stopAgentChat(s);}catch(l){L(l instanceof Error?l.message:"Failed to stop the turn.");}finally{await C(g(te).agentChat(s));}}return jsxs(Rb,{children:[jsx(Mn,{draftKey:a$2(te,s)}),jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-start fk:gap-2",children:[jsxs(b$1,{children:[jsx(c$1,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:mt-1 fk:h-4"}),jsx("div",{className:"fk:flex fk:flex-1 fk:items-center fk:gap-2",children:jsx("h1",{className:"fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:s?p?.chat.title?.trim()??"Chat":"Agent"})})]}),jsx("div",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:gap-4",children:jsxs("div",{className:a$3("fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-3",Fe&&"fk:justify-center fk:pb-[12vh]"),children:[Fe?jsx(Dn,{projectId:te}):jsx(A.Provider,{value:true,children:jsx(u.Provider,{value:nn,children:jsx(Tn,{api:k,chatId:s??null,pendingFollowUp:b$2,pendingMessage:W,projectId:t$1,questionAnsweredSignal:U,resolveDetail:x$1})})}),jsxs("div",{className:"fk:shrink-0 fk:pb-3",children:[s?jsx(t,{api:k,chatId:s,projectId:t$1,sending:j||o,onTurnIntoAutomation:l=>{N.current||o||Be(`Turn the monitor \u201C${l.description}\u201D into an automation.`,[]).catch(h=>L(h instanceof Error?h.message:"Failed to send the message."));}}):null,Z?jsx("p",{className:"fk:mx-auto fk:mb-2 fk:max-w-4xl fk:text-xs fk:text-destructive",children:Z}):null,jsx(wn,{api:k,effort:K,modelKey:V,modelPending:o,models:A$1,sending:j,streaming:ce,onEffortChange:F,onError:L,onModelChange:w,onSend:Be,onStop:rn,placeholder:ce?"Add context or steer the agent...":`Ask Flexkit anything about ${en}...`})]})]})})]})]})}export{er as AgentChatPage};//# sourceMappingURL=chat-page-4YW4GADV.js.map
4
- //# sourceMappingURL=chat-page-4YW4GADV.js.map