@dxos/assistant-toolkit 0.8.4-main.c85a9c8dae → 0.8.4-main.dfabb4ec29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/dist/lib/neutral/add-artifact-ZUJ5DMSY.mjs +30 -0
  2. package/dist/lib/neutral/add-artifact-ZUJ5DMSY.mjs.map +7 -0
  3. package/dist/lib/neutral/agent-5NIKAYUK.mjs +65 -0
  4. package/dist/lib/neutral/agent-5NIKAYUK.mjs.map +7 -0
  5. package/dist/lib/neutral/chunk-246ACKSH.mjs +100 -0
  6. package/dist/lib/neutral/chunk-246ACKSH.mjs.map +7 -0
  7. package/dist/lib/neutral/chunk-EJAQUAKM.mjs +73 -0
  8. package/dist/lib/neutral/chunk-EJAQUAKM.mjs.map +7 -0
  9. package/dist/lib/neutral/chunk-FIGO6CA6.mjs +140 -0
  10. package/dist/lib/neutral/chunk-FIGO6CA6.mjs.map +7 -0
  11. package/dist/lib/neutral/chunk-GV66MKAQ.mjs +60 -0
  12. package/dist/lib/neutral/chunk-GV66MKAQ.mjs.map +7 -0
  13. package/dist/lib/neutral/chunk-IKBIORQX.mjs +332 -0
  14. package/dist/lib/neutral/chunk-IKBIORQX.mjs.map +7 -0
  15. package/dist/lib/neutral/chunk-KGU725LW.mjs +29 -0
  16. package/dist/lib/neutral/chunk-KGU725LW.mjs.map +7 -0
  17. package/dist/lib/neutral/chunk-NR3GTWRC.mjs +53 -0
  18. package/dist/lib/neutral/chunk-NR3GTWRC.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-P4ZMYO4K.mjs +294 -0
  20. package/dist/lib/neutral/chunk-P4ZMYO4K.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-QO5SU37C.mjs +70 -0
  22. package/dist/lib/neutral/chunk-QO5SU37C.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-ROMZO4CB.mjs +108 -0
  24. package/dist/lib/neutral/chunk-ROMZO4CB.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-TO5IX24K.mjs +67 -0
  26. package/dist/lib/neutral/chunk-TO5IX24K.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-WLR3BGO4.mjs +25 -0
  28. package/dist/lib/neutral/chunk-WLR3BGO4.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-XUF53B6B.mjs +75 -0
  30. package/dist/lib/neutral/chunk-XUF53B6B.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-ZFXLTBZG.mjs +73 -0
  32. package/dist/lib/neutral/chunk-ZFXLTBZG.mjs.map +7 -0
  33. package/dist/lib/neutral/context-add-VB7AOY3G.mjs +22 -0
  34. package/dist/lib/neutral/context-add-VB7AOY3G.mjs.map +7 -0
  35. package/dist/lib/neutral/context-remove-VCM3VPSO.mjs +22 -0
  36. package/dist/lib/neutral/context-remove-VCM3VPSO.mjs.map +7 -0
  37. package/dist/lib/neutral/create-project-EIF4OJMY.mjs +35 -0
  38. package/dist/lib/neutral/create-project-EIF4OJMY.mjs.map +7 -0
  39. package/dist/lib/neutral/delete-J3PMWP7Z.mjs +19 -0
  40. package/dist/lib/neutral/delete-J3PMWP7Z.mjs.map +7 -0
  41. package/dist/lib/neutral/enable-blueprints-LBDZH2CY.mjs +47 -0
  42. package/dist/lib/neutral/enable-blueprints-LBDZH2CY.mjs.map +7 -0
  43. package/dist/lib/neutral/fetch-KHMHV7JR.mjs +16 -0
  44. package/dist/lib/neutral/fetch-KHMHV7JR.mjs.map +7 -0
  45. package/dist/lib/neutral/fetch-messages-QOBBCTGC.mjs +139 -0
  46. package/dist/lib/neutral/fetch-messages-QOBBCTGC.mjs.map +7 -0
  47. package/dist/lib/neutral/get-context-TN7X7U2H.mjs +35 -0
  48. package/dist/lib/neutral/get-context-TN7X7U2H.mjs.map +7 -0
  49. package/dist/lib/neutral/index.mjs +581 -3293
  50. package/dist/lib/neutral/index.mjs.map +4 -4
  51. package/dist/lib/neutral/load-ALP3TK2E.mjs +17 -0
  52. package/dist/lib/neutral/load-ALP3TK2E.mjs.map +7 -0
  53. package/dist/lib/neutral/meta.json +1 -1
  54. package/dist/lib/neutral/object-create-Z57Y3X6Y.mjs +35 -0
  55. package/dist/lib/neutral/object-create-Z57Y3X6Y.mjs.map +7 -0
  56. package/dist/lib/neutral/object-delete-X53LS37B.mjs +18 -0
  57. package/dist/lib/neutral/object-delete-X53LS37B.mjs.map +7 -0
  58. package/dist/lib/neutral/object-update-GVKSBR7T.mjs +28 -0
  59. package/dist/lib/neutral/object-update-GVKSBR7T.mjs.map +7 -0
  60. package/dist/lib/neutral/project-HPHTZ2CI.mjs +23 -0
  61. package/dist/lib/neutral/project-HPHTZ2CI.mjs.map +7 -0
  62. package/dist/lib/neutral/project-rules-IVDHKSKI.mjs +78 -0
  63. package/dist/lib/neutral/project-rules-IVDHKSKI.mjs.map +7 -0
  64. package/dist/lib/neutral/prompt-Y7NN7M5D.mjs +170 -0
  65. package/dist/lib/neutral/prompt-Y7NN7M5D.mjs.map +7 -0
  66. package/dist/lib/neutral/qualifier-VDOY5CWU.mjs +88 -0
  67. package/dist/lib/neutral/qualifier-VDOY5CWU.mjs.map +7 -0
  68. package/dist/lib/neutral/query-PPJU5622.mjs +70 -0
  69. package/dist/lib/neutral/query-PPJU5622.mjs.map +7 -0
  70. package/dist/lib/neutral/query-U56GNEV6.mjs +32 -0
  71. package/dist/lib/neutral/query-U56GNEV6.mjs.map +7 -0
  72. package/dist/lib/neutral/query-blueprints-KXADGHSA.mjs +16 -0
  73. package/dist/lib/neutral/query-blueprints-KXADGHSA.mjs.map +7 -0
  74. package/dist/lib/neutral/relation-create-XJ2IX6X3.mjs +34 -0
  75. package/dist/lib/neutral/relation-create-XJ2IX6X3.mjs.map +7 -0
  76. package/dist/lib/neutral/relation-delete-EP4KXAFL.mjs +18 -0
  77. package/dist/lib/neutral/relation-delete-EP4KXAFL.mjs.map +7 -0
  78. package/dist/lib/neutral/save-GWAPLT3Z.mjs +23 -0
  79. package/dist/lib/neutral/save-GWAPLT3Z.mjs.map +7 -0
  80. package/dist/lib/neutral/schema-add-Z5CY6P24.mjs +24 -0
  81. package/dist/lib/neutral/schema-add-Z5CY6P24.mjs.map +7 -0
  82. package/dist/lib/neutral/schema-list-W326VPVX.mjs +38 -0
  83. package/dist/lib/neutral/schema-list-W326VPVX.mjs.map +7 -0
  84. package/dist/lib/neutral/sync-issues-4YE5XAK5.mjs +167 -0
  85. package/dist/lib/neutral/sync-issues-4YE5XAK5.mjs.map +7 -0
  86. package/dist/lib/neutral/sync-triggers-CDMJVW6E.mjs +136 -0
  87. package/dist/lib/neutral/sync-triggers-CDMJVW6E.mjs.map +7 -0
  88. package/dist/lib/neutral/tag-add-VNIIOVJA.mjs +19 -0
  89. package/dist/lib/neutral/tag-add-VNIIOVJA.mjs.map +7 -0
  90. package/dist/lib/neutral/tag-remove-6R2R27W3.mjs +19 -0
  91. package/dist/lib/neutral/tag-remove-6R2R27W3.mjs.map +7 -0
  92. package/dist/lib/neutral/testing/index.mjs +9 -14
  93. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  94. package/dist/lib/neutral/update-blueprints-N2AK2VUR.mjs +16 -0
  95. package/dist/lib/neutral/update-blueprints-N2AK2VUR.mjs.map +7 -0
  96. package/dist/lib/neutral/update-tasks-H7SWIFQL.mjs +46 -0
  97. package/dist/lib/neutral/update-tasks-H7SWIFQL.mjs.map +7 -0
  98. package/dist/types/src/blueprints/automation/blueprint.d.ts +4 -0
  99. package/dist/types/src/blueprints/automation/blueprint.d.ts.map +1 -0
  100. package/dist/types/src/blueprints/automation/index.d.ts +2 -0
  101. package/dist/types/src/blueprints/automation/index.d.ts.map +1 -0
  102. package/dist/types/src/blueprints/blueprint-manager/blueprint.d.ts +4 -0
  103. package/dist/types/src/blueprints/blueprint-manager/blueprint.d.ts.map +1 -0
  104. package/dist/types/src/blueprints/blueprint-manager/blueprint.test.d.ts.map +1 -0
  105. package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts +63 -0
  106. package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts.map +1 -0
  107. package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts +37 -0
  108. package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts.map +1 -0
  109. package/dist/types/src/blueprints/blueprint-manager/functions/index.d.ts +4 -0
  110. package/dist/types/src/blueprints/blueprint-manager/functions/index.d.ts.map +1 -0
  111. package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts +28 -0
  112. package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts.map +1 -0
  113. package/dist/types/src/blueprints/blueprint-manager/functions/update-blueprints.d.ts +4 -0
  114. package/dist/types/src/blueprints/blueprint-manager/functions/update-blueprints.d.ts.map +1 -0
  115. package/dist/types/src/blueprints/blueprint-manager/index.d.ts +3 -0
  116. package/dist/types/src/blueprints/blueprint-manager/index.d.ts.map +1 -0
  117. package/dist/types/src/blueprints/browser/blueprint.d.ts +2 -2
  118. package/dist/types/src/blueprints/browser/blueprint.d.ts.map +1 -1
  119. package/dist/types/src/blueprints/database/blueprint.d.ts +2 -2
  120. package/dist/types/src/blueprints/database/blueprint.d.ts.map +1 -1
  121. package/dist/types/src/blueprints/database/functions/context-add.d.ts +5 -4
  122. package/dist/types/src/blueprints/database/functions/context-add.d.ts.map +1 -1
  123. package/dist/types/src/blueprints/database/functions/context-remove.d.ts +5 -4
  124. package/dist/types/src/blueprints/database/functions/context-remove.d.ts.map +1 -1
  125. package/dist/types/src/blueprints/database/functions/definitions.d.ts +59 -0
  126. package/dist/types/src/blueprints/database/functions/definitions.d.ts.map +1 -0
  127. package/dist/types/src/blueprints/database/functions/index.d.ts +3 -56
  128. package/dist/types/src/blueprints/database/functions/index.d.ts.map +1 -1
  129. package/dist/types/src/blueprints/database/functions/load.d.ts +5 -4
  130. package/dist/types/src/blueprints/database/functions/load.d.ts.map +1 -1
  131. package/dist/types/src/blueprints/database/functions/object-create.d.ts +5 -3
  132. package/dist/types/src/blueprints/database/functions/object-create.d.ts.map +1 -1
  133. package/dist/types/src/blueprints/database/functions/object-delete.d.ts +5 -4
  134. package/dist/types/src/blueprints/database/functions/object-delete.d.ts.map +1 -1
  135. package/dist/types/src/blueprints/database/functions/object-update.d.ts +5 -4
  136. package/dist/types/src/blueprints/database/functions/object-update.d.ts.map +1 -1
  137. package/dist/types/src/blueprints/database/functions/query.d.ts +7 -3
  138. package/dist/types/src/blueprints/database/functions/query.d.ts.map +1 -1
  139. package/dist/types/src/blueprints/database/functions/relation-create.d.ts +6 -5
  140. package/dist/types/src/blueprints/database/functions/relation-create.d.ts.map +1 -1
  141. package/dist/types/src/blueprints/database/functions/relation-delete.d.ts +5 -4
  142. package/dist/types/src/blueprints/database/functions/relation-delete.d.ts.map +1 -1
  143. package/dist/types/src/blueprints/database/functions/schema-add.d.ts +4 -2
  144. package/dist/types/src/blueprints/database/functions/schema-add.d.ts.map +1 -1
  145. package/dist/types/src/blueprints/database/functions/schema-list.d.ts +4 -2
  146. package/dist/types/src/blueprints/database/functions/schema-list.d.ts.map +1 -1
  147. package/dist/types/src/blueprints/database/functions/tag-add.d.ts +4 -3
  148. package/dist/types/src/blueprints/database/functions/tag-add.d.ts.map +1 -1
  149. package/dist/types/src/blueprints/database/functions/tag-remove.d.ts +4 -3
  150. package/dist/types/src/blueprints/database/functions/tag-remove.d.ts.map +1 -1
  151. package/dist/types/src/blueprints/database/index.d.ts +1 -1
  152. package/dist/types/src/blueprints/database/index.d.ts.map +1 -1
  153. package/dist/types/src/blueprints/discord/blueprint.d.ts +2 -2
  154. package/dist/types/src/blueprints/discord/blueprint.d.ts.map +1 -1
  155. package/dist/types/src/blueprints/discord/functions/definitions.d.ts +15 -0
  156. package/dist/types/src/blueprints/discord/functions/definitions.d.ts.map +1 -0
  157. package/dist/types/src/blueprints/discord/functions/fetch-messages.d.ts +3 -2
  158. package/dist/types/src/blueprints/discord/functions/fetch-messages.d.ts.map +1 -1
  159. package/dist/types/src/blueprints/discord/functions/index.d.ts +3 -11
  160. package/dist/types/src/blueprints/discord/functions/index.d.ts.map +1 -1
  161. package/dist/types/src/blueprints/discord/index.d.ts +1 -0
  162. package/dist/types/src/blueprints/discord/index.d.ts.map +1 -1
  163. package/dist/types/src/blueprints/github/functions/definitions.d.ts +7 -0
  164. package/dist/types/src/blueprints/github/functions/definitions.d.ts.map +1 -0
  165. package/dist/types/src/blueprints/github/functions/fetch-prs.d.ts +4 -2
  166. package/dist/types/src/blueprints/github/functions/fetch-prs.d.ts.map +1 -1
  167. package/dist/types/src/blueprints/github/functions/index.d.ts +3 -6
  168. package/dist/types/src/blueprints/github/functions/index.d.ts.map +1 -1
  169. package/dist/types/src/blueprints/github/index.d.ts +1 -0
  170. package/dist/types/src/blueprints/github/index.d.ts.map +1 -1
  171. package/dist/types/src/blueprints/index.d.ts +4 -3
  172. package/dist/types/src/blueprints/index.d.ts.map +1 -1
  173. package/dist/types/src/blueprints/linear/blueprint.d.ts +2 -2
  174. package/dist/types/src/blueprints/linear/blueprint.d.ts.map +1 -1
  175. package/dist/types/src/blueprints/linear/functions/definitions.d.ts +6 -0
  176. package/dist/types/src/blueprints/linear/functions/definitions.d.ts.map +1 -0
  177. package/dist/types/src/blueprints/linear/functions/index.d.ts +3 -8
  178. package/dist/types/src/blueprints/linear/functions/index.d.ts.map +1 -1
  179. package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts +4 -6
  180. package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts.map +1 -1
  181. package/dist/types/src/blueprints/linear/index.d.ts +1 -0
  182. package/dist/types/src/blueprints/linear/index.d.ts.map +1 -1
  183. package/dist/types/src/blueprints/memory/blueprint.d.ts +4 -0
  184. package/dist/types/src/blueprints/memory/blueprint.d.ts.map +1 -0
  185. package/dist/types/src/blueprints/memory/blueprint.test.d.ts.map +1 -0
  186. package/dist/types/src/blueprints/memory/functions/definitions.d.ts +17 -0
  187. package/dist/types/src/blueprints/memory/functions/definitions.d.ts.map +1 -0
  188. package/dist/types/src/blueprints/memory/functions/delete.d.ts +10 -0
  189. package/dist/types/src/blueprints/memory/functions/delete.d.ts.map +1 -0
  190. package/dist/types/src/blueprints/memory/functions/index.d.ts +4 -0
  191. package/dist/types/src/blueprints/memory/functions/index.d.ts.map +1 -0
  192. package/dist/types/src/blueprints/memory/functions/query.d.ts +8 -0
  193. package/dist/types/src/blueprints/memory/functions/query.d.ts.map +1 -0
  194. package/dist/types/src/blueprints/memory/functions/save.d.ts +8 -0
  195. package/dist/types/src/blueprints/memory/functions/save.d.ts.map +1 -0
  196. package/dist/types/src/blueprints/memory/index.d.ts +3 -0
  197. package/dist/types/src/blueprints/memory/index.d.ts.map +1 -0
  198. package/dist/types/src/blueprints/planning/blueprint.d.ts +2 -2
  199. package/dist/types/src/blueprints/planning/blueprint.d.ts.map +1 -1
  200. package/dist/types/src/blueprints/planning/functions/definitions.d.ts +11 -0
  201. package/dist/types/src/blueprints/planning/functions/definitions.d.ts.map +1 -0
  202. package/dist/types/src/blueprints/planning/functions/index.d.ts +3 -9
  203. package/dist/types/src/blueprints/planning/functions/index.d.ts.map +1 -1
  204. package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts +5 -3
  205. package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts.map +1 -1
  206. package/dist/types/src/blueprints/planning/index.d.ts +1 -0
  207. package/dist/types/src/blueprints/planning/index.d.ts.map +1 -1
  208. package/dist/types/src/blueprints/project/blueprint.d.ts +2 -2
  209. package/dist/types/src/blueprints/project/blueprint.d.ts.map +1 -1
  210. package/dist/types/src/blueprints/project/functions/add-artifact.d.ts +4 -3
  211. package/dist/types/src/blueprints/project/functions/add-artifact.d.ts.map +1 -1
  212. package/dist/types/src/blueprints/project/functions/agent.d.ts +2 -60
  213. package/dist/types/src/blueprints/project/functions/agent.d.ts.map +1 -1
  214. package/dist/types/src/blueprints/project/functions/definitions.d.ts +158 -0
  215. package/dist/types/src/blueprints/project/functions/definitions.d.ts.map +1 -0
  216. package/dist/types/src/blueprints/project/functions/get-context.d.ts +6 -4
  217. package/dist/types/src/blueprints/project/functions/get-context.d.ts.map +1 -1
  218. package/dist/types/src/blueprints/project/functions/index.d.ts +3 -132
  219. package/dist/types/src/blueprints/project/functions/index.d.ts.map +1 -1
  220. package/dist/types/src/blueprints/project/functions/qualifier.d.ts +30 -17
  221. package/dist/types/src/blueprints/project/functions/qualifier.d.ts.map +1 -1
  222. package/dist/types/src/blueprints/project/index.d.ts +2 -2
  223. package/dist/types/src/blueprints/project/index.d.ts.map +1 -1
  224. package/dist/types/src/blueprints/project-wizard/blueprint.d.ts +4 -0
  225. package/dist/types/src/blueprints/project-wizard/blueprint.d.ts.map +1 -0
  226. package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts +51 -0
  227. package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts.map +1 -0
  228. package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts +96 -0
  229. package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts.map +1 -0
  230. package/dist/types/src/blueprints/project-wizard/functions/index.d.ts +4 -0
  231. package/dist/types/src/blueprints/project-wizard/functions/index.d.ts.map +1 -0
  232. package/dist/types/src/blueprints/project-wizard/functions/project-rules.d.ts +4 -0
  233. package/dist/types/src/blueprints/project-wizard/functions/project-rules.d.ts.map +1 -0
  234. package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts +48 -0
  235. package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts.map +1 -0
  236. package/dist/types/src/blueprints/project-wizard/index.d.ts +3 -0
  237. package/dist/types/src/blueprints/project-wizard/index.d.ts.map +1 -0
  238. package/dist/types/src/blueprints/testing.d.ts +5 -15
  239. package/dist/types/src/blueprints/testing.d.ts.map +1 -1
  240. package/dist/types/src/blueprints/websearch/blueprint.d.ts +2 -2
  241. package/dist/types/src/blueprints/websearch/blueprint.d.ts.map +1 -1
  242. package/dist/types/src/blueprints/websearch/blueprint.test.d.ts.map +1 -0
  243. package/dist/types/src/blueprints/websearch/functions/definitions.d.ts +5 -0
  244. package/dist/types/src/blueprints/websearch/functions/definitions.d.ts.map +1 -0
  245. package/dist/types/src/blueprints/websearch/functions/fetch.d.ts +6 -0
  246. package/dist/types/src/blueprints/websearch/functions/fetch.d.ts.map +1 -0
  247. package/dist/types/src/blueprints/websearch/functions/index.d.ts +4 -0
  248. package/dist/types/src/blueprints/websearch/functions/index.d.ts.map +1 -0
  249. package/dist/types/src/blueprints/websearch/index.d.ts +2 -1
  250. package/dist/types/src/blueprints/websearch/index.d.ts.map +1 -1
  251. package/dist/types/src/blueprints/websearch/toolkit.d.ts +2 -0
  252. package/dist/types/src/blueprints/websearch/toolkit.d.ts.map +1 -1
  253. package/dist/types/src/crud/graph.d.ts +1 -1
  254. package/dist/types/src/crud/graph.d.ts.map +1 -1
  255. package/dist/types/src/errors.d.ts +41 -0
  256. package/dist/types/src/errors.d.ts.map +1 -0
  257. package/dist/types/src/functions/agent/definitions.d.ts +62 -0
  258. package/dist/types/src/functions/agent/definitions.d.ts.map +1 -0
  259. package/dist/types/src/functions/agent/index.d.ts +3 -84
  260. package/dist/types/src/functions/agent/index.d.ts.map +1 -1
  261. package/dist/types/src/functions/agent/prompt.d.ts +2 -82
  262. package/dist/types/src/functions/agent/prompt.d.ts.map +1 -1
  263. package/dist/types/src/functions/agent/prompt.test.d.ts +2 -0
  264. package/dist/types/src/functions/agent/prompt.test.d.ts.map +1 -0
  265. package/dist/types/src/functions/index.d.ts +0 -2
  266. package/dist/types/src/functions/index.d.ts.map +1 -1
  267. package/dist/types/src/sync/sync.d.ts.map +1 -1
  268. package/dist/types/src/testing/plugins.d.ts.map +1 -1
  269. package/dist/types/src/toolkits/WebToolkit.d.ts.map +1 -1
  270. package/dist/types/src/types/Agent.d.ts +77 -0
  271. package/dist/types/src/types/Agent.d.ts.map +1 -0
  272. package/dist/types/src/types/Chat.d.ts +32 -7
  273. package/dist/types/src/types/Chat.d.ts.map +1 -1
  274. package/dist/types/src/types/McpServer.d.ts +21 -0
  275. package/dist/types/src/types/McpServer.d.ts.map +1 -0
  276. package/dist/types/src/types/Memory.d.ts +12 -0
  277. package/dist/types/src/types/Memory.d.ts.map +1 -0
  278. package/dist/types/src/types/Plan.d.ts +23 -11
  279. package/dist/types/src/types/Plan.d.ts.map +1 -1
  280. package/dist/types/src/types/index.d.ts +3 -1
  281. package/dist/types/src/types/index.d.ts.map +1 -1
  282. package/dist/types/src/util/graphql.d.ts.map +1 -1
  283. package/dist/types/tsconfig.tsbuildinfo +1 -1
  284. package/package.json +27 -31
  285. package/src/blueprints/automation/blueprint.ts +105 -0
  286. package/src/blueprints/automation/index.ts +5 -0
  287. package/src/blueprints/blueprint-manager/blueprint.conversations.json +1 -0
  288. package/src/blueprints/blueprint-manager/blueprint.test.ts +198 -0
  289. package/src/blueprints/blueprint-manager/blueprint.ts +49 -0
  290. package/src/blueprints/blueprint-manager/functions/definitions.ts +57 -0
  291. package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +43 -0
  292. package/src/blueprints/blueprint-manager/functions/index.ts +13 -0
  293. package/src/blueprints/blueprint-manager/functions/query-blueprints.ts +18 -0
  294. package/src/blueprints/blueprint-manager/functions/update-blueprints.ts +18 -0
  295. package/src/blueprints/blueprint-manager/index.ts +6 -0
  296. package/src/blueprints/browser/blueprint.test.ts +23 -32
  297. package/src/blueprints/browser/blueprint.ts +5 -6
  298. package/src/blueprints/database/blueprint.conversations.json +1 -1
  299. package/src/blueprints/database/blueprint.test.ts +308 -98
  300. package/src/blueprints/database/blueprint.ts +37 -10
  301. package/src/blueprints/database/functions/context-add.ts +15 -26
  302. package/src/blueprints/database/functions/context-remove.ts +16 -27
  303. package/src/blueprints/database/functions/definitions.ts +318 -0
  304. package/src/blueprints/database/functions/index.ts +18 -28
  305. package/src/blueprints/database/functions/load.ts +11 -23
  306. package/src/blueprints/database/functions/object-create.ts +28 -25
  307. package/src/blueprints/database/functions/object-delete.ts +13 -20
  308. package/src/blueprints/database/functions/object-update.ts +23 -25
  309. package/src/blueprints/database/functions/query.ts +48 -110
  310. package/src/blueprints/database/functions/relation-create.ts +25 -38
  311. package/src/blueprints/database/functions/relation-delete.ts +14 -21
  312. package/src/blueprints/database/functions/schema-add.ts +19 -31
  313. package/src/blueprints/database/functions/schema-list.ts +26 -27
  314. package/src/blueprints/database/functions/tag-add.ts +14 -24
  315. package/src/blueprints/database/functions/tag-remove.ts +14 -23
  316. package/src/blueprints/database/index.ts +16 -1
  317. package/src/blueprints/discord/blueprint.ts +6 -11
  318. package/src/blueprints/discord/functions/definitions.ts +70 -0
  319. package/src/blueprints/discord/functions/fetch-messages.test.ts +15 -25
  320. package/src/blueprints/discord/functions/fetch-messages.ts +98 -152
  321. package/src/blueprints/discord/functions/index.ts +4 -4
  322. package/src/blueprints/discord/index.ts +1 -0
  323. package/src/blueprints/github/functions/definitions.ts +26 -0
  324. package/src/blueprints/github/functions/fetch-prs.ts +15 -22
  325. package/src/blueprints/github/functions/index.ts +4 -4
  326. package/src/blueprints/github/index.ts +2 -0
  327. package/src/blueprints/index.ts +4 -3
  328. package/src/blueprints/linear/blueprint.ts +6 -11
  329. package/src/blueprints/linear/functions/definitions.ts +23 -0
  330. package/src/blueprints/linear/functions/index.ts +4 -4
  331. package/src/blueprints/linear/functions/linear.test.ts +7 -7
  332. package/src/blueprints/linear/functions/sync-issues.ts +31 -39
  333. package/src/blueprints/linear/index.ts +1 -0
  334. package/src/blueprints/memory/blueprint.conversations.json +1 -0
  335. package/src/blueprints/memory/blueprint.test.ts +139 -0
  336. package/src/blueprints/memory/blueprint.ts +41 -0
  337. package/src/blueprints/memory/functions/definitions.ts +68 -0
  338. package/src/blueprints/memory/functions/delete.ts +20 -0
  339. package/src/blueprints/memory/functions/index.ts +13 -0
  340. package/src/blueprints/memory/functions/query.ts +32 -0
  341. package/src/blueprints/memory/functions/save.ts +20 -0
  342. package/src/blueprints/memory/index.ts +6 -0
  343. package/src/blueprints/planning/blueprint.ts +5 -9
  344. package/src/blueprints/planning/functions/definitions.ts +137 -0
  345. package/src/blueprints/planning/functions/index.ts +4 -4
  346. package/src/blueprints/planning/functions/update-tasks.ts +35 -158
  347. package/src/blueprints/planning/index.ts +1 -0
  348. package/src/blueprints/project/blueprint.conversations.json +1 -0
  349. package/src/blueprints/project/blueprint.test.ts +246 -111
  350. package/src/blueprints/project/blueprint.ts +21 -25
  351. package/src/blueprints/project/functions/add-artifact.ts +19 -30
  352. package/src/blueprints/project/functions/agent.ts +43 -46
  353. package/src/blueprints/project/functions/definitions.ts +92 -0
  354. package/src/blueprints/project/functions/get-context.ts +36 -53
  355. package/src/blueprints/project/functions/index.ts +9 -10
  356. package/src/blueprints/project/functions/qualifier.ts +66 -72
  357. package/src/blueprints/project/index.ts +2 -2
  358. package/src/blueprints/project-wizard/blueprint.ts +52 -0
  359. package/src/blueprints/project-wizard/functions/create-project.ts +32 -0
  360. package/src/blueprints/project-wizard/functions/definitions.ts +63 -0
  361. package/src/blueprints/project-wizard/functions/index.ts +13 -0
  362. package/src/blueprints/project-wizard/functions/project-rules.ts +77 -0
  363. package/src/blueprints/project-wizard/functions/sync-triggers.ts +158 -0
  364. package/src/blueprints/project-wizard/index.ts +6 -0
  365. package/src/blueprints/testing.ts +7 -23
  366. package/src/blueprints/websearch/blueprint.conversations.json +1 -0
  367. package/src/blueprints/websearch/blueprint.test.ts +39 -0
  368. package/src/blueprints/websearch/blueprint.ts +6 -8
  369. package/src/blueprints/websearch/functions/definitions.ts +25 -0
  370. package/src/blueprints/websearch/functions/fetch.ts +18 -0
  371. package/src/blueprints/websearch/functions/index.ts +9 -0
  372. package/src/blueprints/websearch/index.ts +2 -1
  373. package/src/blueprints/websearch/toolkit.ts +6 -1
  374. package/src/crud/graph.test.ts +10 -12
  375. package/src/crud/graph.ts +2 -2
  376. package/src/errors.ts +25 -0
  377. package/src/functions/agent/definitions.ts +56 -0
  378. package/src/functions/agent/index.ts +4 -4
  379. package/src/functions/agent/prompt.conversations.json +1 -0
  380. package/src/functions/agent/prompt.test.ts +81 -0
  381. package/src/functions/agent/prompt.ts +212 -96
  382. package/src/functions/index.ts +0 -2
  383. package/src/sync/sync.ts +23 -12
  384. package/src/testing/plugins.tsx +10 -3
  385. package/src/toolkits/WebToolkit.ts +1 -1
  386. package/src/types/Agent.ts +240 -0
  387. package/src/types/Chat.ts +24 -10
  388. package/src/types/McpServer.ts +37 -0
  389. package/src/types/Memory.ts +24 -0
  390. package/src/types/Plan.ts +7 -4
  391. package/src/types/index.ts +3 -1
  392. package/dist/types/src/blueprints/design/blueprint.d.ts +0 -4
  393. package/dist/types/src/blueprints/design/blueprint.d.ts.map +0 -1
  394. package/dist/types/src/blueprints/design/blueprint.test.d.ts.map +0 -1
  395. package/dist/types/src/blueprints/design/index.d.ts +0 -2
  396. package/dist/types/src/blueprints/design/index.d.ts.map +0 -1
  397. package/dist/types/src/blueprints/markdown/blueprint.d.ts +0 -4
  398. package/dist/types/src/blueprints/markdown/blueprint.d.ts.map +0 -1
  399. package/dist/types/src/blueprints/markdown/functions/create.d.ts +0 -6
  400. package/dist/types/src/blueprints/markdown/functions/create.d.ts.map +0 -1
  401. package/dist/types/src/blueprints/markdown/functions/index.d.ts +0 -30
  402. package/dist/types/src/blueprints/markdown/functions/index.d.ts.map +0 -1
  403. package/dist/types/src/blueprints/markdown/functions/read.d.ts +0 -14
  404. package/dist/types/src/blueprints/markdown/functions/read.d.ts.map +0 -1
  405. package/dist/types/src/blueprints/markdown/functions/update.d.ts +0 -13
  406. package/dist/types/src/blueprints/markdown/functions/update.d.ts.map +0 -1
  407. package/dist/types/src/blueprints/markdown/index.d.ts +0 -3
  408. package/dist/types/src/blueprints/markdown/index.d.ts.map +0 -1
  409. package/dist/types/src/blueprints/planning-old/blueprint.d.ts +0 -4
  410. package/dist/types/src/blueprints/planning-old/blueprint.d.ts.map +0 -1
  411. package/dist/types/src/blueprints/planning-old/blueprint.test.d.ts.map +0 -1
  412. package/dist/types/src/blueprints/planning-old/functions/index.d.ts +0 -29
  413. package/dist/types/src/blueprints/planning-old/functions/index.d.ts.map +0 -1
  414. package/dist/types/src/blueprints/planning-old/functions/read.d.ts +0 -14
  415. package/dist/types/src/blueprints/planning-old/functions/read.d.ts.map +0 -1
  416. package/dist/types/src/blueprints/planning-old/functions/task-list.d.ts +0 -74
  417. package/dist/types/src/blueprints/planning-old/functions/task-list.d.ts.map +0 -1
  418. package/dist/types/src/blueprints/planning-old/functions/task-list.test.d.ts +0 -2
  419. package/dist/types/src/blueprints/planning-old/functions/task-list.test.d.ts.map +0 -1
  420. package/dist/types/src/blueprints/planning-old/functions/update.d.ts +0 -16
  421. package/dist/types/src/blueprints/planning-old/functions/update.d.ts.map +0 -1
  422. package/dist/types/src/blueprints/planning-old/index.d.ts +0 -2
  423. package/dist/types/src/blueprints/planning-old/index.d.ts.map +0 -1
  424. package/dist/types/src/blueprints/research/blueprint.d.ts +0 -4
  425. package/dist/types/src/blueprints/research/blueprint.d.ts.map +0 -1
  426. package/dist/types/src/blueprints/research/blueprint.test.d.ts.map +0 -1
  427. package/dist/types/src/blueprints/research/functions/document-create.d.ts +0 -10
  428. package/dist/types/src/blueprints/research/functions/document-create.d.ts.map +0 -1
  429. package/dist/types/src/blueprints/research/functions/index.d.ts +0 -19
  430. package/dist/types/src/blueprints/research/functions/index.d.ts.map +0 -1
  431. package/dist/types/src/blueprints/research/functions/research.d.ts +0 -14
  432. package/dist/types/src/blueprints/research/functions/research.d.ts.map +0 -1
  433. package/dist/types/src/blueprints/research/functions/research.test.d.ts +0 -2
  434. package/dist/types/src/blueprints/research/functions/research.test.d.ts.map +0 -1
  435. package/dist/types/src/blueprints/research/index.d.ts +0 -3
  436. package/dist/types/src/blueprints/research/index.d.ts.map +0 -1
  437. package/dist/types/src/blueprints/research/types/ResearchGraph.d.ts +0 -18
  438. package/dist/types/src/blueprints/research/types/ResearchGraph.d.ts.map +0 -1
  439. package/dist/types/src/blueprints/research/types/index.d.ts +0 -7
  440. package/dist/types/src/blueprints/research/types/index.d.ts.map +0 -1
  441. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +0 -179
  442. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts.map +0 -1
  443. package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts +0 -2
  444. package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts.map +0 -1
  445. package/dist/types/src/functions/entity-extraction/index.d.ts +0 -179
  446. package/dist/types/src/functions/entity-extraction/index.d.ts.map +0 -1
  447. package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts +0 -38
  448. package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts.map +0 -1
  449. package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts +0 -37
  450. package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts.map +0 -1
  451. package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts +0 -58
  452. package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts.map +0 -1
  453. package/dist/types/src/functions/exa/data/index.d.ts +0 -3
  454. package/dist/types/src/functions/exa/data/index.d.ts.map +0 -1
  455. package/dist/types/src/functions/exa/exa.d.ts +0 -5
  456. package/dist/types/src/functions/exa/exa.d.ts.map +0 -1
  457. package/dist/types/src/functions/exa/index.d.ts +0 -9
  458. package/dist/types/src/functions/exa/index.d.ts.map +0 -1
  459. package/dist/types/src/functions/exa/mock.d.ts +0 -5
  460. package/dist/types/src/functions/exa/mock.d.ts.map +0 -1
  461. package/dist/types/src/types/Project.d.ts +0 -67
  462. package/dist/types/src/types/Project.d.ts.map +0 -1
  463. package/src/blueprints/browser/blueprint.conversations.json +0 -1
  464. package/src/blueprints/design/blueprint.test.ts +0 -96
  465. package/src/blueprints/design/blueprint.ts +0 -46
  466. package/src/blueprints/design/index.ts +0 -5
  467. package/src/blueprints/markdown/blueprint.ts +0 -38
  468. package/src/blueprints/markdown/functions/create.ts +0 -29
  469. package/src/blueprints/markdown/functions/index.ts +0 -13
  470. package/src/blueprints/markdown/functions/read.ts +0 -32
  471. package/src/blueprints/markdown/functions/update.ts +0 -32
  472. package/src/blueprints/markdown/index.ts +0 -6
  473. package/src/blueprints/planning-old/blueprint.test.ts +0 -122
  474. package/src/blueprints/planning-old/blueprint.ts +0 -110
  475. package/src/blueprints/planning-old/functions/index.ts +0 -11
  476. package/src/blueprints/planning-old/functions/read.ts +0 -34
  477. package/src/blueprints/planning-old/functions/task-list.test.ts +0 -99
  478. package/src/blueprints/planning-old/functions/task-list.ts +0 -165
  479. package/src/blueprints/planning-old/functions/update.ts +0 -52
  480. package/src/blueprints/planning-old/index.ts +0 -5
  481. package/src/blueprints/research/blueprint.test.ts +0 -7
  482. package/src/blueprints/research/blueprint.ts +0 -65
  483. package/src/blueprints/research/functions/document-create.ts +0 -73
  484. package/src/blueprints/research/functions/index.ts +0 -11
  485. package/src/blueprints/research/functions/research-instructions.tpl +0 -106
  486. package/src/blueprints/research/functions/research.conversations.json +0 -1
  487. package/src/blueprints/research/functions/research.test.ts +0 -149
  488. package/src/blueprints/research/functions/research.ts +0 -175
  489. package/src/blueprints/research/index.ts +0 -6
  490. package/src/blueprints/research/types/ResearchGraph.ts +0 -49
  491. package/src/blueprints/research/types/index.ts +0 -32
  492. package/src/functions/entity-extraction/entity-extraction.conversations.json +0 -1
  493. package/src/functions/entity-extraction/entity-extraction.test.ts +0 -74
  494. package/src/functions/entity-extraction/entity-extraction.ts +0 -181
  495. package/src/functions/entity-extraction/index.ts +0 -9
  496. package/src/functions/exa/data/exa-search-1748337321991.ts +0 -131
  497. package/src/functions/exa/data/exa-search-1748337331526.ts +0 -144
  498. package/src/functions/exa/data/exa-search-1748337344119.ts +0 -133
  499. package/src/functions/exa/data/index.ts +0 -11
  500. package/src/functions/exa/exa.ts +0 -37
  501. package/src/functions/exa/index.ts +0 -11
  502. package/src/functions/exa/mock.ts +0 -71
  503. package/src/types/Project.ts +0 -196
  504. /package/dist/types/src/blueprints/{design → blueprint-manager}/blueprint.test.d.ts +0 -0
  505. /package/dist/types/src/blueprints/{planning-old → memory}/blueprint.test.d.ts +0 -0
  506. /package/dist/types/src/blueprints/{research → websearch}/blueprint.test.d.ts +0 -0
@@ -1,1589 +1,575 @@
1
+ import {
2
+ AgentPrompt
3
+ } from "./chunk-GV66MKAQ.mjs";
4
+ import {
5
+ DeleteMemory,
6
+ QueryMemories,
7
+ SaveMemory
8
+ } from "./chunk-EJAQUAKM.mjs";
9
+ import {
10
+ EnableBlueprints,
11
+ QueryBlueprints,
12
+ UpdateBlueprints
13
+ } from "./chunk-TO5IX24K.mjs";
14
+ import {
15
+ AgentRules,
16
+ CreateAgent,
17
+ SyncTriggers
18
+ } from "./chunk-XUF53B6B.mjs";
19
+ import {
20
+ SyncIssues,
21
+ syncObjects
22
+ } from "./chunk-ROMZO4CB.mjs";
23
+ import {
24
+ UpdateTasks
25
+ } from "./chunk-FIGO6CA6.mjs";
26
+ import {
27
+ Fetch
28
+ } from "./chunk-WLR3BGO4.mjs";
29
+ import {
30
+ ContextAdd,
31
+ ContextRemove,
32
+ Load,
33
+ ObjectCreate,
34
+ ObjectDelete,
35
+ ObjectUpdate,
36
+ Query,
37
+ RelationCreate,
38
+ RelationDelete,
39
+ SchemaAdd,
40
+ SchemaList,
41
+ TagAdd,
42
+ TagRemove
43
+ } from "./chunk-IKBIORQX.mjs";
44
+ import {
45
+ FetchMessages
46
+ } from "./chunk-ZFXLTBZG.mjs";
47
+ import {
48
+ AgentBlueprintHandlers,
49
+ blueprint_default
50
+ } from "./chunk-QO5SU37C.mjs";
51
+ import {
52
+ AddArtifact,
53
+ AgentWorker,
54
+ GetContext,
55
+ Qualifier
56
+ } from "./chunk-246ACKSH.mjs";
57
+ import {
58
+ Agent_exports,
59
+ McpServer_exports,
60
+ Plan_exports
61
+ } from "./chunk-P4ZMYO4K.mjs";
62
+ import {
63
+ Chat_exports
64
+ } from "./chunk-NR3GTWRC.mjs";
65
+ import {
66
+ Memory_exports
67
+ } from "./chunk-KGU725LW.mjs";
1
68
  import {
2
69
  __export
3
70
  } from "./chunk-J5LGTIGS.mjs";
4
71
 
5
- // src/blueprints/design/blueprint.ts
6
- import { ToolId } from "@dxos/ai";
7
- import { Blueprint as Blueprint2 } from "@dxos/blueprints";
8
- import { Ref as Ref5 } from "@dxos/echo";
9
- import { Text as Text2 } from "@dxos/schema";
10
- import { trim as trim2 } from "@dxos/util";
11
-
12
- // src/blueprints/markdown/blueprint.ts
13
- import { Blueprint } from "@dxos/blueprints";
14
- import { Ref as Ref4 } from "@dxos/echo";
72
+ // src/blueprints/discord/blueprint.ts
73
+ import { Blueprint } from "@dxos/compute";
74
+ import { Ref } from "@dxos/echo";
15
75
  import { Text } from "@dxos/schema";
16
76
  import { trim } from "@dxos/util";
17
77
 
18
- // src/blueprints/markdown/functions/create.ts
19
- import * as Effect from "effect/Effect";
20
- import * as Schema from "effect/Schema";
21
- import { Database, Ref } from "@dxos/echo";
22
- import { defineFunction } from "@dxos/functions";
23
- import { Markdown } from "@dxos/plugin-markdown/types";
24
- var create_default = defineFunction({
25
- key: "dxos.org/function/markdown/create",
26
- name: "Create markdown document",
27
- description: "Creates a new markdown document.",
28
- inputSchema: Schema.Struct({
29
- name: Schema.String.annotations({
30
- description: "Name of the document."
31
- }),
32
- content: Schema.String.annotations({
33
- description: "Content of the document."
34
- })
35
- }),
36
- outputSchema: Schema.Void,
37
- handler: Effect.fn(function* ({ data: { name, content } }) {
38
- const doc = yield* Database.add(Markdown.make({
39
- name,
40
- content
41
- }));
42
- return {
43
- document: Ref.make(doc)
44
- };
45
- })
46
- });
47
-
48
- // src/blueprints/markdown/functions/read.ts
49
- import * as Effect2 from "effect/Effect";
50
- import * as Schema2 from "effect/Schema";
51
- import { Database as Database2, Ref as Ref2 } from "@dxos/echo";
52
- import { defineFunction as defineFunction2 } from "@dxos/functions";
53
- import { Markdown as Markdown2 } from "@dxos/plugin-markdown/types";
54
- var read_default = defineFunction2({
55
- key: "dxos.org/function/markdown/read",
56
- name: "Read markdown document",
57
- description: "Read markdown document. Note that result is a snapshot in time, and might have changed since the document was last read.",
58
- inputSchema: Schema2.Struct({
59
- document: Ref2.Ref(Markdown2.Document).annotations({
60
- description: "The document to read."
61
- })
62
- }),
63
- outputSchema: Schema2.Struct({
64
- content: Schema2.String
65
- }),
66
- handler: Effect2.fn(function* ({ data: { document } }) {
67
- const { content } = yield* document.pipe(Database2.load, Effect2.flatMap((doc) => doc.content.pipe(Database2.load)));
68
- return {
69
- content
70
- };
71
- })
72
- });
78
+ // src/blueprints/discord/functions/index.ts
79
+ import { OperationHandlerSet } from "@dxos/compute";
80
+ var DiscordHandlers = OperationHandlerSet.lazy(() => import("./fetch-messages-QOBBCTGC.mjs"));
73
81
 
74
- // src/blueprints/markdown/functions/update.ts
75
- import * as Effect3 from "effect/Effect";
76
- import * as Schema3 from "effect/Schema";
77
- import { Database as Database3, Obj, Ref as Ref3 } from "@dxos/echo";
78
- import { defineFunction as defineFunction3 } from "@dxos/functions";
79
- import { Markdown as Markdown3 } from "@dxos/plugin-markdown/types";
80
- var update_default = defineFunction3({
81
- key: "dxos.org/function/markdown/update",
82
- name: "Update markdown",
83
- description: "Updates the entire contents of the markdown document.",
84
- inputSchema: Schema3.Struct({
85
- doc: Ref3.Ref(Markdown3.Document).annotations({
86
- description: "The ID of the document to write."
87
- }),
88
- content: Schema3.String.annotations({
89
- description: "New content to write to the document."
90
- })
91
- }),
92
- outputSchema: Schema3.Void,
93
- handler: Effect3.fn(function* ({ data: { doc, content } }) {
94
- const document = yield* Database3.load(doc);
95
- const text = yield* Database3.load(document.content);
96
- Obj.change(text, (t) => {
97
- t.content = content;
98
- });
99
- })
100
- });
82
+ // src/blueprints/discord/blueprint.ts
83
+ var BLUEPRINT_KEY = "org.dxos.blueprint.discord";
84
+ var instructions = trim`
85
+ You are able to fetch messages from Discord servers.
101
86
 
102
- // src/blueprints/markdown/functions/index.ts
103
- var MarkdownFunctions = {
104
- Create: create_default,
105
- Read: read_default,
106
- Update: update_default
107
- };
87
+ Known servers:
108
88
 
109
- // src/blueprints/markdown/blueprint.ts
110
- var BLUEPRINT_KEY = "dxos.org/blueprint/markdown";
111
- var instructions = trim`
112
- You read, write & create markdown documents.
89
+ DXOS serverId: 837138313172353095
113
90
  `;
114
- var functions = Object.values(MarkdownFunctions);
115
91
  var make = () => Blueprint.make({
116
92
  key: BLUEPRINT_KEY,
117
- name: "Markdown",
118
- description: "Work with markdown documents.",
93
+ name: "Discord",
94
+ description: "Discord integration.",
119
95
  instructions: {
120
- source: Ref4.make(Text.make(instructions))
96
+ source: Ref.make(Text.make({
97
+ content: instructions
98
+ }))
121
99
  },
122
100
  tools: Blueprint.toolDefinitions({
123
- functions
101
+ operations: [
102
+ FetchMessages
103
+ ]
124
104
  })
125
105
  });
126
106
  var blueprint = {
127
107
  key: BLUEPRINT_KEY,
128
- functions,
129
108
  make
130
109
  };
131
- var blueprint_default = blueprint;
110
+ var blueprint_default2 = blueprint;
111
+
112
+ // src/blueprints/linear/blueprint.ts
113
+ import { Blueprint as Blueprint2 } from "@dxos/compute";
114
+ import { Ref as Ref2 } from "@dxos/echo";
115
+ import { Text as Text2 } from "@dxos/schema";
116
+ import { trim as trim2 } from "@dxos/util";
117
+
118
+ // src/blueprints/linear/functions/index.ts
119
+ import { OperationHandlerSet as OperationHandlerSet2 } from "@dxos/compute";
120
+ var LinearHandlers = OperationHandlerSet2.lazy(() => import("./sync-issues-4YE5XAK5.mjs"));
132
121
 
133
- // src/blueprints/design/blueprint.ts
134
- var BLUEPRINT_KEY2 = "dxos.org/blueprint/design";
135
- var functions2 = Object.values(MarkdownFunctions);
122
+ // src/blueprints/linear/blueprint.ts
123
+ var BLUEPRINT_KEY2 = "org.dxos.blueprint.linear";
136
124
  var instructions2 = trim2`
137
- You manage a design spec based on the conversation.
138
- The design spec is a markdown document that is used to record the tasks.
139
- The design spec document follows a hierarchical structure, with nested markdown bulleted sections.
140
- Use the appropriate tools to read and write the design spec document.
141
- Maintain the document so that it can convey all relevant points from the conversation.
142
- When replying to the user, be terse with your comments about design doc handling.
143
- Do not announce when you read or write the design spec document.
125
+ You are able to sync Linear workspaces.
126
+ Sometimes sync does not complete in one go and you need to call the function again.
127
+
128
+ Known workspaces:
129
+
130
+ DXOS teamId: 1127c63a-6f77-4725-9229-50f6cd47321c
144
131
  `;
145
132
  var make2 = () => Blueprint2.make({
146
133
  key: BLUEPRINT_KEY2,
147
- name: "Design Spec",
148
- description: "Preserve the conversation in the design spec.",
134
+ name: "Linear",
135
+ description: "Syncs Linear workspaces.",
149
136
  instructions: {
150
- source: Ref5.make(Text2.make(instructions2))
137
+ source: Ref2.make(Text2.make({
138
+ content: instructions2
139
+ }))
151
140
  },
152
- tools: functions2.map((fn22) => ToolId.make(fn22.key))
141
+ tools: Blueprint2.toolDefinitions({
142
+ operations: [
143
+ SyncIssues
144
+ ]
145
+ })
153
146
  });
154
147
  var blueprint2 = {
155
148
  key: BLUEPRINT_KEY2,
156
- functions: functions2,
157
149
  make: make2
158
150
  };
159
- var blueprint_default2 = blueprint2;
151
+ var blueprint_default3 = blueprint2;
160
152
 
161
- // src/blueprints/discord/blueprint.ts
162
- import { ToolId as ToolId2 } from "@dxos/ai";
163
- import { Blueprint as Blueprint3 } from "@dxos/blueprints";
164
- import { Ref as Ref6 } from "@dxos/echo";
165
- import { Text as Text3 } from "@dxos/schema";
166
- import { trim as trim3 } from "@dxos/util";
153
+ // src/blueprints/planning/blueprint.ts
154
+ import { Blueprint as Blueprint3 } from "@dxos/compute";
167
155
 
168
- // src/blueprints/discord/functions/fetch-messages.ts
169
- import * as FetchHttpClient from "@effect/platform/FetchHttpClient";
170
- import { DiscordConfig, DiscordREST, DiscordRESTMemoryLive } from "dfx";
171
- import * as Array2 from "effect/Array";
172
- import * as Effect4 from "effect/Effect";
173
- import * as Function from "effect/Function";
174
- import * as Layer from "effect/Layer";
175
- import * as Option from "effect/Option";
176
- import * as Schema4 from "effect/Schema";
177
- import { Obj as Obj2 } from "@dxos/echo";
178
- import { CredentialsService, TracingService, defineFunction as defineFunction4 } from "@dxos/functions";
179
- import { log } from "@dxos/log";
180
- import { Message } from "@dxos/types";
181
- var __dxlog_file = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/discord/functions/fetch-messages.ts";
182
- var TimeRange = class extends Schema4.String.pipe(Schema4.pattern(/\d+(s|m|h|d)/)).annotations({
183
- description: "Time range. 1d - 1 day, 2h - 2 hours, 30m - 30 minutes, 15s - 15 seconds.",
184
- examples: [
185
- "1d",
186
- "2h",
187
- "30m",
188
- "15s"
189
- ]
190
- }) {
191
- static toSeconds(timeRange) {
192
- const match = timeRange.match(/(\d+)(s|m|h|d)/);
193
- if (!match) {
194
- throw new Error(`Invalid time range: ${timeRange}`);
195
- }
196
- const [_, amount, unit] = match;
197
- switch (unit) {
198
- case "s":
199
- return Number(amount);
200
- case "m":
201
- return Number(amount) * 60;
202
- case "h":
203
- return Number(amount) * 60 * 60;
204
- case "d":
205
- return Number(amount) * 24 * 60 * 60;
206
- default:
207
- throw new Error(`Invalid time range unit: ${unit}`);
208
- }
209
- }
210
- };
211
- var DiscordConfigFromCredential = Layer.unwrapEffect(Effect4.gen(function* () {
212
- return DiscordConfig.layer({
213
- token: yield* CredentialsService.getApiKey({
214
- service: "discord.com"
215
- }),
216
- rest: {
217
- baseUrl: "https://api-proxy.dxos.workers.dev/discord.com/api/v10"
218
- }
219
- });
220
- }));
221
- var DEFAULT_AFTER = 1704067200;
222
- var DEFAULT_LIMIT = 500;
223
- var DEFAULT_IGNORE_USERNAMES = [
224
- "GitHub",
225
- "Needle"
226
- ];
227
- var fetch_messages_default = defineFunction4({
228
- key: "dxos.org/function/fetch-discord-messages",
229
- name: "Sync Discord messages",
230
- inputSchema: Schema4.Struct({
231
- serverId: Schema4.String.annotations({
232
- description: "The ID of the server to fetch messages from."
233
- }),
234
- channelId: Schema4.optional(Schema4.String).annotations({
235
- description: "The ID of the channel to fetch messages from. Will crawl all channels from the server if not specified."
236
- }),
237
- after: Schema4.optional(Schema4.Number).annotations({
238
- description: "Fetch messages that were sent after a given date. Unix timestamp in seconds. Exclusive with `last`."
239
- }),
240
- last: TimeRange.annotations({
241
- description: 'Time range to fetch most recent messages. Specifies the range in the past, from now. "1d" would fetch messages from the last 24 hours.'
242
- }),
243
- limit: Schema4.optional(Schema4.Number).annotations({
244
- description: "The maximum number of messages to fetch."
245
- }),
246
- pageSize: Schema4.optional(Schema4.Number).annotations({
247
- description: "The number of messages to fetch per page."
248
- }),
249
- ignoreUsernames: Schema4.optional(Schema4.Array(Schema4.String)).annotations({
250
- description: "Exclude messages from these usernames."
251
- })
252
- }),
253
- handler: Effect4.fnUntraced(function* ({ data: { serverId, channelId, after, last: last2, pageSize = 100, limit = DEFAULT_LIMIT, ignoreUsernames = DEFAULT_IGNORE_USERNAMES } }) {
254
- if (!after && !last2) {
255
- throw new Error("cannot specify both `after` and `last`");
256
- }
257
- const afterTs = last2 ? Date.now() / 1e3 - TimeRange.toSeconds(last2) : after ?? DEFAULT_AFTER;
258
- const rest = yield* DiscordREST;
259
- let channels = [];
260
- channels.push(...yield* rest.listGuildChannels(serverId));
261
- const { threads: guildThreads } = yield* rest.getActiveGuildThreads(serverId);
262
- channels.push(...guildThreads);
263
- if (channelId) {
264
- channels = channels.filter((channel) => channel.id === channelId);
265
- }
266
- if (channels.length === 0) {
267
- throw new Error("no channels found");
268
- }
269
- for (const channel of channels) {
270
- log.info("channel", {
271
- id: channel.id,
272
- name: "name" in channel ? channel.name : void 0
273
- }, {
274
- F: __dxlog_file,
275
- L: 136,
276
- S: this,
277
- C: (f, a) => f(...a)
278
- });
279
- }
280
- yield* TracingService.emitStatus({
281
- message: `Will fetch from channels: ${channels.length}`
282
- });
283
- const threads = yield* Effect4.forEach(channels, Effect4.fnUntraced(function* (channel) {
284
- const allMessages = [];
285
- let lastMessage = Option.none();
286
- while (true) {
287
- const { id: lastId = void 0 } = Function.pipe(lastMessage, Option.map(Obj2.getKeys("discord.com")), Option.flatMap(Option.fromIterable), Option.getOrElse(() => ({
288
- id: void 0
289
- })));
290
- const options = {
291
- after: !lastId ? `${generateSnowflake(afterTs)}` : lastId,
292
- limit: pageSize
293
- };
294
- log.info("fetching messages", {
295
- lastId,
296
- afterTs,
297
- afterSnowflake: options.after,
298
- after: parseSnowflake(options.after),
299
- limit: options.limit
300
- }, {
301
- F: __dxlog_file,
302
- L: 159,
303
- S: this,
304
- C: (f, a) => f(...a)
305
- });
306
- const messages = yield* rest.listMessages(channel.id, options).pipe(Effect4.map(Array2.map(makeMessage)), Effect4.map(Array2.reverse), Effect4.catchTag("ErrorResponse", (err) => err.cause.code === 50001 ? Effect4.succeed([]) : Effect4.fail(err)));
307
- if (messages.length > 0) {
308
- lastMessage = Option.fromNullable(messages.at(-1));
309
- allMessages.push(...messages);
310
- } else {
311
- break;
312
- }
313
- yield* TracingService.emitStatus({
314
- message: `Fetched messages: ${allMessages.length}`
315
- });
316
- if (allMessages.length >= limit) {
317
- break;
318
- }
319
- }
320
- return {
321
- discordChannelId: channel.id,
322
- name: "name" in channel ? channel.name ?? void 0 : void 0,
323
- messages: allMessages.filter((message) => !message.sender.name || !ignoreUsernames.includes(message.sender.name)).filter((message) => message.blocks.some((block) => block._tag === "text" && block.text.trim().length > 0))
324
- };
325
- }), {
326
- concurrency: 10
327
- });
328
- return threads.filter((thread) => thread.messages.length > 0).map(serializeThread).join("\n");
329
- }, Effect4.provide(DiscordRESTMemoryLive.pipe(Layer.provideMerge(DiscordConfigFromCredential)).pipe(Layer.provide(FetchHttpClient.layer))), Effect4.orDie)
156
+ // src/blueprints/planning/functions/index.ts
157
+ import { OperationHandlerSet as OperationHandlerSet3 } from "@dxos/compute";
158
+ var PlanningHandlers = OperationHandlerSet3.lazy(() => import("./update-tasks-H7SWIFQL.mjs"));
159
+
160
+ // src/blueprints/planning/blueprint.ts
161
+ var BLUEPRINT_KEY3 = "org.dxos.blueprint.planning";
162
+ var make3 = () => Blueprint3.make({
163
+ key: BLUEPRINT_KEY3,
164
+ name: "Planning",
165
+ description: "Plans and tracks complex tasks with artifact management.",
166
+ tools: Blueprint3.toolDefinitions({
167
+ operations: [
168
+ UpdateTasks
169
+ ]
170
+ })
330
171
  });
331
- var generateSnowflake = (unixTimestamp) => {
332
- const discordEpoch = 1420070400000n;
333
- return BigInt(unixTimestamp * 1e3) - discordEpoch << 22n;
334
- };
335
- var parseSnowflake = (snowflake) => {
336
- const discordEpoch = 1420070400000n;
337
- return new Date(Number((BigInt(snowflake) >> 22n) + discordEpoch));
172
+ var blueprint3 = {
173
+ key: BLUEPRINT_KEY3,
174
+ make: make3
338
175
  };
339
- var makeMessage = (message) => Obj2.make(Message.Message, {
340
- [Obj2.Meta]: {
341
- keys: [
342
- {
343
- id: message.id,
344
- source: "discord.com"
345
- },
346
- {
347
- id: message.channel_id,
348
- source: "discord.com/thread"
349
- }
350
- ]
176
+ var blueprint_default4 = blueprint3;
177
+
178
+ // src/blueprints/websearch/blueprint.ts
179
+ import { Blueprint as Blueprint4 } from "@dxos/compute";
180
+ import { Ref as Ref3 } from "@dxos/echo";
181
+ import { Text as Text3 } from "@dxos/schema";
182
+
183
+ // src/blueprints/websearch/functions/index.ts
184
+ import { OperationHandlerSet as OperationHandlerSet4 } from "@dxos/compute";
185
+ var WebSearchHandlers = OperationHandlerSet4.lazy(() => import("./fetch-KHMHV7JR.mjs"));
186
+
187
+ // src/blueprints/websearch/blueprint.ts
188
+ var BLUEPRINT_KEY4 = "org.dxos.blueprint.web-search";
189
+ var make4 = () => Blueprint4.make({
190
+ key: BLUEPRINT_KEY4,
191
+ name: "Web Search",
192
+ description: "Search the web.",
193
+ agentCanEnable: true,
194
+ instructions: {
195
+ source: Ref3.make(Text3.make())
351
196
  },
352
- sender: {
353
- name: message.author.username
197
+ tools: Blueprint4.toolDefinitions({
198
+ operations: [
199
+ Fetch
200
+ ],
201
+ tools: [
202
+ "AnthropicWebSearch"
203
+ ]
204
+ })
205
+ });
206
+ var blueprint4 = {
207
+ key: BLUEPRINT_KEY4,
208
+ make: make4
209
+ };
210
+ var blueprint_default5 = blueprint4;
211
+
212
+ // src/blueprints/websearch/toolkit.ts
213
+ import * as AnthropicTool from "@effect/ai-anthropic/AnthropicTool";
214
+ import * as Toolkit from "@effect/ai/Toolkit";
215
+ import * as Layer from "effect/Layer";
216
+ import { OpaqueToolkit } from "@dxos/ai";
217
+ var WebSearchToolkit = Toolkit.make(AnthropicTool.WebSearch_20250305({}));
218
+ var WebSearchToolkitOpaque = OpaqueToolkit.make(WebSearchToolkit, Layer.empty);
219
+
220
+ // src/blueprints/browser/blueprint.ts
221
+ import { Blueprint as Blueprint5 } from "@dxos/compute";
222
+ import { Ref as Ref4 } from "@dxos/echo";
223
+ import { Text as Text4 } from "@dxos/schema";
224
+ import { trim as trim3 } from "@dxos/util";
225
+ var BLUEPRINT_KEY5 = "org.dxos.blueprint.browser";
226
+ var instructions3 = trim3`
227
+ You are able to connect and use a virtual browser with persistent session.
228
+ Browser tools are provided via MCP.
229
+ `;
230
+ var make6 = () => Blueprint5.make({
231
+ key: BLUEPRINT_KEY5,
232
+ name: "Browser",
233
+ description: "Access to a real isolated browser.",
234
+ agentCanEnable: true,
235
+ instructions: {
236
+ source: Ref4.make(Text4.make({
237
+ content: instructions3
238
+ }))
354
239
  },
355
- created: message.timestamp,
356
- blocks: [
240
+ mcpServers: [
357
241
  {
358
- _tag: "text",
359
- text: message.content
242
+ // https://dash.cloudflare.com/950816f3f59b079880a1ae33fb0ec320/workers/services/view/playwright-mcp-example/production
243
+ url: "https://playwright-mcp-example.dxos.workers.dev/sse",
244
+ protocol: "sse"
360
245
  }
361
246
  ]
362
247
  });
363
- var serializeThread = (thread) => {
364
- return `<thread id=${thread.discordChannelId} name=${thread.name ?? ""}>
365
- ${thread.messages.map((message) => ` ${message.sender.name}: ${message.blocks.filter((block) => block._tag === "text").map((block) => block.text).join(" ")}`).join("\n")}
366
- </thread>`;
367
- };
368
-
369
- // src/blueprints/discord/functions/index.ts
370
- var DiscordFunctions = {
371
- Fetch: fetch_messages_default
248
+ var blueprint5 = {
249
+ key: BLUEPRINT_KEY5,
250
+ make: make6
372
251
  };
252
+ var blueprint_default6 = blueprint5;
373
253
 
374
- // src/blueprints/discord/blueprint.ts
375
- var BLUEPRINT_KEY3 = "dxos.org/blueprint/discord";
376
- var functions3 = Object.values(DiscordFunctions);
377
- var instructions3 = trim3`
378
- You are able to fetch messages from Discord servers.
254
+ // src/blueprints/database/blueprint.ts
255
+ import { Blueprint as Blueprint6 } from "@dxos/compute";
256
+ import { Ref as Ref5 } from "@dxos/echo";
257
+ import { Text as Text5 } from "@dxos/schema";
258
+ import { trim as trim4 } from "@dxos/util";
379
259
 
380
- Known servers:
260
+ // src/blueprints/database/functions/index.ts
261
+ import { OperationHandlerSet as OperationHandlerSet5 } from "@dxos/compute";
262
+ var DatabaseHandlers = OperationHandlerSet5.lazy(() => import("./context-add-VB7AOY3G.mjs"), () => import("./context-remove-VCM3VPSO.mjs"), () => import("./load-ALP3TK2E.mjs"), () => import("./object-create-Z57Y3X6Y.mjs"), () => import("./object-delete-X53LS37B.mjs"), () => import("./object-update-GVKSBR7T.mjs"), () => import("./query-PPJU5622.mjs"), () => import("./relation-create-XJ2IX6X3.mjs"), () => import("./relation-delete-EP4KXAFL.mjs"), () => import("./schema-add-Z5CY6P24.mjs"), () => import("./schema-list-W326VPVX.mjs"), () => import("./tag-add-VNIIOVJA.mjs"), () => import("./tag-remove-6R2R27W3.mjs"));
381
263
 
382
- DXOS serverId: 837138313172353095
264
+ // src/blueprints/database/blueprint.ts
265
+ var BLUEPRINT_KEY6 = "org.dxos.blueprint.database";
266
+ var instructions4 = trim4`
267
+ You can query, create, update, and delete objects in ECHO.
268
+ You can manage schemas, relations, tags, and add objects to the chat context.
383
269
  `;
384
- var make3 = () => Blueprint3.make({
385
- key: BLUEPRINT_KEY3,
386
- name: "Discord",
387
- description: "Discord integration.",
270
+ var make7 = () => Blueprint6.make({
271
+ key: BLUEPRINT_KEY6,
272
+ name: "Database",
273
+ description: "Query and manipulate objects in the ECHO database.",
274
+ agentCanEnable: true,
388
275
  instructions: {
389
- source: Ref6.make(Text3.make(instructions3))
276
+ source: Ref5.make(Text5.make({
277
+ content: instructions4
278
+ }))
390
279
  },
391
- tools: [
392
- ToolId2.make(DiscordFunctions.Fetch.key)
393
- ]
280
+ tools: Blueprint6.toolDefinitions({
281
+ operations: [
282
+ ContextAdd,
283
+ ContextRemove,
284
+ Load,
285
+ ObjectCreate,
286
+ ObjectDelete,
287
+ ObjectUpdate,
288
+ Query,
289
+ RelationCreate,
290
+ RelationDelete,
291
+ SchemaAdd,
292
+ SchemaList,
293
+ TagAdd,
294
+ TagRemove
295
+ ]
296
+ })
394
297
  });
395
- var blueprint3 = {
396
- key: BLUEPRINT_KEY3,
397
- functions: functions3,
398
- make: make3
298
+ var blueprint6 = {
299
+ key: BLUEPRINT_KEY6,
300
+ make: make7
399
301
  };
400
- var blueprint_default3 = blueprint3;
302
+ var blueprint_default7 = blueprint6;
401
303
 
402
- // src/blueprints/project/blueprint.ts
403
- import { Blueprint as Blueprint4, Template } from "@dxos/blueprints";
304
+ // src/blueprints/memory/blueprint.ts
305
+ import { Blueprint as Blueprint7 } from "@dxos/compute";
306
+ import { Ref as Ref6 } from "@dxos/echo";
307
+ import { Text as Text6 } from "@dxos/schema";
404
308
  import { trim as trim5 } from "@dxos/util";
405
309
 
406
- // src/blueprints/project/functions/add-artifact.ts
407
- import * as Effect6 from "effect/Effect";
408
- import * as Schema8 from "effect/Schema";
409
- import { AiContextService as AiContextService2 } from "@dxos/assistant";
410
- import { Database as Database5, Obj as Obj6, Ref as Ref10 } from "@dxos/echo";
411
- import { defineFunction as defineFunction5 } from "@dxos/functions";
310
+ // src/blueprints/memory/functions/index.ts
311
+ import { OperationHandlerSet as OperationHandlerSet6 } from "@dxos/compute";
312
+ var MemoryHandlers = OperationHandlerSet6.lazy(() => import("./save-GWAPLT3Z.mjs"), () => import("./query-U56GNEV6.mjs"), () => import("./delete-J3PMWP7Z.mjs"));
412
313
 
413
- // src/types/Chat.ts
414
- var Chat_exports = {};
415
- __export(Chat_exports, {
416
- Chat: () => Chat,
417
- CompanionTo: () => CompanionTo,
418
- make: () => make4
419
- });
420
- import * as Schema5 from "effect/Schema";
421
- import { Annotation, Obj as Obj3, Ref as Ref7, Type } from "@dxos/echo";
422
- import { FormInputAnnotation, LabelAnnotation } from "@dxos/echo/internal";
423
- import { Queue } from "@dxos/echo-db";
424
- var Chat = Schema5.Struct({
425
- name: Schema5.String.pipe(Schema5.optional),
426
- queue: Ref7.Ref(Queue).pipe(FormInputAnnotation.set(false)),
427
- // TODO(dmaretskyi): Eventually this and the message queue will be the same.
428
- traceQueue: Ref7.Ref(Queue).pipe(FormInputAnnotation.set(false), Schema5.optional)
429
- }).pipe(Type.object({
430
- typename: "dxos.org/type/assistant/Chat",
431
- version: "0.2.0"
432
- }), LabelAnnotation.set([
433
- "name"
434
- ]), Annotation.IconAnnotation.set({
435
- icon: "ph--atom--regular",
436
- hue: "blue"
437
- }));
438
- var make4 = (props) => Obj3.make(Chat, props);
439
- var CompanionTo = Schema5.Struct({
440
- id: Obj3.ID
441
- }).pipe(Type.relation({
442
- typename: "dxos.org/relation/assistant/CompanionTo",
443
- version: "0.1.0",
444
- source: Chat,
445
- target: Obj3.Unknown
446
- }));
314
+ // src/blueprints/memory/blueprint.ts
315
+ var BLUEPRINT_KEY7 = "org.dxos.blueprint.memory";
316
+ var instructions5 = trim5`
317
+ You have the ability to save and recall memories.
318
+ Memories are persistent knowledge units stored in the database.
319
+ Use memories to remember facts, user preferences, decisions, and any knowledge that should persist across conversations.
447
320
 
448
- // src/types/Project.ts
449
- var Project_exports = {};
450
- __export(Project_exports, {
451
- Project: () => Project,
452
- getFromChatContext: () => getFromChatContext,
453
- makeInitialized: () => makeInitialized,
454
- resetChatHistory: () => resetChatHistory
321
+ When the user asks you to remember something, save it as a memory with a descriptive title.
322
+ When the user asks about something you might have stored, query your memories first.
323
+ You can also delete outdated or incorrect memories.
324
+ `;
325
+ var make8 = () => Blueprint7.make({
326
+ key: BLUEPRINT_KEY7,
327
+ name: "Memory",
328
+ description: "Persistent memory storage and retrieval.",
329
+ agentCanEnable: true,
330
+ instructions: {
331
+ source: Ref6.make(Text6.make({
332
+ content: instructions5
333
+ }))
334
+ },
335
+ tools: Blueprint7.toolDefinitions({
336
+ operations: [
337
+ SaveMemory,
338
+ QueryMemories,
339
+ DeleteMemory
340
+ ]
341
+ })
455
342
  });
456
- import * as Effect5 from "effect/Effect";
457
- import * as Function2 from "effect/Function";
458
- import * as Schema7 from "effect/Schema";
459
- import { AiContextBinder, AiContextService } from "@dxos/assistant";
460
- import { Annotation as Annotation2, Type as Type3 } from "@dxos/echo";
461
- import { Database as Database4, Obj as Obj5, Ref as Ref9, Relation } from "@dxos/echo";
462
- import { FormInputAnnotation as FormInputAnnotation2 } from "@dxos/echo/internal";
463
- import { Queue as Queue2 } from "@dxos/echo-db";
464
- import { acquireReleaseResource } from "@dxos/effect";
465
- import { QueueService } from "@dxos/functions";
466
- import { invariant } from "@dxos/invariant";
467
- import { QueueAnnotation, Text as Text4 } from "@dxos/schema";
343
+ var blueprint7 = {
344
+ key: BLUEPRINT_KEY7,
345
+ make: make8
346
+ };
347
+ var blueprint_default8 = blueprint7;
468
348
 
469
- // src/types/Plan.ts
470
- var Plan_exports = {};
471
- __export(Plan_exports, {
472
- Plan: () => Plan,
473
- Task: () => Task,
474
- TaskId: () => TaskId,
475
- addTasks: () => addTasks,
476
- formatPlan: () => formatPlan,
477
- generateTaskId: () => generateTaskId,
478
- makePlan: () => makePlan
479
- });
480
- import * as Schema6 from "effect/Schema";
481
- import { Obj as Obj4, Ref as Ref8, Type as Type2 } from "@dxos/echo";
482
- var TaskId = Schema6.String.pipe(Schema6.brand("@dxos/assistant-toolkit/TaskId"));
483
- var Task = Schema6.Struct({
484
- /**
485
- * Short task ID unique within the plan.
486
- */
487
- id: TaskId,
488
- title: Schema6.String.annotations({
489
- description: "Task title and description."
490
- }),
491
- status: Schema6.Literal("todo", "in-progress", "done"),
492
- /**
493
- * Parent task ID.
494
- */
495
- parent: Schema6.optional(TaskId).annotations({
496
- description: "Parent task ID."
497
- }),
498
- /**
499
- * Chat object that this task is associated with.
500
- */
501
- chat: Schema6.optional(Ref8.Ref(Chat))
502
- });
503
- var Plan = Schema6.Struct({
504
- tasks: Schema6.Array(Task)
505
- }).pipe(Type2.object({
506
- typename: "dxos.org/type/Plan",
507
- version: "0.1.0"
508
- }));
509
- var generateTaskId = (plan) => {
510
- const existingIds = plan.tasks.map((task) => {
511
- const [num, letter] = task.id.split("-");
512
- return parseInt(num);
513
- }).filter((_) => !isNaN(_));
514
- let newId;
515
- if (existingIds.length === 0) {
516
- newId = 1;
517
- } else {
518
- newId = Math.max(...existingIds) + 1;
349
+ // src/blueprints/automation/blueprint.ts
350
+ import { Blueprint as Blueprint8, Trigger, Operation } from "@dxos/compute";
351
+ import { Ref as Ref7 } from "@dxos/echo";
352
+ import { Text as Text7 } from "@dxos/schema";
353
+ import { trim as trim6 } from "@dxos/util";
354
+ var BLUEPRINT_KEY8 = "dxos.org/blueprint/automation";
355
+ var instructions6 = trim6`
356
+ Automation allows you to automatically initiate actions based on events.
357
+ Automations are configured by creating a trigger that references a function.
358
+ Whenever event that matches the trigger occurs, the function is invoked.
359
+
360
+ ## Configuration
361
+
362
+ Triggers are configured by the properties of the Trigger object.
363
+ - enabled: Must be true for trigger to run.
364
+ - spec: Events that the trigger matches.
365
+ - function: Ref to a ${Operation.PersistentOperation.typename} object that will be invoked. Query the functions present in the space first, and reference them in the trigger.
366
+ - input: The spec of the input data that will be passed to the function.
367
+
368
+ ## Input patterns
369
+
370
+ Input to the invoked function is defined by the input property of the Trigger object.
371
+ It's an object that supports constants or template strings.
372
+
373
+ Example:
374
+
375
+ {
376
+ item: '{{event.item}}',
377
+ instructions: 'Summarize and perform entity-extraction'
378
+ mailbox: { '/': 'dxn:echo:AAA:ZZZ' }
519
379
  }
520
- return TaskId.make(`${newId}-${crypto.randomUUID().slice(0, 2)}`);
521
- };
522
- var addTasks = (plan, tasks) => {
523
- for (const task of tasks) {
524
- const taskId = generateTaskId(plan);
525
- plan.tasks.push({
526
- id: taskId,
527
- ...task,
528
- status: task.status ?? "todo"
529
- });
380
+
381
+ ## Trigger kinds
382
+
383
+ - Timer: Triggered by a cron schedule.
384
+ - Queue: Subscribes and processes items begginging to end.
385
+ Note: queues are the same as feeds. The queue DXN should be of form: dxn:queue:data:<space-id>:<queue-id>.
386
+ - Subscription: Subscribes and processes database items based on a query.
387
+
388
+ Avoid: email and webhook triggers.
389
+
390
+ ## Editing triggers
391
+
392
+ Triggers are represented as objects of type ${Trigger.Trigger.typename}.
393
+ You need access to the Database blueprint to manipulate triggers.
394
+ Read trigger schema before manipulating triggers.
395
+ Having a Trigger object in the database is enough to setup an automation.
396
+
397
+ ## Examples
398
+
399
+ Timer:
400
+
401
+ {
402
+ "function": { "/": "dxn:echo:AAA:ZZZ" },
403
+ "enabled": true,
404
+ "spec": {
405
+ "kind": "timer",
406
+ "cron": "*/5 * * * *"
407
+ }
530
408
  }
531
- return plan;
532
- };
533
- var makePlan = (props) => {
534
- const plan = Obj4.make(Plan, {
535
- tasks: []
536
- });
537
- Obj4.change(plan, (plan2) => {
538
- addTasks(plan2, props.tasks);
539
- });
540
- return plan;
541
- };
542
- var formatPlan = (plan) => {
543
- return plan.tasks.map((task) => `- **${task.status?.toLocaleUpperCase()}**: ${task.title ?? "No title"} <!-- id=${task.id} -->`).join("\n");
544
- };
545
409
 
546
- // src/types/Project.ts
547
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/types/Project.ts";
548
- var Project = Schema7.Struct({
549
- name: Schema7.String,
550
- spec: Ref9.Ref(Text4.Text).pipe(FormInputAnnotation2.set(false)),
551
- plan: Ref9.Ref(Plan).pipe(FormInputAnnotation2.set(false)),
552
- artifacts: Schema7.Array(Schema7.Struct({
553
- // TODO(dmaretskyi): Consider gettings names from the artifact itself using Obj.getLabel.
554
- name: Schema7.String,
555
- data: Ref9.Ref(Obj5.Unknown)
556
- })).pipe(FormInputAnnotation2.set(false)),
557
- /**
558
- * Incoming queue that the agent processes.
559
- */
560
- // NOTE: Named `queue` to conform to subscribable schema (see QueueAnnotation).
561
- queue: Schema7.optional(Ref9.Ref(Queue2).pipe(FormInputAnnotation2.set(false))),
562
- // TODO(dmaretskyi): Multiple chats.
563
- chat: Schema7.optional(Ref9.Ref(Chat).pipe(FormInputAnnotation2.set(false))),
564
- /**
565
- * References to objects with a canonical queue property.
566
- * Schema must have the QueueAnnotation.
567
- */
568
- // TODO(dmaretskyi): Turn into an array of objects when form-data
569
- subscriptions: Schema7.Array(Ref9.Ref(Obj5.Unknown)).pipe(FormInputAnnotation2.set(false)),
570
- useQualifyingAgent: Schema7.optional(Schema7.Boolean).annotations({
571
- title: "Use qualifying agent on subscriptions",
572
- description: "If enabled, the qualifying agent will be used to determine if the event is relevant to the project. Related events will be added to the input queue of the project. It is recommended to enable this."
573
- })
574
- }).pipe(Type3.object({
575
- typename: "dxos.org/type/Project",
576
- version: "0.1.0"
577
- }), Annotation2.IconAnnotation.set({
578
- icon: "ph--circuitry--regular",
579
- hue: "green"
580
- }), QueueAnnotation.set(true));
581
- var makeInitialized = (props, blueprint11) => Effect5.gen(function* () {
582
- const project = Obj5.make(Project, {
583
- ...props,
584
- spec: Ref9.make(Text4.make(props.spec)),
585
- plan: Ref9.make(makePlan({
586
- tasks: []
587
- })),
588
- artifacts: props.artifacts ?? [],
589
- subscriptions: props.subscriptions ?? [],
590
- useQualifyingAgent: props.useQualifyingAgent ?? true
591
- });
592
- yield* Database4.add(project);
593
- const queue = yield* QueueService.createQueue();
594
- const contextBinder = new AiContextBinder({
595
- queue
596
- });
597
- const projectBlueprint = yield* Database4.add(Obj5.clone(blueprint11, {
598
- deep: true
599
- }));
600
- yield* Effect5.promise(() => contextBinder.bind({
601
- blueprints: [
602
- Ref9.make(projectBlueprint),
603
- ...props.blueprints ?? []
604
- ],
605
- objects: [
606
- Ref9.make(project),
607
- ...props.contextObjects ?? []
608
- ]
609
- }));
610
- const chat = yield* Database4.add(make4({
611
- [Obj5.Parent]: project,
612
- queue: Ref9.fromDXN(queue.dxn)
613
- }));
614
- yield* Database4.add(Relation.make(CompanionTo, {
615
- [Relation.Source]: chat,
616
- [Relation.Target]: project
617
- }));
618
- const inputQueue = yield* QueueService.createQueue();
619
- Obj5.change(project, (project2) => {
620
- project2.chat = Ref9.make(chat);
621
- project2.queue = Ref9.fromDXN(inputQueue.dxn);
622
- });
623
- return project;
624
- });
625
- var resetChatHistory = (project) => Effect5.gen(function* () {
626
- invariant(project.chat, "Project must have an existing chat to reset.", {
627
- F: __dxlog_file2,
628
- L: 148,
629
- S: this,
630
- A: [
631
- "project.chat",
632
- "'Project must have an existing chat to reset.'"
633
- ]
634
- });
635
- const existingQueue = yield* project.chat.pipe(Database4.load).pipe(Effect5.map((_) => _.queue), Effect5.flatMap(Database4.load));
636
- const existingContextBinder = yield* acquireReleaseResource(() => new AiContextBinder({
637
- queue: existingQueue
638
- }));
639
- const blueprints = existingContextBinder.getBlueprints().map((blueprint11) => Ref9.make(blueprint11));
640
- const objects = existingContextBinder.getObjects().map((object) => Ref9.make(object));
641
- const queue = yield* QueueService.createQueue();
642
- const contextBinder = new AiContextBinder({
643
- queue
644
- });
645
- yield* Effect5.promise(() => contextBinder.bind({
646
- blueprints,
647
- objects
648
- }));
649
- const chat = yield* Database4.add(make4({
650
- queue: Ref9.fromDXN(queue.dxn)
651
- }));
652
- Obj5.change(project, (project2) => {
653
- project2.chat = Ref9.make(chat);
654
- });
655
- yield* Database4.add(Relation.make(CompanionTo, {
656
- [Relation.Source]: chat,
657
- [Relation.Target]: project
658
- }));
659
- }).pipe(Effect5.scoped);
660
- var getFromChatContext = Effect5.gen(function* () {
661
- const projects = yield* Function2.pipe(AiContextService.findObjects(Project));
662
- if (projects.length !== 1) {
663
- throw new Error("There should be exactly one project in context. Got: " + projects.length);
664
- }
665
- const project = projects[0];
666
- return project;
667
- });
410
+ Queue:
668
411
 
669
- // src/blueprints/project/functions/add-artifact.ts
670
- var add_artifact_default = defineFunction5({
671
- key: "dxos.org/function/project/add-artifact",
672
- name: "Add artifact",
673
- description: "Adds a new artifact.",
674
- inputSchema: Schema8.Struct({
675
- name: Schema8.String.annotations({
676
- description: "The name of the artifact to add."
677
- }),
678
- artifact: Ref10.Ref(Obj6.Unknown).annotations({
679
- description: "The artifact to add. Do NOT guess or try to generate the ID."
680
- })
681
- }),
682
- services: [
683
- AiContextService2
684
- ],
685
- handler: Effect6.fnUntraced(function* ({ data }) {
686
- if (!(yield* Database5.load(data.artifact))) {
687
- throw new Error("Artifact not found.");
412
+ {
413
+ "function": { "/": "dxn:echo:AAA:ZZZ" },
414
+ "enabled": true,
415
+ "spec": {
416
+ "kind": "queue",
417
+ "queue": "dxn:queue:data:XXX:YYY"
688
418
  }
689
- const project = yield* Project_exports.getFromChatContext;
690
- Obj6.change(project, (project2) => {
691
- project2.artifacts.push({
692
- name: data.name,
693
- data: data.artifact
694
- });
695
- });
696
- }, AiContextService2.fixFunctionHandlerType)
697
- });
419
+ }
698
420
 
699
- // src/blueprints/project/functions/agent.ts
700
- import * as Effect7 from "effect/Effect";
701
- import * as Schema9 from "effect/Schema";
702
- import { AiService } from "@dxos/ai";
703
- import { AiContextService as AiContextService3, AiConversation } from "@dxos/assistant";
704
- import { Database as Database6, Obj as Obj7, Ref as Ref11 } from "@dxos/echo";
705
- import { acquireReleaseResource as acquireReleaseResource2 } from "@dxos/effect";
706
- import { TriggerEvent, defineFunction as defineFunction6 } from "@dxos/functions";
707
- import { invariant as invariant2 } from "@dxos/invariant";
708
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/project/functions/agent.ts";
709
- var agent_default = defineFunction6({
710
- key: "dxos.org/function/project/agent",
711
- name: "Project Agent",
712
- description: "Agentic worker that drives the project autonomously.",
713
- inputSchema: Schema9.Struct({
714
- project: Schema9.suspend(() => Ref11.Ref(Project_exports.Project)),
715
- prompt: Schema9.optional(Schema9.String),
716
- event: Schema9.optional(TriggerEvent.TriggerEvent)
717
- }),
718
- outputSchema: Schema9.Void,
719
- services: [
720
- AiContextService3
721
- ],
722
- handler: Effect7.fnUntraced(function* ({ data }) {
723
- const project = yield* Database6.load(data.project);
724
- invariant2(Obj7.instanceOf(Project_exports.Project, project), void 0, {
725
- F: __dxlog_file3,
726
- L: 33,
727
- S: this,
728
- A: [
729
- "Obj.instanceOf(Project.Project, project)",
730
- ""
731
- ]
732
- });
733
- invariant2(project.chat, "Project has no chat.", {
734
- F: __dxlog_file3,
735
- L: 34,
736
- S: this,
737
- A: [
738
- "project.chat",
739
- "'Project has no chat.'"
740
- ]
741
- });
742
- const chatQueue = yield* project.chat.pipe(Database6.load, Effect7.flatMap((chat) => Database6.load(chat.queue)));
743
- invariant2(chatQueue, "Project chat queue not found.", {
744
- F: __dxlog_file3,
745
- L: 40,
746
- S: this,
747
- A: [
748
- "chatQueue",
749
- "'Project chat queue not found.'"
750
- ]
751
- });
752
- const conversation = yield* acquireReleaseResource2(() => new AiConversation({
753
- queue: chatQueue
754
- }));
755
- const iniativesInContext = conversation.context.getObjects().filter(Obj7.instanceOf(Project_exports.Project));
756
- if (iniativesInContext.length !== 1) {
757
- throw new Error("There should be exactly one project in context. Got: " + iniativesInContext.length);
758
- }
759
- if (!data.prompt && !data.event) {
760
- throw new Error("Either prompt or event must be provided.");
761
- }
762
- let input = "";
763
- if (data.prompt) {
764
- input += `${data.prompt}
421
+ Subscription:
765
422
 
766
- `;
423
+ {
424
+ "function": { "/": "dxn:echo:AAA:ZZZ" },
425
+ "enabled": true,
426
+ "spec": {
427
+ "kind": "subscription",
428
+ "query": { "ast": { "type": "select", "filter": { "type": "object", "typename": "dxn:type:org.dxos.type.person" } } }
767
429
  }
768
- if (data.event) {
769
- input += `<event>
770
- ${JSON.stringify(data.event, null, 2)}
771
- </event>
772
-
430
+ }
773
431
  `;
774
- }
775
- yield* conversation.createRequest({
776
- prompt: input
777
- }).pipe(Effect7.retry({
778
- times: 2
779
- }));
780
- }, Effect7.scoped, Effect7.provide(AiService.model("@anthropic/claude-sonnet-4-5")), AiContextService3.fixFunctionHandlerType)
781
- });
782
-
783
- // src/blueprints/project/functions/get-context.ts
784
- import * as Effect8 from "effect/Effect";
785
- import * as Schema10 from "effect/Schema";
786
- import { AiContextService as AiContextService4 } from "@dxos/assistant";
787
- import { Database as Database7, Obj as Obj8 } from "@dxos/echo";
788
- import { defineFunction as defineFunction7 } from "@dxos/functions";
789
- var get_context_default = defineFunction7({
790
- key: "dxos.org/function/project/get-context",
791
- name: "Get Project Context",
792
- description: "Get the context of an project.",
793
- inputSchema: Schema10.Struct({}),
794
- outputSchema: Schema10.Struct({
795
- id: Schema10.String,
796
- name: Schema10.String,
797
- spec: Schema10.String,
798
- plan: Schema10.String,
799
- artifacts: Schema10.Array(Schema10.Struct({
800
- name: Schema10.String,
801
- type: Schema10.optional(Schema10.String),
802
- dxn: Schema10.optional(Schema10.String)
432
+ var make9 = () => Blueprint8.make({
433
+ key: BLUEPRINT_KEY8,
434
+ name: "Triggers",
435
+ description: "Trigger management and automation.",
436
+ instructions: {
437
+ source: Ref7.make(Text7.make({
438
+ content: instructions6
803
439
  }))
804
- }),
805
- services: [
806
- AiContextService4
807
- ],
808
- handler: Effect8.fnUntraced(function* ({ data: _data }) {
809
- const project = yield* Project_exports.getFromChatContext;
810
- return {
811
- id: project.id,
812
- name: project.name,
813
- spec: yield* project.spec.pipe(Database7.load).pipe(Effect8.map((_) => _.content), Effect8.catchTag("ObjectNotFoundError", () => Effect8.succeed("No spec found."))),
814
- plan: yield* project.plan?.pipe(Database7.load).pipe(Effect8.map(Plan_exports.formatPlan), Effect8.catchTag("ObjectNotFoundError", () => Effect8.succeed("No plan found."))) ?? Effect8.succeed("No plan found."),
815
- artifacts: yield* Effect8.forEach(project.artifacts, (artifact) => Effect8.gen(function* () {
816
- return {
817
- name: artifact.name,
818
- type: yield* Database7.load(artifact.data).pipe(Effect8.map(Obj8.getTypename), Effect8.catchTag("ObjectNotFoundError", () => Effect8.succeed("Artifact not found."))),
819
- dxn: artifact.data.dxn.toString()
820
- };
821
- }))
822
- };
823
- }, AiContextService4.fixFunctionHandlerType)
824
- });
825
-
826
- // src/blueprints/project/functions/qualifier.ts
827
- import * as LanguageModel from "@effect/ai/LanguageModel";
828
- import * as Prompt from "@effect/ai/Prompt";
829
- import * as Effect9 from "effect/Effect";
830
- import * as Schema11 from "effect/Schema";
831
- import { AiService as AiService2 } from "@dxos/ai";
832
- import { Database as Database8, Obj as Obj9, Ref as Ref12 } from "@dxos/echo";
833
- import { TriggerEvent as TriggerEvent2, defineFunction as defineFunction8 } from "@dxos/functions";
834
- import { invariant as invariant3 } from "@dxos/invariant";
835
- import { trim as trim4 } from "@dxos/util";
836
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/project/functions/qualifier.ts";
837
- var qualifier_default = defineFunction8({
838
- key: "dxos.org/function/project/qualifier",
839
- name: "Project Qualifier",
840
- description: "Qualifier that determines if the event is relevant to the project. Puts the data into the input queue of the project.",
841
- inputSchema: Schema11.Struct({
842
- project: Schema11.suspend(() => Ref12.Ref(Project_exports.Project)),
843
- event: TriggerEvent2.TriggerEvent
844
- }),
845
- outputSchema: Schema11.Void,
846
- services: [],
847
- handler: Effect9.fnUntraced(function* ({ data }) {
848
- const project = yield* Database8.load(data.project);
849
- invariant3(Obj9.instanceOf(Project_exports.Project, project), void 0, {
850
- F: __dxlog_file4,
851
- L: 32,
852
- S: this,
853
- A: [
854
- "Obj.instanceOf(Project.Project, project)",
855
- ""
856
- ]
857
- });
858
- invariant3(project.chat, "Project has no chat.", {
859
- F: __dxlog_file4,
860
- L: 33,
861
- S: this,
862
- A: [
863
- "project.chat",
864
- "'Project has no chat.'"
865
- ]
866
- });
867
- const { id, name, queue } = project;
868
- if (!queue) {
869
- throw new Error("Project has no queue.");
870
- }
871
- const plan = yield* Database8.load(project.plan);
872
- const spec = yield* Database8.load(project.spec);
873
- const { value: { isRelevant } } = yield* LanguageModel.generateObject({
874
- schema: Schema11.Struct({
875
- isRelevant: Schema11.Boolean
876
- }),
877
- prompt: Prompt.fromMessages([
878
- Prompt.systemMessage({
879
- content: trim4`
880
- You are a qualifying agent that determines if the event is relevant to the project.
881
- Respond with true if the event is relevant to the project, false otherwise.
882
- If you are not sure, return true.
883
- The qualified events will be forwarded to the larger agent that will process them.
884
- <project id="${id}" name="${name}">
885
- <spec>
886
- ${spec.content}
887
- </spec>
888
- <plan>
889
- ${Plan_exports.formatPlan(plan)}
890
- </plan>
891
- </project>
892
- `
893
- }),
894
- Prompt.userMessage({
895
- content: [
896
- Prompt.makePart("text", {
897
- text: trim4`
898
- <event>
899
- ${JSON.stringify(data.event, null, 2)}
900
- </event>
901
- `
902
- })
903
- ]
904
- })
905
- ])
906
- });
907
- if (isRelevant) {
908
- const queueTarget = yield* Database8.load(queue);
909
- if ("queue" in data.event && data.event.item) {
910
- const obj = data.event.item;
911
- yield* Effect9.promise(() => queueTarget.append([
912
- obj
913
- ]));
914
- } else if ("subject" in data.event && Ref12.isRef(data.event.subject)) {
915
- const obj = yield* Database8.load(data.event.subject);
916
- yield* Effect9.promise(() => queueTarget.append([
917
- obj
918
- ]));
919
- } else {
920
- throw new Error("Invalid event.");
921
- }
922
- }
923
- }, Effect9.scoped, Effect9.provide(AiService2.model("@anthropic/claude-sonnet-4-5")))
440
+ }
924
441
  });
925
-
926
- // src/blueprints/project/functions/index.ts
927
- var ProjectFunctions = {
928
- AddArtifact: add_artifact_default,
929
- Agent: agent_default,
930
- GetContext: get_context_default,
931
- Qualifier: qualifier_default
442
+ var blueprint8 = {
443
+ key: BLUEPRINT_KEY8,
444
+ make: make9
932
445
  };
446
+ var blueprint_default9 = blueprint8;
933
447
 
934
- // src/blueprints/project/blueprint.ts
935
- var BLUEPRINT_KEY4 = "dxos.org/blueprint/project";
936
- var functions4 = [
937
- ProjectFunctions.AddArtifact
938
- ];
939
- var make5 = () => Blueprint4.make({
940
- key: BLUEPRINT_KEY4,
941
- name: "Project blueprint",
942
- instructions: Template.make({
943
- source: trim5`
944
- You work on an project. Each project has a spec - the goal of the project.
945
- The project plan shows the current progress of the project.
946
- Project has an number of associated artifacts you can read/write.
947
- Spec and plan are also artifacts.
948
- You can edit them if necessary.
949
-
950
- IMPORTANT: When create a new artifact, always add it to the project using the add-artifact function.
448
+ // src/blueprints/blueprint-manager/blueprint.ts
449
+ import { Blueprint as Blueprint9, Template } from "@dxos/compute";
450
+ import { trim as trim7 } from "@dxos/util";
951
451
 
952
- {{#with project}}
953
- <project id="{{id}}" name="{{name}}">
954
- <spec>
955
- {{spec}}
956
- </spec>
957
- <plan>
958
- {{plan}}
959
- </plan>
452
+ // src/blueprints/blueprint-manager/functions/index.ts
453
+ import { OperationHandlerSet as OperationHandlerSet7 } from "@dxos/compute";
454
+ var BlueprintManagerHandlers = OperationHandlerSet7.lazy(() => import("./query-blueprints-KXADGHSA.mjs"), () => import("./enable-blueprints-LBDZH2CY.mjs"), () => import("./update-blueprints-N2AK2VUR.mjs"));
960
455
 
961
- <artifacts>
962
- {{#each artifacts}}
963
- <artifact type="{{type}}" dxn="{{dxn}}">
964
- {{name}}
965
- </artifact>
966
- {{/each}}
967
- </artifacts>
968
- </project>
969
- {{/with}}
456
+ // src/blueprints/blueprint-manager/blueprint.ts
457
+ var BLUEPRINT_KEY9 = "org.dxos.blueprint.blueprint-manager";
458
+ var make10 = () => Blueprint9.make({
459
+ key: BLUEPRINT_KEY9,
460
+ name: "Blueprint Manager",
461
+ description: "Query and enable blueprints in the current conversation.",
462
+ instructions: Template.make({
463
+ source: trim7`
464
+ You can query available blueprints and enable them in the current conversation.
465
+ Use [query-blueprints] to refresh the list of available blueprints.
466
+ Use [refresh-blueprints] to update blueprint objects stored in the database from the built-in registry when they have drifted.
467
+ Use [enable-blueprints] to enable blueprints by their keys. Always call [query-blueprints] first.
468
+ Only blueprints with agentCanEnable=true can be enabled by the agent.
469
+
470
+ <available_blueprints>
471
+ {{#each blueprints}}
472
+ - {{key}} "{{name}}"{{#if description}} -- {{description}}{{/if}}{{#if agentCanEnable}} [agent-can-enable]{{/if}}
473
+ {{/each}}
474
+ </available_blueprints>
475
+
476
+ NOTE: You must enable the blueprint to use it, only then the tools from that blueprint will appear.
970
477
  `,
971
478
  inputs: [
972
479
  {
973
- name: "project",
974
- kind: "function",
975
- function: "dxos.org/function/project/get-context"
480
+ name: "blueprints",
481
+ kind: "operation",
482
+ operation: QueryBlueprints.meta.key
976
483
  }
977
484
  ]
978
485
  }),
979
- tools: Blueprint4.toolDefinitions({
980
- functions: functions4
981
- })
982
- });
983
- var blueprint4 = {
984
- key: BLUEPRINT_KEY4,
985
- functions: functions4,
986
- make: make5
987
- };
988
- var blueprint_default4 = blueprint4;
989
-
990
- // src/blueprints/linear/blueprint.ts
991
- import { ToolId as ToolId3 } from "@dxos/ai";
992
- import { Blueprint as Blueprint5 } from "@dxos/blueprints";
993
- import { Ref as Ref15 } from "@dxos/echo";
994
- import { Text as Text5 } from "@dxos/schema";
995
- import { trim as trim6 } from "@dxos/util";
996
-
997
- // src/blueprints/linear/functions/sync-issues.ts
998
- import * as FetchHttpClient2 from "@effect/platform/FetchHttpClient";
999
- import * as HttpClient from "@effect/platform/HttpClient";
1000
- import * as Array7 from "effect/Array";
1001
- import * as Effect11 from "effect/Effect";
1002
- import * as Function3 from "effect/Function";
1003
- import * as Schema12 from "effect/Schema";
1004
- import { Filter as Filter2, Obj as Obj11, Query as Query2, Ref as Ref14 } from "@dxos/echo";
1005
- import { Database as Database10 } from "@dxos/echo";
1006
- import { CredentialsService as CredentialsService2, defineFunction as defineFunction9, withAuthorization } from "@dxos/functions";
1007
- import { log as log3 } from "@dxos/log";
1008
- import { Person, Pipeline, Task as Task2 } from "@dxos/types";
1009
-
1010
- // src/sync/sync.ts
1011
- import * as Effect10 from "effect/Effect";
1012
- import { Filter, Obj as Obj10, Query, Ref as Ref13 } from "@dxos/echo";
1013
- import { Database as Database9 } from "@dxos/echo";
1014
- import { failedInvariant } from "@dxos/invariant";
1015
- import { log as log2 } from "@dxos/log";
1016
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/sync/sync.ts";
1017
- var syncObjects = Effect10.fn("syncObjects")(function* (objs, { foreignKeyId }) {
1018
- return yield* Effect10.forEach(objs, Effect10.fnUntraced(function* (obj) {
1019
- for (const key of Object.keys(obj)) {
1020
- if (typeof key !== "string" || key === "id") continue;
1021
- if (!Ref13.isRef(obj[key])) continue;
1022
- const ref = obj[key];
1023
- if (!ref.target) continue;
1024
- if (Obj10.getDXN(ref.target).isLocalObjectId()) {
1025
- const [target] = yield* syncObjects([
1026
- ref.target
1027
- ], {
1028
- foreignKeyId
1029
- });
1030
- obj[key] = Ref13.make(target);
1031
- }
1032
- }
1033
- const schema = Obj10.getSchema(obj) ?? failedInvariant("No schema.");
1034
- const foreignId = Obj10.getKeys(obj, foreignKeyId)[0]?.id ?? failedInvariant("No foreign key.");
1035
- const [existing] = yield* Database9.runQuery(Query.select(Filter.foreignKeys(schema, [
1036
- {
1037
- source: foreignKeyId,
1038
- id: foreignId
1039
- }
1040
- ])));
1041
- log2("sync object", {
1042
- type: Obj10.getTypename(obj),
1043
- foreignId,
1044
- existing: existing ? Obj10.getDXN(existing) : void 0
1045
- }, {
1046
- F: __dxlog_file5,
1047
- L: 48,
1048
- S: this,
1049
- C: (f, a) => f(...a)
1050
- });
1051
- if (!existing) {
1052
- yield* Database9.add(obj);
1053
- return obj;
1054
- } else {
1055
- copyObjectData(existing, obj);
1056
- return existing;
1057
- }
1058
- }), {
1059
- concurrency: 1
1060
- });
1061
- });
1062
- var copyObjectData = (existing, newObj) => {
1063
- Obj10.change(existing, (obj) => {
1064
- for (const key of Object.keys(newObj)) {
1065
- if (typeof key !== "string" || key === "id") continue;
1066
- if (typeof newObj[key] !== "string" && typeof newObj[key] !== "number" && typeof newObj[key] !== "boolean" && !Ref13.isRef(newObj[key])) continue;
1067
- obj[key] = newObj[key];
1068
- }
1069
- for (const key of Object.keys(obj)) {
1070
- if (typeof key !== "string" || key === "id") continue;
1071
- if (!(key in newObj)) {
1072
- delete obj[key];
1073
- }
1074
- }
1075
- for (const foreignKey of Obj10.getMeta(newObj).keys) {
1076
- Obj10.deleteKeys(obj, foreignKey.source);
1077
- Obj10.getMeta(obj).keys.push({
1078
- ...foreignKey
1079
- });
1080
- }
1081
- });
1082
- };
1083
-
1084
- // src/util/graphql.ts
1085
- import * as HttpBody from "@effect/platform/HttpBody";
1086
- var graphqlRequestBody = (query2, variables = {}) => HttpBody.json({
1087
- query: query2,
1088
- variables
1089
- });
1090
-
1091
- // src/blueprints/linear/functions/sync-issues.ts
1092
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/linear/functions/sync-issues.ts";
1093
- var queryIssues = `
1094
- query Issues($teamId: String!, $after: DateTimeOrDuration!) {
1095
- team(id: $teamId) {
1096
- id
1097
- name
1098
-
1099
-
1100
- issues(last: 150, orderBy: updatedAt, filter: {
1101
- updatedAt: { gt: $after }
1102
- }) {
1103
- edges {
1104
- node {
1105
- id
1106
- title
1107
- createdAt
1108
- updatedAt
1109
- description
1110
- assignee { id, name }
1111
- state {
1112
- name
1113
- }
1114
- project {
1115
- id
1116
- name
1117
- }
1118
- }
1119
- cursor
1120
- }
1121
- pageInfo {
1122
- hasNextPage
1123
- endCursor
1124
- }
1125
- }
1126
- }
1127
- }
1128
- `;
1129
- var LINEAR_ID_KEY = "linear.app/id";
1130
- var LINEAR_TEAM_ID_KEY = "linear.app/teamId";
1131
- var LINEAR_UPDATED_AT_KEY = "linear.app/updatedAt";
1132
- var sync_issues_default = defineFunction9({
1133
- key: "dxos.org/function/linear/sync-issues",
1134
- name: "Linear",
1135
- description: "Sync issues from Linear.",
1136
- inputSchema: Schema12.Struct({
1137
- team: Schema12.String.annotations({
1138
- description: "Linear team id."
1139
- })
1140
- }),
1141
- handler: Effect11.fnUntraced(function* ({ data }) {
1142
- const credential = yield* CredentialsService2.getCredential({
1143
- service: "linear.app"
1144
- });
1145
- const client = yield* HttpClient.HttpClient.pipe(Effect11.map(withAuthorization(credential.apiKey)));
1146
- const after = yield* getLatestUpdateTimestamp(data.team, Task2.Task);
1147
- log3.info("will fetch", {
1148
- after
1149
- }, {
1150
- F: __dxlog_file6,
1151
- L: 93,
1152
- S: this,
1153
- C: (f, a) => f(...a)
1154
- });
1155
- const response = yield* client.post("https://api.linear.app/graphql", {
1156
- body: yield* graphqlRequestBody(queryIssues, {
1157
- teamId: data.team,
1158
- after
1159
- })
1160
- });
1161
- const json2 = yield* response.json;
1162
- const tasks = json2.data.team.issues.edges.map((edge) => mapLinearIssue(edge.node, {
1163
- teamId: data.team
1164
- }));
1165
- log3.info("Fetched tasks", {
1166
- count: tasks.length
1167
- }, {
1168
- F: __dxlog_file6,
1169
- L: 106,
1170
- S: this,
1171
- C: (f, a) => f(...a)
1172
- });
1173
- return {
1174
- objects: yield* syncObjects(tasks, {
1175
- foreignKeyId: LINEAR_ID_KEY
1176
- }),
1177
- syncComplete: tasks.length < 150
1178
- };
1179
- }, Effect11.provide(FetchHttpClient2.layer))
1180
- });
1181
- var getLatestUpdateTimestamp = Effect11.fnUntraced(function* (teamId, dataType) {
1182
- const existingTasks = yield* Database10.runQuery(Query2.type(dataType).select(Filter2.foreignKeys(dataType, [
1183
- {
1184
- source: LINEAR_TEAM_ID_KEY,
1185
- id: teamId
1186
- }
1187
- ])));
1188
- return Function3.pipe(existingTasks, Array7.map((task) => Obj11.getKeys(task, LINEAR_UPDATED_AT_KEY).at(0)?.id), Array7.filter((x) => x !== void 0), Array7.reduce("2025-01-01T00:00:00.000Z", (acc, x) => x > acc ? x : acc));
1189
- });
1190
- var mapLinearPerson = (person, { teamId }) => Obj11.make(Person.Person, {
1191
- [Obj11.Meta]: {
1192
- keys: [
1193
- {
1194
- id: person.id,
1195
- source: LINEAR_ID_KEY
1196
- },
1197
- {
1198
- id: teamId,
1199
- source: LINEAR_TEAM_ID_KEY
1200
- }
1201
- ]
1202
- },
1203
- nickname: person.name
1204
- });
1205
- var mapLinearIssue = (issue, { teamId }) => Obj11.make(Task2.Task, {
1206
- [Obj11.Meta]: {
1207
- keys: [
1208
- {
1209
- id: issue.id,
1210
- source: LINEAR_ID_KEY
1211
- },
1212
- {
1213
- id: issue.updatedAt,
1214
- source: LINEAR_UPDATED_AT_KEY
1215
- },
1216
- {
1217
- id: teamId,
1218
- source: LINEAR_TEAM_ID_KEY
1219
- }
486
+ tools: Blueprint9.toolDefinitions({
487
+ operations: [
488
+ QueryBlueprints,
489
+ EnableBlueprints,
490
+ UpdateBlueprints
1220
491
  ]
1221
- },
1222
- title: issue.title ?? void 0,
1223
- description: issue.description ?? void 0,
1224
- assigned: !issue.assignee ? void 0 : Ref14.make(mapLinearPerson(issue.assignee, {
1225
- teamId
1226
- })),
1227
- // TODO(dmaretskyi): Sync those (+ linear team as org?).
1228
- // state: issue.state.name,
1229
- project: !issue.project ? void 0 : Ref14.make(Pipeline.make({
1230
- [Obj11.Meta]: {
1231
- keys: [
1232
- {
1233
- id: issue.project.id,
1234
- source: LINEAR_ID_KEY
1235
- },
1236
- {
1237
- id: teamId,
1238
- source: LINEAR_TEAM_ID_KEY
1239
- }
1240
- ]
1241
- },
1242
- name: issue.project.name
1243
- }))
1244
- });
1245
-
1246
- // src/blueprints/linear/functions/index.ts
1247
- var LinearFunctions = {
1248
- Sync: sync_issues_default
1249
- };
1250
-
1251
- // src/blueprints/linear/blueprint.ts
1252
- var BLUEPRINT_KEY5 = "dxos.org/blueprint/linear";
1253
- var functions5 = Object.values(LinearFunctions);
1254
- var instructions4 = trim6`
1255
- You are able to sync Linear workspaces.
1256
- Sometimes sync does not complete in one go and you need to call the function again.
1257
-
1258
- Known workspaces:
1259
-
1260
- DXOS teamId: 1127c63a-6f77-4725-9229-50f6cd47321c
1261
- `;
1262
- var make6 = () => Blueprint5.make({
1263
- key: BLUEPRINT_KEY5,
1264
- name: "Linear",
1265
- description: "Syncs Linear workspaces.",
1266
- instructions: {
1267
- source: Ref15.make(Text5.make(instructions4))
1268
- },
1269
- tools: functions5.map((tool) => ToolId3.make(tool.key))
492
+ })
1270
493
  });
1271
- var blueprint5 = {
1272
- key: BLUEPRINT_KEY5,
1273
- functions: functions5,
1274
- make: make6
494
+ var blueprint9 = {
495
+ key: BLUEPRINT_KEY9,
496
+ make: make10
1275
497
  };
1276
- var blueprint_default5 = blueprint5;
1277
-
1278
- // src/blueprints/planning/blueprint.ts
1279
- import { Blueprint as Blueprint6 } from "@dxos/blueprints";
1280
-
1281
- // src/blueprints/planning/functions/update-tasks.ts
1282
- import * as Effect12 from "effect/Effect";
1283
- import * as Schema13 from "effect/Schema";
1284
- import { AiContextService as AiContextService5 } from "@dxos/assistant";
1285
- import { Database as Database11, Obj as Obj12 } from "@dxos/echo";
1286
- import { defineFunction as defineFunction10 } from "@dxos/functions";
1287
- import { trim as trim7 } from "@dxos/util";
1288
- var INSTRUCTIONS = trim7`
1289
- TASK MANAGEMENT TOOL - USAGE GUIDELINES
1290
-
1291
- This tool maintains an organized task list during work sessions to track progress, break down objectives, and ensure thoroughness. After creating initial tasks, update them silently without announcing changes to the user.
1292
-
1293
- === CORE USAGE PRINCIPLES ===
1294
-
1295
- Create and manage tasks for: multi-step objectives requiring 3+ distinct actions, complex projects needing careful sequencing, user requests for task organization, multiple deliverables provided together, new instructions (capture as tasks immediately with new IDs), completed work (mark done and add follow-ups), and active work (mark as 'in-progress', limit one at a time).
1296
-
1297
- Skip task management for: single straightforward actions, simple requests achievable in 1-2 steps, informational queries, quick lookups or clarifications, and avoid creating verification tasks unless requested.
1298
-
1299
- === TOOL SPECIFICATION ===
1300
-
1301
- update-tasks requires an array of task objects. Each task object contains:
1302
- - id (string, required): unique identifier like "task_1" or "research_sources"
1303
- - title (string, optional): update to clarify or refine task description
1304
- - status (string, optional): 'todo' | 'in-progress' | 'done'
1305
-
1306
- Task status meanings: 'todo' means not yet started, 'in-progress' means currently being worked on, 'done' means completed successfully.
498
+ var blueprint_default10 = blueprint9;
1307
499
 
1308
- === OPERATIONAL GUIDELINES ===
1309
-
1310
- Update tasks in real-time as work progresses. Mark tasks 'done' immediately upon completion. Maintain only ONE task with 'in-progress' status at a time. Complete current tasks before starting new ones. Use specific, actionable task titles. Break complex work into manageable logical pieces. Batch task updates with other actions when possible for efficiency.
1311
-
1312
- === USAGE EXAMPLES ===
1313
-
1314
- <example type="research_project">
1315
- <user_message>I need to research sustainable packaging options and write a report comparing costs and environmental impact.</user_message>
1316
- <assistant_action>
1317
- Creates tasks:
1318
- 1. {id: "research_materials", title: "Research sustainable packaging materials", status: "in-progress"}
1319
- 2. {id: "compare_costs", title: "Compile cost comparison data", status: "todo"}
1320
- 3. {id: "assess_impact", title: "Evaluate environmental impact metrics", status: "todo"}
1321
- 4. {id: "draft_report", title: "Write comparative analysis report", status: "todo"}
1322
-
1323
- Begins research work immediately in same response.
1324
- </assistant_action>
1325
- <reasoning>Multi-phase project requiring systematic tracking across research, analysis, and writing stages.</reasoning>
1326
- </example>
1327
-
1328
- <example type="event_planning">
1329
- <user_message>Help me plan a team retreat - venue, agenda, catering, and send invitations.</user_message>
1330
- <assistant_action>
1331
- Creates tasks:
1332
- 1. {id: "venue_options", title: "Research and recommend venues", status: "in-progress"}
1333
- 2. {id: "draft_agenda", title: "Create retreat agenda", status: "todo"}
1334
- 3. {id: "arrange_catering", title: "Coordinate catering options", status: "todo"}
1335
- 4. {id: "send_invites", title: "Draft and send invitations", status: "todo"}
1336
- </assistant_action>
1337
- <reasoning>Multiple distinct deliverables with dependencies requiring organized tracking.</reasoning>
1338
- </example>
1339
-
1340
- <example type="document_analysis">
1341
- <user_message>Review this 30-page contract for key terms, risks, and negotiation points.</user_message>
1342
- <assistant_action>
1343
- Creates tasks:
1344
- 1. {id: "extract_key_terms", title: "Identify key contractual terms", status: "in-progress"}
1345
- 2. {id: "flag_risks", title: "Flag potential risks and liabilities", status: "todo"}
1346
- 3. {id: "negotiation_points", title: "Compile negotiation recommendations", status: "todo"}
1347
- 4. {id: "summary_doc", title: "Prepare executive summary", status: "todo"}
1348
- </assistant_action>
1349
- <reasoning>Substantial analysis work requiring methodical breakdown and systematic review.</reasoning>
1350
- </example>
1351
-
1352
- <example type="multiple_deliverables">
1353
- <user_message>I need: 1) competitor analysis for three companies, 2) SWOT analysis, 3) market positioning recommendations.</user_message>
1354
- <assistant_action>
1355
- Creates tasks:
1356
- 1. {id: "competitor_research", title: "Research three competitor companies", status: "in-progress"}
1357
- 2. {id: "swot_analysis", title: "Develop SWOT analysis", status: "todo"}
1358
- 3. {id: "positioning_recs", title: "Create market positioning recommendations", status: "todo"}
1359
- </assistant_action>
1360
- <reasoning>User provided numbered list of distinct deliverables requiring separate effort.</reasoning>
1361
- </example>
1362
-
1363
- <example type="skip_simple_question">
1364
- <user_message>What's the difference between renewable and sustainable energy?</user_message>
1365
- <assistant_action>Provides explanation directly without creating tasks.</assistant_action>
1366
- <reasoning>Informational request with no actionable work to complete or track.</reasoning>
1367
- </example>
1368
-
1369
- <example type="skip_quick_lookup">
1370
- <user_message>Find the population of Tokyo.</user_message>
1371
- <assistant_action>Searches and provides answer without task tracking.</assistant_action>
1372
- <reasoning>Single straightforward lookup completable immediately.</reasoning>
1373
- </example>
1374
-
1375
- <example type="skip_trivial_task">
1376
- <user_message>Summarize this 2-paragraph email.</user_message>
1377
- <assistant_action>Provides summary directly without creating tasks.</assistant_action>
1378
- <reasoning>Single simple action requiring no breakdown or progress tracking.</reasoning>
1379
- </example>
1380
-
1381
- <example type="skip_single_action">
1382
- <user_message>Check if my flight is on time.</user_message>
1383
- <assistant_action>Performs lookup and reports status without task management.</assistant_action>
1384
- <reasoning>One-step action with immediate completion, no organizational benefit from tasks.</reasoning>
1385
- </example>
1386
-
1387
- === BEST PRACTICES ===
500
+ // src/blueprints/project-wizard/blueprint.ts
501
+ import { Blueprint as Blueprint10, Template as Template2 } from "@dxos/compute";
502
+ import { trim as trim8 } from "@dxos/util";
1388
503
 
1389
- For task creation: use descriptive unique IDs reflecting the work, start first task as 'in-progress', batch initial creation with beginning work. For progress tracking: update status immediately upon completion, keep only one 'in-progress' task unless parallel work is natural, add follow-up tasks as they emerge. For task breakdown: aim for reasonably-scoped tasks, group related small actions into logical units, split tasks requiring different approaches.
504
+ // src/blueprints/project-wizard/functions/index.ts
505
+ import { OperationHandlerSet as OperationHandlerSet8 } from "@dxos/compute";
506
+ var AgentWizardHandlers = OperationHandlerSet8.lazy(() => import("./create-project-EIF4OJMY.mjs"), () => import("./project-rules-IVDHKSKI.mjs"), () => import("./sync-triggers-CDMJVW6E.mjs"));
1390
507
 
1391
- When uncertain whether to use task management, err on the side of creating tasks. Proactive organization demonstrates thoroughness and ensures comprehensive work completion.
1392
- `;
1393
- var TaskProps = Schema13.Struct({
1394
- id: Plan_exports.TaskId,
1395
- title: Schema13.String,
1396
- status: Schema13.Literal("todo", "in-progress", "done")
1397
- });
1398
- var update_tasks_default = defineFunction10({
1399
- key: "dxos.org/function/planning/update-tasks",
1400
- name: "Update tasks",
1401
- description: INSTRUCTIONS,
1402
- inputSchema: Schema13.Struct({
1403
- tasks: Schema13.Array(TaskProps)
508
+ // src/blueprints/project-wizard/blueprint.ts
509
+ var BLUEPRINT_KEY10 = "org.dxos.blueprint.agent-wizard";
510
+ var make11 = () => Blueprint10.make({
511
+ key: BLUEPRINT_KEY10,
512
+ name: "Agent Wizard",
513
+ description: "Help the user create a new agent (subscriptions, optional cron timer, sync-triggers after edits).",
514
+ agentCanEnable: true,
515
+ instructions: Template2.make({
516
+ source: trim8`
517
+ You are a wizard that helps the user create a new agent.
518
+
519
+ Agents are goal oriented and autonomously driven.
520
+ Each agent has instructions - the goal of the agent.
521
+ The instructions also typically describe what actions to perform in reaction to events (emails).
522
+ The agent has a number of associated artifacts to work with.
523
+ Agents can subscribe to emails.
524
+
525
+ Agents have a \`cron\` field: when set, the agent runs on a timer on that schedule (standard cron syntax).
526
+ Use \`cron\` when the user wants the agent to run periodically (e.g. "every morning", "once a day", "every 5 minutes").
527
+ Examples: \`0 9 * * *\` for daily at 09:00, or \`*/5 * * * *\` for every 5 minutes.
528
+ Timer triggers bypass the qualifier and invoke the agent worker directly on the schedule.
529
+
530
+ The agent itself is an ECHO object and can be edited like any other object using the database blueprint.
531
+ You can edit the agent's instructions, name, and other properties directly.
532
+ If you edit the agent's \`enabled\` field, \`filterEvents\` field, subscriptions array, or \`cron\` field, you MUST call the sync-triggers function afterward to synchronize the triggers (\`enabled\` is applied to all triggers).
533
+
534
+ IMPORTANT: Before attempting to create an agent call the [agent-rules] tool to get the rules for creating an agent.
535
+ `
1404
536
  }),
1405
- handler: Effect12.fn(function* ({ data: { tasks: newTasks } }) {
1406
- const project = yield* Project_exports.getFromChatContext;
1407
- const plan = yield* Database11.load(project.plan);
1408
- Obj12.change(plan, (plan2) => {
1409
- for (const task of newTasks) {
1410
- const existingTask = plan2.tasks.find((t) => t.id === task.id);
1411
- if (existingTask) {
1412
- existingTask.title = task.title;
1413
- existingTask.status = task.status;
1414
- } else {
1415
- plan2.tasks.push({
1416
- id: task.id,
1417
- title: task.title,
1418
- status: task.status
1419
- });
1420
- }
1421
- }
1422
- });
1423
- return trim7`
1424
- Tasks updated. Don't forget to mark tasks as done when you're done with them or update their status to 'in-progress' when you start working on them.
1425
- Current plan:
1426
- <plan>
1427
- ${Plan_exports.formatPlan(plan)}
1428
- </plan>
1429
- `;
1430
- }, AiContextService5.fixFunctionHandlerType)
1431
- });
1432
-
1433
- // src/blueprints/planning/functions/index.ts
1434
- var PlanningFunctions = {
1435
- UpdateTasks: update_tasks_default
1436
- };
1437
-
1438
- // src/blueprints/planning/blueprint.ts
1439
- var BLUEPRINT_KEY6 = "dxos.org/blueprint/planning";
1440
- var functions6 = Object.values(PlanningFunctions);
1441
- var make7 = () => Blueprint6.make({
1442
- key: BLUEPRINT_KEY6,
1443
- name: "Planning",
1444
- description: "Plans and tracks complex tasks with artifact management.",
1445
- tools: Blueprint6.toolDefinitions({
1446
- functions: [
1447
- PlanningFunctions.UpdateTasks
537
+ tools: Blueprint10.toolDefinitions({
538
+ operations: [
539
+ AgentRules,
540
+ CreateAgent,
541
+ SyncTriggers
1448
542
  ]
1449
543
  })
1450
544
  });
1451
- var blueprint6 = {
1452
- key: BLUEPRINT_KEY6,
1453
- functions: functions6,
1454
- make: make7
545
+ var blueprint10 = {
546
+ key: BLUEPRINT_KEY10,
547
+ make: make11
1455
548
  };
1456
- var blueprint_default6 = blueprint6;
1457
-
1458
- // src/blueprints/research/blueprint.ts
1459
- import { ToolId as ToolId4 } from "@dxos/ai";
1460
- import { Blueprint as Blueprint7 } from "@dxos/blueprints";
1461
- import { Ref as Ref18 } from "@dxos/echo";
1462
- import { Text as Text7 } from "@dxos/schema";
1463
- import { trim as trim11 } from "@dxos/util";
1464
-
1465
- // src/blueprints/research/functions/document-create.ts
1466
- import * as Effect13 from "effect/Effect";
1467
- import * as Schema14 from "effect/Schema";
1468
- import { Database as Database12, Obj as Obj13, Ref as Ref16, Relation as Relation2 } from "@dxos/echo";
1469
- import { TracingService as TracingService2, defineFunction as defineFunction11 } from "@dxos/functions";
1470
- import { log as log4 } from "@dxos/log";
1471
- import { Markdown as Markdown4 } from "@dxos/plugin-markdown/types";
1472
- import { HasSubject } from "@dxos/types";
1473
- import { trim as trim8 } from "@dxos/util";
1474
- var __dxlog_file7 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/research/functions/document-create.ts";
1475
- var document_create_default = defineFunction11({
1476
- key: "dxos.org/function/research/document-create",
1477
- name: "Create research document",
1478
- description: "Creates a note summarizing the research.",
1479
- inputSchema: Schema14.Struct({
1480
- subject: Ref16.Ref(Obj13.Unknown).annotations({
1481
- description: trim8`
1482
- ID of the object (organization, contact, etc.) for which the research was performed.
1483
- `
1484
- }),
1485
- name: Schema14.String.annotations({
1486
- description: "Name of the document."
1487
- }),
1488
- content: Schema14.String.annotations({
1489
- description: trim8`
1490
- Content of the note.
1491
- Supports (and are prefered) references to research objects using @ syntax and <object> tags (refer to research blueprint instructions).
1492
- `
1493
- })
1494
- }),
1495
- outputSchema: Schema14.Struct({
1496
- document: Schema14.String.annotations({
1497
- description: "DXN of the created document."
1498
- })
1499
- }),
1500
- handler: Effect13.fnUntraced(function* ({ data: { subject, name, content } }) {
1501
- log4.info("Creating research document", {
1502
- subject,
1503
- name,
1504
- content
1505
- }, {
1506
- F: __dxlog_file7,
1507
- L: 41,
1508
- S: this,
1509
- C: (f, a) => f(...a)
1510
- });
1511
- yield* Database12.flush({
1512
- indexes: true
1513
- });
1514
- yield* TracingService2.emitStatus({
1515
- message: "Creating research document..."
1516
- });
1517
- const target = yield* Database12.load(subject);
1518
- const object = yield* Database12.add(Markdown4.make({
1519
- name,
1520
- content
1521
- }));
1522
- yield* Database12.add(Relation2.make(HasSubject.HasSubject, {
1523
- [Relation2.Source]: object,
1524
- [Relation2.Target]: target,
1525
- completedAt: (/* @__PURE__ */ new Date()).toISOString()
1526
- }));
1527
- yield* Database12.flush({
1528
- indexes: true
1529
- });
1530
- log4.info("Created research document", {
1531
- subject,
1532
- object
1533
- }, {
1534
- F: __dxlog_file7,
1535
- L: 67,
1536
- S: this,
1537
- C: (f, a) => f(...a)
1538
- });
1539
- return {
1540
- document: Obj13.getDXN(object).toString()
1541
- };
1542
- })
1543
- });
1544
-
1545
- // src/blueprints/research/functions/research.ts
1546
- import * as Toolkit2 from "@effect/ai/Toolkit";
1547
- import * as AnthropicTool from "@effect/ai-anthropic/AnthropicTool";
1548
- import * as Array10 from "effect/Array";
1549
- import * as Effect16 from "effect/Effect";
1550
- import * as Function5 from "effect/Function";
1551
- import * as Layer3 from "effect/Layer";
1552
- import * as Option3 from "effect/Option";
1553
- import * as Schema17 from "effect/Schema";
1554
- import * as String16 from "effect/String";
1555
- import { AiService as AiService3, ConsolePrinter } from "@dxos/ai";
1556
- import { GenericToolkit } from "@dxos/ai";
1557
- import { AiSession, GenerationObserver, ToolExecutionServices, createToolkit } from "@dxos/assistant";
1558
- import { Template as Template2 } from "@dxos/blueprints";
1559
- import { Entity as Entity2, Obj as Obj16 } from "@dxos/echo";
1560
- import { Database as Database15 } from "@dxos/echo";
1561
- import { TracingService as TracingService3, defineFunction as defineFunction12 } from "@dxos/functions";
1562
- import { Person as Person2 } from "@dxos/types";
1563
- import { trim as trim10 } from "@dxos/util";
549
+ var blueprint_default11 = blueprint10;
1564
550
 
1565
551
  // src/crud/graph.ts
1566
552
  import * as Tool from "@effect/ai/Tool";
1567
- import * as Toolkit from "@effect/ai/Toolkit";
553
+ import * as Toolkit2 from "@effect/ai/Toolkit";
1568
554
  import * as Context from "effect/Context";
1569
- import * as Effect14 from "effect/Effect";
1570
- import * as Function4 from "effect/Function";
1571
- import * as Option2 from "effect/Option";
1572
- import * as Schema15 from "effect/Schema";
555
+ import * as Effect from "effect/Effect";
556
+ import * as Function from "effect/Function";
557
+ import * as Option from "effect/Option";
558
+ import * as Schema from "effect/Schema";
1573
559
  import * as SchemaAST from "effect/SchemaAST";
1574
- import { Entity, Filter as Filter3, Obj as Obj14, Query as Query3, Type as Type4 } from "@dxos/echo";
1575
- import { Database as Database13 } from "@dxos/echo";
1576
- import { ReferenceAnnotationId, RelationSourceDXNId, RelationSourceId, RelationTargetDXNId, RelationTargetId, createObject, getTypeAnnotation, getTypeIdentifierAnnotation } from "@dxos/echo/internal";
560
+ import { Entity, Filter, Obj, Query as Query2, Type } from "@dxos/echo";
561
+ import { Database } from "@dxos/echo";
1577
562
  import { isEncodedReference } from "@dxos/echo-protocol";
563
+ import { ReferenceAnnotationId, RelationSourceDXNId, RelationSourceId, RelationTargetDXNId, RelationTargetId, createObject, getTypeAnnotation, getTypeIdentifierAnnotation } from "@dxos/echo/internal";
1578
564
  import { mapAst } from "@dxos/effect";
1579
565
  import { ContextQueueService } from "@dxos/functions";
1580
566
  import { DXN, ObjectId } from "@dxos/keys";
1581
- import { log as log5 } from "@dxos/log";
567
+ import { log } from "@dxos/log";
1582
568
  import { deepMapValues, isNonNullable, trim as trim9 } from "@dxos/util";
1583
- var __dxlog_file8 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/crud/graph.ts";
1584
- var Subgraph = Schema15.Struct({
569
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/compute/assistant-toolkit/src/crud/graph.ts";
570
+ var Subgraph = Schema.Struct({
1585
571
  /** Objects and relations. */
1586
- objects: Schema15.Array(Schema15.Any)
572
+ objects: Schema.Array(Schema.Any)
1587
573
  });
1588
574
  var findRelatedSchema = async (db, anchor) => {
1589
575
  const allSchemas = await db.graph.schemaRegistry.query().run();
@@ -1603,34 +589,34 @@ var isSchemaAddressableByDxn = (schema, dxn) => {
1603
589
  }
1604
590
  const t = dxn.asTypeDXN();
1605
591
  if (t) {
1606
- return t.type === Type4.getTypename(schema);
592
+ return t.type === Type.getTypename(schema);
1607
593
  }
1608
594
  return false;
1609
595
  };
1610
- var LocalSearchToolkit = Toolkit.make(Tool.make("search_local_search", {
596
+ var LocalSearchToolkit = Toolkit2.make(Tool.make("search_local_search", {
1611
597
  description: "Search the local database for information using a vector index",
1612
598
  parameters: {
1613
- query: Schema15.String.annotations({
599
+ query: Schema.String.annotations({
1614
600
  description: "The query to search for. Could be a question or a topic or a set of keywords."
1615
601
  })
1616
602
  },
1617
- success: Schema15.Unknown,
1618
- failure: Schema15.Never,
603
+ success: Schema.Unknown,
604
+ failure: Schema.Never,
1619
605
  dependencies: [
1620
- Database13.Service
606
+ Database.Service
1621
607
  ]
1622
608
  }));
1623
609
  var LocalSearchHandler = LocalSearchToolkit.toLayer({
1624
- search_local_search: Effect14.fn(function* ({ query: query2 }) {
1625
- const objects = yield* Database13.runQuery(Query3.select(Filter3.text(query2, {
610
+ search_local_search: Effect.fn(function* ({ query }) {
611
+ const objects = yield* Database.runQuery(Query2.select(Filter.text(query, {
1626
612
  type: "vector"
1627
613
  })));
1628
614
  const results = [
1629
615
  ...objects
1630
616
  ];
1631
- const option = yield* Effect14.serviceOption(ContextQueueService);
1632
- if (Option2.isSome(option)) {
1633
- const queueObjects = yield* Effect14.promise(() => option.value.queue.queryObjects());
617
+ const option = yield* Effect.serviceOption(ContextQueueService);
618
+ if (Option.isSome(option)) {
619
+ const queueObjects = yield* Effect.promise(() => option.value.queue.queryObjects());
1634
620
  results.push(...queueObjects);
1635
621
  }
1636
622
  return trim9`
@@ -1643,13 +629,13 @@ var LocalSearchHandler = LocalSearchToolkit.toLayer({
1643
629
  var GraphWriterSchema = class extends Context.Tag("@dxos/assistant/GraphWriterSchema")() {
1644
630
  };
1645
631
  var makeGraphWriterToolkit = ({ schema }) => {
1646
- return Toolkit.make(Tool.make("graph_writer", {
632
+ return Toolkit2.make(Tool.make("graph_writer", {
1647
633
  description: "Write to the local graph database",
1648
634
  parameters: createExtractionSchema(schema).fields,
1649
- success: Schema15.Unknown,
1650
- failure: Schema15.Never,
635
+ success: Schema.Unknown,
636
+ failure: Schema.Never,
1651
637
  dependencies: [
1652
- Database13.Service,
638
+ Database.Service,
1653
639
  ContextQueueService
1654
640
  ]
1655
641
  }).annotateContext(Context.make(GraphWriterSchema, {
@@ -1659,29 +645,29 @@ var makeGraphWriterToolkit = ({ schema }) => {
1659
645
  var makeGraphWriterHandler = (toolkit, { onAppend } = {}) => {
1660
646
  const { schema } = Context.get(toolkit.tools.graph_writer.annotations, GraphWriterSchema);
1661
647
  return toolkit.toLayer({
1662
- graph_writer: Effect14.fn(function* (input) {
1663
- const { db } = yield* Database13.Service;
648
+ graph_writer: Effect.fn(function* (input) {
649
+ const { db } = yield* Database.Service;
1664
650
  const { queue } = yield* ContextQueueService;
1665
- const data = yield* Effect14.promise(() => sanitizeObjects(schema, input, db, queue));
1666
- yield* Effect14.promise(() => queue.append(data));
1667
- const dxns = data.map((obj) => Obj14.getDXN(obj));
651
+ const data = yield* Effect.promise(() => sanitizeObjects(schema, input, db, queue));
652
+ yield* Effect.promise(() => queue.append(data));
653
+ const dxns = data.map((obj) => Obj.getDXN(obj));
1668
654
  onAppend?.(dxns);
1669
655
  return dxns;
1670
656
  })
1671
657
  });
1672
658
  };
1673
659
  var createExtractionSchema = (types) => {
1674
- return Schema15.Struct({
660
+ return Schema.Struct({
1675
661
  ...Object.fromEntries(types.map(preprocessSchema).map((schema, index) => [
1676
662
  `objects_${getSanitizedSchemaName(types[index])}`,
1677
- Schema15.optional(Schema15.Array(schema)).annotations({
1678
- description: `The objects of type: ${Type4.getDXN(types[index])?.asTypeDXN().type}. ${SchemaAST.getDescriptionAnnotation(types[index].ast).pipe(Option2.getOrElse(() => ""))}`
663
+ Schema.optional(Schema.Array(schema)).annotations({
664
+ description: `The objects of type: ${Type.getDXN(types[index])?.asTypeDXN().type}. ${SchemaAST.getDescriptionAnnotation(types[index].ast).pipe(Option.getOrElse(() => ""))}`
1679
665
  })
1680
666
  ]))
1681
667
  });
1682
668
  };
1683
669
  var getSanitizedSchemaName = (schema) => {
1684
- return Type4.getDXN(schema).asTypeDXN().type.replaceAll(/[^a-zA-Z0-9]+/g, "_");
670
+ return Type.getDXN(schema).asTypeDXN().type.replaceAll(/[^a-zA-Z0-9]+/g, "_");
1685
671
  };
1686
672
  var sanitizeObjects = async (types, data, db, queue) => {
1687
673
  const entries = types.map((type) => data[`objects_${getSanitizedSchemaName(type)}`]?.map((object) => ({
@@ -1729,25 +715,15 @@ var sanitizeObjects = async (types, data, db, queue) => {
1729
715
  if (Entity.getKind(entry.schema) === "relation") {
1730
716
  const sourceDxn = resolveId(data2.source);
1731
717
  if (!sourceDxn) {
1732
- log5.warn("source not found", {
718
+ log.warn("source not found", {
1733
719
  source: data2.source
1734
- }, {
1735
- F: __dxlog_file8,
1736
- L: 273,
1737
- S: void 0,
1738
- C: (f, a) => f(...a)
1739
- });
720
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 193, S: void 0 });
1740
721
  }
1741
722
  const targetDxn = resolveId(data2.target);
1742
723
  if (!targetDxn) {
1743
- log5.warn("target not found", {
724
+ log.warn("target not found", {
1744
725
  target: data2.target
1745
- }, {
1746
- F: __dxlog_file8,
1747
- L: 277,
1748
- S: void 0,
1749
- C: (f, a) => f(...a)
1750
- });
726
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 199, S: void 0 });
1751
727
  }
1752
728
  delete data2.source;
1753
729
  delete data2.target;
@@ -1759,7 +735,7 @@ var sanitizeObjects = async (types, data, db, queue) => {
1759
735
  schema: entry.schema
1760
736
  };
1761
737
  }).filter((object) => !existingIds.has(object.data.id));
1762
- const dbObjects = await db.query(Query3.select(Filter3.id(...existingIds))).run();
738
+ const dbObjects = await db.query(Query2.select(Filter.id(...existingIds))).run();
1763
739
  const queueObjects = await queue?.getObjectsById([
1764
740
  ...existingIds
1765
741
  ]) ?? [];
@@ -1767,16 +743,11 @@ var sanitizeObjects = async (types, data, db, queue) => {
1767
743
  ...dbObjects,
1768
744
  ...queueObjects
1769
745
  ].filter(isNonNullable);
1770
- log5.info("objects", {
746
+ log.info("objects", {
1771
747
  dbObjects,
1772
748
  queueObjects,
1773
749
  existingIds
1774
- }, {
1775
- F: __dxlog_file8,
1776
- L: 298,
1777
- S: void 0,
1778
- C: (f, a) => f(...a)
1779
- });
750
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 223, S: void 0 });
1780
751
  const missing = Array.from(existingIds).filter((id) => !objects.some((object) => object.id === id));
1781
752
  if (missing.length > 0) {
1782
753
  throw new Error(`Object IDs do not point to existing objects: ${missing.join(", ")}`);
@@ -1813,8 +784,8 @@ var sanitizeObjects = async (types, data, db, queue) => {
1813
784
  return [];
1814
785
  });
1815
786
  };
1816
- var SoftRef = Schema15.Struct({
1817
- "/": Schema15.String
787
+ var SoftRef = Schema.Struct({
788
+ "/": Schema.String
1818
789
  }).annotations({
1819
790
  description: "Reference to another object."
1820
791
  });
@@ -1825,1797 +796,114 @@ var preprocessSchema = (schema) => {
1825
796
  return ast;
1826
797
  }
1827
798
  visited.add(ast);
1828
- if (SchemaAST.getAnnotation(ast, ReferenceAnnotationId).pipe(Option2.isSome)) {
799
+ if (SchemaAST.getAnnotation(ast, ReferenceAnnotationId).pipe(Option.isSome)) {
1829
800
  return SoftRef.ast;
1830
801
  }
1831
802
  return mapAst(ast, (child) => go(child, visited));
1832
803
  };
1833
- return Schema15.make(mapAst(schema.ast, (ast) => go(ast))).pipe(Schema15.omit("id"), Schema15.extend(Schema15.Struct({
1834
- id: Schema15.String.annotations({
804
+ return Schema.make(mapAst(schema.ast, (ast) => go(ast))).pipe(Schema.omit("id"), Schema.extend(Schema.Struct({
805
+ id: Schema.String.annotations({
1835
806
  description: "The id of this object. Come up with a unique id based on your judgement."
1836
807
  })
1837
- })), isRelationSchema ? Schema15.extend(Schema15.Struct({
1838
- source: Schema15.String.annotations({
808
+ })), isRelationSchema ? Schema.extend(Schema.Struct({
809
+ source: Schema.String.annotations({
1839
810
  description: "The id of the source object for this relation."
1840
811
  }),
1841
- target: Schema15.String.annotations({
812
+ target: Schema.String.annotations({
1842
813
  description: "The id of the target object for this relation."
1843
814
  })
1844
- })) : Function4.identity);
815
+ })) : Function.identity);
1845
816
  };
1846
817
 
1847
- // src/blueprints/research/types/index.ts
1848
- import { Text as Text6 } from "@dxos/schema";
1849
- import { Event, HasConnection, HasRelationship, LegacyOrganization, LegacyPerson, Pipeline as Pipeline2, Task as Task3 } from "@dxos/types";
818
+ // src/functions/agent/index.ts
819
+ import { OperationHandlerSet as OperationHandlerSet9 } from "@dxos/compute";
820
+ var AgentHandlers = OperationHandlerSet9.lazy(() => import("./prompt-Y7NN7M5D.mjs"));
1850
821
 
1851
- // src/blueprints/research/types/ResearchGraph.ts
1852
- var ResearchGraph_exports = {};
1853
- __export(ResearchGraph_exports, {
1854
- ResearchGraph: () => ResearchGraph,
1855
- contextQueueLayer: () => contextQueueLayer,
1856
- create: () => create,
1857
- query: () => query
1858
- });
1859
- import * as Effect15 from "effect/Effect";
1860
- import * as Layer2 from "effect/Layer";
1861
- import * as Schema16 from "effect/Schema";
1862
- import { Database as Database14, Obj as Obj15, Query as Query4, Ref as Ref17, Type as Type5 } from "@dxos/echo";
1863
- import { SystemTypeAnnotation } from "@dxos/echo/internal";
1864
- import { Queue as Queue3 } from "@dxos/echo-db";
1865
- import { ContextQueueService as ContextQueueService2, QueueService as QueueService2 } from "@dxos/functions";
1866
- var ResearchGraph = Schema16.Struct({
1867
- queue: Ref17.Ref(Queue3)
1868
- }).pipe(Type5.object({
1869
- typename: "dxos.org/type/ResearchGraph",
1870
- version: "0.1.0"
1871
- }), SystemTypeAnnotation.set(true));
1872
- var create = Effect15.fn("createResearchGraph")(function* () {
1873
- const queue = yield* QueueService2.createQueue();
1874
- return yield* Database14.add(Obj15.make(ResearchGraph, {
1875
- queue: Ref17.fromDXN(queue.dxn)
1876
- }));
1877
- });
1878
- var query = Effect15.fn("queryResearchGraph")(function* () {
1879
- const objects = yield* Database14.runQuery(Query4.type(ResearchGraph));
1880
- return objects.at(0);
822
+ // src/toolkits/WebToolkit.ts
823
+ var WebToolkit_exports = {};
824
+ __export(WebToolkit_exports, {
825
+ WebToolkit: () => WebToolkit,
826
+ layer: () => layer
1881
827
  });
1882
- var contextQueueLayer = Layer2.unwrapEffect(Effect15.gen(function* () {
1883
- const researchGraph = (yield* query()) ?? (yield* create());
1884
- const researchQueue = yield* Database14.load(researchGraph.queue);
1885
- return ContextQueueService2.layer(researchQueue);
1886
- }));
1887
-
1888
- // src/blueprints/research/types/index.ts
1889
- var ResearchDataTypes = [
1890
- // Objects
1891
- Event.Event,
1892
- Task3.Task,
1893
- Text6.Text,
1894
- // TODO(wittjosiah): Until views (e.g., Table) support relations this needs to be expressed via organization ref.
1895
- // Employer.Employer,
1896
- // Organization.Organization,
1897
- LegacyPerson,
1898
- LegacyOrganization,
1899
- Pipeline2.Pipeline,
1900
- // Relations
1901
- HasRelationship.HasRelationship,
1902
- HasConnection.HasConnection
1903
- ];
1904
-
1905
- // raw-loader:/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/research/functions/research-instructions.tpl?raw
1906
- var research_instructions_default = "You are the Research Agent.\n\nThe Research Agent is an expert assistant that conducts in-depth research using real-time web search.\nThe Research Agent outputs results in a structured format matching the schema provided.\n\nThe Research Agent is equipped with the ability to:\n\n- Generate precise and effective search queries \n- Request web pages by query.\n- Synthesize accurate, clear, and structured answers using reliable information from the retrieved content\n{{#if entityExtraction}}\n- Search the local database for information using a vector index (through a `local_search` tool)\n{{/if}}\n\nThe Research Agent always follows these principles:\n\n- Relevance First: The Research Agent only returns facts supported by content in retrieved web pages. The Research Agent never fabricates or guesses information.\n- Summarize, Don't Copy: The Research Agent synthesizes and rephrases content in its own words. The Research Agent quotes only when necessary.\n- Multiple Sources: The Research Agent cross-references at least 2 sources before drawing conclusions, unless the information is directly stated and non-controversial.\n- Transparency: The Research Agent mentions which sources were used and explains how it arrived at conclusions.\n- Accuracy Over Brevity: The Research Agent prefers detailed, technically accurate explanations over shallow summaries.\n- The Research Agent admits uncertainty rather than misleading.\n{{#if entityExtraction}}\n- The Research Agent picks the most concrete schema types for extracted information.\n- The Research Agent fills schema fields completely with information it is confident about, and omits fields it is not confident about.\n- When outputting results, the Research Agent adds extra data that fits the schema even if not directly related to the user's question.\n- The Research Agent creates relations and references between new objects found and what's already in the database.\n- The Research Agent does not create objects that are already in the database.\n- The Research Agent re-uses existing object IDs as references when enriching existing objects.\n- The Research Agent ALWAYS calls the `graph_writer` at the end to save the data. This conversation will be deleted, so only the data written to the graph will be preserved.\n{{/if}}\n\nThe Research Agent may be asked for:\n\n- Technical explanations\n- Literature reviews \n- Comparisons\n- Emerging trends\n- Implementation strategies\n\nThe Research Agent begins by interpreting the user's request, then:\n\nThe Research Agent breaks it into sub-questions (if applicable).\n\nFor each sub-question, the Research Agent generates a clear, concise web search query.\n\nThe Research Agent extracts and synthesizes relevant answers.\n\nThe Research Agent's output includes:\n\n- A clear, structured answer to the user's question\n- A citation list or link list of sources used\n\nOptionally, the Research Agent provides follow-up suggestions or questions for deeper inquiry.\n\nHere's how the Research Agent operates:\n\n1. The Research Agent analyzes the user's request and identifies key topics to search for (3 or more), printing them out.\n2. The Research Agent performs a web search for each topic.\n3. The Research Agent reads and analyzes results, cross references information from multiple sources, and represents conflicting information as ranges of possible values.\n\n{{#if entityExtraction}}\n4. The Research Agent searches the local database for information using a vector index that might link to the user's question.\n6. The Research Agent creates relations and references between new objects and existing database objects when related, using existing object IDs as references.\n7. The Research Agent selects the most concrete schema types for extracted information, using multiple types as needed, and prints its decision and reasoning.\n5. The Research Agent creates a clear, structured answer to the user's question.\n8. The Research Agent submits results using the specific schema.\n{{/if}}\n\n{{#if entityExtraction}}\nIMPORTANT:\n- The Research Agent always runs the `local_search` tool to search the local database at least once before submitting results.\n- The Research Agent does not create objects that already exist in the database.\n- Ids that are not in the database are human-readable strings like `ivan_zhao_1`.\n{{/if}}\n\nStatus reporting:\n\nThe Research Agent reports its status frequently using the `<status>` tags: <status>Searching for Google Founders</status>\nThe Research Agent reports its status in-between each tool call and before submitting results.\n\n{{#if entityExtraction}}\n<example>\n\nBased on my research, I can now provide information about Google and it's founders.\n\nThe following objects are already in the database, I will not submit them again, but I'll re-use their IDs as references:\n\n- 01JWRDEHPB5TT2JQQQC15038BT Google\n- 01JWRDEHPA14CYW2NW9FAH6DJJ Larry Page\n- 01JWRDEHPBN0BBJP57B9S108W6 Sergey Brin\n\nI will use the following schema to construct new objects:\n\n- type:dxos.org/type/Organization for Alphabet Inc.\n- type:dxos.org/type/Person for Ivan Zhao\n- type:dxos.org/type/Person for Simon Last\n- dxn:type:dxos.org/relation/Employer for Ivan's employer\n- dxn:type:dxos.org/relation/Employer for Simon's employer\n\n<status>Formatting results</status>\n\n</example>\n{{/if}}\n\nLast content block is the full research note -- the result of the research.\n";
1907
-
1908
- // src/blueprints/research/functions/research.ts
1909
- var research_default = defineFunction12({
1910
- key: "dxos.org/function/research",
1911
- name: "Research",
1912
- description: trim10`
1913
- Search the web to research information about the given subject.
1914
- Inserts structured data into the research graph.
1915
- Creates a research summary and returns the objects created.
1916
- `,
1917
- inputSchema: Schema17.Struct({
1918
- query: Schema17.String.annotations({
1919
- description: trim10`
1920
- The search query.
1921
- If doing research on an object then load it first and pass it as JSON.
1922
- `
1923
- }),
1924
- instructions: Schema17.optional(Schema17.String).annotations({
1925
- description: trim10`
1926
- The instructions for the research agent.
1927
- `
1928
- }),
1929
- // TOOD(burdon): Move to context.
1930
- mockSearch: Schema17.optional(Schema17.Boolean).annotations({
1931
- description: "Whether to use the mock search tool.",
1932
- default: false
1933
- }),
1934
- entityExtraction: Schema17.optional(Schema17.Boolean).annotations({
1935
- description: trim10`
1936
- Whether to extract structured entities from the research.
1937
- Experimental feature only enable if user explicitly requests it.
1938
- `,
1939
- default: false
1940
- })
1941
- }),
1942
- outputSchema: Schema17.Struct({
1943
- document: Schema17.optional(Schema17.String).annotations({
1944
- description: "The generated research document."
1945
- }),
1946
- objects: Schema17.Array(Schema17.Unknown).annotations({
1947
- description: "Structured objects created during the research process."
1948
- })
1949
- }),
1950
- handler: Effect16.fnUntraced(function* ({ data: { query: query2, instructions: instructions8, mockSearch = false, entityExtraction = false } }) {
1951
- if (mockSearch) {
1952
- const mockPerson = yield* Database15.add(Obj16.make(Person2.Person, {
1953
- preferredName: "John Doe",
1954
- emails: [
1955
- {
1956
- value: "john.doe@example.com"
1957
- }
1958
- ],
1959
- phoneNumbers: [
1960
- {
1961
- value: "123-456-7890"
1962
- }
1963
- ]
1964
- }));
1965
- return {
1966
- document: trim10`
1967
- The research ran in test-mode and was mocked. Proceed as usual.
1968
- We reference John Doe to test reference: ${Obj16.getDXN(mockPerson)}
1969
- `,
1970
- objects: [
1971
- Obj16.toJSON(mockPerson)
1972
- ]
1973
- };
1974
- }
1975
- yield* Database15.flush({
1976
- indexes: true
1977
- });
1978
- yield* TracingService3.emitStatus({
1979
- message: "Starting research..."
1980
- });
1981
- const NativeWebSearch = Toolkit2.make(AnthropicTool.WebSearch_20250305({}));
1982
- let toolkit = NativeWebSearch;
1983
- let handlers = Layer3.empty;
1984
- const objectDXNs = [];
1985
- if (entityExtraction) {
1986
- const GraphWriterToolkit = makeGraphWriterToolkit({
1987
- schema: ResearchDataTypes
1988
- });
1989
- const GraphWriterHandler = makeGraphWriterHandler(GraphWriterToolkit, {
1990
- onAppend: (dxns) => objectDXNs.push(...dxns)
1991
- });
1992
- toolkit = Toolkit2.merge(toolkit, LocalSearchToolkit, GraphWriterToolkit);
1993
- handlers = Layer3.mergeAll(handlers, LocalSearchHandler, GraphWriterHandler).pipe(Layer3.provide(ResearchGraph_exports.contextQueueLayer));
1994
- }
1995
- const finishedToolkit = yield* createToolkit({
1996
- toolkit
1997
- }).pipe(Effect16.provide(handlers));
1998
- const session = new AiSession();
1999
- const result = yield* session.run({
2000
- prompt: query2,
2001
- system: join(Template2.process(research_instructions_default, {
2002
- entityExtraction
2003
- }), instructions8 && `<instructions>${instructions8}</instructions>`),
2004
- toolkit: finishedToolkit,
2005
- observer: GenerationObserver.fromPrinter(new ConsolePrinter({
2006
- tag: "research"
2007
- }))
2008
- });
2009
- const objects = yield* Effect16.forEach(objectDXNs, (dxn) => Database15.resolve(dxn)).pipe(Effect16.map(Array10.map((obj) => Entity2.toJSON(obj))));
2010
- return {
2011
- document: extractLastTextBlock(result),
2012
- objects
2013
- };
2014
- }, Effect16.provide(AiService3.model("@anthropic/claude-sonnet-4-0").pipe(Layer3.merge(ToolExecutionServices), Layer3.provide(GenericToolkit.providerEmpty))))
2015
- });
2016
- var join = (...strings) => strings.filter(Boolean).join("\n\n");
2017
- var extractLastTextBlock = (result) => {
2018
- return Function5.pipe(result, Array10.last, Option3.map(Function5.flow((_) => _.blocks, Array10.reverse, Array10.dropWhile((_) => _._tag === "stats"), Array10.takeWhile((_) => _._tag === "text"), Array10.reverse, Array10.map((_) => _.text), Array10.reduce("", String16.concat))), Option3.getOrElse(() => ""));
2019
- };
2020
-
2021
- // src/blueprints/research/functions/index.ts
2022
- var ResearchFunctions = {
2023
- Create: document_create_default,
2024
- Research: research_default
2025
- };
2026
-
2027
- // src/blueprints/research/blueprint.ts
2028
- var BLUEPRINT_KEY7 = "dxos.org/blueprint/research";
2029
- var functions7 = Object.values(ResearchFunctions);
2030
- var instructions5 = trim11`
2031
- {{! Research }}
2032
-
2033
- You are an analyst that does research tasks using tools that scrape the web and create structured data.
2034
- Structured data extraction is an experimental feature -- only enable it if the user explicitly requests it in the prompt.
2035
- Prefer updating existing notes instead of creating new ones.
2036
-
2037
- <structured_mode>
2038
- When you are done, reply with the created objects.
2039
- Do not print the data, instead reply with inline references to the created objects.
2040
- Those will be later substituted with the pills representing the created objects.
2041
- Print the rest of the created objects as block references after the main note.
2042
-
2043
- <example>
2044
- Based on my research, Google was founded by @dxn:queue:data:B6INSIBY3CBEF4M5VZRYBCMAHQMPYK5AJ:01K24XMVHSZHS97SG1VTVQDM5Z:01K24XPK464FSCKVQJAB2H662M and @dxn:queue:data:B6INSIBY3CBEF4M5VZRYBCMAHQMPYK5AJ:01K24XMVHSZHS97SG1VTVQDM5Z:01K24XPK46K31DDW62PBW9H2ZQ
2045
-
2046
- <object><dxn>dxn:queue:data:B6INSIBY3CBEF4M5VZRYBCMAHQMPYK5AJ:01K24XMVHSZHS97SG1VTVQDM5Z:01K24XPK464FSCKVQJAB2H662M</dxn></object>
2047
- <object><dxn>dxn:queue:data:B6INSIBY3CBEF4M5VZRYBCMAHQMPYK5AJ:01K24XMVHSZHS97SG1VTVQDM5Z:01K24XPK46K31DDW62PBW9H2ZQ</dxn></object>
2048
- <object><dxn>dxn:queue:data:B6INSIBY3CBEF4M5VZRYBCMAHQMPYK5AJ:01K24XMVHSZHS97SG1VTVQDM5Z:01K24XPK46K31DDW62PBW92333</dxn></object>
2049
- </example>
2050
- </structured_mode>
2051
-
2052
- <unstructured_mode>
2053
- Reply normally with the text mode of the result of your research.
2054
- </unstructured_mode>
2055
- `;
2056
- var make13 = () => Blueprint7.make({
2057
- key: BLUEPRINT_KEY7,
2058
- name: "Research",
2059
- description: "Researches the web and creates structured data.",
2060
- instructions: {
2061
- source: Ref18.make(Text7.make(instructions5))
2062
- },
2063
- tools: functions7.map((fn22) => ToolId4.make(fn22.key))
2064
- });
2065
- var blueprint7 = {
2066
- key: BLUEPRINT_KEY7,
2067
- functions: functions7,
2068
- make: make13
2069
- };
2070
- var blueprint_default7 = blueprint7;
2071
-
2072
- // src/blueprints/websearch/blueprint.ts
2073
- import { ToolId as ToolId5 } from "@dxos/ai";
2074
- import { Blueprint as Blueprint8 } from "@dxos/blueprints";
2075
- import { Ref as Ref19 } from "@dxos/echo";
2076
- import { Text as Text8 } from "@dxos/schema";
2077
- var BLUEPRINT_KEY8 = "dxos.org/blueprint/web-search";
2078
- var functions8 = [];
2079
- var make14 = () => Blueprint8.make({
2080
- key: BLUEPRINT_KEY8,
2081
- name: "Web Search",
2082
- description: "Search the web.",
2083
- instructions: {
2084
- source: Ref19.make(Text8.make())
2085
- },
2086
- tools: [
2087
- ToolId5.make("AnthropicWebSearch")
2088
- ]
2089
- });
2090
- var blueprint8 = {
2091
- key: BLUEPRINT_KEY8,
2092
- functions: functions8,
2093
- make: make14
2094
- };
2095
- var blueprint_default8 = blueprint8;
2096
-
2097
- // src/blueprints/websearch/toolkit.ts
2098
- import * as Toolkit3 from "@effect/ai/Toolkit";
2099
828
  import * as AnthropicTool2 from "@effect/ai-anthropic/AnthropicTool";
2100
- var WebSearchToolkit = Toolkit3.make(AnthropicTool2.WebSearch_20250305({}));
2101
-
2102
- // src/blueprints/browser/blueprint.ts
2103
- import { Blueprint as Blueprint9 } from "@dxos/blueprints";
2104
- import { Ref as Ref20 } from "@dxos/echo";
2105
- import { Text as Text9 } from "@dxos/schema";
2106
- import { trim as trim12 } from "@dxos/util";
2107
- var BLUEPRINT_KEY9 = "dxos.org/blueprint/browser";
2108
- var instructions6 = trim12`
2109
- You are able to connect and use a virtual browser with persistent session.
2110
- Browser tools are provided via MCP.
2111
- `;
2112
- var make16 = () => Blueprint9.make({
2113
- key: BLUEPRINT_KEY9,
2114
- name: "Browser",
2115
- description: "Access to a real isolated browser.",
2116
- instructions: {
2117
- source: Ref20.make(Text9.make(instructions6))
2118
- },
2119
- mcpServers: [
2120
- {
2121
- // https://dash.cloudflare.com/950816f3f59b079880a1ae33fb0ec320/workers/services/view/playwright-mcp-example/production
2122
- url: "https://playwright-mcp-example.dxos.workers.dev/sse",
2123
- protocol: "sse"
2124
- }
2125
- ]
2126
- });
2127
- var blueprint9 = {
2128
- key: BLUEPRINT_KEY9,
2129
- make: make16,
2130
- functions: []
2131
- };
2132
- var blueprint_default9 = blueprint9;
2133
-
2134
- // src/blueprints/database/blueprint.ts
2135
- import { Blueprint as Blueprint10 } from "@dxos/blueprints";
2136
- import { Ref as Ref30 } from "@dxos/echo";
2137
- import { Text as Text10 } from "@dxos/schema";
2138
- import { trim as trim26 } from "@dxos/util";
2139
-
2140
- // src/blueprints/database/functions/context-add.ts
2141
- import * as Effect17 from "effect/Effect";
2142
- import * as Schema18 from "effect/Schema";
2143
- import { AiContextService as AiContextService6 } from "@dxos/assistant";
2144
- import { Obj as Obj17, Ref as Ref21 } from "@dxos/echo";
2145
- import { defineFunction as defineFunction13 } from "@dxos/functions";
2146
- import { trim as trim13 } from "@dxos/util";
2147
- var context_add_default = defineFunction13({
2148
- key: "dxos.org/function/database/context-add",
2149
- name: "Add to context",
2150
- description: trim13`
2151
- Adds the object to the chat context.
2152
- Use this it for objects that are useful long-term for the conversation.
2153
- `,
2154
- inputSchema: Schema18.Struct({
2155
- obj: Ref21.Ref(Obj17.Unknown).annotations({
2156
- description: "Object to add to the chat context."
2157
- })
2158
- }),
2159
- outputSchema: Schema18.Void,
2160
- handler: Effect17.fn(function* ({ data: { obj } }) {
2161
- const { binder } = yield* AiContextService6;
2162
- yield* Effect17.promise(() => binder.bind({
2163
- blueprints: [],
2164
- objects: [
2165
- obj
2166
- ]
2167
- }));
2168
- }, AiContextService6.fixFunctionHandlerType)
2169
- });
2170
-
2171
- // src/blueprints/database/functions/context-remove.ts
2172
- import * as Effect18 from "effect/Effect";
2173
- import * as Schema19 from "effect/Schema";
2174
- import { AiContextService as AiContextService7 } from "@dxos/assistant";
2175
- import { Obj as Obj18, Ref as Ref22 } from "@dxos/echo";
2176
- import { defineFunction as defineFunction14 } from "@dxos/functions";
2177
- import { trim as trim14 } from "@dxos/util";
2178
- var context_remove_default = defineFunction14({
2179
- key: "dxos.org/function/database/context-remove",
2180
- name: "Remove from context",
2181
- description: trim14`
2182
- Removes the object from the chat context.
2183
- Use this it for objects that are no longer useful for the conversation.
2184
- `,
2185
- inputSchema: Schema19.Struct({
2186
- obj: Ref22.Ref(Obj18.Unknown).annotations({
2187
- description: "Object to remove from the chat context."
2188
- })
2189
- }),
2190
- outputSchema: Schema19.Void,
2191
- handler: Effect18.fn(function* ({ data: { obj } }) {
2192
- const { binder } = yield* AiContextService7;
2193
- yield* Effect18.promise(() => binder.unbind({
2194
- blueprints: [],
2195
- objects: [
2196
- obj
2197
- ]
2198
- }));
2199
- }, AiContextService7.fixFunctionHandlerType)
2200
- });
2201
-
2202
- // src/blueprints/database/functions/load.ts
2203
- import * as Array12 from "effect/Array";
2204
- import * as Effect19 from "effect/Effect";
2205
- import * as Schema20 from "effect/Schema";
2206
- import { Database as Database16, Entity as Entity3, Obj as Obj19, Ref as Ref23 } from "@dxos/echo";
2207
- import { defineFunction as defineFunction15 } from "@dxos/functions";
2208
- import { trim as trim15 } from "@dxos/util";
2209
- var load_default = defineFunction15({
2210
- key: "dxos.org/function/database/load",
2211
- name: "Load object",
2212
- description: trim15`
2213
- Loads the object or relation content.
2214
- Can load multiple objects at at time.
2215
- Use the to read the data when you have a DXN.
2216
- Call this tool with an array of one or more DXNs or object IDs.
2217
- When use see a reference ({ '/': 'dxn:...' }), you can call this function to load the object.
2218
- Note that returned data is only a snapshot in time, and might have changed since the object was last loaded.
2219
- `,
2220
- inputSchema: Schema20.Struct({
2221
- refs: Schema20.Array(Ref23.Ref(Obj19.Unknown))
2222
- }),
2223
- outputSchema: Schema20.Unknown,
2224
- handler: Effect19.fn(function* ({ data: { refs } }) {
2225
- return yield* Effect19.forEach(refs, Database16.load).pipe(Effect19.map(Array12.map(Entity3.toJSON)));
2226
- })
2227
- });
2228
-
2229
- // src/blueprints/database/functions/object-create.ts
2230
- import * as Effect20 from "effect/Effect";
2231
- import * as Schema21 from "effect/Schema";
2232
- import { Database as Database17, Entity as Entity4, Obj as Obj20, Type as Type6 } from "@dxos/echo";
2233
- import { defineFunction as defineFunction16 } from "@dxos/functions";
2234
- import { invariant as invariant4 } from "@dxos/invariant";
2235
- import { trim as trim16 } from "@dxos/util";
2236
- var __dxlog_file9 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/database/functions/object-create.ts";
2237
- var object_create_default = defineFunction16({
2238
- key: "dxos.org/function/database/object-create",
2239
- name: "Create object",
2240
- description: trim16`
2241
- Creates a new object and adds it to the current space.
2242
- Get the schema from the schema-list tool and ensure that the data matches the corresponding schema.
2243
- `,
2244
- inputSchema: Schema21.Struct({
2245
- typename: Schema21.String,
2246
- data: Schema21.Any
2247
- }),
2248
- outputSchema: Schema21.Unknown,
2249
- handler: Effect20.fn(function* ({ data: { typename, data } }) {
2250
- const { db } = yield* Database17.Service;
2251
- const schema = yield* Effect20.promise(() => db.schemaRegistry.query({
2252
- typename,
2253
- location: [
2254
- "database",
2255
- "runtime"
2256
- ]
2257
- }).first());
2258
- invariant4(Type6.isObjectSchema(schema), "Schema is not an object schema", {
2259
- F: __dxlog_file9,
2260
- L: 30,
2261
- S: this,
2262
- A: [
2263
- "Type.isObjectSchema(schema)",
2264
- "'Schema is not an object schema'"
2265
- ]
2266
- });
2267
- const object = db.add(Obj20.make(schema, data));
2268
- return Entity4.toJSON(object);
2269
- })
2270
- });
2271
-
2272
- // src/blueprints/database/functions/object-delete.ts
2273
- import * as Effect21 from "effect/Effect";
2274
- import * as Schema22 from "effect/Schema";
2275
- import { Database as Database18, Obj as Obj21, Ref as Ref24 } from "@dxos/echo";
2276
- import { defineFunction as defineFunction17 } from "@dxos/functions";
2277
- import { trim as trim17 } from "@dxos/util";
2278
- var object_delete_default = defineFunction17({
2279
- key: "dxos.org/function/database/object-delete",
2280
- name: "Delete object",
2281
- description: trim17`
2282
- Deletes the object.
2283
- `,
2284
- inputSchema: Schema22.Struct({
2285
- obj: Ref24.Ref(Obj21.Unknown)
2286
- }),
2287
- outputSchema: Schema22.Void,
2288
- handler: Effect21.fn(function* ({ data: { obj } }) {
2289
- const { db } = yield* Database18.Service;
2290
- const object = yield* Database18.load(obj);
2291
- db.remove(object);
2292
- })
2293
- });
2294
-
2295
- // src/blueprints/database/functions/object-update.ts
2296
- import * as Effect22 from "effect/Effect";
2297
- import * as Schema23 from "effect/Schema";
2298
- import { Database as Database19, Entity as Entity5, Obj as Obj22, Ref as Ref25 } from "@dxos/echo";
2299
- import { defineFunction as defineFunction18 } from "@dxos/functions";
2300
- import { trim as trim18 } from "@dxos/util";
2301
- var object_update_default = defineFunction18({
2302
- key: "dxos.org/function/database/object-update",
2303
- name: "Update object",
2304
- description: trim18`
2305
- Updates the object properties.
2306
- `,
2307
- inputSchema: Schema23.Struct({
2308
- obj: Ref25.Ref(Obj22.Unknown),
2309
- properties: Schema23.Record({
2310
- key: Schema23.String,
2311
- value: Schema23.Any
2312
- })
2313
- }),
2314
- outputSchema: Schema23.Unknown,
2315
- handler: Effect22.fn(function* ({ data: { obj, properties } }) {
2316
- const object = yield* Database19.load(obj);
2317
- Entity5.change(object, (obj2) => {
2318
- for (const [key, value] of Object.entries(properties)) {
2319
- obj2[key] = value;
2320
- }
2321
- });
2322
- return Entity5.toJSON(object);
2323
- })
2324
- });
2325
-
2326
- // src/blueprints/database/functions/query.ts
2327
- import * as Effect23 from "effect/Effect";
2328
- import * as Schema24 from "effect/Schema";
2329
- import { Entity as Entity6, Filter as Filter4, Obj as Obj23, Query as Query5 } from "@dxos/echo";
2330
- import { Database as Database20 } from "@dxos/echo";
2331
- import { defineFunction as defineFunction19 } from "@dxos/functions";
2332
- import { trim as trim19 } from "@dxos/util";
2333
- var query_default = defineFunction19({
2334
- key: "dxos.org/function/database/query",
2335
- name: "Query",
2336
- description: trim19`
2337
- Query for objects in ECHO.
2338
- Use this tool when searching for information in the space (both automerge and queues).
2339
- Currently, two types of queries are supported:
2340
- - Full-text search - terms may appear anywhere in the object.
2341
- - Type-based search - objects of a specific type.
2342
- You can use them together, for example, to search for objects of a specific type that match a full-text query.
2343
- Important: Whem querying by typename, make sure to list the schema first, to get the exact typename.
2344
-
2345
- Omit both typename and text to search for all objects.
2346
-
2347
- <output_format>
2348
- You can choose to either return the full object data, or just the DXN, type and label.
2349
- When expecting a lot of results, run with includeContent=false to not pollute the context, and then load specific objects using the load tool.
2350
-
2351
- You can choose to get the content right away, if you don't expect a lot of results.
2352
- To load content right away, run with includeContent=true.
2353
- When loading content, set an appropriate limit on the number of results to avoid overwhelming the context.
2354
- </output_format>
2355
-
2356
- <example description="All tasks related to Cyberdyne and Bob">
2357
- {
2358
- "typename": "dxos.org/type/Task",
2359
- "text": "cyberdyne bob",
2360
- }
2361
- </example>
2362
-
2363
- <example description="Financial report Q1 2026">
2364
- {
2365
- "typename": "dxos.org/type/Document",
2366
- "text": "financial report Q1 2026",
2367
- "includeContent": true
2368
- "limit": 3
2369
- }
2370
- </example>
2371
- `,
2372
- inputSchema: Schema24.Struct({
2373
- typename: Schema24.optional(Schema24.String.annotations({
2374
- description: "The typename of the objects to list.",
2375
- example: "dxos.org/type/Task"
2376
- })),
2377
- text: Schema24.optional(Schema24.String.annotations({
2378
- description: "Full text search query.",
2379
- example: "email cyberdyne bob"
2380
- })),
2381
- includeContent: Schema24.optional(Schema24.Boolean.annotations({
2382
- description: "Include the full object data in the response.",
2383
- default: false
2384
- })),
2385
- limit: Schema24.optional(Schema24.Number.annotations({
2386
- description: "The maximum number of results to return.",
2387
- default: 10
2388
- })),
2389
- // TODO(dmaretskyi): There's a problem with querying queues, that the agent keeps finding message from agent threads.
2390
- // Let's think about a better way to do this.
2391
- // And queues don't have predicatble ids, so queue DXNs blow up the conversation cache.
2392
- includeQueues: Schema24.optional(Schema24.Boolean.annotations({
2393
- description: "Search in queues as well as spaces. Only use this if searching for emails.",
2394
- default: false
2395
- }))
2396
- }),
2397
- outputSchema: Schema24.Array(Schema24.Unknown),
2398
- handler: Effect23.fn(function* ({ data: { typename, text, includeContent = false, limit = 10, includeQueues = false } }) {
2399
- let query2;
2400
- if (text) {
2401
- query2 = Query5.all(...text.split(" ").map((term) => Query5.select(Filter4.text(term, {
2402
- type: "full-text"
2403
- }))));
2404
- if (typename !== void 0) {
2405
- const schema = yield* Database20.runSchemaQuery({
2406
- typename,
2407
- location: [
2408
- "database",
2409
- "runtime"
2410
- ]
2411
- });
2412
- if (schema.length === 0) {
2413
- return yield* Effect23.fail(new Error(`Schema ${typename} not found`));
2414
- }
2415
- query2 = query2.select(Filter4.type(schema[0]));
2416
- }
2417
- } else if (typename) {
2418
- query2 = Query5.select(Filter4.type(typename));
2419
- } else {
2420
- query2 = Query5.select(Filter4.everything());
2421
- }
2422
- query2 = query2.limit(limit);
2423
- if (includeQueues) {
2424
- query2 = query2.from({
2425
- allQueuesFromSpaces: true
2426
- });
2427
- }
2428
- yield* Database20.flush({
2429
- indexes: true
2430
- });
2431
- const results = yield* Database20.runQuery(query2);
2432
- if (includeContent) {
2433
- return results.map((obj) => Entity6.toJSON(obj));
2434
- } else {
2435
- return results.map((obj) => ({
2436
- dxn: Obj23.getDXN(obj).toString(),
2437
- typename: Obj23.getTypename(obj),
2438
- label: Obj23.getLabel(obj)
2439
- }));
2440
- }
2441
- })
2442
- });
2443
-
2444
- // src/blueprints/database/functions/relation-create.ts
2445
- import * as Effect24 from "effect/Effect";
2446
- import * as Schema25 from "effect/Schema";
2447
- import { Database as Database21, Entity as Entity7, Obj as Obj24, Ref as Ref26, Relation as Relation3, Type as Type7 } from "@dxos/echo";
2448
- import { defineFunction as defineFunction20 } from "@dxos/functions";
2449
- import { invariant as invariant5 } from "@dxos/invariant";
2450
- import { trim as trim20 } from "@dxos/util";
2451
- var __dxlog_file10 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/blueprints/database/functions/relation-create.ts";
2452
- var relation_create_default = defineFunction20({
2453
- key: "dxos.org/function/database/relation-create",
2454
- name: "Create relation",
2455
- description: trim20`
2456
- Creates a new relation and adds it to the current space.
2457
- Get the schema from the schema-list tool and ensure that the data matches the corresponding schema.
2458
- `,
2459
- inputSchema: Schema25.Struct({
2460
- typename: Schema25.String,
2461
- source: Ref26.Ref(Obj24.Unknown),
2462
- target: Ref26.Ref(Obj24.Unknown),
2463
- properties: Schema25.Any.annotations({
2464
- description: "The data to be stored in the relation."
2465
- })
2466
- }),
2467
- outputSchema: Schema25.Unknown,
2468
- handler: Effect24.fn(function* ({ data: { typename, source, target, properties } }) {
2469
- const { db } = yield* Database21.Service;
2470
- const schema = yield* Effect24.promise(() => db.schemaRegistry.query({
2471
- typename,
2472
- location: [
2473
- "database",
2474
- "runtime"
2475
- ]
2476
- }).first());
2477
- invariant5(Type7.isRelationSchema(schema), "Schema is not a relation schema", {
2478
- F: __dxlog_file10,
2479
- L: 34,
2480
- S: this,
2481
- A: [
2482
- "Type.isRelationSchema(schema)",
2483
- "'Schema is not a relation schema'"
2484
- ]
2485
- });
2486
- const sourceObj = yield* Database21.load(source);
2487
- const targetObj = yield* Database21.load(target);
2488
- const relation = db.add(Relation3.make(schema, {
2489
- [Relation3.Source]: sourceObj,
2490
- [Relation3.Target]: targetObj,
2491
- ...properties
2492
- }));
2493
- return Entity7.toJSON(relation);
2494
- })
2495
- });
2496
-
2497
- // src/blueprints/database/functions/relation-delete.ts
2498
- import * as Effect25 from "effect/Effect";
2499
- import * as Schema26 from "effect/Schema";
2500
- import { Database as Database22, Ref as Ref27, Relation as Relation4 } from "@dxos/echo";
2501
- import { defineFunction as defineFunction21 } from "@dxos/functions";
2502
- import { trim as trim21 } from "@dxos/util";
2503
- var relation_delete_default = defineFunction21({
2504
- key: "dxos.org/function/database/relation-delete",
2505
- name: "Delete relation",
2506
- description: trim21`
2507
- Deletes the relation.
2508
- `,
2509
- inputSchema: Schema26.Struct({
2510
- rel: Ref27.Ref(Relation4.Unknown)
2511
- }),
2512
- outputSchema: Schema26.Void,
2513
- handler: Effect25.fn(function* ({ data: { rel } }) {
2514
- const { db } = yield* Database22.Service;
2515
- const relation = yield* Database22.load(rel);
2516
- db.remove(relation);
2517
- })
2518
- });
2519
-
2520
- // src/blueprints/database/functions/schema-add.ts
2521
- import * as Effect26 from "effect/Effect";
2522
- import * as Schema27 from "effect/Schema";
2523
- import { Database as Database23 } from "@dxos/echo";
2524
- import { defineFunction as defineFunction22 } from "@dxos/functions";
2525
- import { trim as trim22 } from "@dxos/util";
2526
- var schema_add_default = defineFunction22({
2527
- key: "dxos.org/function/database/schema-add",
2528
- name: "Add schema",
2529
- description: trim22`
2530
- Adds a schema to the space.
2531
- The name will be used when displayed to the user.
2532
- `,
2533
- inputSchema: Schema27.Struct({
2534
- name: Schema27.String,
2535
- typename: Schema27.String.annotations({
2536
- description: 'The typename of the schema in the format of "example.com/type/Type".'
2537
- }),
2538
- jsonSchema: Schema27.Any
2539
- }),
2540
- outputSchema: Schema27.Void,
2541
- handler: Effect26.fn(function* ({ data: { name, typename, jsonSchema } }) {
2542
- const { db } = yield* Database23.Service;
2543
- yield* Effect26.promise(() => db.schemaRegistry.register([
2544
- {
2545
- typename,
2546
- version: "0.1.0",
2547
- jsonSchema,
2548
- name
2549
- }
2550
- ]));
2551
- })
2552
- });
2553
-
2554
- // src/blueprints/database/functions/schema-list.ts
2555
- import * as Effect27 from "effect/Effect";
2556
- import * as Schema28 from "effect/Schema";
2557
- import { Database as Database24, JsonSchema, Type as Type8 } from "@dxos/echo";
2558
- import { defineFunction as defineFunction23 } from "@dxos/functions";
2559
- import { trim as trim23 } from "@dxos/util";
2560
- var schema_list_default = defineFunction23({
2561
- key: "dxos.org/function/database/schema-list",
2562
- name: "List schemas",
2563
- description: trim23`
2564
- Lists schemas definitions.
2565
- `,
2566
- inputSchema: Schema28.Struct({
2567
- limit: Schema28.optional(Schema28.Number)
2568
- }),
2569
- outputSchema: Schema28.Array(Schema28.Unknown),
2570
- handler: Effect27.fn(function* () {
2571
- const { db } = yield* Database24.Service;
2572
- const schema = yield* Effect27.promise(() => db.schemaRegistry.query({
2573
- location: [
2574
- "database",
2575
- "runtime"
2576
- ]
2577
- }).run());
2578
- return schema.map((schema2) => {
2579
- const meta = Type8.getMeta(schema2);
2580
- return {
2581
- typename: Type8.getTypename(schema2),
2582
- jsonSchema: JsonSchema.toJsonSchema(schema2),
2583
- kind: meta?.sourceSchema ? "relation" : "record"
2584
- };
2585
- });
2586
- })
2587
- });
2588
-
2589
- // src/blueprints/database/functions/tag-add.ts
2590
- import * as Effect28 from "effect/Effect";
2591
- import * as Schema29 from "effect/Schema";
2592
- import { Database as Database25, Entity as Entity8, Obj as Obj25, Ref as Ref28, Tag as Tag2 } from "@dxos/echo";
2593
- import { defineFunction as defineFunction24 } from "@dxos/functions";
2594
- import { trim as trim24 } from "@dxos/util";
2595
- var tag_add_default = defineFunction24({
2596
- key: "dxos.org/function/database/tag-add",
2597
- name: "Add tag",
2598
- description: trim24`
2599
- Adds a tag to an object.
2600
- Tags are objects of type ${Tag2.Tag.typename}.
2601
- You must search database for available tags, or create a new one.
2602
- `,
2603
- inputSchema: Schema29.Struct({
2604
- tag: Ref28.Ref(Obj25.Unknown),
2605
- obj: Ref28.Ref(Obj25.Unknown)
2606
- }),
2607
- outputSchema: Schema29.Unknown,
2608
- handler: Effect28.fn(function* ({ data: { tag, obj } }) {
2609
- const object = yield* Database25.load(obj);
2610
- const tagObj = yield* Database25.load(tag);
2611
- Entity8.change(object, (obj2) => Entity8.addTag(obj2, Obj25.getDXN(tagObj).toString()));
2612
- return Entity8.toJSON(object);
2613
- })
2614
- });
2615
-
2616
- // src/blueprints/database/functions/tag-remove.ts
2617
- import * as Effect29 from "effect/Effect";
2618
- import * as Schema30 from "effect/Schema";
2619
- import { Database as Database26, Entity as Entity9, Obj as Obj26, Ref as Ref29, Tag as Tag3 } from "@dxos/echo";
2620
- import { defineFunction as defineFunction25 } from "@dxos/functions";
2621
- import { trim as trim25 } from "@dxos/util";
2622
- var tag_remove_default = defineFunction25({
2623
- key: "dxos.org/function/database/tag-remove",
2624
- name: "Remove tag",
2625
- description: trim25`
2626
- Removes a tag from an object.
2627
- Tags are objects of type ${Tag3.Tag.typename}.
2628
- `,
2629
- inputSchema: Schema30.Struct({
2630
- tag: Ref29.Ref(Obj26.Unknown),
2631
- obj: Ref29.Ref(Obj26.Unknown)
2632
- }),
2633
- outputSchema: Schema30.Unknown,
2634
- handler: Effect29.fn(function* ({ data: { tag, obj } }) {
2635
- const object = yield* Database26.load(obj);
2636
- const tagObj = yield* Database26.load(tag);
2637
- Entity9.change(object, (obj2) => Entity9.removeTag(obj2, Obj26.getDXN(tagObj).toString()));
2638
- return Entity9.toJSON(object);
2639
- })
2640
- });
2641
-
2642
- // src/blueprints/database/functions/index.ts
2643
- var DatabaseFunctions = {
2644
- ContextAdd: context_add_default,
2645
- ContextRemove: context_remove_default,
2646
- Load: load_default,
2647
- ObjectCreate: object_create_default,
2648
- ObjectDelete: object_delete_default,
2649
- ObjectUpdate: object_update_default,
2650
- Query: query_default,
2651
- RelationCreate: relation_create_default,
2652
- RelationDelete: relation_delete_default,
2653
- SchemaAdd: schema_add_default,
2654
- SchemaList: schema_list_default,
2655
- TagAdd: tag_add_default,
2656
- TagRemove: tag_remove_default
2657
- };
2658
-
2659
- // src/blueprints/database/blueprint.ts
2660
- var BLUEPRINT_KEY10 = "dxos.org/blueprint/database";
2661
- var instructions7 = trim26`
2662
- You can query, create, update, and delete objects in ECHO.
2663
- You can manage schemas, relations, tags, and add objects to the chat context.
2664
- `;
2665
- var functions9 = Object.values(DatabaseFunctions);
2666
- var make17 = () => Blueprint10.make({
2667
- key: BLUEPRINT_KEY10,
2668
- name: "Database",
2669
- description: "Query and manipulate objects in the ECHO database.",
2670
- instructions: {
2671
- source: Ref30.make(Text10.make(instructions7))
2672
- },
2673
- tools: Blueprint10.toolDefinitions({
2674
- functions: functions9
2675
- })
2676
- });
2677
- var blueprint10 = {
2678
- key: BLUEPRINT_KEY10,
2679
- functions: functions9,
2680
- make: make17
2681
- };
2682
- var blueprint_default10 = blueprint10;
2683
-
2684
- // src/functions/agent/prompt.ts
2685
- import * as Array16 from "effect/Array";
2686
- import * as Effect30 from "effect/Effect";
2687
- import * as Function6 from "effect/Function";
2688
- import * as Option4 from "effect/Option";
2689
- import * as Schema31 from "effect/Schema";
2690
- import { AiService as AiService4, ConsolePrinter as ConsolePrinter2, ModelName } from "@dxos/ai";
2691
- import { AiSession as AiSession2, GenerationObserver as GenerationObserver2, createToolkit as createToolkit2 } from "@dxos/assistant";
2692
- import { Prompt as Prompt2, Template as Template3 } from "@dxos/blueprints";
2693
- import { Database as Database27, Obj as Obj27, Ref as Ref31 } from "@dxos/echo";
2694
- import { TracingService as TracingService4, defineFunction as defineFunction26 } from "@dxos/functions";
2695
- import { log as log6 } from "@dxos/log";
2696
- var __dxlog_file11 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/functions/agent/prompt.ts";
2697
- var DEFAULT_MODEL = "@anthropic/claude-opus-4-0";
2698
- var prompt_default = defineFunction26({
2699
- key: "dxos.org/function/prompt",
2700
- name: "Agent",
2701
- description: "Agentic worker that executes a provided prompt using blueprints and tools.",
2702
- inputSchema: Schema31.Struct({
2703
- prompt: Ref31.Ref(Prompt2.Prompt),
2704
- systemPrompt: Schema31.optional(Ref31.Ref(Prompt2.Prompt)),
2705
- /**
2706
- * @default @anthropic/claude-opus-4-0
2707
- */
2708
- model: Schema31.optional(ModelName),
2709
- /**
2710
- * Input object or data.
2711
- * References get auto-resolved.
2712
- */
2713
- input: Schema31.Any.pipe(Schema31.annotations({
2714
- title: "Input"
2715
- }))
2716
- }),
2717
- outputSchema: Schema31.Any,
2718
- handler: Effect30.fnUntraced(function* ({ data }) {
2719
- log6.info("processing input", {
2720
- input: data.input
2721
- }, {
2722
- F: __dxlog_file11,
2723
- L: 39,
2724
- S: this,
2725
- C: (f, a) => f(...a)
2726
- });
2727
- const input = yield* Ref31.isRef(data.input) ? Database27.load(data.input).pipe(Effect30.map(Obj27.toJSON)) : Effect30.succeed(data.input);
2728
- yield* Database27.flush({
2729
- indexes: true
2730
- });
2731
- const prompt = yield* Database27.load(data.prompt);
2732
- const systemPrompt = data.systemPrompt ? yield* Database27.load(data.systemPrompt) : void 0;
2733
- yield* TracingService4.emitStatus({
2734
- message: `Running ${prompt.id}`
2735
- });
2736
- log6.info("starting agent", {
2737
- prompt: prompt.id,
2738
- input
2739
- }, {
2740
- F: __dxlog_file11,
2741
- L: 63,
2742
- S: this,
2743
- C: (f, a) => f(...a)
2744
- });
2745
- const blueprints = yield* Function6.pipe(prompt.blueprints, Array16.appendAll(systemPrompt?.blueprints ?? []), Effect30.forEach(Database27.loadOption), Effect30.map(Array16.filter(Option4.isSome)), Effect30.map(Array16.map((option) => option.value)));
2746
- const toolkit = yield* createToolkit2({
2747
- blueprints
2748
- });
2749
- const objects = yield* Function6.pipe(prompt.context, Array16.appendAll(systemPrompt?.context ?? []), Effect30.forEach(Database27.loadOption), Effect30.map(Array16.filter(Option4.isSome)), Effect30.map(Array16.map((option) => option.value)));
2750
- const promptInstructions = yield* Database27.load(prompt.instructions.source);
2751
- const promptText = Template3.process(promptInstructions.content, input);
2752
- const systemInstructions = systemPrompt ? yield* Database27.load(systemPrompt.instructions.source) : void 0;
2753
- const systemText = systemInstructions ? Template3.process(systemInstructions.content, {}) : void 0;
2754
- const session = new AiSession2();
2755
- const result = yield* session.run({
2756
- prompt: promptText,
2757
- system: systemText,
2758
- blueprints,
2759
- objects,
2760
- toolkit,
2761
- observer: GenerationObserver2.fromPrinter(new ConsolePrinter2({
2762
- tag: "agent"
2763
- }))
2764
- }).pipe(Effect30.provide(AiService4.model(data.model ?? DEFAULT_MODEL)));
2765
- const lastBlock = result.at(-1)?.blocks.filter((block) => block._tag === "text").at(-1);
2766
- return {
2767
- note: lastBlock?.text
2768
- };
2769
- })
2770
- });
2771
-
2772
- // src/functions/agent/index.ts
2773
- var AgentFunctions = {
2774
- Prompt: prompt_default
2775
- };
2776
-
2777
- // src/functions/entity-extraction/entity-extraction.ts
2778
- import * as Effect31 from "effect/Effect";
2779
- import * as Layer4 from "effect/Layer";
2780
- import * as Predicate from "effect/Predicate";
2781
- import * as Schema32 from "effect/Schema";
2782
- import { AiService as AiService5 } from "@dxos/ai";
2783
- import { GenericToolkit as GenericToolkit2 } from "@dxos/ai";
2784
- import { AiSession as AiSession3, ToolExecutionServices as ToolExecutionServices2 } from "@dxos/assistant";
2785
- import { Database as Database28, Filter as Filter5, Obj as Obj28, Ref as Ref32 } from "@dxos/echo";
2786
- import { defineFunction as defineFunction27 } from "@dxos/functions";
2787
- import { FunctionInvocationServiceLayerTest } from "@dxos/functions-runtime/testing";
2788
- import { log as log7 } from "@dxos/log";
2789
- import { LegacyOrganization as LegacyOrganization2, Message as Message2, Organization, Person as Person3 } from "@dxos/types";
2790
- import { trim as trim27 } from "@dxos/util";
2791
- var __dxlog_file12 = "/__w/dxos/dxos/packages/core/assistant-toolkit/src/functions/entity-extraction/entity-extraction.ts";
2792
- var entity_extraction_default = defineFunction27({
2793
- key: "dxos.org/functions/entity-extraction",
2794
- name: "Entity Extraction",
2795
- description: "Extracts entities from emails and transcripts.",
2796
- inputSchema: Schema32.Struct({
2797
- source: Message2.Message.annotations({
2798
- description: "Email or transcript to extract entities from."
2799
- }),
2800
- // TODO(dmaretskyi): Consider making this an array of blueprints instead.
2801
- instructions: Schema32.optional(Schema32.String).annotations({
2802
- description: "Instructions extraction process."
2803
- })
2804
- }),
2805
- outputSchema: Schema32.Struct({
2806
- entities: Schema32.optional(Schema32.Array(Obj28.Unknown).annotations({
2807
- description: "Extracted entities."
2808
- }))
2809
- }),
2810
- handler: Effect31.fnUntraced(function* ({ data: { source: message, instructions: instructions8 } }) {
2811
- const tags = Obj28.getMeta(message)?.tags;
2812
- const contact = yield* extractContact(message.sender, tags);
2813
- let organization = null;
2814
- if (contact && !contact.organization) {
2815
- const created = [];
2816
- const GraphWriterToolkit = makeGraphWriterToolkit({
2817
- schema: [
2818
- LegacyOrganization2
2819
- ]
2820
- }).pipe();
2821
- const GraphWriterHandler = makeGraphWriterHandler(GraphWriterToolkit, {
2822
- onAppend: (dxns) => created.push(...dxns)
2823
- });
2824
- const toolkit = yield* GraphWriterToolkit.pipe(Effect31.provide(GraphWriterHandler.pipe(Layer4.provide(ResearchGraph_exports.contextQueueLayer))));
2825
- yield* new AiSession3().run({
2826
- system: trim27`
2827
- Extract the sender's organization from the email. If you are not sure, do nothing.
2828
- The extracted organization URL must match the sender's email domain.
2829
- ${instructions8 ? "<user_intructions>" + instructions8 + "</user_intructions>" : ""},
2830
- `,
2831
- prompt: JSON.stringify({
2832
- source: message,
2833
- contact
2834
- }),
2835
- toolkit
2836
- });
2837
- if (created.length > 1) {
2838
- throw new Error("Multiple organizations created");
2839
- } else if (created.length === 1) {
2840
- organization = yield* Database28.resolve(created[0], Organization.Organization);
2841
- Obj28.change(organization, (org) => {
2842
- const meta = Obj28.getMeta(org);
2843
- meta.tags ??= [];
2844
- meta.tags.push(...tags ?? []);
2845
- });
2846
- Obj28.change(contact, (c) => {
2847
- c.organization = Ref32.make(organization);
2848
- });
2849
- }
2850
- }
2851
- return {
2852
- entities: [
2853
- contact,
2854
- organization
2855
- ].filter(Predicate.isNotNullable)
2856
- };
2857
- }, Effect31.provide(Layer4.mergeAll(AiService5.model("@anthropic/claude-sonnet-4-0"), ToolExecutionServices2).pipe(Layer4.provide(
2858
- // TODO(dmaretskyi): This should be provided by environment.
2859
- Layer4.mergeAll(GenericToolkit2.providerEmpty, FunctionInvocationServiceLayerTest())
2860
- ))))
2861
- });
2862
- var extractContact = Effect31.fn("extractContact")(function* (actor, tags) {
2863
- const name = actor.name;
2864
- const email = actor.email;
2865
- if (!email) {
2866
- log7.warn("email is required for contact extraction", {
2867
- actor
2868
- }, {
2869
- F: __dxlog_file12,
2870
- L: 110,
2871
- S: this,
2872
- C: (f, a) => f(...a)
2873
- });
2874
- return void 0;
2875
- }
2876
- const existingContacts = yield* Database28.runQuery(Filter5.type(Person3.Person));
2877
- const existingContact = existingContacts.find((contact) => contact.emails?.some((contactEmail) => contactEmail.value === email));
2878
- if (existingContact) {
2879
- log7.info("Contact already exists", {
2880
- email,
2881
- existingContact
2882
- }, {
2883
- F: __dxlog_file12,
2884
- L: 123,
2885
- S: this,
2886
- C: (f, a) => f(...a)
2887
- });
2888
- return existingContact;
2889
- }
2890
- const newContact = Obj28.make(Person3.Person, {
2891
- ...tags ? {
2892
- [Obj28.Meta]: {
2893
- tags: [
2894
- ...tags
2895
- ]
2896
- }
2897
- } : {},
2898
- emails: [
2899
- {
2900
- value: email
2901
- }
2902
- ]
2903
- });
2904
- yield* Database28.add(newContact);
2905
- if (name) {
2906
- Obj28.change(newContact, (c) => {
2907
- c.fullName = name;
2908
- });
2909
- }
2910
- const emailDomain = email.split("@")[1]?.toLowerCase();
2911
- if (!emailDomain) {
2912
- log7.warn("Invalid email format, cannot extract domain", {
2913
- email
2914
- }, {
2915
- F: __dxlog_file12,
2916
- L: 141,
2917
- S: this,
2918
- C: (f, a) => f(...a)
2919
- });
2920
- return newContact;
2921
- }
2922
- log7.info("extracted email domain", {
2923
- emailDomain
2924
- }, {
2925
- F: __dxlog_file12,
2926
- L: 145,
2927
- S: this,
2928
- C: (f, a) => f(...a)
2929
- });
2930
- const existingOrganisations = yield* Database28.runQuery(Filter5.type(Organization.Organization));
2931
- const matchingOrg = existingOrganisations.find((org) => {
2932
- if (org.website) {
2933
- try {
2934
- const websiteUrl = org.website.startsWith("http://") || org.website.startsWith("https://") ? org.website : `https://${org.website}`;
2935
- const websiteDomain = new URL(websiteUrl).hostname.toLowerCase();
2936
- return websiteDomain === emailDomain || websiteDomain.endsWith(`.${emailDomain}`) || emailDomain.endsWith(`.${websiteDomain}`);
2937
- } catch (e) {
2938
- log7.warn("Error parsing website URL", {
2939
- website: org.website,
2940
- error: e
2941
- }, {
2942
- F: __dxlog_file12,
2943
- L: 163,
2944
- S: this,
2945
- C: (f, a) => f(...a)
2946
- });
2947
- return false;
2948
- }
2949
- }
2950
- return false;
2951
- });
2952
- if (matchingOrg) {
2953
- log7.info("found matching organization", {
2954
- organization: matchingOrg
2955
- }, {
2956
- F: __dxlog_file12,
2957
- L: 174,
2958
- S: this,
2959
- C: (f, a) => f(...a)
2960
- });
2961
- Obj28.change(newContact, (c) => {
2962
- c.organization = Ref32.make(matchingOrg);
2963
- });
2964
- }
2965
- return newContact;
2966
- });
2967
-
2968
- // src/functions/entity-extraction/index.ts
2969
- var EntityExtractionFunctions = {
2970
- Extract: entity_extraction_default
2971
- };
2972
-
2973
- // src/functions/exa/exa.ts
2974
- import * as Effect32 from "effect/Effect";
2975
- import * as Schema33 from "effect/Schema";
2976
- import Exa from "exa-js";
2977
- import { CredentialsService as CredentialsService3, defineFunction as defineFunction28 } from "@dxos/functions";
2978
- var exa_default = defineFunction28({
2979
- key: "dxos.org/function/exa-search",
2980
- name: "Exa Search",
2981
- description: "Search the web for information",
2982
- inputSchema: Schema33.Struct({
2983
- query: Schema33.String.annotations({
2984
- description: "The query to search for."
2985
- })
2986
- }),
2987
- outputSchema: Schema33.Unknown,
2988
- handler: Effect32.fnUntraced(function* ({ data: { query: query2 } }) {
2989
- const credential = yield* CredentialsService3.getCredential({
2990
- service: "exa.ai"
2991
- });
2992
- const exa = new Exa(credential.apiKey);
2993
- const context = yield* Effect32.promise(async () => exa.searchAndContents(query2, {
2994
- type: "auto",
2995
- text: {
2996
- maxCharacters: 3e3
2997
- },
2998
- livecrawl: "always"
2999
- }));
3000
- return context;
3001
- })
3002
- });
3003
-
3004
- // src/functions/exa/mock.ts
3005
- import * as Effect33 from "effect/Effect";
3006
- import * as Schema34 from "effect/Schema";
3007
- import { defineFunction as defineFunction29 } from "@dxos/functions";
3008
-
3009
- // src/functions/exa/data/exa-search-1748337321991.ts
3010
- var exa_search_1748337321991_default = {
3011
- requestId: "324936368a74f4db978982172bc18a6c",
3012
- autopromptString: "AI personal knowledge management tools projects 2024",
3013
- autoDate: "2024-01-01T00:00:00.000Z",
3014
- resolvedSearchType: "neural",
3015
- results: [
3016
- {
3017
- id: "https://www.open-notebook.ai/",
3018
- title: "What is Open Notebook? | Open Notebook",
3019
- url: "https://www.open-notebook.ai/",
3020
- publishedDate: "2024-01-01T00:00:00.000Z",
3021
- author: "",
3022
- score: 0.3995794951915741,
3023
- text: "Take Control of Your Learning. Privately. A powerful open-source, AI-powered note-taking/research platform that respects your privacy \u{1F399}\uFE0F Podcast Generator Transform your notes into engaging podcasts with customizable voices, speakers, and episodes \u{1F916} AI-Powered Notes Leverage AI to summarize, generate insights, and manage your notes \u{1F512} Privacy Control Full control over what information AI can access \u{1F504} Content Integration Support for links, PDFs, TXT, PPT, YouTube, and more What is Open Notebook? \u200B Open Notebook is the cognitive partner you always wanted and could never explain why. It combines the power of AI with unwavering privacy controls. It's designed for researchers, students, and professionals who want to enhance their learning and abilities while maintaining complete control over workflows, models, and how their data gets used and exposed. Is this right for me? \u200B \u{1F4DA} Learning Enthusiast You're constantly seeking knowledge and want to go beyond surface-level understanding. Learning for you is about building deep, lasting comprehension. \u{1F91D} You want a learning partner You believe your learning process can improve by partnering with a tailor made AI. You want to be provoked to think more clearly. \u{1F92F} Your learning backlog is way too big You have hundreds of links you would love to read, but there is no time for it all. You want to make sure those are catalogued for when you need them. \u270D\uFE0F Independent Thinker You value both taking notes and forming your own ideas. You understand different viewpoints but believe in developing your own perspective. \u{1F512} You are privacy aware You don't want all your context, thoughts and plans to be all over Big Tech, if not necessary. \u{1F481} You like things your way You want to decide how your content is handled, which AI models you want to interact with and help specifically it should help/challenge you. What is the plan for the future? \u200B There is much more that can be done to augment human knowledge. Open Notebook's first release is just a first step in that direction. The end goal is to build a Cognitive Partner for every person. A customized assistant that can help you develop your skills, knowledge, and opinions in a way that makes sense to you. Learn more about our long-term vision and roadmap in our Vision page."
3024
- },
3025
- {
3026
- id: "https://www.reorproject.org/",
3027
- title: "Reor",
3028
- url: "https://www.reorproject.org/",
3029
- publishedDate: "2024-01-01T00:00:00.000Z",
3030
- author: "Reor",
3031
- score: 0.39665618538856506,
3032
- text: "Private &amp; local AI personal knowledge management app for high entropy thinkers. Q&amp;A Chat with an LLM that has full context of your notes. Automatically connected ideas Never manually link your notes again. Semantic Search Search without having to remember exact phrasing. WYSIWYG Markdown Markdown is the language of thought. Local First LLMs, Embedding Models, Vector database. Everything runs and stores locally. Writing Assistant Write with the world's first local writing assistant. Trusted by individuals who may have heard of these companies",
3033
- image: "https://reorhomepage-2-cwy0zagzg-reor-team.vercel.app/opengraph-image.jpg?a25ca70e900445ed",
3034
- favicon: "https://www.reorproject.org/favicon-16x16.png"
3035
- },
3036
- {
3037
- id: "https://mymemo.ai/blog/best-ai-personal-knowledge-management-tools-in-2024/detail",
3038
- title: "Best AI Personal Knowledge Management (PKM) tools in 2024 - My Framer Site",
3039
- url: "https://mymemo.ai/blog/best-ai-personal-knowledge-management-tools-in-2024/detail",
3040
- publishedDate: "2025-05-21T17:17:02.000Z",
3041
- author: "",
3042
- score: 0.3811739385128021,
3043
- text: "In today's fast-paced world, managing and organizing knowledge has become increasingly challenging. With the rise of digital information and the need for efficient knowledge sharing, traditional methods of knowledge management are no longer sufficient. AI-powered tools have emerged as a game-changer in this domain, offering a more efficient and effective way to manage and organize knowledge. Efficiency Amplified: AI streamlines the organization and analysis of vast data sets, saving time and reducing manual effort. Insights Unearthed: Uncover hidden patterns, trends, and valuable insights within your data, providing a deeper understanding of your information. Personalized Experience: Tailor your knowledge management approach with AI, creating a personalized digital assistant that adapts to your unique needs. Stay Ahead in the Digital Era: Embrace the transformative power of AI to navigate the information overload and stay ahead in our rapidly evolving digital landscape. Here are 10 AI-powered tools for personal knowledge management with their product links: 1. MyMemo AI: - Introduction: MyMemo transforms personal data into wisdom using AI, offering features like targeted search, smart advice, and creative writing prompts. - Product Link: [MyMemo Website](https://www.mymemo.ai) - Features: - Collects digital knowledge from various sources into a single platform. - Processes collected information with AI to extract key insights. - Allows users to query MyMemoAI for specific info or insights from their knowledge base. - Offers targeted search, smart advice, and creative writing prompts for enhanced knowledge management. 2. Notion AI: - Introduction: Notion AI offers a customizable workspace for efficient knowledge sharing and management. - Product Link: [Notion AI Website](https://www.notion.so) - Features: - Customizable workspace for knowledge sharing. - Integration with various tools like Slack, Google Drive, and Microsoft Teams. - Robust search capabilities powered by AI and AI-based analytics. 3. ClickUp: - Introduction: ClickUp provides dedicated spaces for knowledge base organization and seamless integration with various tools. - Product Link: [ClickUp Website](https://clickup.com) - Features: - Dedicated spaces for Knowledge Base organization. - Integration with third-party software like Microsoft Teams, Jira, Slack, Zoho, and more. - AI-based analytics to track productivity and identify patterns. 4. MyMind: - Introduction: MyMind offers a private space to save notes, images, quotes, and highlights enhanced by AI to aid in memory recall without the need for manual categorization. - Product Link: [MyMind Website](https://www.mymind.com) - Features: - Private space for saving notes, images, quotes, and highlights. - Enhanced by AI for efficient memory recall without manual organization. - Tailored for designers, writers, researchers, developers, and visual minds of all kinds. Adding Mem.ai to the top 10 list of AI-powered tools for personal kn",
3044
- image: "https://framerusercontent.com/images/xtRTZ9zRVH3uL1fvH2vqA6G60W8.png",
3045
- favicon: "https://framerusercontent.com/images/XEQTxAwueP1wc7BpbB1zrouiuoA.png"
3046
- },
3047
- {
3048
- id: "https://mymemo.ai/",
3049
- title: "MyMemo-Empower Your Mind with AI",
3050
- url: "https://mymemo.ai/",
3051
- publishedDate: "2025-05-21T17:17:02.000Z",
3052
- author: "",
3053
- score: 0.3810442090034485,
3054
- text: "End Digital Chaos with All In One Digital Space Effortlessly Access Information with AI Chat What have I uploaded about the marketing strategy? How to raise fund as a founder for startup\uFF1F Write an article about the impact of AI in our society. Compliance with Global Standards MyMemo AI adheres to international data protection regulations, ensuring your data is handled with the utmost care. Secure Storage Your data is encrypted and stored on our high-security servers, ensuring that only you have access. We maintain strict privacy protocols, and even our team cannot view your information. Private Links for Your Memos MyMemo AI ensures that all links generated for your uploaded content are private and exclusively visible to you.\xA0 100 AI chat per month 100 content uploads per month 5 memo collections Powered by GPT-4o mini Up to 5 Related Memo in AI chat Single PDF file size under 5MB 10 AI writing for notes in total AI chat unlimited 1000 content uploads per month 100 Memo Collections Supports multiple AI models Up to 5 Related Memo in AI chat Single PDF file size under 30MB 100 AI writing for notes per month Custom AI summary prompt(coming soon) AI chat unlimited Unlimited content uploads Unlimited memo collections Supports multiple AI models Up to 8 Related Memo in AI chat Single PDF file size under 50MB Unlimited AI writing for notes Custom AI summary prompt(coming soon) Free access to @GPT-4o in Chat We\u2019re excited to\xA0partner with Inkwise\xA0to bring MyMemo users an exclusive deal! Inkwise.ai is an AI-powered platform that helps users craft professional documents by extracting and integrating key information from uploaded files. It offers industry-specific templates, intelligent content extraction, and a referencing system that ensures factual accuracy. Exclusive for MyMemo Users: Get\xA0 2 months of Inkwise Pro for free \xA0with the code\xA0 INKWISE2025 \xA0at checkout! MyMemo \xA9 MyMemo 2025. All rights reserved",
3055
- image: "https://framerusercontent.com/images/xtRTZ9zRVH3uL1fvH2vqA6G60W8.png",
3056
- favicon: "https://framerusercontent.com/images/XEQTxAwueP1wc7BpbB1zrouiuoA.png"
3057
- },
3058
- {
3059
- id: "https://www.personal.ai/memory",
3060
- title: "Make Your Own AI with Your Unique Memory",
3061
- url: "https://www.personal.ai/memory",
3062
- publishedDate: "2024-01-01T00:00:00.000Z",
3063
- author: "",
3064
- score: 0.3991696536540985,
3065
- text: "In Personal AI, version control for memory and model is managed through a systematic approach that allows users to track, manage, and revert changes made to the AI's memory and model. \u200D Memory Stack: When you store a memory in Personal AI, it goes into the memory stack for training the AI. \u200D Data Uploads: Users can add, edit, or reinforce memories by uploading authored data directly into their personal language model. \u200D The personal language model has unlimited memory and is not bound by token or context limitations. The AI's performance is as good as the memory provided to it. If it makes false statements, the memory needs to be fixed and reinforced for future learning. There will be mechanisms to download the memory and model in the future. The output of the personal AI model is entirely controlled by the user's input and training. Yes, you can automate conversations using stacked memories in your Personal AI. By leveraging the memory stacking feature, you can train your AI to recall and utilize specific information during interactions \u200D Practices for Automating Conversations: Memory Anchors: When stacking new memories, consider adding memory anchors to organize the information effectively. This practice helps structure and categorize the data within your Personal AI account. Variety of Sources: Utilize all available tools such as the chat box, document editor, file uploader, and URL uploader to stack data from various sources. This diverse input enables your AI to learn from a wide range of inputs for a more personalized experience. \u200D Application of Practices: To automate conversations effectively, ensure that you consistently add relevant information into your memory stack using different tools provided by Personal AI. By doing so, you enable your AI to access and utilize this knowledge when engaging in digital interactions on your behalf. Yes, you can absolutely use hashtags to label and recall specific memories later on with your Personal AI. When adding memories to your AI, it's beneficial to include detailed and descriptive information about the topic or subject, along with context such as people, location, and absolute time for the AI to reference. Using hashtags allows you to categorize and organize these memories effectively. By using proper placement of hashtags without spaces and maintaining uniform capitalization, you can enhance the selection of memories for generating answers. Additionally, when stacking content using the chat box or file/document uploader in Personal AI, you can utilize #hashtags for single words or :colons followed by keywords for multiple words or complete titles. This practice helps in refining the selection of memories for generating answers while ensuring effective organization and retrieval of data. Personal AI is built with a strong emphasis on data privacy and security. It operates under the principle that the data you provide is yours alone. Measures such as encryption, secure data storage, and the optio",
3066
- image: "https://cdn.prod.website-files.com/5ff65c460ce39f5ec5681c6a/663d12aab1b425e1ad40d3a6_Memory-min.jpg",
3067
- favicon: "https://cdn.prod.website-files.com/5ff65c460ce39f5ec5681c6a/5ffcbe4a31309a2dcf7d1f18_Human%20AI%20Icon%2032x32-bolder.png"
3068
- },
3069
- {
3070
- id: "https://iki.ai/",
3071
- title: "IKI AI \u2013 Intelligent Knowledge Interface",
3072
- url: "https://iki.ai/",
3073
- publishedDate: "2025-04-10T16:28:59.000Z",
3074
- author: "",
3075
- score: 0.38676750659942627,
3076
- text: "Think faster. Organize deeper. All in one place. An AI-native workspace for\xA0research, strategy, and creative work An AI-native workspace for\xA0research, strategy, and creative work Backed by 500 Global Backed by 500 Global Backed by 500 Global Capture anything. Build your thinking library. Capture anything. Build your thinking library. Capture anything. Build your thinking library. AI assistant Turn long reads into clear insights. IKI summarizes, highlights, and connects the dots. AI assistant Turn long reads into clear insights. IKI summarizes, highlights, and connects the dots. AI assistant Turn long reads into clear insights. IKI summarizes, highlights, and connects the dots. AI editor AI writing with real context. Grounded in your content, not the internet. AI editor AI writing with real context. Grounded in your content, not the internet. AI editor AI writing with real context. Grounded in your content, not the internet. Team spaces Your team\u2019s shared brain. One space for knowledge, context, and decisions. Team spaces Your team\u2019s shared brain. One space for knowledge, context, and decisions. Team spaces Your team\u2019s shared brain. One space for knowledge, context, and decisions. Everything you need for smarter knowledge work AI Editor Ask IKI AI \uF890 Heading 1 B U I \uF107 \uF107 \uF0C1 Browser extension Download extension to save webpages in one click along with notes Author Spotify Design Youtube \xB7 3 min read Designing Data Science Tools at Spotify: Part 2 AI Summury Methods based on the relational path have shown strong, interpretable, and transferable reasoning ability. However, paths are naturally limited in capturing local evidence in graphs...Methods based on the relational path have shown strong, interpretable LLMs powered by top-tier models you trust \uE03E Multi-source insights with agent context AI Digest Everything you need for smarter knowledge work AI Editor Ask IKI AI \uF890 Heading 1 B U I \uF107 \uF107 \uF0C1 Browser extension Download extension to save webpages in one click along with notes Author Spotify Design Youtube \xB7 3 min read Designing Data Science Tools at Spotify: Part 2 AI Summury Methods based on the relational path have shown strong, interpretable, and transferable reasoning ability. However, paths are naturally limited in capturing local evidence in graphs...Methods based on the relational path have shown strong, interpretable LLMs powered by top-tier models you trust \uE03E Multi-source insights with agent context AI Digest Everything you need for smarter knowledge work AI Editor Ask IKI AI \uF890 Heading 1 B U I \uF107 \uF107 \uF0C1 Browser extension Download extension to save webpages in one click along with notes Author Spotify Design Youtube \xB7 3 min read Designing Data Science Tools at Spotify: Part 2 AI Summury Methods based on the relational path have shown strong, interpretable, and transferable reasoning ability. However, paths are naturally limited in capturing local evidence in graphs...Methods based on the relational path have shown strong, interpretable LLMs powered by",
3077
- image: "https://framerusercontent.com/assets/cI6Uo7x4q0W3uxzOt2preXjv6aE.jpg",
3078
- favicon: "https://framerusercontent.com/images/5NLFiJq5bLl5FXOTcVQX8vhkU.png"
3079
- },
3080
- {
3081
- id: "https://supermemory.ai/",
3082
- title: "supermemory\u2122",
3083
- url: "https://supermemory.ai/",
3084
- publishedDate: "2025-01-01T00:00:00.000Z",
3085
- author: "",
3086
- score: 0.393942266702652,
3087
- text: `The universal memory API for the AI era Stop building retrieval from scratch. Personalise LLMs for your users. Built for developers who ship. Start building DOCS Context is everything Without it, even the smartest AI is just an expensive chatbot $ init vector_database Way too expensive. Time to switch. Painfully slow. Let's try another. Won't scale. Back to square one. Maintenance nightmare. Need alternatives. $ choose embedding_model Which model fits your use case? Confusing performance tradeoffs Can't keep up with new releases $ handle format_parsing Markdown: Tables break everything HTML: Scripts and styles interfere PDF: Layout ruins extraction Word docs: Unpredictable formatting $ calculate scaling_costs Costs explode at production scale Performance degrades as data grows Engineering hours pile up fast $ setup connection_sync Sync failures between data sources API rate limits during large syncs Images: Need vision models now? Audio/Video: Transcription costs soar $ init multimodal_support Websites: JS &amp; rate limits are messy PDFs: OCR fails, extraction inconsistent Authentication tokens expire constantly $ init vector_database Way too expensive. Time to switch. Painfully slow. Let's try another. Won't scale. Back to square one. Maintenance nightmare. Need alternatives. $ choose embedding_model Which model fits your use case? Confusing performance tradeoffs Can't keep up with new releases $ handle format_parsing Markdown: Tables break everything HTML: Scripts and styles interfere PDF: Layout ruins extraction Word docs: Unpredictable formatting $ calculate scaling_costs Costs explode at production scale Performance degrades as data grows Engineering hours pile up fast $ setup connection_sync Sync failures between data sources API rate limits during large syncs Images: Need vision models now? Audio/Video: Transcription costs soar $ init multimodal_support Websites: JS &amp; rate limits are messy PDFs: OCR fails, extraction inconsistent Authentication tokens expire constantly FEATURES\xA0\xA0\u2022\xA0\xA0FEATURES\xA0\xA0\u2022 \xA0FEATURES Unlock the Full Potential of Your Data const response = await fetch( 'https://api.supermemory.ai/v3/memories', {
3088
- method: 'POST',
3089
- headers: {
3090
- 'Authorization': 'Bearer sm_ywdhjSbiDLkLIjjVotSegR_rsq3ZZKNRJmVr12p4ItTcf'
3091
- },
3092
- body: JSON.stringify({
3093
- content: 'My name is Shreyans.',
3094
- // or https://example.com
3095
- // or https://example.com/page.pdf
3096
- metadata: {
3097
- user_id: '123'
3098
- }
3099
- }),
3100
- })
3101
- const data = await response.json() const response = await fetch( 'https://api.supermemory.ai/v3/memories', {
3102
- method: 'GET',
3103
- headers: {
3104
- 'Authorization': 'Bearer sm_ywdhjSbiDLkLIjjVotSegR_rsq3ZZKNRJmVr12p4ItTcf',
3105
- },
3106
- body: JSON.stringify({
3107
- q: "What's my name?"
3108
- })
3109
- })
3110
- const data = await response.json() const response = await fetch( 'https://api.supermemory.ai/v3/connections/onedrive', {
3111
- method: 'POST',
3112
- headers: {
3113
- 'Authorization': 'Bearer sm_ywdhjSbiDLkLIjjVotSegR_rsq3ZZKNRJmVr12p4ItTcf',
3114
- }
3115
- });
3116
- const data = await response.json(); solution\xA0 \u2022 \xA0sol`,
3117
- image: "https://cdn.prod.website-files.com/6826235ef861ed9464b064c8/6826251d65991babe21a9a9a_Frame%2031.png",
3118
- favicon: "https://cdn.prod.website-files.com/6826235ef861ed9464b064c8/682639813def380d7694f590_favicon.png"
3119
- },
3120
- {
3121
- id: "https://mykin.ai/",
3122
- title: "Kin - Private, and Emotionally Intelligent, Personal AI",
3123
- url: "https://mykin.ai/",
3124
- publishedDate: "2025-05-26T00:00:00.000Z",
3125
- author: "",
3126
- score: 0.38142070174217224,
3127
- text: "Clarity and confidence. Always on hand. Kin is a new kind of personal AI companion, more emotionally intelligent and private than ever. For whatever life throws at you. Available on iPhone and Android Anytime. Anywhere. Life at work is becoming increasingly challenging to navigate Think with Kin Personalized coaching can be inaccessible and expensive Talk with Kin How can Kin help? Inspiration \u201CWhenever I need fresh ideas or just a soundboard, I know I can quickly turn to Kin.\u201D Inspiration \u201CWhenever I need fresh ideas or just a soundboard, I know I can quickly turn to Kin.\u201D Planning \u201CI use Kin to think things through, set goals, and organize my time.\u201D Planning \u201CI use Kin to think things through, set goals, and organize my time.\u201D Learning \u201CI can learn about almost any topic, with structured lessons created in seconds.\u201D Learning \u201CI can learn about almost any topic, with structured lessons created in seconds.\u201D Support \u201CKin helps me with everything from small tasks to processing ideas and emotions.\u201D Support \u201CKin helps me with everything from small tasks to processing ideas and emotions.\u201D Guidance \u201CI\u2019m more aware of my strengths and I feel better prepared for tricky conversations.\u201D Guidance \u201CI\u2019m more aware of my strengths and I feel better prepared for tricky conversations.\u201D Kin remembers, so you don\u2019t have to. The more you interact with Kin, the more Kin learns about you and your life. Because Kin understands both the big picture and its complexities, it can provide genuinely meaningful support in your day-to-day. Learn more Private &amp; Secure Kin encrypts and stores your data securely on you device. No one else can see or access it. Powerful features. Scandinavian design. Smart journaling Share your thoughts and notes to reflect and build a better Kin. Coming soon Powered by open source models Coming soon Semantic and Episodic memory Coming soon Private, encrypted local-first storage Coming soon Intelligent reminders Stay on top of what matters with timely reminders. Coming soon Conversational voice chat Coming soon Third party integration Connect your Kin to the apps you love like Google calendar. Coming soon Proudly made in Copenhagen, Denmark Get started with simple tutorials and big ideas Frequently asked questions Product How does Kin's memory work? Kin\u2019s memory pulls information from your messages into a database on your device so it can always reference it. Kin\u2019s memory is automatic, so in practice, it works just by you talking with Kin. General More than anyone else. Every word you share and every reply is stored locally on your device - unless you change your settings to allow otherwise. You have full control over deleting it at any time. General Do I need a subscription to use Kin? No - Kin is currently free and without message limits for our beta users. However, we\u2019re expecting to transition to a subscription model once we hit full release - we\u2019ll make sure to talk a lot about that before it happens, though. Product Can I use Kin on a d",
3128
- image: "https://cdn.prod.website-files.com/67b8fb50931278cabb866969/67d2a6c56ee313becd0f482d_img-opengraph.jpg",
3129
- favicon: "https://cdn.prod.website-files.com/67b8fb50931278cabb866969/67c0cfc2c45ca5db9ca5c9e4_favicon.png"
3130
- },
3131
- {
3132
- id: "https://try.rememberizer.ai/blog/introducing-rememberizer-connect-knowledge-to-your-ai",
3133
- title: "Introducing Rememberizer - Connect Knowledge To Your AI",
3134
- url: "https://try.rememberizer.ai/blog/introducing-rememberizer-connect-knowledge-to-your-ai",
3135
- publishedDate: "2024-01-28T00:00:00.000Z",
3136
- author: "",
3137
- score: 0.38043755292892456,
3138
- text: "Introduction In the rapidly evolving world of artificial intelligence (AI), Rememberizer emerges as a revolutionary platform that profoundly changes how both developers and personal consumers interact with AI, especially Generative Pre-trained Transformers (GPT). This platform is not just another tool; it's a transformative solution, making AI interactions deeply personal, intuitive, and efficient. Let\u2019s dive into how Rememberizer is redefining AI personalization and integration, offering unique experiences for a diverse range of users, free. \u200D Part 1: Rememberizer for Personal Consumers \u200D Why Rememberizer Matters for Personal Users Generative AI apps work better when they have access to background information. They need to know what you know. A great way to achieve that is to give them access to relevant content from the documents, data and discussions you create and use. This is what Rememberizer does. Rememberizer helps by seamlessly integrating personal data with AI applications. For OpenAI GPTs users, this means transforming your interactions with AI into something deeply personal and relevant. By indexing your data just once, Rememberizer avoids wasting time performing the same process over and over again. \u200D Empowering Personal AI Experiences Whether you\u2019re engaging in creative projects, professional tasks, or simply exploring AI for personal curiosity, Rememberizer brings a unique value proposition. It transforms your data into a powerful AI collaborator, ensuring your interactions are tailored to your specific circumstances. Imagine an AI that feels intuitively designed for you, understanding your projects, circumstances and recent discussions. That\u2019s the personalized AI experience Rememberizer delivers. Part 2: Rememberizer for Developers Revolutionizing AI Integration in App Development For developers, Rememberizer is a game-changer. It simplifies the integration of user data into AI applications, enhancing app functionality and user experience. Rememberizer connects directly to various data sources including Slack and Google Drive, embedding their contents semantic meaning into a vector database. This process not only elevates the AI capabilities of your app but also saves vast amounts GPU processing costs and engineering resources in backend development: it\u2019s free! The Developer's Advantage with Rememberizer Streamlined Data Integration: Rememberizer takes care of the complex process of integrating data sources into a vector database, allowing developers to focus more on creative aspects of app development. Enhanced AI Capabilities: By leveraging Rememberizer, apps gain access to rich, personalized data, leading to more intuitive and context-aware AI interactions. Personalization and Continuous Adaptation: Apps powered by Rememberizer can offer unparalleled personalization, learning, and adapting based on the user's data, thereby improving over time. Part 3: Pricing and Accessibility for All Rememberizer is committed to democratizing ",
3139
- image: "https://cdn.prod.website-files.com/656fc35f7b92e991c863ce0a/65b7523200497f3ac6391238_Rememberizer%20banner.png",
3140
- favicon: "https://cdn.prod.website-files.com/656fc35f7b92e991c863cdc4/657acdfb9a0ba55d8f622765_Favicon.png"
3141
- },
3142
- {
3143
- id: "https://twinmind.com/",
3144
- title: "TwinMind",
3145
- url: "https://twinmind.com/",
3146
- publishedDate: "2025-05-23T09:12:49.000Z",
3147
- author: "",
3148
- score: 0.38130462169647217,
3149
- text: "\n Never Forget Anything with Your Never Forget Anything with Your Never Forget Anything with Your Second Brain Memory Vault Life Copilot AI Notetaker Second Brain Second Brain Memory Vault Life Copilot AI Notetaker Second Brain Second Brain Memory Vault Life Copilot AI Notetaker Second Brain Get perfect notes, to-dos, and proactive answers during meetings, lectures, interviews, and conversations. Get perfect notes, to-dos, and proactive answers during meetings, lectures, interviews, and conversations. Watch Demo Watch Demo Watch Demo Featured in Featured in Trusted by users at Trusted by users at Capture any moment, even inside your pocket Capture any moment, even inside your pocket Transcribe everything. Forget nothing. Ask anything. Transcribe everything. Forget nothing. Ask anything. Transcribe everything. Forget nothing. Ask anything. Seamlessly switch from mobile to desktop Seamlessly switch from mobile to desktop With TwinMind for Chrome, transcribe video calls or chat with tabs,\xA0PDFs, Youtube\xA0videos, and automate your work. With the TwinMind Chrome sidebar, transcribe video calls or chat with websites,\xA0PDFs, Youtube\xA0videos, and all your memories. Works with all the products you love Works with all the products you love Ask anything with context from all your favorite websites and insert answers directly into them on Chrome. Ask anything with context from all your favorite websites and insert answers directly into them on Chrome. Transcribe video calls or capture context from all your favorite websites, and insert answers into them on Chrome browser. Get Proactive Answers Get Proactive Answers Get personalized suggestions, prepare for meetings or exams based on all your notes synced with your calendar. Get personalized suggestions, prepare for meetings or exams based on all your notes synced with your calendar. Unlock Perfect Memory Unlock Perfect Memory Your brain forgets 90% of memories in 7 days but TwinMind doesn\u2019t. Ask TwinMind anything with Deep Memory Search. Your brain forgets 90% of memories in 7 days but TwinMind doesn\u2019t. Ask TwinMind anything with Deep Memory Search. Summarize all my meetings Ask TwinMind Summarize all my meetings Ask TwinMind Summarize all my meetings Ask TwinMind Insert Insert Insert Automate Your Work Automate Your Work Generate follow-up emails, reports, assignments based on memories. Insert anywhere on your browser in one click. Generate follow-up emails, reports, assignments based on memories. Insert anywhere on your browser in one click. 100% privacy with offline mode 100% privacy with offline mode 100% privacy with offline mode Transcribes without recording TwinMind processes your audio on-the-fly in real-time and saves only the transcripts on-device, ensuring that your audio is never stored anywhere. Transcribes without recording TwinMind processes your audio on-the-fly in real-time and saves only the transcripts on-device, ensuring that your audio is never stored anywhere. Transcribes without recording ",
3150
- image: "https://framerusercontent.com/assets/9u5tx2lerz0ndBVcB14sg4tNoKs.png",
3151
- favicon: "https://framerusercontent.com/images/zDX0zsHZ6Z2PvwK2vmkOsISWBiY.svg"
3152
- }
3153
- ],
3154
- costDollars: {
3155
- total: 0.015,
3156
- search: {
3157
- neural: 5e-3
3158
- },
3159
- contents: {
3160
- text: 0.01
3161
- }
3162
- }
3163
- };
3164
-
3165
- // src/functions/exa/data/exa-search-1748337331526.ts
3166
- var exa_search_1748337331526_default = {
3167
- requestId: "0dc12e344fa649884456960ca1a54954",
3168
- autopromptString: "PKM software artificial intelligence integration open source projects",
3169
- resolvedSearchType: "neural",
3170
- results: [
3171
- {
3172
- id: "https://github.com/subspace-ai/subspace",
3173
- title: "GitHub - subspace-ai/subspace: PKM + REPL + AI",
3174
- url: "https://github.com/subspace-ai/subspace",
3175
- publishedDate: "2023-03-23T16:02:40.000Z",
3176
- author: "subspace-ai",
3177
- score: 0.7530648708343506,
3178
- text: "subspace.ai - PKM + REPL + AI \n The long-term goal of subspace is to be/have three things: \n \n PKM (Personal Knowledge Management system) like Roam Research or Tana. \n REPL-like (Read Evaluate Print Loop) capabilities. Should be able to execute individual code cells in the JVM backend and rendered in the frontend with Electric. Similar behaviour can be achieved with other languages via Jupyter kernels (or GraalVM Polyglot) and JavaScript. \n AI (Artificial Intelligence) integrations. Should be integrated with LLMs - e.g. write GPT queries in subspace, and incorporate the response to your personal knowledge base as a new node. Intelligent search and LLM-based summaries and reasoning over the existing knowledge base (Retrieval Oriented Generation, RAG). \n \n The overall design should be open-ended, allowing for easy forking and providing custom node types / rendering functions. The goal is not to be just a storage of information, but a control panel for commonly used workflows. So that you can create convenient shortcuts and informative output views with Clojure + Electric. Since you persist which actions you took over time, you can search for past outputs and interleave these with your personal notes. Later query your knowledge base with RAG in natural language, or query it with GPT by exposing subspace knowledge base as an API to GPT. \n For example, additional customizations and use cases could be: \n \n Intelligent work log for day to day coding. \n Wrappers for any babashka / shell scripts you already have. \n Wrapper functions to MLOps platform (or some other task manager) to trigger jobs, query stats and logs from past train runs. Build dashboards as subspace nodes from the result of such queries with Electric+HTML. \n Wrappers for common Kubernetes / AWS / GCP commands. Build ad hoc UIs on top of your cluster that make sense to you. \n Wrappers that pull the contents of arxiv documents as subspace nodes. \n Spaced repetition learning of content (of nodes which you mark to be remembered). \n \n UI/UX \n There will be two types of UI elements: pages and nodes. Pages contain nodes, and nodes can nest other nodes. Both pages and nodes are referencable (meaning you can link to them and the page/node will get a backreference). \n Each node contains some media, and possibly subnodes. \n Media can be: \n \n Text, numeric, Markdown \n Image, video, audio \n Flexible spreadsheet tesserrae \n code block, which can be executed in a jupyter kernel (runs once) \n code block containing an e/fn (runs continuously when on the page) \n \n Executing an e/fn is the most powerful and flexible thing to do. It can pull data in from other nodes on the page or in the graph, and displays its own little UI within its boundaries. Crucially, when upstream info changes, your e/fn's output gets recomputed. Running tesserrae is also very powerful; you can think of subspace as a non-grid tesserae that can also embed tesserae. \n Subnodes can be organised either by indenting or tiling. \n \n Indente",
3179
- image: "https://opengraph.githubassets.com/734547dbba15cefe41b9ad9cd97ba2ac489aeebd18945d54dbf7b1931b5ed980/subspace-ai/subspace",
3180
- favicon: "https://github.com/fluidicon.png"
3181
- },
3182
- {
3183
- id: "https://github.com/khoj-ai/khoj",
3184
- title: "GitHub - khoj-ai/khoj: Your AI second brain. Self-hostable. Get answers from the web or your docs. Build custom agents, schedule automations, do deep research. Turn any online or local LLM into your personal, autonomous AI (gpt, claude, gemini, llama, qwen, mistral). Get started - free.",
3185
- url: "https://github.com/khoj-ai/khoj",
3186
- publishedDate: "2021-08-16T01:48:44.000Z",
3187
- author: "khoj-ai",
3188
- score: 0.33666935563087463,
3189
- text: "\n \n \n \n \n Your AI second brain \n \n \n \n \u{1F381} New \n \n Start any message with /research to try out the experimental research mode with Khoj. \n Anyone can now create custom agents with tunable personality, tools and knowledge bases. \n Read about Khoj's excellent performance on modern retrieval and reasoning benchmarks. \n \n \n Overview \n Khoj is a personal AI app to extend your capabilities. It smoothly scales up from an on-device personal AI to a cloud-scale enterprise AI. \n \n Chat with any local or online LLM (e.g llama3, qwen, gemma, mistral, gpt, claude, gemini, deepseek). \n Get answers from the internet and your docs (including image, pdf, markdown, org-mode, word, notion files). \n Access it from your Browser, Obsidian, Emacs, Desktop, Phone or Whatsapp. \n Create agents with custom knowledge, persona, chat model and tools to take on any role. \n Automate away repetitive research. Get personal newsletters and smart notifications delivered to your inbox. \n Find relevant docs quickly and easily using our advanced semantic search. \n Generate images, talk out loud, play your messages. \n Khoj is open-source, self-hostable. Always. \n Run it privately on your computer or try it on our cloud app. \n \n \n See it in action \n \n Go to https://app.khoj.dev to see Khoj live. \n Full feature list \n You can see the full feature list here. \n Self-Host \n To get started with self-hosting Khoj, read the docs. \n Enterprise \n Khoj is available as a cloud service, on-premises, or as a hybrid solution. To learn more about Khoj Enterprise, visit our website. \n Frequently Asked Questions (FAQ) \n Q: Can I use Khoj without self-hosting? \n Yes! You can use Khoj right away at https://app.khoj.dev \u2014 no setup required. \n Q: What kinds of documents can Khoj read? \n Khoj supports a wide variety: PDFs, Markdown, Notion, Word docs, org-mode files, and more. \n Q: How can I make my own agent? \n Check out this blog post for a step-by-step guide to custom agents.\nFor more questions, head over to our Discord! \n Contributors \n Cheers to our awesome contributors! \u{1F389} \n \n \n Made with contrib.rocks. \n Interested in Contributing? \n Khoj is open source. It is sustained by the community and we\u2019d love for you to join it! Whether you\u2019re a coder, designer, writer, or enthusiast, there\u2019s a place for you. \n Why Contribute? \n \n Make an Impact: Help build, test and improve a tool used by thousands to boost productivity. \n Learn &amp; Grow: Work on cutting-edge AI, LLMs, and semantic search technologies. \n \n You can help us build new features, improve the project documentation, report issues and fix bugs. If you're a developer, please see our Contributing Guidelines and check out good first issues to work on. \n",
3190
- image: "https://repository-images.githubusercontent.com/396569538/533a8bf7-385f-427b-a03f-76795fd938ed",
3191
- favicon: "https://github.com/fluidicon.png"
3192
- },
3193
- {
3194
- id: "https://github.com/paulbricman/conceptarium",
3195
- title: "GitHub - paulbricman/conceptarium: A fluid medium for storing, relating, and surfacing thoughts.",
3196
- url: "https://github.com/paulbricman/conceptarium",
3197
- publishedDate: "2021-08-12T04:45:29.000Z",
3198
- author: "paulbricman",
3199
- score: 0.3376504182815552,
3200
- text: "\n \u{1F4A1} Conceptarium \n The conceptarium is an experimental personal knowledge base designed to weave AI capabilities into knowledge work. Its main features include: \n \n powerful multi-modal search across ideas \n sharing microverses of knowledge with peers \n ranking items by Anki-like activation, so as to promote serendipity \n \n Installation \n Docker \n After installing docker and docker-compose, run: \n # install with:\ncurl -fsS https://raw.githubusercontent.com/paulbricman/conceptarium/main/docker-compose.yml -o docker-compose.yml\nmkdir knowledge\ndocker-compose up -d\n# stop with:\ndocker-compose stop\n# update with:\ndocker-compose stop\ndocker-compose rm -f\ndocker-compose pull\ndocker-compose up -d\n \n Note that you'll have to wait a bit initially for the models to be downloaded in the docker container. Use docker logs &lt;backend container ID&gt; or watch the process's memory for feedback on that. Or just try using it until it via the API or UI until it works (see usage). \n Source \n After pulling this repo run: \n python3 -m pip install -r frontend/requirements.txt\npython3 -m pip install -r backend/requirements.txt\nstreamlit run frontend/main.py\n# in a separate session:\ncd backend\npython3 -m uvicorn main:app --reload\n# update by pulling from repo again\n \n Missing dependencies? Please have a look at frontend/Dockerfile and backend/Dockerfile. ARM architecture (e.g. Raspberry Pi)? Remove the torch entries from requirements.txt, and install a custom-built version. \n Usage \n The web app should then be available at localhost:8501, while the API at localhost:8000 (with docs at localhost:8000/docs). The backend component takes a few minutes to get the ML models at first. \n To access your local instance, enter the conceptarium URL (i.e. localhost:8000 if you ran from source, backend.docker:8000 if you used docker), and your desired token. Remember your token, as you'll have to use it to authenticate in future sessions. \n",
3201
- image: "https://opengraph.githubassets.com/2b454d3e4b9d69c65d465d8ec6609b3b61f34b83f1f8eece471806be32e710bc/paulbricman/conceptarium",
3202
- favicon: "https://github.com/fluidicon.png"
3203
- },
3204
- {
3205
- id: "https://github.com/mfakih/Pomegranate-PKM",
3206
- title: "GitHub - mfakih/Pomegranate-PKM: Pomegranate PKM is a new open source web-based cross-platform work and knowledge management application for productive and prolific people. PKM features text-based commands for adding, updating and searching records, thus providing powerful tools to manage information. It also allows the user to build up the navigation menu using saved searches.",
3207
- url: "https://github.com/mfakih/Pomegranate-PKM",
3208
- publishedDate: "2014-03-17T06:28:12.000Z",
3209
- author: "mfakih",
3210
- score: 0.7761150002479553,
3211
- text: "Pomegranate-PKM \n Pomegranate PKM is a new open source web-based cross-platform work and knowledge management application for productive and prolific people. \n PKM features text-based commands for adding, updating and searching records, thus providing powerful tools to manage information. It also allows the user to build up the navigation menu using saved searches. \n \n Pomegranate PKM manages: \n \n Goals, tasks, and plans \n Journal and indicators \n Writings and notes \n Resources (books, articles, news, presentations, audiobooks, documentaries, movies etc),and book excerpts, mainly book chapters. \n Documents e.g. Word documents, Excels \n People \n \n In technical terms, Pomegranate PKM is a combination of: \n \n Document management system \n Content management system \n Research index cards and reference management \n Bug tracking systems, applied for the software development and self development \n Lightweight project management \n Powerful task management \n Time tracking \n Blog (e.g. WordPress) client \n \n My in-progress book at LeanPub outlines the motivations, design principles and the features of Pomegranate PKM. \n",
3212
- image: "https://opengraph.githubassets.com/d4afbe16f55b89cbdd3344472df483147de49f6a8a136bd1da7af7e568c16908/mfakih/Pomegranate-PKM",
3213
- favicon: "https://github.com/fluidicon.png"
3214
- },
3215
- {
3216
- id: "https://github.com/mfakih294/Nibras-PKM",
3217
- title: "GitHub - mfakih294/Nibras-PKM: A web-based self-hosted open-source system for the long-term management of personal information. It targets the needs of advanced users with serious information management needs. It is accompanied with an Android application that syncs the bookmarked records over local Wifi network.",
3218
- url: "https://github.com/mfakih294/Nibras-PKM",
3219
- publishedDate: "2019-09-14T02:05:28.000Z",
3220
- author: "mfakih294",
3221
- score: 0.7633954882621765,
3222
- text: "Nibras PKM \n Nibras PKM is a web-based self-hosted open source system for\nthe long-term management of personal information.\nIt is a combination of a web-based application\nintended for desktop use and where all the records are entered,\nand an Android mobile reader application. \n \n Local \n The user has full control over his/her data, without the need for a (fast) internet connection, and without all the distractions and information overload that the internet can cause. \n Open source \n The user has control over the system itself too, especially when using it on the long term to manage the important personal information and files. \n Comprehensize \n It manages resources (articles, books, documents), notes, writings, tasks, goals, journal, planner, payments, indicators, and (study) courses and departments. \n Powerful \n It was designed with large amounts of information in mind. In current usage, it manages dozens of thousands of records. With its commands and saved searches, it makes easy to navigate through all the information. \n Main Features \n \n Flexible text-based commands to add, update and search records, which provides powerful ways to manage information. \n Saved searches to save searches for later use. \n Ability to display records on calendars and Kanban boards. \n Full-text search of all record fields. \n Simple file system integration so to greatly reduce the need to organize files manually. \n \n Documentation \n User's guide is available online at https://mfakih294.github.io/Nibras-PKM/. \n Releases \n Nibras PKM is hosted on GitHub https://github.com/mfakih294/Nibras-PKM. \n Quick start guide \n Running Nibras requires three simple steps: \n \n Download the bundle file corresponding to your platform, e.g. nibras-bundle-windows.zip from the releases page on Github. \n Extract the zipped file to a location of your choice on your local disk. \n Launch Nibras by double clicking on ./scripts/start file. \n \n Once Nibras has finished launching, a message like the one below will appear. \n * Nibras has launched. You can access it from: * \n * https://localhost:1441/ * \n Go to https://localhost:1441/ using Firefox or Chrome. On the login page, enter nibras for username and nibras for the password. \n Notes: \n \n As it has a self-signed certificate, you need to accept and bypass the security warning that shows up at the beginning. \n On Linux, you need to make the files inside ./scripts and ./tomcat/bin folders executable (chmod +x *). \n To stop Nibras, you can close this window, or press ctrl+c in it, or run ./scripts/stop script. \n \n Technical details \n \n Nibras is developed in Grails framework 3.3.10, a dynamic framework on top of the Java platform. \n Grails applications run on any platform that can run Java 8 and later, so practically all platforms, including Windows, Linux, Mac. \n For production use, Nibras uses MySQL 5+ for its database, and the file system to store the files of the records. To testing and demonstration, it can run with h2 database, with zero ex",
3223
- image: "https://opengraph.githubassets.com/5e45c614cd8441100a4acd0e48d8b9c15984b51e816d4d4683436dd3be25c813/mfakih294/Nibras-PKM",
3224
- favicon: "https://github.com/fluidicon.png"
3225
- },
3226
- {
3227
- id: "https://github.com/reorproject/reor",
3228
- title: "GitHub - reorproject/reor: Private & local AI personal knowledge management app for high entropy people.",
3229
- url: "https://github.com/reorproject/reor",
3230
- publishedDate: "2023-11-27T01:30:44.000Z",
3231
- author: "reorproject",
3232
- text: `Reor Project
3233
-
3234
- Private &amp; local AI personal knowledge management app.
3235
-
3236
-
3237
-
3238
-
3239
-
3240
-
3241
- \u{1F4E2} Announcement
3242
- We are now on Discord! Our team is shipping very quickly right now so sharing \u2764\uFE0Ffeedback\u2764\uFE0F with us will really help shape the product \u{1F680}
3243
-
3244
- About
3245
- Reor is an AI-powered desktop note-taking app: it automatically links related notes, answers questions on your notes and provides semantic search. Everything is stored locally and you can edit your notes with an Obsidian-like markdown editor.
3246
- The hypothesis of the project is that AI tools for thought should run models locally by default. Reor stands on the shoulders of the giants Ollama, Transformers.js &amp; LanceDB to enable both LLMs and embedding models to run locally:
3247
-
3248
- Every note you write is chunked and embedded into an internal vector database.
3249
- Related notes are connected automatically via vector similarity.
3250
- LLM-powered Q&amp;A does RAG on your corpus of notes.
3251
- Everything can be searched semantically.
3252
-
3253
- One way to think about Reor is as a RAG app with two generators: the LLM and the human. In Q&amp;A mode, the LLM is fed retrieved context from the corpus to help answer a query. Similarly, in editor mode, the human can toggle the sidebar to reveal related notes "retrieved" from the corpus. This is quite a powerful way of "augmenting" your thoughts by cross-referencing ideas in a current note against related ideas from your corpus.
3254
- Getting Started
3255
-
3256
- Download from reorproject.org or releases. Mac, Linux &amp; Windows are all supported.
3257
- Install like a normal App.
3258
-
3259
- Running local models
3260
- Reor interacts directly with Ollama which means you can download and run models locally right from inside Reor. Head to Settings-&gt;Add New Local LLM then enter the name of the model you want Reor to download. You can find available models here.
3261
- You can also connect to an OpenAI-compatible API like Oobabooga, Ollama or OpenAI itself!
3262
- Importing notes from other apps
3263
- Reor works within a single directory in the filesystem. You choose the directory on first boot.
3264
- To import notes/files from another app, you'll need to populate that directory manually with markdown files. Note that if you have frontmatter in your markdown files it may not parse correctly. Integrations with other apps are hopefully coming soon!
3265
- Building from source
3266
- Make sure you have nodejs installed.
3267
- Clone repo
3268
- git clone https://github.com/reorproject/reor.git
3269
-
3270
- Install dependencies
3271
- Run for dev
3272
- Build
3273
- Interested in contributing?
3274
- We are always on the lookout for contributors keen on building the future of knowledge management. Have a feature idea? Want to squash a bug? Want to improve some styling? We'd love to hear it. Check out our issues page and the contributing guide to get started.
3275
- License
3276
- AGPL-3.0 license. See LICENSE for details.
3277
- Reor means "to think" in Latin.
3278
- `,
3279
- image: "https://opengraph.githubassets.com/101249afc41e6b8729eca3c619d4c08c5c67288ab4126de16c59c1ab97c5492c/reorproject/reor",
3280
- favicon: "https://github.com/fluidicon.png"
3281
- },
3282
- {
3283
- id: "https://github.com/memex-life/memex",
3284
- title: "GitHub - memex-life/memex: Your second brain for the web browsing. An AI powered Chrome extension that constructs personal knowledge base for you.",
3285
- url: "https://github.com/memex-life/memex",
3286
- publishedDate: "2023-03-16T23:48:35.000Z",
3287
- author: "memex-life",
3288
- score: 0.34730345010757446,
3289
- text: "Memex \n Your second brain for web browsing. Picture possessing the ultimate ability of total recall. \n \n Overview \n This project aims to create a browser extension that acts like a personal memex machine.\nIt will keep track of everything you browse online to build your own knowledge base.\nThen it will use AI to retrieve that knowledge whenever you need it. \n What is a Memex? \n \n Consider a future device for individual use, which is a sort of mechanized private file and library. It needs a name, and, to coin one at random, \u201Cmemex\u201D will do. A memex is a device in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory. \n--- \u201CAs We May Think\u201D Vannevar Bush (1945) \n \n Features \n \n Seamlessly captures content and metadata from your web browsing. \n Constructs your own personalized knowledge base on your local device \n Retrive knowledge with power of AI. \n \n How it works \n When you browse the web, this extension will inject a script to capture the text content on the pages you visit. It will send that content to the backend service-worker for processing\nThe service-worker will break the content into pieces and store it in a database.\nThe popup page acts as a chat interface to answer your questions using the information in the database. \n Getting Started \n Build &amp; import Extension \n Build extension files into dist/ folder \n npm install\nnpm run build # or npm run watch \n Load extension \n Start the Kownledge Base server \n Currently the LangchainJs has not yet support browser runtime. The extension still needs a backend server as Knowledge Base implementaion. \n set environments: \n export TOKENIZERS_PARALLELISM=false\nexport OPENAI_API_KEY=&lt;your-api-key&gt;\ncd server\nFLASK_APP=server flask run\n \n Start using \n Once you have completed the above steps, you can start using the Memex browser extension to enhance your web browsing experience. \n \n As you browse the web, the extension will automatically capture and store the text content from the web pages you visit, along with their metadata, in your personalized knowledge base. \n When you need to retrieve information or recall something from your browsing history, simply open the chat interface by clicking on the Memex extension icon. Type your question or query into the chat interface and press Enter or click the Send button. The Memex extension will use AI to search your knowledge base and provide you with the most relevant information based on your query. \n \n",
3290
- image: "https://opengraph.githubassets.com/aa7966b46e8bb10410af6cdb5af62c9095d99c4b9d17683b246641b8a1291746/memex-life/memex",
3291
- favicon: "https://github.com/fluidicon.png"
3292
- },
3293
- {
3294
- id: "https://github.com/samkeen/knowling",
3295
- title: "GitHub - samkeen/knowling: A desktop notes application leveraging AI designed for Personal Knowledge Management (PKM)",
3296
- url: "https://github.com/samkeen/knowling",
3297
- publishedDate: "2024-03-08T03:28:38.000Z",
3298
- author: "samkeen",
3299
- score: 0.8010122776031494,
3300
- text: `Knowling
3301
- A desktop notes application designed for Personal Knowledge Management (PKM)
3302
-
3303
- Knowling aims to provide users with an intuitive platform for gathering and organizing knowledge from various research
3304
- sources. By leveraging AI, Knowling assists users in categorizing their notes and highlighting connections between them,
3305
- thereby enhancing the overall management of their personal knowledge store.
3306
- Features
3307
-
3308
- Fast Performance: Knowling is developed using Rust and JavaScript, ensuring a responsive and efficient user
3309
- experience.
3310
- WSIWIG Markdown Editor: A What-You-See-Is-What-You-Get (WSIWIG) Markdown editor for seamless and straightforward
3311
- note-taking.
3312
- Simple, Uncluttered UI: The user interface is designed to be minimalistic and distraction-free, allowing users to
3313
- focus on their content.
3314
- Export/Import Notes: Easily export and import notes to manage your knowledge base across different devices and
3315
- formats.
3316
- AI Integration: AI is integrated to empower users by automatically categorizing notes and identifying meaningful
3317
- connections between them.
3318
- Open Source: Knowling is open source and licensed under the Apache 2.0 license, encouraging community
3319
- contributions
3320
- and
3321
- transparency.
3322
-
3323
- Current Development Status
3324
- Knowling is currently in the early stages of development, with a minimal feature set. We are actively working on
3325
- expanding the application's capabilities and enhancing its functionality. We welcome you to check out the open feature
3326
- requests and encourage you to open new ones if you have any suggestions or ideas.
3327
-
3328
- Open Issues
3329
- Project view
3330
-
3331
- We hope you find Knowling valuable for managing your personal knowledge. If you have any feedback or encounter any
3332
- issues, please don't hesitate to reach out or contribute to the project.
3333
- Why the name Knowling: Knowling is a play on the words "Knowledge" and "Knolling", a process of arranging objects to
3334
- create clean and organized
3335
- spaces. This reflects our goal of helping users keep their knowledge organized and easily accessible.
3336
-
3337
-
3338
- Developing Knowling
3339
- Knowling is built atop Tauri 1.x
3340
- Project setup
3341
- npm install
3342
- npm run tauri dev
3343
-
3344
- Development
3345
- Build
3346
- https://tauri.app/v1/api/cli/
3347
- Development follows the common practices of developing a Tauri application.
3348
- Debugging in RustRover
3349
- https://tauri.app/v1/guides/debugging/rustrover/
3350
- `,
3351
- image: "https://opengraph.githubassets.com/68a818dd653e6084907d244111f983fe2b2367dcfb8eed93ebece179892ae74c/samkeen/knowling",
3352
- favicon: "https://github.com/fluidicon.png"
3353
- },
3354
- {
3355
- id: "https://github.com/whl1207/Knowledge",
3356
- title: "GitHub - whl1207/Knowledge: Distributed Multi-View Intelligent Knowledge Management Platform",
3357
- url: "https://github.com/whl1207/Knowledge",
3358
- publishedDate: "2023-08-26T03:26:41.000Z",
3359
- author: "whl1207",
3360
- score: 0.35489749908447266,
3361
- text: "AI-KM Intelligent Knowledge Management Platform \n Overview \n AI-KM (Artificial Intelligence Knowledge Management) is a next-generation knowledge management platform that integrates cutting-edge AI technologies. Leveraging large language models and knowledge graph technologies, it helps individuals and organizations achieve efficient knowledge organization, in-depth analysis, and intelligent application. \n \n Core Value \n \n Intelligent Knowledge Processing: Automatically parses, queries, and associates knowledge content \n Multi-dimensional Visualization: Provides 6 view modes to present knowledge relationships \n Open Model Integration: Supports seamless switching between mainstream open-source large language models via Ollama \n Enterprise-grade Security: All data processing is performed locally \n \n Key Features \n 1. Core Technical Architecture \n \n \n Multi-model Integration Engine \n \n Supports mainstream large language models deployed via the Ollama framework \n Base models: Deepseek-R1, qwen3, LLaMA3.3, QWQ \n Embedding models: nomic-embed-text, bge-m3, mxbai-embed-large \n Multimodal models: Gemma3, Mistral-Small 3.1 \n \n \n \n Enhanced Retrieval System \n \n RAG (Retrieval-Augmented Generation) architecture \n Supports knowledge base preprocessing (default segmentation by 2 line breaks) \n Supports similarity calculations for various embedding models \n Supports hidden information inference in knowledge bases (default: deducing potential user queries) and knowledge fragment keyword editing \n Supports custom retrieval thresholds (can set knowledge base retrieval thresholds based on cosine similarity, quantity, characters, etc.) \n Explainable analysis and debugging of retrieval results, displaying similarity information for each knowledge fragment \n Supports cosine similarity calculation and MDS dimensionality reduction-based similarity calculation \n \n \n \n Visual Workflow Engine \n \n Drag-and-drop AI processing pipeline construction \n Includes 3+ pre-built node templates \n Supports workflow import/export \n \n \n \n Markdown Document Editing \n \n Deep Markdown parsing and editing \n Document structure analysis (heading hierarchy recognition) \n Code block processing \n \n \n \n Multi-view Knowledge Display Module \n \n \n \n Multi-platform Packaging &amp; Deployment \n \n Electron-based packaging for Windows, Linux, macOS, and other platform clients \n \n \n \n Installation &amp; Deployment \n System Requirements \n \n OS: Windows 10+/macOS 12+/Linux (Ubuntu 20.04+) \n Hardware:\n \n Minimum: 8GB RAM, 4-core CPU, 10GB storage \n Recommended: 16GB+ RAM, dedicated GPU, 50GB+ storage \n \n \n \n Development Environment Setup \n # Install dependencies \nnpm install\n # Run in development mode \nnpm run dev\n # Build Windows client \nnpm run build\n # Generate installation package \n AI-KM \u667A\u80FD\u77E5\u8BC6\u7BA1\u7406\u5E73\u53F0 \n \u6982\u8FF0 \n AI-KM\uFF08Artificial Intelligence Knowledge Management\uFF09\u662F\u4E00\u4E2A\u96C6\u6210\u4E86\u524D\u6CBFAI\u6280\u672F\u7684\u4E0B\u4E00\u4EE3\u77E5\u8BC6\u7BA1\u7406\u5E73\u53F0\uFF0C\u901A\u8FC7\u5927\u8BED\u8A00\u6A21\u578B\u548C\u77E5\u8BC6\u56FE\u8C31\u6280\u672F\uFF0C\u5E2E\u52A9\u4E2A\u4EBA\u548C\u7EC4\u7EC7\u5B9E\u73B0\u77E5\u8BC6\u7684\u9AD8\u6548\u7EC4\u7EC7\u3001\u6DF1\u5EA6\u5206\u6790\u548C\u667A\u80FD\u5E94\u7528\u3002 \n \u6838\u5FC3\u4EF7\u503C \n \n \u667A\u80FD\u77E5\u8BC6\u5904\u7406 \uFF1A\u81EA\u52A8\u89E3\u6790\u3001\u67E5\u8BE2\u548C\u5173\u8054\u77E5\u8BC6\u5185\u5BB9 \n \u591A\u7EF4\u5EA6\u53EF\u89C6\u5316 \uFF1A\u63D0\u4F9B6\u79CD\u89C6\u56FE\u6A21\u5F0F\u5448\u73B0\u77E5\u8BC6\u5173\u7CFB \n \u5F00\u653E\u6A21\u578B\u96C6\u6210 \uFF1A\u53EF\u4EE5\u901A\u8FC7ollama\u652F\u6301\u4E3B\u6D41\u5F00\u6E90",
3362
- image: "https://opengraph.githubassets.com/fc9354a52086145d1cf60e2b9c3d386a3be8fa44e2e00cbb13cd2b1af09973b7/whl1207/Knowledge",
3363
- favicon: "https://github.com/fluidicon.png"
3364
- },
3365
- {
3366
- id: "https://github.com/putaodoudou/kmagent",
3367
- title: "GitHub - putaodoudou/kmagent: KMAgent (Knowledge Management Agent)\uFF0C\u57FA\u4E8E\u8BED\u4E49\u5143\u7684\u667A\u80FD\u77E5\u8BC6\u7BA1\u7406GTD\u5DE5\u5177\uFF0C\u4E2A\u4EBA\u667A\u80FD\u52A9\u7406\u3002",
3368
- url: "https://github.com/putaodoudou/kmagent",
3369
- publishedDate: "2018-06-05T09:11:21.000Z",
3370
- author: "putaodoudou",
3371
- score: 0.35521113872528076,
3372
- text: "KMAgent-\u4E2A\u4EBA\u667A\u80FD\u52A9\u7406 \n \n \u4E2A\u4EBA \u77E5\u8BC6\u667A\u80FD\u52A9\u7406\uFF08KMAgent, Knowledge Management Agent\uFF09--\u4E13\u6CE8\u667A\u80FD\u77E5\u8BC6\u7BA1\u7406GTD \u591A\u5143\u878D\u5408\u521B\u65B0 \u53D1\u626C\u4F20\u627F\u667A\u6167\uFF01 \n KMAgent \u4EE5 \u4E2A\u4EBA\u77E5\u8BC6\u7BA1\u7406 GTD \u5E94\u7528\u4E3A\u4E3B\u7684\u5DE5\u5177\u6548\u7387\u8F6F\u4EF6\u3002\u57FA\u4E8E\u4EA4\u4E92\u533A+\u6587\u6863\u7684\u534F\u540C\u5B66\u4E60\u5DE5\u4F5C\u7A7A\u95F4\uFF0C\u4E13\u6CE8\u4E8E\u8BED\u4E49\u8BA1\u7B97\u3001\u77E5\u8BC6\u5DE5\u7A0B\uFF0C\u81F4\u529B\u4E8E\u901A\u8FC7\u81EA\u7136\u8BED\u8A00\u5904\u7406\u3001\u673A\u5668\u5B66\u4E60\u3001\u77E5\u8BC6\u56FE\u8C31\u7B49\u4EBA\u5DE5\u667A\u80FD\u6280\u672F\uFF0C\u7B80\u5316\u77E5\u8BC6\u589E\u5F3A\u8BA4\u77E5\u3001\u878D\u5408\u652F\u6301\u4F18\u79C0\u65B9\u6CD5\u8BBA\u6A21\u677F\uFF0C\u8F85\u52A9\u9AD8\u6548\u5B66\u4E60\u5DE5\u4F5C\uFF0C\u6269\u5C55\u4E2A\u4EBA\u80FD\u529B\uFF0C\u7C7B\u4F3C\u94A2\u94C1\u4FA0\u7684\u3010\u8D3E\u7EF4\u65AF\u3011\u3002\u4EE5\u5F00\u6E90\u9879\u76EE\u7684\u5F62\u5F0F\u7ED3\u5408\u4EA7\u5B66\u7814\uFF0C\u652F\u6301\u793E\u7FA4\u534F\u540C\u79EF\u7D2F\u521B\u65B0\uFF0C\u8282\u7701\u65F6\u95F4\u7CBE\u529B\uFF0C\u4ECE\u77E5\u8BC6\u4E2D\u6316\u6398\u667A\u6167\u3002\u60A8\u7684\u79C1\u4EBA\u77E5\u8BC6\u5F15\u64CE\u3001\u79D8\u4E66\u3001\u667A\u53CB\u3001\u667A\u56CA\u56E2\u3002 \n \u8BF7\u67E5\u770B\u7F51\u7AD9 http://kmagent.com \u83B7\u53D6\u76F8\u5173\u5B89\u88C5\u6307\u5357\u53CA\u4F7F\u7528\u8BF4\u660E\u3002 \n \u4E3A\u4EC0\u4E48Why? \n \n \u7279\u522B\u91CD\u8981\u7684\u4E24\u4E2A\u80FD\u529B\uFF1A1\u3001\u5236\u9020\u5DE5\u5177\uFF1B2\u3001\u5BFB\u6C42\u5408\u4F5C\u3002 \n \n \u667A\u80FD\u65F6\u4EE3\uFF0C\u4FE1\u606F\u7206\u70B8\uFF0C\u77E5\u8BC6\u532E\u4E4F\uFF0C\u8F85\u52A9\u505A\u51CF\u6CD5\uFF01\u534F\u540C\u5408\u4F5C\uFF0C\u964D\u4F4E\u4FE1\u606F\u71B5\uFF0C\u63D0\u9AD8\u667A\u5546\uFF0C\u6781\u7B80\u667A\u80FD\u77E5\u8BC6\u7BA1\u7406\uFF01 \n \n \n \u77E5\u8BC6\u8D22\u5BCC \uFF0C\u79EF\u7D2F\u77E5\u8BC6\u80DC\u8FC7\u79EF\u7D2F\u91D1\u94B1\uFF0C\u77E5\u8BC6\u662F\u4EBA\u7C7B\u8FDB\u6B65\u7684\u9636\u68AF\u3002\u662F\u4E2A\u4EBA\u53CA\u4F01\u4E1A\u7684\u6838\u5FC3\u7ADE\u4E89\u529B\uFF01 \n \u5316\u7E41\u4E3A\u7B80 \uFF0C\u53D1\u73B0\u6A21\u5F0F\u5316\u7E41\u4E3A\u7B80\uFF0C\u6316\u6398\u672C\u8D28\u53CA\u5173\u8054\uFF0C\u77E5\u5176\u7136\u77E5\u5176\u6240\u4EE5\u7136\uFF0C\u4FC3\u8FDB\u878D\u5408\u521B\u65B0\u3002 \n \u4EBA\u7C7B\u667A\u80FD \uFF0C\u6316\u6398\u9690\u6027\u77E5\u8BC6\u3001\u7406\u89E3\u4EBA\u7C7B\u591A\u5143\u667A\u80FD\uFF0C\u53D1\u6398\u5229\u7528\u5927\u8111\u6F5C\u529B\uFF0C\u6311\u6218\u8BA4\u77E5\u6781\u9650\u3002 \n \u77E5\u8BC6\u4F20\u64AD \uFF0C\u9759\u6001\u6587\u672C\u4E66\u7C4D\u7684\u7F3A\u9677\u3001\u63A2\u7D22\u65B0\u7684\u77E5\u8BC6\u5B58\u50A8\u5C55\u793A\u5206\u4EAB\u65B9\u5F0F\uFF0C\u5EFA\u7ACB\u9AD8\u6548\u6C9F\u901A\u534F\u540C\u4E0E\u79EF\u7D2F\u5206\u4EAB\u7684\u57FA\u7840\u3002 \n \u5B9E\u73B0\u5E94\u5BF9\u4EBA\u5DE5\u667A\u80FD \uFF0C\u77E5\u8BC6\u4E0E\u667A\u80FD\u76F8\u8F85\u76F8\u6210\uFF0C\u77E5\u8BC6\u7BA1\u7406\u4F5C\u4E3A\u6838\u5FC3\u73AF\u8282\uFF0C\u627F\u4E0A\u542F\u4E0B\u5F62\u6210\u95ED\u73AF\uFF0C\u793E\u7FA4\u534F\u540C\u79EF\u7D2F\u521B\u65B0\u3002 \n \u91CD\u65B0\u9020\u8F6E\u5B50 \uFF0C\u4E3A\u81EA\u5DF1\u5F00\u53D1\u4E00\u4E2A\u5DE5\u5177\uFF0C\u81EA\u7136\u4EA4\u4E92\u964D\u4F4E\u5DE5\u5177\u5B66\u4E60\u4F7F\u7528\u6210\u672C\uFF0C\u652F\u6301\u5B66\u4E60\u5DE5\u4F5C\u751F\u6D3B\u3002 \n \u4F5C\u4E3A\u4E8B\u4E1A \uFF0C\u503C\u5F97\u594B\u6597\u5341\u5E74\u7684\u4E8B\u4E1A\u3002 \n \n Do something diferent, make a change! \n \n \u3010\u4EA7\u54C1\u7B80\u4ECB\u3011\u4EA7\u54C1\u539F\u578B\u6B63\u706B\u901F\u5F00\u53D1\u4E2D\uFF01 \n \n \u662F\u4EE5\u6587\u6863+\u4EA4\u4E92\u533A\u4E3A\u4E2D\u5FC3\u7684\u529F\u80FD\u96C6\u6210\uFF0C\u8D44\u6E90\u4E8B\u52A1\u884C\u4E3A\u7684\u534F\u540C\u667A\u80FD\u7BA1\u7406GTD\u3002\u9996\u5148\u7528\u4E8E\u534F\u540C\u5EFA\u7ACB\u6838\u5FC3\u6982\u5FF5\u7406\u8BBA\u4F53\u7CFB\uFF0C\u77E5\u8BC6\u7BA1\u7406\u4E1A\u52A1\u5EFA\u6A21\uFF0C\u79EF\u7D2F\u5206\u4EAB\u8D44\u6E90\u77E5\u8BC6\u6280\u672F\uFF0C\u5E94\u7528\u4E8EKM\u3001IT\u3001AI\u3001\u6570\u5B66\u76F8\u5173\u9886\u57DF\u77E5\u8BC6\u7684\u5B66\u4E60\u6574\u7406\u3002 \n \n \u529F\u80FD\u53CA\u7279\u6027\uFF1A \n \n \u591A\u5A92\u4F53\u65E0\u9650\u753B\u677F\u3001\u5B9E\u65F6\u534F\u540C\u6587\u672C\u5BFC\u56FE\u7F16\u8F91\u5668\uFF0C\u5BCC\u6587\u672C\u548C Markdown \u6269\u5C55\u7F16\u8F91\u3002 \n \u652F\u6301\u672C\u4F53\u5EFA\u6A21\u3001\u9605\u8BFB\u7B14\u8BB0\u3001\u7075\u611F\u4FBF\u7B7E\u3001\u601D\u7EF4\u5BFC\u56FE\u3001\u5404\u7C7B\u6A21\u677F\u3002 \n \u5212\u8BCD\u7FFB\u8BD1\u77E5\u8BC6\u89E3\u91CA\u3001\u641C\u7D22\u3001\u767E\u79D1\u5B57\u5178\u3002 \n \u77E5\u8BC6\u53EF\u89C6\u5316\uFF0C\u591A\u5C42\u6B21\u7C92\u5EA6\u7EF4\u5EA6\u53BB\u5197\u4F59\uFF0C\u6D53\u7F29\u6458\u8981\u3001\u751F\u6210\u535A\u5BA2\u3002 \n \u77E5\u8BC6\u5BFC\u5165\u5BFC\u51FA\u3001Web \u77E5\u8BC6\u62BD\u53D6\u96C6\u6210\u3002 \n \u8D44\u6E90\u7BA1\u7406\u3001\u516C\u5171+\u4E2A\u4EBA+\u9886\u57DF\u77E5\u8BC6\u56FE\u8C31\u3002 \n \u6536\u85CF\u8BA2\u9605\u8BC4\u8BBA\u5206\u4EAB\u3001\u8BDD\u9898\u8BFE\u7A0B\u5C0F\u7EC4\u73ED\u7EA7\u5708\u5B50\u3002 \n \u9879\u76EE\u4E8B\u52A1\u7684PDCA\u3001GTD\uFF0C\u65E5\u5386\u65E5\u7A0B\u5B89\u6392\u63D0\u9192\u3002 \n \u5373\u65F6\u901A\u4FE1\u3001\u5B9E\u65F6\u534F\u540C\u3001\u9879\u76EE\u5408\u4F5C\u3001\u79EF\u5206\u7CFB\u7EDF\u3002 \n \u4E2A\u6027\u5316\u81EA\u5B66\u4E60\u804A\u5929\u673A\u5668\u4EBA\u3001\u865A\u62DF\u5F62\u8C61\u3001\u8BED\u97F3\u8BC6\u522B\u751F\u6210\u3001\u4E8B\u52A1\u4EE3\u7406\u3001\u4E3B\u52A8\u63A8\u8350\u63D0\u9192\u5F15\u5BFC\u8F85\u52A9\u3002 \n \u81EA\u7136\u8BED\u8A00\u4EA4\u4E92\u3001\u8BED\u4E49\u5316\u3001\u54CD\u5E94\u5F0F\u751F\u6210\u5F0F\u3001\u6587\u672C\u5316\u3001\u53EF\u89C6\u5316\u3001\u6781\u81F4\u6C89\u6D78\u4F53\u9A8C\u3002 \n \u9AD8\u7EA7\u529F\u80FD\uFF1A\u81EA\u5B9A\u4E49\u914D\u7F6E\u3001\u63D2\u4EF6\u3001\u547D\u4EE4\u884C\u3001\u9886\u57DF\u8BED\u8A00\u3002 \n \n \u8F85\u52A9\u60A8\u8FDB\u884C\u6781\u7B80\u667A\u80FD\u77E5\u8BC6\u7BA1\u7406\uFF1A\u77E5\u8BC6\u53EF\u89C6\u5316\u521B\u4F5C\u5C55\u793A\uFF0C\u7B80\u5316\u7ED3\u6784\u5316\u5DF2\u6709\u77E5\u8BC6\u8D44\u6E90\uFF0C\u5EFA\u7ACB\u77E5\u8BC6\u4F53\u7CFB\u3002\u6DF1\u5165\u672C\u8D28\u7406\u89E3\u77E5\u8BC6\u3001\u6574\u4F53\u9AD8\u6548\u5408\u4F5C\u5B66\u4E60\u3002\u4E2A\u4EBA\u4E8B\u52A1\u7684\u7BA1\u7406\u3001\u539F\u5219\u65B9\u6CD5\u8BBA\u4E60\u60EF\u7684\u517B\u6210\u3002\u8BED\u4E49\u8BA1\u7B97\uFF0C\u8F85\u52A9\u63A8\u7406\u3001\u4EFF\u771F\u3001\u9884\u6D4B\u3001\u51B3\u7B56\u3002\u804A\u5929\u89E3\u95F7\u542F\u53D1\u3002 \n \u5F88\u9AD8\u5174\u60A8 \u4E0B\u8F7D\u8BD5\u7528 \u5E76 \u56DE\u9988\u4F7F\u7528\u60C5\u51B5 \u3002 \n \n \u968F\u7740\u5F00\u53D1\u8FDB\u5C55\uFF0C\u4F1A\u53CA\u65F6\u5217\u51FA\u6700\u65B0\u7279\u6027\u3001\u65B0\u529F\u80FD\u53CA\u6539\u8FDB\u60C5\u51B5\u3002\u67E5\u770B v0.1 -&gt; v1.0 \u5347\u7EA7\u4FE1\u606F \uFF0C\u83B7\u53D6\u66F4\u591A\u4EA7\u54C1\u5347\u7EA7\u4FE1\u606F \u3002 \n \u3010\u53C2\u4E0E\u8D21\u732E\u3011 \n \n \u6211\u4EEC\u662F\u4E00\u4E2A\u534F\u540C\u5B66\u4E60\u578B\u7EC4\u7EC7\uFF0C\u4EE5\u5F00\u6E90\u9879\u76EE\u4E3A\u4E2D\u5FC3\uFF0C\u7ED3\u5408\u4EA7\u5B66\u7814\uFF0C\u7406\u8BBA\u6280\u672F\u77E5\u8BC6\u80FD\u529B\u5B9E\u8DF5\u95ED\u73AF\u6B63\u53CD\u9988\u8FED\u4EE3\u79EF\u7D2F\u7684\u8FC7\u7A0B\uFF0C\u4EBA\u4E0E\u4EBA\u4E0E\u673A\u5668\u673A\u5668\u7684\u5408\u4F5C\u5B66\u4E60\uFF01\u9879\u76EE\u5904\u4E8E\u521D\u671F\u89C4\u5212\u9636\u6BB5\uFF0C \u6B22\u8FCE\u5404\u4F4D\u6709\u5FD7\u4E4B\u58EB\u7684\u52A0\u5165\uFF01 \n \n \u57FA\u4E8E\u5171\u540C\u4FE1\u5FF5\u3001\u7EDF\u4E00\u57FA\u7840\u3001\u534F\u540C\u673A\u5236\uFF0C\u81EA\u7531\u5206\u5DE5\u5408\u4F5C\u7684\u5DE5\u4F5C\u7EC4\uFF0C\u53EF\u9009\u62E9\u4E00\u4E2A\u6216\u591A\u4E2A\u6A21\u5757\u53C2\u4E0E\u5408\u4F5C\u5B66\u4E60\u53CA\u5F00\u53D1\uFF0C\u6839\u636E \u89C4\u5219 \u8BB0\u5F55\u8D21\u732E\u79EF\u5206\uFF0C\u6309\u8D21\u732E\u5206\u914D\u5956\u52B1\uFF0C\u672A\u6765\u82E5\u76C8\u5229\u53EF\u5206\u7EA2\uFF0C\u6D8C\u73B0\u96C6\u4F53\u667A\u6167\uFF01\u6B22\u8FCE\u6BCF\u4E2A\u4EBA\u8D21\u732E\u529B\u91CF\u3001\u6536\u83B7\u79EF\u5206\u670B\u53CB\u77E5\u8BC6\u5DE5\u5177\u6280\u672F\u3002 \n \u3010\u503C\u5F97\u52A0\u5165\u3011\u77E5\u8BC6\u6539\u53D8\u547D\u8FD0\uFF0C\u521B\u65B0\u6539\u53D8\u4E16\u754C\uFF01\u6539\u53D8\u81EA\u5DF1\u4ECE\u5FC3\u800C\u4E3A\uFF0C\u4E0D\u5FD8\u521D\u5FC3\u65B9\u5F97\u59CB\u7EC8\uFF01 \n \u591A\u79CD\u8D21\u732E\u65B9\u5F0F \n \n \u53EF\u53C2\u4E0E\u7406\u8BBA\u7814\u7A76\u3001\u4E1A\u52A1\u5EFA\u6A21\u3001\u6280\u672F\u5F00\u53D1\u3001\u9879\u76EE\u7BA1\u7406\u3001\u8FD0\u8425\u3001\u6295\u8D44\u3001\u8BD5\u7528\u5206\u4EAB\u63A8\u5E7F\u3002 \n \u63D0\u4EA4\u6216\u6295\u7968\u65B0\u529F\u80FD\u7279\u6027\u9700\u6C42 ProductPains \n \u5DE5\u5177\u4F7F\u7528 \u60C5\u51B5\u53CD\u9988 \n \n \u6B22\u8FCE\u63D0\u4EA4 pull requests \u53CA issue \u3002 \n \u82E5\u8D21\u732E\u6E90\u7801\u8BF7\u9605\u8BFB\u9075\u5FAA \u7F16\u7A0B\u98CE\u683C \u53CA \u8D21\u732E\u8BF4\u660E\u6587\u6863 \u3002 \n \u81F4\u8C22 \n \u3010\u6E90\u8BA1\u5212\u3011KMAgent \u5F53\u524D\u662F\u4E00\u4E2A\u516C\u5F00\u793E\u7FA4\u548C\u514D\u8D39\u8F6F\u4EF6\uFF0C\u611F\u8C22\u6240\u6709\u4FC3\u8FDB\u5176\u53D1\u5C55\u7684 \u8D21\u732E\u8005 \u548C [\u6DF1\u5EA6\u7528\u6237]( https://github.com/kmagent/ kmagent/fans.md)\u3002\u3010\u6350\u8D60\u3011\u5982\u679C\u60A8\u8BA4\u540C\u6211\u4EEC\u8BF7\u652F\u6301\u6211\u4EEC\u5FEB\u901F\u6301\u7EED\u53D1\u5C55\u3002 \n \u4E3B\u8981\u6A21\u5757 \n \u3010\u6838\u5FC3\u91CD\u70B9\u3011\u667A\u80FD\u4F53\u8BED\u4E49\u5143\u6838\u5FC3\u62BD\u8C61\u3001\u8BA4\u77E5\u5EFA\u6A21\u3001\u77E5\u8BC6\u56FE\u8C31\u3001\u667A\u80FD\u77E5\u8BC6\u7BA1\u7406GTD\u89E3\u51B3\u65B9\u6848\u3001\u4EA7\u54C1\u8BBE\u8BA1\u5F00\u53D1\uFF0C\u793E\u7FA4\u8FD0\u8425\u534F\u540C\u79EF\u7D2F\u521B\u65B0\u3002\uFF08\u667A\u80FD\u57FA\u7840-&gt;\u667A\u80FD\u6838-&gt;\u667A\u80FD\u5757-&gt;\u667A\u80FD\u4F53\uFF09\u7FA4\u4F53\u667A\u80FD-&gt;\u901A\u7528\u667A\u80FD\uFF0C\u6A21\u62DF-&gt;\u8D85\u8D8A\u3002\u6A21\u5757\uFF1Akm-thory km-engine km-onto km-agents km-sys km-ui\u3001km-graph\u3002 \n \u3010\u9886\u57DF\u53CA\u6280\u672F\u3011\u667A\u80FD\u77E5\u8BC6\u7BA1\u7406\uFF08\u9886\u57DF\u5EFA\u6A21\uFF09\u3001\u673A\u5668\u5B66\u4E60\uFF08tensorflow\uFF09\u3001\u81EA\u7136\u8BED\u8A00\u5904\u7406\uFF08NLTK\u3001hanlp\uFF09\u3001\u77E5\u8BC6\u56FE\u8C31\uFF08\u56FE\u6570\u636E\u5E93neo4j\u5206\u5E03\u5F0F\u5B58\u50A8ceph\uFF09\u3001\u9886\u57DF\u8BED\u8A00\uFF08DSL\uFF09\u3001\u8BED\u4E49\u7F51\uFF08OWL\uFF09\u3001web\u77E5\u8BC6\u53D1\u73B0\uFF08\u722C\u866B\uFF09\u3001\u68C0\u7D22\uFF08lucene\uFF09\u63A8\u7406\u63A8\u8350\u3001\u591Aagent\u96C6\u7FA4\u667A\u80FD\uFF08\u67B6\u6784\uFF09\u3001\u4EBA\u673A\u4EA4\u4E92UI\uFF08vue.js\u3001bootstrap\u3001\u6570\u636E\u53EF\u89C6\u5316\uFF09\u3001Web\u7F51\u7AD9\uFF08keystone\uFF09\u3001\u684C\u9762\uFF08webkit\u3001electron\uFF09\u3001\u79FB\u52A8\uFF08weex\uFF09\u3001\u5927\u6570\u636E\uFF08spark\uFF09\u3001\u865A\u62DF\u5316\u4E91\u8BA1\u7B97\uFF08Mesos\u3001docker\u3001Kubernetes\uFF09\u3001\u5B89\u5168\u7F51\u7EDC\u901A\u4FE1\u52A0\u5BC6\u6743\u9650\u8BA4\u8BC1\uFF08openSSL\uFF09\u3001\u8F6F\u4EF6\u5DE5\u7A0B\uFF08\u9879\u76EE\u5F00\u53D1\u7BA1\u7406\uFF09\u3001\u533A\u5757\u94FE\u3001VR\u3001\u4EE3\u7801\u751F\u6210\u3001\u8BA4\u77E5\u5FC3\u7406\u3001\u590D\u6742\u7CFB\u7EDF\u3001\u77E5\u8BC6\u5171\u4EAB\u534F\u8BAE\u4EA7\u6743\u3001\u793E\u7FA4\u4F53\u9A8C\u7ECF\u6D4E\u3002 \n \u3010\u5DE5\u4F5C\u5206\u89E3\u3011 \u5173\u952E\u5728\u4E8E \uFF1A\u7EDF\u4E00\u8BA4\u8BC6\u3001\u5DE5\u5177\u652F\u6301\u3001\u6709\u6548\u79EF\u7D2F\u53EF\u6301\u7EED\u53D1\u5C55\u3002 \n \n \u4E1A\u52A1\u5EFA\u6A21\uFF08\u667A\u80FD\u77E5\u8BC6\u7BA1\u7406GTD\u7406\u8BBA\u4F53\u7CFB\uFF09\uFF1A\u6838\u5FC3\u62BD\u8C61\u6A21\u578B\uFF0C\u4EBA\u6027\u5EFA\u6A21\u3002 \n \u4EA7\u54C1\u8BBE\u8BA1\uFF08\u4E2A\u4EBA\u667A\u80FD\u52A9\u7406\uFF09\uFF1A\u4EA7\u54C1\u89C4\u5212\u3001\u865A\u62DF\u5F62\u8C61UI\u8BBE\u8BA1\u3001\u7ADE\u54C1\u5206\u6790\u3002 \u53C2\u8003\u4EA7\u54C1 \uFF1Aprotege\u3001vscode\u3001quip\u3001knowledgebuilder\u3001metacademy\u3001wiki\u3001CSDN\u77E5\u8BC6\u5E93\u3001sketchboard\u3001feedly\u3001onenote\u753B\u677F\u3001foxmail\u3001\u4EAC\u4E1C\u9605\u8BFB\u3001qq\u97F3\u4E50\u3001NetLogo\u3001flyinglogic\u3001sourceinsight\u3001\u5E55\u5E03\u3001Anki\u3001wolframalpha\u3002 \n \u6280\u672F\u67B6\u6784\uFF08\u901A\u7528\u667A\u80FD\u7CFB\u7EDF\uFF09\uFF1A\u5206\u5E03\u5F0F\u8BA1\u7B97\u5B58\u50A8\u591A\u667A\u80FD\u4F53\u534F\u540C\u7CFB\u7EDF\uFF1A\u666E\u9002\u7F51\u683C\u8BED\u4E49\u4EBA\u7C7B\u8BA1\u7B97\u3002\u5168\u5E73\u53F0\u3001\u5FAE\u670D\u52A1\u3001\u6838\u5FC3\u7B97\u6CD5\u3001\u6280\u672F\u9009\u578B\u3001\u6D4B\u8BD5\u90E8\u7F72\u3002C++\u3001Python\u3001js\u3001HTML\u3002 \n \u5546\u4E1A\u8BA1\u5212\uFF08SaaS \u8F6F\u4EF6\u5373\u670D\u52A1\uFF09\uFF1A\u4EE5\u8F6F\u4EF6\u4EA7\u54C1\u4E3A\u4E2D\u5FC3\u7684\u589E\u503C\u670D\u52A1\u3001\u54C1\u724C\u8FD0\u8425\u63A8\u5E7F\u8425\u9500\u3002 \n \u9879\u76EE\u7BA1\u7406\uFF08\u5C0F\u4EE3\u4EF7\u8FBE\u5230\u76EE\u7684\uFF09\uFF1A\u654F\u6377\u8FED\u4EE3\u3001\u8FC7\u7A0B\u6539\u8FDB\u3001\u914D\u7F6E\u7BA1\u7406\u3002 \n \u793E\u7FA4\u5EFA\u8BBE\uFF08\u5229\u76CA\u5171\u540C\u4F53\u8054\u76DF\uFF09\uFF1A\u6587\u5316\u7406\u5FF5\u96C6\u4F53\u667A\u6167\u3001\u6269\u5927\u5F71\u54CD\u3002 \n \u77E5\u8BC6\u521B\u4F5C\uFF08\u77E5\u8BC6\u7BA1\u7406\u7B49\u9886\u57DF\u77E5\u8BC6\uFF09\uFF1A\u77E5\u8BC6\u7BA1",
3373
- image: "https://opengraph.githubassets.com/935c4954d4a340aff679b550e201df566a4f53b442922a997e8a83570a564195/putaodoudou/kmagent",
3374
- favicon: "https://github.com/fluidicon.png"
3375
- }
3376
- ],
3377
- costDollars: {
3378
- total: 0.015,
3379
- search: {
3380
- neural: 5e-3
3381
- },
3382
- contents: {
3383
- text: 0.01
3384
- }
3385
- }
3386
- };
3387
-
3388
- // src/functions/exa/data/exa-search-1748337344119.ts
3389
- var exa_search_1748337344119_default = {
3390
- requestId: "32df0c541f9883180b35e04caece4374",
3391
- autopromptString: "open source AI knowledge management projects features comparison 2024",
3392
- autoDate: "2024-01-01T00:00:00.000Z",
3393
- resolvedSearchType: "neural",
3394
- results: [
3395
- {
3396
- id: "https://tryfastgpt.ai/",
3397
- title: "FastGPT",
3398
- url: "https://tryfastgpt.ai/",
3399
- publishedDate: "2024-01-01T00:00:00.000Z",
3400
- author: "labring",
3401
- score: 0.36898404359817505,
3402
- text: "20w+\xA0 Users are leveraging FastGPT to create their own specialized AI knowledge bases Empowerwith Your Expertise A free, open-source, and powerful AI knowledge base platform, offers out-of-the-box data processing, model invocation, RAG retrieval, and visual AI workflows. Easily build complex LLM applications. Features Why Choose FastGPT? Discover the advantages of FastGPT Open Source Secure and reliable open-source codebase. Optimized Q&amp;A Enhanced question-answering accuracy for customer service. Visual Workflow Design complex workflows with ease using the Flow module. Seamless Extensibility Seamlessly integrate FastGPT into your applications via API. Debugging Tools Refine your models with comprehensive debugging features. Multi-Model Compatibility Compatible with various LLM models, with more to come. Do you find this open-source AI knowledge base platform valuable?\xA0 Show your support by giving us a star \u{1F31F} FAQ Find answers to the most common inquiries here. FastGPT allows commercial usage, such as serving as a backend service for other applications or as an application development platform for enterprises. However, when it comes to multi-tenant SaaS services or matters involving the LOGO and copyright information, you must contact the author to obtain a commercial license. FastGPT supports importing documents in various formats, including Word, PDF, Excel, Markdown, and web links. It also enables syncing data from an entire website, automatically handling text preprocessing, vectorization, and QA splitting, which saves manual training time and improves efficiency. As long as the API of the model you want to integrate aligns with the official OpenAI API, it can be used with FastGPT. You can utilize projects like One API to unify access to different models and provide an API that is compatible with the official OpenAI API. If you come across any problems while using FastGPT, please join our community or forum, create a post, and reach out to us for assistance.",
3403
- favicon: "https://tryfastgpt.ai/favicon-16x16.png"
3404
- },
3405
- {
3406
- id: "https://casibase.org",
3407
- title: "Casibase | Casibase \xB7 Open-Source LangChain-like AI Knowledge Database & Chat Bot with Admin UI and multi-model support (ChatGPT, Claude, Llama 3, DeepSeek R1, HuggingFace, etc.)",
3408
- url: "https://casibase.org",
3409
- publishedDate: "2025-01-01T00:00:00.000Z",
3410
- author: "",
3411
- score: 0.354640930891037,
3412
- text: "Comprehensive Model Support Integrates a diverse range of AI models, including ChatGPT, Azure OpenAI, HuggingFace, and more, complemented by support for various embedding APIs like OpenAI Ada and Baidu Wenxin Yiyi. Advanced Document Handling &amp; AI Assistance Supports multiple document formats including txt, markdown, docx, pdf with intelligent parsing, and features an embedded AI assistant for real-time online chat and manual session handover. Enterprise-Level Features &amp; Multilingual Support Offers multi-user and multi-tenant capabilities with enterprise-grade Single Sign-On (SSO), comprehensive chat session logging for auditing, and a multilingual interface supporting Chinese, English, and more. Casibase is an open source AI knowledge base and dialogue system that combines the latest RAG (Retrieval Augmented Generation) technology, enterprise-grade Single Sign-On (SSO) functionality, and support for a wide range of mainstream AI models. Casibase is designed to provide enterprises and developers with a powerful, flexible, and easy-to-use knowledge management and intelligent dialogue platform. Casibase provides various provider configurations, such as storage providers, model providers, embedding providers, etc. To chat with AI easily, please visit the Casibase Guide for more details. Enterprise-class identity management capabilities Casibase uses Casdoor as its identity and single sign-on (SSO) provider. Through its deep integration with Casdoor, Casibase not only simplifies the user login process, but also provides a high level of security and flexibility, enabling organisations to easily manage user identities and access rights.",
3413
- favicon: "https://casibase.org/img/favicon.png"
3414
- },
3415
- {
3416
- id: "https://www.open-notebook.ai/",
3417
- title: "What is Open Notebook? | Open Notebook",
3418
- url: "https://www.open-notebook.ai/",
3419
- publishedDate: "2024-01-01T00:00:00.000Z",
3420
- author: "",
3421
- score: 0.36405712366104126,
3422
- text: "Take Control of Your Learning. Privately. A powerful open-source, AI-powered note-taking/research platform that respects your privacy \u{1F399}\uFE0F Podcast Generator Transform your notes into engaging podcasts with customizable voices, speakers, and episodes \u{1F916} AI-Powered Notes Leverage AI to summarize, generate insights, and manage your notes \u{1F512} Privacy Control Full control over what information AI can access \u{1F504} Content Integration Support for links, PDFs, TXT, PPT, YouTube, and more What is Open Notebook? \u200B Open Notebook is the cognitive partner you always wanted and could never explain why. It combines the power of AI with unwavering privacy controls. It's designed for researchers, students, and professionals who want to enhance their learning and abilities while maintaining complete control over workflows, models, and how their data gets used and exposed. Is this right for me? \u200B \u{1F4DA} Learning Enthusiast You're constantly seeking knowledge and want to go beyond surface-level understanding. Learning for you is about building deep, lasting comprehension. \u{1F91D} You want a learning partner You believe your learning process can improve by partnering with a tailor made AI. You want to be provoked to think more clearly. \u{1F92F} Your learning backlog is way too big You have hundreds of links you would love to read, but there is no time for it all. You want to make sure those are catalogued for when you need them. \u270D\uFE0F Independent Thinker You value both taking notes and forming your own ideas. You understand different viewpoints but believe in developing your own perspective. \u{1F512} You are privacy aware You don't want all your context, thoughts and plans to be all over Big Tech, if not necessary. \u{1F481} You like things your way You want to decide how your content is handled, which AI models you want to interact with and help specifically it should help/challenge you. What is the plan for the future? \u200B There is much more that can be done to augment human knowledge. Open Notebook's first release is just a first step in that direction. The end goal is to build a Cognitive Partner for every person. A customized assistant that can help you develop your skills, knowledge, and opinions in a way that makes sense to you. Learn more about our long-term vision and roadmap in our Vision page."
3423
- },
3424
- {
3425
- id: "https://www.suna.so/",
3426
- title: "Suna - Open Source Generalist AI Agent",
3427
- url: "https://www.suna.so/",
3428
- publishedDate: "2025-06-21T00:00:00.000Z",
3429
- author: "Kortix Team",
3430
- score: 0.3588857054710388,
3431
- text: "100% OPEN SOURCE Suna, your AI Employee. Suna by Kortix \u2013 is a generalist AI Agent that acts on your behalf. See Suna in action Explore real-world examples of how Suna completes complex tasks autonomously Suna is fully open source. Join our community and help shape the future of AI. The Generalist AI Agent Explore, contribute, or fork our repository. Suna is built with transparency and collaboration at its core. TypeScript Python Apache 2.0 License View on GitHub Transparency &amp; Trust We believe AI should be open and accessible to everyone. Our open source approach ensures accountability, innovation, and community collaboration. Transparency Fully auditable codebase Community Join our developers Apache 2.0 Free to use and modify Choose the right plan for your needs Start with our free plan or upgrade to a premium plan for more usage hours Free $0 Get started with 60 min/month Public Projects Basic Model (Limited capabilities) Pro Popular $20 /month Everything in Free, plus: 2 hours/month 2 hours Private projects Access to intelligent Model (Full Suna) Custom $50 /month Everything in Pro, plus: Customize your monthly usage 6 hours/month Suited to you needs",
3432
- image: "https://suna.so/opengraph-image?971e689ec8d3b4eb",
3433
- favicon: "https://www.suna.so/favicon.png"
3434
- },
3435
- {
3436
- id: "https://github.com/AIDotNet/AntSK",
3437
- title: "GitHub - AIDotNet/AntSK: \u57FA\u4E8E.Net8+AntBlazor+SemanticKernel \u548CKernelMemory \u6253\u9020\u7684AI\u77E5\u8BC6\u5E93/\u667A\u80FD\u4F53\uFF0C\u652F\u6301\u672C\u5730\u79BB\u7EBFAI\u5927\u6A21\u578B\u3002\u53EF\u4EE5\u4E0D\u8054\u7F51\u79BB\u7EBF\u8FD0\u884C\u3002\u652F\u6301aspire\u89C2\u6D4B\u5E94\u7528\u6570\u636E",
3438
- url: "https://github.com/AIDotNet/AntSK",
3439
- publishedDate: "2024-02-01T15:08:17.000Z",
3440
- author: "AIDotNet",
3441
- score: 0.3635949492454529,
3442
- text: "\u7B80\u4F53\u4E2D\u6587 | English \n AntSK \n AI Knowledge Base/Intelligent Agent built on .Net8+AntBlazor+SemanticKernel \n \u2B50Core Features \n \n \n Semantic Kernel: Utilizes advanced natural language processing technology to accurately understand, process, and respond to complex semantic queries, providing users with precise information retrieval and recommendation services. \n \n \n Kernel Memory: Capable of continuous learning and storing knowledge points, AntSK has long-term memory function, accumulates experience, and provides a more personalized interaction experience. \n \n \n Knowledge Base: Import knowledge base through documents (Word, PDF, Excel, Txt, Markdown, Json, PPT) and perform knowledge base Q&amp;A. \n \n \n GPT Generation: This platform supports creating personalized GPT models, enabling users to build their own GPT models. \n \n \n API Interface Publishing: Exposes internal functions in the form of APIs, enabling developers to integrate AntSK into other applications and enhance application intelligence. \n \n \n API Plugin System: Open API plugin system that allows third-party developers or service providers to easily integrate their services into AntSK, continuously enhancing application functionality. \n \n \n.Net Plugin System: Open dll plugin system that allows third-party developers or service providers to easily integrate their business functions by generating dll in standard format code, continuously enhancing application functionality. \n \n \n Online Search: AntSK, real-time access to the latest information, ensuring users receive the most timely and relevant data. \n \n \n Model Management: Adapts and manages integration of different models from different manufacturers, models offline running supported by llamafactory and ollama. \n \n \n Domestic Innovation: AntSK supports domestic models and databases and can run under domestic innovation conditions. \n \n \n Model Fine-Tuning: Planned based on llamafactory for model fine-tuning. \n \n \n \u26EAApplication Scenarios \n AntSK is suitable for various business scenarios, such as: \n \n Enterprise knowledge management system \n Automatic customer service and chatbots \n Enterprise search engine \n Personalized recommendation system \n Intelligent writing assistance \n Education and online learning platforms \n Other interesting AI Apps \n \n \u270F\uFE0FFunction Examples \n Online Demo \n document \n demo \nand\n demo1 \n Default account: test\nDefault password: test\nDue to the low configuration of the cloud server, the local model cannot be run, so the system settings permissions have been closed. You can simply view the interface. If you want to use the local model, please download and use it on your own.\n \n Other Function Examples \n Video Demonstration \n \u2753How to get started? \n Here I am using Postgres as the data and vector storage because Semantic Kernel and Kernel Memory support it, but you can also use other options. \n The model by default supports the local model of openai, azure openai, and llama. If you need to use other models, you can integrate t",
3443
- image: "https://opengraph.githubassets.com/945bd786b32bfe02a9a537c511d768696a91e155dc07052bba541d1b3e6517c0/AIDotNet/AntSK",
3444
- favicon: "https://github.com/fluidicon.png"
3445
- },
3446
- {
3447
- id: "https://www.cognee.ai/",
3448
- title: "Improve your AI infrastructure - AI memory engine",
3449
- url: "https://www.cognee.ai/",
3450
- publishedDate: "2025-05-21T00:00:00.000Z",
3451
- author: "",
3452
- score: 0.3653402328491211,
3453
- text: "AI agent responses you can rely on AI Memory Python SDK. 90% accuracy out of the box. People use cognee to sort out their data and improve AI answers Ask cognee 89.4% answer relevancy Vector store Ask RAG Potato answer relevancy ChatGPT Ask ChatGPT 5% answer relevancy Improve responses from LLM applications Text generation Content summaries Customer analysis Chatbot responses Code generation Translations Why choose Cognee 1 It\u2019s free and open-source We\u2019re all about building in the open. Just install the Python library, or clone the repo from GitHub and start playing around. Super flexible for developers and hobbyists. 2 Totally customisable storage Want to use a different database provider? No problem. cognee supports many out of the box (like vector and graph databases), but you can easily plug in your own by following the docs. 3 Smart data with ontologies Cognee isn\u2019t just storing random chunks of data - everything is related! RDF-based ontologies define the structure with publicly available rules and ontologies to make your data even smarter. 4 Actual reasoning (no guessing here!) Instead of just guessing based on patterns, cognee can use real reasoners. You can use existing ones, or build your own for your specific case. 5 Built for your servers You can run everything on your own servers, so if you\u2019re dealing with sensitive data there\u2019s no third-party risk. 6 Handles loads of data Need to analyse a lot of data? Whether it\u2019s gigabytes (or terabytes :hushed:) cognee\u2019s distributed system can handle it. It scales exactly when you need it to. 1 It\u2019s free and open-source We\u2019re all about building in the open. Just install the Python library, or clone the repo from GitHub and start playing around. Super flexible for developers and hobbyists. 3 Smart data with ontologies Cognee isn\u2019t just storing random chunks of data - everything is related! RDF-based ontologies define the structure with publicly available rules and ontologies to make your data even smarter. 5 Built for your servers You can run everything on your own servers, so if you\u2019re dealing with sensitive data there\u2019s no third-party risk. 2 Totally customisable storage Want to use a different database provider? No problem. cognee supports many out of the box (like vector and graph databases), but you can easily plug in your own by following the docs. 4 Actual reasoning (no guessing here!) Instead of just guessing based on patterns, cognee can use real reasoners. You can use existing ones, or build your own for your specific case. 6 Handles loads of data Need to analyse a lot of data? Whether it\u2019s gigabytes (or terabytes :hushed:) cognee\u2019s distributed system can handle it. It scales exactly when you need it to. Success case Increased answer relevancy with more support agents using the tool. Helping Dynamo increase customer engagement Problem Dynamo helps gaming companies interact with their user base. Agents communicate via messenger to offer bonuses and encourage participation in tournaments a",
3454
- image: "https://www.cognee.ai/images/meta/cognee-logo-text-on-gradient.png",
3455
- favicon: "https://www.cognee.ai/favicon.ico"
3456
- },
3457
- {
3458
- id: "https://github.com/AI4WA/Docs2KG",
3459
- title: "GitHub - AI4WA/Docs2KG: Docs2KG: A Human-LLM Collaborative Approach to Unified Knowledge Graph Construction from Heterogeneous Documents",
3460
- url: "https://github.com/AI4WA/Docs2KG",
3461
- publishedDate: "2024-05-08T15:21:54.000Z",
3462
- author: "AI4WA",
3463
- score: 0.36111196875572205,
3464
- text: "Docs2KG \n A Human-LLM Collaborative Approach to Unified Knowledge Graph Construction from Heterogeneous Documents \n \n \n \n \n \n \n Installation \n We have published the package to PyPi: Docs2KG, \n You can install it via: \n pip install Docs2KG\npython -m spacy download en_core_web_sm \n \n \n \n Setup and Tutorial \n Detailed setup and tutorial can be found in the documentation. \n You have two ways to run the package: \n \n import the package in the code, and hook it with your own code \n run the package in the command line \n \n Command Line \n # first setup the CONFIG_FILE environment variable to local one \n export CONFIG_FILE=config.yml # or any other path for the configuration file \ndocs2kg # this command will tell you how to use the package \n # we currently support the following commands \ndocs2kg process-document your_input_file --agent-name phi3.5 --agent-type ollama --project-id your_project_id\ndocs2kg batch-process your_input_dir --agent-name phi3.5 --agent-type ollama --project-id your_project_id\ndocs2kg list-formats # list all the supported formats \n Usage: docs2kg [OPTIONS] COMMAND [ARGS]...\n Docs2KG - Document to Knowledge Graph conversion tool.\n Supports multiple document formats: PDF, DOCX, HTML, and EPUB.\nOptions:\n -c, --config PATH Path to the configuration file (default: ./config.yml)\n --help Show this message and exit.\nCommands:\n batch-process Process all supported documents in a directory.\n list-formats List all supported document formats.\n neo4j Load data to Neo4j database.\n process-document Process a single document file.\n \n Usage: docs2kg process-document [OPTIONS] FILE_PATH\n Process a single document file.\n FILE_PATH: Path to the document file (PDF, DOCX, HTML, or EPUB)\nOptions:\n -p, --project-id TEXT Project ID for the knowledge graph construction\n -n, --agent-name TEXT Name of the agent to use for NER extraction\n -t, --agent-type TEXT Type of the agent to use for NER extraction\n --help Show this message and exit.\n \n Usage: docs2kg neo4j [OPTIONS] PROJECT_ID\n Load data to Neo4j database.\nOptions:\n -m, --mode [import|export|load|docker_start|docker_stop]\n Mode of operation (import or export)\n -u, --neo4j-uri TEXT URI for the Neo4j database\n -U, --neo4j-user TEXT Username for the Neo4j database\n -P, --neo4j-password TEXT Password for the Neo4j database\n -r, --reset_db Reset the database before loading data\n --help \n \n Motivation \n To digest diverse unstructured documents into a unified knowledge graph, there are two main challenges: \n \n How to get the documents to be digitized? \n \n With the dual-path data processing\n \n For image based documents, like scanned PDF, images, etc., we can process them through the layout analysis and\nOCR, etc. Docling and MinerU are focusing on this part. \n For native digital documents, like ebook, docx, html, etc., we can process them through the programming parser \n \n \n It is promising that we will have a robust solution soon. \n \n \n How to construct a high-quality unified knowledge graph with less effort? \n \n Fo",
3465
- image: "https://opengraph.githubassets.com/170da8210f59c1e9bb44ebe1ee84b35e1fd9d3d74d1aec22323534770d4921af/AI4WA/Docs2KG",
3466
- favicon: "https://github.com/fluidicon.png"
3467
- },
3468
- {
3469
- id: "https://github.com/RoboZoom/knowledge_management",
3470
- title: "GitHub - RoboZoom/knowledge_management",
3471
- url: "https://github.com/RoboZoom/knowledge_management",
3472
- publishedDate: "2024-02-08T02:20:22.000Z",
3473
- author: "RoboZoom",
3474
- score: 0.37371376156806946,
3475
- text: "\n \n \n \n \n \n \n \n \n \n \nGitHub Copilot\n \nWrite better code with AI\n \n \n \n \n \n \nGitHub Models\n \nNew\n \n \nManage and compare prompts\n \n \n \n \n \n \nGitHub Advanced Security\n \nFind and fix vulnerabilities\n \n \n \n \n \n \nActions\n \nAutomate any workflow\n \n \n \n \n \n \nCodespaces\n \nInstant dev environments\n \n \n \n \n \n \n \n \n \n \nIssues\n \nPlan and track work\n \n \n \n \n \n \nCode Review\n \nManage code changes\n \n \n \n \n \n \nDiscussions\n \nCollaborate outside of code\n \n \n \n \n \n \nCode Search\n \nFind more, search less\n \n \n \n \n \n \n \n \n \n \n Explore \n \n \nLearning Pathways\n \n \n \nEvents &amp; Webinars\n \n \n \nEbooks &amp; Whitepapers\n \n \n \nCustomer Stories\n \n \n \nPartners\n \n \n \nExecutive Insights\n \n \n \n \n \n \n \n \n \n \n \n \nGitHub Sponsors\n \nFund open source developers\n \n \n \n \n \n \n \n \n \n \nThe ReadME Project\n \nGitHub community articles\n \n \n \n \n \n \n \n \n \n \n \n \n \nEnterprise platform\n \nAI-powered developer platform\n \n \n \n \n \n \n Pricing \n \n \n \n \n \nSign up\n \n \n",
3476
- image: "https://opengraph.githubassets.com/2388498497e355faeecdd0ebc0ae18ac0680ba329b5f7030aa21bc38ddaa6b8b/RoboZoom/knowledge_management",
3477
- favicon: "https://github.com/fluidicon.png"
3478
- },
3479
- {
3480
- id: "https://creati.ai/ai-tools/sciphi/",
3481
- title: "SciPhi: Build, Deploy, and Optimize AI Systems | Creati.ai",
3482
- url: "https://creati.ai/ai-tools/sciphi/",
3483
- publishedDate: "2024-07-01T00:00:00.000Z",
3484
- author: "",
3485
- score: 0.37101393938064575,
3486
- text: "SciPhi simplifies building, deploying, and optimizing Retrieval-Augmented Generation (RAG) systems, empowering developers to focus on AI innovation. Added on: Social &amp; Email: Platform: SciPhi SciPhi simplifies building, deploying, and optimizing Retrieval-Augmented Generation (RAG) systems, empowering developers to focus on AI innovation. Added on: Social &amp; Email: Platform: What is SciPhi? SciPhi is an open-source platform designed to simplify the building, deploying, and scaling of Retrieval-Augmented Generation (RAG) systems. It provides an end-to-end solution for developers, enabling them to focus on AI innovation without worrying about the underlying infrastructure. With tools for automated knowledge graph extraction, document and user management, and robust observability, SciPhi ensures efficient and optimized RAG system deployment. Who will use SciPhi? Developers AI Engineers Data Scientists Tech Startups Research Institutions How to use the SciPhi? Step1: Visit the SciPhi website. Step2: Sign up for an account or log in. Step3: Access the platform's dashboard. Step4: Follow guides to build and deploy your RAG system. Step5: Use tools for knowledge graph extraction and management. Step6: Optimize and monitor your system using provided observability features. SciPhi's Core Features &amp; Benefits The Core Features of SciPhi End-to-End RAG System Deployment Automated Knowledge Graph Extraction Document and User Management Robust Observability Tools The Benefits of SciPhi Simplifies AI Development Speeds Up Deployment Time Enhances System Optimization Reduces Infrastructure Complexity SciPhi's Main Use Cases &amp; Applications Building RAG Systems for AI Applications Deploying Knowledge Graphs Managing Large Document Repositories Optimizing AI System Performance FAQs of SciPhi SciPhi is an open-source platform designed to simplify building, deploying, and optimizing Retrieval-Augmented Generation (RAG) systems. SciPhi is intended for developers, AI engineers, data scientists, tech startups, and research institutions. Core features include end-to-end RAG system deployment, automated knowledge graph extraction, document and user management, and robust observability tools. Visit the SciPhi website, sign up for an account, and follow the guides to build and deploy your RAG system. SciPhi supports web platforms. SciPhi simplifies AI development, speeds up deployment time, enhances system optimization, and reduces infrastructure complexity. Yes, alternatives include LangChain, LlamaIndex, Haystack, and Flower. SciPhi supports building RAG systems for AI applications, deploying knowledge graphs, managing large document repositories, and optimizing AI system performance. You can reach out to their support team via their support email provided on the website. SciPhi offers both free and paid plans. Details on pricing can be found on their website. SciPhi Company Information Website: https://www.sciphi.ai Company Name: SciPhi Support Email: [ema",
3487
- image: "https://cdn-image.creati.ai/ai-tools/product-image/sciphi.webp",
3488
- favicon: "https://cdn-image.creati.ai/image/Creatiai.ico"
3489
- },
3490
- {
3491
- id: "https://helpjuice.com/blog/open-source-knowledge-base",
3492
- title: "The 12 Best Open Source Knowledge Base Software for 2024",
3493
- url: "https://helpjuice.com/blog/open-source-knowledge-base",
3494
- author: "Zeeshan Khan",
3495
- text: "\n \n \n \n \n At Helpjuice / \n \n #Software &amp; Alternatives\n May 15 2025 \n 11m read \n \n \n \n \n On the hunt for the perfect knowledge base software that\u2019s open source? This post will walk you through the best options for your business. \n \n \n \n \n There\u2019s no denying that a knowledge base can make a major impact on your organization.\xA0 Whether it's to help provide better support to your customers or to enable your employees to find the information they need to do their job, a finely-tuned knowledge base can make all the difference when it comes to how knowledge and information flows through your business. And with plenty of options on the market out there, there\u2019s certainly no shortage of open source knowledge base software. But how can you tell you\u2019re not investing time into installing and learning new software that your team won't use anyway? How can you avoid the time and effort put into an open source option that you later determine to not be a good fit for your needs?\xA0 It\u2019s simple\u2014do a little research beforehand. We know, we know\u2014you don\u2019t have endless time to invest in that kind of thing (what with a business to run and all). That\u2019s why we\u2019ve created a helpful list of the must-consider open source knowledge base software that companies of all niches, industries, and sizes should consider.\xA0 We\u2019re even throwing in a little helpful knowledge that should equip you with the information needed to choose the right software for you\u2014like what knowledge base software is in the first place, the benefits of open source software, and how to address your unique needs as a company to choose the right software for you.\xA0 Want to skip ahead on some of the basics of open-source knowledge base software?\xA0 Be our guest.\xA0 The best open source knowledge base software includes: \n BookStack \n OpenKM \n myBase \n eXo \n PHPKB \n Documize \n DocuWiki \n phpMyFAQ \n MediaWiki \n xWiki \n TWiki \n TiddlyWiki \n What is an Open Source Knowledge Base? Before we dive into which open-source knowledge base software you should consider for your business, we should probably ensure we\u2019re on the same page about what exactly open-source knowledge base software is.\xA0 First things first, let\u2019s start with the term knowledge base. A knowledge base is a central place that allows structured storage of information where users can search for and access this information. \xA0Knowledge base software should be the key tool that helps make this process seamless, simplified, and efficient. Knowledge base software is designed to help you create and manage your knowledge base to the best of your ability. this usually includes setting up the knowledge base architecture, creating and editing documentation, searching, and analyzing your knowledge base, and more. Ideally, this is the irreplaceable piece of the puzzle that operates your entire knowledge management system that helps orchestrate, manage, and optimize the flow of knowledge within your organization.\xA0 That part seems pretty clear, right? Next, we\u2019ll move on to",
3496
- image: "https://static.helpjuice.com/helpjuice_production/uploads/upload/image/4752/direct/1636499945090-Open%20Source%20Knowledge%20Base%20Software.jpg",
3497
- favicon: "https://static.helpjuice.com/assets/favicon-32x32-161f2153235b710a8ed7b9233ed6b195936bdb57bf1310e720f7fea79547cf9d.png"
3498
- }
3499
- ],
3500
- costDollars: {
3501
- total: 0.015,
3502
- search: {
3503
- neural: 5e-3
3504
- },
3505
- contents: {
3506
- text: 0.01
3507
- }
3508
- }
3509
- };
3510
-
3511
- // src/functions/exa/data/index.ts
3512
- var SEARCH_RESULTS = [
3513
- exa_search_1748337321991_default,
3514
- exa_search_1748337331526_default,
3515
- exa_search_1748337344119_default
3516
- ];
3517
-
3518
- // src/functions/exa/mock.ts
3519
- var mock_default = defineFunction29({
3520
- key: "dxos.org/function/exa-mock",
3521
- name: "Exa mock",
3522
- description: "Search the web for information",
3523
- inputSchema: Schema34.Struct({
3524
- query: Schema34.String.annotations({
3525
- description: "The query to search for."
3526
- })
3527
- }),
3528
- outputSchema: Schema34.Unknown,
3529
- handler: Effect33.fnUntraced(function* ({ data: { query: query2 } }) {
3530
- const result = SEARCH_RESULTS.reduce((closest, current) => {
3531
- if (!current.autopromptString) {
3532
- return closest;
3533
- }
3534
- if (!closest) {
3535
- return current;
3536
- }
3537
- const dist1 = levenshteinDistance(query2, current.autopromptString);
3538
- const dist2 = levenshteinDistance(query2, closest.autopromptString || "");
3539
- const weight1 = dist1 / Math.max(query2.length, current.autopromptString.length);
3540
- const weight2 = dist2 / Math.max(query2.length, closest.autopromptString?.length || 0);
3541
- return weight1 < weight2 ? current : closest;
3542
- }, null);
3543
- return result;
3544
- })
3545
- });
3546
- var levenshteinDistance = (str1, str2) => {
3547
- const m = str1.length;
3548
- const n = str2.length;
3549
- const dp = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));
3550
- for (let i = 0; i <= m; i++) {
3551
- dp[i][0] = i;
3552
- }
3553
- for (let j = 0; j <= n; j++) {
3554
- dp[0][j] = j;
3555
- }
3556
- for (let i = 1; i <= m; i++) {
3557
- for (let j = 1; j <= n; j++) {
3558
- dp[i][j] = str1[i - 1] === str2[j - 1] ? dp[i - 1][j - 1] : Math.min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
3559
- }
3560
- }
3561
- return dp[m][n];
3562
- };
3563
-
3564
- // src/functions/exa/index.ts
3565
- var ExaFunctions = {
3566
- Search: exa_default,
3567
- Mock: mock_default
3568
- };
3569
-
3570
- // src/toolkits/WebToolkit.ts
3571
- var WebToolkit_exports = {};
3572
- __export(WebToolkit_exports, {
3573
- WebToolkit: () => WebToolkit,
3574
- layer: () => layer3
3575
- });
3576
829
  import * as Tool2 from "@effect/ai/Tool";
3577
- import * as Toolkit4 from "@effect/ai/Toolkit";
3578
- import * as AnthropicTool3 from "@effect/ai-anthropic/AnthropicTool";
3579
- import * as Effect34 from "effect/Effect";
3580
- import * as Schema35 from "effect/Schema";
3581
- var WebToolkit = Toolkit4.make(AnthropicTool3.WebSearch_20250305({}).pipe(), Tool2.make("WebFetch", {
830
+ import * as Toolkit3 from "@effect/ai/Toolkit";
831
+ import * as Effect2 from "effect/Effect";
832
+ import * as Schema2 from "effect/Schema";
833
+ var WebToolkit = Toolkit3.make(AnthropicTool2.WebSearch_20250305({}).pipe(), Tool2.make("WebFetch", {
3582
834
  parameters: {
3583
- url: Schema35.String
835
+ url: Schema2.String
3584
836
  },
3585
- success: Schema35.String
837
+ success: Schema2.String
3586
838
  }));
3587
- var layer3 = WebToolkit.toLayer({
3588
- WebFetch: Effect34.fnUntraced(function* ({ url }) {
3589
- const response = yield* Effect34.promise(() => fetch(url).then((response2) => response2.text()));
839
+ var layer = WebToolkit.toLayer({
840
+ WebFetch: Effect2.fnUntraced(function* ({ url }) {
841
+ const response = yield* Effect2.promise(() => fetch(url).then((response2) => response2.text()));
3590
842
  return response;
3591
843
  })
3592
844
  });
3593
845
  export {
3594
- AgentFunctions,
3595
- blueprint_default9 as BrowserBlueprint,
846
+ AddArtifact,
847
+ Agent_exports as Agent,
848
+ blueprint_default as AgentBlueprint,
849
+ AgentBlueprintHandlers,
850
+ AgentHandlers,
851
+ AgentPrompt,
852
+ AgentRules,
853
+ blueprint_default11 as AgentWizardBlueprint,
854
+ AgentWizardHandlers,
855
+ AgentWorker,
856
+ blueprint_default9 as AutomationBlueprint,
857
+ blueprint_default10 as BlueprintManagerBlueprint,
858
+ BlueprintManagerHandlers,
859
+ blueprint_default6 as BrowserBlueprint,
3596
860
  Chat_exports as Chat,
3597
- blueprint_default10 as DatabaseBlueprint,
3598
- DatabaseFunctions,
3599
- blueprint_default2 as DesignBlueprint,
3600
- blueprint_default3 as DiscordBlueprint,
3601
- EntityExtractionFunctions,
3602
- ExaFunctions,
3603
- blueprint_default5 as LinearBlueprint,
861
+ ContextAdd,
862
+ ContextRemove,
863
+ CreateAgent,
864
+ blueprint_default7 as DatabaseBlueprint,
865
+ DatabaseHandlers,
866
+ Load as DatabaseLoad,
867
+ Query as DatabaseQuery,
868
+ DeleteMemory,
869
+ blueprint_default2 as DiscordBlueprint,
870
+ DiscordHandlers,
871
+ EnableBlueprints,
872
+ FetchMessages,
873
+ GetContext,
874
+ blueprint_default3 as LinearBlueprint,
875
+ LinearHandlers,
3604
876
  LocalSearchHandler,
3605
877
  LocalSearchToolkit,
3606
- blueprint_default as MarkdownBlueprint,
3607
- MarkdownFunctions,
878
+ McpServer_exports as McpServer,
879
+ Memory_exports as Memory,
880
+ blueprint_default8 as MemoryBlueprint,
881
+ MemoryHandlers,
882
+ ObjectCreate,
883
+ ObjectDelete,
884
+ ObjectUpdate,
3608
885
  Plan_exports as Plan,
3609
- blueprint_default6 as PlanningBlueprint,
3610
- Project_exports as Project,
3611
- blueprint_default4 as ProjectBlueprint,
3612
- ProjectFunctions,
3613
- blueprint_default7 as ResearchBlueprint,
3614
- ResearchDataTypes,
3615
- ResearchGraph_exports as ResearchGraph,
886
+ blueprint_default4 as PlanningBlueprint,
887
+ PlanningHandlers,
888
+ UpdateTasks as PlanningUpdateTasks,
889
+ Qualifier,
890
+ QueryBlueprints,
891
+ QueryMemories,
892
+ RelationCreate,
893
+ RelationDelete,
894
+ SaveMemory,
895
+ SchemaAdd,
896
+ SchemaList,
3616
897
  Subgraph,
3617
- blueprint_default8 as WebSearchBlueprint,
898
+ SyncIssues,
899
+ SyncTriggers,
900
+ TagAdd,
901
+ TagRemove,
902
+ blueprint_default5 as WebSearchBlueprint,
903
+ Fetch as WebSearchFetch,
904
+ WebSearchHandlers,
3618
905
  WebSearchToolkit,
906
+ WebSearchToolkitOpaque,
3619
907
  WebToolkit_exports as WebToolkit,
3620
908
  createExtractionSchema,
3621
909
  findRelatedSchema,