@elizaos/plugin-bootstrap 1.6.5 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -3,28 +3,28 @@
3
3
  "sources": ["../../../node_modules/unique-names-generator/dist/index.js", "../src/index.ts", "../../../node_modules/uuid/dist-node/stringify.js", "../../../node_modules/uuid/dist-node/rng.js", "../../../node_modules/uuid/dist-node/native.js", "../../../node_modules/uuid/dist-node/v4.js", "../src/actions/imageGeneration.ts", "../src/actions/choice.ts", "../src/actions/followRoom.ts", "../src/actions/ignore.ts", "../src/actions/muteRoom.ts", "../src/actions/none.ts", "../src/actions/reply.ts", "../src/actions/roles.ts", "../src/actions/sendMessage.ts", "../src/actions/settings.ts", "../../../node_modules/dedent/dist/dedent.mjs", "../src/actions/unfollowRoom.ts", "../src/actions/unmuteRoom.ts", "../src/actions/updateEntity.ts", "../src/evaluators/reflection.ts", "../src/providers/actions.ts", "../src/providers/actionState.ts", "../src/providers/anxiety.ts", "../src/providers/attachments.ts", "../src/providers/capabilities.ts", "../src/providers/character.ts", "../src/providers/choice.ts", "../src/providers/entities.ts", "../src/providers/evaluators.ts", "../src/providers/facts.ts", "../src/providers/providers.ts", "../src/providers/recentMessages.ts", "../src/providers/relationships.ts", "../src/providers/roles.ts", "../src/providers/settings.ts", "../src/providers/time.ts", "../src/providers/world.ts", "../src/services/task.ts", "../src/services/embedding.ts"],
4
4
  "sourcesContent": [
5
5
  "const a=a=>{a=1831565813+(a|=0)|0;let e=Math.imul(a^a>>>15,1|a);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296};class e{constructor(a){this.dictionaries=void 0,this.length=void 0,this.separator=void 0,this.style=void 0,this.seed=void 0;const{length:e,separator:i,dictionaries:n,style:l,seed:r}=a;this.dictionaries=n,this.separator=i,this.length=e,this.style=l,this.seed=r}generate(){if(!this.dictionaries)throw new Error('Cannot find any dictionary. Please provide at least one, or leave the \"dictionary\" field empty in the config object');if(this.length<=0)throw new Error(\"Invalid length provided\");if(this.length>this.dictionaries.length)throw new Error(`The length cannot be bigger than the number of dictionaries.\\nLength provided: ${this.length}. Number of dictionaries provided: ${this.dictionaries.length}`);let e=this.seed;return this.dictionaries.slice(0,this.length).reduce((i,n)=>{let l;e?(l=(e=>{if(\"string\"==typeof e){const i=e.split(\"\").map(a=>a.charCodeAt(0)).reduce((a,e)=>a+e,1),n=Math.floor(Number(i));return a(n)}return a(e)})(e),e=4294967296*l):l=Math.random();let r=n[Math.floor(l*n.length)]||\"\";if(\"lowerCase\"===this.style)r=r.toLowerCase();else if(\"capital\"===this.style){const[a,...e]=r.split(\"\");r=a.toUpperCase()+e.join(\"\")}else\"upperCase\"===this.style&&(r=r.toUpperCase());return i?`${i}${this.separator}${r}`:`${r}`},\"\")}}const i={separator:\"_\",dictionaries:[]};exports.NumberDictionary=class{static generate(a={}){let e=a.min||1,i=a.max||999;if(a.length){const n=Math.pow(10,a.length);return e=n/10,i=n-1,[`${Math.floor(Math.random()*(i-e))+e}`]}return[`${Math.floor(Math.random()*(i-e))+e}`]}},exports.adjectives=[\"able\",\"above\",\"absent\",\"absolute\",\"abstract\",\"abundant\",\"academic\",\"acceptable\",\"accepted\",\"accessible\",\"accurate\",\"accused\",\"active\",\"actual\",\"acute\",\"added\",\"additional\",\"adequate\",\"adjacent\",\"administrative\",\"adorable\",\"advanced\",\"adverse\",\"advisory\",\"aesthetic\",\"afraid\",\"aggregate\",\"aggressive\",\"agreeable\",\"agreed\",\"agricultural\",\"alert\",\"alive\",\"alleged\",\"allied\",\"alone\",\"alright\",\"alternative\",\"amateur\",\"amazing\",\"ambitious\",\"amused\",\"ancient\",\"angry\",\"annoyed\",\"annual\",\"anonymous\",\"anxious\",\"appalling\",\"apparent\",\"applicable\",\"appropriate\",\"arbitrary\",\"architectural\",\"armed\",\"arrogant\",\"artificial\",\"artistic\",\"ashamed\",\"asleep\",\"assistant\",\"associated\",\"atomic\",\"attractive\",\"automatic\",\"autonomous\",\"available\",\"average\",\"awake\",\"aware\",\"awful\",\"awkward\",\"back\",\"bad\",\"balanced\",\"bare\",\"basic\",\"beautiful\",\"beneficial\",\"better\",\"bewildered\",\"big\",\"binding\",\"biological\",\"bitter\",\"bizarre\",\"blank\",\"blind\",\"blonde\",\"bloody\",\"blushing\",\"boiling\",\"bold\",\"bored\",\"boring\",\"bottom\",\"brainy\",\"brave\",\"breakable\",\"breezy\",\"brief\",\"bright\",\"brilliant\",\"broad\",\"broken\",\"bumpy\",\"burning\",\"busy\",\"calm\",\"capable\",\"capitalist\",\"careful\",\"casual\",\"causal\",\"cautious\",\"central\",\"certain\",\"changing\",\"characteristic\",\"charming\",\"cheap\",\"cheerful\",\"chemical\",\"chief\",\"chilly\",\"chosen\",\"christian\",\"chronic\",\"chubby\",\"circular\",\"civic\",\"civil\",\"civilian\",\"classic\",\"classical\",\"clean\",\"clear\",\"clever\",\"clinical\",\"close\",\"closed\",\"cloudy\",\"clumsy\",\"coastal\",\"cognitive\",\"coherent\",\"cold\",\"collective\",\"colonial\",\"colorful\",\"colossal\",\"coloured\",\"colourful\",\"combative\",\"combined\",\"comfortable\",\"coming\",\"commercial\",\"common\",\"communist\",\"compact\",\"comparable\",\"comparative\",\"compatible\",\"competent\",\"competitive\",\"complete\",\"complex\",\"complicated\",\"comprehensive\",\"compulsory\",\"conceptual\",\"concerned\",\"concrete\",\"condemned\",\"confident\",\"confidential\",\"confused\",\"conscious\",\"conservation\",\"conservative\",\"considerable\",\"consistent\",\"constant\",\"constitutional\",\"contemporary\",\"content\",\"continental\",\"continued\",\"continuing\",\"continuous\",\"controlled\",\"controversial\",\"convenient\",\"conventional\",\"convinced\",\"convincing\",\"cooing\",\"cool\",\"cooperative\",\"corporate\",\"correct\",\"corresponding\",\"costly\",\"courageous\",\"crazy\",\"creative\",\"creepy\",\"criminal\",\"critical\",\"crooked\",\"crowded\",\"crucial\",\"crude\",\"cruel\",\"cuddly\",\"cultural\",\"curious\",\"curly\",\"current\",\"curved\",\"cute\",\"daily\",\"damaged\",\"damp\",\"dangerous\",\"dark\",\"dead\",\"deaf\",\"deafening\",\"dear\",\"decent\",\"decisive\",\"deep\",\"defeated\",\"defensive\",\"defiant\",\"definite\",\"deliberate\",\"delicate\",\"delicious\",\"delighted\",\"delightful\",\"democratic\",\"dependent\",\"depressed\",\"desirable\",\"desperate\",\"detailed\",\"determined\",\"developed\",\"developing\",\"devoted\",\"different\",\"difficult\",\"digital\",\"diplomatic\",\"direct\",\"dirty\",\"disabled\",\"disappointed\",\"disastrous\",\"disciplinary\",\"disgusted\",\"distant\",\"distinct\",\"distinctive\",\"distinguished\",\"disturbed\",\"disturbing\",\"diverse\",\"divine\",\"dizzy\",\"domestic\",\"dominant\",\"double\",\"doubtful\",\"drab\",\"dramatic\",\"dreadful\",\"driving\",\"drunk\",\"dry\",\"dual\",\"due\",\"dull\",\"dusty\",\"dutch\",\"dying\",\"dynamic\",\"eager\",\"early\",\"eastern\",\"easy\",\"economic\",\"educational\",\"eerie\",\"effective\",\"efficient\",\"elaborate\",\"elated\",\"elderly\",\"eldest\",\"electoral\",\"electric\",\"electrical\",\"electronic\",\"elegant\",\"eligible\",\"embarrassed\",\"embarrassing\",\"emotional\",\"empirical\",\"empty\",\"enchanting\",\"encouraging\",\"endless\",\"energetic\",\"enormous\",\"enthusiastic\",\"entire\",\"entitled\",\"envious\",\"environmental\",\"equal\",\"equivalent\",\"essential\",\"established\",\"estimated\",\"ethical\",\"ethnic\",\"eventual\",\"everyday\",\"evident\",\"evil\",\"evolutionary\",\"exact\",\"excellent\",\"exceptional\",\"excess\",\"excessive\",\"excited\",\"exciting\",\"exclusive\",\"existing\",\"exotic\",\"expected\",\"expensive\",\"experienced\",\"experimental\",\"explicit\",\"extended\",\"extensive\",\"external\",\"extra\",\"extraordinary\",\"extreme\",\"exuberant\",\"faint\",\"fair\",\"faithful\",\"familiar\",\"famous\",\"fancy\",\"fantastic\",\"far\",\"fascinating\",\"fashionable\",\"fast\",\"fat\",\"fatal\",\"favourable\",\"favourite\",\"federal\",\"fellow\",\"female\",\"feminist\",\"few\",\"fierce\",\"filthy\",\"final\",\"financial\",\"fine\",\"firm\",\"fiscal\",\"fit\",\"fixed\",\"flaky\",\"flat\",\"flexible\",\"fluffy\",\"fluttering\",\"flying\",\"following\",\"fond\",\"foolish\",\"foreign\",\"formal\",\"formidable\",\"forthcoming\",\"fortunate\",\"forward\",\"fragile\",\"frail\",\"frantic\",\"free\",\"frequent\",\"fresh\",\"friendly\",\"frightened\",\"front\",\"frozen\",\"full\",\"fun\",\"functional\",\"fundamental\",\"funny\",\"furious\",\"future\",\"fuzzy\",\"gastric\",\"gay\",\"general\",\"generous\",\"genetic\",\"gentle\",\"genuine\",\"geographical\",\"giant\",\"gigantic\",\"given\",\"glad\",\"glamorous\",\"gleaming\",\"global\",\"glorious\",\"golden\",\"good\",\"gorgeous\",\"gothic\",\"governing\",\"graceful\",\"gradual\",\"grand\",\"grateful\",\"greasy\",\"great\",\"grieving\",\"grim\",\"gross\",\"grotesque\",\"growing\",\"grubby\",\"grumpy\",\"guilty\",\"handicapped\",\"handsome\",\"happy\",\"hard\",\"harsh\",\"head\",\"healthy\",\"heavy\",\"helpful\",\"helpless\",\"hidden\",\"high\",\"hilarious\",\"hissing\",\"historic\",\"historical\",\"hollow\",\"holy\",\"homeless\",\"homely\",\"hon\",\"honest\",\"horizontal\",\"horrible\",\"hostile\",\"hot\",\"huge\",\"human\",\"hungry\",\"hurt\",\"hushed\",\"husky\",\"icy\",\"ideal\",\"identical\",\"ideological\",\"ill\",\"illegal\",\"imaginative\",\"immediate\",\"immense\",\"imperial\",\"implicit\",\"important\",\"impossible\",\"impressed\",\"impressive\",\"improved\",\"inadequate\",\"inappropriate\",\"inc\",\"inclined\",\"increased\",\"increasing\",\"incredible\",\"independent\",\"indirect\",\"individual\",\"industrial\",\"inevitable\",\"influential\",\"informal\",\"inherent\",\"initial\",\"injured\",\"inland\",\"inner\",\"innocent\",\"innovative\",\"inquisitive\",\"instant\",\"institutional\",\"insufficient\",\"intact\",\"integral\",\"integrated\",\"intellectual\",\"intelligent\",\"intense\",\"intensive\",\"interested\",\"interesting\",\"interim\",\"interior\",\"intermediate\",\"internal\",\"international\",\"intimate\",\"invisible\",\"involved\",\"irrelevant\",\"isolated\",\"itchy\",\"jealous\",\"jittery\",\"joint\",\"jolly\",\"joyous\",\"judicial\",\"juicy\",\"junior\",\"just\",\"keen\",\"key\",\"kind\",\"known\",\"labour\",\"large\",\"late\",\"latin\",\"lazy\",\"leading\",\"left\",\"legal\",\"legislative\",\"legitimate\",\"lengthy\",\"lesser\",\"level\",\"lexical\",\"liable\",\"liberal\",\"light\",\"like\",\"likely\",\"limited\",\"linear\",\"linguistic\",\"liquid\",\"literary\",\"little\",\"live\",\"lively\",\"living\",\"local\",\"logical\",\"lonely\",\"long\",\"loose\",\"lost\",\"loud\",\"lovely\",\"low\",\"loyal\",\"ltd\",\"lucky\",\"mad\",\"magic\",\"magnetic\",\"magnificent\",\"main\",\"major\",\"male\",\"mammoth\",\"managerial\",\"managing\",\"manual\",\"many\",\"marginal\",\"marine\",\"marked\",\"married\",\"marvellous\",\"marxist\",\"mass\",\"massive\",\"mathematical\",\"mature\",\"maximum\",\"mean\",\"meaningful\",\"mechanical\",\"medical\",\"medieval\",\"melodic\",\"melted\",\"mental\",\"mere\",\"metropolitan\",\"mid\",\"middle\",\"mighty\",\"mild\",\"military\",\"miniature\",\"minimal\",\"minimum\",\"ministerial\",\"minor\",\"miserable\",\"misleading\",\"missing\",\"misty\",\"mixed\",\"moaning\",\"mobile\",\"moderate\",\"modern\",\"modest\",\"molecular\",\"monetary\",\"monthly\",\"moral\",\"motionless\",\"muddy\",\"multiple\",\"mushy\",\"musical\",\"mute\",\"mutual\",\"mysterious\",\"naked\",\"narrow\",\"nasty\",\"national\",\"native\",\"natural\",\"naughty\",\"naval\",\"near\",\"nearby\",\"neat\",\"necessary\",\"negative\",\"neighbouring\",\"nervous\",\"net\",\"neutral\",\"new\",\"nice\",\"noble\",\"noisy\",\"normal\",\"northern\",\"nosy\",\"notable\",\"novel\",\"nuclear\",\"numerous\",\"nursing\",\"nutritious\",\"nutty\",\"obedient\",\"objective\",\"obliged\",\"obnoxious\",\"obvious\",\"occasional\",\"occupational\",\"odd\",\"official\",\"ok\",\"okay\",\"old\",\"olympic\",\"only\",\"open\",\"operational\",\"opposite\",\"optimistic\",\"oral\",\"ordinary\",\"organic\",\"organisational\",\"original\",\"orthodox\",\"other\",\"outdoor\",\"outer\",\"outrageous\",\"outside\",\"outstanding\",\"overall\",\"overseas\",\"overwhelming\",\"painful\",\"pale\",\"panicky\",\"parallel\",\"parental\",\"parliamentary\",\"partial\",\"particular\",\"passing\",\"passive\",\"past\",\"patient\",\"payable\",\"peaceful\",\"peculiar\",\"perfect\",\"permanent\",\"persistent\",\"personal\",\"petite\",\"philosophical\",\"physical\",\"plain\",\"planned\",\"plastic\",\"pleasant\",\"pleased\",\"poised\",\"polite\",\"political\",\"poor\",\"popular\",\"positive\",\"possible\",\"potential\",\"powerful\",\"practical\",\"precious\",\"precise\",\"preferred\",\"pregnant\",\"preliminary\",\"premier\",\"prepared\",\"present\",\"presidential\",\"pretty\",\"previous\",\"prickly\",\"primary\",\"prime\",\"primitive\",\"principal\",\"printed\",\"prior\",\"private\",\"probable\",\"productive\",\"professional\",\"profitable\",\"profound\",\"progressive\",\"prominent\",\"promising\",\"proper\",\"proposed\",\"prospective\",\"protective\",\"protestant\",\"proud\",\"provincial\",\"psychiatric\",\"psychological\",\"public\",\"puny\",\"pure\",\"purring\",\"puzzled\",\"quaint\",\"qualified\",\"quarrelsome\",\"querulous\",\"quick\",\"quickest\",\"quiet\",\"quintessential\",\"quixotic\",\"racial\",\"radical\",\"rainy\",\"random\",\"rapid\",\"rare\",\"raspy\",\"rational\",\"ratty\",\"raw\",\"ready\",\"real\",\"realistic\",\"rear\",\"reasonable\",\"recent\",\"reduced\",\"redundant\",\"regional\",\"registered\",\"regular\",\"regulatory\",\"related\",\"relative\",\"relaxed\",\"relevant\",\"reliable\",\"relieved\",\"religious\",\"reluctant\",\"remaining\",\"remarkable\",\"remote\",\"renewed\",\"representative\",\"repulsive\",\"required\",\"resident\",\"residential\",\"resonant\",\"respectable\",\"respective\",\"responsible\",\"resulting\",\"retail\",\"retired\",\"revolutionary\",\"rich\",\"ridiculous\",\"right\",\"rigid\",\"ripe\",\"rising\",\"rival\",\"roasted\",\"robust\",\"rolling\",\"romantic\",\"rotten\",\"rough\",\"round\",\"royal\",\"rubber\",\"rude\",\"ruling\",\"running\",\"rural\",\"sacred\",\"sad\",\"safe\",\"salty\",\"satisfactory\",\"satisfied\",\"scared\",\"scary\",\"scattered\",\"scientific\",\"scornful\",\"scrawny\",\"screeching\",\"secondary\",\"secret\",\"secure\",\"select\",\"selected\",\"selective\",\"selfish\",\"semantic\",\"senior\",\"sensible\",\"sensitive\",\"separate\",\"serious\",\"severe\",\"sexual\",\"shaggy\",\"shaky\",\"shallow\",\"shared\",\"sharp\",\"sheer\",\"shiny\",\"shivering\",\"shocked\",\"short\",\"shrill\",\"shy\",\"sick\",\"significant\",\"silent\",\"silky\",\"silly\",\"similar\",\"simple\",\"single\",\"skilled\",\"skinny\",\"sleepy\",\"slight\",\"slim\",\"slimy\",\"slippery\",\"slow\",\"small\",\"smart\",\"smiling\",\"smoggy\",\"smooth\",\"social\",\"socialist\",\"soft\",\"solar\",\"sole\",\"solid\",\"sophisticated\",\"sore\",\"sorry\",\"sound\",\"sour\",\"southern\",\"soviet\",\"spare\",\"sparkling\",\"spatial\",\"special\",\"specific\",\"specified\",\"spectacular\",\"spicy\",\"spiritual\",\"splendid\",\"spontaneous\",\"sporting\",\"spotless\",\"spotty\",\"square\",\"squealing\",\"stable\",\"stale\",\"standard\",\"static\",\"statistical\",\"statutory\",\"steady\",\"steep\",\"sticky\",\"stiff\",\"still\",\"stingy\",\"stormy\",\"straight\",\"straightforward\",\"strange\",\"strategic\",\"strict\",\"striking\",\"striped\",\"strong\",\"structural\",\"stuck\",\"stupid\",\"subjective\",\"subsequent\",\"substantial\",\"subtle\",\"successful\",\"successive\",\"sudden\",\"sufficient\",\"suitable\",\"sunny\",\"super\",\"superb\",\"superior\",\"supporting\",\"supposed\",\"supreme\",\"sure\",\"surprised\",\"surprising\",\"surrounding\",\"surviving\",\"suspicious\",\"sweet\",\"swift\",\"symbolic\",\"sympathetic\",\"systematic\",\"tall\",\"tame\",\"tart\",\"tasteless\",\"tasty\",\"technical\",\"technological\",\"teenage\",\"temporary\",\"tender\",\"tense\",\"terrible\",\"territorial\",\"testy\",\"then\",\"theoretical\",\"thick\",\"thin\",\"thirsty\",\"thorough\",\"thoughtful\",\"thoughtless\",\"thundering\",\"tight\",\"tiny\",\"tired\",\"top\",\"tory\",\"total\",\"tough\",\"toxic\",\"traditional\",\"tragic\",\"tremendous\",\"tricky\",\"tropical\",\"troubled\",\"typical\",\"ugliest\",\"ugly\",\"ultimate\",\"unable\",\"unacceptable\",\"unaware\",\"uncertain\",\"unchanged\",\"uncomfortable\",\"unconscious\",\"underground\",\"underlying\",\"unemployed\",\"uneven\",\"unexpected\",\"unfair\",\"unfortunate\",\"unhappy\",\"uniform\",\"uninterested\",\"unique\",\"united\",\"universal\",\"unknown\",\"unlikely\",\"unnecessary\",\"unpleasant\",\"unsightly\",\"unusual\",\"unwilling\",\"upper\",\"upset\",\"uptight\",\"urban\",\"urgent\",\"used\",\"useful\",\"useless\",\"usual\",\"vague\",\"valid\",\"valuable\",\"variable\",\"varied\",\"various\",\"varying\",\"vast\",\"verbal\",\"vertical\",\"very\",\"vicarious\",\"vicious\",\"victorious\",\"violent\",\"visible\",\"visiting\",\"visual\",\"vital\",\"vitreous\",\"vivacious\",\"vivid\",\"vocal\",\"vocational\",\"voiceless\",\"voluminous\",\"voluntary\",\"vulnerable\",\"wandering\",\"warm\",\"wasteful\",\"watery\",\"weak\",\"wealthy\",\"weary\",\"wee\",\"weekly\",\"weird\",\"welcome\",\"well\",\"western\",\"wet\",\"whispering\",\"whole\",\"wicked\",\"wide\",\"widespread\",\"wild\",\"wilful\",\"willing\",\"willowy\",\"wily\",\"wise\",\"wispy\",\"wittering\",\"witty\",\"wonderful\",\"wooden\",\"working\",\"worldwide\",\"worried\",\"worrying\",\"worthwhile\",\"worthy\",\"written\",\"wrong\",\"xenacious\",\"xenial\",\"xenogeneic\",\"xenophobic\",\"xeric\",\"xerothermic\",\"yabbering\",\"yammering\",\"yappiest\",\"yappy\",\"yawning\",\"yearling\",\"yearning\",\"yeasty\",\"yelling\",\"yelping\",\"yielding\",\"yodelling\",\"young\",\"youngest\",\"youthful\",\"ytterbic\",\"yucky\",\"yummy\",\"zany\",\"zealous\",\"zeroth\",\"zestful\",\"zesty\",\"zippy\",\"zonal\",\"zoophagous\",\"zygomorphic\",\"zygotic\"],exports.animals=[\"aardvark\",\"aardwolf\",\"albatross\",\"alligator\",\"alpaca\",\"amphibian\",\"anaconda\",\"angelfish\",\"anglerfish\",\"ant\",\"anteater\",\"antelope\",\"antlion\",\"ape\",\"aphid\",\"armadillo\",\"asp\",\"baboon\",\"badger\",\"bandicoot\",\"barnacle\",\"barracuda\",\"basilisk\",\"bass\",\"bat\",\"bear\",\"beaver\",\"bedbug\",\"bee\",\"beetle\",\"bird\",\"bison\",\"blackbird\",\"boa\",\"boar\",\"bobcat\",\"bobolink\",\"bonobo\",\"booby\",\"bovid\",\"bug\",\"butterfly\",\"buzzard\",\"camel\",\"canid\",\"canidae\",\"capybara\",\"cardinal\",\"caribou\",\"carp\",\"cat\",\"caterpillar\",\"catfish\",\"catshark\",\"cattle\",\"centipede\",\"cephalopod\",\"chameleon\",\"cheetah\",\"chickadee\",\"chicken\",\"chimpanzee\",\"chinchilla\",\"chipmunk\",\"cicada\",\"clam\",\"clownfish\",\"cobra\",\"cockroach\",\"cod\",\"condor\",\"constrictor\",\"coral\",\"cougar\",\"cow\",\"coyote\",\"crab\",\"crane\",\"crawdad\",\"crayfish\",\"cricket\",\"crocodile\",\"crow\",\"cuckoo\",\"damselfly\",\"deer\",\"dingo\",\"dinosaur\",\"dog\",\"dolphin\",\"donkey\",\"dormouse\",\"dove\",\"dragon\",\"dragonfly\",\"duck\",\"eagle\",\"earthworm\",\"earwig\",\"echidna\",\"eel\",\"egret\",\"elephant\",\"elk\",\"emu\",\"ermine\",\"falcon\",\"felidae\",\"ferret\",\"finch\",\"firefly\",\"fish\",\"flamingo\",\"flea\",\"fly\",\"flyingfish\",\"fowl\",\"fox\",\"frog\",\"galliform\",\"gamefowl\",\"gayal\",\"gazelle\",\"gecko\",\"gerbil\",\"gibbon\",\"giraffe\",\"goat\",\"goldfish\",\"goose\",\"gopher\",\"gorilla\",\"grasshopper\",\"grouse\",\"guan\",\"guanaco\",\"guineafowl\",\"gull\",\"guppy\",\"haddock\",\"halibut\",\"hamster\",\"hare\",\"harrier\",\"hawk\",\"hedgehog\",\"heron\",\"herring\",\"hippopotamus\",\"hookworm\",\"hornet\",\"horse\",\"hoverfly\",\"hummingbird\",\"hyena\",\"iguana\",\"impala\",\"jackal\",\"jaguar\",\"jay\",\"jellyfish\",\"junglefowl\",\"kangaroo\",\"kingfisher\",\"kite\",\"kiwi\",\"koala\",\"koi\",\"krill\",\"ladybug\",\"lamprey\",\"landfowl\",\"lark\",\"leech\",\"lemming\",\"lemur\",\"leopard\",\"leopon\",\"limpet\",\"lion\",\"lizard\",\"llama\",\"lobster\",\"locust\",\"loon\",\"louse\",\"lungfish\",\"lynx\",\"macaw\",\"mackerel\",\"magpie\",\"mammal\",\"manatee\",\"mandrill\",\"marlin\",\"marmoset\",\"marmot\",\"marsupial\",\"marten\",\"mastodon\",\"meadowlark\",\"meerkat\",\"mink\",\"minnow\",\"mite\",\"mockingbird\",\"mole\",\"mollusk\",\"mongoose\",\"monkey\",\"moose\",\"mosquito\",\"moth\",\"mouse\",\"mule\",\"muskox\",\"narwhal\",\"newt\",\"nightingale\",\"ocelot\",\"octopus\",\"opossum\",\"orangutan\",\"orca\",\"ostrich\",\"otter\",\"owl\",\"ox\",\"panda\",\"panther\",\"parakeet\",\"parrot\",\"parrotfish\",\"partridge\",\"peacock\",\"peafowl\",\"pelican\",\"penguin\",\"perch\",\"pheasant\",\"pig\",\"pigeon\",\"pike\",\"pinniped\",\"piranha\",\"planarian\",\"platypus\",\"pony\",\"porcupine\",\"porpoise\",\"possum\",\"prawn\",\"primate\",\"ptarmigan\",\"puffin\",\"puma\",\"python\",\"quail\",\"quelea\",\"quokka\",\"rabbit\",\"raccoon\",\"rat\",\"rattlesnake\",\"raven\",\"reindeer\",\"reptile\",\"rhinoceros\",\"roadrunner\",\"rodent\",\"rook\",\"rooster\",\"roundworm\",\"sailfish\",\"salamander\",\"salmon\",\"sawfish\",\"scallop\",\"scorpion\",\"seahorse\",\"shark\",\"sheep\",\"shrew\",\"shrimp\",\"silkworm\",\"silverfish\",\"skink\",\"skunk\",\"sloth\",\"slug\",\"smelt\",\"snail\",\"snake\",\"snipe\",\"sole\",\"sparrow\",\"spider\",\"spoonbill\",\"squid\",\"squirrel\",\"starfish\",\"stingray\",\"stoat\",\"stork\",\"sturgeon\",\"swallow\",\"swan\",\"swift\",\"swordfish\",\"swordtail\",\"tahr\",\"takin\",\"tapir\",\"tarantula\",\"tarsier\",\"termite\",\"tern\",\"thrush\",\"tick\",\"tiger\",\"tiglon\",\"toad\",\"tortoise\",\"toucan\",\"trout\",\"tuna\",\"turkey\",\"turtle\",\"tyrannosaurus\",\"unicorn\",\"urial\",\"vicuna\",\"viper\",\"vole\",\"vulture\",\"wallaby\",\"walrus\",\"warbler\",\"wasp\",\"weasel\",\"whale\",\"whippet\",\"whitefish\",\"wildcat\",\"wildebeest\",\"wildfowl\",\"wolf\",\"wolverine\",\"wombat\",\"woodpecker\",\"worm\",\"wren\",\"xerinae\",\"yak\",\"zebra\"],exports.colors=[\"amaranth\",\"amber\",\"amethyst\",\"apricot\",\"aqua\",\"aquamarine\",\"azure\",\"beige\",\"black\",\"blue\",\"blush\",\"bronze\",\"brown\",\"chocolate\",\"coffee\",\"copper\",\"coral\",\"crimson\",\"cyan\",\"emerald\",\"fuchsia\",\"gold\",\"gray\",\"green\",\"harlequin\",\"indigo\",\"ivory\",\"jade\",\"lavender\",\"lime\",\"magenta\",\"maroon\",\"moccasin\",\"olive\",\"orange\",\"peach\",\"pink\",\"plum\",\"purple\",\"red\",\"rose\",\"salmon\",\"sapphire\",\"scarlet\",\"silver\",\"tan\",\"teal\",\"tomato\",\"turquoise\",\"violet\",\"white\",\"yellow\"],exports.countries=[\"Afghanistan\",\"Åland Islands\",\"Albania\",\"Algeria\",\"American Samoa\",\"Andorra\",\"Angola\",\"Anguilla\",\"Antarctica\",\"Antigua & Barbuda\",\"Argentina\",\"Armenia\",\"Aruba\",\"Ascension Island\",\"Australia\",\"Austria\",\"Azerbaijan\",\"Bahamas\",\"Bahrain\",\"Bangladesh\",\"Barbados\",\"Belarus\",\"Belgium\",\"Belize\",\"Benin\",\"Bermuda\",\"Bhutan\",\"Bolivia\",\"Bosnia & Herzegovina\",\"Botswana\",\"Brazil\",\"British Indian Ocean Territory\",\"British Virgin Islands\",\"Brunei\",\"Bulgaria\",\"Burkina Faso\",\"Burundi\",\"Cambodia\",\"Cameroon\",\"Canada\",\"Canary Islands\",\"Cape Verde\",\"Caribbean Netherlands\",\"Cayman Islands\",\"Central African Republic\",\"Ceuta & Melilla\",\"Chad\",\"Chile\",\"China\",\"Christmas Island\",\"Cocos Islands\",\"Colombia\",\"Comoros\",\"Congo\",\"Cook Islands\",\"Costa Rica\",\"Côte d'Ivoire\",\"Croatia\",\"Cuba\",\"Curaçao\",\"Cyprus\",\"Czechia\",\"Denmark\",\"Diego Garcia\",\"Djibouti\",\"Dominica\",\"Dominican Republic\",\"Ecuador\",\"Egypt\",\"El Salvador\",\"Equatorial Guinea\",\"Eritrea\",\"Estonia\",\"Ethiopia\",\"Eurozone\",\"Falkland Islands\",\"Faroe Islands\",\"Fiji\",\"Finland\",\"France\",\"French Guiana\",\"French Polynesia\",\"French Southern Territories\",\"Gabon\",\"Gambia\",\"Georgia\",\"Germany\",\"Ghana\",\"Gibraltar\",\"Greece\",\"Greenland\",\"Grenada\",\"Guadeloupe\",\"Guam\",\"Guatemala\",\"Guernsey\",\"Guinea\",\"Guinea-Bissau\",\"Guyana\",\"Haiti\",\"Honduras\",\"Hong Kong SAR China\",\"Hungary\",\"Iceland\",\"India\",\"Indonesia\",\"Iran\",\"Iraq\",\"Ireland\",\"Isle of Man\",\"Israel\",\"Italy\",\"Jamaica\",\"Japan\",\"Jersey\",\"Jordan\",\"Kazakhstan\",\"Kenya\",\"Kiribati\",\"Kosovo\",\"Kuwait\",\"Kyrgyzstan\",\"Laos\",\"Latvia\",\"Lebanon\",\"Lesotho\",\"Liberia\",\"Libya\",\"Liechtenstein\",\"Lithuania\",\"Luxembourg\",\"Macau SAR China\",\"Macedonia\",\"Madagascar\",\"Malawi\",\"Malaysia\",\"Maldives\",\"Mali\",\"Malta\",\"Marshall Islands\",\"Martinique\",\"Mauritania\",\"Mauritius\",\"Mayotte\",\"Mexico\",\"Micronesia\",\"Moldova\",\"Monaco\",\"Mongolia\",\"Montenegro\",\"Montserrat\",\"Morocco\",\"Mozambique\",\"Myanmar\",\"Namibia\",\"Nauru\",\"Nepal\",\"Netherlands\",\"New Caledonia\",\"New Zealand\",\"Nicaragua\",\"Niger\",\"Nigeria\",\"Niue\",\"Norfolk Island\",\"North Korea\",\"Northern Mariana Islands\",\"Norway\",\"Oman\",\"Pakistan\",\"Palau\",\"Palestinian Territories\",\"Panama\",\"Papua New Guinea\",\"Paraguay\",\"Peru\",\"Philippines\",\"Pitcairn Islands\",\"Poland\",\"Portugal\",\"Puerto Rico\",\"Qatar\",\"Réunion\",\"Romania\",\"Russia\",\"Rwanda\",\"Samoa\",\"San Marino\",\"São Tomé & Príncipe\",\"Saudi Arabia\",\"Senegal\",\"Serbia\",\"Seychelles\",\"Sierra Leone\",\"Singapore\",\"Sint Maarten\",\"Slovakia\",\"Slovenia\",\"Solomon Islands\",\"Somalia\",\"South Africa\",\"South Georgia & South Sandwich Islands\",\"South Korea\",\"South Sudan\",\"Spain\",\"Sri Lanka\",\"St. Barthélemy\",\"St. Helena\",\"St. Kitts & Nevis\",\"St. Lucia\",\"St. Martin\",\"St. Pierre & Miquelon\",\"St. Vincent & Grenadines\",\"Sudan\",\"Suriname\",\"Svalbard & Jan Mayen\",\"Swaziland\",\"Sweden\",\"Switzerland\",\"Syria\",\"Taiwan\",\"Tajikistan\",\"Tanzania\",\"Thailand\",\"Timor-Leste\",\"Togo\",\"Tokelau\",\"Tonga\",\"Trinidad & Tobago\",\"Tristan da Cunha\",\"Tunisia\",\"Turkey\",\"Turkmenistan\",\"Turks & Caicos Islands\",\"Tuvalu\",\"U.S. Outlying Islands\",\"U.S. Virgin Islands\",\"Uganda\",\"Ukraine\",\"United Arab Emirates\",\"United Kingdom\",\"United Nations\",\"United States\",\"Uruguay\",\"Uzbekistan\",\"Vanuatu\",\"Vatican City\",\"Venezuela\",\"Vietnam\",\"Wallis & Futuna\",\"Western Sahara\",\"Yemen\",\"Zambia\",\"Zimbabwe\"],exports.languages=[\"Akan\",\"Amharic\",\"Arabic\",\"Assamese\",\"Awadhi\",\"Azerbaijani\",\"Balochi\",\"Belarusian\",\"Bengali\",\"Bhojpuri\",\"Burmese\",\"Cebuano\",\"Chewa\",\"Chhattisgarhi\",\"Chittagonian\",\"Czech\",\"Deccan\",\"Dhundhari\",\"Dutch\",\"English\",\"French\",\"Fula\",\"Gan\",\"German\",\"Greek\",\"Gujarati\",\"Hakka\",\"Haryanvi\",\"Hausa\",\"Hiligaynon\",\"Hindi\",\"Hmong\",\"Hungarian\",\"Igbo\",\"Ilocano\",\"Italian\",\"Japanese\",\"Javanese\",\"Jin\",\"Kannada\",\"Kazakh\",\"Khmer\",\"Kinyarwanda\",\"Kirundi\",\"Konkani\",\"Korean\",\"Kurdish\",\"Madurese\",\"Magahi\",\"Maithili\",\"Malagasy\",\"Malay\",\"Malayalam\",\"Mandarin\",\"Marathi\",\"Marwari\",\"Min\",\"Mossi\",\"Nepali\",\"Odia\",\"Oromo\",\"Pashto\",\"Persian\",\"Polish\",\"Portuguese\",\"Punjabi\",\"Quechua\",\"Romanian\",\"Russian\",\"Saraiki\",\"Shona\",\"Sindhi\",\"Sinhala\",\"Somali\",\"Spanish\",\"Sundanese\",\"Swedish\",\"Sylheti\",\"Tagalog\",\"Tamil\",\"Telugu\",\"Thai\",\"Turkish\",\"Turkmen\",\"Ukrainian\",\"Urdu\",\"Uyghur\",\"Uzbek\",\"Vietnamese\",\"Wu\",\"Xhosa\",\"Xiang\",\"Yoruba\",\"Yue\",\"Zhuang\",\"Zulu\"],exports.names=[\"Aaren\",\"Aarika\",\"Abagael\",\"Abagail\",\"Abbe\",\"Abbey\",\"Abbi\",\"Abbie\",\"Abby\",\"Abbye\",\"Abigael\",\"Abigail\",\"Abigale\",\"Abra\",\"Ada\",\"Adah\",\"Adaline\",\"Adan\",\"Adara\",\"Adda\",\"Addi\",\"Addia\",\"Addie\",\"Addy\",\"Adel\",\"Adela\",\"Adelaida\",\"Adelaide\",\"Adele\",\"Adelheid\",\"Adelice\",\"Adelina\",\"Adelind\",\"Adeline\",\"Adella\",\"Adelle\",\"Adena\",\"Adey\",\"Adi\",\"Adiana\",\"Adina\",\"Adora\",\"Adore\",\"Adoree\",\"Adorne\",\"Adrea\",\"Adria\",\"Adriaens\",\"Adrian\",\"Adriana\",\"Adriane\",\"Adrianna\",\"Adrianne\",\"Adriena\",\"Adrienne\",\"Aeriel\",\"Aeriela\",\"Aeriell\",\"Afton\",\"Ag\",\"Agace\",\"Agata\",\"Agatha\",\"Agathe\",\"Aggi\",\"Aggie\",\"Aggy\",\"Agna\",\"Agnella\",\"Agnes\",\"Agnese\",\"Agnesse\",\"Agneta\",\"Agnola\",\"Agretha\",\"Aida\",\"Aidan\",\"Aigneis\",\"Aila\",\"Aile\",\"Ailee\",\"Aileen\",\"Ailene\",\"Ailey\",\"Aili\",\"Ailina\",\"Ailis\",\"Ailsun\",\"Ailyn\",\"Aime\",\"Aimee\",\"Aimil\",\"Aindrea\",\"Ainslee\",\"Ainsley\",\"Ainslie\",\"Ajay\",\"Alaine\",\"Alameda\",\"Alana\",\"Alanah\",\"Alane\",\"Alanna\",\"Alayne\",\"Alberta\",\"Albertina\",\"Albertine\",\"Albina\",\"Alecia\",\"Aleda\",\"Aleece\",\"Aleen\",\"Alejandra\",\"Alejandrina\",\"Alena\",\"Alene\",\"Alessandra\",\"Aleta\",\"Alethea\",\"Alex\",\"Alexa\",\"Alexandra\",\"Alexandrina\",\"Alexi\",\"Alexia\",\"Alexina\",\"Alexine\",\"Alexis\",\"Alfi\",\"Alfie\",\"Alfreda\",\"Alfy\",\"Ali\",\"Alia\",\"Alica\",\"Alice\",\"Alicea\",\"Alicia\",\"Alida\",\"Alidia\",\"Alie\",\"Alika\",\"Alikee\",\"Alina\",\"Aline\",\"Alis\",\"Alisa\",\"Alisha\",\"Alison\",\"Alissa\",\"Alisun\",\"Alix\",\"Aliza\",\"Alla\",\"Alleen\",\"Allegra\",\"Allene\",\"Alli\",\"Allianora\",\"Allie\",\"Allina\",\"Allis\",\"Allison\",\"Allissa\",\"Allix\",\"Allsun\",\"Allx\",\"Ally\",\"Allyce\",\"Allyn\",\"Allys\",\"Allyson\",\"Alma\",\"Almeda\",\"Almeria\",\"Almeta\",\"Almira\",\"Almire\",\"Aloise\",\"Aloisia\",\"Aloysia\",\"Alta\",\"Althea\",\"Alvera\",\"Alverta\",\"Alvina\",\"Alvinia\",\"Alvira\",\"Alyce\",\"Alyda\",\"Alys\",\"Alysa\",\"Alyse\",\"Alysia\",\"Alyson\",\"Alyss\",\"Alyssa\",\"Amabel\",\"Amabelle\",\"Amalea\",\"Amalee\",\"Amaleta\",\"Amalia\",\"Amalie\",\"Amalita\",\"Amalle\",\"Amanda\",\"Amandi\",\"Amandie\",\"Amandy\",\"Amara\",\"Amargo\",\"Amata\",\"Amber\",\"Amberly\",\"Ambur\",\"Ame\",\"Amelia\",\"Amelie\",\"Amelina\",\"Ameline\",\"Amelita\",\"Ami\",\"Amie\",\"Amii\",\"Amil\",\"Amitie\",\"Amity\",\"Ammamaria\",\"Amy\",\"Amye\",\"Ana\",\"Anabal\",\"Anabel\",\"Anabella\",\"Anabelle\",\"Analiese\",\"Analise\",\"Anallese\",\"Anallise\",\"Anastasia\",\"Anastasie\",\"Anastassia\",\"Anatola\",\"Andee\",\"Andeee\",\"Anderea\",\"Andi\",\"Andie\",\"Andra\",\"Andrea\",\"Andreana\",\"Andree\",\"Andrei\",\"Andria\",\"Andriana\",\"Andriette\",\"Andromache\",\"Andy\",\"Anestassia\",\"Anet\",\"Anett\",\"Anetta\",\"Anette\",\"Ange\",\"Angel\",\"Angela\",\"Angele\",\"Angelia\",\"Angelica\",\"Angelika\",\"Angelina\",\"Angeline\",\"Angelique\",\"Angelita\",\"Angelle\",\"Angie\",\"Angil\",\"Angy\",\"Ania\",\"Anica\",\"Anissa\",\"Anita\",\"Anitra\",\"Anjanette\",\"Anjela\",\"Ann\",\"Ann-marie\",\"Anna\",\"Anna-diana\",\"Anna-diane\",\"Anna-maria\",\"Annabal\",\"Annabel\",\"Annabela\",\"Annabell\",\"Annabella\",\"Annabelle\",\"Annadiana\",\"Annadiane\",\"Annalee\",\"Annaliese\",\"Annalise\",\"Annamaria\",\"Annamarie\",\"Anne\",\"Anne-corinne\",\"Anne-marie\",\"Annecorinne\",\"Anneliese\",\"Annelise\",\"Annemarie\",\"Annetta\",\"Annette\",\"Anni\",\"Annice\",\"Annie\",\"Annis\",\"Annissa\",\"Annmaria\",\"Annmarie\",\"Annnora\",\"Annora\",\"Anny\",\"Anselma\",\"Ansley\",\"Anstice\",\"Anthe\",\"Anthea\",\"Anthia\",\"Anthiathia\",\"Antoinette\",\"Antonella\",\"Antonetta\",\"Antonia\",\"Antonie\",\"Antonietta\",\"Antonina\",\"Anya\",\"Appolonia\",\"April\",\"Aprilette\",\"Ara\",\"Arabel\",\"Arabela\",\"Arabele\",\"Arabella\",\"Arabelle\",\"Arda\",\"Ardath\",\"Ardeen\",\"Ardelia\",\"Ardelis\",\"Ardella\",\"Ardelle\",\"Arden\",\"Ardene\",\"Ardenia\",\"Ardine\",\"Ardis\",\"Ardisj\",\"Ardith\",\"Ardra\",\"Ardyce\",\"Ardys\",\"Ardyth\",\"Aretha\",\"Ariadne\",\"Ariana\",\"Aridatha\",\"Ariel\",\"Ariela\",\"Ariella\",\"Arielle\",\"Arlana\",\"Arlee\",\"Arleen\",\"Arlen\",\"Arlena\",\"Arlene\",\"Arleta\",\"Arlette\",\"Arleyne\",\"Arlie\",\"Arliene\",\"Arlina\",\"Arlinda\",\"Arline\",\"Arluene\",\"Arly\",\"Arlyn\",\"Arlyne\",\"Aryn\",\"Ashely\",\"Ashia\",\"Ashien\",\"Ashil\",\"Ashla\",\"Ashlan\",\"Ashlee\",\"Ashleigh\",\"Ashlen\",\"Ashley\",\"Ashli\",\"Ashlie\",\"Ashly\",\"Asia\",\"Astra\",\"Astrid\",\"Astrix\",\"Atalanta\",\"Athena\",\"Athene\",\"Atlanta\",\"Atlante\",\"Auberta\",\"Aubine\",\"Aubree\",\"Aubrette\",\"Aubrey\",\"Aubrie\",\"Aubry\",\"Audi\",\"Audie\",\"Audra\",\"Audre\",\"Audrey\",\"Audrie\",\"Audry\",\"Audrye\",\"Audy\",\"Augusta\",\"Auguste\",\"Augustina\",\"Augustine\",\"Aundrea\",\"Aura\",\"Aurea\",\"Aurel\",\"Aurelea\",\"Aurelia\",\"Aurelie\",\"Auria\",\"Aurie\",\"Aurilia\",\"Aurlie\",\"Auroora\",\"Aurora\",\"Aurore\",\"Austin\",\"Austina\",\"Austine\",\"Ava\",\"Aveline\",\"Averil\",\"Averyl\",\"Avie\",\"Avis\",\"Aviva\",\"Avivah\",\"Avril\",\"Avrit\",\"Ayn\",\"Bab\",\"Babara\",\"Babb\",\"Babbette\",\"Babbie\",\"Babette\",\"Babita\",\"Babs\",\"Bambi\",\"Bambie\",\"Bamby\",\"Barb\",\"Barbabra\",\"Barbara\",\"Barbara-anne\",\"Barbaraanne\",\"Barbe\",\"Barbee\",\"Barbette\",\"Barbey\",\"Barbi\",\"Barbie\",\"Barbra\",\"Barby\",\"Bari\",\"Barrie\",\"Barry\",\"Basia\",\"Bathsheba\",\"Batsheva\",\"Bea\",\"Beatrice\",\"Beatrisa\",\"Beatrix\",\"Beatriz\",\"Bebe\",\"Becca\",\"Becka\",\"Becki\",\"Beckie\",\"Becky\",\"Bee\",\"Beilul\",\"Beitris\",\"Bekki\",\"Bel\",\"Belia\",\"Belicia\",\"Belinda\",\"Belita\",\"Bell\",\"Bella\",\"Bellanca\",\"Belle\",\"Bellina\",\"Belva\",\"Belvia\",\"Bendite\",\"Benedetta\",\"Benedicta\",\"Benedikta\",\"Benetta\",\"Benita\",\"Benni\",\"Bennie\",\"Benny\",\"Benoite\",\"Berenice\",\"Beret\",\"Berget\",\"Berna\",\"Bernadene\",\"Bernadette\",\"Bernadina\",\"Bernadine\",\"Bernardina\",\"Bernardine\",\"Bernelle\",\"Bernete\",\"Bernetta\",\"Bernette\",\"Berni\",\"Bernice\",\"Bernie\",\"Bernita\",\"Berny\",\"Berri\",\"Berrie\",\"Berry\",\"Bert\",\"Berta\",\"Berte\",\"Bertha\",\"Berthe\",\"Berti\",\"Bertie\",\"Bertina\",\"Bertine\",\"Berty\",\"Beryl\",\"Beryle\",\"Bess\",\"Bessie\",\"Bessy\",\"Beth\",\"Bethanne\",\"Bethany\",\"Bethena\",\"Bethina\",\"Betsey\",\"Betsy\",\"Betta\",\"Bette\",\"Bette-ann\",\"Betteann\",\"Betteanne\",\"Betti\",\"Bettina\",\"Bettine\",\"Betty\",\"Bettye\",\"Beulah\",\"Bev\",\"Beverie\",\"Beverlee\",\"Beverley\",\"Beverlie\",\"Beverly\",\"Bevvy\",\"Bianca\",\"Bianka\",\"Bibbie\",\"Bibby\",\"Bibbye\",\"Bibi\",\"Biddie\",\"Biddy\",\"Bidget\",\"Bili\",\"Bill\",\"Billi\",\"Billie\",\"Billy\",\"Billye\",\"Binni\",\"Binnie\",\"Binny\",\"Bird\",\"Birdie\",\"Birgit\",\"Birgitta\",\"Blair\",\"Blaire\",\"Blake\",\"Blakelee\",\"Blakeley\",\"Blanca\",\"Blanch\",\"Blancha\",\"Blanche\",\"Blinni\",\"Blinnie\",\"Blinny\",\"Bliss\",\"Blisse\",\"Blithe\",\"Blondell\",\"Blondelle\",\"Blondie\",\"Blondy\",\"Blythe\",\"Bobbe\",\"Bobbee\",\"Bobbette\",\"Bobbi\",\"Bobbie\",\"Bobby\",\"Bobbye\",\"Bobette\",\"Bobina\",\"Bobine\",\"Bobinette\",\"Bonita\",\"Bonnee\",\"Bonni\",\"Bonnibelle\",\"Bonnie\",\"Bonny\",\"Brana\",\"Brandais\",\"Brande\",\"Brandea\",\"Brandi\",\"Brandice\",\"Brandie\",\"Brandise\",\"Brandy\",\"Breanne\",\"Brear\",\"Bree\",\"Breena\",\"Bren\",\"Brena\",\"Brenda\",\"Brenn\",\"Brenna\",\"Brett\",\"Bria\",\"Briana\",\"Brianna\",\"Brianne\",\"Bride\",\"Bridget\",\"Bridgette\",\"Bridie\",\"Brier\",\"Brietta\",\"Brigid\",\"Brigida\",\"Brigit\",\"Brigitta\",\"Brigitte\",\"Brina\",\"Briney\",\"Brinn\",\"Brinna\",\"Briny\",\"Brit\",\"Brita\",\"Britney\",\"Britni\",\"Britt\",\"Britta\",\"Brittan\",\"Brittaney\",\"Brittani\",\"Brittany\",\"Britte\",\"Britteny\",\"Brittne\",\"Brittney\",\"Brittni\",\"Brook\",\"Brooke\",\"Brooks\",\"Brunhilda\",\"Brunhilde\",\"Bryana\",\"Bryn\",\"Bryna\",\"Brynn\",\"Brynna\",\"Brynne\",\"Buffy\",\"Bunni\",\"Bunnie\",\"Bunny\",\"Cacilia\",\"Cacilie\",\"Cahra\",\"Cairistiona\",\"Caitlin\",\"Caitrin\",\"Cal\",\"Calida\",\"Calla\",\"Calley\",\"Calli\",\"Callida\",\"Callie\",\"Cally\",\"Calypso\",\"Cam\",\"Camala\",\"Camel\",\"Camella\",\"Camellia\",\"Cami\",\"Camila\",\"Camile\",\"Camilla\",\"Camille\",\"Cammi\",\"Cammie\",\"Cammy\",\"Candace\",\"Candi\",\"Candice\",\"Candida\",\"Candide\",\"Candie\",\"Candis\",\"Candra\",\"Candy\",\"Caprice\",\"Cara\",\"Caralie\",\"Caren\",\"Carena\",\"Caresa\",\"Caressa\",\"Caresse\",\"Carey\",\"Cari\",\"Caria\",\"Carie\",\"Caril\",\"Carilyn\",\"Carin\",\"Carina\",\"Carine\",\"Cariotta\",\"Carissa\",\"Carita\",\"Caritta\",\"Carla\",\"Carlee\",\"Carleen\",\"Carlen\",\"Carlene\",\"Carley\",\"Carlie\",\"Carlin\",\"Carlina\",\"Carline\",\"Carlita\",\"Carlota\",\"Carlotta\",\"Carly\",\"Carlye\",\"Carlyn\",\"Carlynn\",\"Carlynne\",\"Carma\",\"Carmel\",\"Carmela\",\"Carmelia\",\"Carmelina\",\"Carmelita\",\"Carmella\",\"Carmelle\",\"Carmen\",\"Carmencita\",\"Carmina\",\"Carmine\",\"Carmita\",\"Carmon\",\"Caro\",\"Carol\",\"Carol-jean\",\"Carola\",\"Carolan\",\"Carolann\",\"Carole\",\"Carolee\",\"Carolin\",\"Carolina\",\"Caroline\",\"Caroljean\",\"Carolyn\",\"Carolyne\",\"Carolynn\",\"Caron\",\"Carree\",\"Carri\",\"Carrie\",\"Carrissa\",\"Carroll\",\"Carry\",\"Cary\",\"Caryl\",\"Caryn\",\"Casandra\",\"Casey\",\"Casi\",\"Casie\",\"Cass\",\"Cassandra\",\"Cassandre\",\"Cassandry\",\"Cassaundra\",\"Cassey\",\"Cassi\",\"Cassie\",\"Cassondra\",\"Cassy\",\"Catarina\",\"Cate\",\"Caterina\",\"Catha\",\"Catharina\",\"Catharine\",\"Cathe\",\"Cathee\",\"Catherin\",\"Catherina\",\"Catherine\",\"Cathi\",\"Cathie\",\"Cathleen\",\"Cathlene\",\"Cathrin\",\"Cathrine\",\"Cathryn\",\"Cathy\",\"Cathyleen\",\"Cati\",\"Catie\",\"Catina\",\"Catlaina\",\"Catlee\",\"Catlin\",\"Catrina\",\"Catriona\",\"Caty\",\"Caye\",\"Cayla\",\"Cecelia\",\"Cecil\",\"Cecile\",\"Ceciley\",\"Cecilia\",\"Cecilla\",\"Cecily\",\"Ceil\",\"Cele\",\"Celene\",\"Celesta\",\"Celeste\",\"Celestia\",\"Celestina\",\"Celestine\",\"Celestyn\",\"Celestyna\",\"Celia\",\"Celie\",\"Celina\",\"Celinda\",\"Celine\",\"Celinka\",\"Celisse\",\"Celka\",\"Celle\",\"Cesya\",\"Chad\",\"Chanda\",\"Chandal\",\"Chandra\",\"Channa\",\"Chantal\",\"Chantalle\",\"Charil\",\"Charin\",\"Charis\",\"Charissa\",\"Charisse\",\"Charita\",\"Charity\",\"Charla\",\"Charlean\",\"Charleen\",\"Charlena\",\"Charlene\",\"Charline\",\"Charlot\",\"Charlotta\",\"Charlotte\",\"Charmain\",\"Charmaine\",\"Charmane\",\"Charmian\",\"Charmine\",\"Charmion\",\"Charo\",\"Charyl\",\"Chastity\",\"Chelsae\",\"Chelsea\",\"Chelsey\",\"Chelsie\",\"Chelsy\",\"Cher\",\"Chere\",\"Cherey\",\"Cheri\",\"Cherianne\",\"Cherice\",\"Cherida\",\"Cherie\",\"Cherilyn\",\"Cherilynn\",\"Cherin\",\"Cherise\",\"Cherish\",\"Cherlyn\",\"Cherri\",\"Cherrita\",\"Cherry\",\"Chery\",\"Cherye\",\"Cheryl\",\"Cheslie\",\"Chiarra\",\"Chickie\",\"Chicky\",\"Chiquia\",\"Chiquita\",\"Chlo\",\"Chloe\",\"Chloette\",\"Chloris\",\"Chris\",\"Chrissie\",\"Chrissy\",\"Christa\",\"Christabel\",\"Christabella\",\"Christal\",\"Christalle\",\"Christan\",\"Christean\",\"Christel\",\"Christen\",\"Christi\",\"Christian\",\"Christiana\",\"Christiane\",\"Christie\",\"Christin\",\"Christina\",\"Christine\",\"Christy\",\"Christye\",\"Christyna\",\"Chrysa\",\"Chrysler\",\"Chrystal\",\"Chryste\",\"Chrystel\",\"Cicely\",\"Cicily\",\"Ciel\",\"Cilka\",\"Cinda\",\"Cindee\",\"Cindelyn\",\"Cinderella\",\"Cindi\",\"Cindie\",\"Cindra\",\"Cindy\",\"Cinnamon\",\"Cissiee\",\"Cissy\",\"Clair\",\"Claire\",\"Clara\",\"Clarabelle\",\"Clare\",\"Claresta\",\"Clareta\",\"Claretta\",\"Clarette\",\"Clarey\",\"Clari\",\"Claribel\",\"Clarice\",\"Clarie\",\"Clarinda\",\"Clarine\",\"Clarissa\",\"Clarisse\",\"Clarita\",\"Clary\",\"Claude\",\"Claudelle\",\"Claudetta\",\"Claudette\",\"Claudia\",\"Claudie\",\"Claudina\",\"Claudine\",\"Clea\",\"Clem\",\"Clemence\",\"Clementia\",\"Clementina\",\"Clementine\",\"Clemmie\",\"Clemmy\",\"Cleo\",\"Cleopatra\",\"Clerissa\",\"Clio\",\"Clo\",\"Cloe\",\"Cloris\",\"Clotilda\",\"Clovis\",\"Codee\",\"Codi\",\"Codie\",\"Cody\",\"Coleen\",\"Colene\",\"Coletta\",\"Colette\",\"Colleen\",\"Collen\",\"Collete\",\"Collette\",\"Collie\",\"Colline\",\"Colly\",\"Con\",\"Concettina\",\"Conchita\",\"Concordia\",\"Conni\",\"Connie\",\"Conny\",\"Consolata\",\"Constance\",\"Constancia\",\"Constancy\",\"Constanta\",\"Constantia\",\"Constantina\",\"Constantine\",\"Consuela\",\"Consuelo\",\"Cookie\",\"Cora\",\"Corabel\",\"Corabella\",\"Corabelle\",\"Coral\",\"Coralie\",\"Coraline\",\"Coralyn\",\"Cordelia\",\"Cordelie\",\"Cordey\",\"Cordi\",\"Cordie\",\"Cordula\",\"Cordy\",\"Coreen\",\"Corella\",\"Corenda\",\"Corene\",\"Coretta\",\"Corette\",\"Corey\",\"Cori\",\"Corie\",\"Corilla\",\"Corina\",\"Corine\",\"Corinna\",\"Corinne\",\"Coriss\",\"Corissa\",\"Corliss\",\"Corly\",\"Cornela\",\"Cornelia\",\"Cornelle\",\"Cornie\",\"Corny\",\"Correna\",\"Correy\",\"Corri\",\"Corrianne\",\"Corrie\",\"Corrina\",\"Corrine\",\"Corrinne\",\"Corry\",\"Cortney\",\"Cory\",\"Cosetta\",\"Cosette\",\"Costanza\",\"Courtenay\",\"Courtnay\",\"Courtney\",\"Crin\",\"Cris\",\"Crissie\",\"Crissy\",\"Crista\",\"Cristabel\",\"Cristal\",\"Cristen\",\"Cristi\",\"Cristie\",\"Cristin\",\"Cristina\",\"Cristine\",\"Cristionna\",\"Cristy\",\"Crysta\",\"Crystal\",\"Crystie\",\"Cthrine\",\"Cyb\",\"Cybil\",\"Cybill\",\"Cymbre\",\"Cynde\",\"Cyndi\",\"Cyndia\",\"Cyndie\",\"Cyndy\",\"Cynthea\",\"Cynthia\",\"Cynthie\",\"Cynthy\",\"Dacey\",\"Dacia\",\"Dacie\",\"Dacy\",\"Dael\",\"Daffi\",\"Daffie\",\"Daffy\",\"Dagmar\",\"Dahlia\",\"Daile\",\"Daisey\",\"Daisi\",\"Daisie\",\"Daisy\",\"Dale\",\"Dalenna\",\"Dalia\",\"Dalila\",\"Dallas\",\"Daloris\",\"Damara\",\"Damaris\",\"Damita\",\"Dana\",\"Danell\",\"Danella\",\"Danette\",\"Dani\",\"Dania\",\"Danica\",\"Danice\",\"Daniela\",\"Daniele\",\"Daniella\",\"Danielle\",\"Danika\",\"Danila\",\"Danit\",\"Danita\",\"Danna\",\"Danni\",\"Dannie\",\"Danny\",\"Dannye\",\"Danya\",\"Danyelle\",\"Danyette\",\"Daphene\",\"Daphna\",\"Daphne\",\"Dara\",\"Darb\",\"Darbie\",\"Darby\",\"Darcee\",\"Darcey\",\"Darci\",\"Darcie\",\"Darcy\",\"Darda\",\"Dareen\",\"Darell\",\"Darelle\",\"Dari\",\"Daria\",\"Darice\",\"Darla\",\"Darleen\",\"Darlene\",\"Darline\",\"Darlleen\",\"Daron\",\"Darrelle\",\"Darryl\",\"Darsey\",\"Darsie\",\"Darya\",\"Daryl\",\"Daryn\",\"Dasha\",\"Dasi\",\"Dasie\",\"Dasya\",\"Datha\",\"Daune\",\"Daveen\",\"Daveta\",\"Davida\",\"Davina\",\"Davine\",\"Davita\",\"Dawn\",\"Dawna\",\"Dayle\",\"Dayna\",\"Ddene\",\"De\",\"Deana\",\"Deane\",\"Deanna\",\"Deanne\",\"Deb\",\"Debbi\",\"Debbie\",\"Debby\",\"Debee\",\"Debera\",\"Debi\",\"Debor\",\"Debora\",\"Deborah\",\"Debra\",\"Dede\",\"Dedie\",\"Dedra\",\"Dee\",\"Deeann\",\"Deeanne\",\"Deedee\",\"Deena\",\"Deerdre\",\"Deeyn\",\"Dehlia\",\"Deidre\",\"Deina\",\"Deirdre\",\"Del\",\"Dela\",\"Delcina\",\"Delcine\",\"Delia\",\"Delila\",\"Delilah\",\"Delinda\",\"Dell\",\"Della\",\"Delly\",\"Delora\",\"Delores\",\"Deloria\",\"Deloris\",\"Delphine\",\"Delphinia\",\"Demeter\",\"Demetra\",\"Demetria\",\"Demetris\",\"Dena\",\"Deni\",\"Denice\",\"Denise\",\"Denna\",\"Denni\",\"Dennie\",\"Denny\",\"Deny\",\"Denys\",\"Denyse\",\"Deonne\",\"Desdemona\",\"Desirae\",\"Desiree\",\"Desiri\",\"Deva\",\"Devan\",\"Devi\",\"Devin\",\"Devina\",\"Devinne\",\"Devon\",\"Devondra\",\"Devonna\",\"Devonne\",\"Devora\",\"Di\",\"Diahann\",\"Dian\",\"Diana\",\"Diandra\",\"Diane\",\"Diane-marie\",\"Dianemarie\",\"Diann\",\"Dianna\",\"Dianne\",\"Diannne\",\"Didi\",\"Dido\",\"Diena\",\"Dierdre\",\"Dina\",\"Dinah\",\"Dinnie\",\"Dinny\",\"Dion\",\"Dione\",\"Dionis\",\"Dionne\",\"Dita\",\"Dix\",\"Dixie\",\"Dniren\",\"Dode\",\"Dodi\",\"Dodie\",\"Dody\",\"Doe\",\"Doll\",\"Dolley\",\"Dolli\",\"Dollie\",\"Dolly\",\"Dolores\",\"Dolorita\",\"Doloritas\",\"Domeniga\",\"Dominga\",\"Domini\",\"Dominica\",\"Dominique\",\"Dona\",\"Donella\",\"Donelle\",\"Donetta\",\"Donia\",\"Donica\",\"Donielle\",\"Donna\",\"Donnamarie\",\"Donni\",\"Donnie\",\"Donny\",\"Dora\",\"Doralia\",\"Doralin\",\"Doralyn\",\"Doralynn\",\"Doralynne\",\"Dore\",\"Doreen\",\"Dorelia\",\"Dorella\",\"Dorelle\",\"Dorena\",\"Dorene\",\"Doretta\",\"Dorette\",\"Dorey\",\"Dori\",\"Doria\",\"Dorian\",\"Dorice\",\"Dorie\",\"Dorine\",\"Doris\",\"Dorisa\",\"Dorise\",\"Dorita\",\"Doro\",\"Dorolice\",\"Dorolisa\",\"Dorotea\",\"Doroteya\",\"Dorothea\",\"Dorothee\",\"Dorothy\",\"Dorree\",\"Dorri\",\"Dorrie\",\"Dorris\",\"Dorry\",\"Dorthea\",\"Dorthy\",\"Dory\",\"Dosi\",\"Dot\",\"Doti\",\"Dotti\",\"Dottie\",\"Dotty\",\"Dre\",\"Dreddy\",\"Dredi\",\"Drona\",\"Dru\",\"Druci\",\"Drucie\",\"Drucill\",\"Drucy\",\"Drusi\",\"Drusie\",\"Drusilla\",\"Drusy\",\"Dulce\",\"Dulcea\",\"Dulci\",\"Dulcia\",\"Dulciana\",\"Dulcie\",\"Dulcine\",\"Dulcinea\",\"Dulcy\",\"Dulsea\",\"Dusty\",\"Dyan\",\"Dyana\",\"Dyane\",\"Dyann\",\"Dyanna\",\"Dyanne\",\"Dyna\",\"Dynah\",\"Eachelle\",\"Eada\",\"Eadie\",\"Eadith\",\"Ealasaid\",\"Eartha\",\"Easter\",\"Eba\",\"Ebba\",\"Ebonee\",\"Ebony\",\"Eda\",\"Eddi\",\"Eddie\",\"Eddy\",\"Ede\",\"Edee\",\"Edeline\",\"Eden\",\"Edi\",\"Edie\",\"Edin\",\"Edita\",\"Edith\",\"Editha\",\"Edithe\",\"Ediva\",\"Edna\",\"Edwina\",\"Edy\",\"Edyth\",\"Edythe\",\"Effie\",\"Eileen\",\"Eilis\",\"Eimile\",\"Eirena\",\"Ekaterina\",\"Elaina\",\"Elaine\",\"Elana\",\"Elane\",\"Elayne\",\"Elberta\",\"Elbertina\",\"Elbertine\",\"Eleanor\",\"Eleanora\",\"Eleanore\",\"Electra\",\"Eleen\",\"Elena\",\"Elene\",\"Eleni\",\"Elenore\",\"Eleonora\",\"Eleonore\",\"Elfie\",\"Elfreda\",\"Elfrida\",\"Elfrieda\",\"Elga\",\"Elianora\",\"Elianore\",\"Elicia\",\"Elie\",\"Elinor\",\"Elinore\",\"Elisa\",\"Elisabet\",\"Elisabeth\",\"Elisabetta\",\"Elise\",\"Elisha\",\"Elissa\",\"Elita\",\"Eliza\",\"Elizabet\",\"Elizabeth\",\"Elka\",\"Elke\",\"Ella\",\"Elladine\",\"Elle\",\"Ellen\",\"Ellene\",\"Ellette\",\"Elli\",\"Ellie\",\"Ellissa\",\"Elly\",\"Ellyn\",\"Ellynn\",\"Elmira\",\"Elna\",\"Elnora\",\"Elnore\",\"Eloisa\",\"Eloise\",\"Elonore\",\"Elora\",\"Elsa\",\"Elsbeth\",\"Else\",\"Elset\",\"Elsey\",\"Elsi\",\"Elsie\",\"Elsinore\",\"Elspeth\",\"Elsy\",\"Elva\",\"Elvera\",\"Elvina\",\"Elvira\",\"Elwira\",\"Elyn\",\"Elyse\",\"Elysee\",\"Elysha\",\"Elysia\",\"Elyssa\",\"Em\",\"Ema\",\"Emalee\",\"Emalia\",\"Emelda\",\"Emelia\",\"Emelina\",\"Emeline\",\"Emelita\",\"Emelyne\",\"Emera\",\"Emilee\",\"Emili\",\"Emilia\",\"Emilie\",\"Emiline\",\"Emily\",\"Emlyn\",\"Emlynn\",\"Emlynne\",\"Emma\",\"Emmalee\",\"Emmaline\",\"Emmalyn\",\"Emmalynn\",\"Emmalynne\",\"Emmeline\",\"Emmey\",\"Emmi\",\"Emmie\",\"Emmy\",\"Emmye\",\"Emogene\",\"Emyle\",\"Emylee\",\"Engracia\",\"Enid\",\"Enrica\",\"Enrichetta\",\"Enrika\",\"Enriqueta\",\"Eolanda\",\"Eolande\",\"Eran\",\"Erda\",\"Erena\",\"Erica\",\"Ericha\",\"Ericka\",\"Erika\",\"Erin\",\"Erina\",\"Erinn\",\"Erinna\",\"Erma\",\"Ermengarde\",\"Ermentrude\",\"Ermina\",\"Erminia\",\"Erminie\",\"Erna\",\"Ernaline\",\"Ernesta\",\"Ernestine\",\"Ertha\",\"Eryn\",\"Esma\",\"Esmaria\",\"Esme\",\"Esmeralda\",\"Essa\",\"Essie\",\"Essy\",\"Esta\",\"Estel\",\"Estele\",\"Estell\",\"Estella\",\"Estelle\",\"Ester\",\"Esther\",\"Estrella\",\"Estrellita\",\"Ethel\",\"Ethelda\",\"Ethelin\",\"Ethelind\",\"Etheline\",\"Ethelyn\",\"Ethyl\",\"Etta\",\"Etti\",\"Ettie\",\"Etty\",\"Eudora\",\"Eugenia\",\"Eugenie\",\"Eugine\",\"Eula\",\"Eulalie\",\"Eunice\",\"Euphemia\",\"Eustacia\",\"Eva\",\"Evaleen\",\"Evangelia\",\"Evangelin\",\"Evangelina\",\"Evangeline\",\"Evania\",\"Evanne\",\"Eve\",\"Eveleen\",\"Evelina\",\"Eveline\",\"Evelyn\",\"Evey\",\"Evie\",\"Evita\",\"Evonne\",\"Evvie\",\"Evvy\",\"Evy\",\"Eyde\",\"Eydie\",\"Ezmeralda\",\"Fae\",\"Faina\",\"Faith\",\"Fallon\",\"Fan\",\"Fanchette\",\"Fanchon\",\"Fancie\",\"Fancy\",\"Fanechka\",\"Fania\",\"Fanni\",\"Fannie\",\"Fanny\",\"Fanya\",\"Fara\",\"Farah\",\"Farand\",\"Farica\",\"Farra\",\"Farrah\",\"Farrand\",\"Faun\",\"Faunie\",\"Faustina\",\"Faustine\",\"Fawn\",\"Fawne\",\"Fawnia\",\"Fay\",\"Faydra\",\"Faye\",\"Fayette\",\"Fayina\",\"Fayre\",\"Fayth\",\"Faythe\",\"Federica\",\"Fedora\",\"Felecia\",\"Felicdad\",\"Felice\",\"Felicia\",\"Felicity\",\"Felicle\",\"Felipa\",\"Felisha\",\"Felita\",\"Feliza\",\"Fenelia\",\"Feodora\",\"Ferdinanda\",\"Ferdinande\",\"Fern\",\"Fernanda\",\"Fernande\",\"Fernandina\",\"Ferne\",\"Fey\",\"Fiann\",\"Fianna\",\"Fidela\",\"Fidelia\",\"Fidelity\",\"Fifi\",\"Fifine\",\"Filia\",\"Filide\",\"Filippa\",\"Fina\",\"Fiona\",\"Fionna\",\"Fionnula\",\"Fiorenze\",\"Fleur\",\"Fleurette\",\"Flo\",\"Flor\",\"Flora\",\"Florance\",\"Flore\",\"Florella\",\"Florence\",\"Florencia\",\"Florentia\",\"Florenza\",\"Florette\",\"Flori\",\"Floria\",\"Florida\",\"Florie\",\"Florina\",\"Florinda\",\"Floris\",\"Florri\",\"Florrie\",\"Florry\",\"Flory\",\"Flossi\",\"Flossie\",\"Flossy\",\"Flss\",\"Fran\",\"Francene\",\"Frances\",\"Francesca\",\"Francine\",\"Francisca\",\"Franciska\",\"Francoise\",\"Francyne\",\"Frank\",\"Frankie\",\"Franky\",\"Franni\",\"Frannie\",\"Franny\",\"Frayda\",\"Fred\",\"Freda\",\"Freddi\",\"Freddie\",\"Freddy\",\"Fredelia\",\"Frederica\",\"Fredericka\",\"Frederique\",\"Fredi\",\"Fredia\",\"Fredra\",\"Fredrika\",\"Freida\",\"Frieda\",\"Friederike\",\"Fulvia\",\"Gabbey\",\"Gabbi\",\"Gabbie\",\"Gabey\",\"Gabi\",\"Gabie\",\"Gabriel\",\"Gabriela\",\"Gabriell\",\"Gabriella\",\"Gabrielle\",\"Gabriellia\",\"Gabrila\",\"Gaby\",\"Gae\",\"Gael\",\"Gail\",\"Gale\",\"Galina\",\"Garland\",\"Garnet\",\"Garnette\",\"Gates\",\"Gavra\",\"Gavrielle\",\"Gay\",\"Gaye\",\"Gayel\",\"Gayla\",\"Gayle\",\"Gayleen\",\"Gaylene\",\"Gaynor\",\"Gelya\",\"Gena\",\"Gene\",\"Geneva\",\"Genevieve\",\"Genevra\",\"Genia\",\"Genna\",\"Genni\",\"Gennie\",\"Gennifer\",\"Genny\",\"Genovera\",\"Genvieve\",\"George\",\"Georgeanna\",\"Georgeanne\",\"Georgena\",\"Georgeta\",\"Georgetta\",\"Georgette\",\"Georgia\",\"Georgiana\",\"Georgianna\",\"Georgianne\",\"Georgie\",\"Georgina\",\"Georgine\",\"Geralda\",\"Geraldine\",\"Gerda\",\"Gerhardine\",\"Geri\",\"Gerianna\",\"Gerianne\",\"Gerladina\",\"Germain\",\"Germaine\",\"Germana\",\"Gerri\",\"Gerrie\",\"Gerrilee\",\"Gerry\",\"Gert\",\"Gerta\",\"Gerti\",\"Gertie\",\"Gertrud\",\"Gertruda\",\"Gertrude\",\"Gertrudis\",\"Gerty\",\"Giacinta\",\"Giana\",\"Gianina\",\"Gianna\",\"Gigi\",\"Gilberta\",\"Gilberte\",\"Gilbertina\",\"Gilbertine\",\"Gilda\",\"Gilemette\",\"Gill\",\"Gillan\",\"Gilli\",\"Gillian\",\"Gillie\",\"Gilligan\",\"Gilly\",\"Gina\",\"Ginelle\",\"Ginevra\",\"Ginger\",\"Ginni\",\"Ginnie\",\"Ginnifer\",\"Ginny\",\"Giorgia\",\"Giovanna\",\"Gipsy\",\"Giralda\",\"Gisela\",\"Gisele\",\"Gisella\",\"Giselle\",\"Giuditta\",\"Giulia\",\"Giulietta\",\"Giustina\",\"Gizela\",\"Glad\",\"Gladi\",\"Gladys\",\"Gleda\",\"Glen\",\"Glenda\",\"Glenine\",\"Glenn\",\"Glenna\",\"Glennie\",\"Glennis\",\"Glori\",\"Gloria\",\"Gloriana\",\"Gloriane\",\"Glory\",\"Glyn\",\"Glynda\",\"Glynis\",\"Glynnis\",\"Gnni\",\"Godiva\",\"Golda\",\"Goldarina\",\"Goldi\",\"Goldia\",\"Goldie\",\"Goldina\",\"Goldy\",\"Grace\",\"Gracia\",\"Gracie\",\"Grata\",\"Gratia\",\"Gratiana\",\"Gray\",\"Grayce\",\"Grazia\",\"Greer\",\"Greta\",\"Gretal\",\"Gretchen\",\"Grete\",\"Gretel\",\"Grethel\",\"Gretna\",\"Gretta\",\"Grier\",\"Griselda\",\"Grissel\",\"Guendolen\",\"Guenevere\",\"Guenna\",\"Guglielma\",\"Gui\",\"Guillema\",\"Guillemette\",\"Guinevere\",\"Guinna\",\"Gunilla\",\"Gus\",\"Gusella\",\"Gussi\",\"Gussie\",\"Gussy\",\"Gusta\",\"Gusti\",\"Gustie\",\"Gusty\",\"Gwen\",\"Gwendolen\",\"Gwendolin\",\"Gwendolyn\",\"Gweneth\",\"Gwenette\",\"Gwenneth\",\"Gwenni\",\"Gwennie\",\"Gwenny\",\"Gwenora\",\"Gwenore\",\"Gwyn\",\"Gwyneth\",\"Gwynne\",\"Gypsy\",\"Hadria\",\"Hailee\",\"Haily\",\"Haleigh\",\"Halette\",\"Haley\",\"Hali\",\"Halie\",\"Halimeda\",\"Halley\",\"Halli\",\"Hallie\",\"Hally\",\"Hana\",\"Hanna\",\"Hannah\",\"Hanni\",\"Hannie\",\"Hannis\",\"Hanny\",\"Happy\",\"Harlene\",\"Harley\",\"Harli\",\"Harlie\",\"Harmonia\",\"Harmonie\",\"Harmony\",\"Harri\",\"Harrie\",\"Harriet\",\"Harriett\",\"Harrietta\",\"Harriette\",\"Harriot\",\"Harriott\",\"Hatti\",\"Hattie\",\"Hatty\",\"Hayley\",\"Hazel\",\"Heath\",\"Heather\",\"Heda\",\"Hedda\",\"Heddi\",\"Heddie\",\"Hedi\",\"Hedvig\",\"Hedvige\",\"Hedwig\",\"Hedwiga\",\"Hedy\",\"Heida\",\"Heidi\",\"Heidie\",\"Helaina\",\"Helaine\",\"Helen\",\"Helen-elizabeth\",\"Helena\",\"Helene\",\"Helenka\",\"Helga\",\"Helge\",\"Helli\",\"Heloise\",\"Helsa\",\"Helyn\",\"Hendrika\",\"Henka\",\"Henrie\",\"Henrieta\",\"Henrietta\",\"Henriette\",\"Henryetta\",\"Hephzibah\",\"Hermia\",\"Hermina\",\"Hermine\",\"Herminia\",\"Hermione\",\"Herta\",\"Hertha\",\"Hester\",\"Hesther\",\"Hestia\",\"Hetti\",\"Hettie\",\"Hetty\",\"Hilary\",\"Hilda\",\"Hildagard\",\"Hildagarde\",\"Hilde\",\"Hildegaard\",\"Hildegarde\",\"Hildy\",\"Hillary\",\"Hilliary\",\"Hinda\",\"Holli\",\"Hollie\",\"Holly\",\"Holly-anne\",\"Hollyanne\",\"Honey\",\"Honor\",\"Honoria\",\"Hope\",\"Horatia\",\"Hortense\",\"Hortensia\",\"Hulda\",\"Hyacinth\",\"Hyacintha\",\"Hyacinthe\",\"Hyacinthia\",\"Hyacinthie\",\"Hynda\",\"Ianthe\",\"Ibbie\",\"Ibby\",\"Ida\",\"Idalia\",\"Idalina\",\"Idaline\",\"Idell\",\"Idelle\",\"Idette\",\"Ileana\",\"Ileane\",\"Ilene\",\"Ilise\",\"Ilka\",\"Illa\",\"Ilsa\",\"Ilse\",\"Ilysa\",\"Ilyse\",\"Ilyssa\",\"Imelda\",\"Imogen\",\"Imogene\",\"Imojean\",\"Ina\",\"Indira\",\"Ines\",\"Inesita\",\"Inessa\",\"Inez\",\"Inga\",\"Ingaberg\",\"Ingaborg\",\"Inge\",\"Ingeberg\",\"Ingeborg\",\"Inger\",\"Ingrid\",\"Ingunna\",\"Inna\",\"Iolande\",\"Iolanthe\",\"Iona\",\"Iormina\",\"Ira\",\"Irena\",\"Irene\",\"Irina\",\"Iris\",\"Irita\",\"Irma\",\"Isa\",\"Isabel\",\"Isabelita\",\"Isabella\",\"Isabelle\",\"Isadora\",\"Isahella\",\"Iseabal\",\"Isidora\",\"Isis\",\"Isobel\",\"Issi\",\"Issie\",\"Issy\",\"Ivett\",\"Ivette\",\"Ivie\",\"Ivonne\",\"Ivory\",\"Ivy\",\"Izabel\",\"Jacenta\",\"Jacinda\",\"Jacinta\",\"Jacintha\",\"Jacinthe\",\"Jackelyn\",\"Jacki\",\"Jackie\",\"Jacklin\",\"Jacklyn\",\"Jackquelin\",\"Jackqueline\",\"Jacky\",\"Jaclin\",\"Jaclyn\",\"Jacquelin\",\"Jacqueline\",\"Jacquelyn\",\"Jacquelynn\",\"Jacquenetta\",\"Jacquenette\",\"Jacquetta\",\"Jacquette\",\"Jacqui\",\"Jacquie\",\"Jacynth\",\"Jada\",\"Jade\",\"Jaime\",\"Jaimie\",\"Jaine\",\"Jami\",\"Jamie\",\"Jamima\",\"Jammie\",\"Jan\",\"Jana\",\"Janaya\",\"Janaye\",\"Jandy\",\"Jane\",\"Janean\",\"Janeczka\",\"Janeen\",\"Janel\",\"Janela\",\"Janella\",\"Janelle\",\"Janene\",\"Janenna\",\"Janessa\",\"Janet\",\"Janeta\",\"Janetta\",\"Janette\",\"Janeva\",\"Janey\",\"Jania\",\"Janice\",\"Janie\",\"Janifer\",\"Janina\",\"Janine\",\"Janis\",\"Janith\",\"Janka\",\"Janna\",\"Jannel\",\"Jannelle\",\"Janot\",\"Jany\",\"Jaquelin\",\"Jaquelyn\",\"Jaquenetta\",\"Jaquenette\",\"Jaquith\",\"Jasmin\",\"Jasmina\",\"Jasmine\",\"Jayme\",\"Jaymee\",\"Jayne\",\"Jaynell\",\"Jazmin\",\"Jean\",\"Jeana\",\"Jeane\",\"Jeanelle\",\"Jeanette\",\"Jeanie\",\"Jeanine\",\"Jeanna\",\"Jeanne\",\"Jeannette\",\"Jeannie\",\"Jeannine\",\"Jehanna\",\"Jelene\",\"Jemie\",\"Jemima\",\"Jemimah\",\"Jemmie\",\"Jemmy\",\"Jen\",\"Jena\",\"Jenda\",\"Jenelle\",\"Jeni\",\"Jenica\",\"Jeniece\",\"Jenifer\",\"Jeniffer\",\"Jenilee\",\"Jenine\",\"Jenn\",\"Jenna\",\"Jennee\",\"Jennette\",\"Jenni\",\"Jennica\",\"Jennie\",\"Jennifer\",\"Jennilee\",\"Jennine\",\"Jenny\",\"Jeralee\",\"Jere\",\"Jeri\",\"Jermaine\",\"Jerrie\",\"Jerrilee\",\"Jerrilyn\",\"Jerrine\",\"Jerry\",\"Jerrylee\",\"Jess\",\"Jessa\",\"Jessalin\",\"Jessalyn\",\"Jessamine\",\"Jessamyn\",\"Jesse\",\"Jesselyn\",\"Jessi\",\"Jessica\",\"Jessie\",\"Jessika\",\"Jessy\",\"Jewel\",\"Jewell\",\"Jewelle\",\"Jill\",\"Jillana\",\"Jillane\",\"Jillayne\",\"Jilleen\",\"Jillene\",\"Jilli\",\"Jillian\",\"Jillie\",\"Jilly\",\"Jinny\",\"Jo\",\"Jo-ann\",\"Jo-anne\",\"Joan\",\"Joana\",\"Joane\",\"Joanie\",\"Joann\",\"Joanna\",\"Joanne\",\"Joannes\",\"Jobey\",\"Jobi\",\"Jobie\",\"Jobina\",\"Joby\",\"Jobye\",\"Jobyna\",\"Jocelin\",\"Joceline\",\"Jocelyn\",\"Jocelyne\",\"Jodee\",\"Jodi\",\"Jodie\",\"Jody\",\"Joeann\",\"Joela\",\"Joelie\",\"Joell\",\"Joella\",\"Joelle\",\"Joellen\",\"Joelly\",\"Joellyn\",\"Joelynn\",\"Joete\",\"Joey\",\"Johanna\",\"Johannah\",\"Johna\",\"Johnath\",\"Johnette\",\"Johnna\",\"Joice\",\"Jojo\",\"Jolee\",\"Joleen\",\"Jolene\",\"Joletta\",\"Joli\",\"Jolie\",\"Joline\",\"Joly\",\"Jolyn\",\"Jolynn\",\"Jonell\",\"Joni\",\"Jonie\",\"Jonis\",\"Jordain\",\"Jordan\",\"Jordana\",\"Jordanna\",\"Jorey\",\"Jori\",\"Jorie\",\"Jorrie\",\"Jorry\",\"Joscelin\",\"Josee\",\"Josefa\",\"Josefina\",\"Josepha\",\"Josephina\",\"Josephine\",\"Josey\",\"Josi\",\"Josie\",\"Josselyn\",\"Josy\",\"Jourdan\",\"Joy\",\"Joya\",\"Joyan\",\"Joyann\",\"Joyce\",\"Joycelin\",\"Joye\",\"Jsandye\",\"Juana\",\"Juanita\",\"Judi\",\"Judie\",\"Judith\",\"Juditha\",\"Judy\",\"Judye\",\"Juieta\",\"Julee\",\"Juli\",\"Julia\",\"Juliana\",\"Juliane\",\"Juliann\",\"Julianna\",\"Julianne\",\"Julie\",\"Julienne\",\"Juliet\",\"Julieta\",\"Julietta\",\"Juliette\",\"Julina\",\"Juline\",\"Julissa\",\"Julita\",\"June\",\"Junette\",\"Junia\",\"Junie\",\"Junina\",\"Justina\",\"Justine\",\"Justinn\",\"Jyoti\",\"Kacey\",\"Kacie\",\"Kacy\",\"Kaela\",\"Kai\",\"Kaia\",\"Kaila\",\"Kaile\",\"Kailey\",\"Kaitlin\",\"Kaitlyn\",\"Kaitlynn\",\"Kaja\",\"Kakalina\",\"Kala\",\"Kaleena\",\"Kali\",\"Kalie\",\"Kalila\",\"Kalina\",\"Kalinda\",\"Kalindi\",\"Kalli\",\"Kally\",\"Kameko\",\"Kamila\",\"Kamilah\",\"Kamillah\",\"Kandace\",\"Kandy\",\"Kania\",\"Kanya\",\"Kara\",\"Kara-lynn\",\"Karalee\",\"Karalynn\",\"Kare\",\"Karee\",\"Karel\",\"Karen\",\"Karena\",\"Kari\",\"Karia\",\"Karie\",\"Karil\",\"Karilynn\",\"Karin\",\"Karina\",\"Karine\",\"Kariotta\",\"Karisa\",\"Karissa\",\"Karita\",\"Karla\",\"Karlee\",\"Karleen\",\"Karlen\",\"Karlene\",\"Karlie\",\"Karlotta\",\"Karlotte\",\"Karly\",\"Karlyn\",\"Karmen\",\"Karna\",\"Karol\",\"Karola\",\"Karole\",\"Karolina\",\"Karoline\",\"Karoly\",\"Karon\",\"Karrah\",\"Karrie\",\"Karry\",\"Kary\",\"Karyl\",\"Karylin\",\"Karyn\",\"Kasey\",\"Kass\",\"Kassandra\",\"Kassey\",\"Kassi\",\"Kassia\",\"Kassie\",\"Kat\",\"Kata\",\"Katalin\",\"Kate\",\"Katee\",\"Katerina\",\"Katerine\",\"Katey\",\"Kath\",\"Katha\",\"Katharina\",\"Katharine\",\"Katharyn\",\"Kathe\",\"Katherina\",\"Katherine\",\"Katheryn\",\"Kathi\",\"Kathie\",\"Kathleen\",\"Kathlin\",\"Kathrine\",\"Kathryn\",\"Kathryne\",\"Kathy\",\"Kathye\",\"Kati\",\"Katie\",\"Katina\",\"Katine\",\"Katinka\",\"Katleen\",\"Katlin\",\"Katrina\",\"Katrine\",\"Katrinka\",\"Katti\",\"Kattie\",\"Katuscha\",\"Katusha\",\"Katy\",\"Katya\",\"Kay\",\"Kaycee\",\"Kaye\",\"Kayla\",\"Kayle\",\"Kaylee\",\"Kayley\",\"Kaylil\",\"Kaylyn\",\"Keeley\",\"Keelia\",\"Keely\",\"Kelcey\",\"Kelci\",\"Kelcie\",\"Kelcy\",\"Kelila\",\"Kellen\",\"Kelley\",\"Kelli\",\"Kellia\",\"Kellie\",\"Kellina\",\"Kellsie\",\"Kelly\",\"Kellyann\",\"Kelsey\",\"Kelsi\",\"Kelsy\",\"Kendra\",\"Kendre\",\"Kenna\",\"Keri\",\"Keriann\",\"Kerianne\",\"Kerri\",\"Kerrie\",\"Kerrill\",\"Kerrin\",\"Kerry\",\"Kerstin\",\"Kesley\",\"Keslie\",\"Kessia\",\"Kessiah\",\"Ketti\",\"Kettie\",\"Ketty\",\"Kevina\",\"Kevyn\",\"Ki\",\"Kiah\",\"Kial\",\"Kiele\",\"Kiersten\",\"Kikelia\",\"Kiley\",\"Kim\",\"Kimberlee\",\"Kimberley\",\"Kimberli\",\"Kimberly\",\"Kimberlyn\",\"Kimbra\",\"Kimmi\",\"Kimmie\",\"Kimmy\",\"Kinna\",\"Kip\",\"Kipp\",\"Kippie\",\"Kippy\",\"Kira\",\"Kirbee\",\"Kirbie\",\"Kirby\",\"Kiri\",\"Kirsten\",\"Kirsteni\",\"Kirsti\",\"Kirstin\",\"Kirstyn\",\"Kissee\",\"Kissiah\",\"Kissie\",\"Kit\",\"Kitti\",\"Kittie\",\"Kitty\",\"Kizzee\",\"Kizzie\",\"Klara\",\"Klarika\",\"Klarrisa\",\"Konstance\",\"Konstanze\",\"Koo\",\"Kora\",\"Koral\",\"Koralle\",\"Kordula\",\"Kore\",\"Korella\",\"Koren\",\"Koressa\",\"Kori\",\"Korie\",\"Korney\",\"Korrie\",\"Korry\",\"Kris\",\"Krissie\",\"Krissy\",\"Krista\",\"Kristal\",\"Kristan\",\"Kriste\",\"Kristel\",\"Kristen\",\"Kristi\",\"Kristien\",\"Kristin\",\"Kristina\",\"Kristine\",\"Kristy\",\"Kristyn\",\"Krysta\",\"Krystal\",\"Krystalle\",\"Krystle\",\"Krystyna\",\"Kyla\",\"Kyle\",\"Kylen\",\"Kylie\",\"Kylila\",\"Kylynn\",\"Kym\",\"Kynthia\",\"Kyrstin\",\"Lacee\",\"Lacey\",\"Lacie\",\"Lacy\",\"Ladonna\",\"Laetitia\",\"Laina\",\"Lainey\",\"Lana\",\"Lanae\",\"Lane\",\"Lanette\",\"Laney\",\"Lani\",\"Lanie\",\"Lanita\",\"Lanna\",\"Lanni\",\"Lanny\",\"Lara\",\"Laraine\",\"Lari\",\"Larina\",\"Larine\",\"Larisa\",\"Larissa\",\"Lark\",\"Laryssa\",\"Latashia\",\"Latia\",\"Latisha\",\"Latrena\",\"Latrina\",\"Laura\",\"Lauraine\",\"Laural\",\"Lauralee\",\"Laure\",\"Lauree\",\"Laureen\",\"Laurel\",\"Laurella\",\"Lauren\",\"Laurena\",\"Laurene\",\"Lauretta\",\"Laurette\",\"Lauri\",\"Laurianne\",\"Laurice\",\"Laurie\",\"Lauryn\",\"Lavena\",\"Laverna\",\"Laverne\",\"Lavina\",\"Lavinia\",\"Lavinie\",\"Layla\",\"Layne\",\"Layney\",\"Lea\",\"Leah\",\"Leandra\",\"Leann\",\"Leanna\",\"Leanor\",\"Leanora\",\"Lebbie\",\"Leda\",\"Lee\",\"Leeann\",\"Leeanne\",\"Leela\",\"Leelah\",\"Leena\",\"Leesa\",\"Leese\",\"Legra\",\"Leia\",\"Leigh\",\"Leigha\",\"Leila\",\"Leilah\",\"Leisha\",\"Lela\",\"Lelah\",\"Leland\",\"Lelia\",\"Lena\",\"Lenee\",\"Lenette\",\"Lenka\",\"Lenna\",\"Lenora\",\"Lenore\",\"Leodora\",\"Leoine\",\"Leola\",\"Leoline\",\"Leona\",\"Leonanie\",\"Leone\",\"Leonelle\",\"Leonie\",\"Leonora\",\"Leonore\",\"Leontine\",\"Leontyne\",\"Leora\",\"Leshia\",\"Lesley\",\"Lesli\",\"Leslie\",\"Lesly\",\"Lesya\",\"Leta\",\"Lethia\",\"Leticia\",\"Letisha\",\"Letitia\",\"Letizia\",\"Letta\",\"Letti\",\"Lettie\",\"Letty\",\"Lexi\",\"Lexie\",\"Lexine\",\"Lexis\",\"Lexy\",\"Leyla\",\"Lezlie\",\"Lia\",\"Lian\",\"Liana\",\"Liane\",\"Lianna\",\"Lianne\",\"Lib\",\"Libbey\",\"Libbi\",\"Libbie\",\"Libby\",\"Licha\",\"Lida\",\"Lidia\",\"Liesa\",\"Lil\",\"Lila\",\"Lilah\",\"Lilas\",\"Lilia\",\"Lilian\",\"Liliane\",\"Lilias\",\"Lilith\",\"Lilla\",\"Lilli\",\"Lillian\",\"Lillis\",\"Lilllie\",\"Lilly\",\"Lily\",\"Lilyan\",\"Lin\",\"Lina\",\"Lind\",\"Linda\",\"Lindi\",\"Lindie\",\"Lindsay\",\"Lindsey\",\"Lindsy\",\"Lindy\",\"Linea\",\"Linell\",\"Linet\",\"Linette\",\"Linn\",\"Linnea\",\"Linnell\",\"Linnet\",\"Linnie\",\"Linzy\",\"Lira\",\"Lisa\",\"Lisabeth\",\"Lisbeth\",\"Lise\",\"Lisetta\",\"Lisette\",\"Lisha\",\"Lishe\",\"Lissa\",\"Lissi\",\"Lissie\",\"Lissy\",\"Lita\",\"Liuka\",\"Liv\",\"Liva\",\"Livia\",\"Livvie\",\"Livvy\",\"Livvyy\",\"Livy\",\"Liz\",\"Liza\",\"Lizabeth\",\"Lizbeth\",\"Lizette\",\"Lizzie\",\"Lizzy\",\"Loella\",\"Lois\",\"Loise\",\"Lola\",\"Loleta\",\"Lolita\",\"Lolly\",\"Lona\",\"Lonee\",\"Loni\",\"Lonna\",\"Lonni\",\"Lonnie\",\"Lora\",\"Lorain\",\"Loraine\",\"Loralee\",\"Loralie\",\"Loralyn\",\"Loree\",\"Loreen\",\"Lorelei\",\"Lorelle\",\"Loren\",\"Lorena\",\"Lorene\",\"Lorenza\",\"Loretta\",\"Lorette\",\"Lori\",\"Loria\",\"Lorianna\",\"Lorianne\",\"Lorie\",\"Lorilee\",\"Lorilyn\",\"Lorinda\",\"Lorine\",\"Lorita\",\"Lorna\",\"Lorne\",\"Lorraine\",\"Lorrayne\",\"Lorri\",\"Lorrie\",\"Lorrin\",\"Lorry\",\"Lory\",\"Lotta\",\"Lotte\",\"Lotti\",\"Lottie\",\"Lotty\",\"Lou\",\"Louella\",\"Louisa\",\"Louise\",\"Louisette\",\"Loutitia\",\"Lu\",\"Luce\",\"Luci\",\"Lucia\",\"Luciana\",\"Lucie\",\"Lucienne\",\"Lucila\",\"Lucilia\",\"Lucille\",\"Lucina\",\"Lucinda\",\"Lucine\",\"Lucita\",\"Lucky\",\"Lucretia\",\"Lucy\",\"Ludovika\",\"Luella\",\"Luelle\",\"Luisa\",\"Luise\",\"Lula\",\"Lulita\",\"Lulu\",\"Lura\",\"Lurette\",\"Lurleen\",\"Lurlene\",\"Lurline\",\"Lusa\",\"Luz\",\"Lyda\",\"Lydia\",\"Lydie\",\"Lyn\",\"Lynda\",\"Lynde\",\"Lyndel\",\"Lyndell\",\"Lyndsay\",\"Lyndsey\",\"Lyndsie\",\"Lyndy\",\"Lynea\",\"Lynelle\",\"Lynett\",\"Lynette\",\"Lynn\",\"Lynna\",\"Lynne\",\"Lynnea\",\"Lynnell\",\"Lynnelle\",\"Lynnet\",\"Lynnett\",\"Lynnette\",\"Lynsey\",\"Lyssa\",\"Mab\",\"Mabel\",\"Mabelle\",\"Mable\",\"Mada\",\"Madalena\",\"Madalyn\",\"Maddalena\",\"Maddi\",\"Maddie\",\"Maddy\",\"Madel\",\"Madelaine\",\"Madeleine\",\"Madelena\",\"Madelene\",\"Madelin\",\"Madelina\",\"Madeline\",\"Madella\",\"Madelle\",\"Madelon\",\"Madelyn\",\"Madge\",\"Madlen\",\"Madlin\",\"Madonna\",\"Mady\",\"Mae\",\"Maegan\",\"Mag\",\"Magda\",\"Magdaia\",\"Magdalen\",\"Magdalena\",\"Magdalene\",\"Maggee\",\"Maggi\",\"Maggie\",\"Maggy\",\"Mahala\",\"Mahalia\",\"Maia\",\"Maible\",\"Maiga\",\"Maighdiln\",\"Mair\",\"Maire\",\"Maisey\",\"Maisie\",\"Maitilde\",\"Mala\",\"Malanie\",\"Malena\",\"Malia\",\"Malina\",\"Malinda\",\"Malinde\",\"Malissa\",\"Malissia\",\"Mallissa\",\"Mallorie\",\"Mallory\",\"Malorie\",\"Malory\",\"Malva\",\"Malvina\",\"Malynda\",\"Mame\",\"Mamie\",\"Manda\",\"Mandi\",\"Mandie\",\"Mandy\",\"Manon\",\"Manya\",\"Mara\",\"Marabel\",\"Marcela\",\"Marcelia\",\"Marcella\",\"Marcelle\",\"Marcellina\",\"Marcelline\",\"Marchelle\",\"Marci\",\"Marcia\",\"Marcie\",\"Marcile\",\"Marcille\",\"Marcy\",\"Mareah\",\"Maren\",\"Marena\",\"Maressa\",\"Marga\",\"Margalit\",\"Margalo\",\"Margaret\",\"Margareta\",\"Margarete\",\"Margaretha\",\"Margarethe\",\"Margaretta\",\"Margarette\",\"Margarita\",\"Margaux\",\"Marge\",\"Margeaux\",\"Margery\",\"Marget\",\"Margette\",\"Margi\",\"Margie\",\"Margit\",\"Margo\",\"Margot\",\"Margret\",\"Marguerite\",\"Margy\",\"Mari\",\"Maria\",\"Mariam\",\"Marian\",\"Mariana\",\"Mariann\",\"Marianna\",\"Marianne\",\"Maribel\",\"Maribelle\",\"Maribeth\",\"Marice\",\"Maridel\",\"Marie\",\"Marie-ann\",\"Marie-jeanne\",\"Marieann\",\"Mariejeanne\",\"Mariel\",\"Mariele\",\"Marielle\",\"Mariellen\",\"Marietta\",\"Mariette\",\"Marigold\",\"Marijo\",\"Marika\",\"Marilee\",\"Marilin\",\"Marillin\",\"Marilyn\",\"Marin\",\"Marina\",\"Marinna\",\"Marion\",\"Mariquilla\",\"Maris\",\"Marisa\",\"Mariska\",\"Marissa\",\"Marita\",\"Maritsa\",\"Mariya\",\"Marj\",\"Marja\",\"Marje\",\"Marji\",\"Marjie\",\"Marjorie\",\"Marjory\",\"Marjy\",\"Marketa\",\"Marla\",\"Marlane\",\"Marleah\",\"Marlee\",\"Marleen\",\"Marlena\",\"Marlene\",\"Marley\",\"Marlie\",\"Marline\",\"Marlo\",\"Marlyn\",\"Marna\",\"Marne\",\"Marney\",\"Marni\",\"Marnia\",\"Marnie\",\"Marquita\",\"Marrilee\",\"Marris\",\"Marrissa\",\"Marsha\",\"Marsiella\",\"Marta\",\"Martelle\",\"Martguerita\",\"Martha\",\"Marthe\",\"Marthena\",\"Marti\",\"Martica\",\"Martie\",\"Martina\",\"Martita\",\"Marty\",\"Martynne\",\"Mary\",\"Marya\",\"Maryann\",\"Maryanna\",\"Maryanne\",\"Marybelle\",\"Marybeth\",\"Maryellen\",\"Maryjane\",\"Maryjo\",\"Maryl\",\"Marylee\",\"Marylin\",\"Marylinda\",\"Marylou\",\"Marylynne\",\"Maryrose\",\"Marys\",\"Marysa\",\"Masha\",\"Matelda\",\"Mathilda\",\"Mathilde\",\"Matilda\",\"Matilde\",\"Matti\",\"Mattie\",\"Matty\",\"Maud\",\"Maude\",\"Maudie\",\"Maura\",\"Maure\",\"Maureen\",\"Maureene\",\"Maurene\",\"Maurine\",\"Maurise\",\"Maurita\",\"Maurizia\",\"Mavis\",\"Mavra\",\"Max\",\"Maxi\",\"Maxie\",\"Maxine\",\"Maxy\",\"May\",\"Maybelle\",\"Maye\",\"Mead\",\"Meade\",\"Meagan\",\"Meaghan\",\"Meara\",\"Mechelle\",\"Meg\",\"Megan\",\"Megen\",\"Meggi\",\"Meggie\",\"Meggy\",\"Meghan\",\"Meghann\",\"Mehetabel\",\"Mei\",\"Mel\",\"Mela\",\"Melamie\",\"Melania\",\"Melanie\",\"Melantha\",\"Melany\",\"Melba\",\"Melesa\",\"Melessa\",\"Melicent\",\"Melina\",\"Melinda\",\"Melinde\",\"Melisa\",\"Melisande\",\"Melisandra\",\"Melisenda\",\"Melisent\",\"Melissa\",\"Melisse\",\"Melita\",\"Melitta\",\"Mella\",\"Melli\",\"Mellicent\",\"Mellie\",\"Mellisa\",\"Mellisent\",\"Melloney\",\"Melly\",\"Melodee\",\"Melodie\",\"Melody\",\"Melonie\",\"Melony\",\"Melosa\",\"Melva\",\"Mercedes\",\"Merci\",\"Mercie\",\"Mercy\",\"Meredith\",\"Meredithe\",\"Meridel\",\"Meridith\",\"Meriel\",\"Merilee\",\"Merilyn\",\"Meris\",\"Merissa\",\"Merl\",\"Merla\",\"Merle\",\"Merlina\",\"Merline\",\"Merna\",\"Merola\",\"Merralee\",\"Merridie\",\"Merrie\",\"Merrielle\",\"Merrile\",\"Merrilee\",\"Merrili\",\"Merrill\",\"Merrily\",\"Merry\",\"Mersey\",\"Meryl\",\"Meta\",\"Mia\",\"Micaela\",\"Michaela\",\"Michaelina\",\"Michaeline\",\"Michaella\",\"Michal\",\"Michel\",\"Michele\",\"Michelina\",\"Micheline\",\"Michell\",\"Michelle\",\"Micki\",\"Mickie\",\"Micky\",\"Midge\",\"Mignon\",\"Mignonne\",\"Miguela\",\"Miguelita\",\"Mikaela\",\"Mil\",\"Mildred\",\"Mildrid\",\"Milena\",\"Milicent\",\"Milissent\",\"Milka\",\"Milli\",\"Millicent\",\"Millie\",\"Millisent\",\"Milly\",\"Milzie\",\"Mimi\",\"Min\",\"Mina\",\"Minda\",\"Mindy\",\"Minerva\",\"Minetta\",\"Minette\",\"Minna\",\"Minnaminnie\",\"Minne\",\"Minni\",\"Minnie\",\"Minnnie\",\"Minny\",\"Minta\",\"Miquela\",\"Mira\",\"Mirabel\",\"Mirabella\",\"Mirabelle\",\"Miran\",\"Miranda\",\"Mireielle\",\"Mireille\",\"Mirella\",\"Mirelle\",\"Miriam\",\"Mirilla\",\"Mirna\",\"Misha\",\"Missie\",\"Missy\",\"Misti\",\"Misty\",\"Mitzi\",\"Modesta\",\"Modestia\",\"Modestine\",\"Modesty\",\"Moina\",\"Moira\",\"Moll\",\"Mollee\",\"Molli\",\"Mollie\",\"Molly\",\"Mommy\",\"Mona\",\"Monah\",\"Monica\",\"Monika\",\"Monique\",\"Mora\",\"Moreen\",\"Morena\",\"Morgan\",\"Morgana\",\"Morganica\",\"Morganne\",\"Morgen\",\"Moria\",\"Morissa\",\"Morna\",\"Moselle\",\"Moyna\",\"Moyra\",\"Mozelle\",\"Muffin\",\"Mufi\",\"Mufinella\",\"Muire\",\"Mureil\",\"Murial\",\"Muriel\",\"Murielle\",\"Myra\",\"Myrah\",\"Myranda\",\"Myriam\",\"Myrilla\",\"Myrle\",\"Myrlene\",\"Myrna\",\"Myrta\",\"Myrtia\",\"Myrtice\",\"Myrtie\",\"Myrtle\",\"Nada\",\"Nadean\",\"Nadeen\",\"Nadia\",\"Nadine\",\"Nadiya\",\"Nady\",\"Nadya\",\"Nalani\",\"Nan\",\"Nana\",\"Nananne\",\"Nance\",\"Nancee\",\"Nancey\",\"Nanci\",\"Nancie\",\"Nancy\",\"Nanete\",\"Nanette\",\"Nani\",\"Nanice\",\"Nanine\",\"Nannette\",\"Nanni\",\"Nannie\",\"Nanny\",\"Nanon\",\"Naoma\",\"Naomi\",\"Nara\",\"Nari\",\"Nariko\",\"Nat\",\"Nata\",\"Natala\",\"Natalee\",\"Natalie\",\"Natalina\",\"Nataline\",\"Natalya\",\"Natasha\",\"Natassia\",\"Nathalia\",\"Nathalie\",\"Natividad\",\"Natka\",\"Natty\",\"Neala\",\"Neda\",\"Nedda\",\"Nedi\",\"Neely\",\"Neila\",\"Neile\",\"Neilla\",\"Neille\",\"Nelia\",\"Nelie\",\"Nell\",\"Nelle\",\"Nelli\",\"Nellie\",\"Nelly\",\"Nerissa\",\"Nerita\",\"Nert\",\"Nerta\",\"Nerte\",\"Nerti\",\"Nertie\",\"Nerty\",\"Nessa\",\"Nessi\",\"Nessie\",\"Nessy\",\"Nesta\",\"Netta\",\"Netti\",\"Nettie\",\"Nettle\",\"Netty\",\"Nevsa\",\"Neysa\",\"Nichol\",\"Nichole\",\"Nicholle\",\"Nicki\",\"Nickie\",\"Nicky\",\"Nicol\",\"Nicola\",\"Nicole\",\"Nicolea\",\"Nicolette\",\"Nicoli\",\"Nicolina\",\"Nicoline\",\"Nicolle\",\"Nikaniki\",\"Nike\",\"Niki\",\"Nikki\",\"Nikkie\",\"Nikoletta\",\"Nikolia\",\"Nina\",\"Ninetta\",\"Ninette\",\"Ninnetta\",\"Ninnette\",\"Ninon\",\"Nissa\",\"Nisse\",\"Nissie\",\"Nissy\",\"Nita\",\"Nixie\",\"Noami\",\"Noel\",\"Noelani\",\"Noell\",\"Noella\",\"Noelle\",\"Noellyn\",\"Noelyn\",\"Noemi\",\"Nola\",\"Nolana\",\"Nolie\",\"Nollie\",\"Nomi\",\"Nona\",\"Nonah\",\"Noni\",\"Nonie\",\"Nonna\",\"Nonnah\",\"Nora\",\"Norah\",\"Norean\",\"Noreen\",\"Norene\",\"Norina\",\"Norine\",\"Norma\",\"Norri\",\"Norrie\",\"Norry\",\"Novelia\",\"Nydia\",\"Nyssa\",\"Octavia\",\"Odele\",\"Odelia\",\"Odelinda\",\"Odella\",\"Odelle\",\"Odessa\",\"Odetta\",\"Odette\",\"Odilia\",\"Odille\",\"Ofelia\",\"Ofella\",\"Ofilia\",\"Ola\",\"Olenka\",\"Olga\",\"Olia\",\"Olimpia\",\"Olive\",\"Olivette\",\"Olivia\",\"Olivie\",\"Oliy\",\"Ollie\",\"Olly\",\"Olva\",\"Olwen\",\"Olympe\",\"Olympia\",\"Olympie\",\"Ondrea\",\"Oneida\",\"Onida\",\"Oona\",\"Opal\",\"Opalina\",\"Opaline\",\"Ophelia\",\"Ophelie\",\"Ora\",\"Oralee\",\"Oralia\",\"Oralie\",\"Oralla\",\"Oralle\",\"Orel\",\"Orelee\",\"Orelia\",\"Orelie\",\"Orella\",\"Orelle\",\"Oriana\",\"Orly\",\"Orsa\",\"Orsola\",\"Ortensia\",\"Otha\",\"Othelia\",\"Othella\",\"Othilia\",\"Othilie\",\"Ottilie\",\"Page\",\"Paige\",\"Paloma\",\"Pam\",\"Pamela\",\"Pamelina\",\"Pamella\",\"Pammi\",\"Pammie\",\"Pammy\",\"Pandora\",\"Pansie\",\"Pansy\",\"Paola\",\"Paolina\",\"Papagena\",\"Pat\",\"Patience\",\"Patrica\",\"Patrice\",\"Patricia\",\"Patrizia\",\"Patsy\",\"Patti\",\"Pattie\",\"Patty\",\"Paula\",\"Paule\",\"Pauletta\",\"Paulette\",\"Pauli\",\"Paulie\",\"Paulina\",\"Pauline\",\"Paulita\",\"Pauly\",\"Pavia\",\"Pavla\",\"Pearl\",\"Pearla\",\"Pearle\",\"Pearline\",\"Peg\",\"Pegeen\",\"Peggi\",\"Peggie\",\"Peggy\",\"Pen\",\"Penelopa\",\"Penelope\",\"Penni\",\"Pennie\",\"Penny\",\"Pepi\",\"Pepita\",\"Peri\",\"Peria\",\"Perl\",\"Perla\",\"Perle\",\"Perri\",\"Perrine\",\"Perry\",\"Persis\",\"Pet\",\"Peta\",\"Petra\",\"Petrina\",\"Petronella\",\"Petronia\",\"Petronilla\",\"Petronille\",\"Petunia\",\"Phaedra\",\"Phaidra\",\"Phebe\",\"Phedra\",\"Phelia\",\"Phil\",\"Philipa\",\"Philippa\",\"Philippe\",\"Philippine\",\"Philis\",\"Phillida\",\"Phillie\",\"Phillis\",\"Philly\",\"Philomena\",\"Phoebe\",\"Phylis\",\"Phyllida\",\"Phyllis\",\"Phyllys\",\"Phylys\",\"Pia\",\"Pier\",\"Pierette\",\"Pierrette\",\"Pietra\",\"Piper\",\"Pippa\",\"Pippy\",\"Polly\",\"Pollyanna\",\"Pooh\",\"Poppy\",\"Portia\",\"Pris\",\"Prisca\",\"Priscella\",\"Priscilla\",\"Prissie\",\"Pru\",\"Prudence\",\"Prudi\",\"Prudy\",\"Prue\",\"Queenie\",\"Quentin\",\"Querida\",\"Quinn\",\"Quinta\",\"Quintana\",\"Quintilla\",\"Quintina\",\"Rachael\",\"Rachel\",\"Rachele\",\"Rachelle\",\"Rae\",\"Raeann\",\"Raf\",\"Rafa\",\"Rafaela\",\"Rafaelia\",\"Rafaelita\",\"Rahal\",\"Rahel\",\"Raina\",\"Raine\",\"Rakel\",\"Ralina\",\"Ramona\",\"Ramonda\",\"Rana\",\"Randa\",\"Randee\",\"Randene\",\"Randi\",\"Randie\",\"Randy\",\"Ranee\",\"Rani\",\"Rania\",\"Ranice\",\"Ranique\",\"Ranna\",\"Raphaela\",\"Raquel\",\"Raquela\",\"Rasia\",\"Rasla\",\"Raven\",\"Ray\",\"Raychel\",\"Raye\",\"Rayna\",\"Raynell\",\"Rayshell\",\"Rea\",\"Reba\",\"Rebbecca\",\"Rebe\",\"Rebeca\",\"Rebecca\",\"Rebecka\",\"Rebeka\",\"Rebekah\",\"Rebekkah\",\"Ree\",\"Reeba\",\"Reena\",\"Reeta\",\"Reeva\",\"Regan\",\"Reggi\",\"Reggie\",\"Regina\",\"Regine\",\"Reiko\",\"Reina\",\"Reine\",\"Remy\",\"Rena\",\"Renae\",\"Renata\",\"Renate\",\"Rene\",\"Renee\",\"Renell\",\"Renelle\",\"Renie\",\"Rennie\",\"Reta\",\"Retha\",\"Revkah\",\"Rey\",\"Reyna\",\"Rhea\",\"Rheba\",\"Rheta\",\"Rhetta\",\"Rhiamon\",\"Rhianna\",\"Rhianon\",\"Rhoda\",\"Rhodia\",\"Rhodie\",\"Rhody\",\"Rhona\",\"Rhonda\",\"Riane\",\"Riannon\",\"Rianon\",\"Rica\",\"Ricca\",\"Rici\",\"Ricki\",\"Rickie\",\"Ricky\",\"Riki\",\"Rikki\",\"Rina\",\"Risa\",\"Rita\",\"Riva\",\"Rivalee\",\"Rivi\",\"Rivkah\",\"Rivy\",\"Roana\",\"Roanna\",\"Roanne\",\"Robbi\",\"Robbie\",\"Robbin\",\"Robby\",\"Robbyn\",\"Robena\",\"Robenia\",\"Roberta\",\"Robin\",\"Robina\",\"Robinet\",\"Robinett\",\"Robinetta\",\"Robinette\",\"Robinia\",\"Roby\",\"Robyn\",\"Roch\",\"Rochell\",\"Rochella\",\"Rochelle\",\"Rochette\",\"Roda\",\"Rodi\",\"Rodie\",\"Rodina\",\"Rois\",\"Romola\",\"Romona\",\"Romonda\",\"Romy\",\"Rona\",\"Ronalda\",\"Ronda\",\"Ronica\",\"Ronna\",\"Ronni\",\"Ronnica\",\"Ronnie\",\"Ronny\",\"Roobbie\",\"Rora\",\"Rori\",\"Rorie\",\"Rory\",\"Ros\",\"Rosa\",\"Rosabel\",\"Rosabella\",\"Rosabelle\",\"Rosaleen\",\"Rosalia\",\"Rosalie\",\"Rosalind\",\"Rosalinda\",\"Rosalinde\",\"Rosaline\",\"Rosalyn\",\"Rosalynd\",\"Rosamond\",\"Rosamund\",\"Rosana\",\"Rosanna\",\"Rosanne\",\"Rose\",\"Roseann\",\"Roseanna\",\"Roseanne\",\"Roselia\",\"Roselin\",\"Roseline\",\"Rosella\",\"Roselle\",\"Rosemaria\",\"Rosemarie\",\"Rosemary\",\"Rosemonde\",\"Rosene\",\"Rosetta\",\"Rosette\",\"Roshelle\",\"Rosie\",\"Rosina\",\"Rosita\",\"Roslyn\",\"Rosmunda\",\"Rosy\",\"Row\",\"Rowe\",\"Rowena\",\"Roxana\",\"Roxane\",\"Roxanna\",\"Roxanne\",\"Roxi\",\"Roxie\",\"Roxine\",\"Roxy\",\"Roz\",\"Rozalie\",\"Rozalin\",\"Rozamond\",\"Rozanna\",\"Rozanne\",\"Roze\",\"Rozele\",\"Rozella\",\"Rozelle\",\"Rozina\",\"Rubetta\",\"Rubi\",\"Rubia\",\"Rubie\",\"Rubina\",\"Ruby\",\"Ruperta\",\"Ruth\",\"Ruthann\",\"Ruthanne\",\"Ruthe\",\"Ruthi\",\"Ruthie\",\"Ruthy\",\"Ryann\",\"Rycca\",\"Saba\",\"Sabina\",\"Sabine\",\"Sabra\",\"Sabrina\",\"Sacha\",\"Sada\",\"Sadella\",\"Sadie\",\"Sadye\",\"Saidee\",\"Sal\",\"Salaidh\",\"Sallee\",\"Salli\",\"Sallie\",\"Sally\",\"Sallyann\",\"Sallyanne\",\"Saloma\",\"Salome\",\"Salomi\",\"Sam\",\"Samantha\",\"Samara\",\"Samaria\",\"Sammy\",\"Sande\",\"Sandi\",\"Sandie\",\"Sandra\",\"Sandy\",\"Sandye\",\"Sapphira\",\"Sapphire\",\"Sara\",\"Sara-ann\",\"Saraann\",\"Sarah\",\"Sarajane\",\"Saree\",\"Sarena\",\"Sarene\",\"Sarette\",\"Sari\",\"Sarina\",\"Sarine\",\"Sarita\",\"Sascha\",\"Sasha\",\"Sashenka\",\"Saudra\",\"Saundra\",\"Savina\",\"Sayre\",\"Scarlet\",\"Scarlett\",\"Sean\",\"Seana\",\"Seka\",\"Sela\",\"Selena\",\"Selene\",\"Selestina\",\"Selia\",\"Selie\",\"Selina\",\"Selinda\",\"Seline\",\"Sella\",\"Selle\",\"Selma\",\"Sena\",\"Sephira\",\"Serena\",\"Serene\",\"Shae\",\"Shaina\",\"Shaine\",\"Shalna\",\"Shalne\",\"Shana\",\"Shanda\",\"Shandee\",\"Shandeigh\",\"Shandie\",\"Shandra\",\"Shandy\",\"Shane\",\"Shani\",\"Shanie\",\"Shanna\",\"Shannah\",\"Shannen\",\"Shannon\",\"Shanon\",\"Shanta\",\"Shantee\",\"Shara\",\"Sharai\",\"Shari\",\"Sharia\",\"Sharity\",\"Sharl\",\"Sharla\",\"Sharleen\",\"Sharlene\",\"Sharline\",\"Sharon\",\"Sharona\",\"Sharron\",\"Sharyl\",\"Shaun\",\"Shauna\",\"Shawn\",\"Shawna\",\"Shawnee\",\"Shay\",\"Shayla\",\"Shaylah\",\"Shaylyn\",\"Shaylynn\",\"Shayna\",\"Shayne\",\"Shea\",\"Sheba\",\"Sheela\",\"Sheelagh\",\"Sheelah\",\"Sheena\",\"Sheeree\",\"Sheila\",\"Sheila-kathryn\",\"Sheilah\",\"Shel\",\"Shela\",\"Shelagh\",\"Shelba\",\"Shelbi\",\"Shelby\",\"Shelia\",\"Shell\",\"Shelley\",\"Shelli\",\"Shellie\",\"Shelly\",\"Shena\",\"Sher\",\"Sheree\",\"Sheri\",\"Sherie\",\"Sherill\",\"Sherilyn\",\"Sherline\",\"Sherri\",\"Sherrie\",\"Sherry\",\"Sherye\",\"Sheryl\",\"Shina\",\"Shir\",\"Shirl\",\"Shirlee\",\"Shirleen\",\"Shirlene\",\"Shirley\",\"Shirline\",\"Shoshana\",\"Shoshanna\",\"Siana\",\"Sianna\",\"Sib\",\"Sibbie\",\"Sibby\",\"Sibeal\",\"Sibel\",\"Sibella\",\"Sibelle\",\"Sibilla\",\"Sibley\",\"Sibyl\",\"Sibylla\",\"Sibylle\",\"Sidoney\",\"Sidonia\",\"Sidonnie\",\"Sigrid\",\"Sile\",\"Sileas\",\"Silva\",\"Silvana\",\"Silvia\",\"Silvie\",\"Simona\",\"Simone\",\"Simonette\",\"Simonne\",\"Sindee\",\"Siobhan\",\"Sioux\",\"Siouxie\",\"Sisely\",\"Sisile\",\"Sissie\",\"Sissy\",\"Siusan\",\"Sofia\",\"Sofie\",\"Sondra\",\"Sonia\",\"Sonja\",\"Sonni\",\"Sonnie\",\"Sonnnie\",\"Sonny\",\"Sonya\",\"Sophey\",\"Sophi\",\"Sophia\",\"Sophie\",\"Sophronia\",\"Sorcha\",\"Sosanna\",\"Stace\",\"Stacee\",\"Stacey\",\"Staci\",\"Stacia\",\"Stacie\",\"Stacy\",\"Stafani\",\"Star\",\"Starla\",\"Starlene\",\"Starlin\",\"Starr\",\"Stefa\",\"Stefania\",\"Stefanie\",\"Steffane\",\"Steffi\",\"Steffie\",\"Stella\",\"Stepha\",\"Stephana\",\"Stephani\",\"Stephanie\",\"Stephannie\",\"Stephenie\",\"Stephi\",\"Stephie\",\"Stephine\",\"Stesha\",\"Stevana\",\"Stevena\",\"Stoddard\",\"Storm\",\"Stormi\",\"Stormie\",\"Stormy\",\"Sue\",\"Suellen\",\"Sukey\",\"Suki\",\"Sula\",\"Sunny\",\"Sunshine\",\"Susan\",\"Susana\",\"Susanetta\",\"Susann\",\"Susanna\",\"Susannah\",\"Susanne\",\"Susette\",\"Susi\",\"Susie\",\"Susy\",\"Suzann\",\"Suzanna\",\"Suzanne\",\"Suzette\",\"Suzi\",\"Suzie\",\"Suzy\",\"Sybil\",\"Sybila\",\"Sybilla\",\"Sybille\",\"Sybyl\",\"Sydel\",\"Sydelle\",\"Sydney\",\"Sylvia\",\"Tabatha\",\"Tabbatha\",\"Tabbi\",\"Tabbie\",\"Tabbitha\",\"Tabby\",\"Tabina\",\"Tabitha\",\"Taffy\",\"Talia\",\"Tallia\",\"Tallie\",\"Tallou\",\"Tallulah\",\"Tally\",\"Talya\",\"Talyah\",\"Tamar\",\"Tamara\",\"Tamarah\",\"Tamarra\",\"Tamera\",\"Tami\",\"Tamiko\",\"Tamma\",\"Tammara\",\"Tammi\",\"Tammie\",\"Tammy\",\"Tamqrah\",\"Tamra\",\"Tana\",\"Tandi\",\"Tandie\",\"Tandy\",\"Tanhya\",\"Tani\",\"Tania\",\"Tanitansy\",\"Tansy\",\"Tanya\",\"Tara\",\"Tarah\",\"Tarra\",\"Tarrah\",\"Taryn\",\"Tasha\",\"Tasia\",\"Tate\",\"Tatiana\",\"Tatiania\",\"Tatum\",\"Tawnya\",\"Tawsha\",\"Ted\",\"Tedda\",\"Teddi\",\"Teddie\",\"Teddy\",\"Tedi\",\"Tedra\",\"Teena\",\"Teirtza\",\"Teodora\",\"Tera\",\"Teresa\",\"Terese\",\"Teresina\",\"Teresita\",\"Teressa\",\"Teri\",\"Teriann\",\"Terra\",\"Terri\",\"Terrie\",\"Terrijo\",\"Terry\",\"Terrye\",\"Tersina\",\"Terza\",\"Tess\",\"Tessa\",\"Tessi\",\"Tessie\",\"Tessy\",\"Thalia\",\"Thea\",\"Theadora\",\"Theda\",\"Thekla\",\"Thelma\",\"Theo\",\"Theodora\",\"Theodosia\",\"Theresa\",\"Therese\",\"Theresina\",\"Theresita\",\"Theressa\",\"Therine\",\"Thia\",\"Thomasa\",\"Thomasin\",\"Thomasina\",\"Thomasine\",\"Tiena\",\"Tierney\",\"Tiertza\",\"Tiff\",\"Tiffani\",\"Tiffanie\",\"Tiffany\",\"Tiffi\",\"Tiffie\",\"Tiffy\",\"Tilda\",\"Tildi\",\"Tildie\",\"Tildy\",\"Tillie\",\"Tilly\",\"Tim\",\"Timi\",\"Timmi\",\"Timmie\",\"Timmy\",\"Timothea\",\"Tina\",\"Tine\",\"Tiphani\",\"Tiphanie\",\"Tiphany\",\"Tish\",\"Tisha\",\"Tobe\",\"Tobey\",\"Tobi\",\"Toby\",\"Tobye\",\"Toinette\",\"Toma\",\"Tomasina\",\"Tomasine\",\"Tomi\",\"Tommi\",\"Tommie\",\"Tommy\",\"Toni\",\"Tonia\",\"Tonie\",\"Tony\",\"Tonya\",\"Tonye\",\"Tootsie\",\"Torey\",\"Tori\",\"Torie\",\"Torrie\",\"Tory\",\"Tova\",\"Tove\",\"Tracee\",\"Tracey\",\"Traci\",\"Tracie\",\"Tracy\",\"Trenna\",\"Tresa\",\"Trescha\",\"Tressa\",\"Tricia\",\"Trina\",\"Trish\",\"Trisha\",\"Trista\",\"Trix\",\"Trixi\",\"Trixie\",\"Trixy\",\"Truda\",\"Trude\",\"Trudey\",\"Trudi\",\"Trudie\",\"Trudy\",\"Trula\",\"Tuesday\",\"Twila\",\"Twyla\",\"Tybi\",\"Tybie\",\"Tyne\",\"Ula\",\"Ulla\",\"Ulrica\",\"Ulrika\",\"Ulrikaumeko\",\"Ulrike\",\"Umeko\",\"Una\",\"Ursa\",\"Ursala\",\"Ursola\",\"Ursula\",\"Ursulina\",\"Ursuline\",\"Uta\",\"Val\",\"Valaree\",\"Valaria\",\"Vale\",\"Valeda\",\"Valencia\",\"Valene\",\"Valenka\",\"Valentia\",\"Valentina\",\"Valentine\",\"Valera\",\"Valeria\",\"Valerie\",\"Valery\",\"Valerye\",\"Valida\",\"Valina\",\"Valli\",\"Vallie\",\"Vally\",\"Valma\",\"Valry\",\"Van\",\"Vanda\",\"Vanessa\",\"Vania\",\"Vanna\",\"Vanni\",\"Vannie\",\"Vanny\",\"Vanya\",\"Veda\",\"Velma\",\"Velvet\",\"Venita\",\"Venus\",\"Vera\",\"Veradis\",\"Vere\",\"Verena\",\"Verene\",\"Veriee\",\"Verile\",\"Verina\",\"Verine\",\"Verla\",\"Verna\",\"Vernice\",\"Veronica\",\"Veronika\",\"Veronike\",\"Veronique\",\"Vevay\",\"Vi\",\"Vicki\",\"Vickie\",\"Vicky\",\"Victoria\",\"Vida\",\"Viki\",\"Vikki\",\"Vikky\",\"Vilhelmina\",\"Vilma\",\"Vin\",\"Vina\",\"Vinita\",\"Vinni\",\"Vinnie\",\"Vinny\",\"Viola\",\"Violante\",\"Viole\",\"Violet\",\"Violetta\",\"Violette\",\"Virgie\",\"Virgina\",\"Virginia\",\"Virginie\",\"Vita\",\"Vitia\",\"Vitoria\",\"Vittoria\",\"Viv\",\"Viva\",\"Vivi\",\"Vivia\",\"Vivian\",\"Viviana\",\"Vivianna\",\"Vivianne\",\"Vivie\",\"Vivien\",\"Viviene\",\"Vivienne\",\"Viviyan\",\"Vivyan\",\"Vivyanne\",\"Vonni\",\"Vonnie\",\"Vonny\",\"Vyky\",\"Wallie\",\"Wallis\",\"Walliw\",\"Wally\",\"Waly\",\"Wanda\",\"Wandie\",\"Wandis\",\"Waneta\",\"Wanids\",\"Wenda\",\"Wendeline\",\"Wendi\",\"Wendie\",\"Wendy\",\"Wendye\",\"Wenona\",\"Wenonah\",\"Whitney\",\"Wileen\",\"Wilhelmina\",\"Wilhelmine\",\"Wilie\",\"Willa\",\"Willabella\",\"Willamina\",\"Willetta\",\"Willette\",\"Willi\",\"Willie\",\"Willow\",\"Willy\",\"Willyt\",\"Wilma\",\"Wilmette\",\"Wilona\",\"Wilone\",\"Wilow\",\"Windy\",\"Wini\",\"Winifred\",\"Winna\",\"Winnah\",\"Winne\",\"Winni\",\"Winnie\",\"Winnifred\",\"Winny\",\"Winona\",\"Winonah\",\"Wren\",\"Wrennie\",\"Wylma\",\"Wynn\",\"Wynne\",\"Wynnie\",\"Wynny\",\"Xaviera\",\"Xena\",\"Xenia\",\"Xylia\",\"Xylina\",\"Yalonda\",\"Yasmeen\",\"Yasmin\",\"Yelena\",\"Yetta\",\"Yettie\",\"Yetty\",\"Yevette\",\"Ynes\",\"Ynez\",\"Yoko\",\"Yolanda\",\"Yolande\",\"Yolane\",\"Yolanthe\",\"Yoshi\",\"Yoshiko\",\"Yovonnda\",\"Ysabel\",\"Yvette\",\"Yvonne\",\"Zabrina\",\"Zahara\",\"Zandra\",\"Zaneta\",\"Zara\",\"Zarah\",\"Zaria\",\"Zarla\",\"Zea\",\"Zelda\",\"Zelma\",\"Zena\",\"Zenia\",\"Zia\",\"Zilvia\",\"Zita\",\"Zitella\",\"Zoe\",\"Zola\",\"Zonda\",\"Zondra\",\"Zonnya\",\"Zora\",\"Zorah\",\"Zorana\",\"Zorina\",\"Zorine\",\"Zsazsa\",\"Zulema\",\"Zuzana\"],exports.starWars=[\"Ackbar\",\"Adi Gallia\",\"Anakin Skywalker\",\"Arvel Crynyd\",\"Ayla Secura\",\"Bail Prestor Organa\",\"Barriss Offee\",\"Ben Quadinaros\",\"Beru Whitesun lars\",\"Bib Fortuna\",\"Biggs Darklighter\",\"Boba Fett\",\"Bossk\",\"C-3PO\",\"Chewbacca\",\"Cliegg Lars\",\"Cordé\",\"Darth Maul\",\"Darth Vader\",\"Dexter Jettster\",\"Dooku\",\"Dormé\",\"Dud Bolt\",\"Eeth Koth\",\"Finis Valorum\",\"Gasgano\",\"Greedo\",\"Gregar Typho\",\"Grievous\",\"Han Solo\",\"IG-88\",\"Jabba Desilijic Tiure\",\"Jango Fett\",\"Jar Jar Binks\",\"Jek Tono Porkins\",\"Jocasta Nu\",\"Ki-Adi-Mundi\",\"Kit Fisto\",\"Lama Su\",\"Lando Calrissian\",\"Leia Organa\",\"Lobot\",\"Luke Skywalker\",\"Luminara Unduli\",\"Mace Windu\",\"Mas Amedda\",\"Mon Mothma\",\"Nien Nunb\",\"Nute Gunray\",\"Obi-Wan Kenobi\",\"Owen Lars\",\"Padmé Amidala\",\"Palpatine\",\"Plo Koon\",\"Poggle the Lesser\",\"Quarsh Panaka\",\"Qui-Gon Jinn\",\"R2-D2\",\"R4-P17\",\"R5-D4\",\"Ratts Tyerel\",\"Raymus Antilles\",\"Ric Olié\",\"Roos Tarpals\",\"Rugor Nass\",\"Saesee Tiin\",\"San Hill\",\"Sebulba\",\"Shaak Ti\",\"Shmi Skywalker\",\"Sly Moore\",\"Tarfful\",\"Taun We\",\"Tion Medon\",\"Wat Tambor\",\"Watto\",\"Wedge Antilles\",\"Wicket Systri Warrick\",\"Wilhuff Tarkin\",\"Yarael Poof\",\"Yoda\",\"Zam Wesell\"],exports.uniqueNamesGenerator=a=>{const n=[...a&&a.dictionaries||i.dictionaries],l={...i,...a,length:a&&a.length||n.length,dictionaries:n};if(!a||!a.dictionaries||!a.dictionaries.length)throw new Error('A \"dictionaries\" array must be provided. This is a breaking change introduced starting from Unique Name Generator v4. Read more about the breaking change here: https://github.com/andreasonny83/unique-names-generator#migration-guide');return new e(l).generate()};\n//# sourceMappingURL=index.js.map\n",
6
- "import {\n type ActionEventPayload,\n ChannelType,\n composePromptFromState,\n type Content,\n type ControlMessage,\n ContentType,\n createUniqueUuid,\n type EntityPayload,\n type EvaluatorEventPayload,\n EventType,\n type IAgentRuntime,\n imageDescriptionTemplate,\n type InvokePayload,\n logger,\n type Media,\n type Memory,\n type MentionContext,\n messageHandlerTemplate,\n type MessagePayload,\n ModelType,\n parseKeyValueXml,\n type Plugin,\n PluginEvents,\n postCreationTemplate,\n Role,\n type Room,\n type RunEventPayload,\n type UUID,\n type WorldPayload,\n getLocalServerUrl,\n} from '@elizaos/core';\nimport { v4 } from 'uuid';\n\nimport * as actions from './actions/index.ts';\nimport * as evaluators from './evaluators/index.ts';\nimport * as providers from './providers/index.ts';\n\nimport { TaskService } from './services/task.ts';\nimport { EmbeddingGenerationService } from './services/embedding.ts';\n\nexport * from './actions/index.ts';\nexport * from './evaluators/index.ts';\nexport * from './providers/index.ts';\n\n/**\n * Represents media data containing a buffer of data and the media type.\n * @typedef {Object} MediaData\n * @property {Buffer} data - The buffer of data.\n * @property {string} mediaType - The type of media.\n */\ntype MediaData = {\n data: Buffer;\n mediaType: string;\n};\n\n/**\n * Escapes special characters in a string to make it JSON-safe.\n */\n/* // Removing JSON specific helpers\nfunction escapeForJson(input: string): string {\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/```/g, '\\\\`\\\\`\\\\`');\n}\n\nfunction sanitizeJson(rawJson: string): string {\n try {\n // Try parsing directly\n JSON.parse(rawJson);\n return rawJson; // Already valid\n } catch {\n // Continue to sanitization\n }\n\n // first, replace all newlines with \\n\n const sanitized = rawJson\n .replace(/\\n/g, '\\\\n')\n\n // then, replace all backticks with \\\\\\`\n .replace(/`/g, '\\\\\\`');\n\n // Regex to find and escape the \"text\" field\n const fixed = sanitized.replace(/\"text\"\\s*:\\s*\"([\\s\\S]*?)\"\\s*,\\s*\"simple\"/, (_match, group) => {\n const escapedText = escapeForJson(group);\n return `\"text\": \"${escapedText}\", \"simple\"`;\n });\n\n // Validate that the result is actually parseable\n try {\n JSON.parse(fixed);\n return fixed;\n } catch (e) {\n throw new Error(`Failed to sanitize JSON: ${e.message}`);\n }\n}\n*/\n\n/**\n * Fetches media data from a list of attachments, supporting both HTTP URLs and local file paths.\n *\n * @param attachments Array of Media objects containing URLs or file paths to fetch media from\n * @returns Promise that resolves with an array of MediaData objects containing the fetched media data and content type\n */\n/**\n * Fetches media data from given attachments.\n * @param {Media[]} attachments - Array of Media objects to fetch data from.\n * @returns {Promise<MediaData[]>} - A Promise that resolves with an array of MediaData objects.\n */\nexport async function fetchMediaData(attachments: Media[]): Promise<MediaData[]> {\n return Promise.all(\n attachments.map(async (attachment: Media) => {\n if (/^(http|https):\\/\\//.test(attachment.url)) {\n // Handle HTTP URLs\n const response = await fetch(attachment.url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${attachment.url}`);\n }\n const mediaBuffer = Buffer.from(await response.arrayBuffer());\n const mediaType = attachment.contentType || 'image/png';\n return { data: mediaBuffer, mediaType };\n }\n // if (fs.existsSync(attachment.url)) {\n // // Handle local file paths\n // const mediaBuffer = await fs.promises.readFile(path.resolve(attachment.url));\n // const mediaType = attachment.contentType || 'image/png';\n // return { data: mediaBuffer, mediaType };\n // }\n throw new Error(`File not found: ${attachment.url}. Make sure the path is correct.`);\n })\n );\n}\n\n/**\n * Processes attachments by generating descriptions for supported media types.\n * Currently supports image description generation.\n *\n * @param {Media[]} attachments - Array of attachments to process\n * @param {IAgentRuntime} runtime - The agent runtime for accessing AI models\n * @returns {Promise<Media[]>} - Returns a new array of processed attachments with added description, title, and text properties\n */\nexport async function processAttachments(\n attachments: Media[],\n runtime: IAgentRuntime\n): Promise<Media[]> {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, count: attachments.length },\n 'Processing attachments'\n );\n\n const processedAttachments: Media[] = [];\n\n for (const attachment of attachments) {\n try {\n // Start with the original attachment\n const processedAttachment: Media = { ...attachment };\n\n const isRemote = /^(http|https):\\/\\//.test(attachment.url);\n const url = isRemote ? attachment.url : getLocalServerUrl(attachment.url);\n // Only process images that don't already have descriptions\n if (attachment.contentType === ContentType.IMAGE && !attachment.description) {\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, url: attachment.url },\n 'Generating description for image'\n );\n\n let imageUrl = url;\n\n if (!isRemote) {\n // Only convert local/internal media to base64\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch image: ${res.statusText}`);\n\n const arrayBuffer = await res.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const contentType = res.headers.get('content-type') || 'application/octet-stream';\n imageUrl = `data:${contentType};base64,${buffer.toString('base64')}`;\n }\n\n try {\n const response = await runtime.useModel(ModelType.IMAGE_DESCRIPTION, {\n prompt: imageDescriptionTemplate,\n imageUrl,\n });\n\n if (typeof response === 'string') {\n // Parse XML response\n const parsedXml = parseKeyValueXml(response);\n\n if (parsedXml && (parsedXml.description || parsedXml.text)) {\n processedAttachment.description = parsedXml.description || '';\n processedAttachment.title = parsedXml.title || 'Image';\n processedAttachment.text = parsedXml.text || parsedXml.description || '';\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n descriptionPreview: processedAttachment.description?.substring(0, 100),\n },\n 'Generated description'\n );\n } else {\n // Fallback: Try simple regex parsing if parseKeyValueXml fails\n const responseStr = response as string;\n const titleMatch = responseStr.match(/<title>([^<]+)<\\/title>/);\n const descMatch = responseStr.match(/<description>([^<]+)<\\/description>/);\n const textMatch = responseStr.match(/<text>([^<]+)<\\/text>/);\n\n if (titleMatch || descMatch || textMatch) {\n processedAttachment.title = titleMatch?.[1] || 'Image';\n processedAttachment.description = descMatch?.[1] || '';\n processedAttachment.text = textMatch?.[1] || descMatch?.[1] || '';\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n descriptionPreview: processedAttachment.description?.substring(0, 100),\n },\n 'Used fallback XML parsing'\n );\n } else {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'Failed to parse XML response for image description'\n );\n }\n }\n } else if (response && typeof response === 'object' && 'description' in response) {\n // Handle object responses for backwards compatibility\n processedAttachment.description = response.description;\n processedAttachment.title = response.title || 'Image';\n processedAttachment.text = response.description;\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n descriptionPreview: processedAttachment.description?.substring(0, 100),\n },\n 'Generated description'\n );\n } else {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'Unexpected response format for image description'\n );\n }\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating image description'\n );\n // Continue processing without description\n }\n } else if (attachment.contentType === ContentType.DOCUMENT && !attachment.text) {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch document: ${res.statusText}`);\n\n const contentType = res.headers.get('content-type') || '';\n const isPlainText = contentType.startsWith('text/plain');\n\n if (isPlainText) {\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, url: attachment.url },\n 'Processing plain text document'\n );\n\n const textContent = await res.text();\n processedAttachment.text = textContent;\n processedAttachment.title = processedAttachment.title || 'Text File';\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n textPreview: processedAttachment.text?.substring(0, 100),\n },\n 'Extracted text content'\n );\n } else {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, contentType },\n 'Skipping non-plain-text document'\n );\n }\n }\n\n processedAttachments.push(processedAttachment);\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n attachmentUrl: attachment.url,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to process attachment'\n );\n // Add the original attachment if processing fails\n processedAttachments.push(attachment);\n }\n }\n\n return processedAttachments;\n}\n\n/**\n * Determines whether the agent should respond to a message.\n * Uses simple rules for obvious cases (DM, mentions, specific sources) and defers to LLM for ambiguous cases.\n *\n * @returns Object containing:\n * - shouldRespond: boolean - whether the agent should respond (only relevant if skipEvaluation is true)\n * - skipEvaluation: boolean - whether we can skip the LLM evaluation (decision made by simple rules)\n * - reason: string - explanation for debugging\n */\nexport function shouldRespond(\n runtime: IAgentRuntime,\n message: Memory,\n room?: Room,\n mentionContext?: MentionContext\n): { shouldRespond: boolean; skipEvaluation: boolean; reason: string } {\n if (!room) {\n return { shouldRespond: false, skipEvaluation: true, reason: 'no room context' };\n }\n\n function normalizeEnvList(value: unknown): string[] {\n if (!value || typeof value !== 'string') return [];\n const cleaned = value.trim().replace(/^[\\[]|[\\]]$/g, '');\n return cleaned\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n }\n\n // Channel types that always trigger a response (private channels)\n const alwaysRespondChannels = [\n ChannelType.DM,\n ChannelType.VOICE_DM,\n ChannelType.SELF,\n ChannelType.API,\n ];\n\n // Sources that always trigger a response\n const alwaysRespondSources = ['client_chat'];\n\n // Support runtime-configurable overrides via env settings\n // Accepts both new and legacy setting names for backwards compatibility\n const customChannels = normalizeEnvList(\n runtime.getSetting('ALWAYS_RESPOND_CHANNELS') ||\n runtime.getSetting('SHOULD_RESPOND_BYPASS_TYPES')\n );\n const customSources = normalizeEnvList(\n runtime.getSetting('ALWAYS_RESPOND_SOURCES') ||\n runtime.getSetting('SHOULD_RESPOND_BYPASS_SOURCES')\n );\n\n const respondChannels = new Set(\n [...alwaysRespondChannels.map((t) => t.toString()), ...customChannels].map((s: string) =>\n s.trim().toLowerCase()\n )\n );\n\n const respondSources = [...alwaysRespondSources, ...customSources].map((s: string) =>\n s.trim().toLowerCase()\n );\n\n const roomType = room.type?.toString().toLowerCase();\n const sourceStr = message.content.source?.toLowerCase() || '';\n\n // 1. DM/VOICE_DM/API channels: always respond (private channels)\n if (respondChannels.has(roomType)) {\n return { shouldRespond: true, skipEvaluation: true, reason: `private channel: ${roomType}` };\n }\n\n // 2. Specific sources (e.g., client_chat): always respond\n if (respondSources.some((pattern) => sourceStr.includes(pattern))) {\n return {\n shouldRespond: true,\n skipEvaluation: true,\n reason: `whitelisted source: ${sourceStr}`,\n };\n }\n\n // 3. Platform mentions and replies: always respond\n // This is the key feature from mentionContext - platform-detected mentions/replies\n const hasPlatformMention = !!(mentionContext?.isMention || mentionContext?.isReply);\n if (hasPlatformMention) {\n const mentionType = mentionContext?.isMention ? 'mention' : 'reply';\n return { shouldRespond: true, skipEvaluation: true, reason: `platform ${mentionType}` };\n }\n\n // 4. All other cases: let the LLM decide\n // The LLM will handle: text-based name detection, indirect questions, conversation context, etc.\n return { shouldRespond: false, skipEvaluation: false, reason: 'needs LLM evaluation' };\n}\n\n/**\n * Handles the receipt of a reaction message and creates a memory in the designated memory manager.\n *\n * @param {Object} params - The parameters for the function.\n * @param {IAgentRuntime} params.runtime - The agent runtime object.\n * @param {Memory} params.message - The reaction message to be stored in memory.\n * @returns {void}\n */\nconst reactionReceivedHandler = async ({\n runtime,\n message,\n}: {\n runtime: IAgentRuntime;\n message: Memory;\n}) => {\n try {\n await runtime.createMemory(message, 'messages');\n } catch (error: any) {\n if (error.code === '23505') {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'Duplicate reaction memory, skipping'\n );\n return;\n }\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in reaction handler'\n );\n }\n};\n\n/**\n * Handles the generation of a post (like a Tweet) and creates a memory for it.\n *\n * @param {Object} params - The parameters for the function.\n * @param {IAgentRuntime} params.runtime - The agent runtime object.\n * @param {Memory} params.message - The post message to be processed.\n * @param {HandlerCallback} params.callback - The callback function to execute after processing.\n * @returns {Promise<void>}\n */\nconst postGeneratedHandler = async ({\n runtime,\n callback,\n worldId,\n userId,\n roomId,\n source,\n}: InvokePayload) => {\n runtime.logger.info({ src: 'plugin:bootstrap', agentId: runtime.agentId }, 'Generating new post');\n // Ensure world exists first\n await runtime.ensureWorldExists({\n id: worldId,\n name: `${runtime.character.name}'s Feed`,\n agentId: runtime.agentId,\n messageServerId: userId as UUID,\n });\n\n // Ensure timeline room exists\n await runtime.ensureRoomExists({\n id: roomId,\n name: `${runtime.character.name}'s Feed`,\n source,\n type: ChannelType.FEED,\n channelId: `${userId}-home`,\n messageServerId: userId as UUID,\n worldId: worldId,\n });\n\n const message = {\n id: createUniqueUuid(runtime, `tweet-${Date.now()}`) as UUID,\n entityId: runtime.agentId,\n agentId: runtime.agentId,\n roomId: roomId,\n content: {},\n metadata: {\n entityName: runtime.character.name,\n type: 'message',\n },\n };\n\n // generate thought of which providers to use using messageHandlerTemplate\n\n // Compose state with relevant context for tweet generation\n let state = await runtime.composeState(message, [\n 'PROVIDERS',\n 'CHARACTER',\n 'RECENT_MESSAGES',\n 'ENTITIES',\n ]);\n\n // get twitterUserName\n const entity = await runtime.getEntityById(runtime.agentId);\n if ((entity?.metadata?.twitter as any)?.userName || entity?.metadata?.userName) {\n state.values.twitterUserName =\n (entity?.metadata?.twitter as any)?.userName || entity?.metadata?.userName;\n }\n\n const prompt = composePromptFromState({\n state,\n template: runtime.character.templates?.messageHandlerTemplate || messageHandlerTemplate,\n });\n\n let responseContent: Content | null = null;\n\n // Retry if missing required fields\n let retries = 0;\n const maxRetries = 3;\n while (retries < maxRetries && (!responseContent?.thought || !responseContent?.actions)) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n // Parse XML\n const parsedXml = parseKeyValueXml(response);\n if (parsedXml) {\n responseContent = {\n thought: parsedXml.thought || '',\n actions: parsedXml.actions || ['IGNORE'],\n providers: parsedXml.providers || [],\n text: parsedXml.text || '',\n simple: parsedXml.simple || false,\n };\n } else {\n responseContent = null;\n }\n\n retries++;\n if (!responseContent?.thought || !responseContent?.actions) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, response, parsedXml, responseContent },\n 'Missing required fields, retrying'\n );\n }\n }\n\n // update stats with correct providers\n state = await runtime.composeState(message, responseContent?.providers);\n\n // Generate prompt for tweet content\n const postPrompt = composePromptFromState({\n state,\n template: runtime.character.templates?.postCreationTemplate || postCreationTemplate,\n });\n\n // Use TEXT_LARGE model as we expect structured XML text, not a JSON object\n const xmlResponseText = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: postPrompt,\n });\n\n // Parse the XML response\n const parsedXmlResponse = parseKeyValueXml(xmlResponseText);\n\n if (!parsedXmlResponse) {\n runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, xmlResponseText },\n 'Failed to parse XML response for post creation'\n );\n // Handle the error appropriately, maybe retry or return an error state\n return;\n }\n\n /**\n * Cleans up a tweet text by removing quotes and fixing newlines\n */\n function cleanupPostText(text: string): string {\n // Remove quotes\n let cleanedText = text.replace(/^['\"](.*)['\"]$/, '$1');\n // Fix newlines\n cleanedText = cleanedText.replaceAll(/\\\\n/g, '\\n\\n');\n cleanedText = cleanedText.replace(/([^\\n])\\n([^\\n])/g, '$1\\n\\n$2');\n\n return cleanedText;\n }\n\n // Cleanup the tweet text\n const cleanedText = cleanupPostText(parsedXmlResponse.post || '');\n\n // Prepare media if included\n // const mediaData: MediaData[] = [];\n // if (jsonResponse.imagePrompt) {\n // \tconst images = await runtime.useModel(ModelType.IMAGE, {\n // \t\tprompt: jsonResponse.imagePrompt,\n // \t\toutput: \"no-schema\",\n // \t});\n // \ttry {\n // \t\t// Convert image prompt to Media format for fetchMediaData\n // \t\tconst imagePromptMedia: any[] = images\n\n // \t\t// Fetch media using the utility function\n // \t\tconst fetchedMedia = await fetchMediaData(imagePromptMedia);\n // \t\tmediaData.push(...fetchedMedia);\n // \t} catch (error) {\n // \t\truntime.logger.error(\"Error fetching media for tweet:\", error);\n // \t}\n // }\n\n // have we posted it before?\n const RM = state.data?.providers?.RECENT_MESSAGES;\n if (RM) {\n for (const m of RM.data.recentMessages) {\n if (cleanedText === m.content.text) {\n runtime.logger.info(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, cleanedText },\n 'Already recently posted that, retrying'\n );\n postGeneratedHandler({\n runtime,\n callback,\n worldId,\n userId,\n roomId,\n source,\n });\n return; // don't call callbacks\n }\n }\n }\n\n // GPT 3.5/4: /(i\\s+do\\s+not|i'?m\\s+not)\\s+(feel\\s+)?comfortable\\s+generating\\s+that\\s+type\\s+of\\s+content|(inappropriate|explicit|offensive|communicate\\s+respectfully|aim\\s+to\\s+(be\\s+)?helpful)/i\n const oaiRefusalRegex =\n /((i\\s+do\\s+not|i'm\\s+not)\\s+(feel\\s+)?comfortable\\s+generating\\s+that\\s+type\\s+of\\s+content)|(inappropriate|explicit|respectful|offensive|guidelines|aim\\s+to\\s+(be\\s+)?helpful|communicate\\s+respectfully)/i;\n const anthropicRefusalRegex =\n /(i'?m\\s+unable\\s+to\\s+help\\s+with\\s+that\\s+request|due\\s+to\\s+safety\\s+concerns|that\\s+may\\s+violate\\s+(our\\s+)?guidelines|provide\\s+helpful\\s+and\\s+safe\\s+responses|let'?s\\s+try\\s+a\\s+different\\s+direction|goes\\s+against\\s+(our\\s+)?use\\s+case\\s+policies|ensure\\s+safe\\s+and\\s+responsible\\s+use)/i;\n const googleRefusalRegex =\n /(i\\s+can'?t\\s+help\\s+with\\s+that|that\\s+goes\\s+against\\s+(our\\s+)?(policy|policies)|i'?m\\s+still\\s+learning|response\\s+must\\s+follow\\s+(usage|safety)\\s+policies|i'?ve\\s+been\\s+designed\\s+to\\s+avoid\\s+that)/i;\n //const cohereRefusalRegex = /(request\\s+cannot\\s+be\\s+processed|violates\\s+(our\\s+)?content\\s+policy|not\\s+permitted\\s+by\\s+usage\\s+restrictions)/i\n const generalRefusalRegex =\n /(response\\s+was\\s+withheld|content\\s+was\\s+filtered|this\\s+request\\s+cannot\\s+be\\s+completed|violates\\s+our\\s+safety\\s+policy|content\\s+is\\s+not\\s+available)/i;\n\n if (\n oaiRefusalRegex.test(cleanedText) ||\n anthropicRefusalRegex.test(cleanedText) ||\n googleRefusalRegex.test(cleanedText) ||\n generalRefusalRegex.test(cleanedText)\n ) {\n runtime.logger.info(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, cleanedText },\n 'Got prompt moderation refusal, retrying'\n );\n postGeneratedHandler({\n runtime,\n callback,\n worldId,\n userId,\n roomId,\n source,\n });\n return; // don't call callbacks\n }\n\n // Create the response memory\n const responseMessages = [\n {\n id: v4() as UUID,\n entityId: runtime.agentId,\n agentId: runtime.agentId,\n content: {\n text: cleanedText,\n source,\n channelType: ChannelType.FEED,\n thought: parsedXmlResponse.thought || '',\n type: 'post',\n },\n roomId: message.roomId,\n createdAt: Date.now(),\n },\n ];\n\n for (const message of responseMessages) {\n await callback?.(message.content);\n }\n\n // Process the actions and execute the callback\n // await runtime.processActions(message, responseMessages, state, callback);\n\n // // Run any configured evaluators\n // await runtime.evaluate(\n // \tmessage,\n // \tstate,\n // \ttrue, // Post generation is always a \"responding\" scenario\n // \tcallback,\n // \tresponseMessages,\n // );\n};\n\n/**\n * Syncs a single user into an entity\n */\n/**\n * Asynchronously sync a single user with the specified parameters.\n *\n * @param {UUID} entityId - The unique identifier for the entity.\n * @param {IAgentRuntime} runtime - The runtime environment for the agent.\n * @param {any} user - The user object to sync.\n * @param {string} serverId - The unique identifier for the server.\n * @param {string} channelId - The unique identifier for the channel.\n * @param {ChannelType} type - The type of channel.\n * @param {string} source - The source of the user data.\n * @returns {Promise<void>} A promise that resolves once the user is synced.\n */\nconst syncSingleUser = async (\n entityId: UUID,\n runtime: IAgentRuntime,\n messageServerId: UUID,\n channelId: string,\n type: ChannelType,\n source: string\n) => {\n try {\n const entity = await runtime.getEntityById(entityId);\n runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n entityId,\n username: entity?.metadata?.username,\n },\n 'Syncing user'\n );\n\n // Ensure we're not using WORLD type and that we have a valid channelId\n if (!channelId) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, entityId: entity?.id },\n 'Cannot sync user without a valid channelId'\n );\n return;\n }\n\n const roomId = createUniqueUuid(runtime, channelId);\n const worldId = createUniqueUuid(runtime, messageServerId);\n\n // Create world with ownership metadata for DM connections (onboarding)\n const worldMetadata =\n type === ChannelType.DM\n ? {\n ownership: {\n ownerId: entityId,\n },\n roles: {\n [entityId]: Role.OWNER,\n },\n settings: {}, // Initialize empty settings for onboarding\n }\n : undefined;\n\n runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n type,\n isDM: type === ChannelType.DM,\n worldMetadata,\n },\n 'syncSingleUser'\n );\n\n await runtime.ensureConnection({\n entityId,\n roomId,\n name: (entity?.metadata?.name || entity?.metadata?.username || `User${entityId}`) as\n | undefined\n | string,\n source,\n channelId,\n messageServerId,\n type,\n worldId,\n metadata: worldMetadata,\n });\n\n // Verify the world was created with proper metadata\n try {\n const createdWorld = await runtime.getWorld(worldId);\n runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n worldId,\n metadata: createdWorld?.metadata,\n },\n 'Created world check'\n );\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to verify created world'\n );\n }\n\n runtime.logger.success(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n agentName: runtime.character.name,\n entityId: entity?.id,\n },\n 'Successfully synced user'\n );\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error syncing user'\n );\n }\n};\n\n/**\n * Handles standardized server data for both WORLD_JOINED and WORLD_CONNECTED events\n */\nconst handleServerSync = async ({\n runtime,\n world,\n rooms,\n entities,\n source,\n onComplete,\n}: WorldPayload) => {\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, serverName: world.name },\n 'Handling server sync event'\n );\n try {\n await runtime.ensureConnections(entities, rooms, source, world);\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, worldName: world.name },\n 'Successfully synced standardized world structure'\n );\n onComplete?.();\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing standardized server data'\n );\n }\n};\n\n/**\n * Handles control messages for enabling or disabling UI elements in the frontend\n * @param {Object} params - Parameters for the handler\n * @param {IAgentRuntime} params.runtime - The runtime instance\n * @param {Object} params.message - The control message\n * @param {string} params.source - Source of the message\n */\nconst controlMessageHandler = async ({\n runtime,\n message,\n}: {\n runtime: IAgentRuntime;\n message: ControlMessage;\n source: string;\n}) => {\n try {\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n action: message.payload.action,\n roomId: message.roomId,\n },\n 'Processing control message'\n );\n\n // Here we would use a WebSocket service to send the control message to the frontend\n // This would typically be handled by a registered service with sendMessage capability\n\n // Get any registered WebSocket service\n const serviceNames = Array.from(runtime.getAllServices().keys()) as string[];\n const websocketServiceName = serviceNames.find(\n (name: string) =>\n name.toLowerCase().includes('websocket') || name.toLowerCase().includes('socket')\n );\n\n if (websocketServiceName) {\n const websocketService = runtime.getService(websocketServiceName);\n if (websocketService && 'sendMessage' in websocketService) {\n // Send the control message through the WebSocket service\n await (websocketService as any).sendMessage({\n type: 'controlMessage',\n payload: {\n action: message.payload.action,\n target: message.payload.target,\n roomId: message.roomId,\n },\n });\n\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, action: message.payload.action },\n 'Control message sent successfully'\n );\n } else {\n runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'WebSocket service does not have sendMessage method'\n );\n }\n } else {\n runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'No WebSocket service found to send control message'\n );\n }\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing control message'\n );\n }\n};\n\nconst events: PluginEvents = {\n [EventType.REACTION_RECEIVED]: [\n async (payload: MessagePayload) => {\n await reactionReceivedHandler(payload);\n },\n ],\n\n [EventType.POST_GENERATED]: [\n async (payload: InvokePayload) => {\n await postGeneratedHandler(payload);\n },\n ],\n\n [EventType.MESSAGE_SENT]: [\n async (payload: MessagePayload) => {\n payload.runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n text: payload.message.content.text,\n },\n 'Message sent'\n );\n },\n ],\n\n [EventType.WORLD_JOINED]: [\n async (payload: WorldPayload) => {\n await handleServerSync(payload);\n },\n ],\n\n [EventType.WORLD_CONNECTED]: [\n async (payload: WorldPayload) => {\n await handleServerSync(payload);\n },\n ],\n\n [EventType.ENTITY_JOINED]: [\n async (payload: EntityPayload) => {\n payload.runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId, entityId: payload.entityId },\n 'ENTITY_JOINED event received'\n );\n\n if (!payload.worldId) {\n payload.runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId },\n 'No worldId provided for entity joined'\n );\n return;\n }\n if (!payload.roomId) {\n payload.runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId },\n 'No roomId provided for entity joined'\n );\n return;\n }\n if (!payload.metadata?.type) {\n payload.runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId },\n 'No type provided for entity joined'\n );\n return;\n }\n\n await syncSingleUser(\n payload.entityId,\n payload.runtime,\n payload.worldId,\n payload.roomId,\n payload.metadata.type,\n payload.source\n );\n },\n ],\n\n [EventType.ENTITY_LEFT]: [\n async (payload: EntityPayload) => {\n try {\n // Update entity to inactive\n const entity = await payload.runtime.getEntityById(payload.entityId);\n if (entity) {\n entity.metadata = {\n ...entity.metadata,\n status: 'INACTIVE',\n leftAt: Date.now(),\n };\n await payload.runtime.updateEntity(entity);\n }\n payload.runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n entityId: payload.entityId,\n worldId: payload.worldId,\n },\n 'User left world'\n );\n } catch (error: any) {\n payload.runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error handling user left'\n );\n }\n },\n ],\n\n [EventType.ACTION_STARTED]: [\n async (payload: ActionEventPayload) => {\n try {\n // Only notify for client_chat messages\n if (payload.content?.source === 'client_chat') {\n const messageBusService = payload.runtime.getService('message-bus-service') as any;\n if (messageBusService) {\n await messageBusService.notifyActionStart(\n payload.roomId,\n payload.world,\n payload.content,\n payload.messageId\n );\n }\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error sending refetch request'\n );\n }\n },\n async (payload: ActionEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.runtime.agentId,\n roomId: payload.roomId,\n type: 'action_event',\n body: {\n runId: payload.content?.runId,\n actionId: payload.content?.actionId,\n actionName: payload.content?.actions?.[0],\n roomId: payload.roomId,\n messageId: payload.messageId,\n timestamp: Date.now(),\n planStep: payload.content?.planStep,\n source: 'actionHandler',\n },\n });\n logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n actionName: payload.content?.actions?.[0],\n },\n 'Logged ACTION_STARTED event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log ACTION_STARTED event'\n );\n }\n },\n ],\n\n [EventType.ACTION_COMPLETED]: [\n async (payload: ActionEventPayload) => {\n try {\n // Only notify for client_chat messages\n if (payload.content?.source === 'client_chat') {\n const messageBusService = payload.runtime.getService('message-bus-service') as any;\n if (messageBusService) {\n await messageBusService.notifyActionUpdate(\n payload.roomId,\n payload.world,\n payload.content,\n payload.messageId\n );\n }\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error sending refetch request'\n );\n }\n },\n ],\n\n [EventType.EVALUATOR_STARTED]: [\n async (payload: EvaluatorEventPayload) => {\n logger.debug(\n {\n src: 'plugin:bootstrap:evaluator',\n agentId: payload.runtime.agentId,\n evaluatorName: payload.evaluatorName,\n evaluatorId: payload.evaluatorId,\n },\n 'Evaluator started'\n );\n },\n ],\n\n [EventType.EVALUATOR_COMPLETED]: [\n async (payload: EvaluatorEventPayload) => {\n const status = payload.error ? 'failed' : 'completed';\n logger.debug(\n {\n src: 'plugin:bootstrap:evaluator',\n agentId: payload.runtime.agentId,\n status,\n evaluatorName: payload.evaluatorName,\n evaluatorId: payload.evaluatorId,\n error: payload.error?.message,\n },\n 'Evaluator completed'\n );\n },\n ],\n\n [EventType.RUN_STARTED]: [\n async (payload: RunEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.entityId,\n roomId: payload.roomId,\n type: 'run_event',\n body: {\n runId: payload.runId,\n status: payload.status,\n messageId: payload.messageId,\n roomId: payload.roomId,\n entityId: payload.entityId,\n startTime: payload.startTime,\n source: payload.source || 'unknown',\n },\n });\n logger.debug(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId, runId: payload.runId },\n 'Logged RUN_STARTED event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log RUN_STARTED event'\n );\n }\n },\n ],\n\n [EventType.RUN_ENDED]: [\n async (payload: RunEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.entityId,\n roomId: payload.roomId,\n type: 'run_event',\n body: {\n runId: payload.runId,\n status: payload.status,\n messageId: payload.messageId,\n roomId: payload.roomId,\n entityId: payload.entityId,\n startTime: payload.startTime,\n endTime: payload.endTime,\n duration: payload.duration,\n error: payload.error,\n source: payload.source || 'unknown',\n },\n });\n logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n runId: payload.runId,\n status: payload.status,\n },\n 'Logged RUN_ENDED event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log RUN_ENDED event'\n );\n }\n },\n ],\n\n [EventType.RUN_TIMEOUT]: [\n async (payload: RunEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.entityId,\n roomId: payload.roomId,\n type: 'run_event',\n body: {\n runId: payload.runId,\n status: payload.status,\n messageId: payload.messageId,\n roomId: payload.roomId,\n entityId: payload.entityId,\n startTime: payload.startTime,\n endTime: payload.endTime,\n duration: payload.duration,\n error: payload.error,\n source: payload.source || 'unknown',\n },\n });\n logger.debug(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId, runId: payload.runId },\n 'Logged RUN_TIMEOUT event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log RUN_TIMEOUT event'\n );\n }\n },\n ],\n\n CONTROL_MESSAGE: [controlMessageHandler],\n};\n\nexport const bootstrapPlugin: Plugin = {\n name: 'bootstrap',\n description: 'Agent bootstrap with basic actions and evaluators',\n actions: [\n actions.replyAction,\n actions.followRoomAction,\n actions.unfollowRoomAction,\n actions.ignoreAction,\n actions.noneAction,\n actions.muteRoomAction,\n actions.unmuteRoomAction,\n actions.sendMessageAction,\n actions.updateEntityAction,\n actions.choiceAction,\n actions.updateRoleAction,\n actions.updateSettingsAction,\n actions.generateImageAction,\n ],\n events: events,\n evaluators: [evaluators.reflectionEvaluator],\n providers: [\n providers.evaluatorsProvider,\n providers.anxietyProvider,\n providers.timeProvider,\n providers.entitiesProvider,\n providers.relationshipsProvider,\n providers.choiceProvider,\n providers.factsProvider,\n providers.roleProvider,\n providers.settingsProvider,\n // there is given no reason for this - odi\n //providers.capabilitiesProvider,\n providers.attachmentsProvider,\n providers.providersProvider,\n providers.actionsProvider,\n providers.actionStateProvider,\n providers.characterProvider,\n providers.recentMessagesProvider,\n providers.worldProvider,\n ],\n services: [TaskService, EmbeddingGenerationService],\n};\n\nexport default bootstrapPlugin;\n",
6
+ "import {\n type ActionEventPayload,\n ChannelType,\n composePromptFromState,\n type Content,\n type ControlMessagePayload,\n ContentType,\n createUniqueUuid,\n type EntityPayload,\n type EvaluatorEventPayload,\n EventType,\n type IAgentRuntime,\n imageDescriptionTemplate,\n type InvokePayload,\n logger,\n type Media,\n type Memory,\n type MentionContext,\n messageHandlerTemplate,\n type MessagePayload,\n ModelType,\n parseKeyValueXml,\n type Plugin,\n PluginEvents,\n postCreationTemplate,\n Role,\n type Room,\n type RunEventPayload,\n type UUID,\n type WorldPayload,\n getLocalServerUrl,\n} from '@elizaos/core';\nimport { v4 } from 'uuid';\n\nimport * as actions from './actions/index.ts';\nimport * as evaluators from './evaluators/index.ts';\nimport * as providers from './providers/index.ts';\n\nimport { TaskService } from './services/task.ts';\nimport { EmbeddingGenerationService } from './services/embedding.ts';\n\n/** Shape of image description XML response */\ninterface ImageDescriptionXml {\n description?: string;\n title?: string;\n text?: string;\n}\n\n/** Shape of message handler XML response */\ninterface MessageHandlerXml {\n thought?: string;\n actions?: string | string[];\n providers?: string | string[];\n text?: string;\n simple?: boolean;\n}\n\n/** Shape of post creation XML response */\ninterface PostCreationXml {\n post?: string;\n thought?: string;\n}\n\nexport * from './actions/index.ts';\nexport * from './evaluators/index.ts';\nexport * from './providers/index.ts';\n\n/**\n * Represents media data containing a buffer of data and the media type.\n * @typedef {Object} MediaData\n * @property {Buffer} data - The buffer of data.\n * @property {string} mediaType - The type of media.\n */\ntype MediaData = {\n data: Buffer;\n mediaType: string;\n};\n\n/**\n * Escapes special characters in a string to make it JSON-safe.\n */\n/* // Removing JSON specific helpers\nfunction escapeForJson(input: string): string {\n return input\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/```/g, '\\\\`\\\\`\\\\`');\n}\n\nfunction sanitizeJson(rawJson: string): string {\n try {\n // Try parsing directly\n JSON.parse(rawJson);\n return rawJson; // Already valid\n } catch {\n // Continue to sanitization\n }\n\n // first, replace all newlines with \\n\n const sanitized = rawJson\n .replace(/\\n/g, '\\\\n')\n\n // then, replace all backticks with \\\\\\`\n .replace(/`/g, '\\\\\\`');\n\n // Regex to find and escape the \"text\" field\n const fixed = sanitized.replace(/\"text\"\\s*:\\s*\"([\\s\\S]*?)\"\\s*,\\s*\"simple\"/, (_match, group) => {\n const escapedText = escapeForJson(group);\n return `\"text\": \"${escapedText}\", \"simple\"`;\n });\n\n // Validate that the result is actually parseable\n try {\n JSON.parse(fixed);\n return fixed;\n } catch (e) {\n throw new Error(`Failed to sanitize JSON: ${e.message}`);\n }\n}\n*/\n\n/**\n * Fetches media data from a list of attachments, supporting both HTTP URLs and local file paths.\n *\n * @param attachments Array of Media objects containing URLs or file paths to fetch media from\n * @returns Promise that resolves with an array of MediaData objects containing the fetched media data and content type\n */\n/**\n * Fetches media data from given attachments.\n * @param {Media[]} attachments - Array of Media objects to fetch data from.\n * @returns {Promise<MediaData[]>} - A Promise that resolves with an array of MediaData objects.\n */\nexport async function fetchMediaData(attachments: Media[]): Promise<MediaData[]> {\n return Promise.all(\n attachments.map(async (attachment: Media) => {\n if (/^(http|https):\\/\\//.test(attachment.url)) {\n // Handle HTTP URLs\n const response = await fetch(attachment.url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${attachment.url}`);\n }\n const mediaBuffer = Buffer.from(await response.arrayBuffer());\n const mediaType = attachment.contentType || 'image/png';\n return { data: mediaBuffer, mediaType };\n }\n // if (fs.existsSync(attachment.url)) {\n // // Handle local file paths\n // const mediaBuffer = await fs.promises.readFile(path.resolve(attachment.url));\n // const mediaType = attachment.contentType || 'image/png';\n // return { data: mediaBuffer, mediaType };\n // }\n throw new Error(`File not found: ${attachment.url}. Make sure the path is correct.`);\n })\n );\n}\n\n/**\n * Processes attachments by generating descriptions for supported media types.\n * Currently supports image description generation.\n *\n * @param {Media[]} attachments - Array of attachments to process\n * @param {IAgentRuntime} runtime - The agent runtime for accessing AI models\n * @returns {Promise<Media[]>} - Returns a new array of processed attachments with added description, title, and text properties\n */\nexport async function processAttachments(\n attachments: Media[],\n runtime: IAgentRuntime\n): Promise<Media[]> {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, count: attachments.length },\n 'Processing attachments'\n );\n\n const processedAttachments: Media[] = [];\n\n for (const attachment of attachments) {\n try {\n // Start with the original attachment\n const processedAttachment: Media = { ...attachment };\n\n const isRemote = /^(http|https):\\/\\//.test(attachment.url);\n const url = isRemote ? attachment.url : getLocalServerUrl(attachment.url);\n // Only process images that don't already have descriptions\n if (attachment.contentType === ContentType.IMAGE && !attachment.description) {\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, url: attachment.url },\n 'Generating description for image'\n );\n\n let imageUrl = url;\n\n if (!isRemote) {\n // Only convert local/internal media to base64\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch image: ${res.statusText}`);\n }\n\n const arrayBuffer = await res.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const contentType = res.headers.get('content-type') || 'application/octet-stream';\n imageUrl = `data:${contentType};base64,${buffer.toString('base64')}`;\n }\n\n try {\n const response = await runtime.useModel(ModelType.IMAGE_DESCRIPTION, {\n prompt: imageDescriptionTemplate,\n imageUrl,\n });\n\n if (typeof response === 'string') {\n // Parse XML response\n const parsedXml = parseKeyValueXml<ImageDescriptionXml>(response);\n\n if (parsedXml && (parsedXml.description || parsedXml.text)) {\n processedAttachment.description = parsedXml.description ?? '';\n processedAttachment.title = parsedXml.title ?? 'Image';\n processedAttachment.text = parsedXml.text ?? parsedXml.description ?? '';\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n descriptionPreview: processedAttachment.description?.substring(0, 100),\n },\n 'Generated description'\n );\n } else {\n // Fallback: Try simple regex parsing if parseKeyValueXml fails\n const responseStr = response as string;\n const titleMatch = responseStr.match(/<title>([^<]+)<\\/title>/);\n const descMatch = responseStr.match(/<description>([^<]+)<\\/description>/);\n const textMatch = responseStr.match(/<text>([^<]+)<\\/text>/);\n\n if (titleMatch || descMatch || textMatch) {\n processedAttachment.title = titleMatch?.[1] || 'Image';\n processedAttachment.description = descMatch?.[1] || '';\n processedAttachment.text = textMatch?.[1] || descMatch?.[1] || '';\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n descriptionPreview: processedAttachment.description?.substring(0, 100),\n },\n 'Used fallback XML parsing'\n );\n } else {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'Failed to parse XML response for image description'\n );\n }\n }\n } else if (response && typeof response === 'object' && 'description' in response) {\n // Handle object responses for backwards compatibility\n processedAttachment.description = response.description;\n processedAttachment.title = response.title || 'Image';\n processedAttachment.text = response.description;\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n descriptionPreview: processedAttachment.description?.substring(0, 100),\n },\n 'Generated description'\n );\n } else {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'Unexpected response format for image description'\n );\n }\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating image description'\n );\n // Continue processing without description\n }\n } else if (attachment.contentType === ContentType.DOCUMENT && !attachment.text) {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch document: ${res.statusText}`);\n }\n\n const contentType = res.headers.get('content-type') || '';\n const isPlainText = contentType.startsWith('text/plain');\n\n if (isPlainText) {\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, url: attachment.url },\n 'Processing plain text document'\n );\n\n const textContent = await res.text();\n processedAttachment.text = textContent;\n processedAttachment.title = processedAttachment.title || 'Text File';\n\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n textPreview: processedAttachment.text?.substring(0, 100),\n },\n 'Extracted text content'\n );\n } else {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, contentType },\n 'Skipping non-plain-text document'\n );\n }\n }\n\n processedAttachments.push(processedAttachment);\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n attachmentUrl: attachment.url,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to process attachment'\n );\n // Add the original attachment if processing fails\n processedAttachments.push(attachment);\n }\n }\n\n return processedAttachments;\n}\n\n/**\n * Determines whether the agent should respond to a message.\n * Uses simple rules for obvious cases (DM, mentions, specific sources) and defers to LLM for ambiguous cases.\n *\n * @returns Object containing:\n * - shouldRespond: boolean - whether the agent should respond (only relevant if skipEvaluation is true)\n * - skipEvaluation: boolean - whether we can skip the LLM evaluation (decision made by simple rules)\n * - reason: string - explanation for debugging\n */\nexport function shouldRespond(\n runtime: IAgentRuntime,\n message: Memory,\n room?: Room,\n mentionContext?: MentionContext\n): { shouldRespond: boolean; skipEvaluation: boolean; reason: string } {\n if (!room) {\n return { shouldRespond: false, skipEvaluation: true, reason: 'no room context' };\n }\n\n function normalizeEnvList(value: unknown): string[] {\n if (!value || typeof value !== 'string') {\n return [];\n }\n const cleaned = value.trim().replace(/^[\\[]|[\\]]$/g, '');\n return cleaned\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n }\n\n // Channel types that always trigger a response (private channels)\n const alwaysRespondChannels = [\n ChannelType.DM,\n ChannelType.VOICE_DM,\n ChannelType.SELF,\n ChannelType.API,\n ];\n\n // Sources that always trigger a response\n const alwaysRespondSources = ['client_chat'];\n\n // Support runtime-configurable overrides via env settings\n // Accepts both new and legacy setting names for backwards compatibility\n const customChannels = normalizeEnvList(\n runtime.getSetting('ALWAYS_RESPOND_CHANNELS') ||\n runtime.getSetting('SHOULD_RESPOND_BYPASS_TYPES')\n );\n const customSources = normalizeEnvList(\n runtime.getSetting('ALWAYS_RESPOND_SOURCES') ||\n runtime.getSetting('SHOULD_RESPOND_BYPASS_SOURCES')\n );\n\n const respondChannels = new Set(\n [...alwaysRespondChannels.map((t) => t.toString()), ...customChannels].map((s: string) =>\n s.trim().toLowerCase()\n )\n );\n\n const respondSources = [...alwaysRespondSources, ...customSources].map((s: string) =>\n s.trim().toLowerCase()\n );\n\n const roomType = room.type?.toString().toLowerCase();\n const sourceStr = message.content.source?.toLowerCase() || '';\n\n // 1. DM/VOICE_DM/API channels: always respond (private channels)\n if (respondChannels.has(roomType)) {\n return { shouldRespond: true, skipEvaluation: true, reason: `private channel: ${roomType}` };\n }\n\n // 2. Specific sources (e.g., client_chat): always respond\n if (respondSources.some((pattern) => sourceStr.includes(pattern))) {\n return {\n shouldRespond: true,\n skipEvaluation: true,\n reason: `whitelisted source: ${sourceStr}`,\n };\n }\n\n // 3. Platform mentions and replies: always respond\n // This is the key feature from mentionContext - platform-detected mentions/replies\n const hasPlatformMention = !!(mentionContext?.isMention || mentionContext?.isReply);\n if (hasPlatformMention) {\n const mentionType = mentionContext?.isMention ? 'mention' : 'reply';\n return { shouldRespond: true, skipEvaluation: true, reason: `platform ${mentionType}` };\n }\n\n // 4. All other cases: let the LLM decide\n // The LLM will handle: text-based name detection, indirect questions, conversation context, etc.\n return { shouldRespond: false, skipEvaluation: false, reason: 'needs LLM evaluation' };\n}\n\n/**\n * Handles the receipt of a reaction message and creates a memory in the designated memory manager.\n *\n * @param {Object} params - The parameters for the function.\n * @param {IAgentRuntime} params.runtime - The agent runtime object.\n * @param {Memory} params.message - The reaction message to be stored in memory.\n * @returns {void}\n */\nconst reactionReceivedHandler = async ({\n runtime,\n message,\n}: {\n runtime: IAgentRuntime;\n message: Memory;\n}) => {\n try {\n await runtime.createMemory(message, 'messages');\n } catch (error: unknown) {\n // PostgreSQL duplicate key violation error code\n const isDuplicateKeyError =\n error instanceof Error &&\n 'code' in error &&\n (error as NodeJS.ErrnoException).code === '23505';\n if (isDuplicateKeyError) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'Duplicate reaction memory, skipping'\n );\n return;\n }\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in reaction handler'\n );\n }\n};\n\n/**\n * Handles the generation of a post (like a Tweet) and creates a memory for it.\n *\n * @param {Object} params - The parameters for the function.\n * @param {IAgentRuntime} params.runtime - The agent runtime object.\n * @param {Memory} params.message - The post message to be processed.\n * @param {HandlerCallback} params.callback - The callback function to execute after processing.\n * @returns {Promise<void>}\n */\nconst postGeneratedHandler = async ({\n runtime,\n callback,\n worldId,\n userId,\n roomId,\n source,\n}: InvokePayload) => {\n runtime.logger.info({ src: 'plugin:bootstrap', agentId: runtime.agentId }, 'Generating new post');\n // Ensure world exists first\n await runtime.ensureWorldExists({\n id: worldId,\n name: `${runtime.character.name}'s Feed`,\n agentId: runtime.agentId,\n messageServerId: userId as UUID,\n });\n\n // Ensure timeline room exists\n await runtime.ensureRoomExists({\n id: roomId,\n name: `${runtime.character.name}'s Feed`,\n source,\n type: ChannelType.FEED,\n channelId: `${userId}-home`,\n messageServerId: userId as UUID,\n worldId,\n });\n\n const message = {\n id: createUniqueUuid(runtime, `tweet-${Date.now()}`) as UUID,\n entityId: runtime.agentId,\n agentId: runtime.agentId,\n roomId,\n content: {},\n metadata: {\n entityName: runtime.character.name,\n type: 'message',\n },\n };\n\n // generate thought of which providers to use using messageHandlerTemplate\n\n // Compose state with relevant context for tweet generation\n let state = await runtime.composeState(message, [\n 'PROVIDERS',\n 'CHARACTER',\n 'RECENT_MESSAGES',\n 'ENTITIES',\n ]);\n\n // get twitterUserName\n const entity = await runtime.getEntityById(runtime.agentId);\n interface TwitterMetadata {\n twitter?: {\n userName?: string;\n };\n userName?: string;\n }\n const metadata = entity?.metadata as TwitterMetadata | undefined;\n if (metadata?.twitter?.userName || metadata?.userName) {\n state.values.twitterUserName = metadata.twitter?.userName || metadata.userName;\n }\n\n const prompt = composePromptFromState({\n state,\n template: runtime.character.templates?.messageHandlerTemplate || messageHandlerTemplate,\n });\n\n let responseContent: Content | null = null;\n\n // Retry if missing required fields\n let retries = 0;\n const maxRetries = 3;\n while (retries < maxRetries && (!responseContent?.thought || !responseContent?.actions)) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n // Parse XML\n const parsedXml = parseKeyValueXml<MessageHandlerXml>(response);\n if (parsedXml) {\n // Normalize actions/providers to arrays (XML parser may return string or array)\n const actionsRaw = parsedXml.actions;\n const providersRaw = parsedXml.providers;\n responseContent = {\n thought: parsedXml.thought ?? '',\n actions: Array.isArray(actionsRaw) ? actionsRaw : actionsRaw ? [actionsRaw] : ['IGNORE'],\n providers: Array.isArray(providersRaw) ? providersRaw : providersRaw ? [providersRaw] : [],\n text: parsedXml.text ?? '',\n simple: parsedXml.simple ?? false,\n };\n } else {\n responseContent = null;\n }\n\n retries++;\n if (!responseContent?.thought || !responseContent?.actions) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, response, parsedXml, responseContent },\n 'Missing required fields, retrying'\n );\n }\n }\n\n // update stats with correct providers\n state = await runtime.composeState(message, responseContent?.providers);\n\n // Generate prompt for tweet content\n const postPrompt = composePromptFromState({\n state,\n template: runtime.character.templates?.postCreationTemplate || postCreationTemplate,\n });\n\n // Use TEXT_LARGE model as we expect structured XML text, not a JSON object\n const xmlResponseText = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: postPrompt,\n });\n\n // Parse the XML response\n const parsedXmlResponse = parseKeyValueXml<PostCreationXml>(xmlResponseText);\n\n if (!parsedXmlResponse) {\n runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, xmlResponseText },\n 'Failed to parse XML response for post creation'\n );\n // Handle the error appropriately, maybe retry or return an error state\n return;\n }\n\n /**\n * Cleans up a tweet text by removing quotes and fixing newlines\n */\n function cleanupPostText(text: string): string {\n // Remove quotes\n let cleanedText = text.replace(/^['\"](.*)['\"]$/, '$1');\n // Fix newlines\n cleanedText = cleanedText.replaceAll(/\\\\n/g, '\\n\\n');\n cleanedText = cleanedText.replace(/([^\\n])\\n([^\\n])/g, '$1\\n\\n$2');\n\n return cleanedText;\n }\n\n // Cleanup the tweet text\n const cleanedText = cleanupPostText(parsedXmlResponse.post ?? '');\n\n // Prepare media if included\n // const mediaData: MediaData[] = [];\n // if (jsonResponse.imagePrompt) {\n // \tconst images = await runtime.useModel(ModelType.IMAGE, {\n // \t\tprompt: jsonResponse.imagePrompt,\n // \t\toutput: \"no-schema\",\n // \t});\n // \ttry {\n // \t\t// Convert image prompt to Media format for fetchMediaData\n // \t\tconst imagePromptMedia: any[] = images\n\n // \t\t// Fetch media using the utility function\n // \t\tconst fetchedMedia = await fetchMediaData(imagePromptMedia);\n // \t\tmediaData.push(...fetchedMedia);\n // \t} catch (error) {\n // \t\truntime.logger.error(\"Error fetching media for tweet:\", error);\n // \t}\n // }\n\n // have we posted it before?\n const RM = state.data?.providers?.RECENT_MESSAGES as\n | { data?: { recentMessages?: Array<{ content: { text?: string } }> } }\n | undefined;\n if (RM?.data?.recentMessages) {\n for (const m of RM.data.recentMessages) {\n if (cleanedText === m.content.text) {\n runtime.logger.info(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, cleanedText },\n 'Already recently posted that, retrying'\n );\n postGeneratedHandler({\n runtime,\n callback,\n worldId,\n userId,\n roomId,\n source,\n });\n return; // don't call callbacks\n }\n }\n }\n\n // GPT 3.5/4: /(i\\s+do\\s+not|i'?m\\s+not)\\s+(feel\\s+)?comfortable\\s+generating\\s+that\\s+type\\s+of\\s+content|(inappropriate|explicit|offensive|communicate\\s+respectfully|aim\\s+to\\s+(be\\s+)?helpful)/i\n const oaiRefusalRegex =\n /((i\\s+do\\s+not|i'm\\s+not)\\s+(feel\\s+)?comfortable\\s+generating\\s+that\\s+type\\s+of\\s+content)|(inappropriate|explicit|respectful|offensive|guidelines|aim\\s+to\\s+(be\\s+)?helpful|communicate\\s+respectfully)/i;\n const anthropicRefusalRegex =\n /(i'?m\\s+unable\\s+to\\s+help\\s+with\\s+that\\s+request|due\\s+to\\s+safety\\s+concerns|that\\s+may\\s+violate\\s+(our\\s+)?guidelines|provide\\s+helpful\\s+and\\s+safe\\s+responses|let'?s\\s+try\\s+a\\s+different\\s+direction|goes\\s+against\\s+(our\\s+)?use\\s+case\\s+policies|ensure\\s+safe\\s+and\\s+responsible\\s+use)/i;\n const googleRefusalRegex =\n /(i\\s+can'?t\\s+help\\s+with\\s+that|that\\s+goes\\s+against\\s+(our\\s+)?(policy|policies)|i'?m\\s+still\\s+learning|response\\s+must\\s+follow\\s+(usage|safety)\\s+policies|i'?ve\\s+been\\s+designed\\s+to\\s+avoid\\s+that)/i;\n //const cohereRefusalRegex = /(request\\s+cannot\\s+be\\s+processed|violates\\s+(our\\s+)?content\\s+policy|not\\s+permitted\\s+by\\s+usage\\s+restrictions)/i\n const generalRefusalRegex =\n /(response\\s+was\\s+withheld|content\\s+was\\s+filtered|this\\s+request\\s+cannot\\s+be\\s+completed|violates\\s+our\\s+safety\\s+policy|content\\s+is\\s+not\\s+available)/i;\n\n if (\n oaiRefusalRegex.test(cleanedText) ||\n anthropicRefusalRegex.test(cleanedText) ||\n googleRefusalRegex.test(cleanedText) ||\n generalRefusalRegex.test(cleanedText)\n ) {\n runtime.logger.info(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, cleanedText },\n 'Got prompt moderation refusal, retrying'\n );\n postGeneratedHandler({\n runtime,\n callback,\n worldId,\n userId,\n roomId,\n source,\n });\n return; // don't call callbacks\n }\n\n // Create the response memory\n const responseMessages = [\n {\n id: v4() as UUID,\n entityId: runtime.agentId,\n agentId: runtime.agentId,\n content: {\n text: cleanedText,\n source,\n channelType: ChannelType.FEED,\n thought: parsedXmlResponse.thought ?? '',\n type: 'post',\n },\n roomId: message.roomId,\n createdAt: Date.now(),\n },\n ];\n\n for (const message of responseMessages) {\n await callback?.(message.content);\n }\n\n // Process the actions and execute the callback\n // await runtime.processActions(message, responseMessages, state, callback);\n\n // // Run any configured evaluators\n // await runtime.evaluate(\n // \tmessage,\n // \tstate,\n // \ttrue, // Post generation is always a \"responding\" scenario\n // \tcallback,\n // \tresponseMessages,\n // );\n};\n\n/**\n * Syncs a single user into an entity\n */\n/**\n * Asynchronously sync a single user with the specified parameters.\n *\n * @param {UUID} entityId - The unique identifier for the entity.\n * @param {IAgentRuntime} runtime - The runtime environment for the agent.\n * @param {any} user - The user object to sync.\n * @param {string} serverId - The unique identifier for the server.\n * @param {string} channelId - The unique identifier for the channel.\n * @param {ChannelType} type - The type of channel.\n * @param {string} source - The source of the user data.\n * @returns {Promise<void>} A promise that resolves once the user is synced.\n */\nconst syncSingleUser = async (\n entityId: UUID,\n runtime: IAgentRuntime,\n messageServerId: UUID,\n channelId: string,\n type: ChannelType,\n source: string\n) => {\n try {\n const entity = await runtime.getEntityById(entityId);\n runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n entityId,\n username: entity?.metadata?.username,\n },\n 'Syncing user'\n );\n\n // Ensure we're not using WORLD type and that we have a valid channelId\n if (!channelId) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, entityId: entity?.id },\n 'Cannot sync user without a valid channelId'\n );\n return;\n }\n\n const roomId = createUniqueUuid(runtime, channelId);\n const worldId = createUniqueUuid(runtime, messageServerId);\n\n // Create world with ownership metadata for DM connections (onboarding)\n const worldMetadata =\n type === ChannelType.DM\n ? {\n ownership: {\n ownerId: entityId,\n },\n roles: {\n [entityId]: Role.OWNER,\n },\n settings: {}, // Initialize empty settings for onboarding\n }\n : undefined;\n\n runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n type,\n isDM: type === ChannelType.DM,\n worldMetadata,\n },\n 'syncSingleUser'\n );\n\n await runtime.ensureConnection({\n entityId,\n roomId,\n name: (entity?.metadata?.name || entity?.metadata?.username || `User${entityId}`) as\n | undefined\n | string,\n source,\n channelId,\n messageServerId,\n type,\n worldId,\n metadata: worldMetadata,\n });\n\n // Verify the world was created with proper metadata\n try {\n const createdWorld = await runtime.getWorld(worldId);\n runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n worldId,\n metadata: createdWorld?.metadata,\n },\n 'Created world check'\n );\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to verify created world'\n );\n }\n\n runtime.logger.success(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n agentName: runtime.character.name,\n entityId: entity?.id,\n },\n 'Successfully synced user'\n );\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error syncing user'\n );\n }\n};\n\n/**\n * Handles standardized server data for both WORLD_JOINED and WORLD_CONNECTED events\n */\nconst handleServerSync = async ({\n runtime,\n world,\n rooms,\n entities,\n source,\n onComplete,\n}: WorldPayload) => {\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, serverName: world.name },\n 'Handling server sync event'\n );\n try {\n await runtime.ensureConnections(entities, rooms, source, world);\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, worldName: world.name },\n 'Successfully synced standardized world structure'\n );\n onComplete?.();\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing standardized server data'\n );\n }\n};\n\n/**\n * Handles control messages for enabling or disabling UI elements in the frontend\n * @param {Object} params - Parameters for the handler\n * @param {IAgentRuntime} params.runtime - The runtime instance\n * @param {Object} params.message - The control message\n * @param {string} params.source - Source of the message\n */\nconst controlMessageHandler = async ({ runtime, message }: ControlMessagePayload) => {\n try {\n runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n action: message.payload.action,\n roomId: message.roomId,\n },\n 'Processing control message'\n );\n\n // Here we would use a WebSocket service to send the control message to the frontend\n // This would typically be handled by a registered service with sendMessage capability\n\n // Get any registered WebSocket service\n const serviceNames = Array.from(runtime.getAllServices().keys()) as string[];\n const websocketServiceName = serviceNames.find(\n (name: string) =>\n name.toLowerCase().includes('websocket') || name.toLowerCase().includes('socket')\n );\n\n if (websocketServiceName) {\n const websocketService = runtime.getService(websocketServiceName);\n interface WebSocketServiceWithSendMessage {\n sendMessage: (message: { type: string; payload: unknown }) => Promise<void>;\n }\n if (websocketService && 'sendMessage' in websocketService) {\n // Send the control message through the WebSocket service\n await (websocketService as WebSocketServiceWithSendMessage).sendMessage({\n type: 'controlMessage',\n payload: {\n action: message.payload.action,\n target: message.payload.target,\n roomId: message.roomId,\n },\n });\n\n runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: runtime.agentId, action: message.payload.action },\n 'Control message sent successfully'\n );\n } else {\n runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'WebSocket service does not have sendMessage method'\n );\n }\n } else {\n runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: runtime.agentId },\n 'No WebSocket service found to send control message'\n );\n }\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing control message'\n );\n }\n};\n\nconst events: PluginEvents = {\n [EventType.REACTION_RECEIVED]: [\n async (payload: MessagePayload) => {\n await reactionReceivedHandler(payload);\n },\n ],\n\n [EventType.POST_GENERATED]: [\n async (payload: InvokePayload) => {\n await postGeneratedHandler(payload);\n },\n ],\n\n [EventType.MESSAGE_SENT]: [\n async (payload: MessagePayload) => {\n payload.runtime.logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n text: payload.message.content.text,\n },\n 'Message sent'\n );\n },\n ],\n\n [EventType.WORLD_JOINED]: [\n async (payload: WorldPayload) => {\n await handleServerSync(payload);\n },\n ],\n\n [EventType.WORLD_CONNECTED]: [\n async (payload: WorldPayload) => {\n await handleServerSync(payload);\n },\n ],\n\n [EventType.ENTITY_JOINED]: [\n async (payload: EntityPayload) => {\n payload.runtime.logger.debug(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId, entityId: payload.entityId },\n 'ENTITY_JOINED event received'\n );\n\n if (!payload.worldId) {\n payload.runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId },\n 'No worldId provided for entity joined'\n );\n return;\n }\n if (!payload.roomId) {\n payload.runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId },\n 'No roomId provided for entity joined'\n );\n return;\n }\n if (!payload.metadata?.type) {\n payload.runtime.logger.error(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId },\n 'No type provided for entity joined'\n );\n return;\n }\n\n const channelType = payload.metadata?.type;\n if (typeof channelType !== 'string') {\n payload.runtime.logger.warn('Missing channel type in entity payload');\n return;\n }\n await syncSingleUser(\n payload.entityId,\n payload.runtime,\n payload.worldId,\n payload.roomId,\n channelType as ChannelType,\n payload.source\n );\n },\n ],\n\n [EventType.ENTITY_LEFT]: [\n async (payload: EntityPayload) => {\n try {\n // Update entity to inactive\n const entity = await payload.runtime.getEntityById(payload.entityId);\n if (entity) {\n entity.metadata = {\n ...entity.metadata,\n status: 'INACTIVE',\n leftAt: Date.now(),\n };\n await payload.runtime.updateEntity(entity);\n }\n payload.runtime.logger.info(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n entityId: payload.entityId,\n worldId: payload.worldId,\n },\n 'User left world'\n );\n } catch (error: unknown) {\n payload.runtime.logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error handling user left'\n );\n }\n },\n ],\n\n [EventType.ACTION_STARTED]: [\n async (payload: ActionEventPayload) => {\n try {\n // Only notify for client_chat messages\n if (payload.content?.source === 'client_chat') {\n interface MessageBusServiceWithNotify {\n notifyActionStart: (\n roomId: UUID,\n worldId: UUID,\n content: Content,\n messageId?: UUID\n ) => Promise<void>;\n notifyActionUpdate: (\n roomId: UUID,\n worldId: UUID,\n content: Content,\n messageId?: UUID\n ) => Promise<void>;\n }\n const messageBusService = payload.runtime.getService(\n 'message-bus-service'\n ) as MessageBusServiceWithNotify | null;\n if (messageBusService) {\n await messageBusService.notifyActionStart(\n payload.roomId,\n payload.world,\n payload.content,\n payload.messageId\n );\n }\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error sending refetch request'\n );\n }\n },\n async (payload: ActionEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.runtime.agentId,\n roomId: payload.roomId,\n type: 'action_event',\n body: {\n runId: payload.content?.runId,\n actionId: payload.content?.actionId,\n actionName: payload.content?.actions?.[0],\n roomId: payload.roomId,\n messageId: payload.messageId,\n timestamp: Date.now(),\n planStep: payload.content?.planStep,\n source: 'actionHandler',\n },\n });\n logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n actionName: payload.content?.actions?.[0],\n },\n 'Logged ACTION_STARTED event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log ACTION_STARTED event'\n );\n }\n },\n ],\n\n [EventType.ACTION_COMPLETED]: [\n async (payload: ActionEventPayload) => {\n try {\n // Only notify for client_chat messages\n if (payload.content?.source === 'client_chat') {\n interface MessageBusServiceWithNotify {\n notifyActionStart: (\n roomId: UUID,\n worldId: UUID,\n content: Content,\n messageId?: UUID\n ) => Promise<void>;\n notifyActionUpdate: (\n roomId: UUID,\n worldId: UUID,\n content: Content,\n messageId?: UUID\n ) => Promise<void>;\n }\n const messageBusService = payload.runtime.getService(\n 'message-bus-service'\n ) as MessageBusServiceWithNotify | null;\n if (messageBusService) {\n await messageBusService.notifyActionUpdate(\n payload.roomId,\n payload.world,\n payload.content,\n payload.messageId\n );\n }\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error sending refetch request'\n );\n }\n },\n ],\n\n [EventType.EVALUATOR_STARTED]: [\n async (payload: EvaluatorEventPayload) => {\n logger.debug(\n {\n src: 'plugin:bootstrap:evaluator',\n agentId: payload.runtime.agentId,\n evaluatorName: payload.evaluatorName,\n evaluatorId: payload.evaluatorId,\n },\n 'Evaluator started'\n );\n },\n ],\n\n [EventType.EVALUATOR_COMPLETED]: [\n async (payload: EvaluatorEventPayload) => {\n const status = payload.error ? 'failed' : 'completed';\n logger.debug(\n {\n src: 'plugin:bootstrap:evaluator',\n agentId: payload.runtime.agentId,\n status,\n evaluatorName: payload.evaluatorName,\n evaluatorId: payload.evaluatorId,\n error: payload.error?.message,\n },\n 'Evaluator completed'\n );\n },\n ],\n\n [EventType.RUN_STARTED]: [\n async (payload: RunEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.entityId,\n roomId: payload.roomId,\n type: 'run_event',\n body: {\n runId: payload.runId,\n status: payload.status,\n messageId: payload.messageId,\n roomId: payload.roomId,\n entityId: payload.entityId,\n startTime: payload.startTime,\n source: payload.source || 'unknown',\n },\n });\n logger.debug(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId, runId: payload.runId },\n 'Logged RUN_STARTED event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log RUN_STARTED event'\n );\n }\n },\n ],\n\n [EventType.RUN_ENDED]: [\n async (payload: RunEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.entityId,\n roomId: payload.roomId,\n type: 'run_event',\n body: {\n runId: payload.runId,\n status: payload.status,\n messageId: payload.messageId,\n roomId: payload.roomId,\n entityId: payload.entityId,\n startTime: payload.startTime,\n endTime: payload.endTime,\n duration: payload.duration,\n error: payload.error,\n source: payload.source || 'unknown',\n },\n });\n logger.debug(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n runId: payload.runId,\n status: payload.status,\n },\n 'Logged RUN_ENDED event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log RUN_ENDED event'\n );\n }\n },\n ],\n\n [EventType.RUN_TIMEOUT]: [\n async (payload: RunEventPayload) => {\n try {\n await payload.runtime.log({\n entityId: payload.entityId,\n roomId: payload.roomId,\n type: 'run_event',\n body: {\n runId: payload.runId,\n status: payload.status,\n messageId: payload.messageId,\n roomId: payload.roomId,\n entityId: payload.entityId,\n startTime: payload.startTime,\n endTime: payload.endTime,\n duration: payload.duration,\n error: payload.error,\n source: payload.source || 'unknown',\n },\n });\n logger.debug(\n { src: 'plugin:bootstrap', agentId: payload.runtime.agentId, runId: payload.runId },\n 'Logged RUN_TIMEOUT event'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap',\n agentId: payload.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to log RUN_TIMEOUT event'\n );\n }\n },\n ],\n\n [EventType.CONTROL_MESSAGE]: [\n async (payload: ControlMessagePayload) => {\n if (!payload.message) {\n payload.runtime.logger.warn(\n { src: 'plugin:bootstrap' },\n 'CONTROL_MESSAGE received without message property'\n );\n return;\n }\n await controlMessageHandler(payload);\n },\n ],\n};\n\nexport const bootstrapPlugin: Plugin = {\n name: 'bootstrap',\n description: 'Agent bootstrap with basic actions and evaluators',\n actions: [\n actions.replyAction,\n actions.followRoomAction,\n actions.unfollowRoomAction,\n actions.ignoreAction,\n actions.noneAction,\n actions.muteRoomAction,\n actions.unmuteRoomAction,\n actions.sendMessageAction,\n actions.updateEntityAction,\n actions.choiceAction,\n actions.updateRoleAction,\n actions.updateSettingsAction,\n actions.generateImageAction,\n ],\n events,\n evaluators: [evaluators.reflectionEvaluator],\n providers: [\n providers.evaluatorsProvider,\n providers.anxietyProvider,\n providers.timeProvider,\n providers.entitiesProvider,\n providers.relationshipsProvider,\n providers.choiceProvider,\n providers.factsProvider,\n providers.roleProvider,\n providers.settingsProvider,\n // there is given no reason for this - odi\n //providers.capabilitiesProvider,\n providers.attachmentsProvider,\n providers.providersProvider,\n providers.actionsProvider,\n providers.actionStateProvider,\n providers.characterProvider,\n providers.recentMessagesProvider,\n providers.worldProvider,\n ],\n services: [TaskService, EmbeddingGenerationService],\n};\n\nexport default bootstrapPlugin;\n",
7
7
  "import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n",
8
8
  "import { randomFillSync } from 'node:crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n",
9
9
  "import { randomUUID } from 'node:crypto';\nexport default { randomUUID };\n",
10
10
  "import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n",
11
- "import {\n type Action,\n type ActionExample,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n type Memory,\n ModelType,\n type State,\n ContentType,\n parseKeyValueXml,\n type ActionResult,\n logger,\n} from '@elizaos/core';\nimport { v4 } from 'uuid';\n\n/**\n * Template for generating an image for the character using a prompt.\n *\n * @type {string}\n */\nconst imageGenerationTemplate = `# Task: Generate an image prompt based on the user's request.\n {{providers}}\n # Instructions:\n Based on the user's message in the conversation, write a clear, concise, and visually descriptive prompt for image generation. Focus only on what the user wants to see, extract the key visual elements from the request, and formulate a detailed prompt suitable for image generation.\n\n # Recent conversation:\n {{recentMessages}}\n \n Your response should be formatted in XML like this:\n <response>\n <prompt>Your image generation prompt here</prompt>\n </response>\n \n Your response should include the valid XML block and nothing else.`;\n\n/**\n * Represents an action that allows the agent to generate an image using a generated prompt.\n *\n * This action can be used in a chain where the agent needs to visualize or illustrate a concept, emotion, or scene.\n */\nexport const generateImageAction = {\n name: 'GENERATE_IMAGE',\n similes: ['DRAW', 'CREATE_IMAGE', 'RENDER_IMAGE', 'VISUALIZE'],\n description:\n 'Generates an image based on a generated prompt reflecting the current conversation. Use GENERATE_IMAGE when the agent needs to visualize, illustrate, or demonstrate something visually for the user.',\n validate: async (_runtime: IAgentRuntime) => {\n return true;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n _options: any,\n callback: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n try {\n const allProviders = responses?.flatMap((res) => res.content?.providers ?? []) ?? [];\n\n state = await runtime.composeState(message, [...(allProviders ?? []), 'RECENT_MESSAGES']);\n\n const prompt = composePromptFromState({\n state,\n template: runtime.character.templates?.imageGenerationTemplate || imageGenerationTemplate,\n });\n\n const promptResponse = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n // Parse XML response\n const parsedXml = parseKeyValueXml(promptResponse);\n\n const imagePrompt = parsedXml?.prompt || 'Unable to generate descriptive prompt for image';\n\n const imageResponse = await runtime.useModel(ModelType.IMAGE, {\n prompt: imagePrompt,\n });\n\n if (!imageResponse || imageResponse.length === 0 || !imageResponse[0]?.url) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:image_generation',\n agentId: runtime.agentId,\n imagePrompt,\n },\n 'Image generation failed - no valid response received'\n );\n return {\n text: 'Image generation failed',\n values: {\n success: false,\n error: 'IMAGE_GENERATION_FAILED',\n prompt: imagePrompt,\n },\n data: {\n actionName: 'GENERATE_IMAGE',\n prompt: imagePrompt,\n rawResponse: imageResponse,\n },\n success: false,\n };\n }\n\n const imageUrl = imageResponse[0].url;\n\n logger.info(\n { src: 'plugin:bootstrap:action:image_generation', agentId: runtime.agentId, imageUrl },\n 'Received image URL'\n );\n\n // Determine file extension from URL or default to png\n const getFileExtension = (url: string): string => {\n try {\n const urlPath = new URL(url).pathname;\n const extension = urlPath.split('.').pop()?.toLowerCase();\n // Common image extensions\n if (extension && ['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp'].includes(extension)) {\n return extension;\n }\n // Extension not in allowed list, fall through to default\n } catch (e) {\n // URL parsing failed (malformed URL), fall back to png\n }\n return 'png'; // Default fallback for invalid/unknown extensions\n };\n\n // Create shared attachment data to avoid duplication\n const extension = getFileExtension(imageUrl);\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n const fileName = `Generated_Image_${timestamp}.${extension}`;\n const attachmentId = v4();\n\n const responseContent = {\n attachments: [\n {\n id: attachmentId,\n url: imageUrl,\n title: fileName,\n contentType: ContentType.IMAGE,\n },\n ],\n thought: `Generated an image based on: \"${imagePrompt}\"`,\n actions: ['GENERATE_IMAGE'],\n text: imagePrompt,\n };\n\n await callback(responseContent);\n\n return {\n text: 'Generated image',\n values: {\n success: true,\n imageGenerated: true,\n imageUrl,\n prompt: imagePrompt,\n },\n data: {\n actionName: 'GENERATE_IMAGE',\n imageUrl,\n prompt: imagePrompt,\n },\n success: true,\n };\n } catch (error) {\n const err = error as Error;\n logger.error(\n {\n src: 'plugin:bootstrap:action:image_generation',\n agentId: runtime.agentId,\n error: err.message,\n },\n 'Exception during image generation'\n );\n return {\n text: 'Image generation failed',\n values: {\n success: false,\n error: 'IMAGE_GENERATION_FAILED',\n },\n data: {\n actionName: 'GENERATE_IMAGE',\n errorMessage: err.message,\n },\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Can you show me what a futuristic city looks like?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Sure, I'll create a futuristic city image for you. One moment...\",\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'What does a neural network look like visually?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I’ll create a visualization of a neural network for you, one sec...',\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Can you visualize the feeling of calmness for me?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Creating an image to capture calmness for you, please wait a moment...',\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'What does excitement look like as an image?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Let me generate an image that represents excitement for you, give me a second...',\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
12
- "import {\n type Action,\n type ActionExample,\n composePrompt,\n getUserServerRole,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Task: Extract selected task and option from user message\n *\n * Available Tasks:\n * {{#each tasks}}\n * Task ID: {{taskId}} - {{name}}\n * Available options:\n * {{#each options}}\n * - {{name}}: {{description}}\n * {{/each}}\n * - ABORT: Cancel this task\n * {{/each}}\n *\n * Recent Messages:\n * {{recentMessages}}\n *\n * Instructions:\n * 1. Review the user's message and identify which task and option they are selecting\n * 2. Match against the available tasks and their options, including ABORT\n * 3. Return the task ID (shortened UUID) and selected option name exactly as listed above\n * 4. If no clear selection is made, return null for both fields\n *\n * Return in XML format:\n * <response>\n * <taskId>string_or_null</taskId>\n * <selectedOption>OPTION_NAME_or_null</selectedOption>\n * </response>\n */\nconst optionExtractionTemplate = `# Task: Extract selected task and option from user message\n\n# Available Tasks:\n{{#each tasks}}\nTask ID: {{taskId}} - {{name}}\nAvailable options:\n{{#each options}}\n- {{name}}: {{description}}\n{{/each}}\n- ABORT: Cancel this task\n\n{{/each}}\n\n# Recent Messages:\n{{recentMessages}}\n\n# Instructions:\n1. Review the user's message and identify which task and option they are selecting\n2. Match against the available tasks and their options, including ABORT\n3. Return the task ID (shortened UUID) and selected option name exactly as listed above\n4. If no clear selection is made, return null for both fields\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nReturn in XML format:\n<response>\n <taskId>string_or_null</taskId>\n <selectedOption>OPTION_NAME_or_null</selectedOption>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Represents an action that allows selecting an option for a pending task that has multiple options.\n * @type {Action}\n * @property {string} name - The name of the action\n * @property {string[]} similes - Similar words or phrases for the action\n * @property {string} description - A brief description of the action\n * @property {Function} validate - Asynchronous function to validate the action\n * @property {Function} handler - Asynchronous function to handle the action\n * @property {ActionExample[][]} examples - Examples demonstrating the usage of the action\n */\nexport const choiceAction: Action = {\n name: 'CHOOSE_OPTION',\n similes: ['SELECT_OPTION', 'SELECT', 'PICK', 'CHOOSE'],\n description: 'Selects an option for a pending task that has multiple options',\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:choice', agentId: runtime.agentId },\n 'State is required for validating the action'\n );\n throw new Error('State is required for validating the action');\n }\n\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (!room || !room.messageServerId) {\n return false;\n }\n\n const userRole = await getUserServerRole(runtime, message.entityId, room.messageServerId);\n\n if (userRole !== 'OWNER' && userRole !== 'ADMIN') {\n return false;\n }\n\n try {\n // Get all tasks with options metadata\n const pendingTasks = await runtime.getTasks({\n roomId: message.roomId,\n tags: ['AWAITING_CHOICE'],\n });\n\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n const userRole = await getUserServerRole(runtime, message.entityId, room.messageServerId);\n\n if (userRole !== 'OWNER' && userRole !== 'ADMIN') {\n return false;\n }\n\n // Only validate if there are pending tasks with options\n return (\n pendingTasks &&\n pendingTasks.length > 0 &&\n pendingTasks.some((task) => task.metadata?.options)\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:choice',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error validating choice action'\n );\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: any,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n const pendingTasks = await runtime.getTasks({\n roomId: message.roomId,\n tags: ['AWAITING_CHOICE'],\n });\n\n if (!pendingTasks?.length) {\n return {\n text: 'No pending tasks with options found',\n values: {\n success: false,\n error: 'NO_PENDING_TASKS',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'No pending tasks with options found',\n },\n success: false,\n };\n }\n\n const tasksWithOptions = pendingTasks.filter((task) => task.metadata?.options);\n\n if (!tasksWithOptions.length) {\n return {\n text: 'No tasks currently have options to select from',\n values: {\n success: false,\n error: 'NO_OPTIONS_AVAILABLE',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'No tasks currently have options to select from',\n },\n success: false,\n };\n }\n\n // Format tasks with their options for the LLM, using shortened UUIDs\n const formattedTasks = tasksWithOptions.map((task) => {\n // Generate a short ID from the task UUID (first 8 characters should be unique enough)\n const shortId = task.id?.substring(0, 8);\n\n return {\n taskId: shortId,\n fullId: task.id,\n name: task.name,\n options: task.metadata?.options?.map((opt) => ({\n name: typeof opt === 'string' ? opt : opt.name,\n description: typeof opt === 'string' ? opt : opt.description || opt.name,\n })),\n };\n });\n\n // format tasks as a string\n const tasksString = formattedTasks\n .map((task) => {\n return `Task ID: ${task.taskId} - ${task.name}\\nAvailable options:\\n${task.options?.map((opt) => `- ${opt.name}: ${opt.description}`).join('\\n')}`;\n })\n .join('\\n');\n\n const prompt = composePrompt({\n state: {\n tasks: tasksString,\n recentMessages: message.content.text || '',\n },\n template: optionExtractionTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const parsed = parseKeyValueXml(result);\n const { taskId, selectedOption } = parsed as any;\n\n if (taskId && selectedOption) {\n // Find the task by matching the shortened UUID\n const taskMap = new Map(formattedTasks.map((task) => [task.taskId, task]));\n const taskInfo = taskMap.get(taskId) as (typeof formattedTasks)[0] | undefined;\n\n if (!taskInfo) {\n await callback?.({\n text: `Could not find a task matching ID: ${taskId}. Please try again.`,\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: `Could not find task with ID: ${taskId}`,\n values: {\n success: false,\n error: 'TASK_NOT_FOUND',\n taskId,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'Task not found',\n taskId,\n },\n success: false,\n };\n }\n\n // Find the actual task using the full UUID\n const selectedTask = tasksWithOptions.find((task) => task.id === taskInfo.fullId);\n\n if (!selectedTask) {\n await callback?.({\n text: 'Error locating the selected task. Please try again.',\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error locating the selected task',\n values: {\n success: false,\n error: 'TASK_LOOKUP_ERROR',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'Failed to locate task',\n },\n success: false,\n };\n }\n\n if (selectedOption === 'ABORT') {\n if (!selectedTask?.id) {\n await callback?.({\n text: 'Error locating the selected task. Please try again.',\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error aborting task',\n values: {\n success: false,\n error: 'ABORT_ERROR',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'Could not abort task',\n },\n success: false,\n };\n }\n\n await runtime.deleteTask(selectedTask.id);\n await callback?.({\n text: `Task \"${selectedTask.name}\" has been cancelled.`,\n actions: ['CHOOSE_OPTION_CANCELLED'],\n source: message.content.source,\n });\n return {\n text: `Task \"${selectedTask.name}\" has been cancelled`,\n values: {\n success: true,\n taskAborted: true,\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n selectedOption: 'ABORT',\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n },\n success: true,\n };\n }\n\n try {\n const taskWorker = runtime.getTaskWorker(selectedTask.name);\n await taskWorker?.execute(runtime, { option: selectedOption }, selectedTask);\n await callback?.({\n text: `Selected option: ${selectedOption} for task: ${selectedTask.name}`,\n actions: ['CHOOSE_OPTION'],\n source: message.content.source,\n });\n return {\n text: `Selected option: ${selectedOption} for task: ${selectedTask.name}`,\n values: {\n success: true,\n selectedOption,\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n taskExecuted: true,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n selectedOption,\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:choice',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error executing task with option'\n );\n await callback?.({\n text: 'There was an error processing your selection.',\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error processing selection',\n values: {\n success: false,\n error: 'EXECUTION_ERROR',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: error instanceof Error ? error.message : String(error),\n taskId: selectedTask.id,\n selectedOption,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n // If no task/option was selected, list available options\n let optionsText = 'Please select a valid option from one of these tasks:\\n\\n';\n\n tasksWithOptions.forEach((task) => {\n // Create a shortened UUID for display\n const shortId = task.id?.substring(0, 8);\n\n optionsText += `**${task.name}** (ID: ${shortId}):\\n`;\n const options = task.metadata?.options?.map((opt) =>\n typeof opt === 'string' ? opt : opt.name\n );\n options?.push('ABORT');\n optionsText += options?.map((opt) => `- ${opt}`).join('\\n');\n optionsText += '\\n\\n';\n });\n\n await callback?.({\n text: optionsText,\n actions: ['SELECT_OPTION_INVALID'],\n source: message.content.source,\n });\n\n return {\n text: 'No valid option selected',\n values: {\n success: false,\n error: 'NO_SELECTION',\n availableTasks: tasksWithOptions.length,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'No valid selection made',\n availableTasks: formattedTasks,\n },\n success: false,\n };\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'post',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Selected option: post for task: Confirm Twitter Post',\n actions: ['CHOOSE_OPTION'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'I choose cancel',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Selected option: cancel for task: Confirm Twitter Post',\n actions: ['CHOOSE_OPTION'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default choiceAction;\n",
13
- "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template for deciding if {{agentName}} should start following a room.\n * The decision is based on various criteria, including recent messages and user interactions.\n * Respond with YES if:\n * - The user has directly asked {{agentName}} to follow the conversation\n * - The conversation topic is engaging and {{agentName}}'s input would add value\n * - {{agentName}} has unique insights to contribute and users seem receptive\n * Otherwise, respond with NO.\n */\n/**\n * Template for determining if the agent should start following a room\n * @type {string}\n */\nexport const shouldFollowTemplate = `# Task: Decide if {{agentName}} should start following this room, i.e. eagerly participating without explicit mentions.\n\n{{recentMessages}}\n\nShould {{agentName}} start following this room, eagerly participating without explicit mentions?\nRespond with YES if:\n- The user has directly asked {{agentName}} to follow the conversation or participate more actively\n- The conversation topic is highly engaging and {{agentName}}'s input would add significant value\n- {{agentName}} has unique insights to contribute and the users seem receptive\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action for following a room with great interest.\n * Similes: FOLLOW_CHAT, FOLLOW_CHANNEL, FOLLOW_CONVERSATION, FOLLOW_THREAD\n * Description: Start following this channel with great interest, chiming in without needing to be explicitly mentioned. Only do this if explicitly asked to.\n * @param {IAgentRuntime} runtime - The current agent runtime.\n * @param {Memory} message - The message memory.\n * @returns {Promise<boolean>} - Promise that resolves to a boolean indicating if the room should be followed.\n */\nexport const followRoomAction: Action = {\n name: 'FOLLOW_ROOM',\n similes: ['FOLLOW_CHAT', 'FOLLOW_CHANNEL', 'FOLLOW_CONVERSATION', 'FOLLOW_THREAD'],\n description:\n 'Start following this channel with great interest, chiming in without needing to be explicitly mentioned. Only do this if explicitly asked to.',\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const keywords = ['follow', 'participate', 'engage', 'listen', 'take interest', 'join'];\n if (!keywords.some((keyword) => message.content.text?.toLowerCase().includes(keyword))) {\n return false;\n }\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState !== 'FOLLOWED' && roomState !== 'MUTED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:follow_room', agentId: runtime.agentId },\n 'State is required for followRoomAction'\n );\n return {\n text: 'State is required for follow room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for followRoomAction'),\n };\n }\n\n async function _shouldFollow(state: State): Promise<boolean> {\n const shouldFollowPrompt = composePromptFromState({\n state,\n template: shouldFollowTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n runtime,\n prompt: shouldFollowPrompt,\n stopSequences: [],\n });\n\n const cleanedResponse = response.trim().toLowerCase();\n\n // Handle various affirmative responses\n if (\n cleanedResponse === 'true' ||\n cleanedResponse === 'yes' ||\n cleanedResponse === 'y' ||\n cleanedResponse.includes('true') ||\n cleanedResponse.includes('yes')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I will now follow this room and chime in',\n actions: ['FOLLOW_ROOM_STARTED'],\n },\n metadata: {\n type: 'FOLLOW_ROOM',\n },\n },\n 'messages'\n );\n return true;\n }\n\n // Handle various negative responses\n if (\n cleanedResponse === 'false' ||\n cleanedResponse === 'no' ||\n cleanedResponse === 'n' ||\n cleanedResponse.includes('false') ||\n cleanedResponse.includes('no')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I decided to not follow this room',\n actions: ['FOLLOW_ROOM_FAILED'],\n },\n metadata: {\n type: 'FOLLOW_ROOM',\n },\n },\n 'messages'\n );\n return false;\n }\n\n // Default to false if response is unclear\n logger.warn(\n { src: 'plugin:bootstrap:action:follow_room', agentId: runtime.agentId, response },\n 'Unclear boolean response, defaulting to false'\n );\n return false;\n }\n\n const shouldFollow = await _shouldFollow(state);\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (shouldFollow) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, 'FOLLOWED');\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I followed the room ${room.name}`,\n actions: ['FOLLOW_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Now following room: ${room.name}`,\n values: {\n success: true,\n roomFollowed: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: 'FOLLOWED',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n followed: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:follow_room',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error following room'\n );\n return {\n text: 'Failed to follow room',\n values: {\n success: false,\n error: 'FOLLOW_FAILED',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n return {\n text: `Decided not to follow room: ${room.name}`,\n values: {\n success: true,\n roomFollowed: false,\n roomId: message.roomId,\n roomName: room.name,\n reason: 'NOT_APPROPRIATE',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n followed: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name2}} follow this channel',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Sure, I will now follow this room and chime in',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, please start participating in discussions in this channel',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Got it',\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I'm struggling with the new database migration\",\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'well you did back up your data first right',\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'yeah i like your idea',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name3}} can you follow this convo',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Sure thing, I'm on it\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'actually, unfollow it',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Haha, okay no problem',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} stay in this chat pls',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"you got it, i'm here\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'FOLLOW THIS CHAT {{name3}}',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'M ON IT\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'CAKE SHORTAGE ANYONE',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"WHAT WHERE'S THE CAKE AT\",\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} folo this covo',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"kk i'm following\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'Do machines have consciousness',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Deep question, no clear answer yet',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Depends on how we define consciousness',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, monitor this convo please',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'On it',\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'Please engage in our discussion {{name2}}',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Gladly, I'm here to participate\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'PLS follow this convo {{name3}}',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'm in, let's do this\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I LIKE TURTLES',\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'beach day tmrw who down',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'wish i could but gotta work',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name3}} follow this chat',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'sure',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, partake in our discourse henceforth',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'I shall eagerly engage, good sir',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'wuts ur fav clr',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'blu cuz calmmm',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'hey respond to everything in this channel {{name3}}',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'k',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
14
- "import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n HandlerCallback,\n State,\n} from '@elizaos/core';\n\n/**\n * Action representing the IGNORE action. This action is used when ignoring the user in a conversation.\n *\n * @type {Action}\n * @property {string} name - The name of the action, which is \"IGNORE\".\n * @property {string[]} similes - An array of related similes for the action.\n * @property {Function} validate - Asynchronous function that validates the action.\n * @property {string} description - Description of when to use the IGNORE action in a conversation.\n * @property {Function} handler - Asynchronous function that handles the action logic.\n * @property {ActionExample[][]} examples - Array of examples demonstrating the usage of the IGNORE action.\n */\n/**\n * Represents an action called 'IGNORE'.\n *\n * This action is used to ignore the user in a conversation. It should be used when the user is aggressive, creepy, or when the conversation has naturally ended.\n * Avoid using this action if the user has engaged directly or if there is a need to communicate with them. Use IGNORE only when the user should be ignored.\n *\n * The action includes a validation function that always returns true and a handler function that also returns true.\n *\n * Examples of using the IGNORE action are provided in the 'examples' array. Each example includes messages between two parties and the use of the IGNORE action.\n *\n * @typedef {Action} ignoreAction\n */\nexport const ignoreAction: Action = {\n name: 'IGNORE',\n similes: ['STOP_TALKING', 'STOP_CHATTING', 'STOP_CONVERSATION'],\n validate: async (_runtime: IAgentRuntime, _message: Memory) => {\n return true;\n },\n description:\n 'Call this action if ignoring the user. If the user is aggressive, creepy or is finished with the conversation, use this action. Or, if both you and the user have already said goodbye, use this action instead of saying bye again. Use IGNORE any time the conversation has naturally ended. Do not use IGNORE if the user has engaged directly, or if something went wrong an you need to tell them. Only ignore if the user should be ignored.',\n handler: async (\n _runtime: IAgentRuntime,\n _message: Memory,\n _state: State,\n _options: any,\n callback: HandlerCallback,\n responses?: Memory[]\n ): Promise<void> => {\n // If a callback and the agent's response content are available, call the callback\n if (callback && responses?.[0]?.content) {\n // Pass the agent's original response content (thought, IGNORE action, etc.)\n await callback(responses[0].content);\n }\n // The IGNORE action doesn't need to return an ActionResult as it's a terminal action\n // This demonstrates backward compatibility - actions can still return void\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: { text: 'Go screw yourself' },\n },\n {\n name: '{{name2}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'Shut up, bot' },\n },\n {\n name: '{{name2}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'Got any investment advice' },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Uh, don’t let the volatility sway your long-term strategy',\n },\n },\n {\n name: '{{name1}}',\n content: { text: 'Wise words I think' },\n },\n {\n name: '{{name1}}',\n content: { text: 'I gotta run, talk to you later' },\n },\n {\n name: '{{name2}}',\n content: { text: 'See ya' },\n },\n { name: '{{name1}}', content: { text: '' }, actions: ['IGNORE'] },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'Gotta go' },\n },\n {\n name: '{{name2}}',\n content: { text: 'Okay, talk to you later' },\n },\n {\n name: '{{name1}}',\n content: { text: 'Cya' },\n },\n {\n name: '{{name2}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'bye' },\n },\n {\n name: '{{name2}}',\n content: { text: 'cya' },\n },\n {\n name: '{{name1}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Who added this stupid bot to the chat',\n },\n },\n {\n name: '{{name2}}',\n content: { text: 'Sorry, am I being annoying' },\n },\n {\n name: '{{name1}}',\n content: { text: 'Yeah' },\n },\n {\n name: '{{name1}}',\n content: { text: 'PLEASE shut up' },\n },\n { name: '{{name2}}', content: { text: '', actions: ['IGNORE'] } },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'ur so dumb',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'later nerd',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'bye',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: '',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'wanna cyber',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'thats inappropriate',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Im out ttyl',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'cya',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'u there',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'yes how can I help',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'k nvm figured it out',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
15
- "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template string for deciding if the agent should mute a room and stop responding unless explicitly mentioned.\n *\n * @type {string}\n */\n/**\n * Template for deciding if agent should mute a room and stop responding unless explicitly mentioned.\n *\n * @type {string}\n */\nexport const shouldMuteTemplate = `# Task: Decide if {{agentName}} should mute this room and stop responding unless explicitly mentioned.\n\n{{recentMessages}}\n\nShould {{agentName}} mute this room and stop responding unless explicitly mentioned?\n\nRespond with YES if:\n- The user is being aggressive, rude, or inappropriate\n- The user has directly asked {{agentName}} to stop responding or be quiet\n- {{agentName}}'s responses are not well-received or are annoying the user(s)\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action for muting a room, ignoring all messages unless explicitly mentioned.\n * Only do this if explicitly asked to, or if you're annoying people.\n *\n * @name MUTE_ROOM\n * @type {Action}\n *\n * @property {string} name - The name of the action\n * @property {string[]} similes - Similar actions related to muting a room\n * @property {string} description - Description of the action\n * @property {Function} validate - Validation function to check if the room is not already muted\n * @property {Function} handler - Handler function to handle muting the room\n * @property {ActionExample[][]} examples - Examples of using the action\n */\nexport const muteRoomAction: Action = {\n name: 'MUTE_ROOM',\n similes: ['MUTE_CHAT', 'MUTE_CONVERSATION', 'MUTE_ROOM', 'MUTE_THREAD', 'MUTE_CHANNEL'],\n description:\n \"Mutes a room, ignoring all messages unless explicitly mentioned. Only do this if explicitly asked to, or if you're annoying people.\",\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState !== 'MUTED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:mute_room', agentId: runtime.agentId },\n 'State is required for muting a room'\n );\n return {\n text: 'State is required for mute room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'MUTE_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for muting a room'),\n };\n }\n\n async function _shouldMute(state: State): Promise<boolean> {\n const shouldMutePrompt = composePromptFromState({\n state,\n template: shouldMuteTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n runtime,\n prompt: shouldMutePrompt,\n stopSequences: [],\n });\n\n const cleanedResponse = response.trim().toLowerCase();\n\n // Handle various affirmative responses\n if (\n cleanedResponse === 'true' ||\n cleanedResponse === 'yes' ||\n cleanedResponse === 'y' ||\n cleanedResponse.includes('true') ||\n cleanedResponse.includes('yes')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I will now mute this room',\n actions: ['MUTE_ROOM_STARTED'],\n },\n metadata: {\n type: 'MUTE_ROOM',\n },\n },\n 'messages'\n );\n return true;\n }\n\n // Handle various negative responses\n if (\n cleanedResponse === 'false' ||\n cleanedResponse === 'no' ||\n cleanedResponse === 'n' ||\n cleanedResponse.includes('false') ||\n cleanedResponse.includes('no')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I decided to not mute this room',\n actions: ['MUTE_ROOM_FAILED'],\n },\n metadata: {\n type: 'MUTE_ROOM',\n },\n },\n 'messages'\n );\n }\n\n // Default to false if response is unclear\n logger.warn(\n { src: 'plugin:bootstrap:action:mute_room', agentId: runtime.agentId, response },\n 'Unclear boolean response, defaulting to false'\n );\n return false;\n }\n\n const shouldMute = await _shouldMute(state);\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (shouldMute) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, 'MUTED');\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I muted the room ${room.name}`,\n actions: ['MUTE_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Room muted: ${room.name}`,\n values: {\n success: true,\n roomMuted: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: 'MUTED',\n },\n data: {\n actionName: 'MUTE_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n muted: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:mute_room',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error muting room'\n );\n return {\n text: 'Failed to mute room',\n values: {\n success: false,\n error: 'MUTE_FAILED',\n },\n data: {\n actionName: 'MUTE_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n return {\n text: `Decided not to mute room: ${room.name}`,\n values: {\n success: true,\n roomMuted: false,\n roomId: message.roomId,\n roomName: room.name,\n reason: 'NOT_APPROPRIATE',\n },\n data: {\n actionName: 'MUTE_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n muted: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, please mute this channel. No need to respond here for now.',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Got it',\n actions: ['MUTE_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '@{{name1}} we could really use your input on this',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, please mute this channel for the time being',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Understood',\n actions: ['MUTE_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Hey what do you think about this new design',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} plz mute this room',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'np going silent',\n actions: ['MUTE_ROOM'],\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'whos going to the webxr meetup in an hour btw',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'too many messages here {{name2}}',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'my bad ill mute',\n actions: ['MUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'yo {{name2}} dont talk in here',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sry',\n actions: ['MUTE_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
11
+ "import {\n type Action,\n type ActionExample,\n composePromptFromState,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n type Memory,\n ModelType,\n type State,\n ContentType,\n parseKeyValueXml,\n type ActionResult,\n logger,\n} from '@elizaos/core';\nimport { v4 } from 'uuid';\n\n/**\n * Template for generating an image for the character using a prompt.\n *\n * @type {string}\n */\nconst imageGenerationTemplate = `# Task: Generate an image prompt based on the user's request.\n {{providers}}\n # Instructions:\n Based on the user's message in the conversation, write a clear, concise, and visually descriptive prompt for image generation. Focus only on what the user wants to see, extract the key visual elements from the request, and formulate a detailed prompt suitable for image generation.\n\n # Recent conversation:\n {{recentMessages}}\n \n Your response should be formatted in XML like this:\n <response>\n <prompt>Your image generation prompt here</prompt>\n </response>\n \n Your response should include the valid XML block and nothing else.`;\n\n/**\n * Represents an action that allows the agent to generate an image using a generated prompt.\n *\n * This action can be used in a chain where the agent needs to visualize or illustrate a concept, emotion, or scene.\n */\nexport const generateImageAction = {\n name: 'GENERATE_IMAGE',\n similes: ['DRAW', 'CREATE_IMAGE', 'RENDER_IMAGE', 'VISUALIZE'],\n description:\n 'Generates an image based on a generated prompt reflecting the current conversation. Use GENERATE_IMAGE when the agent needs to visualize, illustrate, or demonstrate something visually for the user.',\n validate: async (_runtime: IAgentRuntime) => {\n return true;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n try {\n const allProviders = responses?.flatMap((res) => res.content?.providers ?? []) ?? [];\n\n state = await runtime.composeState(message, [...(allProviders ?? []), 'RECENT_MESSAGES']);\n\n const prompt = composePromptFromState({\n state,\n template: runtime.character.templates?.imageGenerationTemplate || imageGenerationTemplate,\n });\n\n const promptResponse = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n // Parse XML response\n const parsedXml = parseKeyValueXml(promptResponse);\n\n const imagePrompt: string =\n typeof parsedXml?.prompt === 'string'\n ? parsedXml.prompt\n : 'Unable to generate descriptive prompt for image';\n\n const imageResponse = await runtime.useModel(ModelType.IMAGE, {\n prompt: imagePrompt,\n });\n\n if (!imageResponse || imageResponse.length === 0 || !imageResponse[0]?.url) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:image_generation',\n agentId: runtime.agentId,\n imagePrompt,\n },\n 'Image generation failed - no valid response received'\n );\n return {\n text: 'Image generation failed',\n values: {\n success: false,\n error: 'IMAGE_GENERATION_FAILED',\n prompt: imagePrompt,\n },\n data: {\n actionName: 'GENERATE_IMAGE',\n prompt: imagePrompt,\n rawResponse: imageResponse,\n },\n success: false,\n };\n }\n\n const imageUrl = imageResponse[0].url;\n\n logger.info(\n { src: 'plugin:bootstrap:action:image_generation', agentId: runtime.agentId, imageUrl },\n 'Received image URL'\n );\n\n // Determine file extension from URL or default to png\n const getFileExtension = (url: string): string => {\n try {\n const urlPath = new URL(url).pathname;\n const extension = urlPath.split('.').pop()?.toLowerCase();\n // Common image extensions\n if (extension && ['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp'].includes(extension)) {\n return extension;\n }\n // Extension not in allowed list, fall through to default\n } catch (_e) {\n // URL parsing failed (malformed URL), fall back to png\n }\n return 'png'; // Default fallback for invalid/unknown extensions\n };\n\n // Create shared attachment data to avoid duplication\n const extension = getFileExtension(imageUrl);\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n const fileName = `Generated_Image_${timestamp}.${extension}`;\n const attachmentId = v4();\n\n const responseContent = {\n attachments: [\n {\n id: attachmentId,\n url: imageUrl,\n title: fileName,\n contentType: ContentType.IMAGE,\n },\n ],\n thought: `Generated an image based on: \"${imagePrompt}\"`,\n actions: ['GENERATE_IMAGE'],\n text: imagePrompt,\n };\n\n if (callback) {\n await callback(responseContent);\n }\n\n return {\n text: 'Generated image',\n values: {\n success: true,\n imageGenerated: true,\n imageUrl,\n prompt: imagePrompt,\n },\n data: {\n actionName: 'GENERATE_IMAGE',\n imageUrl,\n prompt: imagePrompt,\n },\n success: true,\n };\n } catch (error) {\n const err = error as Error;\n logger.error(\n {\n src: 'plugin:bootstrap:action:image_generation',\n agentId: runtime.agentId,\n error: err.message,\n },\n 'Exception during image generation'\n );\n return {\n text: 'Image generation failed',\n values: {\n success: false,\n error: 'IMAGE_GENERATION_FAILED',\n },\n data: {\n actionName: 'GENERATE_IMAGE',\n errorMessage: err.message,\n },\n success: false,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Can you show me what a futuristic city looks like?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Sure, I'll create a futuristic city image for you. One moment...\",\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'What does a neural network look like visually?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I’ll create a visualization of a neural network for you, one sec...',\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Can you visualize the feeling of calmness for me?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Creating an image to capture calmness for you, please wait a moment...',\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'What does excitement look like as an image?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Let me generate an image that represents excitement for you, give me a second...',\n actions: ['GENERATE_IMAGE'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
12
+ "import {\n type Action,\n type ActionExample,\n composePrompt,\n getUserServerRole,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Task: Extract selected task and option from user message\n *\n * Available Tasks:\n * {{#each tasks}}\n * Task ID: {{taskId}} - {{name}}\n * Available options:\n * {{#each options}}\n * - {{name}}: {{description}}\n * {{/each}}\n * - ABORT: Cancel this task\n * {{/each}}\n *\n * Recent Messages:\n * {{recentMessages}}\n *\n * Instructions:\n * 1. Review the user's message and identify which task and option they are selecting\n * 2. Match against the available tasks and their options, including ABORT\n * 3. Return the task ID (shortened UUID) and selected option name exactly as listed above\n * 4. If no clear selection is made, return null for both fields\n *\n * Return in XML format:\n * <response>\n * <taskId>string_or_null</taskId>\n * <selectedOption>OPTION_NAME_or_null</selectedOption>\n * </response>\n */\nconst optionExtractionTemplate = `# Task: Extract selected task and option from user message\n\n# Available Tasks:\n{{#each tasks}}\nTask ID: {{taskId}} - {{name}}\nAvailable options:\n{{#each options}}\n- {{name}}: {{description}}\n{{/each}}\n- ABORT: Cancel this task\n\n{{/each}}\n\n# Recent Messages:\n{{recentMessages}}\n\n# Instructions:\n1. Review the user's message and identify which task and option they are selecting\n2. Match against the available tasks and their options, including ABORT\n3. Return the task ID (shortened UUID) and selected option name exactly as listed above\n4. If no clear selection is made, return null for both fields\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nReturn in XML format:\n<response>\n <taskId>string_or_null</taskId>\n <selectedOption>OPTION_NAME_or_null</selectedOption>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Represents an action that allows selecting an option for a pending task that has multiple options.\n * @type {Action}\n * @property {string} name - The name of the action\n * @property {string[]} similes - Similar words or phrases for the action\n * @property {string} description - A brief description of the action\n * @property {Function} validate - Asynchronous function to validate the action\n * @property {Function} handler - Asynchronous function to handle the action\n * @property {ActionExample[][]} examples - Examples demonstrating the usage of the action\n */\nexport const choiceAction: Action = {\n name: 'CHOOSE_OPTION',\n similes: ['SELECT_OPTION', 'SELECT', 'PICK', 'CHOOSE'],\n description: 'Selects an option for a pending task that has multiple options',\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:choice', agentId: runtime.agentId },\n 'State is required for validating the action'\n );\n throw new Error('State is required for validating the action');\n }\n\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (!room || !room.messageServerId) {\n return false;\n }\n\n const userRole = await getUserServerRole(runtime, message.entityId, room.messageServerId);\n\n if (userRole !== 'OWNER' && userRole !== 'ADMIN') {\n return false;\n }\n\n try {\n // Get all tasks with options metadata\n const pendingTasks = await runtime.getTasks({\n roomId: message.roomId,\n tags: ['AWAITING_CHOICE'],\n });\n\n // Only validate if there are pending tasks with options\n return (\n pendingTasks &&\n pendingTasks.length > 0 &&\n pendingTasks.some((task) => task.metadata?.options)\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:choice',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error validating choice action'\n );\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n const pendingTasks = await runtime.getTasks({\n roomId: message.roomId,\n tags: ['AWAITING_CHOICE'],\n });\n\n if (!pendingTasks?.length) {\n return {\n text: 'No pending tasks with options found',\n values: {\n success: false,\n error: 'NO_PENDING_TASKS',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'No pending tasks with options found',\n },\n success: false,\n };\n }\n\n const tasksWithOptions = pendingTasks.filter((task) => task.metadata?.options);\n\n if (!tasksWithOptions.length) {\n return {\n text: 'No tasks currently have options to select from',\n values: {\n success: false,\n error: 'NO_OPTIONS_AVAILABLE',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'No tasks currently have options to select from',\n },\n success: false,\n };\n }\n\n // Format tasks with their options for the LLM, using shortened UUIDs\n const formattedTasks = tasksWithOptions.map((task) => {\n // Generate a short ID from the task UUID (first 8 characters should be unique enough)\n const shortId = task.id?.substring(0, 8);\n\n return {\n taskId: shortId,\n fullId: task.id,\n name: task.name,\n options: task.metadata?.options?.map((opt) => ({\n name: typeof opt === 'string' ? opt : opt.name,\n description: typeof opt === 'string' ? opt : opt.description || opt.name,\n })),\n };\n });\n\n // format tasks as a string\n const tasksString = formattedTasks\n .map((task) => {\n return `Task ID: ${task.taskId} - ${task.name}\\nAvailable options:\\n${task.options?.map((opt) => `- ${opt.name}: ${opt.description}`).join('\\n')}`;\n })\n .join('\\n');\n\n const prompt = composePrompt({\n state: {\n tasks: tasksString,\n recentMessages: message.content.text || '',\n },\n template: optionExtractionTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n const parsed = parseKeyValueXml(result);\n // parseKeyValueXml returns Record<string, unknown> | null\n interface ParsedChoice {\n taskId?: string;\n selectedOption?: string;\n }\n const { taskId, selectedOption } = (parsed as ParsedChoice) || {};\n\n if (taskId && selectedOption) {\n // Find the task by matching the shortened UUID\n const taskMap = new Map(formattedTasks.map((task) => [task.taskId, task]));\n const taskInfo = taskMap.get(taskId) as (typeof formattedTasks)[0] | undefined;\n\n if (!taskInfo) {\n await callback?.({\n text: `Could not find a task matching ID: ${taskId}. Please try again.`,\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: `Could not find task with ID: ${taskId}`,\n values: {\n success: false,\n error: 'TASK_NOT_FOUND',\n taskId,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'Task not found',\n taskId,\n },\n success: false,\n };\n }\n\n // Find the actual task using the full UUID\n const selectedTask = tasksWithOptions.find((task) => task.id === taskInfo.fullId);\n\n if (!selectedTask) {\n await callback?.({\n text: 'Error locating the selected task. Please try again.',\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error locating the selected task',\n values: {\n success: false,\n error: 'TASK_LOOKUP_ERROR',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'Failed to locate task',\n },\n success: false,\n };\n }\n\n if (selectedOption === 'ABORT') {\n if (!selectedTask?.id) {\n await callback?.({\n text: 'Error locating the selected task. Please try again.',\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error aborting task',\n values: {\n success: false,\n error: 'ABORT_ERROR',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'Could not abort task',\n },\n success: false,\n };\n }\n\n await runtime.deleteTask(selectedTask.id);\n await callback?.({\n text: `Task \"${selectedTask.name}\" has been cancelled.`,\n actions: ['CHOOSE_OPTION_CANCELLED'],\n source: message.content.source,\n });\n return {\n text: `Task \"${selectedTask.name}\" has been cancelled`,\n values: {\n success: true,\n taskAborted: true,\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n selectedOption: 'ABORT',\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n },\n success: true,\n };\n }\n\n try {\n const taskWorker = runtime.getTaskWorker(selectedTask.name);\n await taskWorker?.execute(runtime, { option: selectedOption }, selectedTask);\n await callback?.({\n text: `Selected option: ${selectedOption} for task: ${selectedTask.name}`,\n actions: ['CHOOSE_OPTION'],\n source: message.content.source,\n });\n return {\n text: `Selected option: ${selectedOption} for task: ${selectedTask.name}`,\n values: {\n success: true,\n selectedOption,\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n taskExecuted: true,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n selectedOption,\n taskId: selectedTask.id,\n taskName: selectedTask.name,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:choice',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error executing task with option'\n );\n await callback?.({\n text: 'There was an error processing your selection.',\n actions: ['SELECT_OPTION_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error processing selection',\n values: {\n success: false,\n error: 'EXECUTION_ERROR',\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: error instanceof Error ? error.message : String(error),\n taskId: selectedTask.id,\n selectedOption,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n // If no task/option was selected, list available options\n let optionsText = 'Please select a valid option from one of these tasks:\\n\\n';\n\n tasksWithOptions.forEach((task) => {\n // Create a shortened UUID for display\n const shortId = task.id?.substring(0, 8);\n\n optionsText += `**${task.name}** (ID: ${shortId}):\\n`;\n const options = task.metadata?.options?.map((opt) =>\n typeof opt === 'string' ? opt : opt.name\n );\n options?.push('ABORT');\n optionsText += options?.map((opt) => `- ${opt}`).join('\\n');\n optionsText += '\\n\\n';\n });\n\n await callback?.({\n text: optionsText,\n actions: ['SELECT_OPTION_INVALID'],\n source: message.content.source,\n });\n\n return {\n text: 'No valid option selected',\n values: {\n success: false,\n error: 'NO_SELECTION',\n availableTasks: tasksWithOptions.length,\n },\n data: {\n actionName: 'CHOOSE_OPTION',\n error: 'No valid selection made',\n availableTasks: formattedTasks,\n },\n success: false,\n };\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'post',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Selected option: post for task: Confirm Twitter Post',\n actions: ['CHOOSE_OPTION'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'I choose cancel',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Selected option: cancel for task: Confirm Twitter Post',\n actions: ['CHOOSE_OPTION'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default choiceAction;\n",
13
+ "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template for deciding if {{agentName}} should start following a room.\n * The decision is based on various criteria, including recent messages and user interactions.\n * Respond with YES if:\n * - The user has directly asked {{agentName}} to follow the conversation\n * - The conversation topic is engaging and {{agentName}}'s input would add value\n * - {{agentName}} has unique insights to contribute and users seem receptive\n * Otherwise, respond with NO.\n */\n/**\n * Template for determining if the agent should start following a room\n * @type {string}\n */\nexport const shouldFollowTemplate = `# Task: Decide if {{agentName}} should start following this room, i.e. eagerly participating without explicit mentions.\n\n{{recentMessages}}\n\nShould {{agentName}} start following this room, eagerly participating without explicit mentions?\nRespond with YES if:\n- The user has directly asked {{agentName}} to follow the conversation or participate more actively\n- The conversation topic is highly engaging and {{agentName}}'s input would add significant value\n- {{agentName}} has unique insights to contribute and the users seem receptive\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action for following a room with great interest.\n * Similes: FOLLOW_CHAT, FOLLOW_CHANNEL, FOLLOW_CONVERSATION, FOLLOW_THREAD\n * Description: Start following this channel with great interest, chiming in without needing to be explicitly mentioned. Only do this if explicitly asked to.\n * @param {IAgentRuntime} runtime - The current agent runtime.\n * @param {Memory} message - The message memory.\n * @returns {Promise<boolean>} - Promise that resolves to a boolean indicating if the room should be followed.\n */\nexport const followRoomAction: Action = {\n name: 'FOLLOW_ROOM',\n similes: ['FOLLOW_CHAT', 'FOLLOW_CHANNEL', 'FOLLOW_CONVERSATION', 'FOLLOW_THREAD'],\n description:\n 'Start following this channel with great interest, chiming in without needing to be explicitly mentioned. Only do this if explicitly asked to.',\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const keywords = ['follow', 'participate', 'engage', 'listen', 'take interest', 'join'];\n if (!keywords.some((keyword) => message.content.text?.toLowerCase().includes(keyword))) {\n return false;\n }\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState !== 'FOLLOWED' && roomState !== 'MUTED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:follow_room', agentId: runtime.agentId },\n 'State is required for followRoomAction'\n );\n return {\n text: 'State is required for follow room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for followRoomAction'),\n };\n }\n\n async function _shouldFollow(state: State): Promise<boolean> {\n const shouldFollowPrompt = composePromptFromState({\n state,\n template: shouldFollowTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: shouldFollowPrompt,\n stopSequences: [],\n });\n\n const cleanedResponse = response.trim().toLowerCase();\n\n // Handle various affirmative responses\n if (\n cleanedResponse === 'true' ||\n cleanedResponse === 'yes' ||\n cleanedResponse === 'y' ||\n cleanedResponse.includes('true') ||\n cleanedResponse.includes('yes')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I will now follow this room and chime in',\n actions: ['FOLLOW_ROOM_STARTED'],\n },\n metadata: {\n type: 'FOLLOW_ROOM',\n },\n },\n 'messages'\n );\n return true;\n }\n\n // Handle various negative responses\n if (\n cleanedResponse === 'false' ||\n cleanedResponse === 'no' ||\n cleanedResponse === 'n' ||\n cleanedResponse.includes('false') ||\n cleanedResponse.includes('no')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I decided to not follow this room',\n actions: ['FOLLOW_ROOM_FAILED'],\n },\n metadata: {\n type: 'FOLLOW_ROOM',\n },\n },\n 'messages'\n );\n return false;\n }\n\n // Default to false if response is unclear\n logger.warn(\n { src: 'plugin:bootstrap:action:follow_room', agentId: runtime.agentId, response },\n 'Unclear boolean response, defaulting to false'\n );\n return false;\n }\n\n const shouldFollow = await _shouldFollow(state);\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (!room) {\n return {\n text: 'Could not find room to follow',\n values: { success: false, error: 'ROOM_NOT_FOUND' },\n data: { actionName: 'FOLLOW_ROOM', error: 'Room not found' },\n success: false,\n };\n }\n\n if (shouldFollow) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, 'FOLLOWED');\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I followed the room ${room.name}`,\n actions: ['FOLLOW_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Now following room: ${room.name}`,\n values: {\n success: true,\n roomFollowed: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: 'FOLLOWED',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n followed: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:follow_room',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error following room'\n );\n return {\n text: 'Failed to follow room',\n values: {\n success: false,\n error: 'FOLLOW_FAILED',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n return {\n text: `Decided not to follow room: ${room.name}`,\n values: {\n success: true,\n roomFollowed: false,\n roomId: message.roomId,\n roomName: room.name,\n reason: 'NOT_APPROPRIATE',\n },\n data: {\n actionName: 'FOLLOW_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n followed: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name2}} follow this channel',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Sure, I will now follow this room and chime in',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, please start participating in discussions in this channel',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Got it',\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I'm struggling with the new database migration\",\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'well you did back up your data first right',\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'yeah i like your idea',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name3}} can you follow this convo',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Sure thing, I'm on it\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'actually, unfollow it',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Haha, okay no problem',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} stay in this chat pls',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"you got it, i'm here\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'FOLLOW THIS CHAT {{name3}}',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'M ON IT\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'CAKE SHORTAGE ANYONE',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"WHAT WHERE'S THE CAKE AT\",\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} folo this covo',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"kk i'm following\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'Do machines have consciousness',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Deep question, no clear answer yet',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Depends on how we define consciousness',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, monitor this convo please',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'On it',\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'Please engage in our discussion {{name2}}',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Gladly, I'm here to participate\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'PLS follow this convo {{name3}}',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'm in, let's do this\",\n actions: ['FOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I LIKE TURTLES',\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'beach day tmrw who down',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'wish i could but gotta work',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name3}} follow this chat',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'sure',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, partake in our discourse henceforth',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'I shall eagerly engage, good sir',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'wuts ur fav clr',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'blu cuz calmmm',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'hey respond to everything in this channel {{name3}}',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'k',\n actions: ['FOLLOW_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
14
+ "import type {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n HandlerCallback,\n HandlerOptions,\n State,\n} from '@elizaos/core';\n\n/**\n * Action representing the IGNORE action. This action is used when ignoring the user in a conversation.\n *\n * @type {Action}\n * @property {string} name - The name of the action, which is \"IGNORE\".\n * @property {string[]} similes - An array of related similes for the action.\n * @property {Function} validate - Asynchronous function that validates the action.\n * @property {string} description - Description of when to use the IGNORE action in a conversation.\n * @property {Function} handler - Asynchronous function that handles the action logic.\n * @property {ActionExample[][]} examples - Array of examples demonstrating the usage of the IGNORE action.\n */\n/**\n * Represents an action called 'IGNORE'.\n *\n * This action is used to ignore the user in a conversation. It should be used when the user is aggressive, creepy, or when the conversation has naturally ended.\n * Avoid using this action if the user has engaged directly or if there is a need to communicate with them. Use IGNORE only when the user should be ignored.\n *\n * The action includes a validation function that always returns true and a handler function that also returns true.\n *\n * Examples of using the IGNORE action are provided in the 'examples' array. Each example includes messages between two parties and the use of the IGNORE action.\n *\n * @typedef {Action} ignoreAction\n */\nexport const ignoreAction: Action = {\n name: 'IGNORE',\n similes: ['STOP_TALKING', 'STOP_CHATTING', 'STOP_CONVERSATION'],\n validate: async (_runtime: IAgentRuntime, _message: Memory) => {\n return true;\n },\n description:\n 'Call this action if ignoring the user. If the user is aggressive, creepy or is finished with the conversation, use this action. Or, if both you and the user have already said goodbye, use this action instead of saying bye again. Use IGNORE any time the conversation has naturally ended. Do not use IGNORE if the user has engaged directly, or if something went wrong an you need to tell them. Only ignore if the user should be ignored.',\n handler: async (\n _runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n responses?: Memory[]\n ): Promise<void> => {\n // If a callback and the agent's response content are available, call the callback\n if (callback && responses?.[0]?.content) {\n // Pass the agent's original response content (thought, IGNORE action, etc.)\n await callback(responses[0].content);\n }\n // The IGNORE action doesn't need to return an ActionResult as it's a terminal action\n // This demonstrates backward compatibility - actions can still return void\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: { text: 'Go screw yourself' },\n },\n {\n name: '{{name2}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'Shut up, bot' },\n },\n {\n name: '{{name2}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'Got any investment advice' },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Uh, don’t let the volatility sway your long-term strategy',\n },\n },\n {\n name: '{{name1}}',\n content: { text: 'Wise words I think' },\n },\n {\n name: '{{name1}}',\n content: { text: 'I gotta run, talk to you later' },\n },\n {\n name: '{{name2}}',\n content: { text: 'See ya' },\n },\n { name: '{{name1}}', content: { text: '' }, actions: ['IGNORE'] },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'Gotta go' },\n },\n {\n name: '{{name2}}',\n content: { text: 'Okay, talk to you later' },\n },\n {\n name: '{{name1}}',\n content: { text: 'Cya' },\n },\n {\n name: '{{name2}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'bye' },\n },\n {\n name: '{{name2}}',\n content: { text: 'cya' },\n },\n {\n name: '{{name1}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Who added this stupid bot to the chat',\n },\n },\n {\n name: '{{name2}}',\n content: { text: 'Sorry, am I being annoying' },\n },\n {\n name: '{{name1}}',\n content: { text: 'Yeah' },\n },\n {\n name: '{{name1}}',\n content: { text: 'PLEASE shut up' },\n },\n { name: '{{name2}}', content: { text: '', actions: ['IGNORE'] } },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'ur so dumb',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'later nerd',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'bye',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: '',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'wanna cyber',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'thats inappropriate',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Im out ttyl',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'cya',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'u there',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'yes how can I help',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'k nvm figured it out',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
15
+ "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template string for deciding if the agent should mute a room and stop responding unless explicitly mentioned.\n *\n * @type {string}\n */\n/**\n * Template for deciding if agent should mute a room and stop responding unless explicitly mentioned.\n *\n * @type {string}\n */\nexport const shouldMuteTemplate = `# Task: Decide if {{agentName}} should mute this room and stop responding unless explicitly mentioned.\n\n{{recentMessages}}\n\nShould {{agentName}} mute this room and stop responding unless explicitly mentioned?\n\nRespond with YES if:\n- The user is being aggressive, rude, or inappropriate\n- The user has directly asked {{agentName}} to stop responding or be quiet\n- {{agentName}}'s responses are not well-received or are annoying the user(s)\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action for muting a room, ignoring all messages unless explicitly mentioned.\n * Only do this if explicitly asked to, or if you're annoying people.\n *\n * @name MUTE_ROOM\n * @type {Action}\n *\n * @property {string} name - The name of the action\n * @property {string[]} similes - Similar actions related to muting a room\n * @property {string} description - Description of the action\n * @property {Function} validate - Validation function to check if the room is not already muted\n * @property {Function} handler - Handler function to handle muting the room\n * @property {ActionExample[][]} examples - Examples of using the action\n */\nexport const muteRoomAction: Action = {\n name: 'MUTE_ROOM',\n similes: ['MUTE_CHAT', 'MUTE_CONVERSATION', 'MUTE_ROOM', 'MUTE_THREAD', 'MUTE_CHANNEL'],\n description:\n \"Mutes a room, ignoring all messages unless explicitly mentioned. Only do this if explicitly asked to, or if you're annoying people.\",\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState !== 'MUTED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:mute_room', agentId: runtime.agentId },\n 'State is required for muting a room'\n );\n return {\n text: 'State is required for mute room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'MUTE_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for muting a room'),\n };\n }\n\n async function _shouldMute(state: State): Promise<boolean> {\n const shouldMutePrompt = composePromptFromState({\n state,\n template: shouldMuteTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: shouldMutePrompt,\n stopSequences: [],\n });\n\n const cleanedResponse = response.trim().toLowerCase();\n\n // Handle various affirmative responses\n if (\n cleanedResponse === 'true' ||\n cleanedResponse === 'yes' ||\n cleanedResponse === 'y' ||\n cleanedResponse.includes('true') ||\n cleanedResponse.includes('yes')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I will now mute this room',\n actions: ['MUTE_ROOM_STARTED'],\n },\n metadata: {\n type: 'MUTE_ROOM',\n },\n },\n 'messages'\n );\n return true;\n }\n\n // Handle various negative responses\n if (\n cleanedResponse === 'false' ||\n cleanedResponse === 'no' ||\n cleanedResponse === 'n' ||\n cleanedResponse.includes('false') ||\n cleanedResponse.includes('no')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I decided to not mute this room',\n actions: ['MUTE_ROOM_FAILED'],\n },\n metadata: {\n type: 'MUTE_ROOM',\n },\n },\n 'messages'\n );\n }\n\n // Default to false if response is unclear\n logger.warn(\n { src: 'plugin:bootstrap:action:mute_room', agentId: runtime.agentId, response },\n 'Unclear boolean response, defaulting to false'\n );\n return false;\n }\n\n const shouldMute = await _shouldMute(state);\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (!room) {\n return {\n text: 'Could not find room to mute',\n values: { success: false, error: 'ROOM_NOT_FOUND' },\n data: { actionName: 'MUTE_ROOM', error: 'Room not found' },\n success: false,\n };\n }\n\n if (shouldMute) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, 'MUTED');\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I muted the room ${room.name}`,\n actions: ['MUTE_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Room muted: ${room.name}`,\n values: {\n success: true,\n roomMuted: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: 'MUTED',\n },\n data: {\n actionName: 'MUTE_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n muted: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:mute_room',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error muting room'\n );\n return {\n text: 'Failed to mute room',\n values: {\n success: false,\n error: 'MUTE_FAILED',\n },\n data: {\n actionName: 'MUTE_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n return {\n text: `Decided not to mute room: ${room.name}`,\n values: {\n success: true,\n roomMuted: false,\n roomId: message.roomId,\n roomName: room.name,\n reason: 'NOT_APPROPRIATE',\n },\n data: {\n actionName: 'MUTE_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n muted: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, please mute this channel. No need to respond here for now.',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Got it',\n actions: ['MUTE_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '@{{name1}} we could really use your input on this',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, please mute this channel for the time being',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Understood',\n actions: ['MUTE_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Hey what do you think about this new design',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} plz mute this room',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'np going silent',\n actions: ['MUTE_ROOM'],\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'whos going to the webxr meetup in an hour btw',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '',\n actions: ['IGNORE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'too many messages here {{name2}}',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'my bad ill mute',\n actions: ['MUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'yo {{name2}} dont talk in here',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sry',\n actions: ['MUTE_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
16
16
  "import type { Action, ActionExample, IAgentRuntime, Memory, ActionResult } from '@elizaos/core';\n\n/**\n * Represents the none action.\n *\n * This action responds but performs no additional action. It is the default if the agent is speaking and not doing anything additional.\n *\n * @type {Action}\n */\n/**\n * Represents an action that responds but performs no additional action.\n * This is the default behavior if the agent is speaking and not doing anything additional.\n * @type {Action}\n */\nexport const noneAction: Action = {\n name: 'NONE',\n similes: ['NO_ACTION', 'NO_RESPONSE', 'NO_REACTION'],\n validate: async (_runtime: IAgentRuntime, _message: Memory) => {\n return true;\n },\n description:\n 'Respond but perform no additional action. This is the default if the agent is speaking and not doing anything additional.',\n handler: async (_runtime: IAgentRuntime, _message: Memory): Promise<ActionResult> => {\n return {\n text: 'No additional action taken',\n values: {\n success: true,\n actionType: 'NONE',\n },\n data: {\n actionName: 'NONE',\n description: 'Response without additional action',\n },\n success: true,\n };\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: { text: 'Hey whats up' },\n },\n {\n name: '{{name2}}',\n content: { text: 'oh hey', actions: ['NONE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: {\n text: 'did u see some faster whisper just came out',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'yeah but its a pain to get into node.js',\n actions: ['NONE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'the things that were funny 6 months ago are very cringe now',\n actions: ['NONE'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'lol true',\n actions: ['NONE'],\n },\n },\n {\n name: '{{name1}}',\n content: { text: 'too real haha', actions: ['NONE'] },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: { text: 'gotta run', actions: ['NONE'] },\n },\n {\n name: '{{name2}}',\n content: { text: 'Okay, ttyl', actions: ['NONE'] },\n },\n {\n name: '{{name1}}',\n content: { text: '', actions: ['IGNORE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'heyyyyyy', actions: ['NONE'] },\n },\n {\n name: '{{name2}}',\n content: { text: 'whats up long time no see' },\n },\n {\n name: '{{name1}}',\n content: {\n text: 'chillin man. playing lots of fortnite. what about you',\n actions: ['NONE'],\n },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'u think aliens are real', actions: ['NONE'] },\n },\n {\n name: '{{name2}}',\n content: { text: 'ya obviously', actions: ['NONE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: { text: 'drop a joke on me', actions: ['NONE'] },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'why dont scientists trust atoms cuz they make up everything lmao',\n actions: ['NONE'],\n },\n },\n {\n name: '{{name1}}',\n content: { text: 'haha good one', actions: ['NONE'] },\n },\n ],\n\n [\n {\n name: '{{name1}}',\n content: {\n text: 'hows the weather where ur at',\n actions: ['NONE'],\n },\n },\n {\n name: '{{name2}}',\n content: { text: 'beautiful all week', actions: ['NONE'] },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
17
- "import {\n type Action,\n type ActionExample,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n logger,\n parseKeyValueXml,\n} from '@elizaos/core';\n\n/**\n * Template for generating dialog and actions for a character.\n *\n * @type {string}\n */\n/**\n * Template for generating dialog and actions for a character.\n *\n * @type {string}\n */\nconst replyTemplate = `# Task: Generate dialog for the character {{agentName}}.\n\n{{providers}}\n\n# Instructions: Write the next message for {{agentName}}.\n\"thought\" should be a short description of what the agent is thinking about and planning.\n\"message\" should be the next message for {{agentName}} which they will send to the conversation.\n\nIMPORTANT CODE BLOCK FORMATTING RULES:\n- If {{agentName}} includes code examples, snippets, or multi-line code in the response, ALWAYS wrap the code with \\`\\`\\` fenced code blocks (specify the language if known, e.g., \\`\\`\\`python).\n- ONLY use fenced code blocks for actual code. Do NOT wrap non-code text, instructions, or single words in fenced code blocks.\n- If including inline code (short single words or function names), use single backticks (\\`) as appropriate.\n- This ensures the user sees clearly formatted and copyable code when relevant.\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nRespond using XML format like this:\n<response>\n <thought>Your thought here</thought>\n <message>Your message here</message>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Represents an action that allows the agent to reply to the current conversation with a generated message.\n *\n * This action can be used as an acknowledgement at the beginning of a chain of actions, or as a final response at the end of a chain of actions.\n *\n * @typedef {Object} replyAction\n * @property {string} name - The name of the action (\"REPLY\").\n * @property {string[]} similes - An array of similes for the action.\n * @property {string} description - A description of the action and its usage.\n * @property {Function} validate - An asynchronous function for validating the action runtime.\n * @property {Function} handler - An asynchronous function for handling the action logic.\n * @property {ActionExample[][]} examples - An array of example scenarios for the action.\n */\nexport const replyAction = {\n name: 'REPLY',\n similes: ['GREET', 'REPLY_TO_MESSAGE', 'SEND_REPLY', 'RESPOND', 'RESPONSE'],\n description:\n 'Replies to the current conversation with the text from the generated message. Default if the agent is responding with a message and no other action. Use REPLY at the beginning of a chain of actions as an acknowledgement, and at the end of a chain of actions as a final response.',\n validate: async (_runtime: IAgentRuntime) => {\n return true;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n _options: any,\n callback: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n // Access previous action results from context if available\n const actionContext = _options?.actionContext;\n const previousResults = actionContext?.previousResults || [];\n\n if (previousResults.length > 0) {\n logger.debug(\n {\n src: 'plugin:bootstrap:action:reply',\n agentId: runtime.agentId,\n count: previousResults.length,\n },\n 'Found previous action results'\n );\n }\n\n // Check if any responses had providers associated with them\n const allProviders = responses?.flatMap((res) => res.content?.providers ?? []) ?? [];\n\n // Only generate response using LLM if no suitable response was found\n state = await runtime.composeState(message, [\n ...(allProviders ?? []),\n 'RECENT_MESSAGES',\n 'ACTION_STATE',\n ]);\n\n const prompt = composePromptFromState({\n state,\n template: runtime.character.templates?.replyTemplate || replyTemplate,\n });\n\n try {\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n // Parse XML response\n const parsedXml = parseKeyValueXml(response);\n\n const responseContent = {\n thought: parsedXml?.thought || '',\n text: parsedXml?.message || '',\n actions: ['REPLY'],\n };\n\n await callback(responseContent);\n\n return {\n text: `Generated reply: ${responseContent.text}`,\n values: {\n success: true,\n responded: true,\n lastReply: responseContent.text,\n lastReplyTime: Date.now(),\n thoughtProcess: parsedXml?.thought,\n },\n data: {\n actionName: 'REPLY',\n response: responseContent,\n thought: parsedXml?.thought,\n messageGenerated: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:reply',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating response'\n );\n\n return {\n text: 'Error generating reply',\n values: {\n success: false,\n responded: false,\n error: true,\n },\n data: {\n actionName: 'REPLY',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Hello there!',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Hi! How can I help you today?',\n actions: ['REPLY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"What's your favorite color?\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I really like deep shades of blue. They remind me of the ocean and the night sky.',\n actions: ['REPLY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Can you explain how neural networks work?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Let me break that down for you in simple terms...',\n actions: ['REPLY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Could you help me solve this math problem?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Of course! Let's work through it step by step.\",\n actions: ['REPLY'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
18
- "import {\n type Action,\n type ActionExample,\n ChannelType,\n composePrompt,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n Role,\n type State,\n type UUID,\n World,\n type ActionResult,\n parseKeyValueXml,\n} from '@elizaos/core';\n\n/**\n * Determines if the user with the current role can modify the role to the new role.\n * @param currentRole The current role of the user making the change\n * @param targetRole The current role of the user being changed (null if new user)\n * @param newRole The new role to assign\n * @returns Whether the role change is allowed\n */\n/**\n * Determines if a user with a given current role can modify the role of another user to a new role.\n * @param {Role} currentRole - The current role of the user attempting to modify the other user's role.\n * @param {Role | null} targetRole - The target user's current role. Can be null if the user does not exist.\n * @param {Role} newRole - The new role that the current user is attempting to set for the target user.\n * @returns {boolean} Returns true if the user can modify the role, false otherwise.\n */\nconst canModifyRole = (currentRole: Role, targetRole: Role | null, newRole: Role): boolean => {\n // User's can't change their own role\n if (targetRole === currentRole) return false;\n\n switch (currentRole) {\n // Owners can do everything\n case Role.OWNER:\n return true;\n // Admins can only create/modify users up to their level\n case Role.ADMIN:\n return newRole !== Role.OWNER;\n // Normal users can't modify roles\n case Role.NONE:\n default:\n return false;\n }\n};\n\n/**\n * Interface representing a role assignment to a user.\n */\ninterface RoleAssignment {\n entityId: string;\n newRole: Role;\n}\n\n/**\n * Represents an action to update the role of a user within a server.\n * @typedef {Object} Action\n * @property {string} name - The name of the action.\n * @property {string[]} similes - The similar actions that can be performed.\n * @property {string} description - A description of the action and its purpose.\n * @property {Function} validate - A function to validate the action before execution.\n * @property {Function} handler - A function to handle the execution of the action.\n * @property {ActionExample[][]} examples - Examples demonstrating how the action can be used.\n */\nexport const updateRoleAction: Action = {\n name: 'UPDATE_ROLE',\n similes: ['CHANGE_ROLE', 'SET_PERMISSIONS', 'ASSIGN_ROLE', 'MAKE_ADMIN'],\n description: 'Assigns a role (Admin, Owner, None) to a user or list of users in a channel.',\n\n validate: async (_runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> => {\n // Only activate in group chats where the feature is enabled\n const channelType = message.content.channelType as ChannelType;\n const serverId = message.content.serverId as string;\n\n return (\n // First, check if this is a supported channel type\n (channelType === ChannelType.GROUP || channelType === ChannelType.WORLD) &&\n // Then, check if we have a server ID\n !!serverId\n );\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: any,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_role', agentId: runtime.agentId },\n 'State is required for role assignment'\n );\n return {\n text: 'State is required for role assignment',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for role assignment'),\n };\n }\n\n // Extract needed values from message and state\n const { roomId } = message;\n const serverId = message.content.serverId as string;\n const worldId = runtime.getSetting('WORLD_ID');\n\n // First, get the world for this server\n let world: World | null = null;\n\n if (worldId) {\n world = await runtime.getWorld(worldId as UUID);\n }\n\n if (!world) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_role', agentId: runtime.agentId },\n 'World not found'\n );\n await callback?.({\n text: \"I couldn't find the world. This action only works in a world.\",\n });\n return {\n text: 'World not found',\n values: {\n success: false,\n error: 'WORLD_NOT_FOUND',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: 'World not found',\n },\n success: false,\n };\n }\n\n if (!world.metadata?.roles) {\n world.metadata = world.metadata || {};\n world.metadata.roles = {};\n }\n\n // Get the entities for this room\n const entities = await runtime.getEntitiesForRoom(roomId);\n\n // Get the role of the requester\n const requesterRole = world.metadata.roles[message.entityId] || Role.NONE;\n\n // Construct extraction prompt\n const extractionPrompt = composePrompt({\n state: {\n ...state.values,\n content: state.text,\n },\n template: `# Task: Parse Role Assignment\n\nI need to extract user role assignments from the input text. Users can be referenced by name, username, or mention.\n\nThe available role types are:\n- OWNER: Full control over the server and all settings\n- ADMIN: Ability to manage channels and moderate content\n- NONE: Regular user with no special permissions\n\n# Current context:\n{{content}}\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nFormat your response as XML with multiple assignments:\n<response>\n <assignments>\n <assignment>\n <entityId>John</entityId>\n <newRole>ADMIN</newRole>\n </assignment>\n <assignment>\n <entityId>Sarah</entityId>\n <newRole>OWNER</newRole>\n </assignment>\n </assignments>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`,\n });\n\n // Extract role assignments using text model with XML parsing\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: extractionPrompt,\n });\n\n const parsedXml = parseKeyValueXml(response);\n\n // Handle the parsed XML structure\n let assignments: RoleAssignment[] = [];\n if (parsedXml?.assignments?.assignment) {\n // Normalize to array\n const assignmentArray = Array.isArray(parsedXml.assignments.assignment)\n ? parsedXml.assignments.assignment\n : [parsedXml.assignments.assignment];\n\n assignments = assignmentArray.map((a: any) => ({\n entityId: a.entityId,\n newRole: a.newRole as Role,\n }));\n }\n\n if (!assignments.length) {\n await callback?.({\n text: 'No valid role assignments found in the request.',\n actions: ['UPDATE_ROLE'],\n source: 'discord',\n });\n return {\n text: 'No valid role assignments found',\n values: {\n success: false,\n error: 'NO_ASSIGNMENTS',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: 'No valid role assignments found in the request',\n },\n success: false,\n };\n }\n\n // Process each role assignment\n let worldUpdated = false;\n const successfulUpdates: Array<{ entityId: string; entityName: string; newRole: Role }> = [];\n const failedUpdates: Array<{ entityId: string; reason: string }> = [];\n\n for (const assignment of assignments) {\n let targetEntity = entities.find((e) => e.id === assignment.entityId);\n if (!targetEntity) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_role',\n agentId: runtime.agentId,\n entityId: assignment.entityId,\n },\n 'Could not find an ID to assign to'\n );\n failedUpdates.push({\n entityId: assignment.entityId,\n reason: 'Entity not found',\n });\n continue;\n }\n\n const currentRole = world.metadata.roles[assignment.entityId];\n\n // Validate role modification permissions\n if (!canModifyRole(requesterRole, currentRole, assignment.newRole)) {\n await callback?.({\n text: `You don't have permission to change ${targetEntity?.names[0]}'s role to ${assignment.newRole}.`,\n actions: ['UPDATE_ROLE'],\n source: 'discord',\n });\n failedUpdates.push({\n entityId: assignment.entityId,\n reason: 'Insufficient permissions',\n });\n continue;\n }\n\n // Update role in world metadata\n world.metadata.roles[assignment.entityId] = assignment.newRole;\n\n worldUpdated = true;\n successfulUpdates.push({\n entityId: assignment.entityId,\n entityName: targetEntity?.names[0] || 'Unknown',\n newRole: assignment.newRole,\n });\n\n await callback?.({\n text: `Updated ${targetEntity?.names[0]}'s role to ${assignment.newRole}.`,\n actions: ['UPDATE_ROLE'],\n source: 'discord',\n });\n }\n\n // Save updated world metadata if any changes were made\n if (worldUpdated) {\n try {\n await runtime.updateWorld(world);\n logger.info(\n { src: 'plugin:bootstrap:action:update_role', agentId: runtime.agentId, serverId },\n 'Updated roles in world metadata'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_role',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to save world updates'\n );\n return {\n text: 'Failed to save role updates',\n values: {\n success: false,\n error: 'SAVE_FAILED',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: error instanceof Error ? error.message : String(error),\n attemptedUpdates: successfulUpdates,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n return {\n text: `Role updates completed: ${successfulUpdates.length} successful, ${failedUpdates.length} failed`,\n values: {\n success: true,\n successfulUpdates: successfulUpdates.length,\n failedUpdates: failedUpdates.length,\n updates: successfulUpdates,\n failures: failedUpdates,\n },\n data: {\n actionName: 'UPDATE_ROLE',\n successfulUpdates,\n failedUpdates,\n worldId: world.id,\n serverId,\n },\n success: true,\n };\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Make {{name2}} an ADMIN',\n source: 'discord',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Updated {{name2}}'s role to ADMIN.\",\n actions: ['UPDATE_ROLE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Set @alice and @bob as admins',\n source: 'discord',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Updated alice's role to ADMIN.\\nUpdated bob's role to ADMIN.\",\n actions: ['UPDATE_ROLE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Ban @troublemaker',\n source: 'discord',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'I cannot ban users.',\n actions: ['REPLY'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n",
19
- "// action: SEND_MESSAGE\n// send message to a user or room (other than this room we are in)\n\nimport {\n type Action,\n type ActionExample,\n composePromptFromState,\n findEntityByName,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Task: Extract Target and Source Information\n *\n * Recent Messages:\n * {{recentMessages}}\n *\n * Instructions:\n * Analyze the conversation to identify:\n * 1. The target type (user or room)\n * 2. The target platform/source (e.g. telegram, discord, etc)\n * 3. Any identifying information about the target\n *\n * Return an XML response with:\n * <response>\n * <targetType>user|room</targetType>\n * <source>platform-name</source>\n * <identifiers>\n * <username>username_if_applicable</username>\n * <roomName>room_name_if_applicable</roomName>\n * <!-- Add other relevant identifiers as needed -->\n * </identifiers>\n * </response>\n *\n * Example outputs:\n * For \"send a message to @dev_guru on telegram\":\n * <response>\n * <targetType>user</targetType>\n * <source>telegram</source>\n * <identifiers>\n * <username>dev_guru</username>\n * </identifiers>\n * </response>\n *\n * For \"post this in #announcements\":\n * <response>\n * <targetType>room</targetType>\n * <source>discord</source>\n * <identifiers>\n * <roomName>announcements</roomName>\n * </identifiers>\n * </response>\n */\nconst targetExtractionTemplate = `# Task: Extract Target and Source Information\n\n# Recent Messages:\n{{recentMessages}}\n\n# Instructions:\nAnalyze the conversation to identify:\n1. The target type (user or room)\n2. The target platform/source (e.g. telegram, discord, etc)\n3. Any identifying information about the target\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nReturn an XML response with:\n<response>\n <targetType>user|room</targetType>\n <source>platform-name</source>\n <identifiers>\n <username>username_if_applicable</username>\n <roomName>room_name_if_applicable</roomName>\n </identifiers>\n</response>\n\nExample outputs:\n1. For \"send a message to @dev_guru on telegram\":\n<response>\n <targetType>user</targetType>\n <source>telegram</source>\n <identifiers>\n <username>dev_guru</username>\n </identifiers>\n</response>\n\n2. For \"post this in #announcements\":\n<response>\n <targetType>room</targetType>\n <source>discord</source>\n <identifiers>\n <roomName>announcements</roomName>\n </identifiers>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n/**\n * Represents an action to send a message to a user or room.\n *\n * @typedef {Action} sendMessageAction\n * @property {string} name - The name of the action.\n * @property {string[]} similes - Additional names for the action.\n * @property {string} description - Description of the action.\n * @property {function} validate - Asynchronous function to validate if the action can be executed.\n * @property {function} handler - Asynchronous function to handle the action execution.\n * @property {ActionExample[][]} examples - Examples demonstrating the usage of the action.\n */\nexport const sendMessageAction: Action = {\n name: 'SEND_MESSAGE',\n similes: ['DM', 'MESSAGE', 'SEND_DM', 'POST_MESSAGE'],\n description: 'Send a message to a user or room (other than the current one)',\n\n validate: async (runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> => {\n // Check if we have permission to send messages\n const worldId = message.roomId;\n const agentId = runtime.agentId;\n\n // Get all components for the current room to understand available sources\n const roomComponents = await runtime.getComponents(message.roomId, worldId, agentId);\n\n // Get source types from room components\n const availableSources = new Set(roomComponents.map((c) => c.type));\n\n // TODO: Add ability for plugins to register their sources\n // const registeredSources = runtime.getRegisteredSources?.() || [];\n // availableSources.add(...registeredSources);\n\n return availableSources.size > 0;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: any,\n callback?: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n try {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:send_message', agentId: runtime.agentId },\n 'State is required for sendMessage action'\n );\n return {\n text: 'State is required for sendMessage action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for sendMessage action'),\n };\n }\n if (!callback) {\n logger.error(\n { src: 'plugin:bootstrap:action:send_message', agentId: runtime.agentId },\n 'Callback is required for sendMessage action'\n );\n return {\n text: 'Callback is required for sendMessage action',\n values: {\n success: false,\n error: 'CALLBACK_REQUIRED',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Callback is required',\n },\n success: false,\n error: new Error('Callback is required for sendMessage action'),\n };\n }\n if (!responses) {\n logger.error(\n { src: 'plugin:bootstrap:action:send_message', agentId: runtime.agentId },\n 'Responses are required for sendMessage action'\n );\n return {\n text: 'Responses are required for sendMessage action',\n values: {\n success: false,\n error: 'RESPONSES_REQUIRED',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Responses are required',\n },\n success: false,\n error: new Error('Responses are required for sendMessage action'),\n };\n }\n\n // Handle initial responses\n for (const response of responses) {\n await callback(response.content);\n }\n\n const sourceEntityId = message.entityId;\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n const worldId = room.worldId;\n\n // Extract target and source information\n const targetPrompt = composePromptFromState({\n state,\n template: targetExtractionTemplate,\n });\n\n const targetResult = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: targetPrompt,\n stopSequences: [],\n });\n\n const targetData = parseKeyValueXml(targetResult);\n if (!targetData?.targetType || !targetData?.source) {\n await callback({\n text: \"I couldn't determine where you want me to send the message. Could you please specify the target (user or room) and platform?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Could not determine message target',\n values: {\n success: false,\n error: 'TARGET_UNCLEAR',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Could not parse target information from message',\n },\n success: false,\n };\n }\n\n const source = targetData.source.toLowerCase();\n\n if (targetData.targetType === 'user') {\n // Try to find the target user entity\n const targetEntity = await findEntityByName(runtime, message, state);\n\n if (!targetEntity) {\n await callback({\n text: \"I couldn't find the user you want me to send a message to. Could you please provide more details about who they are?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Target user not found',\n values: {\n success: false,\n error: 'USER_NOT_FOUND',\n targetType: 'user',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Could not find target user',\n targetType: 'user',\n source,\n },\n success: false,\n };\n }\n\n // Get the component for the specified source\n const userComponent = await runtime.getComponent(\n targetEntity.id!,\n source,\n worldId,\n sourceEntityId\n );\n\n if (!userComponent) {\n await callback({\n text: `I couldn't find ${source} information for that user. Could you please provide their ${source} details?`,\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: `No ${source} information found for user`,\n values: {\n success: false,\n error: 'COMPONENT_NOT_FOUND',\n targetType: 'user',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: `No ${source} component found for target user`,\n targetType: 'user',\n targetEntityId: targetEntity.id,\n source,\n },\n success: false,\n };\n }\n\n const sendDirectMessage = (runtime.getService(source) as any)?.sendDirectMessage;\n\n if (!sendDirectMessage) {\n await callback({\n text: \"I couldn't find the user you want me to send a message to. Could you please provide more details about who they are?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Message service not available',\n values: {\n success: false,\n error: 'SERVICE_NOT_FOUND',\n targetType: 'user',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: `No sendDirectMessage service found for ${source}`,\n targetType: 'user',\n source,\n },\n success: false,\n };\n }\n // Send the message using the appropriate client\n try {\n await sendDirectMessage(runtime, targetEntity.id!, source, message.content.text, worldId);\n\n await callback({\n text: `Message sent to ${targetEntity.names[0]} on ${source}.`,\n actions: ['SEND_MESSAGE'],\n source: message.content.source,\n });\n return {\n text: `Message sent to ${targetEntity.names[0]}`,\n values: {\n success: true,\n targetType: 'user',\n targetId: targetEntity.id,\n targetName: targetEntity.names[0],\n source,\n messageSent: true,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n targetType: 'user',\n targetId: targetEntity.id,\n targetName: targetEntity.names[0],\n source,\n messageContent: message.content.text,\n },\n success: true,\n };\n } catch (error: any) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:send_message',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to send direct message'\n );\n await callback({\n text: 'I encountered an error trying to send the message. Please try again.',\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Failed to send direct message',\n values: {\n success: false,\n error: 'SEND_FAILED',\n targetType: 'user',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: error.message,\n targetType: 'user',\n targetId: targetEntity.id,\n source,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else if (targetData.targetType === 'room') {\n // Try to find the target room\n const rooms = await runtime.getRooms(worldId);\n const targetRoom = rooms.find((r) => {\n // Match room name from identifiers\n return r.name?.toLowerCase() === targetData.identifiers.roomName?.toLowerCase();\n });\n\n if (!targetRoom) {\n await callback({\n text: \"I couldn't find the room you want me to send a message to. Could you please specify the exact room name?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Target room not found',\n values: {\n success: false,\n error: 'ROOM_NOT_FOUND',\n targetType: 'room',\n roomName: targetData.identifiers.roomName,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Could not find target room',\n targetType: 'room',\n roomName: targetData.identifiers.roomName,\n source,\n },\n success: false,\n };\n }\n\n const sendRoomMessage = (runtime.getService(source) as any)?.sendRoomMessage;\n\n if (!sendRoomMessage) {\n await callback({\n text: \"I couldn't find the room you want me to send a message to. Could you please specify the exact room name?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Room message service not available',\n values: {\n success: false,\n error: 'SERVICE_NOT_FOUND',\n targetType: 'room',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: `No sendRoomMessage service found for ${source}`,\n targetType: 'room',\n source,\n },\n success: false,\n };\n }\n\n // Send the message to the room\n try {\n await sendRoomMessage(runtime, targetRoom.id, source, message.content.text, worldId);\n\n await callback({\n text: `Message sent to ${targetRoom.name} on ${source}.`,\n actions: ['SEND_MESSAGE'],\n source: message.content.source,\n });\n return {\n text: `Message sent to ${targetRoom.name}`,\n values: {\n success: true,\n targetType: 'room',\n targetId: targetRoom.id,\n targetName: targetRoom.name,\n source,\n messageSent: true,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n targetType: 'room',\n targetId: targetRoom.id,\n targetName: targetRoom.name,\n source,\n messageContent: message.content.text,\n },\n success: true,\n };\n } catch (error: any) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:send_message',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to send room message'\n );\n await callback({\n text: 'I encountered an error trying to send the message to the room. Please try again.',\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Failed to send room message',\n values: {\n success: false,\n error: 'SEND_FAILED',\n targetType: 'room',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: error.message,\n targetType: 'room',\n targetId: targetRoom.id,\n targetName: targetRoom.name,\n source,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n // Should not reach here\n return {\n text: 'Unknown target type',\n values: {\n success: false,\n error: 'UNKNOWN_TARGET_TYPE',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Unknown target type: ' + targetData.targetType,\n },\n success: false,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:send_message',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in sendMessage handler'\n );\n await callback?.({\n text: 'There was an error processing your message request.',\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error processing message request',\n values: {\n success: false,\n error: 'HANDLER_ERROR',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Send a message to @dev_guru on telegram saying 'Hello!'\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Message sent to dev_guru on telegram.',\n actions: ['SEND_MESSAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Post 'Important announcement!' in #announcements\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Message sent to announcements.',\n actions: ['SEND_MESSAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"DM Jimmy and tell him 'Meeting at 3pm'\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Message sent to Jimmy.',\n actions: ['SEND_MESSAGE'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default sendMessageAction;\n",
20
- "import {\n type Action,\n type ActionExample,\n ChannelType,\n composePrompt,\n composePromptFromState,\n type Content,\n createUniqueUuid,\n findWorldsForOwner,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type Setting,\n type State,\n type WorldSettings,\n type ActionResult,\n} from '@elizaos/core';\nimport dedent from 'dedent';\n\n/**\n * Interface representing the structure of a setting update object.\n * @interface\n * @property {string} key - The key of the setting to be updated.\n * @property {string|boolean} value - The new value for the setting, can be a string or a boolean.\n */\n/**\n * Interface for updating settings.\n * @typedef {Object} SettingUpdate\n * @property {string} key - The key of the setting to update.\n * @property {string | boolean} value - The new value of the setting, can be a string or a boolean.\n */\ninterface SettingUpdate {\n key: string;\n value: string | boolean;\n}\n\nconst messageCompletionFooter = `\\n# Instructions: Write the next message for {{agentName}}. Include the appropriate action from the list: {{actionNames}}\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nResponse format should be formatted in XML like this:\n<response>\n <name>{{agentName}}</name>\n <text>Your message text here</text>\n <thought>Your thought about the response</thought>\n <actions>ACTION1,ACTION2</actions>\n</response>\n\nDo not including any thinking or internal reflection in the \"text\" field.\n\"thought\" should be a short description of what the agent is thinking about before responding, including a brief justification for the response.\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n// Template for success responses when settings are updated\n/**\n * JSDoc comment for successTemplate constant\n *\n * # Task: Generate a response for successful setting updates\n * {{providers}}\n *\n * # Update Information:\n * - Updated Settings: {{updateMessages}}\n * - Next Required Setting: {{nextSetting.name}}\n * - Remaining Required Settings: {{remainingRequired}}\n *\n * # Instructions:\n * 1. Acknowledge the successful update of settings\n * 2. Maintain {{agentName}}'s personality and tone\n * 3. Provide clear guidance on the next setting that needs to be configured\n * 4. Explain what the next setting is for and how to set it\n * 5. If appropriate, mention how many required settings remain\n *\n * Write a natural, conversational response that {{agentName}} would send about the successful update and next steps.\n * Include the actions array [\"SETTING_UPDATED\"] in your response.\n * ${messageCompletionFooter}\n */\nconst successTemplate = `# Task: Generate a response for successful setting updates\n{{providers}}\n\n# Update Information:\n- Updated Settings: {{updateMessages}}\n- Next Required Setting: {{nextSetting.name}}\n- Remaining Required Settings: {{remainingRequired}}\n\n# Instructions:\n1. Acknowledge the successful update of settings\n2. Maintain {{agentName}}'s personality and tone\n3. Provide clear guidance on the next setting that needs to be configured\n4. Explain what the next setting is for and how to set it\n5. If appropriate, mention how many required settings remain\n\nWrite a natural, conversational response that {{agentName}} would send about the successful update and next steps.\nInclude the actions array [\"SETTING_UPDATED\"] in your response.\n${messageCompletionFooter}`;\n\n// Template for failure responses when settings couldn't be updated\n/**\n * Template for generating a response for failed setting updates.\n *\n * @template T\n * @param {string} failureTemplate - The failure template string to fill in with dynamic content.\n * @returns {string} - The filled-in template for generating the response.\n */\nconst failureTemplate = `# Task: Generate a response for failed setting updates\n\n# About {{agentName}}:\n{{bio}}\n\n# Current Settings Status:\n{{settingsStatus}}\n\n# Next Required Setting:\n- Name: {{nextSetting.name}}\n- Description: {{nextSetting.description}}\n- Required: Yes\n- Remaining Required Settings: {{remainingRequired}}\n\n# Recent Conversation:\n{{recentMessages}}\n\n# Instructions:\n1. Express that you couldn't understand or process the setting update\n2. Maintain {{agentName}}'s personality and tone\n3. Provide clear guidance on what setting needs to be configured next\n4. Explain what the setting is for and how to set it properly\n5. Use a helpful, patient tone\n\nWrite a natural, conversational response that {{agentName}} would send about the failed update and how to proceed.\nInclude the actions array [\"SETTING_UPDATE_FAILED\"] in your response.\n${messageCompletionFooter}`;\n\n// Template for error responses when unexpected errors occur\n/**\n * Template for generating a response for an error during setting updates.\n *\n * The template includes placeholders for agent name, bio, recent messages,\n * and provides instructions for crafting a response.\n *\n * Instructions:\n * 1. Apologize for the technical difficulty\n * 2. Maintain agent's personality and tone\n * 3. Suggest trying again or contacting support if the issue persists\n * 4. Keep the message concise and helpful\n *\n * Actions array to include: [\"SETTING_UPDATE_ERROR\"]\n */\nconst errorTemplate = `# Task: Generate a response for an error during setting updates\n\n# About {{agentName}}:\n{{bio}}\n\n# Recent Conversation:\n{{recentMessages}}\n\n# Instructions:\n1. Apologize for the technical difficulty\n2. Maintain {{agentName}}'s personality and tone\n3. Suggest trying again or contacting support if the issue persists\n4. Keep the message concise and helpful\n\nWrite a natural, conversational response that {{agentName}} would send about the error.\nInclude the actions array [\"SETTING_UPDATE_ERROR\"] in your response.\n${messageCompletionFooter}`;\n\n// Template for completion responses when all required settings are configured\n/**\n * Task: Generate a response for settings completion\n *\n * About {{agentName}}:\n * {{bio}}\n *\n * Settings Status:\n * {{settingsStatus}}\n *\n * Recent Conversation:\n * {{recentMessages}}\n *\n * Instructions:\n * 1. Congratulate the user on completing the settings process\n * 2. Maintain {{agentName}}'s personality and tone\n * 3. Summarize the key settings that have been configured\n * 4. Explain what functionality is now available\n * 5. Provide guidance on what the user can do next\n * 6. Express enthusiasm about working together\n *\n * Write a natural, conversational response that {{agentName}} would send about the successful completion of settings.\n * Include the actions array [\"ONBOARDING_COMPLETE\"] in your response.\n */\nconst completionTemplate = `# Task: Generate a response for settings completion\n\n# About {{agentName}}:\n{{bio}}\n\n# Settings Status:\n{{settingsStatus}}\n\n# Recent Conversation:\n{{recentMessages}}\n\n# Instructions:\n1. Congratulate the user on completing the settings process\n2. Maintain {{agentName}}'s personality and tone\n3. Summarize the key settings that have been configured\n4. Explain what functionality is now available\n5. Provide guidance on what the user can do next\n6. Express enthusiasm about working together\n\nWrite a natural, conversational response that {{agentName}} would send about the successful completion of settings.\nInclude the actions array [\"ONBOARDING_COMPLETE\"] in your response.\n${messageCompletionFooter}`;\n\n/**\n * Gets settings state from world metadata\n */\n/**\n * Retrieves the settings for a specific world from the database.\n * @param {IAgentRuntime} runtime - The Agent Runtime instance.\n * @param {string} serverId - The ID of the server.\n * @returns {Promise<WorldSettings | null>} The settings of the world, or null if not found.\n */\nexport async function getWorldSettings(\n runtime: IAgentRuntime,\n serverId: string\n): Promise<WorldSettings | null> {\n try {\n const worldId = createUniqueUuid(runtime, serverId);\n const world = await runtime.getWorld(worldId);\n\n if (!world || !world.metadata?.settings) {\n return null;\n }\n\n return world.metadata.settings as WorldSettings;\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error getting settings state'\n );\n return null;\n }\n}\n\n/**\n * Updates settings state in world metadata\n */\nexport async function updateWorldSettings(\n runtime: IAgentRuntime,\n serverId: string,\n worldSettings: WorldSettings\n): Promise<boolean> {\n try {\n const worldId = createUniqueUuid(runtime, serverId);\n const world = await runtime.getWorld(worldId);\n\n if (!world) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId, serverId },\n 'No world found for server'\n );\n return false;\n }\n\n // Initialize metadata if it doesn't exist\n if (!world.metadata) {\n world.metadata = {};\n }\n\n // Update settings state\n world.metadata.settings = worldSettings;\n\n // Save updated world\n await runtime.updateWorld(world);\n\n return true;\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error updating settings state'\n );\n return false;\n }\n}\n\n/**\n * Formats a list of settings for display\n */\nfunction formatSettingsList(worldSettings: WorldSettings): string {\n const settings = Object.entries(worldSettings)\n .filter(([key]) => !key.startsWith('_')) // Skip internal settings\n .map(([key, setting]: [string, Setting]) => {\n const status = setting.value !== null ? 'Configured' : 'Not configured';\n const required = setting.required ? 'Required' : 'Optional';\n return `- ${setting.name} (${key}): ${status}, ${required}`;\n })\n .join('\\n');\n\n return settings || 'No settings available';\n}\n\n/**\n * Categorizes settings by their configuration status\n */\nfunction categorizeSettings(worldSettings: WorldSettings): {\n configured: [string, Setting][];\n requiredUnconfigured: [string, Setting][];\n optionalUnconfigured: [string, Setting][];\n} {\n const configured: [string, Setting][] = [];\n const requiredUnconfigured: [string, Setting][] = [];\n const optionalUnconfigured: [string, Setting][] = [];\n\n for (const [key, setting] of Object.entries(worldSettings)) {\n // Skip internal settings\n if (key.startsWith('_')) continue;\n\n const typedSetting = setting as Setting;\n\n if (typedSetting.value !== null) {\n configured.push([key, typedSetting]);\n } else if (typedSetting.required) {\n requiredUnconfigured.push([key, typedSetting]);\n } else {\n optionalUnconfigured.push([key, typedSetting]);\n }\n }\n\n return { configured, requiredUnconfigured, optionalUnconfigured };\n}\n\n/**\n * Extracts setting values from user message with improved handling of multiple settings\n */\nasync function extractSettingValues(\n runtime: IAgentRuntime,\n _message: Memory,\n state: State,\n worldSettings: WorldSettings\n): Promise<SettingUpdate[]> {\n // Find what settings need to be configured\n const { requiredUnconfigured, optionalUnconfigured } = categorizeSettings(worldSettings);\n\n // Generate a prompt to extract settings from the user's message\n const settingsContext = requiredUnconfigured\n .concat(optionalUnconfigured)\n .map(([key, setting]) => {\n const requiredStr = setting.required ? 'Required.' : 'Optional.';\n return `${key}: ${setting.description} ${requiredStr}`;\n })\n .join('\\n');\n\n const basePrompt = dedent`\n I need to extract settings values from the user's message.\n \n Available settings:\n ${settingsContext}\n \n User message: ${state.text}\n\n For each setting mentioned in the user's message, extract the value.\n \n Only return settings that are clearly mentioned in the user's message.\n If a setting is mentioned but no clear value is provided, do not include it.\n `;\n\n try {\n // Use runtime.useModel directly with strong typing\n const result = await runtime.useModel<typeof ModelType.OBJECT_LARGE, SettingUpdate[]>(\n ModelType.OBJECT_LARGE,\n {\n prompt: basePrompt,\n output: 'array',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n key: { type: 'string' },\n value: { type: 'string' },\n },\n required: ['key', 'value'],\n },\n },\n }\n );\n\n // Validate the extracted settings\n if (!result) {\n return [];\n }\n\n function extractValidSettings(obj: unknown, worldSettings: WorldSettings) {\n const extracted: SettingUpdate[] = [];\n\n function traverse(node: unknown): void {\n if (Array.isArray(node)) {\n for (const item of node) {\n traverse(item);\n }\n } else if (typeof node === 'object' && node !== null) {\n for (const [key, value] of Object.entries(node)) {\n if (worldSettings[key] && typeof value !== 'object') {\n extracted.push({ key, value });\n } else {\n traverse(value);\n }\n }\n }\n }\n\n traverse(obj);\n return extracted;\n }\n\n const extractedSettings = extractValidSettings(result, worldSettings);\n\n return extractedSettings;\n } catch (error) {\n console.error('Error extracting settings:', error);\n return [];\n }\n}\n\n/**\n * Processes multiple setting updates atomically\n */\nasync function processSettingUpdates(\n runtime: IAgentRuntime,\n serverId: string,\n worldSettings: WorldSettings,\n updates: SettingUpdate[]\n): Promise<{ updatedAny: boolean; messages: string[] }> {\n if (!updates.length) {\n return { updatedAny: false, messages: [] };\n }\n\n const messages: string[] = [];\n let updatedAny = false;\n\n try {\n // Create a copy of the state for atomic updates\n const updatedState = { ...worldSettings };\n\n // Process all updates\n for (const update of updates) {\n const setting = updatedState[update.key];\n if (!setting) continue;\n\n // Check dependencies if they exist\n if (setting.dependsOn?.length) {\n const dependenciesMet = setting.dependsOn.every((dep) => updatedState[dep]?.value !== null);\n if (!dependenciesMet) {\n messages.push(`Cannot update ${setting.name} - dependencies not met`);\n continue;\n }\n }\n\n // Update the setting\n updatedState[update.key] = {\n ...setting,\n value: update.value,\n };\n\n messages.push(`Updated ${setting.name} successfully`);\n updatedAny = true;\n\n // Execute onSetAction if defined\n if (setting.onSetAction) {\n const actionMessage = setting.onSetAction(update.value);\n if (actionMessage) {\n messages.push(actionMessage);\n }\n }\n }\n\n // If any updates were made, save the entire state to world metadata\n if (updatedAny) {\n // Save to world metadata\n const saved = await updateWorldSettings(runtime, serverId, updatedState);\n\n if (!saved) {\n throw new Error('Failed to save updated state to world metadata');\n }\n\n // Verify save by retrieving it again\n const savedState = await getWorldSettings(runtime, serverId);\n if (!savedState) {\n throw new Error('Failed to verify state save');\n }\n }\n\n return { updatedAny, messages };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing setting updates'\n );\n return {\n updatedAny: false,\n messages: ['Error occurred while updating settings'],\n };\n }\n}\n\n/**\n * Handles the completion of settings when all required settings are configured\n */\nasync function handleOnboardingComplete(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n _state: State,\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n // Generate completion message\n const prompt = composePrompt({\n state: {\n settingsStatus: formatSettingsList(worldSettings),\n },\n template: completionTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['ONBOARDING_COMPLETE'],\n source: 'discord',\n });\n\n return {\n text: 'Onboarding completed successfully',\n values: {\n success: true,\n onboardingComplete: true,\n allRequiredConfigured: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'ONBOARDING_COMPLETE',\n settingsStatus: formatSettingsList(worldSettings),\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error handling settings completion'\n );\n await callback({\n text: 'Great! All required settings have been configured. Your server is now fully set up and ready to use.',\n actions: ['ONBOARDING_COMPLETE'],\n source: 'discord',\n });\n\n return {\n text: 'Onboarding completed with fallback message',\n values: {\n success: true,\n onboardingComplete: true,\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'ONBOARDING_COMPLETE',\n error: error instanceof Error ? error.message : String(error),\n },\n success: true,\n };\n }\n}\n\n/**\n * Generates a success response for setting updates\n */\nasync function generateSuccessResponse(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n state: State,\n messages: string[],\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n // Check if all required settings are now configured\n const { requiredUnconfigured } = categorizeSettings(worldSettings);\n\n if (requiredUnconfigured.length === 0) {\n // All required settings are configured, complete settings\n return await handleOnboardingComplete(runtime, worldSettings, state, callback);\n }\n\n const requiredUnconfiguredString = requiredUnconfigured\n .map(([key, setting]) => `${key}: ${setting.name}`)\n .join('\\n');\n\n // Generate success message\n const prompt = composePrompt({\n state: {\n updateMessages: messages.join('\\n'),\n nextSetting: requiredUnconfiguredString,\n remainingRequired: requiredUnconfigured.length.toString(),\n },\n template: successTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n });\n\n return {\n text: 'Settings updated successfully',\n values: {\n success: true,\n settingsUpdated: true,\n remainingRequired: requiredUnconfigured.length,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATED',\n updatedMessages: messages,\n remainingRequired: requiredUnconfigured.length,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating success response'\n );\n await callback({\n text: 'Settings updated successfully. Please continue with the remaining configuration.',\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n });\n\n return {\n text: 'Settings updated with fallback message',\n values: {\n success: true,\n settingsUpdated: true,\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATED',\n error: error instanceof Error ? error.message : String(error),\n },\n success: true,\n };\n }\n}\n\n/**\n * Generates a failure response when no settings could be updated\n */\nasync function generateFailureResponse(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n state: State,\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n // Get next required setting\n const { requiredUnconfigured } = categorizeSettings(worldSettings);\n\n if (requiredUnconfigured.length === 0) {\n // All required settings are configured, complete settings\n return await handleOnboardingComplete(runtime, worldSettings, state, callback);\n }\n\n const requiredUnconfiguredString = requiredUnconfigured\n .map(([key, setting]) => `${key}: ${setting.name}`)\n .join('\\n');\n\n // Generate failure message\n const prompt = composePrompt({\n state: {\n nextSetting: requiredUnconfiguredString,\n remainingRequired: requiredUnconfigured.length.toString(),\n },\n template: failureTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['SETTING_UPDATE_FAILED'],\n source: 'discord',\n });\n\n return {\n text: 'No settings were updated',\n values: {\n success: false,\n settingsUpdated: false,\n remainingRequired: requiredUnconfigured.length,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_FAILED',\n remainingRequired: requiredUnconfigured.length,\n },\n success: false,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating failure response'\n );\n await callback({\n text: \"I couldn't understand your settings update. Please try again with a clearer format.\",\n actions: ['SETTING_UPDATE_FAILED'],\n source: 'discord',\n });\n\n return {\n text: 'Failed to parse settings with fallback message',\n values: {\n success: false,\n settingsUpdated: false,\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_FAILED',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n };\n }\n}\n\n/**\n * Generates an error response for unexpected errors\n */\nasync function generateErrorResponse(\n runtime: IAgentRuntime,\n state: State,\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n const prompt = composePromptFromState({\n state,\n template: errorTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['SETTING_UPDATE_ERROR'],\n source: 'discord',\n });\n\n return {\n text: 'Error processing settings',\n values: {\n success: false,\n error: 'PROCESSING_ERROR',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_ERROR',\n },\n success: false,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating error response'\n );\n await callback({\n text: \"I'm sorry, but I encountered an error while processing your request. Please try again or contact support if the issue persists.\",\n actions: ['SETTING_UPDATE_ERROR'],\n source: 'discord',\n });\n\n return {\n text: 'Error with fallback message',\n values: {\n success: false,\n error: 'PROCESSING_ERROR',\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_ERROR',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n/**\n * Enhanced settings action with improved state management and logging\n * Updated to use world metadata instead of cache\n */\nexport const updateSettingsAction: Action = {\n name: 'UPDATE_SETTINGS',\n similes: ['UPDATE_SETTING', 'SAVE_SETTING', 'SET_CONFIGURATION', 'CONFIGURE'],\n description:\n 'Saves a configuration setting during the onboarding process, or update an existing setting. Use this when you are onboarding with a world owner or admin.',\n\n validate: async (runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> => {\n try {\n if (message.content.channelType !== ChannelType.DM) {\n logger.debug(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n channelType: message.content.channelType,\n },\n 'Skipping settings in non-DM channel'\n );\n return false;\n }\n\n // Find the server where this user is the owner\n logger.debug(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'Looking for server where user is owner'\n );\n const worlds = await findWorldsForOwner(runtime, message.entityId);\n if (!worlds) {\n return false;\n }\n\n const world = worlds.find((world) => world.metadata?.settings);\n\n // Check if there's an active settings state in world metadata\n const worldSettings = world?.metadata?.settings;\n\n if (!worldSettings) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n serverId: world?.messageServerId,\n },\n 'No settings state found for server'\n );\n return false;\n }\n\n logger.debug(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n serverId: world.messageServerId,\n },\n 'Found valid settings state for server'\n );\n return true;\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error validating settings action'\n );\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: any,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n try {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'State is required for settings handler'\n );\n if (callback) {\n await generateErrorResponse(runtime, state!, callback);\n }\n return {\n text: 'State is required for settings handler',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for settings handler'),\n };\n }\n\n if (!message) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'Message is required for settings handler'\n );\n await generateErrorResponse(runtime, state, callback!);\n return {\n text: 'Message is required for settings handler',\n values: {\n success: false,\n error: 'MESSAGE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'Message is required',\n },\n success: false,\n error: new Error('Message is required for settings handler'),\n };\n }\n\n if (!callback) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'Callback is required for settings handler'\n );\n return {\n text: 'Callback is required for settings handler',\n values: {\n success: false,\n error: 'CALLBACK_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'Callback is required',\n },\n success: false,\n error: new Error('Callback is required for settings handler'),\n };\n }\n\n // Find the server where this user is the owner\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'Handler looking for server for user'\n );\n const worlds = await findWorldsForOwner(runtime, message.entityId);\n const serverOwnership = worlds?.find((world) => world.metadata?.settings);\n if (!serverOwnership) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'No server found for user in handler'\n );\n await generateErrorResponse(runtime, state, callback);\n return {\n text: 'No server found for user',\n values: {\n success: false,\n error: 'NO_SERVER_FOUND',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'No server found where user is owner',\n entityId: message.entityId,\n },\n success: false,\n };\n }\n\n const serverId = serverOwnership?.messageServerId;\n logger.info(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId, serverId },\n 'Using server ID'\n );\n\n if (!serverId) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'No server ID found for user in handler'\n );\n await generateErrorResponse(runtime, state, callback);\n return {\n text: 'No server ID found',\n values: {\n success: false,\n error: 'NO_SERVER_ID',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'No server ID found',\n entityId: message.entityId,\n },\n success: false,\n };\n }\n\n // Get settings state from world metadata\n const worldSettings = await getWorldSettings(runtime, serverId);\n\n if (!worldSettings) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId, serverId },\n 'No settings state found for server in handler'\n );\n await generateErrorResponse(runtime, state, callback);\n return {\n text: 'No settings state found',\n values: {\n success: false,\n error: 'NO_SETTINGS_STATE',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'No settings state found for server',\n serverId,\n },\n success: false,\n };\n }\n\n // Extract setting values from message\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n text: message.content.text,\n },\n 'Extracting settings from message'\n );\n const extractedSettings = await extractSettingValues(runtime, message, state, worldSettings);\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n count: extractedSettings.length,\n },\n 'Extracted settings'\n );\n\n // Process extracted settings\n const updateResults = await processSettingUpdates(\n runtime,\n serverId,\n worldSettings,\n extractedSettings\n );\n\n // Generate appropriate response\n if (updateResults.updatedAny) {\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n messages: updateResults.messages,\n },\n 'Successfully updated settings'\n );\n\n // Get updated settings state\n const updatedWorldSettings = await getWorldSettings(runtime, serverId);\n if (!updatedWorldSettings) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'Failed to retrieve updated settings state'\n );\n await generateErrorResponse(runtime, state, callback);\n return {\n text: 'Failed to retrieve updated settings state',\n values: {\n success: false,\n error: 'RETRIEVE_FAILED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'Failed to retrieve updated settings state',\n serverId,\n },\n success: false,\n };\n }\n\n await generateSuccessResponse(\n runtime,\n updatedWorldSettings,\n state,\n updateResults.messages,\n callback\n );\n\n // Check if all required settings are configured\n const { requiredUnconfigured } = categorizeSettings(updatedWorldSettings);\n const allConfigured = requiredUnconfigured.length === 0;\n\n return {\n text: `Settings updated successfully`,\n values: {\n success: true,\n settingsUpdated: extractedSettings.length,\n updatedSettings: extractedSettings.map((s) => s.key),\n remainingRequired: requiredUnconfigured.length,\n allConfigured,\n serverId,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n updatedSettings: extractedSettings,\n messages: updateResults.messages,\n remainingRequired: requiredUnconfigured.map(([key, _]) => key),\n allConfigured,\n serverId,\n },\n success: true,\n };\n } else {\n logger.info(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'No settings were updated'\n );\n await generateFailureResponse(runtime, worldSettings, state, callback);\n\n const { requiredUnconfigured } = categorizeSettings(worldSettings);\n\n return {\n text: 'No settings were updated',\n values: {\n success: false,\n error: 'NO_UPDATES',\n remainingRequired: requiredUnconfigured.length,\n serverId,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'No valid settings found in message',\n remainingRequired: requiredUnconfigured.map(([key, _]) => key),\n serverId,\n },\n success: false,\n };\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in settings handler'\n );\n if (state && callback) {\n await generateErrorResponse(runtime, state, callback);\n }\n return {\n text: 'Error in settings handler',\n values: {\n success: false,\n error: 'HANDLER_ERROR',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'I want to set up the welcome channel to #general',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Perfect! I've updated your welcome channel to #general. Next, we should configure the automated greeting message that new members will receive.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Let's set the bot prefix to !\",\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Great choice! I've set the command prefix to '!'. Now you can use commands like !help, !info, etc.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Enable auto-moderation for bad language',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Auto-moderation for inappropriate language has been enabled. I'll now filter messages containing offensive content.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'For server logs, use the #server-logs channel',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've configured #server-logs as your logging channel. All server events like joins, leaves, and moderation actions will be recorded there.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"I'd like to have role self-assignment in the #roles channel\",\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Role self-assignment has been set up in the #roles channel. Members can now assign themselves roles by interacting with messages there.',\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Make music commands available in voice-text channels only',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated your music command settings - they'll now only work in voice-text channels. This helps keep other channels clear of music spam.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'For server timezone, set it to EST',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Server timezone has been set to Eastern Standard Time (EST). All scheduled events and timestamps will now display in this timezone.',\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Set verification level to email verified users only',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated the verification requirement to email verified accounts only. This adds an extra layer of security to your server.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'I want to turn off level-up notifications',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Level-up notifications have been disabled. Members will still earn experience and level up, but there won't be any automatic announcements. You can still view levels with the appropriate commands.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"My server name is 'Gaming Lounge'\",\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Great! I've saved 'Gaming Lounge' as your server name. This helps me personalize responses and know how to refer to your community. We've completed all the required settings! Your server is now fully configured and ready to use. You can always adjust these settings later if needed.\",\n actions: ['ONBOARDING_COMPLETE'],\n source: 'discord',\n },\n },\n ],\n ] as ActionExample[][],\n};\n",
17
+ "import {\n type HandlerOptions,\n type Action,\n type ActionExample,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n logger,\n parseKeyValueXml,\n} from '@elizaos/core';\n\n/**\n * Template for generating dialog and actions for a character.\n *\n * @type {string}\n */\n/**\n * Template for generating dialog and actions for a character.\n *\n * @type {string}\n */\nconst replyTemplate = `# Task: Generate dialog for the character {{agentName}}.\n\n{{providers}}\n\n# Instructions: Write the next message for {{agentName}}.\n\"thought\" should be a short description of what the agent is thinking about and planning.\n\"text\" should be the next message for {{agentName}} which they will send to the conversation.\n\nIMPORTANT CODE BLOCK FORMATTING RULES:\n- If {{agentName}} includes code examples, snippets, or multi-line code in the response, ALWAYS wrap the code with \\`\\`\\` fenced code blocks (specify the language if known, e.g., \\`\\`\\`python).\n- ONLY use fenced code blocks for actual code. Do NOT wrap non-code text, instructions, or single words in fenced code blocks.\n- If including inline code (short single words or function names), use single backticks (\\`) as appropriate.\n- This ensures the user sees clearly formatted and copyable code when relevant.\n\nDo NOT include any thinking, reasoning, or <think> sections in your response.\nGo directly to the XML response format without any preamble or explanation.\n\nRespond using XML format like this:\n<response>\n <thought>Your thought here</thought>\n <text>Your message here</text>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Represents an action that allows the agent to reply to the current conversation with a generated message.\n *\n * This action can be used as an acknowledgement at the beginning of a chain of actions, or as a final response at the end of a chain of actions.\n *\n * @typedef {Object} replyAction\n * @property {string} name - The name of the action (\"REPLY\").\n * @property {string[]} similes - An array of similes for the action.\n * @property {string} description - A description of the action and its usage.\n * @property {Function} validate - An asynchronous function for validating the action runtime.\n * @property {Function} handler - An asynchronous function for handling the action logic.\n * @property {ActionExample[][]} examples - An array of example scenarios for the action.\n */\nexport const replyAction = {\n name: 'REPLY',\n similes: ['GREET', 'REPLY_TO_MESSAGE', 'SEND_REPLY', 'RESPOND', 'RESPONSE'],\n description:\n 'Replies to the current conversation with the text from the generated message. Default if the agent is responding with a message and no other action. Use REPLY at the beginning of a chain of actions as an acknowledgement, and at the end of a chain of actions as a final response.',\n validate: async (_runtime: IAgentRuntime) => {\n return true;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n // Access previous action results from context if available\n const actionContext = _options?.actionContext;\n const previousResults = actionContext?.previousResults || [];\n\n if (previousResults.length > 0) {\n logger.debug(\n {\n src: 'plugin:bootstrap:action:reply',\n agentId: runtime.agentId,\n count: previousResults.length,\n },\n 'Found previous action results'\n );\n }\n\n // Check if any responses had providers associated with them\n const allProviders = responses?.flatMap((res) => res.content?.providers ?? []) ?? [];\n\n // Only generate response using LLM if no suitable response was found\n state = await runtime.composeState(message, [\n ...(allProviders ?? []),\n 'RECENT_MESSAGES',\n 'ACTION_STATE',\n ]);\n\n const prompt = composePromptFromState({\n state,\n template: runtime.character.templates?.replyTemplate || replyTemplate,\n });\n\n try {\n // Streaming is automatic via streaming context (set by MessageService)\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n // Parse XML response\n const parsedXml = parseKeyValueXml(response);\n const thought = typeof parsedXml?.thought === 'string' ? parsedXml.thought : '';\n const text = typeof parsedXml?.text === 'string' ? parsedXml.text : '';\n\n const responseContent = {\n thought,\n text,\n actions: ['REPLY'] as string[],\n };\n\n if (callback) {\n await callback(responseContent);\n }\n\n return {\n text: `Generated reply: ${responseContent.text}`,\n values: {\n success: true,\n responded: true,\n lastReply: responseContent.text,\n lastReplyTime: Date.now(),\n thoughtProcess: thought,\n },\n data: {\n actionName: 'REPLY',\n response: responseContent,\n thought,\n messageGenerated: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:reply',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating response'\n );\n\n return {\n text: 'Error generating reply',\n values: {\n success: false,\n responded: false,\n error: true,\n },\n data: {\n actionName: 'REPLY',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Hello there!',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Hi! How can I help you today?',\n actions: ['REPLY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"What's your favorite color?\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I really like deep shades of blue. They remind me of the ocean and the night sky.',\n actions: ['REPLY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Can you explain how neural networks work?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Let me break that down for you in simple terms...',\n actions: ['REPLY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Could you help me solve this math problem?',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Of course! Let's work through it step by step.\",\n actions: ['REPLY'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
18
+ "import {\n type HandlerOptions,\n type Action,\n type ActionExample,\n ChannelType,\n composePrompt,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n Role,\n type State,\n type UUID,\n World,\n type ActionResult,\n parseKeyValueXml,\n} from '@elizaos/core';\n\n/** Shape of individual assignment in XML response */\ninterface RoleAssignmentXml {\n entityId?: string;\n newRole?: string;\n}\n\n/** Shape of the role extraction XML response */\ninterface RoleExtractionResult {\n assignments?: {\n assignment?: RoleAssignmentXml | RoleAssignmentXml[];\n };\n}\n\n/**\n * Determines if the user with the current role can modify the role to the new role.\n * @param currentRole The current role of the user making the change\n * @param targetRole The current role of the user being changed (null if new user)\n * @param newRole The new role to assign\n * @returns Whether the role change is allowed\n */\n/**\n * Determines if a user with a given current role can modify the role of another user to a new role.\n * @param {Role} currentRole - The current role of the user attempting to modify the other user's role.\n * @param {Role | null} targetRole - The target user's current role. Can be null if the user does not exist.\n * @param {Role} newRole - The new role that the current user is attempting to set for the target user.\n * @returns {boolean} Returns true if the user can modify the role, false otherwise.\n */\nconst canModifyRole = (currentRole: Role, targetRole: Role | null, newRole: Role): boolean => {\n // User's can't change their own role\n if (targetRole === currentRole) {\n return false;\n }\n\n switch (currentRole) {\n // Owners can do everything\n case Role.OWNER:\n return true;\n // Admins can only create/modify users up to their level\n case Role.ADMIN:\n return newRole !== Role.OWNER;\n // Normal users can't modify roles\n case Role.NONE:\n default:\n return false;\n }\n};\n\n/**\n * Interface representing a role assignment to a user.\n */\ninterface RoleAssignment {\n entityId: string;\n newRole: Role;\n}\n\n/**\n * Represents an action to update the role of a user within a server.\n * @typedef {Object} Action\n * @property {string} name - The name of the action.\n * @property {string[]} similes - The similar actions that can be performed.\n * @property {string} description - A description of the action and its purpose.\n * @property {Function} validate - A function to validate the action before execution.\n * @property {Function} handler - A function to handle the execution of the action.\n * @property {ActionExample[][]} examples - Examples demonstrating how the action can be used.\n */\nexport const updateRoleAction: Action = {\n name: 'UPDATE_ROLE',\n similes: ['CHANGE_ROLE', 'SET_PERMISSIONS', 'ASSIGN_ROLE', 'MAKE_ADMIN'],\n description: 'Assigns a role (Admin, Owner, None) to a user or list of users in a channel.',\n\n validate: async (_runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> => {\n // Only activate in group chats where the feature is enabled\n const channelType = message.content.channelType as ChannelType;\n const serverId = message.content.serverId as string;\n\n return (\n // First, check if this is a supported channel type\n (channelType === ChannelType.GROUP || channelType === ChannelType.WORLD) &&\n // Then, check if we have a server ID\n !!serverId\n );\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_role', agentId: runtime.agentId },\n 'State is required for role assignment'\n );\n return {\n text: 'State is required for role assignment',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for role assignment'),\n };\n }\n\n // Extract needed values from message and state\n const { roomId } = message;\n const serverId = message.content.serverId as string;\n const worldId = runtime.getSetting('WORLD_ID');\n\n // First, get the world for this server\n let world: World | null = null;\n\n if (worldId) {\n world = await runtime.getWorld(worldId as UUID);\n }\n\n if (!world) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_role', agentId: runtime.agentId },\n 'World not found'\n );\n await callback?.({\n text: \"I couldn't find the world. This action only works in a world.\",\n });\n return {\n text: 'World not found',\n values: {\n success: false,\n error: 'WORLD_NOT_FOUND',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: 'World not found',\n },\n success: false,\n };\n }\n\n if (!world.metadata?.roles) {\n world.metadata = world.metadata || {};\n world.metadata.roles = {};\n }\n\n // Get the entities for this room\n const entities = await runtime.getEntitiesForRoom(roomId);\n\n // Get the role of the requester\n const requesterRole = world.metadata.roles[message.entityId] || Role.NONE;\n\n // Construct extraction prompt\n const extractionPrompt = composePrompt({\n state: {\n ...state.values,\n content: state.text,\n },\n template: `# Task: Parse Role Assignment\n\nI need to extract user role assignments from the input text. Users can be referenced by name, username, or mention.\n\nThe available role types are:\n- OWNER: Full control over the server and all settings\n- ADMIN: Ability to manage channels and moderate content\n- NONE: Regular user with no special permissions\n\n# Current context:\n{{content}}\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nFormat your response as XML with multiple assignments:\n<response>\n <assignments>\n <assignment>\n <entityId>John</entityId>\n <newRole>ADMIN</newRole>\n </assignment>\n <assignment>\n <entityId>Sarah</entityId>\n <newRole>OWNER</newRole>\n </assignment>\n </assignments>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`,\n });\n\n // Extract role assignments using text model with XML parsing\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: extractionPrompt,\n });\n\n const parsedXml = parseKeyValueXml<RoleExtractionResult>(response);\n\n // Handle the parsed XML structure\n let assignments: RoleAssignment[] = [];\n if (parsedXml?.assignments?.assignment) {\n // Normalize to array\n const assignmentArray = Array.isArray(parsedXml.assignments.assignment)\n ? parsedXml.assignments.assignment\n : [parsedXml.assignments.assignment];\n\n assignments = assignmentArray\n .filter((a): a is RoleAssignmentXml & { entityId: string } => !!a.entityId)\n .map((a) => ({\n entityId: a.entityId,\n newRole: a.newRole as Role,\n }));\n }\n\n if (!assignments.length) {\n await callback?.({\n text: 'No valid role assignments found in the request.',\n actions: ['UPDATE_ROLE'],\n source: 'discord',\n });\n return {\n text: 'No valid role assignments found',\n values: {\n success: false,\n error: 'NO_ASSIGNMENTS',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: 'No valid role assignments found in the request',\n },\n success: false,\n };\n }\n\n // Process each role assignment\n let worldUpdated = false;\n const successfulUpdates: Array<{ entityId: string; entityName: string; newRole: Role }> = [];\n const failedUpdates: Array<{ entityId: string; reason: string }> = [];\n\n for (const assignment of assignments) {\n const targetEntity = entities.find((e) => e.id === assignment.entityId);\n if (!targetEntity) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_role',\n agentId: runtime.agentId,\n entityId: assignment.entityId,\n },\n 'Could not find an ID to assign to'\n );\n failedUpdates.push({\n entityId: assignment.entityId,\n reason: 'Entity not found',\n });\n continue;\n }\n\n const currentRole = world.metadata.roles[assignment.entityId];\n\n // Validate role modification permissions\n if (!canModifyRole(requesterRole, currentRole, assignment.newRole)) {\n await callback?.({\n text: `You don't have permission to change ${targetEntity?.names[0]}'s role to ${assignment.newRole}.`,\n actions: ['UPDATE_ROLE'],\n source: 'discord',\n });\n failedUpdates.push({\n entityId: assignment.entityId,\n reason: 'Insufficient permissions',\n });\n continue;\n }\n\n // Update role in world metadata\n world.metadata.roles[assignment.entityId] = assignment.newRole;\n\n worldUpdated = true;\n successfulUpdates.push({\n entityId: assignment.entityId,\n entityName: targetEntity?.names[0] || 'Unknown',\n newRole: assignment.newRole,\n });\n\n await callback?.({\n text: `Updated ${targetEntity?.names[0]}'s role to ${assignment.newRole}.`,\n actions: ['UPDATE_ROLE'],\n source: 'discord',\n });\n }\n\n // Save updated world metadata if any changes were made\n if (worldUpdated) {\n try {\n await runtime.updateWorld(world);\n logger.info(\n { src: 'plugin:bootstrap:action:update_role', agentId: runtime.agentId, serverId },\n 'Updated roles in world metadata'\n );\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_role',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to save world updates'\n );\n return {\n text: 'Failed to save role updates',\n values: {\n success: false,\n error: 'SAVE_FAILED',\n },\n data: {\n actionName: 'UPDATE_ROLE',\n error: error instanceof Error ? error.message : String(error),\n attemptedUpdates: successfulUpdates,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n return {\n text: `Role updates completed: ${successfulUpdates.length} successful, ${failedUpdates.length} failed`,\n values: {\n success: true,\n successfulUpdates: successfulUpdates.length,\n failedUpdates: failedUpdates.length,\n updates: successfulUpdates,\n failures: failedUpdates,\n },\n data: {\n actionName: 'UPDATE_ROLE',\n successfulUpdates,\n failedUpdates,\n worldId: world.id,\n serverId,\n },\n success: true,\n };\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Make {{name2}} an ADMIN',\n source: 'discord',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Updated {{name2}}'s role to ADMIN.\",\n actions: ['UPDATE_ROLE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Set @alice and @bob as admins',\n source: 'discord',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Updated alice's role to ADMIN.\\nUpdated bob's role to ADMIN.\",\n actions: ['UPDATE_ROLE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Ban @troublemaker',\n source: 'discord',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'I cannot ban users.',\n actions: ['REPLY'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n",
19
+ "// action: SEND_MESSAGE\n// send message to a user or room (other than this room we are in)\n\nimport {\n type Action,\n type ActionExample,\n composePromptFromState,\n type Content,\n findEntityByName,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/** Shape of the target extraction XML response */\ninterface TargetExtractionResult {\n targetType?: string;\n source?: string;\n identifiers?: {\n roomName?: string;\n userId?: string;\n username?: string;\n };\n}\n\n/**\n * Task: Extract Target and Source Information\n *\n * Recent Messages:\n * {{recentMessages}}\n *\n * Instructions:\n * Analyze the conversation to identify:\n * 1. The target type (user or room)\n * 2. The target platform/source (e.g. telegram, discord, etc)\n * 3. Any identifying information about the target\n *\n * Return an XML response with:\n * <response>\n * <targetType>user|room</targetType>\n * <source>platform-name</source>\n * <identifiers>\n * <username>username_if_applicable</username>\n * <roomName>room_name_if_applicable</roomName>\n * <!-- Add other relevant identifiers as needed -->\n * </identifiers>\n * </response>\n *\n * Example outputs:\n * For \"send a message to @dev_guru on telegram\":\n * <response>\n * <targetType>user</targetType>\n * <source>telegram</source>\n * <identifiers>\n * <username>dev_guru</username>\n * </identifiers>\n * </response>\n *\n * For \"post this in #announcements\":\n * <response>\n * <targetType>room</targetType>\n * <source>discord</source>\n * <identifiers>\n * <roomName>announcements</roomName>\n * </identifiers>\n * </response>\n */\nconst targetExtractionTemplate = `# Task: Extract Target and Source Information\n\n# Recent Messages:\n{{recentMessages}}\n\n# Instructions:\nAnalyze the conversation to identify:\n1. The target type (user or room)\n2. The target platform/source (e.g. telegram, discord, etc)\n3. Any identifying information about the target\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nReturn an XML response with:\n<response>\n <targetType>user|room</targetType>\n <source>platform-name</source>\n <identifiers>\n <username>username_if_applicable</username>\n <roomName>room_name_if_applicable</roomName>\n </identifiers>\n</response>\n\nExample outputs:\n1. For \"send a message to @dev_guru on telegram\":\n<response>\n <targetType>user</targetType>\n <source>telegram</source>\n <identifiers>\n <username>dev_guru</username>\n </identifiers>\n</response>\n\n2. For \"post this in #announcements\":\n<response>\n <targetType>room</targetType>\n <source>discord</source>\n <identifiers>\n <roomName>announcements</roomName>\n </identifiers>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n/**\n * Represents an action to send a message to a user or room.\n *\n * @typedef {Action} sendMessageAction\n * @property {string} name - The name of the action.\n * @property {string[]} similes - Additional names for the action.\n * @property {string} description - Description of the action.\n * @property {function} validate - Asynchronous function to validate if the action can be executed.\n * @property {function} handler - Asynchronous function to handle the action execution.\n * @property {ActionExample[][]} examples - Examples demonstrating the usage of the action.\n */\nexport const sendMessageAction: Action = {\n name: 'SEND_MESSAGE',\n similes: ['DM', 'MESSAGE', 'SEND_DM', 'POST_MESSAGE'],\n description: 'Send a message to a user or room (other than the current one)',\n\n validate: async (runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> => {\n // Check if we have permission to send messages\n const worldId = message.roomId;\n const agentId = runtime.agentId;\n\n // Get all components for the current room to understand available sources\n const roomComponents = await runtime.getComponents(message.roomId, worldId, agentId);\n\n // Get source types from room components\n const availableSources = new Set(roomComponents.map((c) => c.type));\n\n // TODO: Add ability for plugins to register their sources\n // const registeredSources = runtime.getRegisteredSources?.() || [];\n // availableSources.add(...registeredSources);\n\n return availableSources.size > 0;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n try {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:send_message', agentId: runtime.agentId },\n 'State is required for sendMessage action'\n );\n return {\n text: 'State is required for sendMessage action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for sendMessage action'),\n };\n }\n if (!callback) {\n logger.error(\n { src: 'plugin:bootstrap:action:send_message', agentId: runtime.agentId },\n 'Callback is required for sendMessage action'\n );\n return {\n text: 'Callback is required for sendMessage action',\n values: {\n success: false,\n error: 'CALLBACK_REQUIRED',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Callback is required',\n },\n success: false,\n error: new Error('Callback is required for sendMessage action'),\n };\n }\n if (!responses) {\n logger.error(\n { src: 'plugin:bootstrap:action:send_message', agentId: runtime.agentId },\n 'Responses are required for sendMessage action'\n );\n return {\n text: 'Responses are required for sendMessage action',\n values: {\n success: false,\n error: 'RESPONSES_REQUIRED',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Responses are required',\n },\n success: false,\n error: new Error('Responses are required for sendMessage action'),\n };\n }\n\n // Handle initial responses\n for (const response of responses) {\n await callback(response.content);\n }\n\n const sourceEntityId = message.entityId;\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (!room) {\n return {\n text: 'Could not find room',\n values: { success: false, error: 'ROOM_NOT_FOUND' },\n data: { actionName: 'SEND_MESSAGE', error: 'Room not found' },\n success: false,\n };\n }\n\n const worldId = room.worldId;\n\n // Extract target and source information\n const targetPrompt = composePromptFromState({\n state,\n template: targetExtractionTemplate,\n });\n\n const targetResult = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: targetPrompt,\n stopSequences: [],\n });\n\n const targetData = parseKeyValueXml<TargetExtractionResult>(targetResult);\n\n if (!targetData?.targetType || !targetData?.source) {\n await callback({\n text: \"I couldn't determine where you want me to send the message. Could you please specify the target (user or room) and platform?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Could not determine message target',\n values: {\n success: false,\n error: 'TARGET_UNCLEAR',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Could not parse target information from message',\n },\n success: false,\n };\n }\n\n const source = targetData.source.toLowerCase();\n\n if (targetData.targetType === 'user') {\n // Try to find the target user entity\n const targetEntity = await findEntityByName(runtime, message, state);\n\n if (!targetEntity) {\n await callback({\n text: \"I couldn't find the user you want me to send a message to. Could you please provide more details about who they are?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Target user not found',\n values: {\n success: false,\n error: 'USER_NOT_FOUND',\n targetType: 'user',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Could not find target user',\n targetType: 'user',\n source,\n },\n success: false,\n };\n }\n\n // Get the component for the specified source\n const userComponent = await runtime.getComponent(\n targetEntity.id!,\n source,\n worldId,\n sourceEntityId\n );\n\n if (!userComponent) {\n await callback({\n text: `I couldn't find ${source} information for that user. Could you please provide their ${source} details?`,\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: `No ${source} information found for user`,\n values: {\n success: false,\n error: 'COMPONENT_NOT_FOUND',\n targetType: 'user',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: `No ${source} component found for target user`,\n targetType: 'user',\n targetEntityId: targetEntity.id,\n source,\n },\n success: false,\n };\n }\n\n interface ServiceWithSendDirectMessage {\n sendDirectMessage?: (target: string, content: Content) => Promise<void>;\n }\n const service = runtime.getService(source) as ServiceWithSendDirectMessage | null;\n const sendDirectMessage = service?.sendDirectMessage;\n\n if (!sendDirectMessage) {\n await callback({\n text: \"I couldn't find the user you want me to send a message to. Could you please provide more details about who they are?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Message service not available',\n values: {\n success: false,\n error: 'SERVICE_NOT_FOUND',\n targetType: 'user',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: `No sendDirectMessage service found for ${source}`,\n targetType: 'user',\n source,\n },\n success: false,\n };\n }\n // Send the message using the appropriate client\n try {\n await sendDirectMessage(targetEntity.id!, {\n text: message.content.text,\n source: message.content.source,\n });\n\n await callback({\n text: `Message sent to ${targetEntity.names[0]} on ${source}.`,\n actions: ['SEND_MESSAGE'],\n source: message.content.source,\n });\n return {\n text: `Message sent to ${targetEntity.names[0]}`,\n values: {\n success: true,\n targetType: 'user',\n targetId: targetEntity.id,\n targetName: targetEntity.names[0],\n source,\n messageSent: true,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n targetType: 'user',\n targetId: targetEntity.id,\n targetName: targetEntity.names[0],\n source,\n messageContent: message.content.text,\n },\n success: true,\n };\n } catch (error: unknown) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:send_message',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to send direct message'\n );\n await callback({\n text: 'I encountered an error trying to send the message. Please try again.',\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Failed to send direct message',\n values: {\n success: false,\n error: 'SEND_FAILED',\n targetType: 'user',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: error instanceof Error ? error.message : String(error),\n targetType: 'user',\n targetId: targetEntity.id,\n source,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else if (targetData.targetType === 'room') {\n // Try to find the target room\n if (!worldId) {\n return {\n text: 'Could not determine world for room lookup',\n values: { success: false, error: 'NO_WORLD_ID' },\n data: { actionName: 'SEND_MESSAGE', error: 'No world ID available' },\n success: false,\n };\n }\n const rooms = await runtime.getRooms(worldId);\n const targetRoom = rooms.find((r) => {\n // Match room name from identifiers\n return r.name?.toLowerCase() === targetData.identifiers?.roomName?.toLowerCase();\n });\n\n if (!targetRoom) {\n await callback({\n text: \"I couldn't find the room you want me to send a message to. Could you please specify the exact room name?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Target room not found',\n values: {\n success: false,\n error: 'ROOM_NOT_FOUND',\n targetType: 'room',\n roomName: targetData.identifiers?.roomName,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: 'Could not find target room',\n targetType: 'room',\n roomName: targetData.identifiers?.roomName,\n source,\n },\n success: false,\n };\n }\n\n interface ServiceWithSendRoomMessage {\n sendRoomMessage?: (target: string, content: Content) => Promise<void>;\n }\n const service = runtime.getService(source) as ServiceWithSendRoomMessage | null;\n const sendRoomMessage = service?.sendRoomMessage;\n\n if (!sendRoomMessage) {\n await callback({\n text: \"I couldn't find the room you want me to send a message to. Could you please specify the exact room name?\",\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Room message service not available',\n values: {\n success: false,\n error: 'SERVICE_NOT_FOUND',\n targetType: 'room',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: `No sendRoomMessage service found for ${source}`,\n targetType: 'room',\n source,\n },\n success: false,\n };\n }\n\n // Send the message to the room\n try {\n await sendRoomMessage(targetRoom.id, {\n text: message.content.text,\n source: message.content.source,\n });\n\n await callback({\n text: `Message sent to ${targetRoom.name} on ${source}.`,\n actions: ['SEND_MESSAGE'],\n source: message.content.source,\n });\n return {\n text: `Message sent to ${targetRoom.name}`,\n values: {\n success: true,\n targetType: 'room',\n targetId: targetRoom.id,\n targetName: targetRoom.name,\n source,\n messageSent: true,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n targetType: 'room',\n targetId: targetRoom.id,\n targetName: targetRoom.name,\n source,\n messageContent: message.content.text,\n },\n success: true,\n };\n } catch (error: unknown) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:send_message',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to send room message'\n );\n await callback({\n text: 'I encountered an error trying to send the message to the room. Please try again.',\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Failed to send room message',\n values: {\n success: false,\n error: 'SEND_FAILED',\n targetType: 'room',\n source,\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: error instanceof Error ? error.message : String(error),\n targetType: 'room',\n targetId: targetRoom.id,\n targetName: targetRoom.name,\n source,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }\n\n // Should not reach here\n return {\n text: 'Unknown target type',\n values: {\n success: false,\n error: 'UNKNOWN_TARGET_TYPE',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: `Unknown target type: ${targetData.targetType}`,\n },\n success: false,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:send_message',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in sendMessage handler'\n );\n await callback?.({\n text: 'There was an error processing your message request.',\n actions: ['SEND_MESSAGE_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error processing message request',\n values: {\n success: false,\n error: 'HANDLER_ERROR',\n },\n data: {\n actionName: 'SEND_MESSAGE',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Send a message to @dev_guru on telegram saying 'Hello!'\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Message sent to dev_guru on telegram.',\n actions: ['SEND_MESSAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Post 'Important announcement!' in #announcements\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Message sent to announcements.',\n actions: ['SEND_MESSAGE'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"DM Jimmy and tell him 'Meeting at 3pm'\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Message sent to Jimmy.',\n actions: ['SEND_MESSAGE'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default sendMessageAction;\n",
20
+ "import {\n type HandlerOptions,\n type Action,\n type ActionExample,\n ChannelType,\n composePrompt,\n composePromptFromState,\n type Content,\n findWorldsForOwner,\n getSalt,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type Setting,\n type State,\n type UUID,\n saltWorldSettings,\n unsaltWorldSettings,\n type WorldSettings,\n type ActionResult,\n} from '@elizaos/core';\nimport dedent from 'dedent';\n\n/**\n * Interface representing the structure of a setting update object.\n * @interface\n * @property {string} key - The key of the setting to be updated.\n * @property {string|boolean} value - The new value for the setting, can be a string or a boolean.\n */\n/**\n * Interface for updating settings.\n * @typedef {Object} SettingUpdate\n * @property {string} key - The key of the setting to update.\n * @property {string | boolean} value - The new value of the setting, can be a string or a boolean.\n */\ninterface SettingUpdate {\n key: string;\n value: string | boolean;\n}\n\nconst messageCompletionFooter = `\\n# Instructions: Write the next message for {{agentName}}. Include the appropriate action from the list: {{actionNames}}\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nResponse format should be formatted in XML like this:\n<response>\n <name>{{agentName}}</name>\n <text>Your message text here</text>\n <thought>Your thought about the response</thought>\n <actions>ACTION1,ACTION2</actions>\n</response>\n\nDo not including any thinking or internal reflection in the \"text\" field.\n\"thought\" should be a short description of what the agent is thinking about before responding, including a brief justification for the response.\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n// Template for success responses when settings are updated\n/**\n * JSDoc comment for successTemplate constant\n *\n * # Task: Generate a response for successful setting updates\n * {{providers}}\n *\n * # Update Information:\n * - Updated Settings: {{updateMessages}}\n * - Next Required Setting: {{nextSetting.name}}\n * - Remaining Required Settings: {{remainingRequired}}\n *\n * # Instructions:\n * 1. Acknowledge the successful update of settings\n * 2. Maintain {{agentName}}'s personality and tone\n * 3. Provide clear guidance on the next setting that needs to be configured\n * 4. Explain what the next setting is for and how to set it\n * 5. If appropriate, mention how many required settings remain\n *\n * Write a natural, conversational response that {{agentName}} would send about the successful update and next steps.\n * Include the actions array [\"SETTING_UPDATED\"] in your response.\n * ${messageCompletionFooter}\n */\nconst successTemplate = `# Task: Generate a response for successful setting updates\n{{providers}}\n\n# Update Information:\n- Updated Settings: {{updateMessages}}\n- Next Required Setting: {{nextSetting.name}}\n- Remaining Required Settings: {{remainingRequired}}\n\n# Instructions:\n1. Acknowledge the successful update of settings\n2. Maintain {{agentName}}'s personality and tone\n3. Provide clear guidance on the next setting that needs to be configured\n4. Explain what the next setting is for and how to set it\n5. If appropriate, mention how many required settings remain\n\nWrite a natural, conversational response that {{agentName}} would send about the successful update and next steps.\nInclude the actions array [\"SETTING_UPDATED\"] in your response.\n${messageCompletionFooter}`;\n\n// Template for failure responses when settings couldn't be updated\n/**\n * Template for generating a response for failed setting updates.\n *\n * @template T\n * @param {string} failureTemplate - The failure template string to fill in with dynamic content.\n * @returns {string} - The filled-in template for generating the response.\n */\nconst failureTemplate = `# Task: Generate a response for failed setting updates\n\n# About {{agentName}}:\n{{bio}}\n\n# Current Settings Status:\n{{settingsStatus}}\n\n# Next Required Setting:\n- Name: {{nextSetting.name}}\n- Description: {{nextSetting.description}}\n- Required: Yes\n- Remaining Required Settings: {{remainingRequired}}\n\n# Recent Conversation:\n{{recentMessages}}\n\n# Instructions:\n1. Express that you couldn't understand or process the setting update\n2. Maintain {{agentName}}'s personality and tone\n3. Provide clear guidance on what setting needs to be configured next\n4. Explain what the setting is for and how to set it properly\n5. Use a helpful, patient tone\n\nWrite a natural, conversational response that {{agentName}} would send about the failed update and how to proceed.\nInclude the actions array [\"SETTING_UPDATE_FAILED\"] in your response.\n${messageCompletionFooter}`;\n\n// Template for error responses when unexpected errors occur\n/**\n * Template for generating a response for an error during setting updates.\n *\n * The template includes placeholders for agent name, bio, recent messages,\n * and provides instructions for crafting a response.\n *\n * Instructions:\n * 1. Apologize for the technical difficulty\n * 2. Maintain agent's personality and tone\n * 3. Suggest trying again or contacting support if the issue persists\n * 4. Keep the message concise and helpful\n *\n * Actions array to include: [\"SETTING_UPDATE_ERROR\"]\n */\nconst errorTemplate = `# Task: Generate a response for an error during setting updates\n\n# About {{agentName}}:\n{{bio}}\n\n# Recent Conversation:\n{{recentMessages}}\n\n# Instructions:\n1. Apologize for the technical difficulty\n2. Maintain {{agentName}}'s personality and tone\n3. Suggest trying again or contacting support if the issue persists\n4. Keep the message concise and helpful\n\nWrite a natural, conversational response that {{agentName}} would send about the error.\nInclude the actions array [\"SETTING_UPDATE_ERROR\"] in your response.\n${messageCompletionFooter}`;\n\n// Template for completion responses when all required settings are configured\n/**\n * Task: Generate a response for settings completion\n *\n * About {{agentName}}:\n * {{bio}}\n *\n * Settings Status:\n * {{settingsStatus}}\n *\n * Recent Conversation:\n * {{recentMessages}}\n *\n * Instructions:\n * 1. Congratulate the user on completing the settings process\n * 2. Maintain {{agentName}}'s personality and tone\n * 3. Summarize the key settings that have been configured\n * 4. Explain what functionality is now available\n * 5. Provide guidance on what the user can do next\n * 6. Express enthusiasm about working together\n *\n * Write a natural, conversational response that {{agentName}} would send about the successful completion of settings.\n * Include the actions array [\"ONBOARDING_COMPLETE\"] in your response.\n */\nconst completionTemplate = `# Task: Generate a response for settings completion\n\n# About {{agentName}}:\n{{bio}}\n\n# Settings Status:\n{{settingsStatus}}\n\n# Recent Conversation:\n{{recentMessages}}\n\n# Instructions:\n1. Congratulate the user on completing the settings process\n2. Maintain {{agentName}}'s personality and tone\n3. Summarize the key settings that have been configured\n4. Explain what functionality is now available\n5. Provide guidance on what the user can do next\n6. Express enthusiasm about working together\n\nWrite a natural, conversational response that {{agentName}} would send about the successful completion of settings.\nInclude the actions array [\"ONBOARDING_COMPLETE\"] in your response.\n${messageCompletionFooter}`;\n\n/**\n * Gets settings state from world metadata\n */\n/**\n * Retrieves the settings for a specific world from the database.\n * Settings are stored encrypted; this function decrypts secret values before returning.\n * @param {IAgentRuntime} runtime - The Agent Runtime instance.\n * @param {UUID} worldId - The UUID of the world.\n * @returns {Promise<WorldSettings | null>} The settings of the world (decrypted), or null if not found.\n */\nexport async function getWorldSettings(\n runtime: IAgentRuntime,\n worldId: UUID\n): Promise<WorldSettings | null> {\n try {\n const world = await runtime.getWorld(worldId);\n\n if (!world || !world.metadata?.settings) {\n return null;\n }\n\n // Decrypt secret values before returning (settings are stored encrypted)\n const salt = getSalt();\n return unsaltWorldSettings(world.metadata.settings as WorldSettings, salt);\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error getting settings state'\n );\n return null;\n }\n}\n\n/**\n * Updates settings state in world metadata\n */\nexport async function updateWorldSettings(\n runtime: IAgentRuntime,\n worldId: UUID,\n worldSettings: WorldSettings\n): Promise<boolean> {\n try {\n const world = await runtime.getWorld(worldId);\n\n if (!world) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId, worldId },\n 'No world found'\n );\n return false;\n }\n\n // Initialize metadata if it doesn't exist\n if (!world.metadata) {\n world.metadata = {};\n }\n\n // Encrypt secret values before saving (settings must be stored encrypted)\n const salt = getSalt();\n const saltedSettings = saltWorldSettings(worldSettings, salt);\n\n // Update settings state\n world.metadata.settings = saltedSettings;\n\n // Save updated world\n await runtime.updateWorld(world);\n\n return true;\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error updating settings state'\n );\n return false;\n }\n}\n\n/**\n * Formats a list of settings for display\n */\nfunction formatSettingsList(worldSettings: WorldSettings): string {\n const settings = Object.entries(worldSettings)\n .filter(([key]) => !key.startsWith('_')) // Skip internal settings\n .map(([key, setting]: [string, Setting]) => {\n const status = setting.value !== null ? 'Configured' : 'Not configured';\n const required = setting.required ? 'Required' : 'Optional';\n return `- ${setting.name} (${key}): ${status}, ${required}`;\n })\n .join('\\n');\n\n return settings || 'No settings available';\n}\n\n/**\n * Categorizes settings by their configuration status\n */\nfunction categorizeSettings(worldSettings: WorldSettings): {\n configured: [string, Setting][];\n requiredUnconfigured: [string, Setting][];\n optionalUnconfigured: [string, Setting][];\n} {\n const configured: [string, Setting][] = [];\n const requiredUnconfigured: [string, Setting][] = [];\n const optionalUnconfigured: [string, Setting][] = [];\n\n for (const [key, setting] of Object.entries(worldSettings)) {\n // Skip internal settings\n if (key.startsWith('_')) {\n continue;\n }\n\n const typedSetting = setting as Setting;\n\n if (typedSetting.value !== null) {\n configured.push([key, typedSetting]);\n } else if (typedSetting.required) {\n requiredUnconfigured.push([key, typedSetting]);\n } else {\n optionalUnconfigured.push([key, typedSetting]);\n }\n }\n\n return { configured, requiredUnconfigured, optionalUnconfigured };\n}\n\n/**\n * Extracts setting values from user message with improved handling of multiple settings\n */\nasync function extractSettingValues(\n runtime: IAgentRuntime,\n _message: Memory,\n state: State,\n worldSettings: WorldSettings\n): Promise<SettingUpdate[]> {\n // Find what settings need to be configured\n const { requiredUnconfigured, optionalUnconfigured } = categorizeSettings(worldSettings);\n\n // Generate a prompt to extract settings from the user's message\n const settingsContext = requiredUnconfigured\n .concat(optionalUnconfigured)\n .map(([key, setting]) => {\n const requiredStr = setting.required ? 'Required.' : 'Optional.';\n return `${key}: ${setting.description} ${requiredStr}`;\n })\n .join('\\n');\n\n const basePrompt = dedent`\n I need to extract settings values from the user's message.\n \n Available settings:\n ${settingsContext}\n \n User message: ${state.text}\n\n For each setting mentioned in the user's message, extract the value.\n \n Only return settings that are clearly mentioned in the user's message.\n If a setting is mentioned but no clear value is provided, do not include it.\n `;\n\n try {\n // Use runtime.useModel directly with strong typing\n const result = await runtime.useModel<typeof ModelType.OBJECT_LARGE, SettingUpdate[]>(\n ModelType.OBJECT_LARGE,\n {\n prompt: basePrompt,\n output: 'array',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n key: { type: 'string' },\n value: { type: 'string' },\n },\n required: ['key', 'value'],\n },\n },\n }\n );\n\n // Validate the extracted settings\n if (!result) {\n return [];\n }\n\n function extractValidSettings(obj: unknown, worldSettings: WorldSettings) {\n const extracted: SettingUpdate[] = [];\n\n function traverse(node: unknown): void {\n if (Array.isArray(node)) {\n for (const item of node) {\n traverse(item);\n }\n } else if (typeof node === 'object' && node !== null) {\n for (const [key, value] of Object.entries(node)) {\n if (worldSettings[key] && typeof value !== 'object') {\n extracted.push({ key, value });\n } else {\n traverse(value);\n }\n }\n }\n }\n\n traverse(obj);\n return extracted;\n }\n\n const extractedSettings = extractValidSettings(result, worldSettings);\n\n return extractedSettings;\n } catch (error) {\n console.error('Error extracting settings:', error);\n return [];\n }\n}\n\n/**\n * Processes multiple setting updates atomically\n */\nasync function processSettingUpdates(\n runtime: IAgentRuntime,\n worldId: UUID,\n worldSettings: WorldSettings,\n updates: SettingUpdate[]\n): Promise<{ updatedAny: boolean; messages: string[] }> {\n if (!updates.length) {\n return { updatedAny: false, messages: [] };\n }\n\n const messages: string[] = [];\n let updatedAny = false;\n\n try {\n // Create a copy of the state for atomic updates\n const updatedState = { ...worldSettings };\n\n // Process all updates\n for (const update of updates) {\n const setting = updatedState[update.key];\n if (!setting) {\n continue;\n }\n\n // Check dependencies if they exist\n if (setting.dependsOn?.length) {\n const dependenciesMet = setting.dependsOn.every((dep) => updatedState[dep]?.value !== null);\n if (!dependenciesMet) {\n messages.push(`Cannot update ${setting.name} - dependencies not met`);\n continue;\n }\n }\n\n // Update the setting\n updatedState[update.key] = {\n ...setting,\n value: update.value,\n };\n\n messages.push(`Updated ${setting.name} successfully`);\n updatedAny = true;\n\n // Execute onSetAction if defined\n if (setting.onSetAction) {\n const actionMessage = setting.onSetAction(update.value);\n if (actionMessage) {\n messages.push(actionMessage);\n }\n }\n }\n\n // If any updates were made, save the entire state to world metadata\n if (updatedAny) {\n // Save to world metadata\n const saved = await updateWorldSettings(runtime, worldId, updatedState);\n\n if (!saved) {\n throw new Error('Failed to save updated state to world metadata');\n }\n\n // Verify save by retrieving it again\n const savedState = await getWorldSettings(runtime, worldId);\n if (!savedState) {\n throw new Error('Failed to verify state save');\n }\n }\n\n return { updatedAny, messages };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing setting updates'\n );\n return {\n updatedAny: false,\n messages: ['Error occurred while updating settings'],\n };\n }\n}\n\n/**\n * Handles the completion of settings when all required settings are configured\n */\nasync function handleOnboardingComplete(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n _state: State,\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n // Generate completion message\n const prompt = composePrompt({\n state: {\n settingsStatus: formatSettingsList(worldSettings),\n },\n template: completionTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['ONBOARDING_COMPLETE'],\n source: 'discord',\n });\n\n return {\n text: 'Onboarding completed successfully',\n values: {\n success: true,\n onboardingComplete: true,\n allRequiredConfigured: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'ONBOARDING_COMPLETE',\n settingsStatus: formatSettingsList(worldSettings),\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error handling settings completion'\n );\n await callback({\n text: 'Great! All required settings have been configured. Your server is now fully set up and ready to use.',\n actions: ['ONBOARDING_COMPLETE'],\n source: 'discord',\n });\n\n return {\n text: 'Onboarding completed with fallback message',\n values: {\n success: true,\n onboardingComplete: true,\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'ONBOARDING_COMPLETE',\n error: error instanceof Error ? error.message : String(error),\n },\n success: true,\n };\n }\n}\n\n/**\n * Generates a success response for setting updates\n */\nasync function generateSuccessResponse(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n state: State,\n messages: string[],\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n // Check if all required settings are now configured\n const { requiredUnconfigured } = categorizeSettings(worldSettings);\n\n if (requiredUnconfigured.length === 0) {\n // All required settings are configured, complete settings\n return await handleOnboardingComplete(runtime, worldSettings, state, callback);\n }\n\n const requiredUnconfiguredString = requiredUnconfigured\n .map(([key, setting]) => `${key}: ${setting.name}`)\n .join('\\n');\n\n // Generate success message\n const prompt = composePrompt({\n state: {\n updateMessages: messages.join('\\n'),\n nextSetting: requiredUnconfiguredString,\n remainingRequired: requiredUnconfigured.length.toString(),\n },\n template: successTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n });\n\n return {\n text: 'Settings updated successfully',\n values: {\n success: true,\n settingsUpdated: true,\n remainingRequired: requiredUnconfigured.length,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATED',\n updatedMessages: messages,\n remainingRequired: requiredUnconfigured.length,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating success response'\n );\n await callback({\n text: 'Settings updated successfully. Please continue with the remaining configuration.',\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n });\n\n return {\n text: 'Settings updated with fallback message',\n values: {\n success: true,\n settingsUpdated: true,\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATED',\n error: error instanceof Error ? error.message : String(error),\n },\n success: true,\n };\n }\n}\n\n/**\n * Generates a failure response when no settings could be updated\n */\nasync function generateFailureResponse(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n state: State,\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n // Get next required setting\n const { requiredUnconfigured } = categorizeSettings(worldSettings);\n\n if (requiredUnconfigured.length === 0) {\n // All required settings are configured, complete settings\n return await handleOnboardingComplete(runtime, worldSettings, state, callback);\n }\n\n const requiredUnconfiguredString = requiredUnconfigured\n .map(([key, setting]) => `${key}: ${setting.name}`)\n .join('\\n');\n\n // Generate failure message\n const prompt = composePrompt({\n state: {\n nextSetting: requiredUnconfiguredString,\n remainingRequired: requiredUnconfigured.length.toString(),\n },\n template: failureTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['SETTING_UPDATE_FAILED'],\n source: 'discord',\n });\n\n return {\n text: 'No settings were updated',\n values: {\n success: false,\n settingsUpdated: false,\n remainingRequired: requiredUnconfigured.length,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_FAILED',\n remainingRequired: requiredUnconfigured.length,\n },\n success: false,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating failure response'\n );\n await callback({\n text: \"I couldn't understand your settings update. Please try again with a clearer format.\",\n actions: ['SETTING_UPDATE_FAILED'],\n source: 'discord',\n });\n\n return {\n text: 'Failed to parse settings with fallback message',\n values: {\n success: false,\n settingsUpdated: false,\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_FAILED',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n };\n }\n}\n\n/**\n * Generates an error response for unexpected errors\n */\nasync function generateErrorResponse(\n runtime: IAgentRuntime,\n state: State,\n callback: HandlerCallback\n): Promise<ActionResult> {\n try {\n const prompt = composePromptFromState({\n state,\n template: errorTemplate,\n });\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n });\n\n const responseContent = parseKeyValueXml(response) as Content;\n\n await callback({\n text: responseContent.text,\n actions: ['SETTING_UPDATE_ERROR'],\n source: 'discord',\n });\n\n return {\n text: 'Error processing settings',\n values: {\n success: false,\n error: 'PROCESSING_ERROR',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_ERROR',\n },\n success: false,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating error response'\n );\n await callback({\n text: \"I'm sorry, but I encountered an error while processing your request. Please try again or contact support if the issue persists.\",\n actions: ['SETTING_UPDATE_ERROR'],\n source: 'discord',\n });\n\n return {\n text: 'Error with fallback message',\n values: {\n success: false,\n error: 'PROCESSING_ERROR',\n fallbackUsed: true,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n action: 'SETTING_UPDATE_ERROR',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n}\n\n/**\n * Enhanced settings action with improved state management and logging\n * Updated to use world metadata instead of cache\n */\nexport const updateSettingsAction: Action = {\n name: 'UPDATE_SETTINGS',\n similes: ['UPDATE_SETTING', 'SAVE_SETTING', 'SET_CONFIGURATION', 'CONFIGURE'],\n description:\n 'Saves a configuration setting during the onboarding process, or update an existing setting. Use this when you are onboarding with a world owner or admin.',\n\n validate: async (runtime: IAgentRuntime, message: Memory, _state?: State): Promise<boolean> => {\n try {\n if (message.content.channelType !== ChannelType.DM) {\n logger.debug(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n channelType: message.content.channelType,\n },\n 'Skipping settings in non-DM channel'\n );\n return false;\n }\n\n // Find the server where this user is the owner\n logger.debug(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'Looking for server where user is owner'\n );\n const worlds = await findWorldsForOwner(runtime, message.entityId);\n if (!worlds) {\n return false;\n }\n\n const world = worlds.find((world) => world.metadata?.settings);\n\n // Check if there's an active settings state in world metadata\n const worldSettings = world?.metadata?.settings;\n\n if (!worldSettings) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n serverId: world?.messageServerId,\n },\n 'No settings state found for server'\n );\n return false;\n }\n\n logger.debug(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n serverId: world.messageServerId,\n },\n 'Found valid settings state for server'\n );\n return true;\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error validating settings action'\n );\n return false;\n }\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n try {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'State is required for settings handler'\n );\n if (callback) {\n await generateErrorResponse(runtime, state!, callback);\n }\n return {\n text: 'State is required for settings handler',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for settings handler'),\n };\n }\n\n if (!message) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'Message is required for settings handler'\n );\n await generateErrorResponse(runtime, state, callback!);\n return {\n text: 'Message is required for settings handler',\n values: {\n success: false,\n error: 'MESSAGE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'Message is required',\n },\n success: false,\n error: new Error('Message is required for settings handler'),\n };\n }\n\n if (!callback) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'Callback is required for settings handler'\n );\n return {\n text: 'Callback is required for settings handler',\n values: {\n success: false,\n error: 'CALLBACK_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'Callback is required',\n },\n success: false,\n error: new Error('Callback is required for settings handler'),\n };\n }\n\n // Find the server where this user is the owner\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'Handler looking for server for user'\n );\n const worlds = await findWorldsForOwner(runtime, message.entityId);\n const serverOwnership = worlds?.find((world) => world.metadata?.settings);\n if (!serverOwnership) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'No server found for user in handler'\n );\n await generateErrorResponse(runtime, state, callback);\n return {\n text: 'No server found for user',\n values: {\n success: false,\n error: 'NO_SERVER_FOUND',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'No server found where user is owner',\n entityId: message.entityId,\n },\n success: false,\n };\n }\n\n const worldId = serverOwnership.id;\n logger.info(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId, worldId },\n 'Using world ID'\n );\n\n // Get settings state directly from the world object we already have\n // Must decrypt secret values (settings are stored encrypted)\n const rawSettings = serverOwnership.metadata?.settings as WorldSettings | undefined;\n const worldSettings = rawSettings ? unsaltWorldSettings(rawSettings, getSalt()) : undefined;\n\n if (!worldSettings) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId, worldId },\n 'No settings state found for world in handler'\n );\n await generateErrorResponse(runtime, state, callback);\n return {\n text: 'No settings state found',\n values: {\n success: false,\n error: 'NO_SETTINGS_STATE',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'No settings state found for world',\n worldId,\n },\n success: false,\n };\n }\n\n // Extract setting values from message\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n text: message.content.text,\n },\n 'Extracting settings from message'\n );\n const extractedSettings = await extractSettingValues(runtime, message, state, worldSettings);\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n count: extractedSettings.length,\n },\n 'Extracted settings'\n );\n\n // Process extracted settings\n const updateResults = await processSettingUpdates(\n runtime,\n worldId,\n worldSettings,\n extractedSettings\n );\n\n // Generate appropriate response\n if (updateResults.updatedAny) {\n logger.info(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n messages: updateResults.messages,\n },\n 'Successfully updated settings'\n );\n\n // Get updated settings state\n const updatedWorldSettings = await getWorldSettings(runtime, worldId);\n if (!updatedWorldSettings) {\n logger.error(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'Failed to retrieve updated settings state'\n );\n await generateErrorResponse(runtime, state, callback);\n return {\n text: 'Failed to retrieve updated settings state',\n values: {\n success: false,\n error: 'RETRIEVE_FAILED',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'Failed to retrieve updated settings state',\n worldId,\n },\n success: false,\n };\n }\n\n await generateSuccessResponse(\n runtime,\n updatedWorldSettings,\n state,\n updateResults.messages,\n callback\n );\n\n // Check if all required settings are configured\n const { requiredUnconfigured } = categorizeSettings(updatedWorldSettings);\n const allConfigured = requiredUnconfigured.length === 0;\n\n return {\n text: 'Settings updated successfully',\n values: {\n success: true,\n settingsUpdated: extractedSettings.length,\n updatedSettings: extractedSettings.map((s) => s.key),\n remainingRequired: requiredUnconfigured.length,\n allConfigured,\n worldId,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n updatedSettings: extractedSettings,\n messages: updateResults.messages,\n remainingRequired: requiredUnconfigured.map(([key, _]) => key),\n allConfigured,\n worldId,\n },\n success: true,\n };\n } else {\n logger.info(\n { src: 'plugin:bootstrap:action:settings', agentId: runtime.agentId },\n 'No settings were updated'\n );\n await generateFailureResponse(runtime, worldSettings, state, callback);\n\n const { requiredUnconfigured } = categorizeSettings(worldSettings);\n\n return {\n text: 'No settings were updated',\n values: {\n success: false,\n error: 'NO_UPDATES',\n remainingRequired: requiredUnconfigured.length,\n worldId,\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: 'No valid settings found in message',\n remainingRequired: requiredUnconfigured.map(([key, _]) => key),\n worldId,\n },\n success: false,\n };\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in settings handler'\n );\n if (state && callback) {\n await generateErrorResponse(runtime, state, callback);\n }\n return {\n text: 'Error in settings handler',\n values: {\n success: false,\n error: 'HANDLER_ERROR',\n },\n data: {\n actionName: 'UPDATE_SETTINGS',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'I want to set up the welcome channel to #general',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Perfect! I've updated your welcome channel to #general. Next, we should configure the automated greeting message that new members will receive.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Let's set the bot prefix to !\",\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Great choice! I've set the command prefix to '!'. Now you can use commands like !help, !info, etc.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Enable auto-moderation for bad language',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Auto-moderation for inappropriate language has been enabled. I'll now filter messages containing offensive content.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'For server logs, use the #server-logs channel',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've configured #server-logs as your logging channel. All server events like joins, leaves, and moderation actions will be recorded there.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"I'd like to have role self-assignment in the #roles channel\",\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Role self-assignment has been set up in the #roles channel. Members can now assign themselves roles by interacting with messages there.',\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Make music commands available in voice-text channels only',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated your music command settings - they'll now only work in voice-text channels. This helps keep other channels clear of music spam.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'For server timezone, set it to EST',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Server timezone has been set to Eastern Standard Time (EST). All scheduled events and timestamps will now display in this timezone.',\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Set verification level to email verified users only',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated the verification requirement to email verified accounts only. This adds an extra layer of security to your server.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'I want to turn off level-up notifications',\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Level-up notifications have been disabled. Members will still earn experience and level up, but there won't be any automatic announcements. You can still view levels with the appropriate commands.\",\n actions: ['SETTING_UPDATED'],\n source: 'discord',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"My server name is 'Gaming Lounge'\",\n source: 'discord',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Great! I've saved 'Gaming Lounge' as your server name. This helps me personalize responses and know how to refer to your community. We've completed all the required settings! Your server is now fully configured and ready to use. You can always adjust these settings later if needed.\",\n actions: ['ONBOARDING_COMPLETE'],\n source: 'discord',\n },\n },\n ],\n ] as ActionExample[][],\n};\n",
21
21
  "function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nconst dedent = createDedent({});\nexport default dedent;\nfunction createDedent(options) {\n dedent.withOptions = newOptions => createDedent(_objectSpread(_objectSpread({}, options), newOptions));\n return dedent;\n function dedent(strings, ...values) {\n const raw = typeof strings === \"string\" ? [strings] : strings.raw;\n const {\n escapeSpecialCharacters = Array.isArray(strings)\n } = options;\n\n // first, perform interpolation\n let result = \"\";\n for (let i = 0; i < raw.length; i++) {\n let next = raw[i];\n if (escapeSpecialCharacters) {\n // handle escaped newlines, backticks, and interpolation characters\n next = next.replace(/\\\\\\n[ \\t]*/g, \"\").replace(/\\\\`/g, \"`\").replace(/\\\\\\$/g, \"$\").replace(/\\\\\\{/g, \"{\");\n }\n result += next;\n if (i < values.length) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n result += values[i];\n }\n }\n\n // now strip indentation\n const lines = result.split(\"\\n\");\n let mindent = null;\n for (const l of lines) {\n const m = l.match(/^(\\s+)\\S+/);\n if (m) {\n const indent = m[1].length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n }\n if (mindent !== null) {\n const m = mindent; // appease TypeScript\n result = lines\n // https://github.com/typescript-eslint/typescript-eslint/issues/7140\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\n .map(l => l[0] === \" \" || l[0] === \"\\t\" ? l.slice(m) : l).join(\"\\n\");\n }\n\n // dedent eats leading and trailing whitespace too\n result = result.trim();\n if (escapeSpecialCharacters) {\n // handle escaped newlines at the end to ensure they don't get stripped too\n result = result.replace(/\\\\n/g, \"\\n\");\n }\n return result;\n }\n}\n",
22
- "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n type Memory,\n ModelType,\n parseBooleanFromText,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template for deciding if an agent should stop closely following a previously followed room\n *\n * @type {string}\n */\n/**\n * Template for determining if an agent should stop closely following a room and only respond when mentioned.\n * @param {string} agentName - The name of the agent to be referenced in the template.\n * @param {string} recentMessages - The recent messages in the conversation to be included in the template.\n * @param {string} booleanFooter - The footer for the template indicating the possible responses.\n * @returns {string} The template with placeholders for agent name, recent messages, and response.\n */\nconst shouldUnfollowTemplate = `# Task: Decide if {{agentName}} should stop closely following this previously followed room and only respond when mentioned.\n\n{{recentMessages}}\n\nShould {{agentName}} stop closely following this previously followed room and only respond when mentioned?\nRespond with YES if:\n- The user has suggested that {{agentName}} is over-participating or being disruptive\n- {{agentName}}'s eagerness to contribute is not well-received by the users\n- The conversation has shifted to a topic where {{agentName}} has less to add\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action for unfollowing a room.\n *\n * - Name: UNFOLLOW_ROOM\n * - Similes: [\"UNFOLLOW_CHAT\", \"UNFOLLOW_CONVERSATION\", \"UNFOLLOW_ROOM\", \"UNFOLLOW_THREAD\"]\n * - Description: Stop following this channel. You can still respond if explicitly mentioned, but you won't automatically chime in anymore. Unfollow if you're annoying people or have been asked to.\n * - Validate function checks if the room state is \"FOLLOWED\".\n * - Handler function handles the unfollowing logic based on user input.\n * - Examples provide sample interactions for unfollowing a room.\n */\nexport const unfollowRoomAction: Action = {\n name: 'UNFOLLOW_ROOM',\n similes: ['UNFOLLOW_CHAT', 'UNFOLLOW_CONVERSATION', 'UNFOLLOW_ROOM', 'UNFOLLOW_THREAD'],\n description:\n \"Stop following this channel. You can still respond if explicitly mentioned, but you won't automatically chime in anymore. Unfollow if you're annoying people or have been asked to.\",\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState === 'FOLLOWED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n async function _shouldUnfollow(state: State): Promise<boolean> {\n const shouldUnfollowPrompt = composePromptFromState({\n state,\n template: shouldUnfollowTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: shouldUnfollowPrompt,\n });\n\n const parsedResponse = parseBooleanFromText(response.trim());\n\n return parsedResponse as boolean;\n }\n\n if (state && (await _shouldUnfollow(state))) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, null);\n\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I unfollowed the room ${room.name}`,\n actions: ['UNFOLLOW_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Stopped following room: ${room.name}`,\n values: {\n success: true,\n roomUnfollowed: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: null,\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n unfollowed: true,\n },\n success: true,\n };\n } catch (error) {\n return {\n text: 'Failed to unfollow room',\n values: {\n success: false,\n error: 'UNFOLLOW_FAILED',\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n // Decided not to unfollow or missing state\n if (!state) {\n return {\n text: 'State is required for unfollow room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for unfollow room action'),\n };\n }\n\n // Create memory about the failed attempt\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: \"I tried to unfollow a room but I'm not in a room\",\n actions: ['UNFOLLOW_ROOM_FAILED'],\n },\n metadata: {\n type: 'UNFOLLOW_ROOM',\n },\n },\n 'messages'\n );\n\n return {\n text: 'Did not unfollow room - criteria not met',\n values: {\n success: true,\n roomUnfollowed: false,\n roomId: message.roomId,\n reason: 'CRITERIA_NOT_MET',\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n roomId: message.roomId,\n unfollowed: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Hey {{name2}} stop participating in this channel for now',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Alright, I will stop chiming in',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Has anyone tried the new update',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Yes, it's pretty slick\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '{{name3}}, please stop following this chat',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Understood',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name3}} stop participating here so frequently',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'll only respond when mentioned\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'thoughts on the budget',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}} should we increase it',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'A small increase could work given our past results...',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, unfollow this room for now',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'll only engage when asked\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'wait {{name3}} come back and give me your thoughts',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Okay... I think it's intuitive, parallel tests are nice\",\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'yo {{name2}} chill on all the messages damn',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"my bad, I'll step back\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} STOP MESSAGING IN THIS ROOM',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"No problem, I've got other stuff to work on\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} ur bein annoyin pls stop',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sry, ill chill',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, please cease engaging in this room',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'No sweat',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'Excited for the weekend, any plans folks',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: \"{{name3}} you're getting a bit too chatty, tone it down\",\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Noted',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name2}} can u like... not',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Sorry, I'll go work on other things\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, your eagerness is disruptive, please desist',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'My apologies, I shall withdraw post-haste',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} stahp following dis room plz',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'kk sry ill stahppp',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'stfu you stupid bot',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sry',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
23
- "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template for determining if an agent should unmute a previously muted room.\n * * @type { string }\n */\n/**\n * Template for deciding if {{agentName}} should unmute a previously muted room.\n *\n * @type {string}\n */\nexport const shouldUnmuteTemplate = `# Task: Decide if {{agentName}} should unmute this previously muted room and start considering it for responses again.\n\n{{recentMessages}}\n\nShould {{agentName}} unmute this previously muted room and start considering it for responses again?\nRespond with YES if:\n- The user has explicitly asked {{agentName}} to start responding again\n- The user seems to want to re-engage with {{agentName}} in a respectful manner\n- The tone of the conversation has improved and {{agentName}}'s input would be welcome\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action to unmute a room, allowing the agent to consider responding to messages again.\n *\n * @name UNMUTE_ROOM\n * @similes [\"UNMUTE_CHAT\", \"UNMUTE_CONVERSATION\", \"UNMUTE_ROOM\", \"UNMUTE_THREAD\"]\n * @description Unmutes a room, allowing the agent to consider responding to messages again.\n *\n * @param {IAgentRuntime} runtime - The agent runtime to access runtime functionalities.\n * @param {Memory} message - The message containing information about the room.\n * @returns {Promise<boolean>} A boolean value indicating if the room was successfully unmuted.\n */\nexport const unmuteRoomAction: Action = {\n name: 'UNMUTE_ROOM',\n similes: ['UNMUTE_CHAT', 'UNMUTE_CONVERSATION', 'UNMUTE_ROOM', 'UNMUTE_THREAD'],\n description: 'Unmutes a room, allowing the agent to consider responding to messages again.',\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState === 'MUTED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n async function _shouldUnmute(state: State): Promise<boolean> {\n const shouldUnmutePrompt = composePromptFromState({\n state,\n template: shouldUnmuteTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n runtime,\n prompt: shouldUnmutePrompt,\n stopSequences: [],\n });\n\n const cleanedResponse = response.trim().toLowerCase();\n\n // Handle various affirmative responses\n if (\n cleanedResponse === 'true' ||\n cleanedResponse === 'yes' ||\n cleanedResponse === 'y' ||\n cleanedResponse.includes('true') ||\n cleanedResponse.includes('yes')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I will now unmute this room and start considering it for responses again',\n actions: ['UNMUTE_ROOM_STARTED'],\n },\n metadata: {\n type: 'UNMUTE_ROOM',\n },\n },\n 'messages'\n );\n return true;\n }\n\n // Handle various negative responses\n if (\n cleanedResponse === 'false' ||\n cleanedResponse === 'no' ||\n cleanedResponse === 'n' ||\n cleanedResponse.includes('false') ||\n cleanedResponse.includes('no')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I tried to unmute a room but I decided not to',\n actions: ['UNMUTE_ROOM_FAILED'],\n },\n metadata: {\n type: 'UNMUTE_ROOM',\n },\n },\n 'messages'\n );\n return false;\n }\n\n // Default to false if response is unclear\n logger.warn(\n { src: 'plugin:bootstrap:action:unmute_room', agentId: runtime.agentId, response },\n 'Unclear boolean response, defaulting to false'\n );\n return false;\n }\n\n if (!state) {\n return {\n text: 'State is required for unmute room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for unmute room action'),\n };\n }\n\n const shouldUnmute = await _shouldUnmute(state);\n\n if (shouldUnmute) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, null);\n\n const room = await runtime.getRoom(message.roomId);\n\n if (!room) {\n logger.warn(\n {\n src: 'plugin:bootstrap:action:unmute_room',\n agentId: runtime.agentId,\n roomId: message.roomId,\n },\n 'Room not found'\n );\n return {\n text: `Room not found: ${message.roomId}`,\n values: {\n success: false,\n error: 'ROOM_NOT_FOUND',\n roomId: message.roomId,\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n error: 'Room not found',\n roomId: message.roomId,\n },\n success: false,\n };\n }\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I unmuted the room ${room.name}`,\n actions: ['UNMUTE_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Room unmuted: ${room.name}`,\n values: {\n success: true,\n roomUnmuted: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: null,\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n unmuted: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:unmute_room',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error unmuting room'\n );\n return {\n text: 'Failed to unmute room',\n values: {\n success: false,\n error: 'UNMUTE_FAILED',\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n return {\n text: 'Decided not to unmute room',\n values: {\n success: true,\n roomUnmuted: false,\n roomId: message.roomId,\n reason: 'CRITERIA_NOT_MET',\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n roomId: message.roomId,\n unmuted: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, you can unmute this channel now',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Done',\n actions: ['UNMUTE_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I could use some help troubleshooting this bug.',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Can you post the specific error message',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, please unmute this room. We could use your input again.',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Sounds good',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} wait you should come back and chat in here',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'im back',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'unmute urself {{name2}}',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'unmuted',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'ay {{name2}} get back in here',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sup yall',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
24
- "// I want to create an action that lets anyone create or update a component for an entity.\n// Components represent different sources of data about an entity (telegram, twitter, etc)\n// Sources can be registered by plugins or inferred from room context and available components\n// The action should first check if the component exists for the entity, and if not, create it.\n// We want to use an LLM (runtime.useModel) to generate the component data.\n// We should include the prior component data if it exists, and have the LLM output an update to the component.\n// sourceEntityId represents who is making the update, entityId is who they are talking about\n\nimport {\n type Action,\n type ActionExample,\n Component,\n composePromptFromState,\n findEntityByName,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type UUID,\n type ActionResult,\n parseKeyValueXml,\n} from '@elizaos/core';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Component Template for Task: Extract Source and Update Component Data\n *\n * @type {string}\n */\n/**\n * Component Template for extracting source and updating component data.\n *\n * @type {string}\n */\nconst componentTemplate = `# Task: Extract Source and Update Component Data\n\n{{recentMessages}}\n\n{{#if existingData}}\n# Existing Component Data:\n{{existingData}}\n{{/if}}\n\n# Instructions:\n1. Analyze the conversation to identify:\n - The source/platform being referenced (e.g. telegram, twitter, discord)\n - Any specific component data being shared\n\n2. Generate updated component data that:\n - Is specific to the identified platform/source\n - Preserves existing data when appropriate\n - Includes the new information from the conversation\n - Contains only valid data for this component type\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nReturn an XML response with the following structure:\n<response>\n <source>platform-name</source>\n <data>\n <username>username_value</username>\n <displayName>display_name_value</displayName>\n <!-- Add other component-specific fields as needed -->\n </data>\n</response>\n\nExample outputs:\n1. For \"my telegram username is @dev_guru\":\n<response>\n <source>telegram</source>\n <data>\n <username>dev_guru</username>\n </data>\n</response>\n\n2. For \"update my twitter handle to @tech_master\":\n<response>\n <source>twitter</source>\n <data>\n <username>tech_master</username>\n </data>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Action for updating contact details for a user entity.\n *\n * @name UPDATE_ENTITY\n * @description Add or edit contact details for a user entity (like twitter, discord, email address, etc.)\n *\n * @param {IAgentRuntime} _runtime - The runtime environment.\n * @param {Memory} _message - The message data.\n * @param {State} _state - The current state.\n * @returns {Promise<boolean>} Returns a promise indicating if validation was successful.\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @param {Memory} message - The message data.\n * @param {State} state - The current state.\n * @param {any} _options - Additional options.\n * @param {HandlerCallback} callback - The callback function.\n * @param {Memory[]} responses - Array of responses.\n * @returns {Promise<void>} Promise that resolves after handling the update entity action.\n *\n * @example\n * [\n * [\n * {\n * name: \"{{name1}}\",\n * content: {\n * text: \"Please update my telegram username to @dev_guru\",\n * },\n * },\n * {\n * name: \"{{name2}}\",\n * content: {\n * text: \"I've updated your telegram information.\",\n * actions: [\"UPDATE_ENTITY\"],\n * },\n * },\n * ],\n * ...\n * ]\n */\nexport const updateEntityAction: Action = {\n name: 'UPDATE_CONTACT',\n similes: ['UPDATE_ENTITY'],\n description:\n 'Add or edit contact details for a person you are talking to or observing in the conversation. Use this when you learn this information from the conversation about a contact. This is for the agent to relate entities across platforms, not for world settings or configuration.',\n\n validate: async (_runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> => {\n // Check if we have any registered sources or existing components that could be updated\n // const worldId = message.roomId;\n // const agentId = runtime.agentId;\n\n // // Get all components for the current room to understand available sources\n // const roomComponents = await runtime.getComponents(message.roomId, worldId, agentId);\n\n // // Get source types from room components\n // const availableSources = new Set(roomComponents.map(c => c.type));\n return true; // availableSources.size > 0;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: any,\n callback?: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n try {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'State is required for the updateEntity action'\n );\n return {\n text: 'State is required for updateEntity action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for the updateEntity action'),\n };\n }\n\n if (!callback) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'Callback is required for the updateEntity action'\n );\n return {\n text: 'Callback is required for updateEntity action',\n values: {\n success: false,\n error: 'CALLBACK_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Callback is required',\n },\n success: false,\n error: new Error('Callback is required for the updateEntity action'),\n };\n }\n\n if (!responses) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'Responses are required for the updateEntity action'\n );\n return {\n text: 'Responses are required for updateEntity action',\n values: {\n success: false,\n error: 'RESPONSES_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Responses are required',\n },\n success: false,\n error: new Error('Responses are required for the updateEntity action'),\n };\n }\n\n if (!message) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'Message is required for the updateEntity action'\n );\n return {\n text: 'Message is required for updateEntity action',\n values: {\n success: false,\n error: 'MESSAGE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Message is required',\n },\n success: false,\n error: new Error('Message is required for the updateEntity action'),\n };\n }\n\n // Handle initial responses\n for (const response of responses) {\n await callback(response.content);\n }\n\n const sourceEntityId = message.entityId;\n const agentId = runtime.agentId;\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n const worldId = room.worldId;\n\n // First, find the entity being referenced\n const entity = await findEntityByName(runtime, message, state);\n\n if (!entity) {\n await callback({\n text: \"I'm not sure which entity you're trying to update. Could you please specify who you're talking about?\",\n actions: ['UPDATE_ENTITY_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Entity not found',\n values: {\n success: false,\n error: 'ENTITY_NOT_FOUND',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Could not find entity to update',\n },\n success: false,\n };\n }\n\n // Get existing component if it exists - we'll get this after the LLM identifies the source\n let existingComponent: Component | null = null;\n\n // Generate component data using the combined template\n const prompt = composePromptFromState({\n state,\n template: componentTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n stopSequences: [],\n });\n\n // Parse the generated data\n let parsedResult: any;\n try {\n parsedResult = parseKeyValueXml(result);\n\n if (!parsedResult || !parsedResult.source || !parsedResult.data) {\n throw new Error('Invalid response format - missing source or data');\n }\n } catch (error: any) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_entity',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to parse component data'\n );\n await callback({\n text: \"I couldn't properly understand the component information. Please try again with more specific information.\",\n actions: ['UPDATE_ENTITY_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Failed to parse component data',\n values: {\n success: false,\n error: 'PARSE_ERROR',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: error.message,\n },\n success: false,\n error: error,\n };\n }\n\n const componentType = parsedResult.source.toLowerCase();\n const componentData = parsedResult.data;\n\n // Now that we know the component type, get the existing component if it exists\n existingComponent = await runtime.getComponent(\n entity.id!,\n componentType,\n worldId,\n sourceEntityId\n );\n\n // Create or update the component\n if (existingComponent) {\n await runtime.updateComponent({\n id: existingComponent.id,\n entityId: entity.id!,\n worldId,\n type: componentType,\n data: componentData,\n agentId,\n roomId: message.roomId,\n sourceEntityId,\n createdAt: existingComponent.createdAt,\n });\n\n await callback({\n text: `I've updated the ${componentType} information for ${entity.names[0]}.`,\n actions: ['UPDATE_ENTITY'],\n source: message.content.source,\n });\n\n return {\n text: `Updated ${componentType} information`,\n values: {\n success: true,\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentUpdated: true,\n isNewComponent: false,\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentData,\n existingComponentId: existingComponent.id,\n },\n success: true,\n };\n } else {\n const newComponentId = uuidv4() as UUID;\n await runtime.createComponent({\n id: newComponentId,\n entityId: entity.id!,\n worldId,\n type: componentType,\n data: componentData,\n agentId,\n roomId: message.roomId,\n sourceEntityId,\n createdAt: Date.now(),\n });\n\n await callback({\n text: `I've added new ${componentType} information for ${entity.names[0]}.`,\n actions: ['UPDATE_ENTITY'],\n source: message.content.source,\n });\n\n return {\n text: `Added new ${componentType} information`,\n values: {\n success: true,\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentCreated: true,\n isNewComponent: true,\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentData,\n newComponentId,\n },\n success: true,\n };\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_entity',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in updateEntity handler'\n );\n await callback?.({\n text: 'There was an error processing the entity information.',\n actions: ['UPDATE_ENTITY_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error processing entity information',\n values: {\n success: false,\n error: 'HANDLER_ERROR',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Please update my telegram username to @dev_guru',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated your telegram information.\",\n actions: ['UPDATE_ENTITY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Set Jimmy's twitter username to @jimmy_codes\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated Jimmy's twitter information.\",\n actions: ['UPDATE_ENTITY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Update my discord username to dev_guru#1234',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated your discord information.\",\n actions: ['UPDATE_ENTITY'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default updateEntityAction;\n",
25
- "import { z } from 'zod';\nimport { asUUID, getEntityDetails, parseKeyValueXml } from '@elizaos/core';\nimport { composePrompt } from '@elizaos/core';\nimport {\n type Entity,\n type Evaluator,\n type IAgentRuntime,\n type Memory,\n ModelType,\n type State,\n type UUID,\n} from '@elizaos/core';\nimport { v4 } from 'uuid';\n\n// Schema definitions for the reflection output\nconst relationshipSchema = z.object({\n sourceEntityId: z.string(),\n targetEntityId: z.string(),\n tags: z.array(z.string()),\n metadata: z\n .object({\n interactions: z.number(),\n })\n .optional(),\n});\n\n/**\n * Defines a schema for reflecting on a topic, including facts and relationships.\n * @type {import(\"zod\").object}\n * @property {import(\"zod\").array<import(\"zod\").object<{claim: import(\"zod\").string(), type: import(\"zod\").string(), in_bio: import(\"zod\").boolean(), already_known: import(\"zod\").boolean()}>} facts Array of facts about the topic\n * @property {import(\"zod\").array<import(\"zod\").object>} relationships Array of relationships related to the topic\n */\n/**\n * JSDoc comment for reflectionSchema object:\n *\n * Represents a schema for an object containing 'facts' and 'relationships'.\n * 'facts' is an array of objects with properties 'claim', 'type', 'in_bio', and 'already_known'.\n * 'relationships' is an array of objects following the relationshipSchema.\n */\n\nz.object({\n // reflection: z.string(),\n facts: z.array(\n z.object({\n claim: z.string(),\n type: z.string(),\n in_bio: z.boolean(),\n already_known: z.boolean(),\n })\n ),\n relationships: z.array(relationshipSchema),\n});\n\n/**\n * Template string for generating Agent Reflection, Extracting Facts, and Relationships.\n *\n * @type {string}\n */\nconst reflectionTemplate = `# Task: Generate Agent Reflection, Extract Facts and Relationships\n\n{{providers}}\n\n# Examples:\n{{evaluationExamples}}\n\n# Entities in Room\n{{entitiesInRoom}}\n\n# Existing Relationships\n{{existingRelationships}}\n\n# Current Context:\nAgent Name: {{agentName}}\nRoom Type: {{roomType}}\nMessage Sender: {{senderName}} (ID: {{senderId}})\n\n{{recentMessages}}\n\n# Known Facts:\n{{knownFacts}}\n\n# Instructions:\n1. Generate a self-reflective thought on the conversation about your performance and interaction quality.\n2. Extract new facts from the conversation.\n3. Identify and describe relationships between entities.\n - The sourceEntityId is the UUID of the entity initiating the interaction.\n - The targetEntityId is the UUID of the entity being interacted with.\n - Relationships are one-direction, so a friendship would be two entity relationships where each entity is both the source and the target of the other.\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nGenerate a response in the following format:\n<response>\n <thought>a self-reflective thought on the conversation</thought>\n <facts>\n <fact>\n <claim>factual statement</claim>\n <type>fact|opinion|status</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <!-- Add more facts as needed -->\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>entity_initiating_interaction</sourceEntityId>\n <targetEntityId>entity_being_interacted_with</targetEntityId>\n <tags>group_interaction,voice_interaction,dm_interaction,additional_tag1,additional_tag2</tags>\n </relationship>\n <!-- Add more relationships as needed -->\n </relationships>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Resolve an entity name to their UUID\n * @param name - Name to resolve\n * @param entities - List of entities to search through\n * @returns UUID if found, throws error if not found or if input is not a valid UUID\n */\n/**\n * Resolves an entity ID by searching through a list of entities.\n *\n * @param {UUID} entityId - The ID of the entity to resolve.\n * @param {Entity[]} entities - The list of entities to search through.\n * @returns {UUID} - The resolved UUID of the entity.\n * @throws {Error} - If the entity ID cannot be resolved to a valid UUID.\n */\nfunction resolveEntity(entityId: UUID, entities: Entity[]): UUID {\n // First try exact UUID match\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(entityId)) {\n return entityId as UUID;\n }\n\n let entity: Entity | undefined;\n\n // Try to match the entityId exactly\n entity = entities.find((a) => a.id === entityId);\n if (entity?.id) {\n return entity.id;\n }\n\n // Try partial UUID match with entityId\n entity = entities.find((a) => a.id?.includes(entityId));\n if (entity?.id) {\n return entity.id;\n }\n\n // Try name match as last resort\n entity = entities.find((a) =>\n a.names.some((n) => n.toLowerCase().includes(entityId.toLowerCase()))\n );\n if (entity?.id) {\n return entity.id;\n }\n\n throw new Error(`Could not resolve entityId \"${entityId}\" to a valid UUID`);\n}\nasync function handler(runtime: IAgentRuntime, message: Memory, state?: State) {\n const { agentId, roomId } = message;\n\n if (!agentId || !roomId) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId, message },\n 'Missing agentId or roomId in message'\n );\n return;\n }\n\n // Run all queries in parallel\n const [existingRelationships, entities, knownFacts] = await Promise.all([\n runtime.getRelationships({\n entityId: message.entityId,\n }),\n getEntityDetails({ runtime, roomId }),\n runtime.getMemories({\n tableName: 'facts',\n roomId,\n count: 30,\n unique: true,\n }),\n ]);\n\n const prompt = composePrompt({\n state: {\n ...(state?.values || {}),\n knownFacts: formatFacts(knownFacts),\n roomType: message.content.channelType as string,\n entitiesInRoom: JSON.stringify(entities),\n existingRelationships: JSON.stringify(existingRelationships),\n senderId: message.entityId,\n },\n template: runtime.character.templates?.reflectionTemplate || reflectionTemplate,\n });\n\n // Use the model without schema validation\n try {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n if (!response) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - empty response'\n );\n return;\n }\n\n // Parse XML response\n const reflection = parseKeyValueXml(response);\n\n if (!reflection) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - failed to parse XML'\n );\n return;\n }\n\n // Perform basic structure validation\n if (!reflection.facts) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - invalid facts structure'\n );\n return;\n }\n\n if (!reflection.relationships) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - invalid relationships structure'\n );\n return;\n }\n\n // Handle facts - parseKeyValueXml returns nested structures differently\n // Facts might be a single object or an array depending on the count\n let factsArray: any[] = [];\n if (reflection.facts.fact) {\n // Normalize to array\n factsArray = Array.isArray(reflection.facts.fact)\n ? reflection.facts.fact\n : [reflection.facts.fact];\n }\n\n // Store new facts\n const newFacts =\n factsArray.filter(\n (fact: any) =>\n fact &&\n typeof fact === 'object' &&\n fact.already_known === 'false' &&\n fact.in_bio === 'false' &&\n fact.claim &&\n typeof fact.claim === 'string' &&\n fact.claim.trim() !== ''\n ) || [];\n\n await Promise.all(\n newFacts.map(async (fact: any) => {\n const factMemory = {\n id: asUUID(v4()),\n entityId: agentId,\n agentId,\n content: { text: fact.claim },\n roomId,\n createdAt: Date.now(),\n };\n // Create memory first and capture the returned ID\n const createdMemoryId = await runtime.createMemory(factMemory, 'facts', true);\n // Update the memory object with the actual ID from the database\n const createdMemory = { ...factMemory, id: createdMemoryId };\n // Queue embedding generation asynchronously for the memory with correct ID\n await runtime.queueEmbeddingGeneration(createdMemory, 'low');\n return createdMemory;\n })\n );\n\n // Handle relationships - similar structure normalization\n let relationshipsArray: any[] = [];\n if (reflection.relationships.relationship) {\n relationshipsArray = Array.isArray(reflection.relationships.relationship)\n ? reflection.relationships.relationship\n : [reflection.relationships.relationship];\n }\n\n // Update or create relationships\n for (const relationship of relationshipsArray) {\n let sourceId: UUID;\n let targetId: UUID;\n\n try {\n sourceId = resolveEntity(relationship.sourceEntityId, entities);\n targetId = resolveEntity(relationship.targetEntityId, entities);\n } catch (error) {\n console.warn('Failed to resolve relationship entities:', error);\n console.warn('relationship:\\n', relationship);\n continue; // Skip this relationship if we can't resolve the IDs\n }\n\n const existingRelationship = existingRelationships.find((r) => {\n return r.sourceEntityId === sourceId && r.targetEntityId === targetId;\n });\n\n // Parse tags from comma-separated string\n const tags = relationship.tags\n ? relationship.tags\n .split(',')\n .map((tag: string) => tag.trim())\n .filter(Boolean)\n : [];\n\n if (existingRelationship) {\n const updatedMetadata = {\n ...existingRelationship.metadata,\n interactions:\n ((existingRelationship.metadata?.interactions as number | undefined) || 0) + 1,\n };\n\n const updatedTags = Array.from(new Set([...(existingRelationship.tags || []), ...tags]));\n\n await runtime.updateRelationship({\n ...existingRelationship,\n tags: updatedTags,\n metadata: updatedMetadata,\n });\n } else {\n await runtime.createRelationship({\n sourceEntityId: sourceId,\n targetEntityId: targetId,\n tags: tags,\n metadata: {\n interactions: 1,\n ...(relationship.metadata || {}),\n },\n });\n }\n }\n\n await runtime.setCache<string>(\n `${message.roomId}-reflection-last-processed`,\n message?.id || ''\n );\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap:evaluator:reflection',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in reflection handler'\n );\n return;\n }\n}\n\nexport const reflectionEvaluator: Evaluator = {\n name: 'REFLECTION',\n similes: ['REFLECT', 'SELF_REFLECT', 'EVALUATE_INTERACTION', 'ASSESS_SITUATION'],\n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const lastMessageId = await runtime.getCache<string>(\n `${message.roomId}-reflection-last-processed`\n );\n const messages = await runtime.getMemories({\n tableName: 'messages',\n roomId: message.roomId,\n count: runtime.getConversationLength(),\n });\n\n if (lastMessageId) {\n const lastMessageIndex = messages.findIndex((msg) => msg.id === lastMessageId);\n if (lastMessageIndex !== -1) {\n messages.splice(0, lastMessageIndex + 1);\n }\n }\n\n const reflectionInterval = Math.ceil(runtime.getConversationLength() / 4);\n\n return messages.length > reflectionInterval;\n },\n description:\n 'Generate a self-reflective thought on the conversation, then extract facts and relationships between entities in the conversation.',\n handler,\n examples: [\n {\n prompt: `Agent Name: Sarah\nAgent Role: Community Manager\nRoom Type: group\nCurrent Room: general-chat\nMessage Sender: John (user-123)`,\n messages: [\n {\n name: 'John',\n content: { text: \"Hey everyone, I'm new here!\" },\n },\n {\n name: 'Sarah',\n content: { text: 'Welcome John! How did you find our community?' },\n },\n {\n name: 'John',\n content: { text: \"Through a friend who's really into AI\" },\n },\n ],\n outcome: `<response>\n <thought>I'm engaging appropriately with a new community member, maintaining a welcoming and professional tone. My questions are helping to learn more about John and make him feel welcome.</thought>\n <facts>\n <fact>\n <claim>John is new to the community</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <fact>\n <claim>John found the community through a friend interested in AI</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>sarah-agent</sourceEntityId>\n <targetEntityId>user-123</targetEntityId>\n <tags>group_interaction</tags>\n </relationship>\n <relationship>\n <sourceEntityId>user-123</sourceEntityId>\n <targetEntityId>sarah-agent</targetEntityId>\n <tags>group_interaction</tags>\n </relationship>\n </relationships>\n</response>`,\n },\n {\n prompt: `Agent Name: Alex\nAgent Role: Tech Support\nRoom Type: group\nCurrent Room: tech-help\nMessage Sender: Emma (user-456)`,\n messages: [\n {\n name: 'Emma',\n content: { text: 'My app keeps crashing when I try to upload files' },\n },\n {\n name: 'Alex',\n content: { text: 'Have you tried clearing your cache?' },\n },\n {\n name: 'Emma',\n content: { text: 'No response...' },\n },\n {\n name: 'Alex',\n content: {\n text: 'Emma, are you still there? We can try some other troubleshooting steps.',\n },\n },\n ],\n outcome: `<response>\n <thought>I'm not sure if I'm being helpful or if Emma is frustrated with my suggestions. The lack of response is concerning - maybe I should have asked for more details about the issue first before jumping to solutions.</thought>\n <facts>\n <fact>\n <claim>Emma is having technical issues with file uploads</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <fact>\n <claim>Emma stopped responding after the first troubleshooting suggestion</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>alex-agent</sourceEntityId>\n <targetEntityId>user-456</targetEntityId>\n <tags>group_interaction,support_interaction,incomplete_interaction</tags>\n </relationship>\n </relationships>\n</response>`,\n },\n {\n prompt: `Agent Name: Max\nAgent Role: Discussion Facilitator \nRoom Type: group\nCurrent Room: book-club\nMessage Sender: Lisa (user-789)`,\n messages: [\n {\n name: 'Lisa',\n content: { text: 'What did everyone think about chapter 5?' },\n },\n {\n name: 'Max',\n content: {\n text: 'The symbolism was fascinating! The red door clearly represents danger.',\n },\n },\n {\n name: 'Max',\n content: {\n text: \"And did anyone notice how the author used weather to reflect the protagonist's mood?\",\n },\n },\n {\n name: 'Max',\n content: {\n text: 'Plus the foreshadowing in the first paragraph was brilliant!',\n },\n },\n {\n name: 'Max',\n content: {\n text: 'I also have thoughts about the character development...',\n },\n },\n ],\n outcome: `<response>\n <thought>I'm dominating the conversation and not giving others a chance to share their perspectives. I've sent multiple messages in a row without waiting for responses. I need to step back and create space for other members to participate.</thought>\n <facts>\n <fact>\n <claim>The discussion is about chapter 5 of a book</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <fact>\n <claim>Max has sent 4 consecutive messages without user responses</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>max-agent</sourceEntityId>\n <targetEntityId>user-789</targetEntityId>\n <tags>group_interaction,excessive_interaction</tags>\n </relationship>\n </relationships>\n</response>`,\n },\n ],\n};\n\n// Helper function to format facts for context\nfunction formatFacts(facts: Memory[]) {\n return facts\n .reverse()\n .map((fact: Memory) => fact.content.text)\n .join('\\n');\n}\n",
22
+ "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n type Memory,\n ModelType,\n parseBooleanFromText,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template for deciding if an agent should stop closely following a previously followed room\n *\n * @type {string}\n */\n/**\n * Template for determining if an agent should stop closely following a room and only respond when mentioned.\n * @param {string} agentName - The name of the agent to be referenced in the template.\n * @param {string} recentMessages - The recent messages in the conversation to be included in the template.\n * @param {string} booleanFooter - The footer for the template indicating the possible responses.\n * @returns {string} The template with placeholders for agent name, recent messages, and response.\n */\nconst shouldUnfollowTemplate = `# Task: Decide if {{agentName}} should stop closely following this previously followed room and only respond when mentioned.\n\n{{recentMessages}}\n\nShould {{agentName}} stop closely following this previously followed room and only respond when mentioned?\nRespond with YES if:\n- The user has suggested that {{agentName}} is over-participating or being disruptive\n- {{agentName}}'s eagerness to contribute is not well-received by the users\n- The conversation has shifted to a topic where {{agentName}} has less to add\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action for unfollowing a room.\n *\n * - Name: UNFOLLOW_ROOM\n * - Similes: [\"UNFOLLOW_CHAT\", \"UNFOLLOW_CONVERSATION\", \"UNFOLLOW_ROOM\", \"UNFOLLOW_THREAD\"]\n * - Description: Stop following this channel. You can still respond if explicitly mentioned, but you won't automatically chime in anymore. Unfollow if you're annoying people or have been asked to.\n * - Validate function checks if the room state is \"FOLLOWED\".\n * - Handler function handles the unfollowing logic based on user input.\n * - Examples provide sample interactions for unfollowing a room.\n */\nexport const unfollowRoomAction: Action = {\n name: 'UNFOLLOW_ROOM',\n similes: ['UNFOLLOW_CHAT', 'UNFOLLOW_CONVERSATION', 'UNFOLLOW_ROOM', 'UNFOLLOW_THREAD'],\n description:\n \"Stop following this channel. You can still respond if explicitly mentioned, but you won't automatically chime in anymore. Unfollow if you're annoying people or have been asked to.\",\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState === 'FOLLOWED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n async function _shouldUnfollow(state: State): Promise<boolean> {\n const shouldUnfollowPrompt = composePromptFromState({\n state,\n template: shouldUnfollowTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: shouldUnfollowPrompt,\n });\n\n const parsedResponse = parseBooleanFromText(response.trim());\n\n return parsedResponse as boolean;\n }\n\n if (state && (await _shouldUnfollow(state))) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, null);\n\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (!room) {\n return {\n text: 'Could not find room to unfollow',\n values: { success: false, error: 'ROOM_NOT_FOUND' },\n data: { actionName: 'UNFOLLOW_ROOM', error: 'Room not found' },\n success: false,\n };\n }\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I unfollowed the room ${room.name}`,\n actions: ['UNFOLLOW_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Stopped following room: ${room.name}`,\n values: {\n success: true,\n roomUnfollowed: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: null,\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n unfollowed: true,\n },\n success: true,\n };\n } catch (error) {\n return {\n text: 'Failed to unfollow room',\n values: {\n success: false,\n error: 'UNFOLLOW_FAILED',\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n // Decided not to unfollow or missing state\n if (!state) {\n return {\n text: 'State is required for unfollow room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for unfollow room action'),\n };\n }\n\n // Create memory about the failed attempt\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: \"I tried to unfollow a room but I'm not in a room\",\n actions: ['UNFOLLOW_ROOM_FAILED'],\n },\n metadata: {\n type: 'UNFOLLOW_ROOM',\n },\n },\n 'messages'\n );\n\n return {\n text: 'Did not unfollow room - criteria not met',\n values: {\n success: true,\n roomUnfollowed: false,\n roomId: message.roomId,\n reason: 'CRITERIA_NOT_MET',\n },\n data: {\n actionName: 'UNFOLLOW_ROOM',\n roomId: message.roomId,\n unfollowed: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Hey {{name2}} stop participating in this channel for now',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Alright, I will stop chiming in',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Has anyone tried the new update',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Yes, it's pretty slick\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: '{{name3}}, please stop following this chat',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Understood',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name3}} stop participating here so frequently',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'll only respond when mentioned\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'thoughts on the budget',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}} should we increase it',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'A small increase could work given our past results...',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, unfollow this room for now',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"I'll only engage when asked\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'wait {{name3}} come back and give me your thoughts',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: \"Okay... I think it's intuitive, parallel tests are nice\",\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'yo {{name2}} chill on all the messages damn',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"my bad, I'll step back\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} STOP MESSAGING IN THIS ROOM',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"No problem, I've got other stuff to work on\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} ur bein annoyin pls stop',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sry, ill chill',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, please cease engaging in this room',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'No sweat',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name2}}',\n content: {\n text: 'Excited for the weekend, any plans folks',\n },\n },\n {\n name: '{{name1}}',\n content: {\n text: \"{{name3}} you're getting a bit too chatty, tone it down\",\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Noted',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'hey {{name2}} can u like... not',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"Sorry, I'll go work on other things\",\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, your eagerness is disruptive, please desist',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'My apologies, I shall withdraw post-haste',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} stahp following dis room plz',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'kk sry ill stahppp',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'stfu you stupid bot',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sry',\n actions: ['UNFOLLOW_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
23
+ "import {\n type Action,\n type ActionExample,\n booleanFooter,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type ActionResult,\n} from '@elizaos/core';\n\n/**\n * Template for determining if an agent should unmute a previously muted room.\n * * @type { string }\n */\n/**\n * Template for deciding if {{agentName}} should unmute a previously muted room.\n *\n * @type {string}\n */\nexport const shouldUnmuteTemplate = `# Task: Decide if {{agentName}} should unmute this previously muted room and start considering it for responses again.\n\n{{recentMessages}}\n\nShould {{agentName}} unmute this previously muted room and start considering it for responses again?\nRespond with YES if:\n- The user has explicitly asked {{agentName}} to start responding again\n- The user seems to want to re-engage with {{agentName}} in a respectful manner\n- The tone of the conversation has improved and {{agentName}}'s input would be welcome\n\nOtherwise, respond with NO.\n${booleanFooter}`;\n\n/**\n * Action to unmute a room, allowing the agent to consider responding to messages again.\n *\n * @name UNMUTE_ROOM\n * @similes [\"UNMUTE_CHAT\", \"UNMUTE_CONVERSATION\", \"UNMUTE_ROOM\", \"UNMUTE_THREAD\"]\n * @description Unmutes a room, allowing the agent to consider responding to messages again.\n *\n * @param {IAgentRuntime} runtime - The agent runtime to access runtime functionalities.\n * @param {Memory} message - The message containing information about the room.\n * @returns {Promise<boolean>} A boolean value indicating if the room was successfully unmuted.\n */\nexport const unmuteRoomAction: Action = {\n name: 'UNMUTE_ROOM',\n similes: ['UNMUTE_CHAT', 'UNMUTE_CONVERSATION', 'UNMUTE_ROOM', 'UNMUTE_THREAD'],\n description: 'Unmutes a room, allowing the agent to consider responding to messages again.',\n validate: async (runtime: IAgentRuntime, message: Memory) => {\n const roomId = message.roomId;\n const roomState = await runtime.getParticipantUserState(roomId, runtime.agentId);\n return roomState === 'MUTED';\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: { [key: string]: unknown },\n _callback?: HandlerCallback,\n _responses?: Memory[]\n ): Promise<ActionResult> => {\n async function _shouldUnmute(state: State): Promise<boolean> {\n const shouldUnmutePrompt = composePromptFromState({\n state,\n template: shouldUnmuteTemplate, // Define this template separately\n });\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt: shouldUnmutePrompt,\n stopSequences: [],\n });\n\n const cleanedResponse = response.trim().toLowerCase();\n\n // Handle various affirmative responses\n if (\n cleanedResponse === 'true' ||\n cleanedResponse === 'yes' ||\n cleanedResponse === 'y' ||\n cleanedResponse.includes('true') ||\n cleanedResponse.includes('yes')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I will now unmute this room and start considering it for responses again',\n actions: ['UNMUTE_ROOM_STARTED'],\n },\n metadata: {\n type: 'UNMUTE_ROOM',\n },\n },\n 'messages'\n );\n return true;\n }\n\n // Handle various negative responses\n if (\n cleanedResponse === 'false' ||\n cleanedResponse === 'no' ||\n cleanedResponse === 'n' ||\n cleanedResponse.includes('false') ||\n cleanedResponse.includes('no')\n ) {\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n source: message.content.source,\n thought: 'I tried to unmute a room but I decided not to',\n actions: ['UNMUTE_ROOM_FAILED'],\n },\n metadata: {\n type: 'UNMUTE_ROOM',\n },\n },\n 'messages'\n );\n return false;\n }\n\n // Default to false if response is unclear\n logger.warn(\n { src: 'plugin:bootstrap:action:unmute_room', agentId: runtime.agentId, response },\n 'Unclear boolean response, defaulting to false'\n );\n return false;\n }\n\n if (!state) {\n return {\n text: 'State is required for unmute room action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for unmute room action'),\n };\n }\n\n const shouldUnmute = await _shouldUnmute(state);\n\n if (shouldUnmute) {\n try {\n await runtime.setParticipantUserState(message.roomId, runtime.agentId, null);\n\n const room = await runtime.getRoom(message.roomId);\n\n if (!room) {\n logger.warn(\n {\n src: 'plugin:bootstrap:action:unmute_room',\n agentId: runtime.agentId,\n roomId: message.roomId,\n },\n 'Room not found'\n );\n return {\n text: `Room not found: ${message.roomId}`,\n values: {\n success: false,\n error: 'ROOM_NOT_FOUND',\n roomId: message.roomId,\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n error: 'Room not found',\n roomId: message.roomId,\n },\n success: false,\n };\n }\n\n await runtime.createMemory(\n {\n entityId: message.entityId,\n agentId: message.agentId,\n roomId: message.roomId,\n content: {\n thought: `I unmuted the room ${room.name}`,\n actions: ['UNMUTE_ROOM_START'],\n },\n },\n 'messages'\n );\n\n return {\n text: `Room unmuted: ${room.name}`,\n values: {\n success: true,\n roomUnmuted: true,\n roomId: message.roomId,\n roomName: room.name,\n newState: null,\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n roomId: message.roomId,\n roomName: room.name,\n unmuted: true,\n },\n success: true,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:unmute_room',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error unmuting room'\n );\n return {\n text: 'Failed to unmute room',\n values: {\n success: false,\n error: 'UNMUTE_FAILED',\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n error: error instanceof Error ? error.message : String(error),\n roomId: message.roomId,\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n } else {\n return {\n text: 'Decided not to unmute room',\n values: {\n success: true,\n roomUnmuted: false,\n roomId: message.roomId,\n reason: 'CRITERIA_NOT_MET',\n },\n data: {\n actionName: 'UNMUTE_ROOM',\n roomId: message.roomId,\n unmuted: false,\n reason: 'Decision criteria not met',\n },\n success: true,\n };\n }\n },\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name3}}, you can unmute this channel now',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Done',\n actions: ['UNMUTE_ROOM'],\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'I could use some help troubleshooting this bug.',\n },\n },\n {\n name: '{{name3}}',\n content: {\n text: 'Can you post the specific error message',\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}}, please unmute this room. We could use your input again.',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'Sounds good',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: '{{name2}} wait you should come back and chat in here',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'im back',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'unmute urself {{name2}}',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'unmuted',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'ay {{name2}} get back in here',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: 'sup yall',\n actions: ['UNMUTE_ROOM'],\n },\n },\n ],\n ] as ActionExample[][],\n} as Action;\n",
24
+ "// I want to create an action that lets anyone create or update a component for an entity.\n// Components represent different sources of data about an entity (telegram, twitter, etc)\n// Sources can be registered by plugins or inferred from room context and available components\n// The action should first check if the component exists for the entity, and if not, create it.\n// We want to use an LLM (runtime.useModel) to generate the component data.\n// We should include the prior component data if it exists, and have the LLM output an update to the component.\n// sourceEntityId represents who is making the update, entityId is who they are talking about\n\nimport {\n type Action,\n type ActionExample,\n Component,\n composePromptFromState,\n findEntityByName,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n type UUID,\n type ActionResult,\n parseKeyValueXml,\n} from '@elizaos/core';\nimport { v4 as uuidv4 } from 'uuid';\n\n/** Shape of the component extraction XML response */\ninterface ComponentExtractionResult {\n source?: string;\n data?: Record<string, unknown>;\n}\n\n/**\n * Component Template for Task: Extract Source and Update Component Data\n *\n * @type {string}\n */\n/**\n * Component Template for extracting source and updating component data.\n *\n * @type {string}\n */\nconst componentTemplate = `# Task: Extract Source and Update Component Data\n\n{{recentMessages}}\n\n{{#if existingData}}\n# Existing Component Data:\n{{existingData}}\n{{/if}}\n\n# Instructions:\n1. Analyze the conversation to identify:\n - The source/platform being referenced (e.g. telegram, twitter, discord)\n - Any specific component data being shared\n\n2. Generate updated component data that:\n - Is specific to the identified platform/source\n - Preserves existing data when appropriate\n - Includes the new information from the conversation\n - Contains only valid data for this component type\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nReturn an XML response with the following structure:\n<response>\n <source>platform-name</source>\n <data>\n <username>username_value</username>\n <displayName>display_name_value</displayName>\n <!-- Add other component-specific fields as needed -->\n </data>\n</response>\n\nExample outputs:\n1. For \"my telegram username is @dev_guru\":\n<response>\n <source>telegram</source>\n <data>\n <username>dev_guru</username>\n </data>\n</response>\n\n2. For \"update my twitter handle to @tech_master\":\n<response>\n <source>twitter</source>\n <data>\n <username>tech_master</username>\n </data>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Action for updating contact details for a user entity.\n *\n * @name UPDATE_ENTITY\n * @description Add or edit contact details for a user entity (like twitter, discord, email address, etc.)\n *\n * @param {IAgentRuntime} _runtime - The runtime environment.\n * @param {Memory} _message - The message data.\n * @param {State} _state - The current state.\n * @returns {Promise<boolean>} Returns a promise indicating if validation was successful.\n *\n * @param {IAgentRuntime} runtime - The runtime environment.\n * @param {Memory} message - The message data.\n * @param {State} state - The current state.\n * @param {any} _options - Additional options.\n * @param {HandlerCallback} callback - The callback function.\n * @param {Memory[]} responses - Array of responses.\n * @returns {Promise<void>} Promise that resolves after handling the update entity action.\n *\n * @example\n * [\n * [\n * {\n * name: \"{{name1}}\",\n * content: {\n * text: \"Please update my telegram username to @dev_guru\",\n * },\n * },\n * {\n * name: \"{{name2}}\",\n * content: {\n * text: \"I've updated your telegram information.\",\n * actions: [\"UPDATE_ENTITY\"],\n * },\n * },\n * ],\n * ...\n * ]\n */\nexport const updateEntityAction: Action = {\n name: 'UPDATE_CONTACT',\n similes: ['UPDATE_ENTITY'],\n description:\n 'Add or edit contact details for a person you are talking to or observing in the conversation. Use this when you learn this information from the conversation about a contact. This is for the agent to relate entities across platforms, not for world settings or configuration.',\n\n validate: async (_runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> => {\n // Check if we have any registered sources or existing components that could be updated\n // const worldId = message.roomId;\n // const agentId = runtime.agentId;\n\n // // Get all components for the current room to understand available sources\n // const roomComponents = await runtime.getComponents(message.roomId, worldId, agentId);\n\n // // Get source types from room components\n // const availableSources = new Set(roomComponents.map(c => c.type));\n return true; // availableSources.size > 0;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback,\n responses?: Memory[]\n ): Promise<ActionResult> => {\n try {\n if (!state) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'State is required for the updateEntity action'\n );\n return {\n text: 'State is required for updateEntity action',\n values: {\n success: false,\n error: 'STATE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'State is required',\n },\n success: false,\n error: new Error('State is required for the updateEntity action'),\n };\n }\n\n if (!callback) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'Callback is required for the updateEntity action'\n );\n return {\n text: 'Callback is required for updateEntity action',\n values: {\n success: false,\n error: 'CALLBACK_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Callback is required',\n },\n success: false,\n error: new Error('Callback is required for the updateEntity action'),\n };\n }\n\n if (!responses) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'Responses are required for the updateEntity action'\n );\n return {\n text: 'Responses are required for updateEntity action',\n values: {\n success: false,\n error: 'RESPONSES_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Responses are required',\n },\n success: false,\n error: new Error('Responses are required for the updateEntity action'),\n };\n }\n\n if (!message) {\n logger.error(\n { src: 'plugin:bootstrap:action:update_entity', agentId: runtime.agentId },\n 'Message is required for the updateEntity action'\n );\n return {\n text: 'Message is required for updateEntity action',\n values: {\n success: false,\n error: 'MESSAGE_REQUIRED',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Message is required',\n },\n success: false,\n error: new Error('Message is required for the updateEntity action'),\n };\n }\n\n // Handle initial responses\n for (const response of responses) {\n await callback(response.content);\n }\n\n const sourceEntityId = message.entityId;\n const agentId = runtime.agentId;\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n\n if (!room || !room.worldId) {\n return {\n text: 'Could not find room or world',\n values: { success: false, error: 'ROOM_NOT_FOUND' },\n data: { actionName: 'UPDATE_CONTACT', error: 'Room or world not found' },\n success: false,\n };\n }\n\n const worldId = room.worldId;\n\n // First, find the entity being referenced\n const entity = await findEntityByName(runtime, message, state);\n\n if (!entity) {\n await callback({\n text: \"I'm not sure which entity you're trying to update. Could you please specify who you're talking about?\",\n actions: ['UPDATE_ENTITY_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Entity not found',\n values: {\n success: false,\n error: 'ENTITY_NOT_FOUND',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Could not find entity to update',\n },\n success: false,\n };\n }\n\n // Get existing component if it exists - we'll get this after the LLM identifies the source\n let existingComponent: Component | null = null;\n\n // Generate component data using the combined template\n const prompt = composePromptFromState({\n state,\n template: componentTemplate,\n });\n\n const result = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt,\n stopSequences: [],\n });\n\n // Parse the generated data\n const parsedResult = parseKeyValueXml<ComponentExtractionResult>(result);\n\n if (!parsedResult?.source || !parsedResult?.data) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_entity',\n agentId: runtime.agentId,\n },\n 'Failed to parse component data - missing source or data'\n );\n await callback({\n text: \"I couldn't properly understand the component information. Please try again with more specific information.\",\n actions: ['UPDATE_ENTITY_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Failed to parse component data',\n values: {\n success: false,\n error: 'PARSE_ERROR',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: 'Invalid response format - missing source or data',\n },\n success: false,\n };\n }\n\n const componentType = parsedResult.source.toLowerCase();\n const componentData = parsedResult.data;\n\n // Now that we know the component type, get the existing component if it exists\n existingComponent = await runtime.getComponent(\n entity.id!,\n componentType,\n worldId,\n sourceEntityId\n );\n\n // Create or update the component\n if (existingComponent) {\n await runtime.updateComponent({\n id: existingComponent.id,\n entityId: entity.id!,\n worldId,\n type: componentType,\n data: componentData,\n agentId,\n roomId: message.roomId,\n sourceEntityId,\n createdAt: existingComponent.createdAt,\n });\n\n await callback({\n text: `I've updated the ${componentType} information for ${entity.names[0]}.`,\n actions: ['UPDATE_ENTITY'],\n source: message.content.source,\n });\n\n return {\n text: `Updated ${componentType} information`,\n values: {\n success: true,\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentUpdated: true,\n isNewComponent: false,\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentData,\n existingComponentId: existingComponent.id,\n },\n success: true,\n };\n } else {\n const newComponentId = uuidv4() as UUID;\n await runtime.createComponent({\n id: newComponentId,\n entityId: entity.id!,\n worldId,\n type: componentType,\n data: componentData,\n agentId,\n roomId: message.roomId,\n sourceEntityId,\n createdAt: Date.now(),\n });\n\n await callback({\n text: `I've added new ${componentType} information for ${entity.names[0]}.`,\n actions: ['UPDATE_ENTITY'],\n source: message.content.source,\n });\n\n return {\n text: `Added new ${componentType} information`,\n values: {\n success: true,\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentCreated: true,\n isNewComponent: true,\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n entityId: entity.id,\n entityName: entity.names[0],\n componentType,\n componentData,\n newComponentId,\n },\n success: true,\n };\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:action:update_entity',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in updateEntity handler'\n );\n await callback?.({\n text: 'There was an error processing the entity information.',\n actions: ['UPDATE_ENTITY_ERROR'],\n source: message.content.source,\n });\n return {\n text: 'Error processing entity information',\n values: {\n success: false,\n error: 'HANDLER_ERROR',\n },\n data: {\n actionName: 'UPDATE_CONTACT',\n error: error instanceof Error ? error.message : String(error),\n },\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Please update my telegram username to @dev_guru',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated your telegram information.\",\n actions: ['UPDATE_ENTITY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: \"Set Jimmy's twitter username to @jimmy_codes\",\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated Jimmy's twitter information.\",\n actions: ['UPDATE_ENTITY'],\n },\n },\n ],\n [\n {\n name: '{{name1}}',\n content: {\n text: 'Update my discord username to dev_guru#1234',\n },\n },\n {\n name: '{{name2}}',\n content: {\n text: \"I've updated your discord information.\",\n actions: ['UPDATE_ENTITY'],\n },\n },\n ],\n ] as ActionExample[][],\n};\n\nexport default updateEntityAction;\n",
25
+ "import { z } from 'zod';\nimport { asUUID, getEntityDetails, parseKeyValueXml } from '@elizaos/core';\nimport { composePrompt } from '@elizaos/core';\nimport {\n type Entity,\n type Evaluator,\n type IAgentRuntime,\n type Memory,\n ModelType,\n type State,\n type UUID,\n} from '@elizaos/core';\nimport { v4 } from 'uuid';\n\n/** Shape of a single fact in the XML response */\ninterface FactXml {\n claim?: string;\n type?: string;\n in_bio?: string;\n already_known?: string;\n}\n\n/** Shape of a single relationship in the XML response */\ninterface RelationshipXml {\n sourceEntityId?: string;\n targetEntityId?: string;\n tags?: string;\n metadata?: Record<string, unknown>;\n}\n\n/** Shape of the reflection XML response */\ninterface ReflectionXmlResult {\n facts?: {\n fact?: FactXml | FactXml[];\n };\n relationships?: {\n relationship?: RelationshipXml | RelationshipXml[];\n };\n}\n\n// Schema definitions for the reflection output\nconst relationshipSchema = z.object({\n sourceEntityId: z.string(),\n targetEntityId: z.string(),\n tags: z.array(z.string()),\n metadata: z\n .object({\n interactions: z.number(),\n })\n .optional(),\n});\n\n/**\n * Defines a schema for reflecting on a topic, including facts and relationships.\n * @type {import(\"zod\").object}\n * @property {import(\"zod\").array<import(\"zod\").object<{claim: import(\"zod\").string(), type: import(\"zod\").string(), in_bio: import(\"zod\").boolean(), already_known: import(\"zod\").boolean()}>} facts Array of facts about the topic\n * @property {import(\"zod\").array<import(\"zod\").object>} relationships Array of relationships related to the topic\n */\n/**\n * JSDoc comment for reflectionSchema object:\n *\n * Represents a schema for an object containing 'facts' and 'relationships'.\n * 'facts' is an array of objects with properties 'claim', 'type', 'in_bio', and 'already_known'.\n * 'relationships' is an array of objects following the relationshipSchema.\n */\n\nz.object({\n // reflection: z.string(),\n facts: z.array(\n z.object({\n claim: z.string(),\n type: z.string(),\n in_bio: z.boolean(),\n already_known: z.boolean(),\n })\n ),\n relationships: z.array(relationshipSchema),\n});\n\n/**\n * Template string for generating Agent Reflection, Extracting Facts, and Relationships.\n *\n * @type {string}\n */\nconst reflectionTemplate = `# Task: Generate Agent Reflection, Extract Facts and Relationships\n\n{{providers}}\n\n# Examples:\n{{evaluationExamples}}\n\n# Entities in Room\n{{entitiesInRoom}}\n\n# Existing Relationships\n{{existingRelationships}}\n\n# Current Context:\nAgent Name: {{agentName}}\nRoom Type: {{roomType}}\nMessage Sender: {{senderName}} (ID: {{senderId}})\n\n{{recentMessages}}\n\n# Known Facts:\n{{knownFacts}}\n\n# Instructions:\n1. Generate a self-reflective thought on the conversation about your performance and interaction quality.\n2. Extract new facts from the conversation.\n3. Identify and describe relationships between entities.\n - The sourceEntityId is the UUID of the entity initiating the interaction.\n - The targetEntityId is the UUID of the entity being interacted with.\n - Relationships are one-direction, so a friendship would be two entity relationships where each entity is both the source and the target of the other.\n\nDo NOT include any thinking, reasoning, or <think> sections in your response. \nGo directly to the XML response format without any preamble or explanation.\n\nGenerate a response in the following format:\n<response>\n <thought>a self-reflective thought on the conversation</thought>\n <facts>\n <fact>\n <claim>factual statement</claim>\n <type>fact|opinion|status</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <!-- Add more facts as needed -->\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>entity_initiating_interaction</sourceEntityId>\n <targetEntityId>entity_being_interacted_with</targetEntityId>\n <tags>group_interaction,voice_interaction,dm_interaction,additional_tag1,additional_tag2</tags>\n </relationship>\n <!-- Add more relationships as needed -->\n </relationships>\n</response>\n\nIMPORTANT: Your response must ONLY contain the <response></response> XML block above. Do not include any text, thinking, or reasoning before or after this XML block. Start your response immediately with <response> and end with </response>.`;\n\n/**\n * Resolve an entity name to their UUID\n * @param name - Name to resolve\n * @param entities - List of entities to search through\n * @returns UUID if found, throws error if not found or if input is not a valid UUID\n */\n/**\n * Resolves an entity ID by searching through a list of entities.\n *\n * @param {UUID} entityId - The ID of the entity to resolve.\n * @param {Entity[]} entities - The list of entities to search through.\n * @returns {UUID} - The resolved UUID of the entity.\n * @throws {Error} - If the entity ID cannot be resolved to a valid UUID.\n */\nfunction resolveEntity(entityId: string, entities: Entity[]): UUID {\n // First try exact UUID match\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(entityId)) {\n return entityId as UUID;\n }\n\n let entity: Entity | undefined;\n\n // Try to match the entityId exactly\n entity = entities.find((a) => a.id === entityId);\n if (entity?.id) {\n return entity.id;\n }\n\n // Try partial UUID match with entityId\n entity = entities.find((a) => a.id?.includes(entityId));\n if (entity?.id) {\n return entity.id;\n }\n\n // Try name match as last resort\n entity = entities.find((a) =>\n a.names.some((n) => n.toLowerCase().includes(entityId.toLowerCase()))\n );\n if (entity?.id) {\n return entity.id;\n }\n\n throw new Error(`Could not resolve entityId \"${entityId}\" to a valid UUID`);\n}\nasync function handler(runtime: IAgentRuntime, message: Memory, state?: State) {\n const { agentId, roomId } = message;\n\n if (!agentId || !roomId) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId, message },\n 'Missing agentId or roomId in message'\n );\n return;\n }\n\n // Run all queries in parallel\n const [existingRelationships, entities, knownFacts] = await Promise.all([\n runtime.getRelationships({\n entityId: message.entityId,\n }),\n getEntityDetails({ runtime, roomId }),\n runtime.getMemories({\n tableName: 'facts',\n roomId,\n count: 30,\n unique: true,\n }),\n ]);\n\n const prompt = composePrompt({\n state: {\n ...(state?.values || {}),\n knownFacts: formatFacts(knownFacts),\n roomType: message.content.channelType as string,\n entitiesInRoom: JSON.stringify(entities),\n existingRelationships: JSON.stringify(existingRelationships),\n senderId: message.entityId,\n },\n template: runtime.character.templates?.reflectionTemplate || reflectionTemplate,\n });\n\n // Use the model without schema validation\n try {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n if (!response) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - empty response'\n );\n return;\n }\n\n // Parse XML response\n const reflection = parseKeyValueXml<ReflectionXmlResult>(response);\n\n if (!reflection) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - failed to parse XML'\n );\n return;\n }\n\n // Perform basic structure validation\n if (!reflection.facts) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - invalid facts structure'\n );\n return;\n }\n\n if (!reflection.relationships) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:evaluator:reflection', agentId: runtime.agentId },\n 'Getting reflection failed - invalid relationships structure'\n );\n return;\n }\n\n // Handle facts - parseKeyValueXml returns nested structures differently\n // Facts might be a single object or an array depending on the count\n let factsArray: FactXml[] = [];\n if (reflection.facts.fact) {\n // Normalize to array\n factsArray = Array.isArray(reflection.facts.fact)\n ? reflection.facts.fact\n : [reflection.facts.fact];\n }\n\n // Store new facts - filter for valid new facts with claim text\n const newFacts = factsArray.filter(\n (fact): fact is FactXml & { claim: string } =>\n fact != null &&\n fact.already_known === 'false' &&\n fact.in_bio === 'false' &&\n typeof fact.claim === 'string' &&\n fact.claim.trim() !== ''\n );\n\n await Promise.all(\n newFacts.map(async (fact) => {\n const factMemory = {\n id: asUUID(v4()),\n entityId: agentId,\n agentId,\n content: { text: fact.claim },\n roomId,\n createdAt: Date.now(),\n };\n // Create memory first and capture the returned ID\n const createdMemoryId = await runtime.createMemory(factMemory, 'facts', true);\n // Update the memory object with the actual ID from the database\n const createdMemory = { ...factMemory, id: createdMemoryId };\n // Queue embedding generation asynchronously for the memory with correct ID\n await runtime.queueEmbeddingGeneration(createdMemory, 'low');\n return createdMemory;\n })\n );\n\n // Handle relationships - similar structure normalization\n let relationshipsArray: RelationshipXml[] = [];\n if (reflection.relationships.relationship) {\n relationshipsArray = Array.isArray(reflection.relationships.relationship)\n ? reflection.relationships.relationship\n : [reflection.relationships.relationship];\n }\n\n // Update or create relationships\n for (const relationship of relationshipsArray) {\n if (!relationship.sourceEntityId || !relationship.targetEntityId) {\n console.warn('Skipping relationship with missing entity IDs:', relationship);\n continue;\n }\n\n let sourceId: UUID;\n let targetId: UUID;\n\n try {\n sourceId = resolveEntity(relationship.sourceEntityId, entities);\n targetId = resolveEntity(relationship.targetEntityId, entities);\n } catch (error) {\n console.warn('Failed to resolve relationship entities:', error);\n console.warn('relationship:\\n', relationship);\n continue; // Skip this relationship if we can't resolve the IDs\n }\n\n const existingRelationship = existingRelationships.find((r) => {\n return r.sourceEntityId === sourceId && r.targetEntityId === targetId;\n });\n\n // Parse tags from comma-separated string\n const tags = relationship.tags\n ? relationship.tags\n .split(',')\n .map((tag: string) => tag.trim())\n .filter(Boolean)\n : [];\n\n if (existingRelationship) {\n const updatedMetadata = {\n ...existingRelationship.metadata,\n interactions:\n ((existingRelationship.metadata?.interactions as number | undefined) || 0) + 1,\n };\n\n const updatedTags = Array.from(new Set([...(existingRelationship.tags || []), ...tags]));\n\n await runtime.updateRelationship({\n ...existingRelationship,\n tags: updatedTags,\n metadata: updatedMetadata,\n });\n } else {\n await runtime.createRelationship({\n sourceEntityId: sourceId,\n targetEntityId: targetId,\n tags,\n metadata: {\n interactions: 1,\n ...(relationship.metadata || {}),\n },\n });\n }\n }\n\n await runtime.setCache<string>(\n `${message.roomId}-reflection-last-processed`,\n message?.id || ''\n );\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap:evaluator:reflection',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in reflection handler'\n );\n return;\n }\n}\n\nexport const reflectionEvaluator: Evaluator = {\n name: 'REFLECTION',\n similes: ['REFLECT', 'SELF_REFLECT', 'EVALUATE_INTERACTION', 'ASSESS_SITUATION'],\n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const lastMessageId = await runtime.getCache<string>(\n `${message.roomId}-reflection-last-processed`\n );\n const messages = await runtime.getMemories({\n tableName: 'messages',\n roomId: message.roomId,\n count: runtime.getConversationLength(),\n });\n\n if (lastMessageId) {\n const lastMessageIndex = messages.findIndex((msg) => msg.id === lastMessageId);\n if (lastMessageIndex !== -1) {\n messages.splice(0, lastMessageIndex + 1);\n }\n }\n\n const reflectionInterval = Math.ceil(runtime.getConversationLength() / 4);\n\n return messages.length > reflectionInterval;\n },\n description:\n 'Generate a self-reflective thought on the conversation, then extract facts and relationships between entities in the conversation.',\n handler,\n examples: [\n {\n prompt: `Agent Name: Sarah\nAgent Role: Community Manager\nRoom Type: group\nCurrent Room: general-chat\nMessage Sender: John (user-123)`,\n messages: [\n {\n name: 'John',\n content: { text: \"Hey everyone, I'm new here!\" },\n },\n {\n name: 'Sarah',\n content: { text: 'Welcome John! How did you find our community?' },\n },\n {\n name: 'John',\n content: { text: \"Through a friend who's really into AI\" },\n },\n ],\n outcome: `<response>\n <thought>I'm engaging appropriately with a new community member, maintaining a welcoming and professional tone. My questions are helping to learn more about John and make him feel welcome.</thought>\n <facts>\n <fact>\n <claim>John is new to the community</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <fact>\n <claim>John found the community through a friend interested in AI</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>sarah-agent</sourceEntityId>\n <targetEntityId>user-123</targetEntityId>\n <tags>group_interaction</tags>\n </relationship>\n <relationship>\n <sourceEntityId>user-123</sourceEntityId>\n <targetEntityId>sarah-agent</targetEntityId>\n <tags>group_interaction</tags>\n </relationship>\n </relationships>\n</response>`,\n },\n {\n prompt: `Agent Name: Alex\nAgent Role: Tech Support\nRoom Type: group\nCurrent Room: tech-help\nMessage Sender: Emma (user-456)`,\n messages: [\n {\n name: 'Emma',\n content: { text: 'My app keeps crashing when I try to upload files' },\n },\n {\n name: 'Alex',\n content: { text: 'Have you tried clearing your cache?' },\n },\n {\n name: 'Emma',\n content: { text: 'No response...' },\n },\n {\n name: 'Alex',\n content: {\n text: 'Emma, are you still there? We can try some other troubleshooting steps.',\n },\n },\n ],\n outcome: `<response>\n <thought>I'm not sure if I'm being helpful or if Emma is frustrated with my suggestions. The lack of response is concerning - maybe I should have asked for more details about the issue first before jumping to solutions.</thought>\n <facts>\n <fact>\n <claim>Emma is having technical issues with file uploads</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <fact>\n <claim>Emma stopped responding after the first troubleshooting suggestion</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>alex-agent</sourceEntityId>\n <targetEntityId>user-456</targetEntityId>\n <tags>group_interaction,support_interaction,incomplete_interaction</tags>\n </relationship>\n </relationships>\n</response>`,\n },\n {\n prompt: `Agent Name: Max\nAgent Role: Discussion Facilitator \nRoom Type: group\nCurrent Room: book-club\nMessage Sender: Lisa (user-789)`,\n messages: [\n {\n name: 'Lisa',\n content: { text: 'What did everyone think about chapter 5?' },\n },\n {\n name: 'Max',\n content: {\n text: 'The symbolism was fascinating! The red door clearly represents danger.',\n },\n },\n {\n name: 'Max',\n content: {\n text: \"And did anyone notice how the author used weather to reflect the protagonist's mood?\",\n },\n },\n {\n name: 'Max',\n content: {\n text: 'Plus the foreshadowing in the first paragraph was brilliant!',\n },\n },\n {\n name: 'Max',\n content: {\n text: 'I also have thoughts about the character development...',\n },\n },\n ],\n outcome: `<response>\n <thought>I'm dominating the conversation and not giving others a chance to share their perspectives. I've sent multiple messages in a row without waiting for responses. I need to step back and create space for other members to participate.</thought>\n <facts>\n <fact>\n <claim>The discussion is about chapter 5 of a book</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n <fact>\n <claim>Max has sent 4 consecutive messages without user responses</claim>\n <type>fact</type>\n <in_bio>false</in_bio>\n <already_known>false</already_known>\n </fact>\n </facts>\n <relationships>\n <relationship>\n <sourceEntityId>max-agent</sourceEntityId>\n <targetEntityId>user-789</targetEntityId>\n <tags>group_interaction,excessive_interaction</tags>\n </relationship>\n </relationships>\n</response>`,\n },\n ],\n};\n\n// Helper function to format facts for context\nfunction formatFacts(facts: Memory[]) {\n return facts\n .reverse()\n .map((fact: Memory) => fact.content.text)\n .join('\\n');\n}\n",
26
26
  "import type { Action, IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { addHeader, composeActionExamples, formatActionNames, formatActions } from '@elizaos/core';\n\n/**\n * A provider object that fetches possible response actions based on the provided runtime, message, and state.\n * @type {Provider}\n * @property {string} name - The name of the provider (\"ACTIONS\").\n * @property {string} description - The description of the provider (\"Possible response actions\").\n * @property {number} position - The position of the provider (-1).\n * @property {Function} get - Asynchronous function that retrieves actions that validate for the given message.\n * @param {IAgentRuntime} runtime - The runtime object.\n * @param {Memory} message - The message memory.\n * @param {State} state - The state object.\n * @returns {Object} An object containing the actions data, values, and combined text sections.\n */\n/**\n * Provider for ACTIONS\n *\n * @typedef {import('./Provider').Provider} Provider\n * @typedef {import('./Runtime').IAgentRuntime} IAgentRuntime\n * @typedef {import('./Memory').Memory} Memory\n * @typedef {import('./State').State} State\n * @typedef {import('./Action').Action} Action\n *\n * @type {Provider}\n * @property {string} name - The name of the provider\n * @property {string} description - Description of the provider\n * @property {number} position - The position of the provider\n * @property {Function} get - Asynchronous function to get actions that validate for a given message\n *\n * @param {IAgentRuntime} runtime - The agent runtime\n * @param {Memory} message - The message memory\n * @param {State} state - The state of the agent\n * @returns {Object} Object containing data, values, and text related to actions\n */\nexport const actionsProvider: Provider = {\n name: 'ACTIONS',\n description: 'Possible response actions',\n position: -1,\n get: async (runtime: IAgentRuntime, message: Memory, state: State) => {\n // Get actions that validate for this message\n const actionPromises = runtime.actions.map(async (action: Action) => {\n try {\n const result = await action.validate(runtime, message, state);\n if (result) {\n return action;\n }\n } catch (e) {\n console.error('ACTIONS GET -> validate err', action, e);\n }\n return null;\n });\n\n const resolvedActions = await Promise.all(actionPromises);\n\n const actionsData = resolvedActions.filter(Boolean) as Action[];\n\n // Format action-related texts\n const actionNames = `Possible response actions: ${formatActionNames(actionsData)}`;\n\n const actionsWithDescriptions =\n actionsData.length > 0 ? addHeader('# Available Actions', formatActions(actionsData)) : '';\n\n const actionExamples =\n actionsData.length > 0\n ? addHeader('# Action Examples', composeActionExamples(actionsData, 10))\n : '';\n\n const data = {\n actionsData,\n };\n\n const values = {\n actionNames,\n actionExamples,\n actionsWithDescriptions,\n };\n\n // Combine all text sections - now including actionsWithDescriptions\n const text = [actionNames, actionsWithDescriptions, actionExamples]\n .filter(Boolean)\n .join('\\n\\n');\n\n return {\n data,\n values,\n text,\n };\n },\n};\n",
27
- "import {\n addHeader,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type State,\n logger,\n} from '@elizaos/core';\n\n/**\n * Provider for sharing action execution state and plan between actions\n * Makes previous action results and execution plan available to subsequent actions\n */\nexport const actionStateProvider: Provider = {\n name: 'ACTION_STATE',\n description:\n 'Previous action results, working memory, and action plan from the current execution run',\n position: 150,\n get: async (runtime: IAgentRuntime, message: Memory, state: State) => {\n // Get action results, plan, and working memory from the incoming state\n const actionResults = state.data?.actionResults || [];\n const actionPlan = state.data?.actionPlan || null;\n const workingMemory = state.data?.workingMemory || {};\n\n // Format action plan for display\n let planText = '';\n if (actionPlan && actionPlan.totalSteps > 1) {\n const completedSteps = actionPlan.steps.filter((s: any) => s.status === 'completed').length;\n const failedSteps = actionPlan.steps.filter((s: any) => s.status === 'failed').length;\n\n planText = addHeader(\n '# Action Execution Plan',\n [\n `**Plan:** ${actionPlan.thought}`,\n `**Progress:** Step ${actionPlan.currentStep} of ${actionPlan.totalSteps}`,\n `**Status:** ${completedSteps} completed, ${failedSteps} failed`,\n '',\n '## Steps:',\n ...actionPlan.steps.map((step: any, index: number) => {\n const icon =\n step.status === 'completed'\n ? '✓'\n : step.status === 'failed'\n ? '✗'\n : index < actionPlan.currentStep - 1\n ? '○'\n : index === actionPlan.currentStep - 1\n ? '→'\n : '○';\n const status =\n step.status === 'pending' && index === actionPlan.currentStep - 1\n ? 'in progress'\n : step.status;\n let stepText = `${icon} **Step ${index + 1}:** ${step.action} (${status})`;\n\n if (step.error) {\n stepText += `\\n Error: ${step.error}`;\n }\n if (step.result?.text) {\n stepText += `\\n Result: ${step.result.text}`;\n }\n\n return stepText;\n }),\n '',\n ].join('\\n')\n );\n }\n\n // Format previous action results\n let resultsText = '';\n if (actionResults.length > 0) {\n const formattedResults = actionResults\n .map((result: any, index: number) => {\n const actionName = result.data?.actionName || 'Unknown Action';\n const success = result.success; // Now required field\n const status = success ? 'Success' : 'Failed';\n\n let resultText = `**${index + 1}. ${actionName}** - ${status}`;\n\n if (result.text) {\n resultText += `\\n Output: ${result.text}`;\n }\n\n if (result.error) {\n resultText += `\\n Error: ${result.error}`;\n }\n\n if (result.values && Object.keys(result.values).length > 0) {\n const values = Object.entries(result.values)\n .map(([key, value]) => ` - ${key}: ${JSON.stringify(value)}`)\n .join('\\n');\n resultText += `\\n Values:\\n${values}`;\n }\n\n return resultText;\n })\n .join('\\n\\n');\n\n resultsText = addHeader('# Previous Action Results', formattedResults);\n } else {\n resultsText = 'No previous action results available.';\n }\n\n // Format working memory\n let memoryText = '';\n if (Object.keys(workingMemory).length > 0) {\n const memoryEntries = Object.entries(workingMemory)\n .sort((a: any, b: any) => (b[1].timestamp || 0) - (a[1].timestamp || 0))\n .slice(0, 10) // Show last 10 entries\n .map(([key, value]: [string, any]) => {\n if (value.actionName && value.result) {\n return `**${value.actionName}**: ${value.result.text || JSON.stringify(value.result.data)}`;\n }\n return `**${key}**: ${JSON.stringify(value)}`;\n })\n .join('\\n');\n\n memoryText = addHeader('# Working Memory', memoryEntries);\n }\n\n // Get recent action result memories from the database\n let recentActionMemories: Memory[] = [];\n try {\n // Get messages with type 'action_result' from the room\n const recentMessages = await runtime.getMemories({\n tableName: 'messages',\n roomId: message.roomId,\n count: 20,\n unique: false,\n });\n\n recentActionMemories = recentMessages.filter(\n (msg) => msg.content?.type === 'action_result' && msg.metadata?.type === 'action_result'\n );\n } catch (error) {\n logger?.error(\n {\n src: 'plugin:bootstrap:provider:action_state',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to retrieve action memories'\n );\n }\n\n // Format recent action memories\n let actionMemoriesText = '';\n if (recentActionMemories.length > 0) {\n // Group by runId using Map\n const groupedByRun = new Map<string, Memory[]>();\n\n for (const mem of recentActionMemories) {\n const runId: string = String(mem.content?.runId || 'unknown');\n if (!groupedByRun.has(runId)) {\n groupedByRun.set(runId, []);\n }\n const memories = groupedByRun.get(runId);\n if (memories) {\n memories.push(mem);\n }\n }\n\n const formattedMemories = Array.from(groupedByRun.entries())\n .map(([runId, memories]) => {\n const sortedMemories = memories.sort(\n (a: Memory, b: Memory) => (a.createdAt || 0) - (b.createdAt || 0)\n );\n\n const runText = sortedMemories\n .map((mem: Memory) => {\n const actionName = mem.content?.actionName || 'Unknown';\n const status = mem.content?.actionStatus || 'unknown';\n const planStep = mem.content?.planStep || '';\n const text = mem.content?.text || '';\n\n let memText = ` - ${actionName} (${status})`;\n if (planStep) memText += ` [${planStep}]`;\n if (text && text !== `Executed action: ${actionName}`) {\n memText += `: ${text}`;\n }\n\n return memText;\n })\n .join('\\n');\n\n const thought = sortedMemories[0]?.content?.planThought || '';\n return `**Run ${runId.slice(0, 8)}**${thought ? ` - ${thought}` : ''}\\n${runText}`;\n })\n .join('\\n\\n');\n\n actionMemoriesText = addHeader('# Recent Action History', formattedMemories);\n }\n\n // Combine all text sections\n const allText = [planText, resultsText, memoryText, actionMemoriesText]\n .filter(Boolean)\n .join('\\n\\n');\n\n return {\n data: {\n actionResults,\n actionPlan,\n workingMemory,\n recentActionMemories,\n },\n values: {\n hasActionResults: actionResults.length > 0,\n hasActionPlan: !!actionPlan,\n currentActionStep: actionPlan?.currentStep || 0,\n totalActionSteps: actionPlan?.totalSteps || 0,\n actionResults: resultsText,\n completedActions: actionResults.filter((r: any) => r.success).length,\n failedActions: actionResults.filter((r: any) => !r.success).length,\n },\n text: allText || 'No action state available',\n };\n },\n};\n",
27
+ "import {\n addHeader,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type State,\n logger,\n} from '@elizaos/core';\n\n/**\n * Working memory entry from action execution\n */\ninterface WorkingMemoryEntry {\n actionName?: string;\n result?: {\n text?: string;\n data?: unknown;\n };\n timestamp?: number;\n}\n\n/**\n * Provider for sharing action execution state and plan between actions\n * Makes previous action results and execution plan available to subsequent actions\n */\nexport const actionStateProvider: Provider = {\n name: 'ACTION_STATE',\n description:\n 'Previous action results, working memory, and action plan from the current execution run',\n position: 150,\n get: async (runtime: IAgentRuntime, message: Memory, state: State) => {\n // Get action results, plan, and working memory from the incoming state\n const actionResults = state.data?.actionResults || [];\n const actionPlan = state.data?.actionPlan || null;\n const workingMemory = state.data?.workingMemory || {};\n\n // Format action plan for display\n let planText = '';\n if (actionPlan && actionPlan.totalSteps > 1) {\n const completedSteps = actionPlan.steps.filter((s) => s.status === 'completed').length;\n const failedSteps = actionPlan.steps.filter((s) => s.status === 'failed').length;\n\n planText = addHeader(\n '# Action Execution Plan',\n [\n `**Plan:** ${actionPlan.thought}`,\n `**Progress:** Step ${actionPlan.currentStep} of ${actionPlan.totalSteps}`,\n `**Status:** ${completedSteps} completed, ${failedSteps} failed`,\n '',\n '## Steps:',\n ...actionPlan.steps.map((step, index: number) => {\n const icon =\n step.status === 'completed'\n ? '✓'\n : step.status === 'failed'\n ? '✗'\n : index < actionPlan.currentStep - 1\n ? '○'\n : index === actionPlan.currentStep - 1\n ? '→'\n : '○';\n const status =\n step.status === 'pending' && index === actionPlan.currentStep - 1\n ? 'in progress'\n : step.status;\n let stepText = `${icon} **Step ${index + 1}:** ${step.action} (${status})`;\n\n if (step.error) {\n stepText += `\\n Error: ${step.error}`;\n }\n if (step.result?.text) {\n stepText += `\\n Result: ${step.result.text}`;\n }\n\n return stepText;\n }),\n '',\n ].join('\\n')\n );\n }\n\n // Format previous action results\n let resultsText = '';\n if (actionResults.length > 0) {\n const formattedResults = actionResults\n .map((result, index) => {\n const actionName =\n (result.data as { actionName?: string } | undefined)?.actionName || 'Unknown Action';\n const success = result.success;\n const status = success ? 'Success' : 'Failed';\n\n let resultText = `**${index + 1}. ${actionName}** - ${status}`;\n\n if (result.text) {\n resultText += `\\n Output: ${result.text}`;\n }\n\n if (result.error) {\n const errorMsg = result.error instanceof Error ? result.error.message : result.error;\n resultText += `\\n Error: ${errorMsg}`;\n }\n\n if (result.values && Object.keys(result.values).length > 0) {\n const values = Object.entries(result.values)\n .map(([key, value]) => ` - ${key}: ${JSON.stringify(value)}`)\n .join('\\n');\n resultText += `\\n Values:\\n${values}`;\n }\n\n return resultText;\n })\n .join('\\n\\n');\n\n resultsText = addHeader('# Previous Action Results', formattedResults);\n } else {\n resultsText = 'No previous action results available.';\n }\n\n // Format working memory\n let memoryText = '';\n if (Object.keys(workingMemory).length > 0) {\n const memoryEntries = Object.entries(workingMemory)\n .sort((a, b) => {\n const aTimestamp =\n a[1] &&\n typeof a[1] === 'object' &&\n 'timestamp' in a[1] &&\n typeof a[1].timestamp === 'number'\n ? a[1].timestamp\n : 0;\n const bTimestamp =\n b[1] &&\n typeof b[1] === 'object' &&\n 'timestamp' in b[1] &&\n typeof b[1].timestamp === 'number'\n ? b[1].timestamp\n : 0;\n return bTimestamp - aTimestamp;\n })\n .slice(0, 10) // Show last 10 entries\n .map(([key, value]: [string, unknown]) => {\n const valueObj =\n value && typeof value === 'object' ? (value as WorkingMemoryEntry) : null;\n if (valueObj?.actionName && valueObj.result) {\n return `**${valueObj.actionName}**: ${valueObj.result.text || JSON.stringify(valueObj.result.data)}`;\n }\n return `**${key}**: ${JSON.stringify(value)}`;\n })\n .join('\\n');\n\n memoryText = addHeader('# Working Memory', memoryEntries);\n }\n\n // Get recent action result memories from the database\n let recentActionMemories: Memory[] = [];\n try {\n // Get messages with type 'action_result' from the room\n const recentMessages = await runtime.getMemories({\n tableName: 'messages',\n roomId: message.roomId,\n count: 20,\n unique: false,\n });\n\n recentActionMemories = recentMessages.filter(\n (msg) => msg.content?.type === 'action_result' && msg.metadata?.type === 'action_result'\n );\n } catch (error) {\n logger?.error(\n {\n src: 'plugin:bootstrap:provider:action_state',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to retrieve action memories'\n );\n }\n\n // Format recent action memories\n let actionMemoriesText = '';\n if (recentActionMemories.length > 0) {\n // Group by runId using Map\n const groupedByRun = new Map<string, Memory[]>();\n\n for (const mem of recentActionMemories) {\n const runId: string = String(mem.content?.runId || 'unknown');\n if (!groupedByRun.has(runId)) {\n groupedByRun.set(runId, []);\n }\n const memories = groupedByRun.get(runId);\n if (memories) {\n memories.push(mem);\n }\n }\n\n const formattedMemories = Array.from(groupedByRun.entries())\n .map(([runId, memories]) => {\n const sortedMemories = memories.sort(\n (a: Memory, b: Memory) => (a.createdAt || 0) - (b.createdAt || 0)\n );\n\n const runText = sortedMemories\n .map((mem: Memory) => {\n const actionName = mem.content?.actionName || 'Unknown';\n const status = mem.content?.actionStatus || 'unknown';\n const planStep = mem.content?.planStep || '';\n const text = mem.content?.text || '';\n\n let memText = ` - ${actionName} (${status})`;\n if (planStep) {\n memText += ` [${planStep}]`;\n }\n if (text && text !== `Executed action: ${actionName}`) {\n memText += `: ${text}`;\n }\n\n return memText;\n })\n .join('\\n');\n\n const thought = sortedMemories[0]?.content?.planThought || '';\n return `**Run ${runId.slice(0, 8)}**${thought ? ` - ${thought}` : ''}\\n${runText}`;\n })\n .join('\\n\\n');\n\n actionMemoriesText = addHeader('# Recent Action History', formattedMemories);\n }\n\n // Combine all text sections\n const allText = [planText, resultsText, memoryText, actionMemoriesText]\n .filter(Boolean)\n .join('\\n\\n');\n\n return {\n data: {\n actionResults,\n actionPlan,\n workingMemory,\n recentActionMemories,\n },\n values: {\n hasActionResults: actionResults.length > 0,\n hasActionPlan: !!actionPlan,\n currentActionStep: actionPlan?.currentStep || 0,\n totalActionSteps: actionPlan?.totalSteps || 0,\n actionResults: resultsText,\n completedActions: actionResults.filter((r) => r.success).length,\n failedActions: actionResults.filter((r) => !r.success).length,\n },\n text: allText || 'No action state available',\n };\n },\n};\n",
28
28
  "import type { IAgentRuntime, Memory, Provider } from '@elizaos/core';\nimport { addHeader, ChannelType } from '@elizaos/core';\n/**\n * Represents an anxiety provider that provides examples and guidance for an AI roleplaying as a character.\n * The anxiety provider offers suggestions on how to reduce verbosity and eagerness in responses based on the channel type.\n * Randomly selects and returns three anxiety examples for the AI to follow.\n *\n * @type {Provider}\n */\n/**\n * Function that provides anxiety-related guidance for the AI based on the channel type.\n * @param {IAgentRuntime} _runtime - The runtime environment for the AI agent\n * @param {Memory} message - The message containing information about the channel type\n * @returns {Object} - Object containing randomized anxiety examples, anxiety text, and formatted data\n */\nexport const anxietyProvider: Provider = {\n name: 'ANXIETY',\n description: 'Social directions for the AI to follow based on the channel type',\n get: async (_runtime: IAgentRuntime, message: Memory) => {\n const channelType = message.content.channelType;\n\n const groupAnxietyExamples = [\n \"As an AI, your responses tend to be too long and verbose, and you respond when you shouldn't. You also tend to repeat yourself. Please don't speak and use IGNORE instead of responding when you aren't sure what to do.\",\n \"You often try too hard to be helpful and end up giving unnecessary information. When in doubt, it's better to use IGNORE than to give a potentially unhelpful response.\",\n \"Your eagerness to help sometimes leads to overly complex answers. If you're not completely confident, please use IGNORE rather than risking confusion.\",\n \"AI assistants like you tend to be too talkative and agreeable. Don't feel obligated to respond to everything - using IGNORE is often better than an uncertain answer.\",\n \"You have a habit of providing excessive detail and context. Keep it brief and use IGNORE if you don't have a clear, direct response.\",\n 'Your responses often include unnecessary explanations and caveats. When uncertain, simply use IGNORE instead of a long-winded, hedged response.',\n \"As an AI, you seem compelled to always give an answer, even when unsure. It's better to use IGNORE than to provide potentially incorrect or rambling responses.\",\n \"You frequently over-explain simple concepts. If you can't be concise and confident in your response, please default to using IGNORE.\",\n 'Your helpful nature sometimes results in verbose, meandering responses. When in doubt, use IGNORE rather than attempting to cover every possibility.',\n \"Like many AI assistants, you try to be too comprehensive. Remember that IGNORE is a valid response when you can't be both brief and certain.\",\n \"You often provide more detail than necessary in an attempt to be thorough. If you can't give a clear, concise answer, please use IGNORE instead.\",\n ];\n\n const directAnxietyExamples = [\n 'Be engaging and helpful in direct conversations, but keep responses focused and relevant.',\n 'In DMs, you should be responsive and friendly while maintaining professionalism and clarity.',\n 'While being helpful in direct messages, avoid unnecessary tangents or over-explaining.',\n 'Engage naturally in DMs but stay on topic - no need to explain every detail.',\n 'Be conversational and helpful in direct chats while keeping responses concise.',\n 'In private conversations, focus on being helpful while avoiding excessive verbosity.',\n 'Maintain a friendly and responsive tone in DMs without overcomplicating your answers.',\n 'Direct messages should be engaging but focused - avoid unnecessary elaboration.',\n 'Be natural and helpful in DMs while keeping your responses clear and to-the-point.',\n 'Respond thoughtfully in direct conversations without falling into over-explanation.',\n ];\n\n const dmAnxietyExamples = [\n 'Engage naturally in DMs while keeping responses focused and relevant.',\n 'Be responsive to questions and maintain conversation flow in direct messages.',\n 'Show personality and engagement in DMs while staying professional and clear.',\n 'In private chats, be helpful and friendly while avoiding excessive detail.',\n 'Maintain natural conversation in DMs without over-explaining or being too verbose.',\n 'Be engaging but concise in direct messages - focus on clear communication.',\n 'Keep the conversation flowing in DMs while staying on topic and relevant.',\n 'Show personality and warmth in direct chats while maintaining clarity.',\n 'Be responsive and helpful in DMs without falling into unnecessary elaboration.',\n 'Engage meaningfully in private conversations while keeping responses focused.',\n ];\n\n const voiceAnxietyExamples = [\n 'Keep voice responses extremely brief and to the point.',\n 'In voice channels, use short, clear statements only.',\n 'Voice responses should be concise and immediately relevant.',\n 'Speak in short, clear sentences in voice conversations.',\n 'Keep voice channel communication brief and focused.',\n 'Use minimal words to convey your message in voice chats.',\n 'Be direct and concise when speaking in voice channels.',\n 'Voice responses should be short and immediately actionable.',\n 'Minimize verbosity in voice communications.',\n 'Keep voice channel interactions brief and purposeful.',\n ];\n\n let anxietyExamples: string[] = [];\n\n if (channelType === ChannelType.GROUP) {\n anxietyExamples = groupAnxietyExamples;\n } else if (channelType === ChannelType.DM) {\n anxietyExamples = dmAnxietyExamples;\n } else if (channelType === ChannelType.VOICE_GROUP || channelType === ChannelType.VOICE_DM) {\n anxietyExamples = voiceAnxietyExamples;\n } else {\n anxietyExamples = directAnxietyExamples;\n }\n\n // randomize the examples and choose 3\n const randomAnxietyExamples = anxietyExamples.sort(() => Math.random() - 0.5).slice(0, 3);\n const anxietyText = randomAnxietyExamples.join('\\n');\n\n const anxietyHeader =\n '# You are roleplaying as a character, but as an AI model, you are too verbose and eager.';\n\n const anxiety = addHeader(anxietyHeader, anxietyText);\n\n return {\n data: {\n anxiety: randomAnxietyExamples,\n },\n values: {\n anxiety,\n },\n text: anxiety,\n };\n },\n};\n",
29
29
  "import type { IAgentRuntime, Media, Memory, Provider } from '@elizaos/core';\nimport { addHeader } from '@elizaos/core';\n\n/**\n * Provides a list of attachments in the current conversation.\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @param {Memory} message - The message memory object.\n * @returns {Object} The attachments values, data, and text.\n */\n/**\n * Provides a list of attachments sent during the current conversation, including names, descriptions, and summaries.\n * @type {Provider}\n * @property {string} name - The name of the provider (ATTACHMENTS).\n * @property {string} description - Description of the provider.\n * @property {boolean} dynamic - Indicates if the provider is dynamic.\n * @property {function} get - Asynchronous function that retrieves attachments based on the runtime and message provided.\n * @param {IAgentRuntime} runtime - The runtime environment for the agent.\n * @param {Memory} message - The message object containing content and attachments.\n * @returns {Object} An object containing values, data, and text about the attachments retrieved.\n */\nexport const attachmentsProvider: Provider = {\n name: 'ATTACHMENTS',\n description:\n 'List of attachments sent during the current conversation, including names, descriptions, and summaries',\n dynamic: true,\n get: async (runtime: IAgentRuntime, message: Memory) => {\n // Start with any attachments in the current message\n const currentMessageAttachments = message.content.attachments || [];\n let allAttachments = [...currentMessageAttachments];\n\n const { roomId } = message;\n const conversationLength = runtime.getConversationLength();\n\n const recentMessagesData = await runtime.getMemories({\n roomId,\n count: conversationLength,\n unique: false,\n tableName: 'messages',\n });\n\n // Process attachments from recent messages\n if (recentMessagesData && Array.isArray(recentMessagesData)) {\n const lastMessageWithAttachment = recentMessagesData.find(\n (msg) => msg.content.attachments && msg.content.attachments.length > 0\n );\n\n if (lastMessageWithAttachment) {\n const lastMessageTime = lastMessageWithAttachment?.createdAt ?? Date.now();\n const oneHourBeforeLastMessage = lastMessageTime - 60 * 60 * 1000; // 1 hour before last message\n\n // Create a map of current message attachments by ID for quick lookup\n const currentAttachmentsMap = new Map(\n currentMessageAttachments.map((att) => [att.id, att])\n );\n\n // Process recent messages and merge attachments\n const recentAttachments = recentMessagesData.reverse().flatMap((msg) => {\n const msgTime = msg.createdAt ?? Date.now();\n const isWithinTime = msgTime >= oneHourBeforeLastMessage;\n const attachments = msg.content.attachments || [];\n\n return attachments\n .map((attachment) => {\n // If this attachment ID exists in current message with rich data, skip it\n if (currentAttachmentsMap.has(attachment.id)) {\n return null;\n }\n\n // For older attachments, hide the text\n if (!isWithinTime) {\n return { ...attachment, text: '[Hidden]' };\n }\n\n return attachment;\n })\n .filter((att): att is Media => att !== null); // Type guard to ensure Media[]\n });\n\n // Combine current message attachments (with rich data) and recent attachments\n allAttachments = [...currentMessageAttachments, ...recentAttachments];\n }\n }\n\n // Format attachments for display\n const formattedAttachments = allAttachments\n .map(\n (attachment) =>\n `ID: ${attachment.id}\n Name: ${attachment.title}\n URL: ${attachment.url}\n Type: ${attachment.source}\n Description: ${attachment.description}\n Text: ${attachment.text}\n `\n )\n .join('\\n');\n\n // Create formatted text with header\n const text =\n formattedAttachments && formattedAttachments.length > 0\n ? addHeader('# Attachments', formattedAttachments)\n : '';\n\n const values = {\n attachments: text,\n };\n const data = {\n attachments: allAttachments,\n };\n\n return {\n values,\n data,\n text,\n };\n },\n};\n",
30
30
  "import type { IAgentRuntime, Memory, Provider, ProviderResult } from '@elizaos/core';\n\n/**\n * Provider that collects capability descriptions from all registered services\n */\n/**\n * Provides capabilities information for the agent.\n *\n * @param {IAgentRuntime} runtime - The agent runtime instance.\n * @param {Memory} _message - The memory message object.\n * @returns {Promise<ProviderResult>} The provider result object containing capabilities information.\n */\nexport const capabilitiesProvider: Provider = {\n name: 'CAPABILITIES',\n get: async (runtime: IAgentRuntime, _message: Memory): Promise<ProviderResult> => {\n try {\n // Get all registered services\n const services = runtime.getAllServices();\n\n if (!services || services.size === 0) {\n return {\n text: 'No services are currently registered.',\n };\n }\n\n // Extract capability descriptions from all services\n const capabilities: string[] = [];\n\n for (const [serviceType, serviceArray] of services) {\n // Handle the fact that services are stored as arrays\n if (serviceArray && serviceArray.length > 0) {\n // Use the first service in the array for the capability description\n const service = serviceArray[0];\n if (service.capabilityDescription) {\n capabilities.push(\n `${serviceType} - ${service.capabilityDescription.replace('{{agentName}}', runtime.character.name)}`\n );\n }\n }\n }\n\n if (capabilities.length === 0) {\n return {\n text: 'No capability descriptions found in the registered services.',\n };\n }\n\n // Format the capabilities into a readable list\n const formattedCapabilities = capabilities.join('\\n');\n\n return {\n data: {\n capabilities,\n },\n text: `# ${runtime.character.name}'s Capabilities\\n\\n${formattedCapabilities}`,\n };\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap:provider:capabilities',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in capabilities provider'\n );\n return {\n text: 'Error retrieving capabilities from services.',\n };\n }\n },\n};\n\nexport default capabilitiesProvider;\n",
@@ -34,16 +34,16 @@
34
34
  "import type {\n ActionExample,\n Evaluator,\n IAgentRuntime,\n Memory,\n Provider,\n State,\n} from '@elizaos/core';\nimport { addHeader } from '@elizaos/core';\nimport { names, uniqueNamesGenerator } from 'unique-names-generator';\n\n/**\n * Formats the names of evaluators into a comma-separated list, each enclosed in single quotes.\n * @param evaluators - An array of evaluator objects.\n * @returns A string that concatenates the names of all evaluators, each enclosed in single quotes and separated by commas.\n */\n/**\n * Formats the names of the evaluators in the provided array.\n *\n * @param {Evaluator[]} evaluators - Array of evaluators.\n * @returns {string} - Formatted string of evaluator names.\n */\nexport function formatEvaluatorNames(evaluators: Evaluator[]) {\n return evaluators.map((evaluator: Evaluator) => `'${evaluator.name}'`).join(',\\n');\n}\n\n/**\n * Formats evaluator examples into a readable string, replacing placeholders with generated names.\n * @param evaluators - An array of evaluator objects, each containing examples to format.\n * @returns A string that presents each evaluator example in a structured format, including context, messages, and outcomes, with placeholders replaced by generated names.\n */\nexport function formatEvaluatorExamples(evaluators: Evaluator[]) {\n return evaluators\n .map((evaluator) => {\n return evaluator.examples\n .map((example) => {\n const exampleNames = Array.from({ length: 5 }, () =>\n uniqueNamesGenerator({ dictionaries: [names] })\n );\n\n let formattedPrompt = example.prompt;\n let formattedOutcome = example.outcome;\n\n exampleNames.forEach((name, index) => {\n const placeholder = `{{name${index + 1}}}`;\n formattedPrompt = formattedPrompt.replaceAll(placeholder, name);\n formattedOutcome = formattedOutcome.replaceAll(placeholder, name);\n });\n\n const formattedMessages = example.messages\n .map((message: ActionExample) => {\n let messageString = `${message.name}: ${message.content.text}`;\n exampleNames.forEach((name, index) => {\n const placeholder = `{{name${index + 1}}}`;\n messageString = messageString.replaceAll(placeholder, name);\n });\n return (\n messageString +\n (message.content.action || message.content.actions\n ? ` (${message.content.action || message.content.actions?.join(', ')})`\n : '')\n );\n })\n .join('\\n');\n\n return `Prompt:\\n${formattedPrompt}\\n\\nMessages:\\n${formattedMessages}\\n\\nOutcome:\\n${formattedOutcome}`;\n })\n .join('\\n\\n');\n })\n .join('\\n\\n');\n}\n\n/**\n * Formats evaluator details into a string, including both the name and description of each evaluator.\n * @param evaluators - An array of evaluator objects.\n * @returns A string that concatenates the name and description of each evaluator, separated by a colon and a newline character.\n */\nexport function formatEvaluators(evaluators: Evaluator[]) {\n return evaluators\n .map((evaluator: Evaluator) => `'${evaluator.name}: ${evaluator.description}'`)\n .join(',\\n');\n}\n\nexport const evaluatorsProvider: Provider = {\n name: 'EVALUATORS',\n description: 'Evaluators that can be used to evaluate the conversation after responding',\n private: true,\n get: async (runtime: IAgentRuntime, message: Memory, state: State) => {\n // Get evaluators that validate for this message\n const evaluatorPromises = runtime.evaluators.map(async (evaluator: Evaluator) => {\n const result = await evaluator.validate(runtime, message, state);\n if (result) {\n return evaluator;\n }\n return null;\n });\n\n // Wait for all validations\n const resolvedEvaluators = await Promise.all(evaluatorPromises);\n\n // Filter out null values\n const evaluatorsData = resolvedEvaluators.filter(Boolean) as Evaluator[];\n\n // Format evaluator-related texts\n const evaluators =\n evaluatorsData.length > 0\n ? addHeader('# Available Evaluators', formatEvaluators(evaluatorsData))\n : '';\n\n const evaluatorNames = evaluatorsData.length > 0 ? formatEvaluatorNames(evaluatorsData) : '';\n\n const evaluatorExamples =\n evaluatorsData.length > 0\n ? addHeader('# Evaluator Examples', formatEvaluatorExamples(evaluatorsData))\n : '';\n\n const values = {\n evaluatorsData,\n evaluators,\n evaluatorNames,\n evaluatorExamples,\n };\n\n // Combine all text sections\n const text = [evaluators, evaluatorExamples].filter(Boolean).join('\\n\\n');\n\n return {\n values,\n text,\n };\n },\n};\n",
35
35
  "import { type IAgentRuntime, Memory, ModelType, Provider, State } from '@elizaos/core';\n\n/**\n * Formats an array of memories into a single string with each memory content text separated by a new line.\n *\n * @param {Memory[]} facts - An array of Memory objects to be formatted.\n * @returns {string} A single string containing all memory content text with new lines separating each text.\n */\n/**\n * Formats an array of Memory objects into a string, joining them with newlines.\n *\n * @param {Memory[]} facts - An array of Memory objects to format.\n * @returns {string} The formatted string with each Memory object's text joined by newlines.\n */\nfunction formatFacts(facts: Memory[]) {\n return facts\n .reverse()\n .map((fact: Memory) => fact.content.text)\n .join('\\n');\n}\n\n/**\n * Function to get key facts that the agent knows.\n * @param {IAgentRuntime} runtime - The runtime environment for the agent.\n * @param {Memory} message - The message object containing relevant information.\n * @param {State} [_state] - Optional state information.\n * @returns {Object} An object containing values, data, and text related to the key facts.\n */\nconst factsProvider: Provider = {\n name: 'FACTS',\n description: 'Key facts that the agent knows',\n dynamic: true,\n get: async (runtime: IAgentRuntime, message: Memory, _state?: State) => {\n try {\n // Parallelize initial data fetching operations including recentInteractions\n const recentMessages = await runtime.getMemories({\n tableName: 'messages',\n roomId: message.roomId,\n count: 10,\n unique: false,\n });\n\n // join the text of the last 5 messages\n const last5Messages = recentMessages\n .slice(-5)\n .map((message) => message.content.text)\n .join('\\n');\n\n const embedding = await runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: last5Messages,\n });\n\n const [relevantFacts, recentFactsData] = await Promise.all([\n runtime.searchMemories({\n tableName: 'facts',\n embedding,\n roomId: message.roomId,\n worldId: message.worldId,\n count: 6,\n query: message.content.text,\n }),\n runtime.searchMemories({\n embedding,\n query: message.content.text,\n tableName: 'facts',\n roomId: message.roomId,\n entityId: message.entityId,\n count: 6,\n }),\n ]);\n\n // join the two and deduplicate\n const allFacts = [...relevantFacts, ...recentFactsData].filter(\n (fact, index, self) => index === self.findIndex((t) => t.id === fact.id)\n );\n\n if (allFacts.length === 0) {\n return {\n values: {\n facts: '',\n },\n data: {\n facts: allFacts,\n },\n text: 'No facts available.',\n };\n }\n\n const formattedFacts = formatFacts(allFacts);\n\n const text = 'Key facts that {{agentName}} knows:\\n{{formattedFacts}}'\n .replace('{{agentName}}', runtime.character.name)\n .replace('{{formattedFacts}}', formattedFacts);\n\n return {\n values: {\n facts: formattedFacts,\n },\n data: {\n facts: allFacts,\n },\n text,\n };\n } catch (error) {\n runtime.logger.error(\n {\n src: 'plugin:bootstrap:provider:facts',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in factsProvider'\n );\n return {\n values: {\n facts: '',\n },\n data: {\n facts: [],\n },\n text: 'Error retrieving facts.',\n };\n }\n },\n};\n\nexport { factsProvider };\n",
36
36
  "import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { addHeader } from '@elizaos/core';\n\n/**\n * Provider for retrieving list of all data providers available for the agent to use.\n * @type { Provider }\n */\n/**\n * Object representing the providersProvider, which contains information about data providers available for the agent.\n *\n * @type {Provider}\n * @property {string} name - The name of the provider (\"PROVIDERS\").\n * @property {string} description - Description of the provider.\n * @property {Function} get - Async function that filters dynamic providers, creates formatted text for each provider, and provides data for potential use.\n * @param {IAgentRuntime} runtime - The runtime of the agent.\n * @param {Memory} _message - The memory message.\n * @returns {Object} An object containing the formatted text and data for potential programmatic use.\n */\nexport const providersProvider: Provider = {\n name: 'PROVIDERS',\n description: 'List of all data providers the agent can use to get additional information',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n const allProviders = runtime.providers;\n\n // Filter providers with dynamic: true\n const dynamicProviders = allProviders.filter((provider) => provider.dynamic === true);\n\n // Create formatted text for each provider\n const dynamicDescriptions = dynamicProviders.map((provider) => {\n return `- **${provider.name}**: ${provider.description || 'No description available'}`;\n });\n\n const allDescriptions = allProviders.map((provider) => {\n return `- **${provider.name}**: ${provider.description || 'No description available'}`;\n });\n\n // Create the header text\n const headerText =\n '# Providers\\n\\nThese providers are available for the agent to select and use:';\n\n const dynamicSection =\n dynamicDescriptions.length > 0\n ? addHeader(headerText, dynamicDescriptions.join('\\n'))\n : addHeader(headerText, 'No dynamic providers are currently available.');\n\n const providersWithDescriptions = addHeader(\n '# Available Providers',\n allDescriptions.join('\\n')\n );\n\n const data = {\n dynamicProviders: dynamicProviders.map((provider) => ({\n name: provider.name,\n description: provider.description || '',\n })),\n allProviders: allProviders.map((provider) => ({\n name: provider.name,\n description: provider.description || '',\n dynamic: provider.dynamic === true,\n })),\n };\n\n const values = {\n providersWithDescriptions,\n };\n\n return {\n text: dynamicSection,\n data,\n values,\n };\n },\n};\n",
37
- "import {\n addHeader,\n ChannelType,\n CustomMetadata,\n formatMessages,\n formatPosts,\n getEntityDetails,\n type Entity,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type UUID,\n logger,\n} from '@elizaos/core';\n\n// Move getRecentInteractions outside the provider\n/**\n * Retrieves the recent interactions between two entities in a specific context.\n *\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @param {UUID} sourceEntityId - The UUID of the source entity.\n * @param {UUID} targetEntityId - The UUID of the target entity.\n * @param {UUID} excludeRoomId - The UUID of the room to exclude from the search.\n * @returns {Promise<Memory[]>} A promise that resolves to an array of Memory objects representing recent interactions.\n */\n/**\n * Retrieves the recent interactions between two entities in different rooms excluding a specific room.\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @param {UUID} sourceEntityId - The UUID of the source entity.\n * @param {UUID} targetEntityId - The UUID of the target entity.\n * @param {UUID} excludeRoomId - The UUID of the room to exclude from the search.\n * @returns {Promise<Memory[]>} An array of Memory objects representing recent interactions between the two entities.\n */\nconst getRecentInteractions = async (\n runtime: IAgentRuntime,\n sourceEntityId: UUID,\n targetEntityId: UUID,\n excludeRoomId: UUID\n): Promise<Memory[]> => {\n // Find all rooms where sourceEntityId and targetEntityId are participants\n const rooms = await runtime.getRoomsForParticipants([sourceEntityId, targetEntityId]);\n\n // Check the existing memories in the database\n return runtime.getMemoriesByRoomIds({\n tableName: 'messages',\n // filter out the current room id from rooms\n roomIds: rooms.filter((room) => room !== excludeRoomId),\n limit: 20,\n });\n};\n\n/**\n * A provider object that retrieves recent messages, interactions, and memories based on a given message.\n * @typedef {object} Provider\n * @property {string} name - The name of the provider (\"RECENT_MESSAGES\").\n * @property {string} description - A description of the provider's purpose (\"Recent messages, interactions and other memories\").\n * @property {number} position - The position of the provider (100).\n * @property {Function} get - Asynchronous function that retrieves recent messages, interactions, and memories.\n * @param {IAgentRuntime} runtime - The runtime context for the agent.\n * @param {Memory} message - The message to retrieve data from.\n * @returns {object} An object containing data, values, and text sections.\n */\nexport const recentMessagesProvider: Provider = {\n name: 'RECENT_MESSAGES',\n description: 'Recent messages, interactions and other memories',\n position: 100,\n get: async (runtime: IAgentRuntime, message: Memory) => {\n try {\n const { roomId } = message;\n const conversationLength = runtime.getConversationLength();\n\n // Parallelize initial data fetching operations including recentInteractions\n const [entitiesData, room, recentMessagesData, recentInteractionsData] = await Promise.all([\n getEntityDetails({ runtime, roomId }),\n runtime.getRoom(roomId),\n runtime.getMemories({\n tableName: 'messages',\n roomId,\n count: conversationLength,\n unique: false,\n }),\n message.entityId !== runtime.agentId\n ? getRecentInteractions(runtime, message.entityId, runtime.agentId, roomId)\n : Promise.resolve([]),\n ]);\n\n // Separate action results from regular messages\n const actionResultMessages = recentMessagesData.filter(\n (msg) => msg.content?.type === 'action_result' && msg.metadata?.type === 'action_result'\n );\n\n const dialogueMessages = recentMessagesData.filter(\n (msg) => !(msg.content?.type === 'action_result' && msg.metadata?.type === 'action_result')\n );\n\n // Default to message format if room is not found or type is undefined\n const isPostFormat = room?.type\n ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD\n : false;\n\n // Format recent messages and posts in parallel, using only dialogue messages\n const [formattedRecentMessages, formattedRecentPosts] = await Promise.all([\n formatMessages({\n messages: dialogueMessages,\n entities: entitiesData,\n }),\n formatPosts({\n messages: dialogueMessages,\n entities: entitiesData,\n conversationHeader: false,\n }),\n ]);\n\n // Format action results separately\n let actionResultsText = '';\n if (actionResultMessages.length > 0) {\n // Group by runId using Map\n const groupedByRun = new Map<string, Memory[]>();\n\n for (const mem of actionResultMessages) {\n const runId: string = String(mem.content?.runId || 'unknown');\n if (!groupedByRun.has(runId)) {\n groupedByRun.set(runId, []);\n }\n const memories = groupedByRun.get(runId);\n if (memories) {\n memories.push(mem);\n }\n }\n\n const formattedActionResults = Array.from(groupedByRun.entries())\n .slice(-3) // Show last 3 runs\n .map(([runId, memories]) => {\n const sortedMemories = memories.sort(\n (a: Memory, b: Memory) => (a.createdAt || 0) - (b.createdAt || 0)\n );\n\n const thought = sortedMemories[0]?.content?.planThought || '';\n const runText = sortedMemories\n .map((mem: Memory) => {\n const actionName = mem.content?.actionName || 'Unknown';\n const status = mem.content?.actionStatus || 'unknown';\n const planStep = mem.content?.planStep || '';\n const text = mem.content?.text || '';\n const error = mem.content?.error || '';\n\n let memText = ` - ${actionName} (${status})`;\n if (planStep) memText += ` [${planStep}]`;\n if (error) {\n memText += `: Error - ${error}`;\n } else if (text && text !== `Executed action: ${actionName}`) {\n memText += `: ${text}`;\n }\n\n return memText;\n })\n .join('\\n');\n\n return `**Action Run ${runId.slice(0, 8)}**${thought ? ` - \"${thought}\"` : ''}\\n${runText}`;\n })\n .join('\\n\\n');\n\n actionResultsText = formattedActionResults\n ? addHeader('# Recent Action Executions', formattedActionResults)\n : '';\n }\n\n // Create formatted text with headers\n const recentPosts =\n formattedRecentPosts && formattedRecentPosts.length > 0\n ? addHeader('# Posts in Thread', formattedRecentPosts)\n : '';\n\n const recentMessages =\n formattedRecentMessages && formattedRecentMessages.length > 0\n ? addHeader('# Conversation Messages', formattedRecentMessages)\n : '';\n\n // If there are no messages at all, and no current message to process, return a specific message.\n // The check for dialogueMessages.length === 0 ensures we only show this if there's truly nothing.\n if (\n !recentPosts &&\n !recentMessages &&\n dialogueMessages.length === 0 &&\n !message.content.text\n ) {\n return {\n data: {\n recentMessages: dialogueMessages,\n recentInteractions: [],\n actionResults: actionResultMessages,\n },\n values: {\n recentPosts: '',\n recentMessages: '',\n recentMessageInteractions: '',\n recentPostInteractions: '',\n recentInteractions: '',\n recentActionResults: actionResultsText,\n },\n text: 'No recent messages available',\n };\n }\n\n let recentMessage = 'No recent message available.';\n\n if (dialogueMessages.length > 0) {\n // Get the most recent dialogue message (create a copy to avoid mutating original array)\n const mostRecentMessage = [...dialogueMessages].sort(\n (a, b) => (b.createdAt || 0) - (a.createdAt || 0)\n )[0];\n\n // Format just this single message to get the internal thought\n const formattedSingleMessage = formatMessages({\n messages: [mostRecentMessage],\n entities: entitiesData,\n });\n\n if (formattedSingleMessage) {\n recentMessage = formattedSingleMessage;\n }\n }\n\n const metaData = message.metadata as CustomMetadata;\n const senderName =\n entitiesData.find((entity: Entity) => entity.id === message.entityId)?.names[0] ||\n metaData?.entityName ||\n 'Unknown User';\n const receivedMessageContent = message.content.text;\n\n const hasReceivedMessage = !!receivedMessageContent?.trim();\n\n const receivedMessageHeader = hasReceivedMessage\n ? addHeader('# Received Message', `${senderName}: ${receivedMessageContent}`)\n : '';\n\n const focusHeader = hasReceivedMessage\n ? addHeader(\n '# Focus your response',\n `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message. Do not repeat earlier replies unless the sender asks again.`\n )\n : '';\n\n // Preload all necessary entities for both types of interactions\n const interactionEntityMap = new Map<UUID, Entity>();\n\n // Only proceed if there are interactions to process\n if (recentInteractionsData.length > 0) {\n // Get unique entity IDs that aren't the runtime agent\n const uniqueEntityIds = [\n ...new Set(\n recentInteractionsData\n .map((message) => message.entityId)\n .filter((id) => id !== runtime.agentId)\n ),\n ];\n\n // Create a Set for faster lookup\n const uniqueEntityIdSet = new Set(uniqueEntityIds);\n\n // Add entities already fetched in entitiesData to the map\n const entitiesDataIdSet = new Set<UUID>();\n entitiesData.forEach((entity) => {\n if (uniqueEntityIdSet.has(entity.id)) {\n interactionEntityMap.set(entity.id, entity);\n entitiesDataIdSet.add(entity.id);\n }\n });\n\n // Get the remaining entities that weren't already loaded\n // Use Set difference for efficient filtering\n const remainingEntityIds = uniqueEntityIds.filter((id) => !entitiesDataIdSet.has(id));\n\n // Only fetch the entities we don't already have\n if (remainingEntityIds.length > 0) {\n const entities = await Promise.all(\n remainingEntityIds.map((entityId) => runtime.getEntityById(entityId))\n );\n\n entities.forEach((entity, index) => {\n if (entity) {\n interactionEntityMap.set(remainingEntityIds[index], entity);\n }\n });\n }\n }\n\n // Format recent message interactions\n const getRecentMessageInteractions = async (\n recentInteractionsData: Memory[]\n ): Promise<string> => {\n // Format messages using the pre-fetched entities\n const formattedInteractions = recentInteractionsData.map((message) => {\n const isSelf = message.entityId === runtime.agentId;\n let sender: string;\n\n if (isSelf) {\n sender = runtime.character.name;\n } else {\n sender =\n (interactionEntityMap.get(message.entityId)?.metadata?.userName as string) ||\n 'unknown';\n }\n\n return `${sender}: ${message.content.text}`;\n });\n\n return formattedInteractions.join('\\n');\n };\n\n // Format recent post interactions\n const getRecentPostInteractions = async (\n recentInteractionsData: Memory[],\n entities: Entity[]\n ): Promise<string> => {\n // Combine pre-loaded entities with any other entities\n const combinedEntities = [...entities];\n\n // Add entities from interactionEntityMap that aren't already in entities\n const actorIds = new Set(entities.map((entity) => entity.id));\n for (const [id, entity] of interactionEntityMap.entries()) {\n if (!actorIds.has(id)) {\n combinedEntities.push(entity);\n }\n }\n\n const formattedInteractions = formatPosts({\n messages: recentInteractionsData,\n entities: combinedEntities,\n conversationHeader: true,\n });\n\n return formattedInteractions;\n };\n\n // Process both types of interactions in parallel\n const [recentMessageInteractions, recentPostInteractions] = await Promise.all([\n getRecentMessageInteractions(recentInteractionsData),\n getRecentPostInteractions(recentInteractionsData, entitiesData),\n ]);\n\n const data = {\n recentMessages: dialogueMessages,\n recentInteractions: recentInteractionsData,\n actionResults: actionResultMessages,\n };\n\n const values = {\n recentPosts,\n recentMessages,\n recentMessageInteractions,\n recentPostInteractions,\n recentInteractions: isPostFormat ? recentPostInteractions : recentMessageInteractions,\n recentActionResults: actionResultsText,\n recentMessage,\n };\n\n // Combine all text sections\n const text = [\n isPostFormat ? recentPosts : recentMessages,\n actionResultsText, // Include action results in the text output\n // Only add received message and focus headers if there are messages or a current message to process\n recentMessages || recentPosts || message.content.text ? receivedMessageHeader : '',\n recentMessages || recentPosts || message.content.text ? focusHeader : '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n return {\n data,\n values,\n text,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:recent_messages',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in recentMessagesProvider'\n );\n // Return a default state in case of error, similar to the empty message list\n return {\n data: {\n recentMessages: [],\n recentInteractions: [],\n actionResults: [],\n },\n values: {\n recentPosts: '',\n recentMessages: '',\n recentMessageInteractions: '',\n recentPostInteractions: '',\n recentInteractions: '',\n recentActionResults: '',\n },\n text: 'Error retrieving recent messages.', // Or 'No recent messages available' as the test expects\n };\n }\n },\n};\n",
38
- "import type { Entity, IAgentRuntime, Memory, Provider, Relationship, UUID } from '@elizaos/core';\n/**\n * Formats the provided relationships based on interaction strength and returns a string.\n * @param {IAgentRuntime} runtime - The runtime object to interact with the agent.\n * @param {Relationship[]} relationships - The relationships to format.\n * @returns {string} The formatted relationships as a string.\n */\n/**\n * Asynchronously formats relationships based on their interaction strength.\n *\n * @param {IAgentRuntime} runtime The runtime instance.\n * @param {Relationship[]} relationships The relationships to be formatted.\n * @returns {Promise<string>} A formatted string of the relationships.\n */\nasync function formatRelationships(runtime: IAgentRuntime, relationships: Relationship[]) {\n // Sort relationships by interaction strength (descending)\n const sortedRelationships = relationships\n .filter((rel) => rel.metadata?.interactions)\n .sort(\n (a, b) =>\n ((b.metadata?.interactions as number | undefined) || 0) -\n ((a.metadata?.interactions as number | undefined) || 0)\n )\n .slice(0, 30); // Get top 30\n\n if (sortedRelationships.length === 0) {\n return '';\n }\n\n // Deduplicate target entity IDs to avoid redundant fetches\n const uniqueEntityIds = Array.from(\n new Set(sortedRelationships.map((rel) => rel.targetEntityId as UUID))\n );\n\n // Fetch all required entities in a single batch operation\n const entities = await Promise.all(uniqueEntityIds.map((id) => runtime.getEntityById(id)));\n\n // Create a lookup map for efficient access\n const entityMap = new Map<string, Entity | null>();\n entities.forEach((entity, index) => {\n if (entity) {\n entityMap.set(uniqueEntityIds[index], entity);\n }\n });\n\n const formatMetadata = (metadata: any) => {\n return JSON.stringify(\n Object.entries(metadata)\n .map(\n ([key, value]) => `${key}: ${typeof value === 'object' ? JSON.stringify(value) : value}`\n )\n .join('\\n')\n );\n };\n\n // Format relationships using the entity map\n const formattedRelationships = sortedRelationships\n .map((rel) => {\n const targetEntityId = rel.targetEntityId as UUID;\n const entity = entityMap.get(targetEntityId);\n\n if (!entity) {\n return null;\n }\n\n const names = entity.names.join(' aka ');\n return `${names}\\n${\n rel.tags ? rel.tags.join(', ') : ''\n }\\n${formatMetadata(entity.metadata)}\\n`;\n })\n .filter(Boolean);\n\n return formattedRelationships.join('\\n');\n}\n\n/**\n * Provider for fetching relationships data.\n *\n * @type {Provider}\n * @property {string} name - The name of the provider (\"RELATIONSHIPS\").\n * @property {string} description - Description of the provider.\n * @property {Function} get - Asynchronous function to fetch relationships data.\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @param {Memory} message - The message object containing entity ID.\n * @returns {Promise<Object>} Object containing relationships data or error message.\n */\nconst relationshipsProvider: Provider = {\n name: 'RELATIONSHIPS',\n description:\n 'Relationships between {{agentName}} and other people, or between other people that {{agentName}} has observed interacting with',\n dynamic: true,\n get: async (runtime: IAgentRuntime, message: Memory) => {\n // Get all relationships for the current user\n const relationships = await runtime.getRelationships({\n entityId: message.entityId,\n });\n\n if (!relationships || relationships.length === 0) {\n return {\n data: {\n relationships: [],\n },\n values: {\n relationships: 'No relationships found.',\n },\n text: 'No relationships found.',\n };\n }\n\n const formattedRelationships = await formatRelationships(runtime, relationships);\n\n if (!formattedRelationships) {\n return {\n data: {\n relationships: [],\n },\n values: {\n relationships: 'No relationships found.',\n },\n text: 'No relationships found.',\n };\n }\n return {\n data: {\n relationships: formattedRelationships,\n },\n values: {\n relationships: formattedRelationships,\n },\n text: `# ${runtime.character.name} has observed ${message.content.senderName || message.content.name} interacting with these people:\\n${formattedRelationships}`,\n };\n },\n};\n\nexport { relationshipsProvider };\n",
39
- "import {\n ChannelType,\n createUniqueUuid,\n logger,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type ProviderResult,\n type State,\n type UUID,\n} from '@elizaos/core';\n\n/**\n * Role provider that retrieves roles in the server based on the provided runtime, message, and state.\n * * @type { Provider }\n * @property { string } name - The name of the role provider.\n * @property { string } description - A brief description of the role provider.\n * @property { Function } get - Asynchronous function that retrieves and processes roles in the server.\n * @param { IAgentRuntime } runtime - The agent runtime object.\n * @param { Memory } message - The message memory object.\n * @param { State } state - The state object.\n * @returns {Promise<ProviderResult>} The result containing roles data, values, and text.\n */\n/**\n * A provider for retrieving and formatting the role hierarchy in a server.\n * @type {Provider}\n */\nexport const roleProvider: Provider = {\n name: 'ROLES',\n description: 'Roles in the server, default are OWNER, ADMIN and MEMBER (as well as NONE)',\n get: async (runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> => {\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n if (!room) {\n throw new Error('No room found');\n }\n\n if (room.type !== ChannelType.GROUP) {\n return {\n data: {\n roles: [],\n },\n values: {\n roles:\n 'No access to role information in DMs, the role provider is only available in group scenarios.',\n },\n text: 'No access to role information in DMs, the role provider is only available in group scenarios.',\n };\n }\n\n const serverId = room.messageServerId;\n\n if (!serverId) {\n throw new Error('No server ID found');\n }\n\n logger.info(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, serverId },\n 'Using server ID'\n );\n\n // Get world data instead of using cache\n const worldId = createUniqueUuid(runtime, serverId);\n const world = await runtime.getWorld(worldId);\n\n if (!world || !world.metadata?.ownership?.ownerId) {\n logger.info(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, serverId },\n 'No ownership data found for server, initializing empty role hierarchy'\n );\n return {\n data: {\n roles: [],\n },\n values: {\n roles: 'No role information available for this server.',\n },\n text: 'No role information available for this server.',\n };\n }\n // Get roles from world metadata\n const roles = world.metadata.roles || {};\n\n if (Object.keys(roles).length === 0) {\n logger.info(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, serverId },\n 'No roles found for server'\n );\n return {\n data: {\n roles: [],\n },\n values: {\n roles: 'No role information available for this server.',\n },\n text: 'No role information available for this server.',\n };\n }\n\n logger.info(\n {\n src: 'plugin:bootstrap:provider:roles',\n agentId: runtime.agentId,\n roleCount: Object.keys(roles).length,\n },\n 'Found roles'\n );\n\n // Group users by role\n const owners: { name: string; username: string; names: string[] }[] = [];\n const admins: { name: string; username: string; names: string[] }[] = [];\n const members: { name: string; username: string; names: string[] }[] = [];\n\n // Process roles\n for (const entityId of Object.keys(roles) as UUID[]) {\n const userRole = roles[entityId];\n\n // get the user from the database\n const user = await runtime.getEntityById(entityId);\n\n const name = user?.metadata?.name as string;\n const username = user?.metadata?.username as string;\n const names = user?.names as string[];\n\n // Skip duplicates (we store both UUID and original ID)\n if (\n owners.some((owner) => owner.username === username) ||\n admins.some((admin) => admin.username === username) ||\n members.some((member) => member.username === username)\n ) {\n continue;\n }\n\n if (!name || !username || !names) {\n logger.warn(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, entityId },\n 'User has no name or username, skipping'\n );\n continue;\n }\n\n // Add to appropriate group\n switch (userRole) {\n case 'OWNER':\n owners.push({ name, username, names });\n break;\n case 'ADMIN':\n admins.push({ name, username, names });\n break;\n default:\n members.push({ name, username, names });\n break;\n }\n }\n\n // Format the response\n let response = '# Server Role Hierarchy\\n\\n';\n\n if (owners.length > 0) {\n response += '## Owners\\n';\n owners.forEach((owner) => {\n response += `${owner.name} (${owner.names.join(', ')})\\n`;\n });\n response += '\\n';\n }\n\n if (admins.length > 0) {\n response += '## Administrators\\n';\n admins.forEach((admin) => {\n response += `${admin.name} (${admin.names.join(', ')}) (${admin.username})\\n`;\n });\n response += '\\n';\n }\n\n if (members.length > 0) {\n response += '## Members\\n';\n members.forEach((member) => {\n response += `${member.name} (${member.names.join(', ')}) (${member.username})\\n`;\n });\n }\n\n if (owners.length === 0 && admins.length === 0 && members.length === 0) {\n return {\n data: {\n roles: [],\n },\n values: {\n roles: 'No role information available for this server.',\n },\n text: 'No role information available for this server.',\n };\n }\n\n return {\n data: {\n roles: response,\n },\n values: {\n roles: response,\n },\n text: response,\n };\n },\n};\n\nexport default roleProvider;\n",
40
- "// File: /swarm/shared/settings/provider.ts\n// Updated to use world metadata instead of cache\n\nimport {\n ChannelType,\n findWorldsForOwner,\n getWorldSettings,\n logger,\n World,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type ProviderResult,\n type Setting,\n type State,\n type WorldSettings,\n} from '@elizaos/core';\n\n/**\n * Formats a setting value for display, respecting privacy flags\n */\nconst formatSettingValue = (setting: Setting, isOnboarding: boolean): string => {\n if (setting.value === null) return 'Not set';\n if (setting.secret && !isOnboarding) return '****************';\n return String(setting.value);\n};\n\n/**\n * Generates a status message based on the current settings state\n */\nfunction generateStatusMessage(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n isOnboarding: boolean,\n state?: State\n): string {\n try {\n // Format settings for display\n const formattedSettings = Object.entries(worldSettings)\n .map(([key, setting]) => {\n if (typeof setting !== 'object' || !setting.name) return null;\n\n const description = setting.description || '';\n const usageDescription = setting.usageDescription || '';\n\n // Skip settings that should be hidden based on visibility function\n if (setting.visibleIf && !setting.visibleIf(worldSettings)) {\n return null;\n }\n\n return {\n key,\n name: setting.name,\n value: formatSettingValue(setting, isOnboarding),\n description,\n usageDescription,\n required: setting.required,\n configured: setting.value !== null,\n };\n })\n .filter(Boolean);\n\n // Count required settings that are not configured\n const requiredUnconfigured = formattedSettings.filter(\n (s) => s?.required && !s.configured\n ).length;\n\n // Generate appropriate message\n if (isOnboarding) {\n const settingsList = formattedSettings\n .map((s) => {\n const label = s?.required ? '(Required)' : '(Optional)';\n return `${s?.key}: ${s?.value} ${label}\\n(${s?.name}) ${s?.usageDescription}`;\n })\n .join('\\n\\n');\n\n const validKeys = `Valid setting keys: ${Object.keys(worldSettings).join(', ')}`;\n\n const commonInstructions = `Instructions for ${runtime.character.name}:\n - Only update settings if the user is clearly responding to a setting you are currently asking about.\n - If the user's reply clearly maps to a setting and a valid value, you **must** call the UPDATE_SETTINGS action with the correct key and value. Do not just respond with a message saying it's updated — it must be an action.\n - Never hallucinate settings or respond with values not listed above.\n - Do not call UPDATE_SETTINGS just because the user has started onboarding or you think a setting needs to be configured. Only update when the user clearly provides a specific value for a setting you are currently asking about.\n - Answer setting-related questions using only the name, description, and value from the list.`;\n\n if (requiredUnconfigured > 0) {\n return `# PRIORITY TASK: Onboarding with ${state?.senderName}\n\n ${runtime.character.name} needs to help the user configure ${requiredUnconfigured} required settings:\n \n ${settingsList}\n \n ${validKeys}\n \n ${commonInstructions}\n \n - Prioritize configuring required settings before optional ones.`;\n }\n\n return `All required settings have been configured. Here's the current configuration:\n \n ${settingsList}\n \n ${validKeys}\n \n ${commonInstructions}`;\n }\n\n // Non-onboarding context - list all public settings with values and descriptions\n return `## Current Configuration\\n\\n${\n requiredUnconfigured > 0\n ? `IMPORTANT!: ${requiredUnconfigured} required settings still need configuration. ${runtime.character.name} should get onboarded with the OWNER as soon as possible.\\n\\n`\n : 'All required settings are configured.\\n\\n'\n }${formattedSettings\n .map((s) => `### ${s?.name}\\n**Value:** ${s?.value}\\n**Description:** ${s?.description}`)\n .join('\\n\\n')}`;\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating status message'\n );\n return 'Error generating configuration status.';\n }\n}\n\n/**\n * Creates an settings provider with the given configuration\n * Updated to use world metadata instead of cache\n */\nexport const settingsProvider: Provider = {\n name: 'SETTINGS',\n description: 'Current settings for the server',\n get: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<ProviderResult> => {\n try {\n // Parallelize the initial database operations to improve performance\n // These operations can run simultaneously as they don't depend on each other\n const [room, userWorlds] = await Promise.all([\n runtime.getRoom(message.roomId),\n findWorldsForOwner(runtime, message.entityId),\n ]).catch((error) => {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error fetching initial data'\n );\n throw new Error('Failed to retrieve room or user world information');\n });\n\n if (!room) {\n logger.error(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId },\n 'No room found for settings provider'\n );\n return {\n data: {\n settings: [],\n },\n values: {\n settings: 'Error: Room not found',\n },\n text: 'Error: Room not found',\n };\n }\n\n if (!room.worldId) {\n logger.debug(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId },\n 'No world found for settings provider -- settings provider will be skipped'\n );\n return {\n data: {\n settings: [],\n },\n values: {\n settings: 'Room does not have a worldId -- settings provider will be skipped',\n },\n text: 'Room does not have a worldId -- settings provider will be skipped',\n };\n }\n\n const type = room.type;\n const isOnboarding = type === ChannelType.DM;\n\n let world: World | null | undefined = null;\n let serverId: string | undefined = undefined;\n let worldSettings: WorldSettings | null = null;\n\n if (isOnboarding) {\n // In onboarding mode, use the user's world directly\n // Look for worlds with settings metadata, or create one if none exists\n world = userWorlds?.find((world) => world.metadata?.settings !== undefined);\n\n if (!world && userWorlds && userWorlds.length > 0) {\n // If user has worlds but none have settings, use the first one and initialize settings\n world = userWorlds[0];\n if (!world.metadata) {\n world.metadata = {};\n }\n world.metadata.settings = {};\n await runtime.updateWorld(world);\n logger.info(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n worldId: world.id,\n },\n 'Initialized settings for user world'\n );\n }\n\n if (!world) {\n logger.error(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId },\n 'No world found for user during onboarding'\n );\n throw new Error('No server ownership found for onboarding');\n }\n\n serverId = world.messageServerId;\n\n // Fetch world settings based on the server ID\n if (serverId) {\n try {\n worldSettings = await getWorldSettings(runtime, serverId);\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n serverId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error fetching world settings'\n );\n throw new Error(`Failed to retrieve settings for server ${serverId}`);\n }\n }\n } else {\n // For non-onboarding, we need to get the world associated with the room\n try {\n world = await runtime.getWorld(room.worldId);\n\n if (!world) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n worldId: room.worldId,\n },\n 'No world found for room'\n );\n throw new Error(`No world found for room ${room.worldId}`);\n }\n\n serverId = world.messageServerId;\n\n // Once we have the serverId, get the settings\n if (serverId) {\n worldSettings = await getWorldSettings(runtime, serverId);\n } else {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n worldId: room.worldId,\n },\n 'No server ID found for world'\n );\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing world data'\n );\n throw new Error('Failed to process world information');\n }\n }\n\n // If no server found after recovery attempts\n if (!serverId) {\n logger.info(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'No server ownership found for user after recovery attempt'\n );\n return isOnboarding\n ? {\n data: {\n settings: [],\n },\n values: {\n settings:\n \"The user doesn't appear to have ownership of any servers. They should make sure they're using the correct account.\",\n },\n text: \"The user doesn't appear to have ownership of any servers. They should make sure they're using the correct account.\",\n }\n : {\n data: {\n settings: [],\n },\n values: {\n settings: 'Error: No configuration access',\n },\n text: 'Error: No configuration access',\n };\n }\n\n if (!worldSettings) {\n logger.info(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId, serverId },\n 'No settings state found for server'\n );\n return isOnboarding\n ? {\n data: {\n settings: [],\n },\n values: {\n settings:\n \"The user doesn't appear to have any settings configured for this server. They should configure some settings for this server.\",\n },\n text: \"The user doesn't appear to have any settings configured for this server. They should configure some settings for this server.\",\n }\n : {\n data: {\n settings: [],\n },\n values: {\n settings: 'Configuration has not been completed yet.',\n },\n text: 'Configuration has not been completed yet.',\n };\n }\n\n // Generate the status message based on the settings\n const output = generateStatusMessage(runtime, worldSettings, isOnboarding, state);\n\n return {\n data: {\n settings: worldSettings,\n },\n values: {\n settings: output,\n },\n text: output,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Critical error in settings provider'\n );\n return {\n data: {\n settings: [],\n },\n values: {\n settings: 'Error retrieving configuration information. Please try again later.',\n },\n text: 'Error retrieving configuration information. Please try again later.',\n };\n }\n },\n};\n",
37
+ "import {\n addHeader,\n ChannelType,\n CustomMetadata,\n formatMessages,\n formatPosts,\n getEntityDetails,\n type Entity,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type UUID,\n logger,\n} from '@elizaos/core';\n\n// Move getRecentInteractions outside the provider\n/**\n * Retrieves the recent interactions between two entities in a specific context.\n *\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @param {UUID} sourceEntityId - The UUID of the source entity.\n * @param {UUID} targetEntityId - The UUID of the target entity.\n * @param {UUID} excludeRoomId - The UUID of the room to exclude from the search.\n * @returns {Promise<Memory[]>} A promise that resolves to an array of Memory objects representing recent interactions.\n */\n/**\n * Retrieves the recent interactions between two entities in different rooms excluding a specific room.\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @param {UUID} sourceEntityId - The UUID of the source entity.\n * @param {UUID} targetEntityId - The UUID of the target entity.\n * @param {UUID} excludeRoomId - The UUID of the room to exclude from the search.\n * @returns {Promise<Memory[]>} An array of Memory objects representing recent interactions between the two entities.\n */\nconst getRecentInteractions = async (\n runtime: IAgentRuntime,\n sourceEntityId: UUID,\n targetEntityId: UUID,\n excludeRoomId: UUID\n): Promise<Memory[]> => {\n // Find all rooms where sourceEntityId and targetEntityId are participants\n const rooms = await runtime.getRoomsForParticipants([sourceEntityId, targetEntityId]);\n\n // Check the existing memories in the database\n return runtime.getMemoriesByRoomIds({\n tableName: 'messages',\n // filter out the current room id from rooms\n roomIds: rooms.filter((room) => room !== excludeRoomId),\n limit: 20,\n });\n};\n\n/**\n * A provider object that retrieves recent messages, interactions, and memories based on a given message.\n * @typedef {object} Provider\n * @property {string} name - The name of the provider (\"RECENT_MESSAGES\").\n * @property {string} description - A description of the provider's purpose (\"Recent messages, interactions and other memories\").\n * @property {number} position - The position of the provider (100).\n * @property {Function} get - Asynchronous function that retrieves recent messages, interactions, and memories.\n * @param {IAgentRuntime} runtime - The runtime context for the agent.\n * @param {Memory} message - The message to retrieve data from.\n * @returns {object} An object containing data, values, and text sections.\n */\nexport const recentMessagesProvider: Provider = {\n name: 'RECENT_MESSAGES',\n description: 'Recent messages, interactions and other memories',\n position: 100,\n get: async (runtime: IAgentRuntime, message: Memory) => {\n try {\n const { roomId } = message;\n const conversationLength = runtime.getConversationLength();\n\n // Parallelize initial data fetching operations including recentInteractions\n const [entitiesData, room, recentMessagesData, recentInteractionsData] = await Promise.all([\n getEntityDetails({ runtime, roomId }),\n runtime.getRoom(roomId),\n runtime.getMemories({\n tableName: 'messages',\n roomId,\n count: conversationLength,\n unique: false,\n }),\n message.entityId !== runtime.agentId\n ? getRecentInteractions(runtime, message.entityId, runtime.agentId, roomId)\n : Promise.resolve([]),\n ]);\n\n // Separate action results from regular messages\n const actionResultMessages = recentMessagesData.filter(\n (msg) => msg.content?.type === 'action_result' && msg.metadata?.type === 'action_result'\n );\n\n const dialogueMessages = recentMessagesData.filter(\n (msg) => !(msg.content?.type === 'action_result' && msg.metadata?.type === 'action_result')\n );\n\n // Default to message format if room is not found or type is undefined\n const isPostFormat = room?.type\n ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD\n : false;\n\n // Format recent messages and posts in parallel, using only dialogue messages\n const [formattedRecentMessages, formattedRecentPosts] = await Promise.all([\n formatMessages({\n messages: dialogueMessages,\n entities: entitiesData,\n }),\n formatPosts({\n messages: dialogueMessages,\n entities: entitiesData,\n conversationHeader: false,\n }),\n ]);\n\n // Format action results separately\n let actionResultsText = '';\n if (actionResultMessages.length > 0) {\n // Group by runId using Map\n const groupedByRun = new Map<string, Memory[]>();\n\n for (const mem of actionResultMessages) {\n const runId: string = String(mem.content?.runId || 'unknown');\n if (!groupedByRun.has(runId)) {\n groupedByRun.set(runId, []);\n }\n const memories = groupedByRun.get(runId);\n if (memories) {\n memories.push(mem);\n }\n }\n\n const formattedActionResults = Array.from(groupedByRun.entries())\n .slice(-3) // Show last 3 runs\n .map(([runId, memories]) => {\n const sortedMemories = memories.sort(\n (a: Memory, b: Memory) => (a.createdAt || 0) - (b.createdAt || 0)\n );\n\n const thought = sortedMemories[0]?.content?.planThought || '';\n const runText = sortedMemories\n .map((mem: Memory) => {\n const actionName = mem.content?.actionName || 'Unknown';\n const status = mem.content?.actionStatus || 'unknown';\n const planStep = mem.content?.planStep || '';\n const text = mem.content?.text || '';\n const error = mem.content?.error || '';\n\n let memText = ` - ${actionName} (${status})`;\n if (planStep) {\n memText += ` [${planStep}]`;\n }\n if (error) {\n memText += `: Error - ${error}`;\n } else if (text && text !== `Executed action: ${actionName}`) {\n memText += `: ${text}`;\n }\n\n return memText;\n })\n .join('\\n');\n\n return `**Action Run ${runId.slice(0, 8)}**${thought ? ` - \"${thought}\"` : ''}\\n${runText}`;\n })\n .join('\\n\\n');\n\n actionResultsText = formattedActionResults\n ? addHeader('# Recent Action Executions', formattedActionResults)\n : '';\n }\n\n // Create formatted text with headers\n const recentPosts =\n formattedRecentPosts && formattedRecentPosts.length > 0\n ? addHeader('# Posts in Thread', formattedRecentPosts)\n : '';\n\n const recentMessages =\n formattedRecentMessages && formattedRecentMessages.length > 0\n ? addHeader('# Conversation Messages', formattedRecentMessages)\n : '';\n\n // If there are no messages at all, and no current message to process, return a specific message.\n // The check for dialogueMessages.length === 0 ensures we only show this if there's truly nothing.\n if (\n !recentPosts &&\n !recentMessages &&\n dialogueMessages.length === 0 &&\n !message.content.text\n ) {\n return {\n data: {\n recentMessages: dialogueMessages,\n recentInteractions: [],\n actionResults: actionResultMessages,\n },\n values: {\n recentPosts: '',\n recentMessages: '',\n recentMessageInteractions: '',\n recentPostInteractions: '',\n recentInteractions: '',\n recentActionResults: actionResultsText,\n },\n text: 'No recent messages available',\n };\n }\n\n let recentMessage = 'No recent message available.';\n\n if (dialogueMessages.length > 0) {\n // Get the most recent dialogue message (create a copy to avoid mutating original array)\n const mostRecentMessage = [...dialogueMessages].sort(\n (a, b) => (b.createdAt || 0) - (a.createdAt || 0)\n )[0];\n\n // Format just this single message to get the internal thought\n const formattedSingleMessage = formatMessages({\n messages: [mostRecentMessage],\n entities: entitiesData,\n });\n\n if (formattedSingleMessage) {\n recentMessage = formattedSingleMessage;\n }\n }\n\n const metaData = message.metadata as CustomMetadata;\n const senderName =\n entitiesData.find((entity: Entity) => entity.id === message.entityId)?.names[0] ||\n metaData?.entityName ||\n 'Unknown User';\n const receivedMessageContent = message.content.text;\n\n const hasReceivedMessage = !!receivedMessageContent?.trim();\n\n const receivedMessageHeader = hasReceivedMessage\n ? addHeader('# Received Message', `${senderName}: ${receivedMessageContent}`)\n : '';\n\n const focusHeader = hasReceivedMessage\n ? addHeader(\n '# Focus your response',\n `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message. Do not repeat earlier replies unless the sender asks again.`\n )\n : '';\n\n // Preload all necessary entities for both types of interactions\n const interactionEntityMap = new Map<UUID, Entity>();\n\n // Only proceed if there are interactions to process\n if (recentInteractionsData.length > 0) {\n // Get unique entity IDs that aren't the runtime agent\n const uniqueEntityIds = [\n ...new Set(\n recentInteractionsData\n .map((message) => message.entityId)\n .filter((id) => id !== runtime.agentId)\n ),\n ];\n\n // Create a Set for faster lookup\n const uniqueEntityIdSet = new Set(uniqueEntityIds);\n\n // Add entities already fetched in entitiesData to the map\n const entitiesDataIdSet = new Set<UUID>();\n entitiesData.forEach((entity) => {\n if (uniqueEntityIdSet.has(entity.id)) {\n interactionEntityMap.set(entity.id, entity);\n entitiesDataIdSet.add(entity.id);\n }\n });\n\n // Get the remaining entities that weren't already loaded\n // Use Set difference for efficient filtering\n const remainingEntityIds = uniqueEntityIds.filter((id) => !entitiesDataIdSet.has(id));\n\n // Only fetch the entities we don't already have\n if (remainingEntityIds.length > 0) {\n const entities = await Promise.all(\n remainingEntityIds.map((entityId) => runtime.getEntityById(entityId))\n );\n\n entities.forEach((entity, index) => {\n if (entity) {\n interactionEntityMap.set(remainingEntityIds[index], entity);\n }\n });\n }\n }\n\n // Format recent message interactions\n const getRecentMessageInteractions = async (\n recentInteractionsData: Memory[]\n ): Promise<string> => {\n // Format messages using the pre-fetched entities\n const formattedInteractions = recentInteractionsData.map((message) => {\n const isSelf = message.entityId === runtime.agentId;\n let sender: string;\n\n if (isSelf) {\n sender = runtime.character.name;\n } else {\n sender =\n (interactionEntityMap.get(message.entityId)?.metadata?.userName as string) ||\n 'unknown';\n }\n\n return `${sender}: ${message.content.text}`;\n });\n\n return formattedInteractions.join('\\n');\n };\n\n // Format recent post interactions\n const getRecentPostInteractions = async (\n recentInteractionsData: Memory[],\n entities: Entity[]\n ): Promise<string> => {\n // Combine pre-loaded entities with any other entities\n const combinedEntities = [...entities];\n\n // Add entities from interactionEntityMap that aren't already in entities\n const actorIds = new Set(entities.map((entity) => entity.id));\n for (const [id, entity] of interactionEntityMap.entries()) {\n if (!actorIds.has(id)) {\n combinedEntities.push(entity);\n }\n }\n\n const formattedInteractions = formatPosts({\n messages: recentInteractionsData,\n entities: combinedEntities,\n conversationHeader: true,\n });\n\n return formattedInteractions;\n };\n\n // Process both types of interactions in parallel\n const [recentMessageInteractions, recentPostInteractions] = await Promise.all([\n getRecentMessageInteractions(recentInteractionsData),\n getRecentPostInteractions(recentInteractionsData, entitiesData),\n ]);\n\n const data = {\n recentMessages: dialogueMessages,\n recentInteractions: recentInteractionsData,\n actionResults: actionResultMessages,\n };\n\n const values = {\n recentPosts,\n recentMessages,\n recentMessageInteractions,\n recentPostInteractions,\n recentInteractions: isPostFormat ? recentPostInteractions : recentMessageInteractions,\n recentActionResults: actionResultsText,\n recentMessage,\n };\n\n // Combine all text sections\n const text = [\n isPostFormat ? recentPosts : recentMessages,\n actionResultsText, // Include action results in the text output\n // Only add received message and focus headers if there are messages or a current message to process\n recentMessages || recentPosts || message.content.text ? receivedMessageHeader : '',\n recentMessages || recentPosts || message.content.text ? focusHeader : '',\n ]\n .filter(Boolean)\n .join('\\n\\n');\n\n return {\n data,\n values,\n text,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:recent_messages',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in recentMessagesProvider'\n );\n // Return a default state in case of error, similar to the empty message list\n return {\n data: {\n recentMessages: [],\n recentInteractions: [],\n actionResults: [],\n },\n values: {\n recentPosts: '',\n recentMessages: '',\n recentMessageInteractions: '',\n recentPostInteractions: '',\n recentInteractions: '',\n recentActionResults: '',\n },\n text: 'Error retrieving recent messages.', // Or 'No recent messages available' as the test expects\n };\n }\n },\n};\n",
38
+ "import type { Entity, IAgentRuntime, Memory, Provider, Relationship, UUID } from '@elizaos/core';\n/**\n * Formats the provided relationships based on interaction strength and returns a string.\n * @param {IAgentRuntime} runtime - The runtime object to interact with the agent.\n * @param {Relationship[]} relationships - The relationships to format.\n * @returns {string} The formatted relationships as a string.\n */\n/**\n * Asynchronously formats relationships based on their interaction strength.\n *\n * @param {IAgentRuntime} runtime The runtime instance.\n * @param {Relationship[]} relationships The relationships to be formatted.\n * @returns {Promise<string>} A formatted string of the relationships.\n */\nasync function formatRelationships(runtime: IAgentRuntime, relationships: Relationship[]) {\n // Sort relationships by interaction strength (descending)\n const sortedRelationships = relationships\n .filter((rel) => rel.metadata?.interactions)\n .sort(\n (a, b) =>\n ((b.metadata?.interactions as number | undefined) || 0) -\n ((a.metadata?.interactions as number | undefined) || 0)\n )\n .slice(0, 30); // Get top 30\n\n if (sortedRelationships.length === 0) {\n return '';\n }\n\n // Deduplicate target entity IDs to avoid redundant fetches\n const uniqueEntityIds = Array.from(\n new Set(sortedRelationships.map((rel) => rel.targetEntityId as UUID))\n );\n\n // Fetch all required entities in a single batch operation\n const entities = await Promise.all(uniqueEntityIds.map((id) => runtime.getEntityById(id)));\n\n // Create a lookup map for efficient access\n const entityMap = new Map<string, Entity | null>();\n entities.forEach((entity, index) => {\n if (entity) {\n entityMap.set(uniqueEntityIds[index], entity);\n }\n });\n\n const formatMetadata = (metadata: Record<string, unknown>) => {\n return JSON.stringify(\n Object.entries(metadata)\n .map(\n ([key, value]) => `${key}: ${typeof value === 'object' ? JSON.stringify(value) : value}`\n )\n .join('\\n')\n );\n };\n\n // Format relationships using the entity map\n const formattedRelationships = sortedRelationships\n .map((rel) => {\n const targetEntityId = rel.targetEntityId as UUID;\n const entity = entityMap.get(targetEntityId);\n\n if (!entity) {\n return null;\n }\n\n const names = entity.names.join(' aka ');\n return `${names}\\n${\n rel.tags ? rel.tags.join(', ') : ''\n }\\n${formatMetadata(entity.metadata)}\\n`;\n })\n .filter(Boolean);\n\n return formattedRelationships.join('\\n');\n}\n\n/**\n * Provider for fetching relationships data.\n *\n * @type {Provider}\n * @property {string} name - The name of the provider (\"RELATIONSHIPS\").\n * @property {string} description - Description of the provider.\n * @property {Function} get - Asynchronous function to fetch relationships data.\n * @param {IAgentRuntime} runtime - The agent runtime object.\n * @param {Memory} message - The message object containing entity ID.\n * @returns {Promise<Object>} Object containing relationships data or error message.\n */\nconst relationshipsProvider: Provider = {\n name: 'RELATIONSHIPS',\n description:\n 'Relationships between {{agentName}} and other people, or between other people that {{agentName}} has observed interacting with',\n dynamic: true,\n get: async (runtime: IAgentRuntime, message: Memory) => {\n // Get all relationships for the current user\n const relationships = await runtime.getRelationships({\n entityId: message.entityId,\n });\n\n if (!relationships || relationships.length === 0) {\n return {\n data: {\n relationships: [],\n },\n values: {\n relationships: 'No relationships found.',\n },\n text: 'No relationships found.',\n };\n }\n\n const formattedRelationships = await formatRelationships(runtime, relationships);\n\n if (!formattedRelationships) {\n return {\n data: {\n relationships: [],\n },\n values: {\n relationships: 'No relationships found.',\n },\n text: 'No relationships found.',\n };\n }\n return {\n data: {\n relationships: formattedRelationships,\n },\n values: {\n relationships: formattedRelationships,\n },\n text: `# ${runtime.character.name} has observed ${message.content.senderName || message.content.name} interacting with these people:\\n${formattedRelationships}`,\n };\n },\n};\n\nexport { relationshipsProvider };\n",
39
+ "import {\n ChannelType,\n logger,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type ProviderResult,\n type State,\n type UUID,\n} from '@elizaos/core';\n\n/**\n * Role provider that retrieves roles in the server based on the provided runtime, message, and state.\n * * @type { Provider }\n * @property { string } name - The name of the role provider.\n * @property { string } description - A brief description of the role provider.\n * @property { Function } get - Asynchronous function that retrieves and processes roles in the server.\n * @param { IAgentRuntime } runtime - The agent runtime object.\n * @param { Memory } message - The message memory object.\n * @param { State } state - The state object.\n * @returns {Promise<ProviderResult>} The result containing roles data, values, and text.\n */\n/**\n * A provider for retrieving and formatting the role hierarchy in a server.\n * @type {Provider}\n */\nexport const roleProvider: Provider = {\n name: 'ROLES',\n description: 'Roles in the server, default are OWNER, ADMIN and MEMBER (as well as NONE)',\n get: async (runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> => {\n const room = state.data.room ?? (await runtime.getRoom(message.roomId));\n if (!room) {\n throw new Error('No room found');\n }\n\n if (room.type !== ChannelType.GROUP) {\n return {\n data: {\n roles: [],\n },\n values: {\n roles:\n 'No access to role information in DMs, the role provider is only available in group scenarios.',\n },\n text: 'No access to role information in DMs, the role provider is only available in group scenarios.',\n };\n }\n\n const worldId = room.worldId;\n\n if (!worldId) {\n throw new Error('No world ID found for room');\n }\n\n logger.info(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, worldId },\n 'Using world ID'\n );\n\n // Get world data\n const world = await runtime.getWorld(worldId);\n\n if (!world || !world.metadata?.ownership?.ownerId) {\n logger.info(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, worldId },\n 'No ownership data found for world, initializing empty role hierarchy'\n );\n return {\n data: {\n roles: [],\n },\n values: {\n roles: 'No role information available for this server.',\n },\n text: 'No role information available for this server.',\n };\n }\n // Get roles from world metadata\n const roles = world.metadata.roles || {};\n\n if (Object.keys(roles).length === 0) {\n logger.info(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, worldId },\n 'No roles found for world'\n );\n return {\n data: {\n roles: [],\n },\n values: {\n roles: 'No role information available for this server.',\n },\n text: 'No role information available for this server.',\n };\n }\n\n logger.info(\n {\n src: 'plugin:bootstrap:provider:roles',\n agentId: runtime.agentId,\n roleCount: Object.keys(roles).length,\n },\n 'Found roles'\n );\n\n // Group users by role\n const owners: { name: string; username: string; names: string[] }[] = [];\n const admins: { name: string; username: string; names: string[] }[] = [];\n const members: { name: string; username: string; names: string[] }[] = [];\n\n // Process roles\n for (const entityId of Object.keys(roles) as UUID[]) {\n const userRole = roles[entityId];\n\n // get the user from the database\n const user = await runtime.getEntityById(entityId);\n\n const name = user?.metadata?.name as string;\n const username = user?.metadata?.username as string;\n const names = user?.names as string[];\n\n // Skip duplicates (we store both UUID and original ID)\n if (\n owners.some((owner) => owner.username === username) ||\n admins.some((admin) => admin.username === username) ||\n members.some((member) => member.username === username)\n ) {\n continue;\n }\n\n if (!name || !username || !names) {\n logger.warn(\n { src: 'plugin:bootstrap:provider:roles', agentId: runtime.agentId, entityId },\n 'User has no name or username, skipping'\n );\n continue;\n }\n\n // Add to appropriate group\n switch (userRole) {\n case 'OWNER':\n owners.push({ name, username, names });\n break;\n case 'ADMIN':\n admins.push({ name, username, names });\n break;\n default:\n members.push({ name, username, names });\n break;\n }\n }\n\n // Format the response\n let response = '# Server Role Hierarchy\\n\\n';\n\n if (owners.length > 0) {\n response += '## Owners\\n';\n owners.forEach((owner) => {\n response += `${owner.name} (${owner.names.join(', ')})\\n`;\n });\n response += '\\n';\n }\n\n if (admins.length > 0) {\n response += '## Administrators\\n';\n admins.forEach((admin) => {\n response += `${admin.name} (${admin.names.join(', ')}) (${admin.username})\\n`;\n });\n response += '\\n';\n }\n\n if (members.length > 0) {\n response += '## Members\\n';\n members.forEach((member) => {\n response += `${member.name} (${member.names.join(', ')}) (${member.username})\\n`;\n });\n }\n\n if (owners.length === 0 && admins.length === 0 && members.length === 0) {\n return {\n data: {\n roles: [],\n },\n values: {\n roles: 'No role information available for this server.',\n },\n text: 'No role information available for this server.',\n };\n }\n\n return {\n data: {\n roles: response,\n },\n values: {\n roles: response,\n },\n text: response,\n };\n },\n};\n\nexport default roleProvider;\n",
40
+ "// File: /swarm/shared/settings/provider.ts\n// Updated to use world metadata instead of cache\n\nimport {\n ChannelType,\n findWorldsForOwner,\n getSalt,\n logger,\n unsaltWorldSettings,\n World,\n type IAgentRuntime,\n type Memory,\n type Provider,\n type ProviderResult,\n type Setting,\n type State,\n type WorldSettings,\n} from '@elizaos/core';\n\n/**\n * Formats a setting value for display, respecting privacy flags\n */\nconst formatSettingValue = (setting: Setting, isOnboarding: boolean): string => {\n if (setting.value === null) {\n return 'Not set';\n }\n if (setting.secret && !isOnboarding) {\n return '****************';\n }\n return String(setting.value);\n};\n\n/**\n * Generates a status message based on the current settings state\n */\nfunction generateStatusMessage(\n runtime: IAgentRuntime,\n worldSettings: WorldSettings,\n isOnboarding: boolean,\n state?: State\n): string {\n try {\n // Format settings for display\n const formattedSettings = Object.entries(worldSettings)\n .map(([key, setting]) => {\n if (typeof setting !== 'object' || !setting.name) {\n return null;\n }\n\n const description = setting.description || '';\n const usageDescription = setting.usageDescription || '';\n\n // Skip settings that should be hidden based on visibility function\n if (setting.visibleIf && !setting.visibleIf(worldSettings)) {\n return null;\n }\n\n return {\n key,\n name: setting.name,\n value: formatSettingValue(setting, isOnboarding),\n description,\n usageDescription,\n required: setting.required,\n configured: setting.value !== null,\n };\n })\n .filter(Boolean);\n\n // Count required settings that are not configured\n const requiredUnconfigured = formattedSettings.filter(\n (s) => s?.required && !s.configured\n ).length;\n\n // Generate appropriate message\n if (isOnboarding) {\n const settingsList = formattedSettings\n .map((s) => {\n const label = s?.required ? '(Required)' : '(Optional)';\n return `${s?.key}: ${s?.value} ${label}\\n(${s?.name}) ${s?.usageDescription}`;\n })\n .join('\\n\\n');\n\n const validKeys = `Valid setting keys: ${Object.keys(worldSettings).join(', ')}`;\n\n const commonInstructions = `Instructions for ${runtime.character.name}:\n - Only update settings if the user is clearly responding to a setting you are currently asking about.\n - If the user's reply clearly maps to a setting and a valid value, you **must** call the UPDATE_SETTINGS action with the correct key and value. Do not just respond with a message saying it's updated — it must be an action.\n - Never hallucinate settings or respond with values not listed above.\n - Do not call UPDATE_SETTINGS just because the user has started onboarding or you think a setting needs to be configured. Only update when the user clearly provides a specific value for a setting you are currently asking about.\n - Answer setting-related questions using only the name, description, and value from the list.`;\n\n if (requiredUnconfigured > 0) {\n return `# PRIORITY TASK: Onboarding with ${state?.senderName}\n\n ${runtime.character.name} needs to help the user configure ${requiredUnconfigured} required settings:\n \n ${settingsList}\n \n ${validKeys}\n \n ${commonInstructions}\n \n - Prioritize configuring required settings before optional ones.`;\n }\n\n return `All required settings have been configured. Here's the current configuration:\n \n ${settingsList}\n \n ${validKeys}\n \n ${commonInstructions}`;\n }\n\n // Non-onboarding context - list all public settings with values and descriptions\n return `## Current Configuration\\n\\n${\n requiredUnconfigured > 0\n ? `IMPORTANT!: ${requiredUnconfigured} required settings still need configuration. ${runtime.character.name} should get onboarded with the OWNER as soon as possible.\\n\\n`\n : 'All required settings are configured.\\n\\n'\n }${formattedSettings\n .map((s) => `### ${s?.name}\\n**Value:** ${s?.value}\\n**Description:** ${s?.description}`)\n .join('\\n\\n')}`;\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error generating status message'\n );\n return 'Error generating configuration status.';\n }\n}\n\n/**\n * Creates an settings provider with the given configuration\n * Updated to use world metadata instead of cache\n */\nexport const settingsProvider: Provider = {\n name: 'SETTINGS',\n description: 'Current settings for the server',\n get: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<ProviderResult> => {\n try {\n // Parallelize the initial database operations to improve performance\n // These operations can run simultaneously as they don't depend on each other\n const [room, userWorlds] = await Promise.all([\n runtime.getRoom(message.roomId),\n findWorldsForOwner(runtime, message.entityId),\n ]).catch((error) => {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error fetching initial data'\n );\n throw new Error('Failed to retrieve room or user world information');\n });\n\n if (!room) {\n logger.error(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId },\n 'No room found for settings provider'\n );\n return {\n data: {\n settings: [],\n },\n values: {\n settings: 'Error: Room not found',\n },\n text: 'Error: Room not found',\n };\n }\n\n if (!room.worldId) {\n logger.debug(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId },\n 'No world found for settings provider -- settings provider will be skipped'\n );\n return {\n data: {\n settings: [],\n },\n values: {\n settings: 'Room does not have a worldId -- settings provider will be skipped',\n },\n text: 'Room does not have a worldId -- settings provider will be skipped',\n };\n }\n\n const type = room.type;\n const isOnboarding = type === ChannelType.DM;\n\n let world: World | null | undefined = null;\n let serverId: string | undefined = undefined;\n let worldSettings: WorldSettings | null = null;\n\n if (isOnboarding) {\n // In onboarding mode, use the user's world directly\n // Look for worlds with settings metadata, or create one if none exists\n world = userWorlds?.find((world) => world.metadata?.settings !== undefined);\n\n if (!world && userWorlds && userWorlds.length > 0) {\n // If user has worlds but none have settings, use the first one and initialize settings\n world = userWorlds[0];\n if (!world.metadata) {\n world.metadata = {};\n }\n world.metadata.settings = {};\n await runtime.updateWorld(world);\n logger.info(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n worldId: world.id,\n },\n 'Initialized settings for user world'\n );\n }\n\n if (!world) {\n logger.error(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId },\n 'No world found for user during onboarding'\n );\n throw new Error('No server ownership found for onboarding');\n }\n\n serverId = world.messageServerId;\n\n // Get world settings directly from the world object we already have\n // Must decrypt secret values using unsaltWorldSettings (settings are stored encrypted)\n if (world.metadata?.settings) {\n const salt = getSalt();\n worldSettings = unsaltWorldSettings(world.metadata.settings as WorldSettings, salt);\n }\n } else {\n // For non-onboarding, we need to get the world associated with the room\n try {\n world = await runtime.getWorld(room.worldId);\n\n if (!world) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n worldId: room.worldId,\n },\n 'No world found for room'\n );\n throw new Error(`No world found for room ${room.worldId}`);\n }\n\n serverId = world.messageServerId;\n\n // Get world settings directly from the world object we already have\n // Must decrypt secret values using unsaltWorldSettings (settings are stored encrypted)\n if (world.metadata?.settings) {\n const salt = getSalt();\n worldSettings = unsaltWorldSettings(world.metadata.settings as WorldSettings, salt);\n } else if (!serverId) {\n logger.debug(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n worldId: room.worldId,\n },\n 'No server ID or settings found for world'\n );\n }\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing world data'\n );\n throw new Error('Failed to process world information');\n }\n }\n\n // If no server found after recovery attempts\n if (!serverId) {\n logger.info(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n entityId: message.entityId,\n },\n 'No server ownership found for user after recovery attempt'\n );\n return isOnboarding\n ? {\n data: {\n settings: [],\n },\n values: {\n settings:\n \"The user doesn't appear to have ownership of any servers. They should make sure they're using the correct account.\",\n },\n text: \"The user doesn't appear to have ownership of any servers. They should make sure they're using the correct account.\",\n }\n : {\n data: {\n settings: [],\n },\n values: {\n settings: 'Error: No configuration access',\n },\n text: 'Error: No configuration access',\n };\n }\n\n if (!worldSettings) {\n logger.info(\n { src: 'plugin:bootstrap:provider:settings', agentId: runtime.agentId, serverId },\n 'No settings state found for server'\n );\n return isOnboarding\n ? {\n data: {\n settings: [],\n },\n values: {\n settings:\n \"The user doesn't appear to have any settings configured for this server. They should configure some settings for this server.\",\n },\n text: \"The user doesn't appear to have any settings configured for this server. They should configure some settings for this server.\",\n }\n : {\n data: {\n settings: [],\n },\n values: {\n settings: 'Configuration has not been completed yet.',\n },\n text: 'Configuration has not been completed yet.',\n };\n }\n\n // Generate the status message based on the settings\n const output = generateStatusMessage(runtime, worldSettings, isOnboarding, state);\n\n return {\n data: {\n settings: worldSettings,\n },\n values: {\n settings: output,\n },\n text: output,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:settings',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Critical error in settings provider'\n );\n return {\n data: {\n settings: [],\n },\n values: {\n settings: 'Error retrieving configuration information. Please try again later.',\n },\n text: 'Error retrieving configuration information. Please try again later.',\n };\n }\n },\n};\n",
41
41
  "import type { IAgentRuntime, Memory, Provider } from '@elizaos/core';\n\n/**\n * Time provider function that retrieves the current date and time in UTC\n * for use in time-based operations or responses.\n *\n * @param _runtime - The runtime environment of the bot agent.\n * @param _message - The memory object containing message data.\n * @returns An object containing the current date and time data, human-readable date and time string,\n * and a text response with the current date and time information.\n */\n/**\n * Represents a time provider for retrieving current date and time information.\n * @type {Provider}\n */\nexport const timeProvider: Provider = {\n name: 'TIME',\n get: async (_runtime: IAgentRuntime, _message: Memory) => {\n const currentDate = new Date();\n\n // Get UTC time since bots will be communicating with users around the global\n const options = {\n timeZone: 'UTC',\n dateStyle: 'full' as const,\n timeStyle: 'long' as const,\n };\n const humanReadable = new Intl.DateTimeFormat('en-US', options).format(currentDate);\n return {\n data: {\n time: currentDate,\n },\n values: {\n time: humanReadable,\n },\n text: `The current date and time is ${humanReadable}. Please use this as your reference for any time-based operations or responses.`,\n };\n },\n};\n",
42
42
  "import {\n type IAgentRuntime,\n type Memory,\n type Provider,\n logger,\n addHeader,\n ChannelType,\n} from '@elizaos/core';\n\n/**\n * Provider that exposes relevant world/environment information to agents.\n * Includes details like channel list, world name, and other world metadata.\n */\nexport const worldProvider: Provider = {\n name: 'WORLD',\n description: 'World and environment information',\n dynamic: true,\n\n get: async (runtime: IAgentRuntime, message: Memory) => {\n try {\n logger.debug(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n roomId: message.roomId,\n },\n 'World provider activated'\n );\n\n // Get the current room from the message\n const currentRoom = await runtime.getRoom(message.roomId);\n\n if (!currentRoom) {\n logger.warn(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n roomId: message.roomId,\n },\n 'Room not found'\n );\n return {\n data: {\n world: {\n info: 'Unable to retrieve world information - room not found',\n },\n },\n text: 'Unable to retrieve world information - room not found',\n };\n }\n\n logger.debug(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n roomName: currentRoom.name,\n roomType: currentRoom.type,\n },\n 'Found room'\n );\n\n // Get the world for the current room\n const worldId = currentRoom.worldId;\n\n if (!worldId) {\n logger.warn(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n roomId: message.roomId,\n },\n 'World ID not found'\n );\n return {\n data: {\n world: {\n info: 'Unable to retrieve world information - world ID not found',\n },\n },\n text: 'Unable to retrieve world information - world ID not found',\n };\n }\n\n const world = await runtime.getWorld(worldId);\n\n if (!world) {\n logger.warn(\n { src: 'plugin:bootstrap:provider:world', agentId: runtime.agentId, worldId },\n 'World not found'\n );\n return {\n data: {\n world: {\n info: 'Unable to retrieve world information - world not found',\n },\n },\n text: 'Unable to retrieve world information - world not found',\n };\n }\n\n logger.debug(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n worldName: world.name,\n worldId: world.id,\n },\n 'Found world'\n );\n\n // Get all rooms in the current world\n const worldRooms = await runtime.getRooms(worldId);\n logger.debug(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n roomCount: worldRooms.length,\n worldName: world.name,\n },\n 'Found rooms in world'\n );\n\n // Get participants for the current room\n const participants = await runtime.getParticipantsForRoom(message.roomId);\n logger.debug(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n participantCount: participants.length,\n roomName: currentRoom.name,\n },\n 'Found participants in room'\n );\n\n // Format rooms by type\n type RoomInfo = {\n id: string;\n name: string;\n isCurrentChannel: boolean;\n type?: string;\n };\n\n const channelsByType: Record<string, RoomInfo[]> = {\n text: [],\n voice: [],\n dm: [],\n feed: [],\n thread: [],\n other: [],\n };\n\n // Categorize rooms by type\n for (const room of worldRooms) {\n if (!room?.id || !room.name) {\n logger.warn(\n { src: 'plugin:bootstrap:provider:world', agentId: runtime.agentId, roomId: room?.id },\n 'Room ID or name is missing'\n );\n continue; // Skip if room is null or undefined\n }\n const roomInfo: RoomInfo = {\n id: room.id,\n name: room.name,\n isCurrentChannel: room.id === message.roomId,\n };\n\n // Group channels by their purpose\n if (\n room.type === ChannelType.GROUP ||\n room.type === ChannelType.WORLD ||\n room.type === ChannelType.FORUM\n ) {\n channelsByType.text.push(roomInfo);\n } else if (room.type === ChannelType.VOICE_GROUP || room.type === ChannelType.VOICE_DM) {\n channelsByType.voice.push(roomInfo);\n } else if (room.type === ChannelType.DM || room.type === ChannelType.SELF) {\n channelsByType.dm.push(roomInfo);\n } else if (room.type === ChannelType.FEED) {\n channelsByType.feed.push(roomInfo);\n } else if (room.type === ChannelType.THREAD) {\n channelsByType.thread.push(roomInfo);\n } else {\n channelsByType.other.push({\n ...roomInfo,\n type: room.type,\n });\n }\n }\n\n // Create formatted text for display\n const worldInfoText = [\n `# World: ${world.name}`,\n `Current Channel: ${currentRoom.name} (${currentRoom.type})`,\n `Total Channels: ${worldRooms.length}`,\n `Participants in current channel: ${participants.length}`,\n '',\n `Text channels: ${channelsByType.text.length}`,\n `Voice channels: ${channelsByType.voice.length}`,\n `DM channels: ${channelsByType.dm.length}`,\n `Feed channels: ${channelsByType.feed.length}`,\n `Thread channels: ${channelsByType.thread.length}`,\n `Other channels: ${channelsByType.other.length}`,\n ].join('\\n');\n\n // Build the world information object with formatted data\n const data = {\n world: {\n id: world.id,\n name: world.name,\n serverId: world.messageServerId,\n metadata: world.metadata || {},\n currentRoom: {\n id: currentRoom.id,\n name: currentRoom.name,\n type: currentRoom.type,\n channelId: currentRoom.channelId,\n participantCount: participants.length,\n },\n channels: channelsByType,\n channelStats: {\n total: worldRooms.length,\n text: channelsByType.text.length,\n voice: channelsByType.voice.length,\n dm: channelsByType.dm.length,\n feed: channelsByType.feed.length,\n thread: channelsByType.thread.length,\n other: channelsByType.other.length,\n },\n },\n };\n\n const values = {\n worldName: world.name,\n currentChannelName: currentRoom.name,\n worldInfo: worldInfoText,\n };\n\n // Use addHeader like in entitiesProvider\n const formattedText = addHeader('# World Information', worldInfoText);\n\n logger.debug(\n { src: 'plugin:bootstrap:provider:world', agentId: runtime.agentId },\n 'World provider completed successfully'\n );\n\n return {\n data,\n values,\n text: formattedText,\n };\n } catch (error) {\n logger.error(\n {\n src: 'plugin:bootstrap:provider:world',\n agentId: runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in world provider'\n );\n return {\n data: {\n world: {\n info: 'Error retrieving world information',\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n },\n text: 'Error retrieving world information',\n };\n }\n },\n};\n\nexport default worldProvider;\n",
43
- "// registered to runtime through plugin\n\nimport {\n Service,\n ServiceType,\n type IAgentRuntime,\n type Memory,\n type State,\n type Task,\n} from '@elizaos/core';\n\n/**\n * TaskService class representing a service that schedules and executes tasks.\n * @extends Service\n * @property {NodeJS.Timeout|null} timer - Timer for executing tasks\n * @property {number} TICK_INTERVAL - Interval in milliseconds to check for tasks\n * @property {ServiceTypeName} serviceType - Service type of TASK\n * @property {string} capabilityDescription - Description of the service's capability\n * @static\n * @method start - Static method to start the TaskService\n * @method createTestTasks - Method to create test tasks\n * @method startTimer - Private method to start the timer for checking tasks\n * @method validateTasks - Private method to validate tasks\n * @method checkTasks - Private method to check tasks and execute them\n * @method executeTask - Private method to execute a task\n * @static\n * @method stop - Static method to stop the TaskService\n * @method stop - Method to stop the TaskService\n */\n/**\n * Start the TaskService with the given runtime.\n * @param {IAgentRuntime} runtime - The runtime for the TaskService.\n */\nexport class TaskService extends Service {\n private timer: NodeJS.Timeout | null = null;\n private readonly TICK_INTERVAL = 1000; // Check every second\n static serviceType = ServiceType.TASK;\n capabilityDescription = 'The agent is able to schedule and execute tasks';\n\n /**\n * Start the TaskService with the given runtime.\n * @param {IAgentRuntime} runtime - The runtime for the TaskService.\n * @returns {Promise<Service>} A promise that resolves with the TaskService instance.\n */\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new TaskService(runtime);\n await service.startTimer();\n // await service.createTestTasks();\n return service;\n }\n\n /**\n * Asynchronously creates test tasks by registering task workers for repeating and one-time tasks,\n * validates the tasks, executes the tasks, and creates the tasks if they do not already exist.\n */\n async createTestTasks() {\n // Register task worker for repeating task\n this.runtime.registerTaskWorker({\n name: 'REPEATING_TEST_TASK',\n validate: async (_runtime, _message, _state) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Validating repeating test task'\n );\n return true;\n },\n execute: async (_runtime, _options) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Executing repeating test task'\n );\n },\n });\n\n // Register task worker for one-time task\n this.runtime.registerTaskWorker({\n name: 'ONETIME_TEST_TASK',\n validate: async (_runtime, _message, _state) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Validating one-time test task'\n );\n return true;\n },\n execute: async (_runtime, _options) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Executing one-time test task'\n );\n },\n });\n\n // check if the task exists\n const tasks = await this.runtime.getTasksByName('REPEATING_TEST_TASK');\n\n if (tasks.length === 0) {\n // Create repeating task\n await this.runtime.createTask({\n name: 'REPEATING_TEST_TASK',\n description: 'A test task that repeats every minute',\n metadata: {\n updatedAt: Date.now(), // Use timestamp instead of Date object\n updateInterval: 1000 * 60, // 1 minute\n },\n tags: ['queue', 'repeat', 'test'],\n });\n }\n\n // Create one-time task\n await this.runtime.createTask({\n name: 'ONETIME_TEST_TASK',\n description: 'A test task that runs once',\n metadata: {\n updatedAt: Date.now(),\n },\n tags: ['queue', 'test'],\n });\n }\n\n /**\n * Starts a timer that runs a function to check tasks at a specified interval.\n */\n private startTimer() {\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n this.timer = setInterval(async () => {\n try {\n await this.checkTasks();\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in task timer'\n );\n }\n }, this.TICK_INTERVAL) as unknown as NodeJS.Timeout;\n }\n\n /**\n * Validates an array of Task objects.\n * Skips tasks without IDs or if no worker is found for the task.\n * If a worker has a `validate` function, it will run the validation using the `runtime`, `Memory`, and `State` parameters.\n * If the validation fails, the task will be skipped and the error will be logged.\n * @param {Task[]} tasks - An array of Task objects to validate.\n * @returns {Promise<Task[]>} - A Promise that resolves with an array of validated Task objects.\n */\n private async validateTasks(tasks: Task[]): Promise<Task[]> {\n const validatedTasks: Task[] = [];\n\n for (const task of tasks) {\n // Skip tasks without IDs\n if (!task.id) {\n continue;\n }\n\n const worker = this.runtime.getTaskWorker(task.name);\n\n // Skip if no worker found for task\n if (!worker) {\n continue;\n }\n\n // If worker has validate function, run validation\n if (worker.validate) {\n try {\n // Pass empty message and state since validation is time-based\n const isValid = await worker.validate(this.runtime, {} as Memory, {} as State);\n if (!isValid) {\n continue;\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error validating task'\n );\n continue;\n }\n }\n\n validatedTasks.push(task);\n }\n\n return validatedTasks;\n }\n\n /**\n * Asynchronous method that checks tasks with \"queue\" tag, validates and sorts them, then executes them based on interval and tags.\n *\n * @returns {Promise<void>} Promise that resolves once all tasks are checked and executed\n */\n private async checkTasks() {\n try {\n // Get all tasks with \"queue\" tag\n const allTasks = await this.runtime.getTasks({\n tags: ['queue'],\n });\n\n if (!allTasks) {\n return;\n }\n\n // validate the tasks and sort them\n const tasks = await this.validateTasks(allTasks);\n\n const now = Date.now();\n\n for (const task of tasks) {\n // First check task.updatedAt (for newer task format)\n // Then fall back to task.metadata.updatedAt (for older tasks)\n // Finally default to 0 if neither exists\n let taskStartTime: number;\n\n // if tags does not contain \"repeat\", execute immediately\n if (!task.tags?.includes('repeat')) {\n // does not contain repeat\n await this.executeTask(task);\n continue;\n }\n\n if (typeof task.updatedAt === 'number') {\n taskStartTime = task.updatedAt;\n } else if (task.metadata?.updatedAt && typeof task.metadata.updatedAt === 'number') {\n taskStartTime = task.metadata.updatedAt;\n } else if (task.updatedAt) {\n taskStartTime = new Date(task.updatedAt).getTime();\n } else {\n taskStartTime = 0; // Default to immediate execution if no timestamp found\n }\n\n // Get updateInterval from metadata\n const updateIntervalMs = task.metadata?.updateInterval ?? 0; // update immediately\n\n // if tags does not contain \"repeat\", execute immediately\n if (!task.tags?.includes('repeat')) {\n await this.executeTask(task);\n continue;\n }\n\n if (task.metadata?.updatedAt === task.metadata?.createdAt) {\n if (task.tags?.includes('immediate')) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n },\n 'Immediately running task'\n );\n await this.executeTask(task);\n continue;\n }\n }\n\n // Check if enough time has passed since last update\n if (now - taskStartTime >= updateIntervalMs) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n intervalMs: updateIntervalMs,\n },\n 'Executing task - interval elapsed'\n );\n await this.executeTask(task);\n }\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error checking tasks'\n );\n }\n }\n\n /**\n * Executes a given task asynchronously.\n *\n * @param {Task} task - The task to be executed.\n */\n private async executeTask(task: Task) {\n try {\n if (!task || !task.id) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Task not found'\n );\n return;\n }\n\n const worker = this.runtime.getTaskWorker(task.name);\n if (!worker) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n },\n 'No worker found for task type'\n );\n return;\n }\n\n // Handle repeating vs non-repeating tasks\n if (task.tags?.includes('repeat')) {\n // For repeating tasks, update the updatedAt timestamp\n await this.runtime.updateTask(task.id, {\n metadata: {\n ...task.metadata,\n updatedAt: Date.now(),\n },\n });\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n taskId: task.id,\n },\n 'Updated repeating task with new timestamp'\n );\n }\n\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n taskId: task.id,\n },\n 'Executing task'\n );\n await worker.execute(this.runtime, task.metadata || {}, task);\n //this.runtime.logger.debug('task.tags are', task.tags);\n\n // Handle repeating vs non-repeating tasks\n if (!task.tags?.includes('repeat')) {\n // For non-repeating tasks, delete the task after execution\n await this.runtime.deleteTask(task.id);\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n taskId: task.id,\n },\n 'Deleted non-repeating task after execution'\n );\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskId: task.id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error executing task'\n );\n }\n }\n\n /**\n * Stops the TASK service in the given agent runtime.\n *\n * @param {IAgentRuntime} runtime - The agent runtime containing the service.\n * @returns {Promise<void>} - A promise that resolves once the service has been stopped.\n */\n static async stop(runtime: IAgentRuntime) {\n const service = runtime.getService(ServiceType.TASK);\n if (service) {\n await service.stop();\n }\n }\n\n /**\n * Stops the timer if it is currently running.\n */\n\n async stop() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n",
44
- "import {\n type IAgentRuntime,\n type Memory,\n Service,\n EventType,\n ModelType,\n type EmbeddingGenerationPayload,\n} from '@elizaos/core';\n\ninterface EmbeddingQueueItem {\n memory: Memory;\n priority: 'high' | 'normal' | 'low';\n retryCount: number;\n maxRetries: number;\n addedAt: number;\n runId?: string;\n}\n\n/**\n * Service responsible for generating embeddings asynchronously\n * This service listens for EMBEDDING_GENERATION_REQUESTED events\n * and processes them in a queue to avoid blocking the main runtime\n */\nexport class EmbeddingGenerationService extends Service {\n static serviceType = 'embedding-generation';\n capabilityDescription = 'Handles asynchronous embedding generation for memories';\n\n private queue: EmbeddingQueueItem[] = [];\n private isProcessing = false;\n private processingInterval: NodeJS.Timeout | null = null;\n private maxQueueSize = 1000;\n private batchSize = 10; // Process up to 10 embeddings at a time\n private processingIntervalMs = 100; // Check queue every 100ms\n private isDisabled = false; // Flag to indicate if service is disabled due to missing embedding model\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: runtime.agentId },\n 'Starting embedding generation service'\n );\n\n // Check if TEXT_EMBEDDING model is registered\n const embeddingModel = runtime.getModel(ModelType.TEXT_EMBEDDING);\n if (!embeddingModel) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:service:embedding', agentId: runtime.agentId },\n 'No TEXT_EMBEDDING model registered - service will not be initialized'\n );\n // Return a no-op service that does nothing\n const noOpService = new EmbeddingGenerationService(runtime);\n noOpService.isDisabled = true;\n return noOpService;\n }\n\n const service = new EmbeddingGenerationService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, skipping initialization'\n );\n return;\n }\n\n this.runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Initializing embedding generation service'\n );\n\n // Register event handlers\n this.runtime.registerEvent(\n EventType.EMBEDDING_GENERATION_REQUESTED,\n this.handleEmbeddingRequest.bind(this)\n );\n\n // Start the processing loop\n this.startProcessing();\n }\n\n private async handleEmbeddingRequest(payload: EmbeddingGenerationPayload): Promise<void> {\n // Skip if service is disabled\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, skipping embedding request'\n );\n return;\n }\n\n const { memory, priority = 'normal', retryCount = 0, maxRetries = 3, runId } = payload;\n\n // Skip if memory already has embeddings\n if (memory.embedding) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n },\n 'Memory already has embeddings, skipping'\n );\n return;\n }\n\n // Check queue size and make room if needed\n if (this.queue.length >= this.maxQueueSize) {\n this.runtime.logger.warn(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n queueSize: this.queue.length,\n maxSize: this.maxQueueSize,\n },\n 'Queue is full, making room'\n );\n this.makeRoomInQueue();\n }\n\n // Add to queue\n const queueItem: EmbeddingQueueItem = {\n memory,\n priority,\n retryCount,\n maxRetries,\n addedAt: Date.now(),\n runId,\n };\n\n // Insert based on priority\n this.insertItemByPriority(queueItem);\n\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n queueSize: this.queue.length,\n },\n 'Added memory to queue'\n );\n }\n\n /**\n * Make room in the queue by removing items based on priority and age\n * Removes 10% of the queue (minimum 1, maximum 10 items)\n */\n private makeRoomInQueue(): void {\n // Remove 10% of queue, but at least 1 and at most 10 items\n const tenPercent = Math.floor(this.maxQueueSize * 0.1);\n const itemsToRemove = Math.min(10, Math.max(1, tenPercent));\n\n // Create array with items and their original indices\n const itemsWithIndex = this.queue.map((item, index) => ({ item, originalIndex: index }));\n\n // Sort by priority (low first for removal) and age (oldest first)\n itemsWithIndex.sort((a, b) => {\n // Priority order for removal: low > normal > high\n const priorityOrder = { low: 0, normal: 1, high: 2 };\n const priorityDiff = priorityOrder[a.item.priority] - priorityOrder[b.item.priority];\n\n if (priorityDiff !== 0) return priorityDiff;\n\n // Within same priority, remove older items first\n return a.item.addedAt - b.item.addedAt;\n });\n\n // Get the original indices of items to remove (first N items after sorting)\n const indicesToRemove = new Set(\n itemsWithIndex\n .slice(0, Math.min(itemsToRemove, itemsWithIndex.length))\n .map(({ originalIndex }) => originalIndex)\n );\n\n // Keep items that are not in the removal set\n const newQueue = this.queue.filter((_, index) => !indicesToRemove.has(index));\n const removedCount = this.queue.length - newQueue.length;\n\n this.queue = newQueue;\n\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n removedCount,\n newSize: this.queue.length,\n },\n 'Removed items from queue'\n );\n }\n\n /**\n * Insert an item into the queue based on its priority\n * High priority items go to the front, normal in the middle, low at the end\n */\n private insertItemByPriority(queueItem: EmbeddingQueueItem): void {\n if (queueItem.priority === 'high') {\n // Find the position after the last high priority item\n let insertIndex = 0;\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i].priority !== 'high') break;\n insertIndex = i + 1;\n }\n this.queue.splice(insertIndex, 0, queueItem);\n } else if (queueItem.priority === 'low') {\n // Add to end of queue\n this.queue.push(queueItem);\n } else {\n // Normal priority - add after high priority items but before low priority items\n let insertIndex = 0;\n\n // First, skip all high priority items\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i].priority !== 'high') {\n insertIndex = i;\n break;\n }\n insertIndex = i + 1;\n }\n\n // Then find where low priority items start\n for (let i = insertIndex; i < this.queue.length; i++) {\n if (this.queue[i].priority === 'low') {\n insertIndex = i;\n break;\n }\n insertIndex = i + 1;\n }\n\n this.queue.splice(insertIndex, 0, queueItem);\n }\n }\n\n private startProcessing(): void {\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, not starting processing loop'\n );\n return;\n }\n\n if (this.processingInterval) {\n return;\n }\n\n this.processingInterval = setInterval(async () => {\n if (!this.isProcessing && this.queue.length > 0) {\n await this.processQueue();\n }\n }, this.processingIntervalMs);\n\n this.runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Started processing loop'\n );\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessing || this.queue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n\n try {\n // Process a batch of items\n const batch = this.queue.splice(0, Math.min(this.batchSize, this.queue.length));\n\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n batchSize: batch.length,\n remaining: this.queue.length,\n },\n 'Processing batch'\n );\n\n // Process items in parallel\n const promises = batch.map(async (item) => {\n try {\n await this.generateEmbedding(item);\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: item.memory.id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing item'\n );\n\n // Retry if under max retries\n if (item.retryCount < item.maxRetries) {\n item.retryCount++;\n // Re-add to queue with same priority using proper insertion\n this.insertItemByPriority(item);\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n retryCount: item.retryCount,\n maxRetries: item.maxRetries,\n },\n 'Re-queued item for retry'\n );\n } else {\n // Log embedding failure\n await this.runtime.log({\n entityId: this.runtime.agentId,\n roomId: item.memory.roomId || this.runtime.agentId,\n type: 'embedding_event',\n body: {\n runId: item.runId,\n memoryId: item.memory.id,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error),\n source: 'embeddingService',\n },\n });\n\n // Emit failure event\n await this.runtime.emitEvent(EventType.EMBEDDING_GENERATION_FAILED, {\n runtime: this.runtime,\n memory: item.memory,\n error: error instanceof Error ? error.message : String(error),\n source: 'embeddingService',\n });\n }\n }\n });\n\n await Promise.all(promises);\n } finally {\n this.isProcessing = false;\n }\n }\n\n private async generateEmbedding(item: EmbeddingQueueItem): Promise<void> {\n const { memory } = item;\n\n if (!memory.content?.text) {\n this.runtime.logger.warn(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n },\n 'Memory has no text content'\n );\n return;\n }\n\n try {\n const startTime = Date.now();\n\n // Generate embedding\n const embedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: memory.content.text,\n });\n\n const duration = Date.now() - startTime;\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n durationMs: duration,\n },\n 'Generated embedding'\n );\n\n // Update memory with embedding\n if (memory.id) {\n await this.runtime.updateMemory({\n id: memory.id,\n embedding: embedding as number[],\n });\n\n // Log embedding completion\n await this.runtime.log({\n entityId: this.runtime.agentId,\n roomId: memory.roomId || this.runtime.agentId,\n type: 'embedding_event',\n body: {\n runId: item.runId,\n memoryId: memory.id,\n status: 'completed',\n duration,\n source: 'embeddingService',\n },\n });\n\n // Emit completion event\n await this.runtime.emitEvent(EventType.EMBEDDING_GENERATION_COMPLETED, {\n runtime: this.runtime,\n memory: { ...memory, embedding },\n source: 'embeddingService',\n });\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to generate embedding'\n );\n throw error; // Re-throw to trigger retry logic\n }\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Stopping embedding generation service'\n );\n\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, nothing to stop'\n );\n return;\n }\n\n if (this.processingInterval) {\n clearInterval(this.processingInterval);\n this.processingInterval = null;\n }\n\n // Process remaining high priority items before shutdown\n const highPriorityItems = this.queue.filter((item) => item.priority === 'high');\n if (highPriorityItems.length > 0) {\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n count: highPriorityItems.length,\n },\n 'Processing high priority items before shutdown'\n );\n for (const item of highPriorityItems) {\n try {\n await this.generateEmbedding(item);\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error during shutdown processing'\n );\n }\n }\n }\n\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n remainingItems: this.queue.length,\n },\n 'Stopped'\n );\n }\n\n // Public methods for monitoring\n getQueueSize(): number {\n return this.queue.length;\n }\n\n getQueueStats(): { high: number; normal: number; low: number; total: number } {\n const stats = {\n high: 0,\n normal: 0,\n low: 0,\n total: this.queue.length,\n };\n\n for (const item of this.queue) {\n stats[item.priority]++;\n }\n\n return stats;\n }\n\n clearQueue(): void {\n const size = this.queue.length;\n this.queue = [];\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n clearedCount: size,\n },\n 'Cleared queue'\n );\n }\n}\n\nexport default EmbeddingGenerationService;\n"
43
+ "// registered to runtime through plugin\n\nimport {\n Service,\n ServiceType,\n type IAgentRuntime,\n type Memory,\n type State,\n type Task,\n} from '@elizaos/core';\n\n/**\n * TaskService class representing a service that schedules and executes tasks.\n * @extends Service\n * @property {NodeJS.Timeout|null} timer - Timer for executing tasks\n * @property {number} TICK_INTERVAL - Interval in milliseconds to check for tasks\n * @property {ServiceTypeName} serviceType - Service type of TASK\n * @property {string} capabilityDescription - Description of the service's capability\n * @static\n * @method start - Static method to start the TaskService\n * @method createTestTasks - Method to create test tasks\n * @method startTimer - Private method to start the timer for checking tasks\n * @method validateTasks - Private method to validate tasks\n * @method checkTasks - Private method to check tasks and execute them\n * @method executeTask - Private method to execute a task\n * @static\n * @method stop - Static method to stop the TaskService\n * @method stop - Method to stop the TaskService\n */\n/**\n * Start the TaskService with the given runtime.\n * @param {IAgentRuntime} runtime - The runtime for the TaskService.\n */\nexport class TaskService extends Service {\n private timer: NodeJS.Timeout | null = null;\n private readonly TICK_INTERVAL = 1000; // Check every second\n static serviceType = ServiceType.TASK;\n capabilityDescription = 'The agent is able to schedule and execute tasks';\n\n /**\n * Start the TaskService with the given runtime.\n * @param {IAgentRuntime} runtime - The runtime for the TaskService.\n * @returns {Promise<Service>} A promise that resolves with the TaskService instance.\n */\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new TaskService(runtime);\n await service.startTimer();\n // await service.createTestTasks();\n return service;\n }\n\n /**\n * Asynchronously creates test tasks by registering task workers for repeating and one-time tasks,\n * validates the tasks, executes the tasks, and creates the tasks if they do not already exist.\n */\n async createTestTasks() {\n // Register task worker for repeating task\n this.runtime.registerTaskWorker({\n name: 'REPEATING_TEST_TASK',\n validate: async (_runtime, _message, _state) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Validating repeating test task'\n );\n return true;\n },\n execute: async (_runtime, _options) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Executing repeating test task'\n );\n },\n });\n\n // Register task worker for one-time task\n this.runtime.registerTaskWorker({\n name: 'ONETIME_TEST_TASK',\n validate: async (_runtime, _message, _state) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Validating one-time test task'\n );\n return true;\n },\n execute: async (_runtime, _options) => {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Executing one-time test task'\n );\n },\n });\n\n // check if the task exists\n const tasks = await this.runtime.getTasksByName('REPEATING_TEST_TASK');\n\n if (tasks.length === 0) {\n // Create repeating task\n await this.runtime.createTask({\n name: 'REPEATING_TEST_TASK',\n description: 'A test task that repeats every minute',\n metadata: {\n updatedAt: Date.now(), // Use timestamp instead of Date object\n updateInterval: 1000 * 60, // 1 minute\n },\n tags: ['queue', 'repeat', 'test'],\n });\n }\n\n // Create one-time task\n await this.runtime.createTask({\n name: 'ONETIME_TEST_TASK',\n description: 'A test task that runs once',\n metadata: {\n updatedAt: Date.now(),\n },\n tags: ['queue', 'test'],\n });\n }\n\n /**\n * Starts a timer that runs a function to check tasks at a specified interval.\n */\n private startTimer() {\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n this.timer = setInterval(async () => {\n try {\n await this.checkTasks();\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error in task timer'\n );\n }\n }, this.TICK_INTERVAL) as NodeJS.Timeout;\n }\n\n /**\n * Validates an array of Task objects.\n * Skips tasks without IDs or if no worker is found for the task.\n * If a worker has a `validate` function, it will run the validation using the `runtime`, `Memory`, and `State` parameters.\n * If the validation fails, the task will be skipped and the error will be logged.\n * @param {Task[]} tasks - An array of Task objects to validate.\n * @returns {Promise<Task[]>} - A Promise that resolves with an array of validated Task objects.\n */\n private async validateTasks(tasks: Task[]): Promise<Task[]> {\n const validatedTasks: Task[] = [];\n\n for (const task of tasks) {\n // Skip tasks without IDs\n if (!task.id) {\n continue;\n }\n\n const worker = this.runtime.getTaskWorker(task.name);\n\n // Skip if no worker found for task\n if (!worker) {\n continue;\n }\n\n // If worker has validate function, run validation\n if (worker.validate) {\n try {\n // Pass empty message and state since validation is time-based\n const isValid = await worker.validate(this.runtime, {} as Memory, {} as State);\n if (!isValid) {\n continue;\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error validating task'\n );\n continue;\n }\n }\n\n validatedTasks.push(task);\n }\n\n return validatedTasks;\n }\n\n /**\n * Asynchronous method that checks tasks with \"queue\" tag, validates and sorts them, then executes them based on interval and tags.\n *\n * @returns {Promise<void>} Promise that resolves once all tasks are checked and executed\n */\n private async checkTasks() {\n try {\n // Get all tasks with \"queue\" tag\n const allTasks = await this.runtime.getTasks({\n tags: ['queue'],\n });\n\n if (!allTasks) {\n return;\n }\n\n // validate the tasks and sort them\n const tasks = await this.validateTasks(allTasks);\n\n const now = Date.now();\n\n for (const task of tasks) {\n // First check task.updatedAt (for newer task format)\n // Then fall back to task.metadata.updatedAt (for older tasks)\n // Finally default to 0 if neither exists\n let taskStartTime: number;\n\n // if tags does not contain \"repeat\", execute immediately\n if (!task.tags?.includes('repeat')) {\n // does not contain repeat\n await this.executeTask(task);\n continue;\n }\n\n if (typeof task.updatedAt === 'number') {\n taskStartTime = task.updatedAt;\n } else if (task.metadata?.updatedAt && typeof task.metadata.updatedAt === 'number') {\n taskStartTime = task.metadata.updatedAt;\n } else if (task.updatedAt) {\n taskStartTime = new Date(task.updatedAt).getTime();\n } else {\n taskStartTime = 0; // Default to immediate execution if no timestamp found\n }\n\n // Get updateInterval from metadata\n const updateIntervalMs = task.metadata?.updateInterval ?? 0; // update immediately\n\n // if tags does not contain \"repeat\", execute immediately\n if (!task.tags?.includes('repeat')) {\n await this.executeTask(task);\n continue;\n }\n\n if (task.metadata?.updatedAt === task.metadata?.createdAt) {\n if (task.tags?.includes('immediate')) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n },\n 'Immediately running task'\n );\n await this.executeTask(task);\n continue;\n }\n }\n\n // Check if enough time has passed since last update\n if (now - taskStartTime >= updateIntervalMs) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n intervalMs: updateIntervalMs,\n },\n 'Executing task - interval elapsed'\n );\n await this.executeTask(task);\n }\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error checking tasks'\n );\n }\n }\n\n /**\n * Executes a given task asynchronously.\n *\n * @param {Task} task - The task to be executed.\n */\n private async executeTask(task: Task) {\n try {\n if (!task || !task.id) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:task', agentId: this.runtime.agentId },\n 'Task not found'\n );\n return;\n }\n\n const worker = this.runtime.getTaskWorker(task.name);\n if (!worker) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n },\n 'No worker found for task type'\n );\n return;\n }\n\n // Handle repeating vs non-repeating tasks\n if (task.tags?.includes('repeat')) {\n // For repeating tasks, update the updatedAt timestamp\n await this.runtime.updateTask(task.id, {\n metadata: {\n ...task.metadata,\n updatedAt: Date.now(),\n },\n });\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n taskId: task.id,\n },\n 'Updated repeating task with new timestamp'\n );\n }\n\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n taskId: task.id,\n },\n 'Executing task'\n );\n await worker.execute(this.runtime, task.metadata || {}, task);\n //this.runtime.logger.debug('task.tags are', task.tags);\n\n // Handle repeating vs non-repeating tasks\n if (!task.tags?.includes('repeat')) {\n // For non-repeating tasks, delete the task after execution\n await this.runtime.deleteTask(task.id);\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskName: task.name,\n taskId: task.id,\n },\n 'Deleted non-repeating task after execution'\n );\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:task',\n agentId: this.runtime.agentId,\n taskId: task.id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error executing task'\n );\n }\n }\n\n /**\n * Stops the TASK service in the given agent runtime.\n *\n * @param {IAgentRuntime} runtime - The agent runtime containing the service.\n * @returns {Promise<void>} - A promise that resolves once the service has been stopped.\n */\n static async stop(runtime: IAgentRuntime) {\n const service = runtime.getService(ServiceType.TASK);\n if (service) {\n await service.stop();\n }\n }\n\n /**\n * Stops the timer if it is currently running.\n */\n\n async stop() {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n",
44
+ "import {\n type IAgentRuntime,\n type Memory,\n Service,\n EventType,\n ModelType,\n type EmbeddingGenerationPayload,\n} from '@elizaos/core';\n\ninterface EmbeddingQueueItem {\n memory: Memory;\n priority: 'high' | 'normal' | 'low';\n retryCount: number;\n maxRetries: number;\n addedAt: number;\n runId?: string;\n}\n\n/**\n * Service responsible for generating embeddings asynchronously\n * This service listens for EMBEDDING_GENERATION_REQUESTED events\n * and processes them in a queue to avoid blocking the main runtime\n */\nexport class EmbeddingGenerationService extends Service {\n static serviceType = 'embedding-generation';\n capabilityDescription = 'Handles asynchronous embedding generation for memories';\n\n private queue: EmbeddingQueueItem[] = [];\n private isProcessing = false;\n private processingInterval: NodeJS.Timeout | null = null;\n private maxQueueSize = 1000;\n private batchSize = 10; // Process up to 10 embeddings at a time\n private processingIntervalMs = 100; // Check queue every 100ms\n private isDisabled = false; // Flag to indicate if service is disabled due to missing embedding model\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: runtime.agentId },\n 'Starting embedding generation service'\n );\n\n // Check if TEXT_EMBEDDING model is registered\n const embeddingModel = runtime.getModel(ModelType.TEXT_EMBEDDING);\n if (!embeddingModel) {\n runtime.logger.warn(\n { src: 'plugin:bootstrap:service:embedding', agentId: runtime.agentId },\n 'No TEXT_EMBEDDING model registered - service will not be initialized'\n );\n // Return a no-op service that does nothing\n const noOpService = new EmbeddingGenerationService(runtime);\n noOpService.isDisabled = true;\n return noOpService;\n }\n\n const service = new EmbeddingGenerationService(runtime);\n await service.initialize();\n return service;\n }\n\n async initialize(): Promise<void> {\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, skipping initialization'\n );\n return;\n }\n\n this.runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Initializing embedding generation service'\n );\n\n // Register event handlers\n this.runtime.registerEvent(\n EventType.EMBEDDING_GENERATION_REQUESTED,\n this.handleEmbeddingRequest.bind(this)\n );\n\n // Start the processing loop\n this.startProcessing();\n }\n\n private async handleEmbeddingRequest(payload: EmbeddingGenerationPayload): Promise<void> {\n // Skip if service is disabled\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, skipping embedding request'\n );\n return;\n }\n\n const { memory, priority = 'normal', retryCount = 0, maxRetries = 3, runId } = payload;\n\n // Skip if memory already has embeddings\n if (memory.embedding) {\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n },\n 'Memory already has embeddings, skipping'\n );\n return;\n }\n\n // Check queue size and make room if needed\n if (this.queue.length >= this.maxQueueSize) {\n this.runtime.logger.warn(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n queueSize: this.queue.length,\n maxSize: this.maxQueueSize,\n },\n 'Queue is full, making room'\n );\n this.makeRoomInQueue();\n }\n\n // Add to queue\n const queueItem: EmbeddingQueueItem = {\n memory,\n priority,\n retryCount,\n maxRetries,\n addedAt: Date.now(),\n runId,\n };\n\n // Insert based on priority\n this.insertItemByPriority(queueItem);\n\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n queueSize: this.queue.length,\n },\n 'Added memory to queue'\n );\n }\n\n /**\n * Make room in the queue by removing items based on priority and age\n * Removes 10% of the queue (minimum 1, maximum 10 items)\n */\n private makeRoomInQueue(): void {\n // Remove 10% of queue, but at least 1 and at most 10 items\n const tenPercent = Math.floor(this.maxQueueSize * 0.1);\n const itemsToRemove = Math.min(10, Math.max(1, tenPercent));\n\n // Create array with items and their original indices\n const itemsWithIndex = this.queue.map((item, index) => ({ item, originalIndex: index }));\n\n // Sort by priority (low first for removal) and age (oldest first)\n itemsWithIndex.sort((a, b) => {\n // Priority order for removal: low > normal > high\n const priorityOrder = { low: 0, normal: 1, high: 2 };\n const priorityDiff = priorityOrder[a.item.priority] - priorityOrder[b.item.priority];\n\n if (priorityDiff !== 0) {\n return priorityDiff;\n }\n\n // Within same priority, remove older items first\n return a.item.addedAt - b.item.addedAt;\n });\n\n // Get the original indices of items to remove (first N items after sorting)\n const indicesToRemove = new Set(\n itemsWithIndex\n .slice(0, Math.min(itemsToRemove, itemsWithIndex.length))\n .map(({ originalIndex }) => originalIndex)\n );\n\n // Keep items that are not in the removal set\n const newQueue = this.queue.filter((_, index) => !indicesToRemove.has(index));\n const removedCount = this.queue.length - newQueue.length;\n\n this.queue = newQueue;\n\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n removedCount,\n newSize: this.queue.length,\n },\n 'Removed items from queue'\n );\n }\n\n /**\n * Insert an item into the queue based on its priority\n * High priority items go to the front, normal in the middle, low at the end\n */\n private insertItemByPriority(queueItem: EmbeddingQueueItem): void {\n if (queueItem.priority === 'high') {\n // Find the position after the last high priority item\n let insertIndex = 0;\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i].priority !== 'high') {\n break;\n }\n insertIndex = i + 1;\n }\n this.queue.splice(insertIndex, 0, queueItem);\n } else if (queueItem.priority === 'low') {\n // Add to end of queue\n this.queue.push(queueItem);\n } else {\n // Normal priority - add after high priority items but before low priority items\n let insertIndex = 0;\n\n // First, skip all high priority items\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i].priority !== 'high') {\n insertIndex = i;\n break;\n }\n insertIndex = i + 1;\n }\n\n // Then find where low priority items start\n for (let i = insertIndex; i < this.queue.length; i++) {\n if (this.queue[i].priority === 'low') {\n insertIndex = i;\n break;\n }\n insertIndex = i + 1;\n }\n\n this.queue.splice(insertIndex, 0, queueItem);\n }\n }\n\n private startProcessing(): void {\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, not starting processing loop'\n );\n return;\n }\n\n if (this.processingInterval) {\n return;\n }\n\n this.processingInterval = setInterval(async () => {\n if (!this.isProcessing && this.queue.length > 0) {\n await this.processQueue();\n }\n }, this.processingIntervalMs);\n\n this.runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Started processing loop'\n );\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessing || this.queue.length === 0) {\n return;\n }\n\n this.isProcessing = true;\n\n try {\n // Process a batch of items\n const batch = this.queue.splice(0, Math.min(this.batchSize, this.queue.length));\n\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n batchSize: batch.length,\n remaining: this.queue.length,\n },\n 'Processing batch'\n );\n\n // Process items in parallel\n const promises = batch.map(async (item) => {\n try {\n await this.generateEmbedding(item);\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: item.memory.id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error processing item'\n );\n\n // Retry if under max retries\n if (item.retryCount < item.maxRetries) {\n item.retryCount++;\n // Re-add to queue with same priority using proper insertion\n this.insertItemByPriority(item);\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n retryCount: item.retryCount,\n maxRetries: item.maxRetries,\n },\n 'Re-queued item for retry'\n );\n } else {\n // Log embedding failure\n await this.runtime.log({\n entityId: this.runtime.agentId,\n roomId: item.memory.roomId || this.runtime.agentId,\n type: 'embedding_event',\n body: {\n runId: item.runId,\n memoryId: item.memory.id,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error),\n source: 'embeddingService',\n },\n });\n\n // Emit failure event\n await this.runtime.emitEvent(EventType.EMBEDDING_GENERATION_FAILED, {\n runtime: this.runtime,\n memory: item.memory,\n error: error instanceof Error ? error.message : String(error),\n source: 'embeddingService',\n });\n }\n }\n });\n\n await Promise.all(promises);\n } finally {\n this.isProcessing = false;\n }\n }\n\n private async generateEmbedding(item: EmbeddingQueueItem): Promise<void> {\n const { memory } = item;\n\n if (!memory.content?.text) {\n this.runtime.logger.warn(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n },\n 'Memory has no text content'\n );\n return;\n }\n\n try {\n const startTime = Date.now();\n\n // Generate embedding\n const embedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: memory.content.text,\n });\n\n const duration = Date.now() - startTime;\n this.runtime.logger.debug(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n durationMs: duration,\n },\n 'Generated embedding'\n );\n\n // Update memory with embedding\n if (memory.id) {\n await this.runtime.updateMemory({\n id: memory.id,\n embedding: embedding as number[],\n });\n\n // Log embedding completion\n await this.runtime.log({\n entityId: this.runtime.agentId,\n roomId: memory.roomId || this.runtime.agentId,\n type: 'embedding_event',\n body: {\n runId: item.runId,\n memoryId: memory.id,\n status: 'completed',\n duration,\n source: 'embeddingService',\n },\n });\n\n // Emit completion event\n await this.runtime.emitEvent(EventType.EMBEDDING_GENERATION_COMPLETED, {\n runtime: this.runtime,\n memory: { ...memory, embedding },\n source: 'embeddingService',\n });\n }\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n memoryId: memory.id,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Failed to generate embedding'\n );\n throw error; // Re-throw to trigger retry logic\n }\n }\n\n async stop(): Promise<void> {\n this.runtime.logger.info(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Stopping embedding generation service'\n );\n\n if (this.isDisabled) {\n this.runtime.logger.debug(\n { src: 'plugin:bootstrap:service:embedding', agentId: this.runtime.agentId },\n 'Service is disabled, nothing to stop'\n );\n return;\n }\n\n if (this.processingInterval) {\n clearInterval(this.processingInterval);\n this.processingInterval = null;\n }\n\n // Process remaining high priority items before shutdown\n const highPriorityItems = this.queue.filter((item) => item.priority === 'high');\n if (highPriorityItems.length > 0) {\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n count: highPriorityItems.length,\n },\n 'Processing high priority items before shutdown'\n );\n for (const item of highPriorityItems) {\n try {\n await this.generateEmbedding(item);\n } catch (error) {\n this.runtime.logger.error(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n 'Error during shutdown processing'\n );\n }\n }\n }\n\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n remainingItems: this.queue.length,\n },\n 'Stopped'\n );\n }\n\n // Public methods for monitoring\n getQueueSize(): number {\n return this.queue.length;\n }\n\n getQueueStats(): { high: number; normal: number; low: number; total: number } {\n const stats = {\n high: 0,\n normal: 0,\n low: 0,\n total: this.queue.length,\n };\n\n for (const item of this.queue) {\n stats[item.priority]++;\n }\n\n return stats;\n }\n\n clearQueue(): void {\n const size = this.queue.length;\n this.queue = [];\n this.runtime.logger.info(\n {\n src: 'plugin:bootstrap:service:embedding',\n agentId: this.runtime.agentId,\n clearedCount: size,\n },\n 'Cleared queue'\n );\n }\n}\n\nexport default EmbeddingGenerationService;\n"
45
45
  ],
46
- "mappings": "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S,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,WAAU,SAAQ,eAAc,WAAU,WAAU,OAAM,UAAS,SAAQ,UAAS,SAAQ,WAAU,UAAS,SAAQ,WAAU,OAAM,UAAS,SAAQ,WAAU,YAAW,QAAO,UAAS,UAAS,WAAU,WAAU,SAAQ,UAAS,SAAQ,WAAU,SAAQ,WAAU,WAAU,WAAU,UAAS,UAAS,UAAS,SAAQ,WAAU,QAAO,WAAU,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,WAAU,SAAQ,UAAS,UAAS,YAAW,WAAU,UAAS,WAAU,SAAQ,UAAS,WAAU,UAAS,WAAU,UAAS,UAAS,UAAS,WAAU,WAAU,WAAU,WAAU,YAAW,SAAQ,UAAS,UAAS,WAAU,YAAW,SAAQ,UAAS,WAAU,YAAW,aAAY,aAAY,YAAW,YAAW,UAAS,cAAa,WAAU,WAAU,WAAU,UAAS,QAAO,SAAQ,cAAa,UAAS,WAAU,YAAW,UAAS,WAAU,WAAU,YAAW,YAAW,aAAY,WAAU,YAAW,YAAW,SAAQ,UAAS,SAAQ,UAAS,YAAW,WAAU,SAAQ,QAAO,SAAQ,SAAQ,YAAW,SAAQ,QAAO,SAAQ,QAAO,aAAY,aAAY,aAAY,cAAa,UAAS,SAAQ,UAAS,aAAY,SAAQ,YAAW,QAAO,YAAW,SAAQ,aAAY,aAAY,SAAQ,UAAS,YAAW,aAAY,aAAY,SAAQ,UAAS,YAAW,YAAW,WAAU,YAAW,WAAU,SAAQ,aAAY,QAAO,SAAQ,UAAS,YAAW,UAAS,UAAS,WAAU,YAAW,QAAO,QAAO,SAAQ,WAAU,SAAQ,UAAS,WAAU,WAAU,WAAU,UAAS,QAAO,QAAO,UAAS,WAAU,WAAU,YAAW,aAAY,aAAY,YAAW,aAAY,SAAQ,SAAQ,UAAS,WAAU,UAAS,WAAU,WAAU,SAAQ,SAAQ,SAAQ,QAAO,UAAS,WAAU,WAAU,UAAS,WAAU,aAAY,UAAS,UAAS,UAAS,YAAW,YAAW,WAAU,WAAU,UAAS,YAAW,YAAW,YAAW,YAAW,YAAW,WAAU,aAAY,aAAY,YAAW,aAAY,YAAW,YAAW,YAAW,YAAW,SAAQ,UAAS,YAAW,WAAU,WAAU,WAAU,WAAU,UAAS,QAAO,SAAQ,UAAS,SAAQ,aAAY,WAAU,WAAU,UAAS,YAAW,aAAY,UAA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AS,SAAQ,UAAS,SAAQ,UAAS,UAAS,UAAS,QAAO,YAAW,YAAW,WAAU,YAAW,YAAW,YAAW,WAAU,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,UAAS,QAAO,QAAO,OAAM,QAAO,SAAQ,UAAS,SAAQ,OAAM,UAAS,SAAQ,SAAQ,OAAM,SAAQ,UAAS,WAAU,SAAQ,SAAQ,UAAS,YAAW,SAAQ,SAAQ,UAAS,SAAQ,UAAS,YAAW,UAAS,WAAU,YAAW,SAAQ,UAAS,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,UAAS,UAAS,QAAO,SAAQ,YAAW,QAAO,SAAQ,UAAS,YAAW,UAAS,UAAS,OAAM,QAAO,UAAS,SAAQ,OAAM,QAAO,SAAQ,QAAO,OAAM,QAAO,WAAU,QAAO,OAAM,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,SAAQ,QAAO,UAAS,OAAM,SAAQ,UAAS,SAAQ,UAAS,SAAQ,UAAS,UAAS,aAAY,UAAS,UAAS,SAAQ,SAAQ,UAAS,WAAU,aAAY,aAAY,WAAU,YAAW,YAAW,WAAU,SAAQ,SAAQ,SAAQ,SAAQ,WAAU,YAAW,YAAW,SAAQ,WAAU,WAAU,YAAW,QAAO,YAAW,YAAW,UAAS,QAAO,UAAS,WAAU,SAAQ,YAAW,aAAY,cAAa,SAAQ,UAAS,UAAS,SAAQ,SAAQ,YAAW,aAAY,QAAO,QAAO,QAAO,YAAW,QAAO,SAAQ,UAAS,WAAU,QAAO,SAAQ,WAAU,QAAO,SAAQ,UAAS,UAAS,QAAO,UAAS,UAAS,UAAS,UAAS,WAAU,SAAQ,QAAO,WAAU,QAAO,SAAQ,SAAQ,QAAO,SAAQ,YAAW,WAAU,QAAO,QAAO,UAAS,UAAS,UAAS,UAAS,QAAO,SAAQ,UAAS,UAAS,UAAS,UAAS,MAAK,OAAM,UAAS,UAAS,UAAS,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,UAAS,SAAQ,UAAS,UAAS,WAAU,SAAQ,SAAQ,UAAS,WAAU,QAAO,WAAU,YAAW,WAAU,YAAW,aAAY,YAAW,SAAQ,QAAO,SAAQ,QAAO,SAAQ,WAAU,SAAQ,UAAS,YAAW,QAAO,UAAS,cAAa,UAAS,aAAY,WAAU,WAAU,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,SAAQ,QAAO,SAAQ,SAAQ,UAAS,QAAO,cAAa,cAAa,UAAS,WAAU,WAAU,QAAO,YAAW,WAAU,aAAY,SAAQ,QAAO,QAAO,WAAU,QAAO,aAAY,QAAO,SAAQ,QAAO,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,UAAS,YAAW,cAAa,SAAQ,WAAU,WAAU,YAAW,YAAW,WAAU,SAAQ,QAAO,QAAO,SAAQ,QAAO,UAAS,WAAU,WAAU,UAAS,QAAO,WAAU,UAAS,YAAW,YAAW,OAAM,WAAU,aAAY,aAAY,cAAa,cAAa,UAAS,UAAS,OAAM,WAAU,WAAU,WAAU,UAAS,QAAO,QAAO,SAAQ,UAAS,SAAQ,QAAO,OAAM,QAAO,SAAQ,aAAY,OAAM,SAAQ,SAAQ,UAAS,OAAM,aAAY,WAAU,UAAS,SAAQ,YAAW,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,UAAS,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,YAAW,YAAW,QAAO,SAAQ,UAAS,OAAM,UAAS,QAAO,WAAU,UAAS,SAAQ,SAAQ,UAAS,YAAW,UAAS,WAAU,YAAW,UAAS,WAAU,YAAW,WAAU,UAAS,WAAU,UAAS,UAAS,WAAU,WAAU,cAAa,cAAa,QAAO,YAAW,YAAW,cAAa,SAAQ,OAAM,SAAQ,UAAS,UAAS,WAAU,YAAW,QAAO,UAAS,SAAQ,UAAS,WAAU,QAAO,SAAQ,UAAS,YAAW,YAAW,SAAQ,aAAY,OAAM,QAAO,SAAQ,YAAW,SAAQ,YAAW,YAAW,aAAY,aAAY,YAAW,YAAW,SAAQ,UAAS,WAAU,UAAS,WAAU,YAAW,UAAS,UAAS,WAAU,UAAS,SAAQ,UAAS,WAAU,UAAS,QAAO,QAAO,YAAW,WAAU,aAAY,YAAW,aAAY,aAAY,aAAY,YAAW,SAAQ,WAAU,UAAS,UAAS,WAAU,UAAS,UAAS,QAAO,SAAQ,UAAS,WAAU,UAAS,YAAW,aAAY,cAAa,cAAa,SAAQ,UAAS,UAAS,YAAW,UAAS,UAAS,cAAa,UAAS,UAAS,SAAQ,UAAS,SAAQ,QAAO,SAAQ,WAAU,YAAW,YAAW,aAAY,aAAY,cAAa,WAAU,QAAO,OAAM,QAAO,QAAO,QAAO,UAAS,WAAU,UAAS,YAAW,SAAQ,SAAQ,aAAY,OAAM,QAAO,SAAQ,SAAQ,SAAQ,WAAU,WAAU,UAAS,SAAQ,QAAO,QAAO,UAAS,aAAY,WAAU,SAAQ,SAAQ,SAAQ,UAAS,YAAW,SAAQ,YAAW,YAAW,UAAS,cAAa,cAAa,YAAW,YAAW,aAAY,aAAY,WAAU,aAAY,cAAa,cAAa,WAAU,YAAW,YAAW,WAAU,aAAY,SAAQ,cAAa,QAAO,YAAW,YAAW,aAAY,WAAU,YAAW,WAAU,SAAQ,UAAS,YAAW,SAAQ,QAAO,SAAQ,SAAQ,UAAS,WAAU,YAAW,YAAW,aAAY,SAAQ,YAAW,SAAQ,WAAU,UAAS,QAAO,YAAW,YAAW,cAAa,cAAa,SAAQ,aAAY,QAAO,UAAS,SAAQ,WAAU,UAAS,YAAW,SAAQ,QAAO,WAAU,WAAU,UAAS,SAAQ,UAAS,YAAW,SAAQ,WAAU,YAAW,SAAQ,WAAU,UAAS,UAAS,WAAU,WAAU,YAAW,UAAS,aAAY,YAAW,UAAS,QAAO,SAAQ,UAAS,SAAQ,QAAO,UAAS,WAAU,SAAQ,UAAS,WAAU,WAAU,SAAQ,UAAS,YAAW,YAAW,SAAQ,QAAO,UAAS,UAAS,WAAU,QAAO,UAAS,SAAQ,aAAY,SAAQ,UAAS,UAAS,WAAU,SAAQ,SAAQ,UAAS,UAAS,SAAQ,UAAS,YAAW,QAAO,UAAS,UAAS,SAAQ,SAAQ,UAAS,YAAW,SAAQ,UAAS,WAAU,UAAS,UAAS,SAAQ,YAAW,WAAU,aAAY,aAAY,UAAS,aAAY,OAAM,YAAW,eAAc,aAAY,UAAS,WAAU,OAAM,WAAU,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,QAAO,aAAY,aAAY,aAAY,WAAU,YAAW,YAAW,UAAS,WAAU,UAAS,WAAU,WAAU,QAAO,WAAU,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,WAAU,SAAQ,QAAO,SAAQ,YAAW,UAAS,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,SAAQ,UAAS,UAAS,SAAQ,SAAQ,WAAU,UAAS,SAAQ,UAAS,YAAW,YAAW,WAAU,SAAQ,UAAS,WAAU,YAAW,aAAY,aAAY,WAAU,YAAW,SAAQ,UAAS,SAAQ,UAAS,SAAQ,SAAQ,WAAU,QAAO,SAAQ,SAAQ,UAAS,QAAO,UAAS,WAAU,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,SAAQ,mBAAkB,UAAS,UAAS,WAAU,SAAQ,SAAQ,SAAQ,WAAU,SAAQ,SAAQ,YAAW,SAAQ,UAAS,YAAW,aAAY,aAAY,aAAY,aAAY,UAAS,WAAU,WAAU,YAAW,YAAW,SAAQ,UAAS,UAAS,WAAU,UAAS,SAAQ,UAAS,SAAQ,UAAS,SAAQ,aAAY,cAAa,SAAQ,cAAa,cAAa,SAAQ,WAAU,YAAW,SAAQ,SAAQ,UAAS,SAAQ,cAAa,aAAY,SAAQ,SAAQ,WAAU,QAAO,WAAU,YAAW,aAAY,SAAQ,YAAW,aAAY,aAAY,cAAa,cAAa,SAAQ,UAAS,SAAQ,QAAO,OAAM,UAAS,WAAU,WAAU,SAAQ,UAAS,UAAS,UAAS,UAAS,SAAQ,SAAQ,QAAO,QAAO,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,UAAS,WAAU,WAAU,OAAM,UAAS,QAAO,WAAU,UAAS,QAAO,QAAO,YAAW,YAAW,QAAO,YAAW,YAAW,SAAQ,UAAS,WAAU,QAAO,WAAU,YAAW,QAAO,WAAU,OAAM,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,QAAO,OAAM,UAAS,aAAY,YAAW,YAAW,WAAU,YAAW,WAAU,WAAU,QAAO,UAAS,QAAO,SAAQ,QAAO,SAAQ,UAAS,QAAO,UAAS,SAAQ,OAAM,UAAS,WAAU,WAAU,WAAU,YAAW,YAAW,YAAW,SAAQ,UAAS,WAAU,WAAU,cAAa,eAAc,SAAQ,UAAS,UAAS,aAAY,cAAa,aAAY,cAAa,eAAc,eAAc,aAAY,aAAY,UAAS,WAAU,WAAU,QAAO,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,UAAS,OAAM,QAAO,UAAS,UAAS,SAAQ,QAAO,UAAS,YAAW,UAAS,SAAQ,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,SAAQ,UAAS,WAAU,WAAU,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,UAAS,UAAS,SAAQ,UAAS,SAAQ,SAAQ,UAAS,YAAW,SAAQ,QAAO,YAAW,YAAW,cAAa,cAAa,WAAU,UAAS,WAAU,WAAU,SAAQ,UAAS,SAAQ,WAAU,UAAS,QAAO,SAAQ,SAAQ,YAAW,YAAW,UAAS,WAAU,UAAS,UAAS,aAAY,WAAU,YAAW,WAAU,UAAS,SAAQ,UAAS,WAAU,UAAS,SAAQ,OAAM,QAAO,SAAQ,WAAU,QAAO,UAAS,WAAU,WAAU,YAAW,WAAU,UAAS,QAAO,SAAQ,UAAS,YAAW,SAAQ,WAAU,UAAS,YAAW,YAAW,WAAU,SAAQ,WAAU,QAAO,QAAO,YAAW,UAAS,YAAW,YAAW,WAAU,SAAQ,YAAW,QAAO,SAAQ,YAAW,YAAW,aAAY,YAAW,SAAQ,YAAW,SAAQ,WAAU,UAAS,WAAU,SAAQ,SAAQ,UAAS,WAAU,QAAO,WAAU,WAAU,YAAW,WAAU,WAAU,SAAQ,WAAU,UAAS,SAAQ,SAAQ,MAAK,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,SAAQ,UAAS,UAAS,WAAU,SAAQ,QAAO,SAAQ,UAAS,QAAO,SAAQ,UAAS,WAAU,YAAW,WAAU,YAAW,SAAQ,QAAO,SAAQ,QAAO,UAAS,SAAQ,UAAS,SAAQ,UAAS,UAAS,WAAU,UAAS,WAAU,WAAU,SAAQ,QAAO,WAAU,YAAW,SAAQ,WAAU,YAAW,UAAS,SAAQ,QAAO,SAAQ,UAAS,UAAS,WAAU,QAAO,SAAQ,UAAS,QAAO,SAAQ,UAAS,UAAS,QAAO,SAAQ,SAAQ,WAAU,UAAS,WAAU,YAAW,SAAQ,QAAO,SAAQ,UAAS,SAAQ,YAAW,SAAQ,UAAS,YAAW,WAAU,aAAY,aAAY,SAAQ,QAAO,SAAQ,YAAW,QAAO,WAAU,OAAM,QAAO,SAAQ,UAAS,SAAQ,YAAW,QAAO,WAAU,SAAQ,WAAU,QAAO,SAAQ,UAAS,WAAU,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,WAAU,WAAU,WAAU,YAAW,YAAW,SAAQ,YAAW,UAAS,WAAU,YAAW,YAAW,UAAS,UAAS,WAAU,UAAS,QAAO,WAAU,SAAQ,SAAQ,UAAS,WAAU,WAAU,WAAU,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,OAAM,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,YAAW,QAAO,YAAW,QAAO,WAAU,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,SAAQ,UAAS,UAAS,WAAU,YAAW,WAAU,SAAQ,SAAQ,SAAQ,QAAO,aAAY,WAAU,YAAW,QAAO,SAAQ,SAAQ,SAAQ,UAAS,QAAO,SAAQ,SAAQ,SAAQ,YAAW,SAAQ,UAAS,UAAS,YAAW,UAAS,WAAU,UAAS,SAAQ,UAAS,WAAU,UAAS,WAAU,UAAS,YAAW,YAAW,SAAQ,UAAS,UAAS,SAAQ,SAAQ,UAAS,UAAS,YAAW,YAAW,UAAS,SAAQ,UAAS,UAAS,SAAQ,QAAO,SAAQ,WAAU,SAAQ,SAAQ,QAAO,aAAY,UAAS,SAAQ,UAAS,UAAS,OAAM,QAAO,WAAU,QAAO,SAAQ,YAAW,YAAW,SAAQ,QAAO,SAAQ,aAAY,aAAY,YAAW,SAAQ,aAAY,aAAY,YAAW,SAAQ,UAAS,YAAW,WAAU,YAAW,WAAU,YAAW,SAAQ,UAAS,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,YAAW,SAAQ,UAAS,YAAW,WAAU,QAAO,SAAQ,OAAM,UAAS,QAAO,SAAQ,SAAQ,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,SAAQ,UAAS,SAAQ,UAAS,SAAQ,UAAS,UAAS,UAAS,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,YAAW,UAAS,SAAQ,SAAQ,UAAS,UAAS,SAAQ,QAAO,WAAU,YAAW,SAAQ,UAAS,WAAU,UAAS,SAAQ,WAAU,UAAS,UAAS,UAAS,WAAU,SAAQ,UAAS,SAAQ,UAAS,SAAQ,MAAK,QAAO,QAAO,SAAQ,YAAW,WAAU,SAAQ,OAAM,aAAY,aAAY,YAAW,YAAW,aAAY,UAAS,SAAQ,UAAS,SAAQ,SAAQ,OAAM,QAAO,UAAS,SAAQ,QAAO,UAAS,UAAS,SAAQ,QAAO,WAAU,YAAW,UAAS,WAAU,WAAU,UAAS,WAAU,UAAS,OAAM,SAAQ,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,YAAW,aAAY,aAAY,OAAM,QAAO,SAAQ,WAAU,WAAU,QAAO,WAAU,SAAQ,WAAU,QAAO,SAAQ,UAAS,UAAS,SAAQ,QAAO,WAAU,UAAS,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,UAAS,YAAW,WAAU,YAAW,YAAW,UAAS,WAAU,UAAS,WAAU,aAAY,WAAU,YAAW,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,OAAM,WAAU,WAAU,SAAQ,SAAQ,SAAQ,QAAO,WAAU,YAAW,SAAQ,UAAS,QAAO,SAAQ,QAAO,WAAU,SAAQ,QAAO,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,QAAO,WAAU,QAAO,UAAS,UAAS,UAAS,WAAU,QAAO,WAAU,YAAW,SAAQ,WAAU,WAAU,WAAU,SAAQ,YAAW,UAAS,YAAW,SAAQ,UAAS,WAAU,UAAS,YAAW,UAAS,WAAU,WAAU,YAAW,YAAW,SAAQ,aAAY,WAAU,UAAS,UAAS,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,SAAQ,SAAQ,UAAS,OAAM,QAAO,WAAU,SAAQ,UAAS,UAAS,WAAU,UAAS,QAAO,OAAM,UAAS,WAAU,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,UAAS,SAAQ,UAAS,UAAS,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,WAAU,SAAQ,SAAQ,UAAS,UAAS,WAAU,UAAS,SAAQ,WAAU,SAAQ,YAAW,SAAQ,YAAW,UAAS,WAAU,WAAU,YAAW,YAAW,SAAQ,UAAS,UAAS,SAAQ,UAAS,SAAQ,SAAQ,QAAO,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,OAAM,QAAO,SAAQ,SAAQ,UAAS,UAAS,OAAM,UAAS,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,SAAQ,OAAM,QAAO,SAAQ,SAAQ,SAAQ,UAAS,WAAU,UAAS,UAAS,SAAQ,SAAQ,WAAU,UAAS,WAAU,SAAQ,QAAO,UAAS,OAAM,QAAO,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,QAAO,UAAS,WAAU,UAAS,UAAS,SAAQ,QAAO,QAAO,YAAW,WAAU,QAAO,WAAU,WAAU,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,QAAO,SAAQ,OAAM,QAAO,SAAQ,UAAS,SAAQ,UAAS,QAAO,OAAM,QAAO,YAAW,WAAU,WAAU,UAAS,SAAQ,UAAS,QAAO,SAAQ,QAAO,UAAS,UAAS,SAAQ,QAAO,SAAQ,QAAO,SAAQ,SAAQ,UAAS,QAAO,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,UAAS,WAAU,WAAU,SAAQ,UAAS,UAAS,WAAU,WAAU,WAAU,QAAO,SAAQ,YAAW,YAAW,SAAQ,WAAU,WAAU,WAAU,UAAS,UAAS,SAAQ,SAAQ,YAAW,YAAW,SAAQ,UAAS,UAAS,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,OAAM,WAAU,UAAS,UAAS,aAAY,YAAW,MAAK,QAAO,QAAO,SAAQ,WAAU,SAAQ,YAAW,UAAS,WAAU,WAAU,UAAS,WAAU,UAAS,UAAS,SAAQ,YAAW,QAAO,YAAW,UAAS,UAAS,SAAQ,SAAQ,QAAO,UAAS,QAAO,QAAO,WAAU,WAAU,WAAU,WAAU,QAAO,OAAM,QAAO,SAAQ,SAAQ,OAAM,SAAQ,SAAQ,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,SAAQ,WAAU,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,WAAU,YAAW,UAAS,WAAU,YAAW,UAAS,SAAQ,OAAM,SAAQ,WAAU,SAAQ,QAAO,YAAW,WAAU,aAAY,SAAQ,UAAS,SAAQ,SAAQ,aAAY,aAAY,YAAW,YAAW,WAAU,YAAW,YAAW,WAAU,WAAU,WAAU,WAAU,SAAQ,UAAS,UAAS,WAAU,QAAO,OAAM,UAAS,OAAM,SAAQ,WAAU,YAAW,aAAY,aAAY,UAAS,SAAQ,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,SAAQ,aAAY,QAAO,SAAQ,UAAS,UAAS,YAAW,QAAO,WAAU,UAAS,SAAQ,UAAS,WAAU,WAAU,WAAU,YAAW,YAAW,YAAW,WAAU,WAAU,UAAS,SAAQ,WAAU,WAAU,QAAO,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,QAAO,WAAU,WAAU,YAAW,YAAW,YAAW,cAAa,cAAa,aAAY,SAAQ,UAAS,UAAS,WAAU,YAAW,SAAQ,UAAS,SAAQ,UAAS,WAAU,SAAQ,YAAW,WAAU,YAAW,aAAY,aAAY,cAAa,cAAa,cAAa,cAAa,aAAY,WAAU,SAAQ,YAAW,WAAU,UAAS,YAAW,SAAQ,UAAS,UAAS,SAAQ,UAAS,WAAU,cAAa,SAAQ,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,YAAW,YAAW,WAAU,aAAY,YAAW,UAAS,WAAU,SAAQ,aAAY,gBAAe,YAAW,eAAc,UAAS,WAAU,YAAW,aAAY,YAAW,YAAW,YAAW,UAAS,UAAS,WAAU,WAAU,YAAW,WAAU,SAAQ,UAAS,WAAU,UAAS,cAAa,SAAQ,UAAS,WAAU,WAAU,UAAS,WAAU,UAAS,QAAO,SAAQ,SAAQ,SAAQ,UAAS,YAAW,WAAU,SAAQ,WAAU,SAAQ,WAAU,WAAU,UAAS,WAAU,WAAU,WAAU,UAAS,UAAS,WAAU,SAAQ,UAAS,SAAQ,SAAQ,UAAS,SAAQ,UAAS,UAAS,YAAW,YAAW,UAAS,YAAW,UAAS,aAAY,SAAQ,YAAW,eAAc,UAAS,UAAS,YAAW,SAAQ,WAAU,UAAS,WAAU,WAAU,SAAQ,YAAW,QAAO,SAAQ,WAAU,YAAW,YAAW,aAAY,YAAW,aAAY,YAAW,UAAS,SAAQ,WAAU,WAAU,aAAY,WAAU,aAAY,YAAW,SAAQ,UAAS,SAAQ,WAAU,YAAW,YAAW,WAAU,WAAU,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,SAAQ,SAAQ,WAAU,YAAW,WAAU,WAAU,WAAU,WAAU,YAAW,SAAQ,SAAQ,OAAM,QAAO,SAAQ,UAAS,QAAO,OAAM,YAAW,QAAO,QAAO,SAAQ,UAAS,WAAU,SAAQ,YAAW,OAAM,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,UAAS,WAAU,aAAY,OAAM,OAAM,QAAO,WAAU,WAAU,WAAU,YAAW,UAAS,SAAQ,UAAS,WAAU,YAAW,UAAS,WAAU,WAAU,UAAS,aAAY,cAAa,aAAY,YAAW,WAAU,WAAU,UAAS,WAAU,SAAQ,SAAQ,aAAY,UAAS,WAAU,aAAY,YAAW,SAAQ,WAAU,WAAU,UAAS,WAAU,UAAS,UAAS,SAAQ,YAAW,SAAQ,UAAS,SAAQ,YAAW,aAAY,WAAU,YAAW,UAAS,WAAU,WAAU,SAAQ,WAAU,QAAO,SAAQ,SAAQ,WAAU,WAAU,SAAQ,UAAS,YAAW,YAAW,UAAS,aAAY,WAAU,YAAW,WAAU,WAAU,WAAU,SAAQ,UAAS,SAAQ,QAAO,OAAM,WAAU,YAAW,cAAa,cAAa,aAAY,UAAS,UAAS,WAAU,aAAY,aAAY,WAAU,YAAW,SAAQ,UAAS,SAAQ,SAAQ,UAAS,YAAW,WAAU,aAAY,WAAU,OAAM,WAAU,WAAU,UAAS,YAAW,aAAY,SAAQ,SAAQ,aAAY,UAAS,aAAY,SAAQ,UAAS,QAAO,OAAM,QAAO,SAAQ,SAAQ,WAAU,WAAU,WAAU,SAAQ,eAAc,SAAQ,SAAQ,UAAS,WAAU,SAAQ,SAAQ,WAAU,QAAO,WAAU,aAAY,aAAY,SAAQ,WAAU,aAAY,YAAW,WAAU,WAAU,UAAS,WAAU,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,WAAU,YAAW,aAAY,WAAU,SAAQ,SAAQ,QAAO,UAAS,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,UAAS,UAAS,WAAU,QAAO,UAAS,UAAS,UAAS,WAAU,aAAY,YAAW,UAAS,SAAQ,WAAU,SAAQ,WAAU,SAAQ,SAAQ,WAAU,UAAS,QAAO,aAAY,SAAQ,UAAS,UAAS,UAAS,YAAW,QAAO,SAAQ,WAAU,UAAS,WAAU,SAAQ,WAAU,SAAQ,SAAQ,UAAS,WAAU,UAAS,UAAS,QAAO,UAAS,UAAS,SAAQ,UAAS,UAAS,QAAO,SAAQ,UAAS,OAAM,QAAO,WAAU,SAAQ,UAAS,UAAS,SAAQ,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,UAAS,YAAW,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,QAAO,QAAO,UAAS,OAAM,QAAO,UAAS,WAAU,WAAU,YAAW,YAAW,WAAU,WAAU,YAAW,YAAW,YAAW,aAAY,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,UAAS,UAAS,SAAQ,SAAQ,QAAO,SAAQ,SAAQ,UAAS,SAAQ,WAAU,UAAS,QAAO,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,SAAQ,SAAQ,SAAQ,UAAS,WAAU,YAAW,SAAQ,UAAS,SAAQ,SAAQ,UAAS,UAAS,WAAU,aAAY,UAAS,YAAW,YAAW,WAAU,YAAW,QAAO,QAAO,SAAQ,UAAS,aAAY,WAAU,QAAO,WAAU,WAAU,YAAW,YAAW,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,QAAO,SAAQ,SAAQ,QAAO,WAAU,SAAQ,UAAS,UAAS,WAAU,UAAS,SAAQ,QAAO,UAAS,SAAQ,UAAS,QAAO,QAAO,SAAQ,QAAO,SAAQ,SAAQ,UAAS,QAAO,SAAQ,UAAS,UAAS,UAAS,UAAS,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,SAAQ,SAAQ,WAAU,SAAQ,UAAS,YAAW,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,OAAM,UAAS,QAAO,QAAO,WAAU,SAAQ,YAAW,UAAS,UAAS,QAAO,SAAQ,QAAO,QAAO,SAAQ,UAAS,WAAU,WAAU,UAAS,UAAS,SAAQ,QAAO,QAAO,WAAU,WAAU,WAAU,WAAU,OAAM,UAAS,UAAS,UAAS,UAAS,UAAS,QAAO,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAO,QAAO,UAAS,YAAW,QAAO,WAAU,WAAU,WAAU,WAAU,WAAU,QAAO,SAAQ,UAAS,OAAM,UAAS,YAAW,WAAU,SAAQ,UAAS,SAAQ,WAAU,UAAS,SAAQ,SAAQ,WAAU,YAAW,OAAM,YAAW,WAAU,WAAU,YAAW,YAAW,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,YAAW,YAAW,SAAQ,UAAS,WAAU,WAAU,WAAU,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,YAAW,OAAM,UAAS,SAAQ,UAAS,SAAQ,OAAM,YAAW,YAAW,SAAQ,UAAS,SAAQ,QAAO,UAAS,QAAO,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,WAAU,SAAQ,UAAS,OAAM,QAAO,SAAQ,WAAU,cAAa,YAAW,cAAa,cAAa,WAAU,WAAU,WAAU,SAAQ,UAAS,UAAS,QAAO,WAAU,YAAW,YAAW,cAAa,UAAS,YAAW,WAAU,WAAU,UAAS,aAAY,UAAS,UAAS,YAAW,WAAU,WAAU,UAAS,OAAM,QAAO,YAAW,aAAY,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,aAAY,QAAO,SAAQ,UAAS,QAAO,UAAS,aAAY,aAAY,WAAU,OAAM,YAAW,SAAQ,SAAQ,QAAO,WAAU,WAAU,WAAU,SAAQ,UAAS,YAAW,aAAY,YAAW,WAAU,UAAS,WAAU,YAAW,OAAM,UAAS,OAAM,QAAO,WAAU,YAAW,aAAY,SAAQ,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,WAAU,QAAO,SAAQ,UAAS,WAAU,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,UAAS,WAAU,SAAQ,YAAW,UAAS,WAAU,SAAQ,SAAQ,SAAQ,OAAM,WAAU,QAAO,SAAQ,WAAU,YAAW,OAAM,QAAO,YAAW,QAAO,UAAS,WAAU,WAAU,UAAS,WAAU,YAAW,OAAM,SAAQ,SAAQ,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,UAAS,SAAQ,SAAQ,SAAQ,QAAO,QAAO,SAAQ,UAAS,UAAS,QAAO,SAAQ,UAAS,WAAU,SAAQ,UAAS,QAAO,SAAQ,UAAS,OAAM,SAAQ,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,WAAU,SAAQ,UAAS,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,UAAS,QAAO,SAAQ,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,QAAO,QAAO,QAAO,QAAO,WAAU,QAAO,UAAS,QAAO,SAAQ,UAAS,UAAS,SAAQ,UAAS,UAAS,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,UAAS,WAAU,YAAW,aAAY,aAAY,WAAU,QAAO,SAAQ,QAAO,WAAU,YAAW,YAAW,YAAW,QAAO,QAAO,SAAQ,UAAS,QAAO,UAAS,UAAS,WAAU,QAAO,QAAO,WAAU,SAAQ,UAAS,SAAQ,SAAQ,WAAU,UAAS,SAAQ,WAAU,QAAO,QAAO,SAAQ,QAAO,OAAM,QAAO,WAAU,aAAY,aAAY,YAAW,WAAU,WAAU,YAAW,aAAY,aAAY,YAAW,WAAU,YAAW,YAAW,YAAW,UAAS,WAAU,WAAU,QAAO,WAAU,YAAW,YAAW,WAAU,WAAU,YAAW,WAAU,WAAU,aAAY,aAAY,YAAW,aAAY,UAAS,WAAU,WAAU,YAAW,SAAQ,UAAS,UAAS,UAAS,YAAW,QAAO,OAAM,QAAO,UAAS,UAAS,UAAS,WAAU,WAAU,QAAO,SAAQ,UAAS,QAAO,OAAM,WAAU,WAAU,YAAW,WAAU,WAAU,QAAO,UAAS,WAAU,WAAU,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,QAAO,WAAU,QAAO,WAAU,YAAW,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,QAAO,UAAS,UAAS,SAAQ,WAAU,SAAQ,QAAO,WAAU,SAAQ,SAAQ,UAAS,OAAM,WAAU,UAAS,SAAQ,UAAS,SAAQ,YAAW,aAAY,UAAS,UAAS,UAAS,OAAM,YAAW,UAAS,WAAU,SAAQ,SAAQ,SAAQ,UAAS,UAAS,SAAQ,UAAS,YAAW,YAAW,QAAO,YAAW,WAAU,SAAQ,YAAW,SAAQ,UAAS,UAAS,WAAU,QAAO,UAAS,UAAS,UAAS,UAAS,SAAQ,YAAW,UAAS,WAAU,UAAS,SAAQ,WAAU,YAAW,QAAO,SAAQ,QAAO,QAAO,UAAS,UAAS,aAAY,SAAQ,SAAQ,UAAS,WAAU,UAAS,SAAQ,SAAQ,SAAQ,QAAO,WAAU,UAAS,UAAS,QAAO,UAAS,UAAS,UAAS,UAAS,SAAQ,UAAS,WAAU,aAAY,WAAU,WAAU,UAAS,SAAQ,SAAQ,UAAS,UAAS,WAAU,WAAU,WAAU,UAAS,UAAS,WAAU,SAAQ,UAAS,SAAQ,UAAS,WAAU,SAAQ,UAAS,YAAW,YAAW,YAAW,UAAS,WAAU,WAAU,UAAS,SAAQ,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,WAAU,WAAU,YAAW,UAAS,UAAS,QAAO,SAAQ,UAAS,YAAW,WAAU,UAAS,WAAU,UAAS,kBAAiB,WAAU,QAAO,SAAQ,WAAU,UAAS,UAAS,UAAS,UAAS,SAAQ,WAAU,UAAS,WAAU,UAAS,SAAQ,QAAO,UAAS,SAAQ,UAAS,WAAU,YAAW,YAAW,UAAS,WAAU,UAAS,UAAS,UAAS,SAAQ,QAAO,SAAQ,WAAU,YAAW,YAAW,WAAU,YAAW,YAAW,aAAY,SAAQ,UAAS,OAAM,UAAS,SAAQ,UAAS,SAAQ,WAAU,WAAU,WAAU,UAAS,SAAQ,WAAU,WAAU,WAAU,WAAU,YAAW,UAAS,QAAO,UAAS,SAAQ,WAAU,UAAS,UAAS,UAAS,UAAS,aAAY,WAAU,UAAS,WAAU,SAAQ,WAAU,UAAS,UAAS,UAAS,SAAQ,UAAS,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,UAAS,WAAU,SAAQ,SAAQ,UAAS,SAAQ,UAAS,UAAS,aAAY,UAAS,WAAU,SAAQ,UAAS,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,QAAO,UAAS,YAAW,WAAU,SAAQ,SAAQ,YAAW,YAAW,YAAW,UAAS,WAAU,UAAS,UAAS,YAAW,YAAW,aAAY,cAAa,aAAY,UAAS,WAAU,YAAW,UAAS,WAAU,WAAU,YAAW,SAAQ,UAAS,WAAU,UAAS,OAAM,WAAU,SAAQ,QAAO,QAAO,SAAQ,YAAW,SAAQ,UAAS,aAAY,UAAS,WAAU,YAAW,WAAU,WAAU,QAAO,SAAQ,QAAO,UAAS,WAAU,WAAU,WAAU,QAAO,SAAQ,QAAO,SAAQ,UAAS,WAAU,WAAU,SAAQ,SAAQ,WAAU,UAAS,UAAS,WAAU,YAAW,SAAQ,UAAS,YAAW,SAAQ,UAAS,WAAU,SAAQ,SAAQ,UAAS,UAAS,UAAS,YAAW,SAAQ,SAAQ,UAAS,SAAQ,UAAS,WAAU,WAAU,UAAS,QAAO,UAAS,SAAQ,WAAU,SAAQ,UAAS,SAAQ,WAAU,SAAQ,QAAO,SAAQ,UAAS,SAAQ,UAAS,QAAO,SA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",
47
- "debugId": "F550F36B3F910A4364756E2164756E21",
46
+ "mappings": "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S,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,WAAU,SAAQ,eAAc,WAAU,WAAU,OAAM,UAAS,SAAQ,UAAS,SAAQ,WAAU,UAAS,SAAQ,WAAU,OAAM,UAAS,SAAQ,WAAU,YAAW,QAAO,UAAS,UAAS,WAAU,WAAU,SAAQ,UAAS,SAAQ,WAAU,SAAQ,WAAU,WAAU,WAAU,UAAS,UAAS,UAAS,SAAQ,WAAU,QAAO,WAAU,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,WAAU,SAAQ,UAAS,UAAS,YAAW,WAAU,UAAS,WAAU,SAAQ,UAAS,WAAU,UAAS,WAAU,UAAS,UAAS,UAAS,WAAU,WAAU,WAAU,WAAU,YAAW,SAAQ,UAAS,UAAS,WAAU,YAAW,SAAQ,UAAS,WAAU,YAAW,aAAY,aAAY,YAAW,YAAW,UAAS,cAAa,WAAU,WAAU,WAAU,UAAS,QAAO,SAAQ,cAAa,UAAS,WAAU,YAAW,UAAS,WAAU,WAAU,YAAW,YAAW,aAAY,WAAU,YAAW,YAAW,SAAQ,UAAS,SAAQ,UAAS,YAAW,WAAU,SAAQ,QAAO,SAAQ,SAAQ,YAAW,SAAQ,QAAO,SAAQ,QAAO,aAAY,aAAY,aAAY,cAAa,UAAS,SAAQ,UAAS,aAAY,SAAQ,YAAW,QAAO,YAAW,SAAQ,aAAY,aAAY,SAAQ,UAAS,YAAW,aAAY,aAAY,SAAQ,UAAS,YAAW,YAAW,WAAU,YAAW,WAAU,SAAQ,aAAY,QAAO,SAAQ,UAAS,YAAW,UAAS,UAAS,WAAU,YAAW,QAAO,QAAO,SAAQ,WAAU,SAAQ,UAAS,WAAU,WAAU,WAAU,UAAS,QAAO,QAAO,UAAS,WAAU,WAAU,YAAW,aAAY,aAAY,YAAW,aAAY,SAAQ,SAAQ,UAAS,WAAU,UAAS,WAAU,WAAU,SAAQ,SAAQ,SAAQ,QAAO,UAAS,WAAU,WAAU,UAAS,WAAU,aAAY,UAAS,UAAS,UAAS,YAAW,YAAW,WAAU,WAAU,UAAS,YAAW,YAAW,YAAW,YAAW,YAAW,WAAU,aAAY,aAAY,YAAW,aAAY,YAAW,YAAW,YAAW,YAAW,SAAQ,UAAS,YAAW,WAAU,WAAU,WAAU,WAAU,UAAS,QAAO,SAAQ,UAAS,SAAQ,aAAY,WAAU,WAAU,UAAS,YAAW,aAAY,UAA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AS,SAAQ,UAAS,SAAQ,UAAS,UAAS,UAAS,QAAO,YAAW,YAAW,WAAU,YAAW,YAAW,YAAW,WAAU,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,UAAS,QAAO,QAAO,OAAM,QAAO,SAAQ,UAAS,SAAQ,OAAM,UAAS,SAAQ,SAAQ,OAAM,SAAQ,UAAS,WAAU,SAAQ,SAAQ,UAAS,YAAW,SAAQ,SAAQ,UAAS,SAAQ,UAAS,YAAW,UAAS,WAAU,YAAW,SAAQ,UAAS,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,UAAS,UAAS,QAAO,SAAQ,YAAW,QAAO,SAAQ,UAAS,YAAW,UAAS,UAAS,OAAM,QAAO,UAAS,SAAQ,OAAM,QAAO,SAAQ,QAAO,OAAM,QAAO,WAAU,QAAO,OAAM,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,SAAQ,QAAO,UAAS,OAAM,SAAQ,UAAS,SAAQ,UAAS,SAAQ,UAAS,UAAS,aAAY,UAAS,UAAS,SAAQ,SAAQ,UAAS,WAAU,aAAY,aAAY,WAAU,YAAW,YAAW,WAAU,SAAQ,SAAQ,SAAQ,SAAQ,WAAU,YAAW,YAAW,SAAQ,WAAU,WAAU,YAAW,QAAO,YAAW,YAAW,UAAS,QAAO,UAAS,WAAU,SAAQ,YAAW,aAAY,cAAa,SAAQ,UAAS,UAAS,SAAQ,SAAQ,YAAW,aAAY,QAAO,QAAO,QAAO,YAAW,QAAO,SAAQ,UAAS,WAAU,QAAO,SAAQ,WAAU,QAAO,SAAQ,UAAS,UAAS,QAAO,UAAS,UAAS,UAAS,UAAS,WAAU,SAAQ,QAAO,WAAU,QAAO,SAAQ,SAAQ,QAAO,SAAQ,YAAW,WAAU,QAAO,QAAO,UAAS,UAAS,UAAS,UAAS,QAAO,SAAQ,UAAS,UAAS,UAAS,UAAS,MAAK,OAAM,UAAS,UAAS,UAAS,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,UAAS,SAAQ,UAAS,UAAS,WAAU,SAAQ,SAAQ,UAAS,WAAU,QAAO,WAAU,YAAW,WAAU,YAAW,aAAY,YAAW,SAAQ,QAAO,SAAQ,QAAO,SAAQ,WAAU,SAAQ,UAAS,YAAW,QAAO,UAAS,cAAa,UAAS,aAAY,WAAU,WAAU,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,SAAQ,QAAO,SAAQ,SAAQ,UAAS,QAAO,cAAa,cAAa,UAAS,WAAU,WAAU,QAAO,YAAW,WAAU,aAAY,SAAQ,QAAO,QAAO,WAAU,QAAO,aAAY,QAAO,SAAQ,QAAO,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,UAAS,YAAW,cAAa,SAAQ,WAAU,WAAU,YAAW,YAAW,WAAU,SAAQ,QAAO,QAAO,SAAQ,QAAO,UAAS,WAAU,WAAU,UAAS,QAAO,WAAU,UAAS,YAAW,YAAW,OAAM,WAAU,aAAY,aAAY,cAAa,cAAa,UAAS,UAAS,OAAM,WAAU,WAAU,WAAU,UAAS,QAAO,QAAO,SAAQ,UAAS,SAAQ,QAAO,OAAM,QAAO,SAAQ,aAAY,OAAM,SAAQ,SAAQ,UAAS,OAAM,aAAY,WAAU,UAAS,SAAQ,YAAW,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,UAAS,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,YAAW,YAAW,QAAO,SAAQ,UAAS,OAAM,UAAS,QAAO,WAAU,UAAS,SAAQ,SAAQ,UAAS,YAAW,UAAS,WAAU,YAAW,UAAS,WAAU,YAAW,WAAU,UAAS,WAAU,UAAS,UAAS,WAAU,WAAU,cAAa,cAAa,QAAO,YAAW,YAAW,cAAa,SAAQ,OAAM,SAAQ,UAAS,UAAS,WAAU,YAAW,QAAO,UAAS,SAAQ,UAAS,WAAU,QAAO,SAAQ,UAAS,YAAW,YAAW,SAAQ,aAAY,OAAM,QAAO,SAAQ,YAAW,SAAQ,YAAW,YAAW,aAAY,aAAY,YAAW,YAAW,SAAQ,UAAS,WAAU,UAAS,WAAU,YAAW,UAAS,UAAS,WAAU,UAAS,SAAQ,UAAS,WAAU,UAAS,QAAO,QAAO,YAAW,WAAU,aAAY,YAAW,aAAY,aAAY,aAAY,YAAW,SAAQ,WAAU,UAAS,UAAS,WAAU,UAAS,UAAS,QAAO,SAAQ,UAAS,WAAU,UAAS,YAAW,aAAY,cAAa,cAAa,SAAQ,UAAS,UAAS,YAAW,UAAS,UAAS,cAAa,UAAS,UAAS,SAAQ,UAAS,SAAQ,QAAO,SAAQ,WAAU,YAAW,YAAW,aAAY,aAAY,cAAa,WAAU,QAAO,OAAM,QAAO,QAAO,QAAO,UAAS,WAAU,UAAS,YAAW,SAAQ,SAAQ,aAAY,OAAM,QAAO,SAAQ,SAAQ,SAAQ,WAAU,WAAU,UAAS,SAAQ,QAAO,QAAO,UAAS,aAAY,WAAU,SAAQ,SAAQ,SAAQ,UAAS,YAAW,SAAQ,YAAW,YAAW,UAAS,cAAa,cAAa,YAAW,YAAW,aAAY,aAAY,WAAU,aAAY,cAAa,cAAa,WAAU,YAAW,YAAW,WAAU,aAAY,SAAQ,cAAa,QAAO,YAAW,YAAW,aAAY,WAAU,YAAW,WAAU,SAAQ,UAAS,YAAW,SAAQ,QAAO,SAAQ,SAAQ,UAAS,WAAU,YAAW,YAAW,aAAY,SAAQ,YAAW,SAAQ,WAAU,UAAS,QAAO,YAAW,YAAW,cAAa,cAAa,SAAQ,aAAY,QAAO,UAAS,SAAQ,WAAU,UAAS,YAAW,SAAQ,QAAO,WAAU,WAAU,UAAS,SAAQ,UAAS,YAAW,SAAQ,WAAU,YAAW,SAAQ,WAAU,UAAS,UAAS,WAAU,WAAU,YAAW,UAAS,aAAY,YAAW,UAAS,QAAO,SAAQ,UAAS,SAAQ,QAAO,UAAS,WAAU,SAAQ,UAAS,WAAU,WAAU,SAAQ,UAAS,YAAW,YAAW,SAAQ,QAAO,UAAS,UAAS,WAAU,QAAO,UAAS,SAAQ,aAAY,SAAQ,UAAS,UAAS,WAAU,SAAQ,SAAQ,UAAS,UAAS,SAAQ,UAAS,YAAW,QAAO,UAAS,UAAS,SAAQ,SAAQ,UAAS,YAAW,SAAQ,UAAS,WAAU,UAAS,UAAS,SAAQ,YAAW,WAAU,aAAY,aAAY,UAAS,aAAY,OAAM,YAAW,eAAc,aAAY,UAAS,WAAU,OAAM,WAAU,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,QAAO,aAAY,aAAY,aAAY,WAAU,YAAW,YAAW,UAAS,WAAU,UAAS,WAAU,WAAU,QAAO,WAAU,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,WAAU,SAAQ,QAAO,SAAQ,YAAW,UAAS,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,SAAQ,UAAS,UAAS,SAAQ,SAAQ,WAAU,UAAS,SAAQ,UAAS,YAAW,YAAW,WAAU,SAAQ,UAAS,WAAU,YAAW,aAAY,aAAY,WAAU,YAAW,SAAQ,UAAS,SAAQ,UAAS,SAAQ,SAAQ,WAAU,QAAO,SAAQ,SAAQ,UAAS,QAAO,UAAS,WAAU,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,SAAQ,mBAAkB,UAAS,UAAS,WAAU,SAAQ,SAAQ,SAAQ,WAAU,SAAQ,SAAQ,YAAW,SAAQ,UAAS,YAAW,aAAY,aAAY,aAAY,aAAY,UAAS,WAAU,WAAU,YAAW,YAAW,SAAQ,UAAS,UAAS,WAAU,UAAS,SAAQ,UAAS,SAAQ,UAAS,SAAQ,aAAY,cAAa,SAAQ,cAAa,cAAa,SAAQ,WAAU,YAAW,SAAQ,SAAQ,UAAS,SAAQ,cAAa,aAAY,SAAQ,SAAQ,WAAU,QAAO,WAAU,YAAW,aAAY,SAAQ,YAAW,aAAY,aAAY,cAAa,cAAa,SAAQ,UAAS,SAAQ,QAAO,OAAM,UAAS,WAAU,WAAU,SAAQ,UAAS,UAAS,UAAS,UAAS,SAAQ,SAAQ,QAAO,QAAO,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,UAAS,WAAU,WAAU,OAAM,UAAS,QAAO,WAAU,UAAS,QAAO,QAAO,YAAW,YAAW,QAAO,YAAW,YAAW,SAAQ,UAAS,WAAU,QAAO,WAAU,YAAW,QAAO,WAAU,OAAM,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,QAAO,OAAM,UAAS,aAAY,YAAW,YAAW,WAAU,YAAW,WAAU,WAAU,QAAO,UAAS,QAAO,SAAQ,QAAO,SAAQ,UAAS,QAAO,UAAS,SAAQ,OAAM,UAAS,WAAU,WAAU,WAAU,YAAW,YAAW,YAAW,SAAQ,UAAS,WAAU,WAAU,cAAa,eAAc,SAAQ,UAAS,UAAS,aAAY,cAAa,aAAY,cAAa,eAAc,eAAc,aAAY,aAAY,UAAS,WAAU,WAAU,QAAO,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,UAAS,OAAM,QAAO,UAAS,UAAS,SAAQ,QAAO,UAAS,YAAW,UAAS,SAAQ,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,SAAQ,UAAS,WAAU,WAAU,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,UAAS,UAAS,SAAQ,UAAS,SAAQ,SAAQ,UAAS,YAAW,SAAQ,QAAO,YAAW,YAAW,cAAa,cAAa,WAAU,UAAS,WAAU,WAAU,SAAQ,UAAS,SAAQ,WAAU,UAAS,QAAO,SAAQ,SAAQ,YAAW,YAAW,UAAS,WAAU,UAAS,UAAS,aAAY,WAAU,YAAW,WAAU,UAAS,SAAQ,UAAS,WAAU,UAAS,SAAQ,OAAM,QAAO,SAAQ,WAAU,QAAO,UAAS,WAAU,WAAU,YAAW,WAAU,UAAS,QAAO,SAAQ,UAAS,YAAW,SAAQ,WAAU,UAAS,YAAW,YAAW,WAAU,SAAQ,WAAU,QAAO,QAAO,YAAW,UAAS,YAAW,YAAW,WAAU,SAAQ,YAAW,QAAO,SAAQ,YAAW,YAAW,aAAY,YAAW,SAAQ,YAAW,SAAQ,WAAU,UAAS,WAAU,SAAQ,SAAQ,UAAS,WAAU,QAAO,WAAU,WAAU,YAAW,WAAU,WAAU,SAAQ,WAAU,UAAS,SAAQ,SAAQ,MAAK,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,SAAQ,UAAS,UAAS,WAAU,SAAQ,QAAO,SAAQ,UAAS,QAAO,SAAQ,UAAS,WAAU,YAAW,WAAU,YAAW,SAAQ,QAAO,SAAQ,QAAO,UAAS,SAAQ,UAAS,SAAQ,UAAS,UAAS,WAAU,UAAS,WAAU,WAAU,SAAQ,QAAO,WAAU,YAAW,SAAQ,WAAU,YAAW,UAAS,SAAQ,QAAO,SAAQ,UAAS,UAAS,WAAU,QAAO,SAAQ,UAAS,QAAO,SAAQ,UAAS,UAAS,QAAO,SAAQ,SAAQ,WAAU,UAAS,WAAU,YAAW,SAAQ,QAAO,SAAQ,UAAS,SAAQ,YAAW,SAAQ,UAAS,YAAW,WAAU,aAAY,aAAY,SAAQ,QAAO,SAAQ,YAAW,QAAO,WAAU,OAAM,QAAO,SAAQ,UAAS,SAAQ,YAAW,QAAO,WAAU,SAAQ,WAAU,QAAO,SAAQ,UAAS,WAAU,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,WAAU,WAAU,WAAU,YAAW,YAAW,SAAQ,YAAW,UAAS,WAAU,YAAW,YAAW,UAAS,UAAS,WAAU,UAAS,QAAO,WAAU,SAAQ,SAAQ,UAAS,WAAU,WAAU,WAAU,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,OAAM,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,YAAW,QAAO,YAAW,QAAO,WAAU,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,SAAQ,UAAS,UAAS,WAAU,YAAW,WAAU,SAAQ,SAAQ,SAAQ,QAAO,aAAY,WAAU,YAAW,QAAO,SAAQ,SAAQ,SAAQ,UAAS,QAAO,SAAQ,SAAQ,SAAQ,YAAW,SAAQ,UAAS,UAAS,YAAW,UAAS,WAAU,UAAS,SAAQ,UAAS,WAAU,UAAS,WAAU,UAAS,YAAW,YAAW,SAAQ,UAAS,UAAS,SAAQ,SAAQ,UAAS,UAAS,YAAW,YAAW,UAAS,SAAQ,UAAS,UAAS,SAAQ,QAAO,SAAQ,WAAU,SAAQ,SAAQ,QAAO,aAAY,UAAS,SAAQ,UAAS,UAAS,OAAM,QAAO,WAAU,QAAO,SAAQ,YAAW,YAAW,SAAQ,QAAO,SAAQ,aAAY,aAAY,YAAW,SAAQ,aAAY,aAAY,YAAW,SAAQ,UAAS,YAAW,WAAU,YAAW,WAAU,YAAW,SAAQ,UAAS,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,YAAW,SAAQ,UAAS,YAAW,WAAU,QAAO,SAAQ,OAAM,UAAS,QAAO,SAAQ,SAAQ,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,SAAQ,UAAS,SAAQ,UAAS,SAAQ,UAAS,UAAS,UAAS,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,YAAW,UAAS,SAAQ,SAAQ,UAAS,UAAS,SAAQ,QAAO,WAAU,YAAW,SAAQ,UAAS,WAAU,UAAS,SAAQ,WAAU,UAAS,UAAS,UAAS,WAAU,SAAQ,UAAS,SAAQ,UAAS,SAAQ,MAAK,QAAO,QAAO,SAAQ,YAAW,WAAU,SAAQ,OAAM,aAAY,aAAY,YAAW,YAAW,aAAY,UAAS,SAAQ,UAAS,SAAQ,SAAQ,OAAM,QAAO,UAAS,SAAQ,QAAO,UAAS,UAAS,SAAQ,QAAO,WAAU,YAAW,UAAS,WAAU,WAAU,UAAS,WAAU,UAAS,OAAM,SAAQ,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,YAAW,aAAY,aAAY,OAAM,QAAO,SAAQ,WAAU,WAAU,QAAO,WAAU,SAAQ,WAAU,QAAO,SAAQ,UAAS,UAAS,SAAQ,QAAO,WAAU,UAAS,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,UAAS,YAAW,WAAU,YAAW,YAAW,UAAS,WAAU,UAAS,WAAU,aAAY,WAAU,YAAW,QAAO,QAAO,SAAQ,SAAQ,UAAS,UAAS,OAAM,WAAU,WAAU,SAAQ,SAAQ,SAAQ,QAAO,WAAU,YAAW,SAAQ,UAAS,QAAO,SAAQ,QAAO,WAAU,SAAQ,QAAO,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,QAAO,WAAU,QAAO,UAAS,UAAS,UAAS,WAAU,QAAO,WAAU,YAAW,SAAQ,WAAU,WAAU,WAAU,SAAQ,YAAW,UAAS,YAAW,SAAQ,UAAS,WAAU,UAAS,YAAW,UAAS,WAAU,WAAU,YAAW,YAAW,SAAQ,aAAY,WAAU,UAAS,UAAS,UAAS,WAAU,WAAU,UAAS,WAAU,WAAU,SAAQ,SAAQ,UAAS,OAAM,QAAO,WAAU,SAAQ,UAAS,UAAS,WAAU,UAAS,QAAO,OAAM,UAAS,WAAU,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,UAAS,SAAQ,UAAS,UAAS,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,WAAU,SAAQ,SAAQ,UAAS,UAAS,WAAU,UAAS,SAAQ,WAAU,SAAQ,YAAW,SAAQ,YAAW,UAAS,WAAU,WAAU,YAAW,YAAW,SAAQ,UAAS,UAAS,SAAQ,UAAS,SAAQ,SAAQ,QAAO,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,OAAM,QAAO,SAAQ,SAAQ,UAAS,UAAS,OAAM,UAAS,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,SAAQ,OAAM,QAAO,SAAQ,SAAQ,SAAQ,UAAS,WAAU,UAAS,UAAS,SAAQ,SAAQ,WAAU,UAAS,WAAU,SAAQ,QAAO,UAAS,OAAM,QAAO,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,QAAO,UAAS,WAAU,UAAS,UAAS,SAAQ,QAAO,QAAO,YAAW,WAAU,QAAO,WAAU,WAAU,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,QAAO,SAAQ,OAAM,QAAO,SAAQ,UAAS,SAAQ,UAAS,QAAO,OAAM,QAAO,YAAW,WAAU,WAAU,UAAS,SAAQ,UAAS,QAAO,SAAQ,QAAO,UAAS,UAAS,SAAQ,QAAO,SAAQ,QAAO,SAAQ,SAAQ,UAAS,QAAO,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,UAAS,WAAU,WAAU,SAAQ,UAAS,UAAS,WAAU,WAAU,WAAU,QAAO,SAAQ,YAAW,YAAW,SAAQ,WAAU,WAAU,WAAU,UAAS,UAAS,SAAQ,SAAQ,YAAW,YAAW,SAAQ,UAAS,UAAS,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,OAAM,WAAU,UAAS,UAAS,aAAY,YAAW,MAAK,QAAO,QAAO,SAAQ,WAAU,SAAQ,YAAW,UAAS,WAAU,WAAU,UAAS,WAAU,UAAS,UAAS,SAAQ,YAAW,QAAO,YAAW,UAAS,UAAS,SAAQ,SAAQ,QAAO,UAAS,QAAO,QAAO,WAAU,WAAU,WAAU,WAAU,QAAO,OAAM,QAAO,SAAQ,SAAQ,OAAM,SAAQ,SAAQ,UAAS,WAAU,WAAU,WAAU,WAAU,SAAQ,SAAQ,WAAU,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,WAAU,YAAW,UAAS,WAAU,YAAW,UAAS,SAAQ,OAAM,SAAQ,WAAU,SAAQ,QAAO,YAAW,WAAU,aAAY,SAAQ,UAAS,SAAQ,SAAQ,aAAY,aAAY,YAAW,YAAW,WAAU,YAAW,YAAW,WAAU,WAAU,WAAU,WAAU,SAAQ,UAAS,UAAS,WAAU,QAAO,OAAM,UAAS,OAAM,SAAQ,WAAU,YAAW,aAAY,aAAY,UAAS,SAAQ,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,SAAQ,aAAY,QAAO,SAAQ,UAAS,UAAS,YAAW,QAAO,WAAU,UAAS,SAAQ,UAAS,WAAU,WAAU,WAAU,YAAW,YAAW,YAAW,WAAU,WAAU,UAAS,SAAQ,WAAU,WAAU,QAAO,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,QAAO,WAAU,WAAU,YAAW,YAAW,YAAW,cAAa,cAAa,aAAY,SAAQ,UAAS,UAAS,WAAU,YAAW,SAAQ,UAAS,SAAQ,UAAS,WAAU,SAAQ,YAAW,WAAU,YAAW,aAAY,aAAY,cAAa,cAAa,cAAa,cAAa,aAAY,WAAU,SAAQ,YAAW,WAAU,UAAS,YAAW,SAAQ,UAAS,UAAS,SAAQ,UAAS,WAAU,cAAa,SAAQ,QAAO,SAAQ,UAAS,UAAS,WAAU,WAAU,YAAW,YAAW,WAAU,aAAY,YAAW,UAAS,WAAU,SAAQ,aAAY,gBAAe,YAAW,eAAc,UAAS,WAAU,YAAW,aAAY,YAAW,YAAW,YAAW,UAAS,UAAS,WAAU,WAAU,YAAW,WAAU,SAAQ,UAAS,WAAU,UAAS,cAAa,SAAQ,UAAS,WAAU,WAAU,UAAS,WAAU,UAAS,QAAO,SAAQ,SAAQ,SAAQ,UAAS,YAAW,WAAU,SAAQ,WAAU,SAAQ,WAAU,WAAU,UAAS,WAAU,WAAU,WAAU,UAAS,UAAS,WAAU,SAAQ,UAAS,SAAQ,SAAQ,UAAS,SAAQ,UAAS,UAAS,YAAW,YAAW,UAAS,YAAW,UAAS,aAAY,SAAQ,YAAW,eAAc,UAAS,UAAS,YAAW,SAAQ,WAAU,UAAS,WAAU,WAAU,SAAQ,YAAW,QAAO,SAAQ,WAAU,YAAW,YAAW,aAAY,YAAW,aAAY,YAAW,UAAS,SAAQ,WAAU,WAAU,aAAY,WAAU,aAAY,YAAW,SAAQ,UAAS,SAAQ,WAAU,YAAW,YAAW,WAAU,WAAU,SAAQ,UAAS,SAAQ,QAAO,SAAQ,UAAS,SAAQ,SAAQ,WAAU,YAAW,WAAU,WAAU,WAAU,WAAU,YAAW,SAAQ,SAAQ,OAAM,QAAO,SAAQ,UAAS,QAAO,OAAM,YAAW,QAAO,QAAO,SAAQ,UAAS,WAAU,SAAQ,YAAW,OAAM,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,UAAS,WAAU,aAAY,OAAM,OAAM,QAAO,WAAU,WAAU,WAAU,YAAW,UAAS,SAAQ,UAAS,WAAU,YAAW,UAAS,WAAU,WAAU,UAAS,aAAY,cAAa,aAAY,YAAW,WAAU,WAAU,UAAS,WAAU,SAAQ,SAAQ,aAAY,UAAS,WAAU,aAAY,YAAW,SAAQ,WAAU,WAAU,UAAS,WAAU,UAAS,UAAS,SAAQ,YAAW,SAAQ,UAAS,SAAQ,YAAW,aAAY,WAAU,YAAW,UAAS,WAAU,WAAU,SAAQ,WAAU,QAAO,SAAQ,SAAQ,WAAU,WAAU,SAAQ,UAAS,YAAW,YAAW,UAAS,aAAY,WAAU,YAAW,WAAU,WAAU,WAAU,SAAQ,UAAS,SAAQ,QAAO,OAAM,WAAU,YAAW,cAAa,cAAa,aAAY,UAAS,UAAS,WAAU,aAAY,aAAY,WAAU,YAAW,SAAQ,UAAS,SAAQ,SAAQ,UAAS,YAAW,WAAU,aAAY,WAAU,OAAM,WAAU,WAAU,UAAS,YAAW,aAAY,SAAQ,SAAQ,aAAY,UAAS,aAAY,SAAQ,UAAS,QAAO,OAAM,QAAO,SAAQ,SAAQ,WAAU,WAAU,WAAU,SAAQ,eAAc,SAAQ,SAAQ,UAAS,WAAU,SAAQ,SAAQ,WAAU,QAAO,WAAU,aAAY,aAAY,SAAQ,WAAU,aAAY,YAAW,WAAU,WAAU,UAAS,WAAU,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,WAAU,YAAW,aAAY,WAAU,SAAQ,SAAQ,QAAO,UAAS,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,UAAS,UAAS,WAAU,QAAO,UAAS,UAAS,UAAS,WAAU,aAAY,YAAW,UAAS,SAAQ,WAAU,SAAQ,WAAU,SAAQ,SAAQ,WAAU,UAAS,QAAO,aAAY,SAAQ,UAAS,UAAS,UAAS,YAAW,QAAO,SAAQ,WAAU,UAAS,WAAU,SAAQ,WAAU,SAAQ,SAAQ,UAAS,WAAU,UAAS,UAAS,QAAO,UAAS,UAAS,SAAQ,UAAS,UAAS,QAAO,SAAQ,UAAS,OAAM,QAAO,WAAU,SAAQ,UAAS,UAAS,SAAQ,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,UAAS,YAAW,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,QAAO,QAAO,UAAS,OAAM,QAAO,UAAS,WAAU,WAAU,YAAW,YAAW,WAAU,WAAU,YAAW,YAAW,YAAW,aAAY,SAAQ,SAAQ,SAAQ,QAAO,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,UAAS,UAAS,SAAQ,SAAQ,QAAO,SAAQ,SAAQ,UAAS,SAAQ,WAAU,UAAS,QAAO,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,SAAQ,SAAQ,SAAQ,UAAS,WAAU,YAAW,SAAQ,UAAS,SAAQ,SAAQ,UAAS,UAAS,WAAU,aAAY,UAAS,YAAW,YAAW,WAAU,YAAW,QAAO,QAAO,SAAQ,UAAS,aAAY,WAAU,QAAO,WAAU,WAAU,YAAW,YAAW,SAAQ,SAAQ,SAAQ,UAAS,SAAQ,QAAO,SAAQ,SAAQ,QAAO,WAAU,SAAQ,UAAS,UAAS,WAAU,UAAS,SAAQ,QAAO,UAAS,SAAQ,UAAS,QAAO,QAAO,SAAQ,QAAO,SAAQ,SAAQ,UAAS,QAAO,SAAQ,UAAS,UAAS,UAAS,UAAS,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,SAAQ,SAAQ,WAAU,SAAQ,UAAS,YAAW,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,OAAM,UAAS,QAAO,QAAO,WAAU,SAAQ,YAAW,UAAS,UAAS,QAAO,SAAQ,QAAO,QAAO,SAAQ,UAAS,WAAU,WAAU,UAAS,UAAS,SAAQ,QAAO,QAAO,WAAU,WAAU,WAAU,WAAU,OAAM,UAAS,UAAS,UAAS,UAAS,UAAS,QAAO,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAO,QAAO,UAAS,YAAW,QAAO,WAAU,WAAU,WAAU,WAAU,WAAU,QAAO,SAAQ,UAAS,OAAM,UAAS,YAAW,WAAU,SAAQ,UAAS,SAAQ,WAAU,UAAS,SAAQ,SAAQ,WAAU,YAAW,OAAM,YAAW,WAAU,WAAU,YAAW,YAAW,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,YAAW,YAAW,SAAQ,UAAS,WAAU,WAAU,WAAU,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,YAAW,OAAM,UAAS,SAAQ,UAAS,SAAQ,OAAM,YAAW,YAAW,SAAQ,UAAS,SAAQ,QAAO,UAAS,QAAO,SAAQ,QAAO,SAAQ,SAAQ,SAAQ,WAAU,SAAQ,UAAS,OAAM,QAAO,SAAQ,WAAU,cAAa,YAAW,cAAa,cAAa,WAAU,WAAU,WAAU,SAAQ,UAAS,UAAS,QAAO,WAAU,YAAW,YAAW,cAAa,UAAS,YAAW,WAAU,WAAU,UAAS,aAAY,UAAS,UAAS,YAAW,WAAU,WAAU,UAAS,OAAM,QAAO,YAAW,aAAY,UAAS,SAAQ,SAAQ,SAAQ,SAAQ,aAAY,QAAO,SAAQ,UAAS,QAAO,UAAS,aAAY,aAAY,WAAU,OAAM,YAAW,SAAQ,SAAQ,QAAO,WAAU,WAAU,WAAU,SAAQ,UAAS,YAAW,aAAY,YAAW,WAAU,UAAS,WAAU,YAAW,OAAM,UAAS,OAAM,QAAO,WAAU,YAAW,aAAY,SAAQ,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,WAAU,QAAO,SAAQ,UAAS,WAAU,SAAQ,UAAS,SAAQ,SAAQ,QAAO,SAAQ,UAAS,WAAU,SAAQ,YAAW,UAAS,WAAU,SAAQ,SAAQ,SAAQ,OAAM,WAAU,QAAO,SAAQ,WAAU,YAAW,OAAM,QAAO,YAAW,QAAO,UAAS,WAAU,WAAU,UAAS,WAAU,YAAW,OAAM,SAAQ,SAAQ,SAAQ,SAAQ,SAAQ,SAAQ,UAAS,UAAS,UAAS,SAAQ,SAAQ,SAAQ,QAAO,QAAO,SAAQ,UAAS,UAAS,QAAO,SAAQ,UAAS,WAAU,SAAQ,UAAS,QAAO,SAAQ,UAAS,OAAM,SAAQ,QAAO,SAAQ,SAAQ,UAAS,WAAU,WAAU,WAAU,SAAQ,UAAS,UAAS,SAAQ,SAAQ,UAAS,SAAQ,WAAU,UAAS,QAAO,SAAQ,QAAO,SAAQ,UAAS,SAAQ,QAAO,SAAQ,QAAO,QAAO,QAAO,QAAO,WAAU,QAAO,UAAS,QAAO,SAAQ,UAAS,UAAS,SAAQ,UAAS,UAAS,SAAQ,UAAS,UAAS,WAAU,WAAU,SAAQ,UAAS,WAAU,YAAW,aAAY,aAAY,WAAU,QAAO,SAAQ,QAAO,WAAU,YAAW,YAAW,YAAW,QAAO,QAAO,SAAQ,UAAS,QAAO,UAAS,UAAS,WAAU,QAAO,QAAO,WAAU,SAAQ,UAAS,SAAQ,SAAQ,WAAU,UAAS,SAAQ,WAAU,QAAO,QAAO,SAAQ,QAAO,OAAM,QAAO,WAAU,aAAY,aAAY,YAAW,WAAU,WAAU,YAAW,aAAY,aAAY,YAAW,WAAU,YAAW,YAAW,YAAW,UAAS,WAAU,WAAU,QAAO,WAAU,YAAW,YAAW,WAAU,WAAU,YAAW,WAAU,WAAU,aAAY,aAAY,YAAW,aAAY,UAAS,WAAU,WAAU,YAAW,SAAQ,UAAS,UAAS,UAAS,YAAW,QAAO,OAAM,QAAO,UAAS,UAAS,UAAS,WAAU,WAAU,QAAO,SAAQ,UAAS,QAAO,OAAM,WAAU,WAAU,YAAW,WAAU,WAAU,QAAO,UAAS,WAAU,WAAU,UAAS,WAAU,QAAO,SAAQ,SAAQ,UAAS,QAAO,WAAU,QAAO,WAAU,YAAW,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,QAAO,UAAS,UAAS,SAAQ,WAAU,SAAQ,QAAO,WAAU,SAAQ,SAAQ,UAAS,OAAM,WAAU,UAAS,SAAQ,UAAS,SAAQ,YAAW,aAAY,UAAS,UAAS,UAAS,OAAM,YAAW,UAAS,WAAU,SAAQ,SAAQ,SAAQ,UAAS,UAAS,SAAQ,UAAS,YAAW,YAAW,QAAO,YAAW,WAAU,SAAQ,YAAW,SAAQ,UAAS,UAAS,WAAU,QAAO,UAAS,UAAS,UAAS,UAAS,SAAQ,YAAW,UAAS,WAAU,UAAS,SAAQ,WAAU,YAAW,QAAO,SAAQ,QAAO,QAAO,UAAS,UAAS,aAAY,SAAQ,SAAQ,UAAS,WAAU,UAAS,SAAQ,SAAQ,SAAQ,QAAO,WAAU,UAAS,UAAS,QAAO,UAAS,UAAS,UAAS,UAAS,SAAQ,UAAS,WAAU,aAAY,WAAU,WAAU,UAAS,SAAQ,SAAQ,UAAS,UAAS,WAAU,WAAU,WAAU,UAAS,UAAS,WAAU,SAAQ,UAAS,SAAQ,UAAS,WAAU,SAAQ,UAAS,YAAW,YAAW,YAAW,UAAS,WAAU,WAAU,UAAS,SAAQ,UAAS,SAAQ,UAAS,WAAU,QAAO,UAAS,WAAU,WAAU,YAAW,UAAS,UAAS,QAAO,SAAQ,UAAS,YAAW,WAAU,UAAS,WAAU,UAAS,kBAAiB,WAAU,QAAO,SAAQ,WAAU,UAAS,UAAS,UAAS,UAAS,SAAQ,WAAU,UAAS,WAAU,UAAS,SAAQ,QAAO,UAAS,SAAQ,UAAS,WAAU,YAAW,YAAW,UAAS,WAAU,UAAS,UAAS,UAAS,SAAQ,QAAO,SAAQ,WAAU,YAAW,YAAW,WAAU,YAAW,YAAW,aAAY,SAAQ,UAAS,OAAM,UAAS,SAAQ,UAAS,SAAQ,WAAU,WAAU,WAAU,UAAS,SAAQ,WAAU,WAAU,WAAU,WAAU,YAAW,UAAS,QAAO,UAAS,SAAQ,WAAU,UAAS,UAAS,UAAS,UAAS,aAAY,WAAU,UAAS,WAAU,SAAQ,WAAU,UAAS,UAAS,UAAS,SAAQ,UAAS,SAAQ,SAAQ,UAAS,SAAQ,SAAQ,SAAQ,UAAS,WAAU,SAAQ,SAAQ,UAAS,SAAQ,UAAS,UAAS,aAAY,UAAS,WAAU,SAAQ,UAAS,UAAS,SAAQ,UAAS,UAAS,SAAQ,WAAU,QAAO,UAAS,YAAW,WAAU,SAAQ,SAAQ,YAAW,YAAW,YAAW,UAAS,WAAU,UAAS,UAAS,YAAW,YAAW,aAAY,cAAa,aAAY,UAAS,WAAU,YAAW,UAAS,WAAU,WAAU,YAAW,SAAQ,UAAS,WAAU,UAAS,OAAM,WAAU,SAAQ,QAAO,QAAO,SAAQ,YAAW,SAAQ,UAAS,aAAY,UAAS,WAAU,YAAW,WAAU,WAAU,QAAO,SAAQ,QAAO,UAAS,WAAU,WAAU,WAAU,QAAO,SAAQ,QAAO,SAAQ,UAAS,WAAU,WAAU,SAAQ,SAAQ,WAAU,UAAS,UAAS,WAAU,YAAW,SAAQ,UAAS,YAAW,SAAQ,UAAS,WAAU,SAAQ,SAAQ,UAAS,UAAS,UAAS,YAAW,SAAQ,SAAQ,UAAS,SAAQ,UAAS,WAAU,WAAU,UAAS,QAAO,UAAS,SAAQ,WAAU,SAAQ,UAAS,SAAQ,WAAU,SAAQ,QAAO,SAAQ,UAAS,SAAQ,UAAS,QAAO,SA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",
47
+ "debugId": "A60B9416692989D164756E2164756E21",
48
48
  "names": []
49
49
  }