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

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-XDFUXRY5.mjs +30 -0
  2. package/dist/lib/neutral/add-artifact-XDFUXRY5.mjs.map +7 -0
  3. package/dist/lib/neutral/agent-6OHUAIA2.mjs +65 -0
  4. package/dist/lib/neutral/agent-6OHUAIA2.mjs.map +7 -0
  5. package/dist/lib/neutral/chunk-4T3LJGXI.mjs +76 -0
  6. package/dist/lib/neutral/chunk-4T3LJGXI.mjs.map +7 -0
  7. package/dist/lib/neutral/chunk-CVUA23QI.mjs +332 -0
  8. package/dist/lib/neutral/chunk-CVUA23QI.mjs.map +7 -0
  9. package/dist/lib/neutral/chunk-EJAQUAKM.mjs +73 -0
  10. package/dist/lib/neutral/chunk-EJAQUAKM.mjs.map +7 -0
  11. package/dist/lib/neutral/chunk-GSG4JGIY.mjs +100 -0
  12. package/dist/lib/neutral/chunk-GSG4JGIY.mjs.map +7 -0
  13. package/dist/lib/neutral/chunk-JN4GARRQ.mjs +53 -0
  14. package/dist/lib/neutral/chunk-JN4GARRQ.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-P5LAPHCG.mjs +140 -0
  20. package/dist/lib/neutral/chunk-P5LAPHCG.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-SVI25Z2Y.mjs +293 -0
  22. package/dist/lib/neutral/chunk-SVI25Z2Y.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-VSDP6SRY.mjs +74 -0
  24. package/dist/lib/neutral/chunk-VSDP6SRY.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-WIV7ZVRS.mjs +109 -0
  26. package/dist/lib/neutral/chunk-WIV7ZVRS.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-YSYNXOZA.mjs +68 -0
  30. package/dist/lib/neutral/chunk-YSYNXOZA.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-YXOVSRFU.mjs +70 -0
  32. package/dist/lib/neutral/chunk-YXOVSRFU.mjs.map +7 -0
  33. package/dist/lib/neutral/context-add-IIDPRRVB.mjs +22 -0
  34. package/dist/lib/neutral/context-add-IIDPRRVB.mjs.map +7 -0
  35. package/dist/lib/neutral/context-remove-RDYV4PD4.mjs +22 -0
  36. package/dist/lib/neutral/context-remove-RDYV4PD4.mjs.map +7 -0
  37. package/dist/lib/neutral/create-project-MPAMKQ3T.mjs +36 -0
  38. package/dist/lib/neutral/create-project-MPAMKQ3T.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-LELPQHY5.mjs +48 -0
  42. package/dist/lib/neutral/enable-blueprints-LELPQHY5.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-OS74FP76.mjs +140 -0
  46. package/dist/lib/neutral/fetch-messages-OS74FP76.mjs.map +7 -0
  47. package/dist/lib/neutral/get-context-JRTOOA5O.mjs +35 -0
  48. package/dist/lib/neutral/get-context-JRTOOA5O.mjs.map +7 -0
  49. package/dist/lib/neutral/index.mjs +572 -3294
  50. package/dist/lib/neutral/index.mjs.map +4 -4
  51. package/dist/lib/neutral/load-LI7HHVD6.mjs +17 -0
  52. package/dist/lib/neutral/load-LI7HHVD6.mjs.map +7 -0
  53. package/dist/lib/neutral/meta.json +1 -1
  54. package/dist/lib/neutral/object-create-52Z7YKIA.mjs +35 -0
  55. package/dist/lib/neutral/object-create-52Z7YKIA.mjs.map +7 -0
  56. package/dist/lib/neutral/object-delete-I266YAXI.mjs +18 -0
  57. package/dist/lib/neutral/object-delete-I266YAXI.mjs.map +7 -0
  58. package/dist/lib/neutral/object-update-HY4GI7LA.mjs +28 -0
  59. package/dist/lib/neutral/object-update-HY4GI7LA.mjs.map +7 -0
  60. package/dist/lib/neutral/project-JAU3A7AX.mjs +23 -0
  61. package/dist/lib/neutral/project-JAU3A7AX.mjs.map +7 -0
  62. package/dist/lib/neutral/project-rules-FLUQQRPB.mjs +78 -0
  63. package/dist/lib/neutral/project-rules-FLUQQRPB.mjs.map +7 -0
  64. package/dist/lib/neutral/prompt-4UMXX6QU.mjs +169 -0
  65. package/dist/lib/neutral/prompt-4UMXX6QU.mjs.map +7 -0
  66. package/dist/lib/neutral/qualifier-7BUCOEKK.mjs +88 -0
  67. package/dist/lib/neutral/qualifier-7BUCOEKK.mjs.map +7 -0
  68. package/dist/lib/neutral/query-B3NOYFCK.mjs +70 -0
  69. package/dist/lib/neutral/query-B3NOYFCK.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-Z576ABT5.mjs +17 -0
  73. package/dist/lib/neutral/query-blueprints-Z576ABT5.mjs.map +7 -0
  74. package/dist/lib/neutral/relation-create-Z3NGW4VU.mjs +34 -0
  75. package/dist/lib/neutral/relation-create-Z3NGW4VU.mjs.map +7 -0
  76. package/dist/lib/neutral/relation-delete-LXY7W2YO.mjs +18 -0
  77. package/dist/lib/neutral/relation-delete-LXY7W2YO.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-4TXJO2V7.mjs +24 -0
  81. package/dist/lib/neutral/schema-add-4TXJO2V7.mjs.map +7 -0
  82. package/dist/lib/neutral/schema-list-Q7HRRKGR.mjs +39 -0
  83. package/dist/lib/neutral/schema-list-Q7HRRKGR.mjs.map +7 -0
  84. package/dist/lib/neutral/sync-issues-A2RJNPEF.mjs +167 -0
  85. package/dist/lib/neutral/sync-issues-A2RJNPEF.mjs.map +7 -0
  86. package/dist/lib/neutral/sync-triggers-NV4JCRN5.mjs +137 -0
  87. package/dist/lib/neutral/sync-triggers-NV4JCRN5.mjs.map +7 -0
  88. package/dist/lib/neutral/tag-add-5NOHUTIE.mjs +19 -0
  89. package/dist/lib/neutral/tag-add-5NOHUTIE.mjs.map +7 -0
  90. package/dist/lib/neutral/tag-remove-QTKYDJAW.mjs +19 -0
  91. package/dist/lib/neutral/tag-remove-QTKYDJAW.mjs.map +7 -0
  92. package/dist/lib/neutral/testing/index.mjs +8 -13
  93. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  94. package/dist/lib/neutral/update-blueprints-K7A5SHBZ.mjs +17 -0
  95. package/dist/lib/neutral/update-blueprints-K7A5SHBZ.mjs.map +7 -0
  96. package/dist/lib/neutral/update-tasks-UGGHWXT5.mjs +46 -0
  97. package/dist/lib/neutral/update-tasks-UGGHWXT5.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 +60 -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 +36 -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 +27 -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 +5 -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 +16 -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 +4 -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 +8 -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 +5 -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 +7 -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 +5 -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 +52 -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 +97 -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 +2 -2
  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 +61 -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 +18 -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 +26 -31
  285. package/src/blueprints/automation/blueprint.ts +107 -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 +199 -0
  289. package/src/blueprints/blueprint-manager/blueprint.ts +49 -0
  290. package/src/blueprints/blueprint-manager/functions/definitions.ts +58 -0
  291. package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +44 -0
  292. package/src/blueprints/blueprint-manager/functions/index.ts +13 -0
  293. package/src/blueprints/blueprint-manager/functions/query-blueprints.ts +19 -0
  294. package/src/blueprints/blueprint-manager/functions/update-blueprints.ts +19 -0
  295. package/src/blueprints/blueprint-manager/index.ts +6 -0
  296. package/src/blueprints/browser/blueprint.test.ts +22 -30
  297. package/src/blueprints/browser/blueprint.ts +4 -5
  298. package/src/blueprints/database/blueprint.conversations.json +1 -1
  299. package/src/blueprints/database/blueprint.test.ts +309 -98
  300. package/src/blueprints/database/blueprint.ts +36 -9
  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 +27 -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 +5 -10
  318. package/src/blueprints/discord/functions/definitions.ts +71 -0
  319. package/src/blueprints/discord/functions/fetch-messages.test.ts +15 -25
  320. package/src/blueprints/discord/functions/fetch-messages.ts +98 -151
  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 +27 -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 +5 -10
  329. package/src/blueprints/linear/functions/definitions.ts +24 -0
  330. package/src/blueprints/linear/functions/index.ts +4 -4
  331. package/src/blueprints/linear/functions/linear.test.ts +8 -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 +245 -109
  350. package/src/blueprints/project/blueprint.ts +20 -24
  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 +33 -0
  360. package/src/blueprints/project-wizard/functions/definitions.ts +64 -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 +159 -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 +3 -3
  376. package/src/errors.ts +25 -0
  377. package/src/functions/agent/definitions.ts +53 -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 +83 -0
  381. package/src/functions/agent/prompt.ts +211 -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 +239 -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
@@ -0,0 +1,77 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+ import { trim } from '@dxos/util';
9
+
10
+ import { AgentRules } from './definitions';
11
+
12
+ export default AgentRules.pipe(
13
+ Operation.withHandler(
14
+ Effect.fnUntraced(function* () {
15
+ return trim`
16
+ You can ask the user for qualifying questions about the agents.
17
+ If agents should actively read incoming emails, query for mailboxes and add a subscription to them.
18
+ If the user wants the agent to run on a schedule (e.g. "every morning", "every 5 minutes"), set the agent's \`cron\` field to a standard cron expression (e.g. \`0 9 * * *\` for daily at 09:00, \`*/5 * * * *\` for every 5 minutes). Timer triggers bypass the qualifier and invoke the agent worker directly on the schedule.
19
+ Use [query-blueprints] from the Blueprint Manager to query for available blueprints and their keys.
20
+ Use [create-agent] function to create a new agent.
21
+
22
+ Notable blueprints (query to get their keys):
23
+
24
+ - Blueprint Manger - allows agent to self-enable blueprints (always include this one).
25
+ - Database -- CRUD on objects in the ECHO database.
26
+ - Markdown -- Create and edit markdown documents.
27
+ - Websearch -- Search the web for information.
28
+ - Browser -- Virtual browser via playwright when simple WebSearch is not enough.
29
+ - Memory -- Memory to store and retrieve information.
30
+
31
+ Experimental blueprints that are discouraged:
32
+
33
+ - Research
34
+ - Design
35
+ - Agent (not wizard) -- those are agent internals, they are auto-added to every new agent.
36
+
37
+ <example_agent>
38
+ ## CRM from your inbox
39
+
40
+ Blueprints: database, websearch, browser
41
+
42
+ Subscribe to your inboxes.
43
+ Spec says that on every email we should extract People and Organizations and save them to the database, but first query the database for existing people and organizations to avoid duplicates.
44
+ Also run a quick research on the web to find more information about the person or organization and save it to the database.
45
+ </example_agent>
46
+
47
+ <example_agent>
48
+ ## Parcel tracking
49
+
50
+ Blueprints: database
51
+
52
+ Based on emails from vendors (amazon, fedex, etc.) track the status of the parcels ordered online and keep a table of orders.
53
+
54
+ Before creating an agent, use the Database blueprint to create an Order schema:
55
+ - seller
56
+ - name
57
+ - price
58
+ - status (enum of: pending, shipped, waiting for pickup, delivered, cancelled, returned)
59
+ - tracking numbers/notes
60
+ - date of delivery
61
+ - shipping address
62
+ </example_agent>
63
+
64
+ <example_agent>
65
+ ## Comms assistant
66
+
67
+ Blueprints: database, markdown, inbox
68
+
69
+ Helps user maintain comms with external parites via email.
70
+ Ask user specifically who they want to communicate with and on what topic.
71
+ Agent should keep a markdown document in artifacts outlining the current state of the comms.
72
+ Agent should propose drafts to follow up on the comms. Only propose sensible drafts, do not propose drafts that are not relevant or actionable.
73
+ </example_agent>
74
+ `;
75
+ }),
76
+ ),
77
+ );
@@ -0,0 +1,159 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Option from 'effect/Option';
7
+
8
+ import { Trigger } from '@dxos/compute';
9
+ import { Operation } from '@dxos/compute';
10
+ import { Database, Feed, Filter, Obj, Ref } from '@dxos/echo';
11
+ import { FeedAnnotation } from '@dxos/schema';
12
+
13
+ import { Agent } from '../../../types';
14
+ import { SyncTriggers } from './definitions';
15
+
16
+ export default SyncTriggers.pipe(
17
+ Operation.withHandler(
18
+ Effect.fn(function* ({ agent: agentRef }) {
19
+ const agent = yield* Database.load(agentRef);
20
+ yield* syncAgentTriggers(agent);
21
+ }),
22
+ ),
23
+ );
24
+
25
+ /**
26
+ * Foreign key {@link AGENT_TRIGGER_EXTENSION_KEY} => <agent id : ObjectId>.
27
+ */
28
+ const AGENT_TRIGGER_EXTENSION_KEY = 'org.dxos.extension.AgentTrigger';
29
+
30
+ /**
31
+ * Foreign key {@link AGENT_TRIGGER_TARGET_EXTENSION_KEY} => <dxn string of subscription target>.
32
+ */
33
+ const AGENT_TRIGGER_TARGET_EXTENSION_KEY = 'org.dxos.extension.AgentTriggerTarget';
34
+
35
+ /** Checks if an object's schema has the FeedAnnotation. */
36
+ const hasFeedAnnotation = (obj: Obj.Unknown): boolean => {
37
+ const schema = Obj.getSchema(obj);
38
+ if (!schema) {
39
+ return false;
40
+ }
41
+ const annotation = FeedAnnotation.get(schema);
42
+ return Option.isSome(annotation) && annotation.value === true;
43
+ };
44
+
45
+ /**
46
+ * Syncs triggers in the database with the agent subscriptions.
47
+ */
48
+ const syncAgentTriggers = (agent: Agent.Agent): Effect.Effect<void, never, Database.Service> =>
49
+ Effect.gen(function* () {
50
+ const triggers = yield* Database.runQuery(
51
+ Filter.foreignKeys(Trigger.Trigger, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),
52
+ );
53
+
54
+ // Remove all existing triggers — they will be recreated with the current config.
55
+ // This ensures operation, concurrency, and enabled stay in sync when agent fields change.
56
+ for (const trigger of triggers) {
57
+ yield* Database.remove(trigger);
58
+ }
59
+
60
+ const triggersEnabled = agent.enabled ?? true;
61
+
62
+ // Lazy import to avoid circular dependency issues.
63
+ const { Qualifier, AgentWorker } = yield* Effect.promise(() => import('../../project'));
64
+
65
+ for (const subscription of agent.subscriptions) {
66
+ const targetOption = yield* Database.loadOption(subscription);
67
+ if (Option.isNone(targetOption)) {
68
+ continue;
69
+ }
70
+ const target = targetOption.value;
71
+
72
+ let feedObj: Feed.Feed | undefined;
73
+ if (Obj.instanceOf(Feed.Feed, target)) {
74
+ feedObj = target;
75
+ } else if (hasFeedAnnotation(target)) {
76
+ const feedRef = (target as Obj.Unknown & { feed?: Ref.Ref<Feed.Feed> }).feed;
77
+ feedObj = feedRef ? Option.getOrUndefined(yield* Database.loadOption(feedRef)) : undefined;
78
+ }
79
+
80
+ const queueDxn = Option.fromNullable(feedObj).pipe(
81
+ Option.filter(Obj.instanceOf(Feed.Feed)),
82
+ Option.map(Feed.getQueueDxn),
83
+ Option.getOrUndefined,
84
+ );
85
+ if (!queueDxn) {
86
+ continue;
87
+ }
88
+
89
+ const filterEvents = agent.filterEvents ?? true;
90
+
91
+ yield* Database.add(
92
+ Trigger.make({
93
+ [Obj.Parent]: agent,
94
+ [Obj.Meta]: {
95
+ keys: [
96
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
97
+ { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: subscription.dxn.toString() },
98
+ ],
99
+ },
100
+ enabled: triggersEnabled,
101
+ spec: Trigger.specQueue(queueDxn.toString()),
102
+ function: Ref.make(Operation.serialize(filterEvents ? Qualifier : AgentWorker)),
103
+ input: {
104
+ agent: Ref.make(agent),
105
+ event: '{{event}}',
106
+ },
107
+ concurrency: filterEvents ? 5 : undefined,
108
+ }),
109
+ );
110
+ }
111
+
112
+ if ((agent.filterEvents ?? true) && agent.queue) {
113
+ yield* Database.add(
114
+ Trigger.make({
115
+ [Obj.Parent]: agent,
116
+ [Obj.Meta]: {
117
+ keys: [
118
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
119
+ {
120
+ source: AGENT_TRIGGER_TARGET_EXTENSION_KEY,
121
+ id: Obj.getDXN(agent)?.toString() ?? '',
122
+ },
123
+ ],
124
+ },
125
+ function: Ref.make(Operation.serialize(AgentWorker)),
126
+ enabled: triggersEnabled,
127
+ spec: Trigger.specQueue(agent.queue.dxn.toString()),
128
+ input: {
129
+ agent: Ref.make(agent),
130
+ event: '{{event}}',
131
+ },
132
+ }),
133
+ );
134
+ }
135
+
136
+ // Timer trigger bypasses the qualifier and invokes the agent worker directly on a schedule.
137
+ if (agent.cron) {
138
+ yield* Database.add(
139
+ Trigger.make({
140
+ [Obj.Parent]: agent,
141
+ [Obj.Meta]: {
142
+ keys: [
143
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
144
+ { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: `timer:${agent.cron}` },
145
+ ],
146
+ },
147
+ enabled: triggersEnabled,
148
+ spec: Trigger.specTimer(agent.cron),
149
+ function: Ref.make(Operation.serialize(AgentWorker)),
150
+ input: {
151
+ agent: Ref.make(agent),
152
+ event: '{{event}}',
153
+ },
154
+ }),
155
+ );
156
+ }
157
+
158
+ yield* Database.flush();
159
+ });
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { default as AgentWizardBlueprint } from './blueprint';
6
+ export { AgentRules, CreateAgent, SyncTriggers, AgentWizardHandlers } from './functions';
@@ -7,41 +7,25 @@ import * as Effect from 'effect/Effect';
7
7
  import { pipe } from 'effect/Function';
8
8
 
9
9
  import { ConsolePrinter } from '@dxos/ai';
10
- import {
11
- AiContextService,
12
- type AiConversation,
13
- type AiConversationRunProps,
14
- GenerationObserver,
15
- } from '@dxos/assistant';
16
- import type { Blueprint } from '@dxos/blueprints';
10
+ import { AiContextService, type AiSession, type AiSessionRunProps, GenerationObserver } from '@dxos/assistant';
11
+ import type { Definition } from '@dxos/compute';
17
12
  import { Database, Ref } from '@dxos/echo';
18
- import { type FunctionDefinition } from '@dxos/functions';
19
13
  import { log } from '@dxos/log';
20
14
 
21
- export type TestStep = Pick<AiConversationRunProps, 'prompt' | 'system'> & {
15
+ export type TestStep = Pick<AiSessionRunProps, 'prompt' | 'system'> & {
22
16
  test?: () => Promise<void>;
23
17
  };
24
18
 
25
- /**
26
- * Blueprint definition type for testing.
27
- * Mirrors AppCapabilities.BlueprintDefinition to avoid circular dependency with app-toolkit.
28
- */
29
- export interface BlueprintDefinition {
30
- key: string;
31
- functions: FunctionDefinition.Any[];
32
- make: () => Blueprint.Blueprint;
33
- }
34
-
35
19
  /**
36
20
  * Runs the prompt steps, calling the test function after each step.
37
21
  */
38
- export const runSteps = Effect.fn(function* (conversation: AiConversation, steps: TestStep[]) {
22
+ export const runSteps = Effect.fn(function* (session: AiSession, steps: TestStep[]) {
39
23
  for (const { test, ...props } of steps) {
40
- yield* conversation.createRequest({
24
+ yield* session.createRequest({
41
25
  ...props,
42
26
  observer: GenerationObserver.fromPrinter(new ConsolePrinter({ mode: 'json' })),
43
27
  });
44
- const messages = yield* Effect.promise(() => conversation.getHistory());
28
+ const messages = yield* Effect.promise(() => session.getHistory());
45
29
  log.info('conversation', { messages });
46
30
  if (test) {
47
31
  yield* Effect.promise(() => test());
@@ -53,7 +37,7 @@ export const runSteps = Effect.fn(function* (conversation: AiConversation, steps
53
37
  * Binds blueprints from the blueprint definitions.
54
38
  */
55
39
  // TODO(dmaretskyi): Potentially the agent will auto-bind the blueprints.
56
- export const addBlueprints = Effect.fnUntraced(function* (blueprints: BlueprintDefinition[]) {
40
+ export const addBlueprints = Effect.fnUntraced(function* (blueprints: Definition[]) {
57
41
  yield* AiContextService.bindContext({
58
42
  blueprints: yield* pipe(
59
43
  blueprints,
@@ -0,0 +1 @@
1
+ {"conversations":[{"parameters":{"model":"@anthropic/claude-opus-4-6","stream":true,"tools":[{"name":"fetch-web-page","description":"Fetches the content of a web page and returns the HTML. \nUse this to get the content of a web page.","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The URL of the web page to fetch."}},"additionalProperties":false}},{"name":"AnthropicWebSearch","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"## Blueprints Definitions\n\n<blueprint>\n \n</blueprint>","options":{}},{"role":"user","content":"What is the capital of France? Make sure to use the web search tool.","options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01Ufv8pJb6Ry13g4beHHysCX","modelId":"claude-opus-4-6","timestamp":"2026-05-03T07:29:41.725Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" user asks about the capital of France and explicitly requests that I use the web search tool.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"EpwCClkIDRgCKkCBvqhrPFMZB5TfUfcYt+kCmxoxEqUqP0UaKJNoyxPFKS3GJDd6oIltLwVk6WAYhGg+D0SFW/tTfnAGumqpRid3Mg9jbGF1ZGUtb3B1cy00LTY4ABIM7kkTv8a+fLu1H851GgyTNyFVjW6kby7Iw6ciMBbCrJ92V0tMo+8J+EJmYzKOTayz/3BTcuumOirvlqc1Y4puzThpfSRgHgGEBgggUSpxsVT3GERrlGtE2piT8zLuDIJA7Zx3P0rYhSxh2rAyPsNxwhAMP+8HDsg00PmBeJoq5cjNFO/NUUoKYF5Lj8+gmU7Ng4lFzx9beUBAeGj6GrVwX2atvx5DDNhVufTPUv3BNc/UthgmSqSdIg20OhmBXbEYAQ=="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","name":"AnthropicWebSearch","providerName":"web_search","providerExecuted":true,"metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"{\"query\": \"c","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"apital ","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"of France\"}","metadata":{}},{"type":"tool-params-end","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","metadata":{}},{"id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","type":"tool-result","providerName":"web_search","isFailure":false,"name":"AnthropicWebSearch","result":[{"encrypted_content":"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","page_age":"1 week ago","title":"Paris - Wikipedia","type":"web_search_result","url":"https://en.wikipedia.org/wiki/Paris"},{"encrypted_content":"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","page_age":"March 10, 2026","title":"List of capitals of France - Wikipedia","type":"web_search_result","url":"https://en.wikipedia.org/wiki/List_of_capitals_of_France"},{"encrypted_content":"EoAICioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDAum2h1ewx1dNU64ShoMcbvhMhUZAiJfoNAlIjDYwjFq1KNEShN65jhPG43By43OXUiqeLEB61K1VfR39asZ8fpl1JmbNBZK56pLpzUqgwf+UgPDhc7yqgkew7fiW8/j0H8xrc5my4gXfbSqaFN4qtonMZ/8Bcau9xwB9KV8CaY/MuIUJ6qbMeRGjjsEIxrx+O7exa5Gz9S1nMPc73VWCS/sElVFf5XLevMuUz21Gm6GfgxgJgZgAh5/tlIgYtcoBkIvEqdxDadjJ/ZmiLgTy3L0BXE4jl0jJ+Sk9B5f7JoG9Ihz8BidsUwIL+fQ/ytQsbfnEm0BkRyuoJ7p1o0y59Z0LMQvYGG/H/uX/AsSQDFd5dmS6sS9yqoi9i1+UmBUM/JfQWAB/D7IvLb/FxEcfPytP8BXDeQfmZCDYK1CRP5NyCeeYpjE/qAoFnE1qTCH52PCoHhSVjhAnGQzymQx897S2Ap84HlCJB9z5Y+bmO1FmwKS4uZrBvf/PX9pHaehBu3wMf2QK6HwJ+ASSmATQ/I3coCFkcOnby+LkZ0/ipUojvwIyVMzhgYW2MgXZjfcsLCudzSgxtWeJpXXIfUkGZBsby6fIoyTecVUZToe4rdjghgIrHsucj7jy20q6aDvOtD25RV4TV6P75iLUxUVwdi28Ebz/7Zlkn8RB2dbiTFdzPsaXTPD2caQ9bEZUyXj4HoNaDYLx42nG3m4XQfvdx5XguGEuc/xgrels8sVuwDBJrvt9OG4dpn7hPhH8skAu6InieYK/MCxxAMx/DFql1v+Mu14tfMjLpdnfpa67HDHKW1WnfXmFM/WHs0Lu78IV0Kp/Uvk4CxoXDz5GfAst880btTRJrPTRasuTszpQBEn2N2EfpGEMjRTb7O2K83ZB8Xmo1OD8eIITzjH6T1JQLaattY6uapmkU55cU2LPGsW7nA63Yd2wywXs5Q8OZVcAmZAis/vM6T6zB+Ux+IORRruxzqoU5wVrP6qrhurRr62fA01m8zooMEmObpkiwVfCNJdNo6z9/zcL53p7rc4ZauOCRoBb2qOdahNdfEu2jIqSgeJ9QcuNW3vrjv8gmiJnkjUCucTfQT1+iWY9S9I0ATQYZzXLtIfK/G7DIrrPyLutTjbSyccvjKRAdUvFo3CNuWiaDSio3hmIHZu/teSCSFwIuKSsLm7ov8ABxCqtYy4/gxZqCu8jWDxjTgsvcYHaaagMQyxBCAL+MJV95Z7x0Po35D6taA4bpIU2Tx8JNfvdbHWcCyuQVrfKMrl9NeAo3PMMCPqvlp7zJijEHErb4toSBgD","title":"Paris facts: the capital of France in history","type":"web_search_result","url":"https://home.adelphi.edu/~ca19535/page%204.html"},{"encrypted_content":"EsQDCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDBcG83g2FtNB/uwNohoMqELMWCCeD4apzlNhIjCRPBxmh6AFZGv+/5HpnuOIX2DoImS7YkyIP8iCg6+grehTkp8pDCrQnpVpzMb8xFAqxwId2pU6hDCGIf86pdIVgvHNdhMiYgByM6E5HLBWnQKOfnJdSRBH1ozvzSimt+tCe4SDBmYMcxYJIfiQcWGhTQbt6kBMf3r5CCHmDF+dbnrMOsWtBwPgj7lWeoXaz7aoeUYNqt2QN3NjWQdMbdsML2arloqAnEHi8QfhpmKJOAwX8AeOGIbcWch5xTCEYb+HNczf4ZF2kO17WwWvPsOYUDFHij3/WhiGNr1+3KWi2I3ia8nfTaiZVa45EECHJcWAs+VWEWtXozGyg9+l/S2f0hH3gEoBcR1OTm6YIjhJepId2TK3ycqiNKEK8pBVlTe1XLjVs4hNd+XOgsZdQVVanFg+AD/fUOk2vtcxNp1d9cPw6yZcX1iXNB+H7v1JLOB4hu3C+cEZKqYz7gT0y3lbvPoX+CUzeAsTAohcsoiUWh0r0hZxu3GmExIYAw==","page_age":"September 16, 2025","title":"Paris, France - Intercultural City - Intercultural Cities Programme - www.coe.int","type":"web_search_result","url":"https://www.coe.int/en/web/interculturalcities/paris"},{"encrypted_content":"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","page_age":"3 days ago","title":"France | History, Maps, Flag, Population, Cities, Capital, & Facts | Britannica","type":"web_search_result","url":"https://www.britannica.com/place/France"},{"encrypted_content":"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","page_age":"December 1, 2022","title":"Discover the city of Paris | Paris the capital city of France","type":"web_search_result","url":"https://www.cia-france.com/french-kids-teenage-courses/paris-school/visit-paris"},{"encrypted_content":"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","page_age":"5 days ago","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","type":"web_search_result","url":"https://www.britannica.com/place/Paris"},{"encrypted_content":"EsUBCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDBeutxYXKz1s7fTLSBoMeijqoaep3kNwVyCxIjC1Krrs8T1CsAJD8JiVx2S7Aes8fjfaltJk3wpDPUFyXq4PgmbAXjkYF/a6PVSHf+QqSaAthG5JnYOuPsavT38Ia7YHlAxZF5QiDHUi1ztOvDkhRQwh+ucuqp4r7BIqtlRZC+lNQtxTy6NnHTbSiMxdPnuY8MC/DtytOjsYAw==","title":"Paris 🇫🇷, the capital and largest city of France, is located in ...","type":"web_search_result","url":"https://www.facebook.com/61551442420211/posts/paris-the-capital-and-largest-city-of-france-is-located-in-the-northern-part-of-/122180773544048080/"},{"encrypted_content":"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","page_age":"November 28, 2024","title":"What is the capital of France? Overview of Paris/","type":"web_search_result","url":"https://www.iroamly.com/france-travel/what-is-the-capital-of-france.html"},{"encrypted_content":"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","title":"Facts About France | Map, Population & Capital | Study.com","type":"web_search_result","url":"https://study.com/academy/lesson/facts-about-france-location-population-history.html"}],"providerExecuted":true,"metadata":{}},{"type":"text-start","id":"3","metadata":{}},{"type":"text-delta","id":"3","delta":"The","metadata":{}},{"type":"text-delta","id":"3","delta":" capital of France is **Paris**. ","metadata":{}},{"type":"text-end","id":"3","metadata":{}},{"type":"text-start","id":"4","metadata":{}},{"type":"source","sourceType":"url","id":"id_fwUBOLBrWwcuyNqK","url":"https://en.wikipedia.org/wiki/Paris","title":"Paris - Wikipedia","metadata":{"anthropic":{"source":"url","citedText":"Paris is the capital and largest city of France, with an estimated city population of 2.04 million in an area of 105.4 km2 (40.7 sq mi), and a metropo...","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDPEDmYObIs3O1MRjthoMX0x7AqyA5zzr6ui/IjDPs2o+gZrKct/MV8yKk9lxe+xK5xB8vqmppkPa4bUeUYkb3uidb1LnF6+sCgUEPOQqEy8MiG6rWIWTJXdBrQ0RrtxUjwkYBA=="}}},{"type":"text-delta","id":"4","delta":"Paris is the capital and largest city of France,","metadata":{}},{"type":"text-delta","id":"4","delta":" with an estimated city population of 2.04 million and a metropolitan population","metadata":{}},{"type":"text-delta","id":"4","delta":" of 13.2 million.","metadata":{}},{"type":"text-end","id":"4","metadata":{}},{"type":"text-start","id":"5","metadata":{}},{"type":"text-delta","id":"5","delta":" ","metadata":{}},{"type":"text-end","id":"5","metadata":{}},{"type":"text-start","id":"6","metadata":{}},{"type":"source","sourceType":"url","id":"id_EmhrrcqHK3Ln29Oi","url":"https://www.britannica.com/place/Paris","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","metadata":{"anthropic":{"source":"url","citedText":"Paris, city and capital of France, located along the Seine River, in the north-central part of the country. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDFT2x0eMuJ2+mrhpzxoM9qih2j2EUr9ZoqGfIjDhNqItV+C8pt9vmjzhN8h+vEavYAEF1uzX8iql8MWgarlK7njWhemgqMhFCP/io2YqE529/WSIr5GXr0cgip6TAXRwzzQYBA=="}}},{"type":"text-delta","id":"6","delta":"It is situated along","metadata":{}},{"type":"text-delta","id":"6","delta":" the Seine River, in the north-central part of the country.","metadata":{}},{"type":"text-end","id":"6","metadata":{}},{"type":"text-start","id":"7","metadata":{}},{"type":"text-delta","id":"7","delta":"\n\n","metadata":{}},{"type":"text-end","id":"7","metadata":{}},{"type":"text-start","id":"8","metadata":{}},{"type":"source","sourceType":"url","id":"id_M8JykQskNEW0NWW0","url":"https://en.wikipedia.org/wiki/List_of_capitals_of_France","title":"List of capitals of France - Wikipedia","metadata":{"anthropic":{"source":"url","citedText":"The capital of France has been Paris since its liberation in 1944. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDD56zsiLaXCYCfT+rxoM2+R8f8hQNHfgvJgGIjC8spp5wvgU6ok7eHxmKtNp2cTVsujrWbL8ea9TdX43PGTtK6rgsdYTxuKBGVLf9r0qE30VvwZZrucC4RJrDl2lFgSVguoYBA=="}}},{"type":"text-delta","id":"8","delta":"Paris has been","metadata":{}},{"type":"text-delta","id":"8","delta":" the capital of France since its liberation in 1944","metadata":{}},{"type":"text-end","id":"8","metadata":{}},{"type":"text-start","id":"9","metadata":{}},{"type":"text-delta","id":"9","delta":", though its history as","metadata":{}},{"type":"text-delta","id":"9","delta":" the French capital goes back much further. ","metadata":{}},{"type":"text-end","id":"9","metadata":{}},{"type":"text-start","id":"10","metadata":{}},{"type":"source","sourceType":"url","id":"id_RKtjkhfDCb6xTpdL","url":"https://home.adelphi.edu/~ca19535/page%204.html","title":"Paris facts: the capital of France in history","metadata":{"anthropic":{"source":"url","citedText":"Paris first became the capital of France in 508 under King Clovis. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDOmD0gZDTk4EUhZxTRoM7o3FKIIkPpokD8MPIjD7SHZyHs2FbmkDuzxdr6QKhNyLcARG1P9qp5+GsL1n2QKy2+CBozckttRU1v/0/MAqE7X5OvyUYhzCyjTd6OSJljZaS54YBA=="}}},{"type":"text-delta","id":"10","delta":"Paris first became the capital of France in 508","metadata":{}},{"type":"text-delta","id":"10","delta":" under King Clovis.","metadata":{}},{"type":"text-end","id":"10","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2345,"outputTokens":264,"totalTokens":2609},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"input_tokens":2345,"output_tokens":9,"server_tool_use":null,"service_tier":"standard"}}}}]}]}
@@ -0,0 +1,39 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+
8
+ import { TestHelpers } from '@dxos/effect/testing';
9
+ import { AgentService } from '@dxos/functions-runtime';
10
+ import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
11
+
12
+ import WebSearchBlueprint from './blueprint';
13
+ import { WebSearchHandlers } from './functions';
14
+ import { WebSearchToolkitOpaque } from './toolkit';
15
+
16
+ const TestLayer = AssistantTestLayer({
17
+ blueprints: [WebSearchBlueprint.make()],
18
+ operationHandlers: [WebSearchHandlers],
19
+ toolkits: [WebSearchToolkitOpaque],
20
+ tracing: 'pretty',
21
+ });
22
+
23
+ describe('WebToolkit', () => {
24
+ it.effect(
25
+ 'WebFetch handler returns response text',
26
+ Effect.fnUntraced(
27
+ function* ({ expect }) {
28
+ const session = yield* AgentService.createSession({
29
+ blueprints: [WebSearchBlueprint.make()],
30
+ });
31
+ yield* session.submitPrompt('What is the capital of France? Make sure to use the web search tool.');
32
+ yield* session.waitForCompletion();
33
+ },
34
+ Effect.provide(TestLayer),
35
+ TestHelpers.provideTestContext,
36
+ ),
37
+ { timeout: 30_000 },
38
+ );
39
+ });
@@ -2,30 +2,28 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { ToolId } from '@dxos/ai';
6
- import { type AppCapabilities } from '@dxos/app-toolkit';
7
- import { Blueprint } from '@dxos/blueprints';
5
+ import { Blueprint } from '@dxos/compute';
8
6
  import { Ref } from '@dxos/echo';
9
7
  import { Text } from '@dxos/schema';
10
8
 
11
- const BLUEPRINT_KEY = 'dxos.org/blueprint/web-search';
9
+ import { Fetch } from './functions';
12
10
 
13
- const functions: AppCapabilities.BlueprintDefinition['functions'] = [];
11
+ const BLUEPRINT_KEY = 'org.dxos.blueprint.web-search';
14
12
 
15
13
  const make = () =>
16
14
  Blueprint.make({
17
15
  key: BLUEPRINT_KEY,
18
16
  name: 'Web Search',
19
17
  description: 'Search the web.',
18
+ agentCanEnable: true,
20
19
  instructions: {
21
20
  source: Ref.make(Text.make()),
22
21
  },
23
- tools: [ToolId.make('AnthropicWebSearch')],
22
+ tools: Blueprint.toolDefinitions({ operations: [Fetch], tools: ['AnthropicWebSearch'] }),
24
23
  });
25
24
 
26
- const blueprint: AppCapabilities.BlueprintDefinition = {
25
+ const blueprint: Blueprint.Definition = {
27
26
  key: BLUEPRINT_KEY,
28
- functions,
29
27
  make,
30
28
  };
31
29
 
@@ -0,0 +1,25 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+ import { trim } from '@dxos/util';
9
+
10
+ export const Fetch = Operation.make({
11
+ meta: {
12
+ key: 'org.dxos.function.web-search.fetch',
13
+ name: 'Fetch web page',
14
+ description: trim`
15
+ Fetches the content of a web page and returns the HTML.
16
+ Use this to get the content of a web page.
17
+ `,
18
+ },
19
+ input: Schema.Struct({
20
+ url: Schema.String.annotations({
21
+ description: 'The URL of the web page to fetch.',
22
+ }),
23
+ }),
24
+ output: Schema.String,
25
+ });
@@ -0,0 +1,18 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+
9
+ import { Fetch } from './definitions';
10
+
11
+ export default Fetch.pipe(
12
+ Operation.withHandler(
13
+ Effect.fn(function* ({ url }) {
14
+ const response = yield* Effect.promise(() => fetch(url).then((response) => response.text()));
15
+ return response;
16
+ }),
17
+ ),
18
+ );
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { OperationHandlerSet } from '@dxos/compute';
6
+
7
+ export * from './definitions';
8
+
9
+ export const WebSearchHandlers = OperationHandlerSet.lazy(() => import('./fetch'));
@@ -3,4 +3,5 @@
3
3
  //
4
4
 
5
5
  export { default as WebSearchBlueprint } from './blueprint';
6
- export { WebSearchToolkit } from './toolkit';
6
+ export { WebSearchToolkit, WebSearchToolkitOpaque } from './toolkit';
7
+ export { Fetch as WebSearchFetch, WebSearchHandlers } from './functions';
@@ -2,7 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import * as Toolkit from '@effect/ai/Toolkit';
6
5
  import * as AnthropicTool from '@effect/ai-anthropic/AnthropicTool';
6
+ import * as Toolkit from '@effect/ai/Toolkit';
7
+ import * as Layer from 'effect/Layer';
8
+
9
+ import { OpaqueToolkit } from '@dxos/ai';
7
10
 
8
11
  export const WebSearchToolkit = Toolkit.make(AnthropicTool.WebSearch_20250305({}));
12
+
13
+ export const WebSearchToolkitOpaque = OpaqueToolkit.make(WebSearchToolkit, Layer.empty);
@@ -6,23 +6,21 @@ import { describe, it } from '@effect/vitest';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import * as Layer from 'effect/Layer';
8
8
 
9
- import { AiSession } from '@dxos/assistant';
10
- import { AssistantTestLayer } from '@dxos/assistant/testing';
9
+ import { OpaqueToolkit } from '@dxos/ai';
10
+ import { AiRequest, ToolExecutionServices } from '@dxos/assistant';
11
11
  import { TestHelpers } from '@dxos/effect/testing';
12
+ import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
12
13
  import { log } from '@dxos/log';
13
14
  import { Pipeline } from '@dxos/types';
14
15
 
15
16
  import { makeGraphWriterHandler, makeGraphWriterToolkit } from './graph';
16
17
 
17
- const TestLayer = AssistantTestLayer({});
18
+ const TestLayer = Layer.empty.pipe(
19
+ Layer.provideMerge(ToolExecutionServices),
20
+ Layer.provideMerge(AssistantTestLayer({})),
21
+ );
18
22
 
19
23
  describe('graph', () => {
20
- // let builder: EchoTestBuilder;
21
- // test('findRelatedSchema', async () => {
22
- // const db = await createEchoDatabase();
23
- // const relatedSchemas = await findRelatedSchema(db, Schema.Struct({}));
24
- // });
25
-
26
24
  const Toolkit = makeGraphWriterToolkit({ schema: [Pipeline.Pipeline] });
27
25
  const ToolkitLayer = makeGraphWriterHandler(Toolkit);
28
26
 
@@ -30,9 +28,9 @@ describe('graph', () => {
30
28
  'calculator',
31
29
  Effect.fn(
32
30
  function* (_) {
33
- const session = new AiSession();
34
- const toolkit = yield* Toolkit;
35
- const response = yield* session.run({
31
+ const request = new AiRequest();
32
+ const toolkit = yield* OpaqueToolkit.fromContext(Toolkit);
33
+ const response = yield* request.run({
36
34
  toolkit,
37
35
  prompt: 'What is 10 + 20?',
38
36
  });
package/src/crud/graph.ts CHANGED
@@ -11,8 +11,11 @@ import * as Option from 'effect/Option';
11
11
  import * as Schema from 'effect/Schema';
12
12
  import * as SchemaAST from 'effect/SchemaAST';
13
13
 
14
+ import { ContextQueueService } from '@dxos/compute';
14
15
  import { Entity, Filter, Obj, Query, Type } from '@dxos/echo';
15
16
  import { Database } from '@dxos/echo';
17
+ import { type Queue } from '@dxos/echo-db';
18
+ import { isEncodedReference } from '@dxos/echo-protocol';
16
19
  import {
17
20
  ReferenceAnnotationId,
18
21
  RelationSourceDXNId,
@@ -23,10 +26,7 @@ import {
23
26
  getTypeAnnotation,
24
27
  getTypeIdentifierAnnotation,
25
28
  } from '@dxos/echo/internal';
26
- import { type Queue } from '@dxos/echo-db';
27
- import { isEncodedReference } from '@dxos/echo-protocol';
28
29
  import { mapAst } from '@dxos/effect';
29
- import { ContextQueueService } from '@dxos/functions';
30
30
  import { DXN, ObjectId } from '@dxos/keys';
31
31
  import { log } from '@dxos/log';
32
32
  import { deepMapValues, isNonNullable, trim } from '@dxos/util';