@elizaos/plugin-knowledge 1.5.10 → 1.5.11

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.
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-500:oklch(72.3% .219 149.579);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--spacing:.25rem;--container-md:28rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:0 0% 97.65%;--foreground:0 0% 12.55%;--muted:0 0% 93.73%;--muted-foreground:0 0% 39.22%;--popover:0 0% 98.82%;--popover-foreground:0 0% 12.55%;--card:0 0% 98.82%;--card-foreground:0 0% 12.55%;--border:0 0% 84.71%;--input:0 0% 94.12%;--primary:22.93 92.59% 52.35%;--primary-foreground:44 0% 100%;--secondary:34.05 100% 85.49%;--secondary-foreground:16.27 50.43% 22.94%;--accent:0 0% 90.98%;--accent-foreground:0 0% 12.55%;--destructive:10.16 77.87% 53.92%;--destructive-foreground:0 0% 100%;--ring:24.8 79.79% 63.14%;--chart-1:22.93 92.59% 52.35%;--chart-2:34.05 100% 85.49%;--chart-3:0 0% 90.98%;--chart-4:34.05 100% 88.49%;--chart-5:22.93 95.59% 52.35%;--radius:.5rem}.dark{--background:0 0% 6.67%;--foreground:0 0% 93.33%;--muted:0 0% 13.33%;--muted-foreground:0 0% 70.59%;--popover:0 0% 9.8%;--popover-foreground:0 0% 93.33%;--card:0 0% 9.8%;--card-foreground:0 0% 93.33%;--border:44 14% 11%;--input:0 0% 28.24%;--primary:22.93 92.59% 52.35%;--primary-foreground:29.51 0% 100%;--secondary:28.5 64.52% 12.16%;--secondary-foreground:29.51 100% 88.04%;--accent:0 0% 16.47%;--accent-foreground:0 0% 93.33%;--destructive:10.16 77.87% 53.92%;--destructive-foreground:0 0% 100%;--ring:23.11 59.8% 40%;--chart-1:22.93 92.59% 52.35%;--chart-2:28.5 64.52% 12.16%;--chart-3:0 0% 16.47%;--chart-4:28.5 64.52% 15.16%;--chart-5:22.93 95.59% 52.35%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing)*4)}.right-4{right:calc(var(--spacing)*4)}.bottom-4{bottom:calc(var(--spacing)*4)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing)*4)}.z-10{z-index:10}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.container,.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-auto{margin-left:auto}.line-clamp-4{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.h-1\/3{height:33.3333%}.h-2{height:calc(var(--spacing)*2)}.h-2\/3{height:66.6667%}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-11{height:calc(var(--spacing)*11)}.h-12{height:calc(var(--spacing)*12)}.h-40{height:calc(var(--spacing)*40)}.h-full{height:100%}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-\[95vh\]{max-height:95vh}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[2rem\]{min-height:2rem}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-full{width:100%}.max-w-\[95vw\]{max-width:95vw}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[60px\]{min-width:60px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border,.border-border\/30{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,hsl(var(--border))30%,transparent)}}.border-gray-500\/60{border-color:#6a728299}@supports (color:color-mix(in lab,red,red)){.border-gray-500\/60{border-color:color-mix(in oklab,var(--color-gray-500)60%,transparent)}}.border-input{border-color:hsl(var(--input))}.border-orange-600\/60{border-color:#f0510099}@supports (color:color-mix(in lab,red,red)){.border-orange-600\/60{border-color:color-mix(in oklab,var(--color-orange-600)60%,transparent)}}.bg-accent,.bg-accent\/20{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.bg-accent\/20{background-color:color-mix(in oklab,hsl(var(--accent))20%,transparent)}}.bg-background,.bg-background\/80{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,hsl(var(--background))80%,transparent)}}.bg-blue-300{background-color:var(--color-blue-300)}.bg-card,.bg-card\/50{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/50{background-color:color-mix(in oklab,hsl(var(--card))50%,transparent)}}.bg-card\/90{background-color:hsl(var(--card))}@supports (color:color-mix(in lab,red,red)){.bg-card\/90{background-color:color-mix(in oklab,hsl(var(--card))90%,transparent)}}.bg-destructive,.bg-destructive\/10{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,hsl(var(--destructive))10%,transparent)}}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-400\/90{background-color:#99a1afe6}@supports (color:color-mix(in lab,red,red)){.bg-gray-400\/90{background-color:color-mix(in oklab,var(--color-gray-400)90%,transparent)}}.bg-muted,.bg-muted\/30{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,hsl(var(--muted))30%,transparent)}}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,hsl(var(--muted))50%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-500\/90{background-color:#fe6e00e6}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/90{background-color:color-mix(in oklab,var(--color-orange-500)90%,transparent)}}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-12{padding:calc(var(--spacing)*12)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-blue-500{color:var(--color-blue-500)}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/80{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,hsl(var(--primary))80%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-500{color:var(--color-yellow-500)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s;animation-duration:.3s}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}@media (hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/5:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/5:hover{background-color:color-mix(in oklab,hsl(var(--accent))5%,transparent)}}.hover\:bg-accent\/10:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/10:hover{background-color:color-mix(in oklab,hsl(var(--accent))10%,transparent)}}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,hsl(var(--destructive))10%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,hsl(var(--destructive))90%,transparent)}}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,hsl(var(--muted))50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary))90%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}@media (min-width:40rem){.sm\:mr-2{margin-right:calc(var(--spacing)*2)}.sm\:ml-0{margin-left:calc(var(--spacing)*0)}.sm\:inline{display:inline}.sm\:w-auto{width:auto}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media (min-width:48rem){.md\:hidden{display:none}.md\:inline{display:inline}}.dark\:bg-gray-700:is(.dark *){background-color:var(--color-gray-700)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:calc(var(--spacing)*0)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}:root{color-scheme:dark}body{background-color:hsl(var(--background));font-family:var(--font-mono);color:hsl(var(--foreground))}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
package/dist/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Agent Plugin View</title>
8
- <script type="module" crossorigin src="./assets/index-C_sAxTPC.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-B5VEkqpw.css">
8
+ <script type="module" crossorigin src="./assets/index-DtOcbZ9V.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-crC0VS8M.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/dist/index.js CHANGED
@@ -2898,10 +2898,7 @@ var KnowledgeService = class _KnowledgeService extends Service {
2898
2898
  const chunks = await splitChunks2(text, targetTokens, overlap);
2899
2899
  return chunks.map((chunk, index) => {
2900
2900
  const fragmentIdContent = `${document.id}-fragment-${index}-${Date.now()}`;
2901
- const fragmentId = createUniqueUuid(
2902
- this.runtime,
2903
- fragmentIdContent
2904
- );
2901
+ const fragmentId = createUniqueUuid(this.runtime, fragmentIdContent);
2905
2902
  return {
2906
2903
  id: fragmentId,
2907
2904
  entityId: scope.entityId,
@@ -2936,10 +2933,20 @@ var KnowledgeService = class _KnowledgeService extends Service {
2936
2933
  async getMemories(params) {
2937
2934
  return this.runtime.getMemories({
2938
2935
  ...params,
2939
- // includes tableName, roomId, count, end
2936
+ // includes tableName, roomId, count, offset, end
2940
2937
  agentId: this.runtime.agentId
2941
2938
  });
2942
2939
  }
2940
+ /**
2941
+ * Counts memories for pagination.
2942
+ * Corresponds to counting documents or fragments.
2943
+ */
2944
+ async countMemories(params) {
2945
+ const roomId = params.roomId || this.runtime.agentId;
2946
+ const unique = params.unique ?? false;
2947
+ const tableName = params.tableName;
2948
+ return this.runtime.countMemories(roomId, unique, tableName);
2949
+ }
2943
2950
  /**
2944
2951
  * Deletes a specific memory item (knowledge document) by its ID.
2945
2952
  * Corresponds to DELETE /plugins/knowledge/documents/:knowledgeId
@@ -4150,7 +4157,7 @@ ${formattedResults}`
4150
4157
  var knowledgeActions = [processKnowledgeAction, searchKnowledgeAction];
4151
4158
 
4152
4159
  // src/routes.ts
4153
- import { createUniqueUuid as createUniqueUuid2, logger as logger9, ModelType as ModelType4 } from "@elizaos/core";
4160
+ import { MemoryType as MemoryType4, createUniqueUuid as createUniqueUuid2, logger as logger9, ModelType as ModelType4 } from "@elizaos/core";
4154
4161
  import fs4 from "fs";
4155
4162
  import path4 from "path";
4156
4163
  import multer from "multer";
@@ -4687,8 +4694,8 @@ async function getKnowledgeChunksHandler(req, res, runtime) {
4687
4694
  if (documentId) {
4688
4695
  const allFragments = await service.getMemories({
4689
4696
  tableName: "knowledge",
4690
- count: 1e5
4691
- // Very high limit to get all fragments
4697
+ count: 5e4
4698
+ // Reduced from 100000 - still high enough for large documents
4692
4699
  });
4693
4700
  const documentFragments = allFragments.filter((fragment) => {
4694
4701
  const metadata = fragment.metadata;
@@ -4801,6 +4808,258 @@ async function searchKnowledgeHandler(req, res, runtime) {
4801
4808
  sendError(res, 500, "SEARCH_ERROR", "Failed to search knowledge", error.message);
4802
4809
  }
4803
4810
  }
4811
+ async function getGraphNodesHandler(req, res, runtime) {
4812
+ const service = runtime.getService(KnowledgeService.serviceType);
4813
+ if (!service) {
4814
+ return sendError(res, 500, "SERVICE_NOT_FOUND", "KnowledgeService not found");
4815
+ }
4816
+ try {
4817
+ const parsedPage = req.query.page ? Number.parseInt(req.query.page, 10) : 1;
4818
+ const parsedLimit = req.query.limit ? Number.parseInt(req.query.limit, 10) : 20;
4819
+ const type = req.query.type;
4820
+ const agentId = req.query.agentId || runtime.agentId;
4821
+ const page = Number.isNaN(parsedPage) || parsedPage < 1 ? 1 : parsedPage;
4822
+ const limit = Number.isNaN(parsedLimit) || parsedLimit < 1 ? 20 : Math.min(parsedLimit, 50);
4823
+ const offset = (page - 1) * limit;
4824
+ logger9.debug(
4825
+ `[Graph API] \u{1F4CA} Fetching graph nodes: page=${page}, limit=${limit}, type=${type || "all"}, agent=${agentId}`
4826
+ );
4827
+ const totalDocuments = await service.countMemories({
4828
+ tableName: "documents",
4829
+ roomId: agentId,
4830
+ unique: false
4831
+ // Count all documents, not just unique ones
4832
+ });
4833
+ const totalPages = Math.ceil(totalDocuments / limit);
4834
+ const hasMore = page < totalPages;
4835
+ const paginatedDocuments = await service.getMemories({
4836
+ tableName: "documents",
4837
+ roomId: agentId,
4838
+ count: limit,
4839
+ offset
4840
+ });
4841
+ const nodes = [];
4842
+ const links = [];
4843
+ paginatedDocuments.forEach((doc) => {
4844
+ if (!doc.id) {
4845
+ logger9.warn(`[Graph API] \u26A0\uFE0F Skipping document without ID`);
4846
+ return;
4847
+ }
4848
+ nodes.push({ id: doc.id, type: "document" });
4849
+ });
4850
+ if (type !== "document") {
4851
+ const allFragments = await service.getMemories({
4852
+ tableName: "knowledge",
4853
+ roomId: agentId,
4854
+ count: 5e4
4855
+ // Reduced from 100000 - still high enough for large documents
4856
+ });
4857
+ logger9.debug(`[Graph API] \u{1F4CA} Total fragments found: ${allFragments.length}`);
4858
+ if (allFragments.length > 0) {
4859
+ logger9.debug(
4860
+ `[Graph API] \u{1F4CA} Sample fragment metadata: ${JSON.stringify(
4861
+ allFragments.slice(0, 3).map((f) => ({
4862
+ id: f.id,
4863
+ metadata: f.metadata
4864
+ }))
4865
+ )}`
4866
+ );
4867
+ }
4868
+ paginatedDocuments.forEach((doc) => {
4869
+ if (!doc.id) {
4870
+ return;
4871
+ }
4872
+ const docFragments = allFragments.filter((fragment) => {
4873
+ const metadata = fragment.metadata;
4874
+ const typeString = typeof metadata?.type === "string" ? metadata.type : null;
4875
+ const isFragment = typeString && typeString.toLowerCase() === "fragment" || metadata?.type === MemoryType4.FRAGMENT || // If no type but has documentId, assume it's a fragment
4876
+ !metadata?.type && metadata?.documentId;
4877
+ return metadata?.documentId === doc.id && isFragment;
4878
+ });
4879
+ if (docFragments.length > 0) {
4880
+ logger9.debug(`[Graph API] \u{1F4CA} Document ${doc.id} has ${docFragments.length} fragments`);
4881
+ }
4882
+ docFragments.forEach((frag) => {
4883
+ const docId = doc.id;
4884
+ if (!frag.id || !docId) {
4885
+ logger9.warn(
4886
+ `[Graph API] \u26A0\uFE0F Skipping fragment without ID for document ${docId || "unknown"}`
4887
+ );
4888
+ return;
4889
+ }
4890
+ nodes.push({ id: frag.id, type: "fragment" });
4891
+ links.push({ source: docId, target: frag.id });
4892
+ });
4893
+ });
4894
+ logger9.info(
4895
+ `[Graph API] \u{1F4CA} Final graph: ${nodes.length} nodes (${paginatedDocuments.length} documents), ${links.length} links`
4896
+ );
4897
+ }
4898
+ sendSuccess(res, {
4899
+ nodes,
4900
+ links,
4901
+ pagination: {
4902
+ currentPage: page,
4903
+ totalPages,
4904
+ hasMore,
4905
+ totalDocuments
4906
+ }
4907
+ });
4908
+ } catch (error) {
4909
+ logger9.error("[Graph API] \u274C Error fetching graph nodes:", error);
4910
+ sendError(res, 500, "GRAPH_ERROR", "Failed to fetch graph nodes", error.message);
4911
+ }
4912
+ }
4913
+ async function getGraphNodeDetailsHandler(req, res, runtime) {
4914
+ const service = runtime.getService(KnowledgeService.serviceType);
4915
+ if (!service) {
4916
+ return sendError(res, 500, "SERVICE_NOT_FOUND", "KnowledgeService not found");
4917
+ }
4918
+ const nodeId = req.params.nodeId;
4919
+ const agentId = req.query.agentId || runtime.agentId;
4920
+ if (!nodeId || nodeId.length < 36) {
4921
+ return sendError(res, 400, "INVALID_ID", "Invalid node ID format");
4922
+ }
4923
+ try {
4924
+ logger9.info(`[Graph API] \u{1F4CA} Fetching node details for: ${nodeId}, agent: ${agentId}`);
4925
+ const allDocuments = await service.getMemories({
4926
+ tableName: "documents",
4927
+ count: 1e4
4928
+ });
4929
+ logger9.debug(`[Graph API] \u{1F4CA} Total documents in DB: ${allDocuments.length}`);
4930
+ let document = allDocuments.find((doc) => doc.id === nodeId && doc.roomId === agentId);
4931
+ if (!document) {
4932
+ logger9.debug(`[Graph API] \u{1F4CA} Document not found with roomId filter, trying without filter`);
4933
+ document = allDocuments.find((doc) => doc.id === nodeId);
4934
+ if (document) {
4935
+ logger9.warn(
4936
+ `[Graph API] \u26A0\uFE0F Document ${nodeId} found but has different roomId: ${document.roomId} vs ${agentId}`
4937
+ );
4938
+ }
4939
+ }
4940
+ if (document) {
4941
+ logger9.info(`[Graph API] \u2705 Found document: ${nodeId}`);
4942
+ sendSuccess(res, {
4943
+ id: document.id,
4944
+ type: "document",
4945
+ content: document.content,
4946
+ metadata: document.metadata,
4947
+ createdAt: document.createdAt,
4948
+ entityId: document.entityId,
4949
+ roomId: document.roomId,
4950
+ agentId: document.agentId,
4951
+ worldId: document.worldId
4952
+ });
4953
+ return;
4954
+ }
4955
+ logger9.debug(`[Graph API] \u{1F4CA} Document not found, searching in fragments`);
4956
+ const allFragments = await service.getMemories({
4957
+ tableName: "knowledge",
4958
+ count: 5e4
4959
+ // Reduced from 100000 - still high enough for large documents
4960
+ });
4961
+ logger9.debug(`[Graph API] \u{1F4CA} Total fragments in DB: ${allFragments.length}`);
4962
+ let fragment = allFragments.find((frag) => frag.id === nodeId && frag.roomId === agentId);
4963
+ if (!fragment) {
4964
+ logger9.debug(`[Graph API] \u{1F4CA} Fragment not found with roomId filter, trying without filter`);
4965
+ fragment = allFragments.find((frag) => frag.id === nodeId);
4966
+ if (fragment) {
4967
+ logger9.warn(
4968
+ `[Graph API] \u26A0\uFE0F Fragment ${nodeId} found but has different roomId: ${fragment.roomId} vs ${agentId}`
4969
+ );
4970
+ }
4971
+ }
4972
+ if (fragment) {
4973
+ logger9.info(`[Graph API] \u2705 Found fragment: ${nodeId}`);
4974
+ sendSuccess(res, {
4975
+ id: fragment.id,
4976
+ type: "fragment",
4977
+ content: fragment.content,
4978
+ metadata: fragment.metadata,
4979
+ createdAt: fragment.createdAt,
4980
+ entityId: fragment.entityId,
4981
+ roomId: fragment.roomId,
4982
+ agentId: fragment.agentId,
4983
+ worldId: fragment.worldId
4984
+ });
4985
+ return;
4986
+ }
4987
+ logger9.error(`[Graph API] \u274C Node ${nodeId} not found in documents or fragments`);
4988
+ sendError(res, 404, "NOT_FOUND", `Node with ID ${nodeId} not found`);
4989
+ } catch (error) {
4990
+ logger9.error(`[Graph API] \u274C Error fetching node details for ${nodeId}:`, error);
4991
+ sendError(res, 500, "GRAPH_ERROR", "Failed to fetch node details", error.message);
4992
+ }
4993
+ }
4994
+ async function expandDocumentGraphHandler(req, res, runtime) {
4995
+ const service = runtime.getService(KnowledgeService.serviceType);
4996
+ if (!service) {
4997
+ return sendError(res, 500, "SERVICE_NOT_FOUND", "KnowledgeService not found");
4998
+ }
4999
+ const documentId = req.params.documentId;
5000
+ const agentId = req.query.agentId || runtime.agentId;
5001
+ if (!documentId || documentId.length < 36) {
5002
+ return sendError(res, 400, "INVALID_ID", "Invalid document ID format");
5003
+ }
5004
+ try {
5005
+ logger9.debug(`[Graph API] \u{1F4CA} Expanding document: ${documentId}, agent: ${agentId}`);
5006
+ const allFragments = await service.getMemories({
5007
+ tableName: "knowledge",
5008
+ roomId: agentId,
5009
+ // Filter by agent
5010
+ count: 5e4
5011
+ // Reduced from 100000 - still high enough for large documents
5012
+ });
5013
+ logger9.debug(`[Graph API] \u{1F4CA} Total fragments in knowledge table: ${allFragments.length}`);
5014
+ if (allFragments.length > 0 && process.env.NODE_ENV !== "production") {
5015
+ logger9.debug(
5016
+ `[Graph API] \u{1F4CA} Sample fragment metadata: ${JSON.stringify(allFragments[0].metadata)}`
5017
+ );
5018
+ const uniqueTypes = new Set(allFragments.map((f) => f.metadata?.type));
5019
+ logger9.debug(
5020
+ `[Graph API] \u{1F4CA} Unique metadata types found in knowledge table: ${JSON.stringify(Array.from(uniqueTypes))}`
5021
+ );
5022
+ const relevantFragments = allFragments.filter((fragment) => {
5023
+ const metadata = fragment.metadata;
5024
+ const hasDocumentId = metadata?.documentId === documentId;
5025
+ if (hasDocumentId) {
5026
+ logger9.debug(
5027
+ `[Graph API] \u{1F4CA} Fragment ${fragment.id} metadata: ${JSON.stringify(metadata)}`
5028
+ );
5029
+ }
5030
+ return hasDocumentId;
5031
+ });
5032
+ logger9.debug(
5033
+ `[Graph API] \u{1F4CA} Fragments with matching documentId: ${relevantFragments.length}`
5034
+ );
5035
+ }
5036
+ const documentFragments = allFragments.filter((fragment) => {
5037
+ const metadata = fragment.metadata;
5038
+ const typeString = typeof metadata?.type === "string" ? metadata.type : null;
5039
+ const isFragment = typeString && typeString.toLowerCase() === "fragment" || metadata?.type === MemoryType4.FRAGMENT || // If no type but has documentId, assume it's a fragment
5040
+ !metadata?.type && metadata?.documentId;
5041
+ return metadata?.documentId === documentId && isFragment;
5042
+ });
5043
+ const nodes = documentFragments.filter((frag) => frag.id !== void 0).map((frag) => ({
5044
+ id: frag.id,
5045
+ type: "fragment"
5046
+ }));
5047
+ const links = documentFragments.filter((frag) => frag.id !== void 0).map((frag) => ({
5048
+ source: documentId,
5049
+ target: frag.id
5050
+ }));
5051
+ logger9.info(`[Graph API] \u{1F4CA} Found ${nodes.length} fragments for document ${documentId}`);
5052
+ sendSuccess(res, {
5053
+ documentId,
5054
+ nodes,
5055
+ links,
5056
+ fragmentCount: nodes.length
5057
+ });
5058
+ } catch (error) {
5059
+ logger9.error(`[Graph API] \u274C Error expanding document ${documentId}:`, error);
5060
+ sendError(res, 500, "GRAPH_ERROR", "Failed to expand document", error.message);
5061
+ }
5062
+ }
4804
5063
  async function uploadKnowledgeWithMulter(req, res, runtime) {
4805
5064
  const upload = createUploadMiddleware(runtime);
4806
5065
  const uploadArray = upload.array(
@@ -4857,6 +5116,22 @@ var knowledgeRoutes = [
4857
5116
  type: "GET",
4858
5117
  path: "/search",
4859
5118
  handler: searchKnowledgeHandler
5119
+ },
5120
+ // New graph routes
5121
+ {
5122
+ type: "GET",
5123
+ path: "/graph/nodes",
5124
+ handler: getGraphNodesHandler
5125
+ },
5126
+ {
5127
+ type: "GET",
5128
+ path: "/graph/node/:nodeId",
5129
+ handler: getGraphNodeDetailsHandler
5130
+ },
5131
+ {
5132
+ type: "GET",
5133
+ path: "/graph/expand/:documentId",
5134
+ handler: expandDocumentGraphHandler
4860
5135
  }
4861
5136
  ];
4862
5137