@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
@@ -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,158 @@
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, Operation } from '@dxos/compute';
9
+ import { Database, Feed, Filter, Obj, Ref } from '@dxos/echo';
10
+ import { FeedAnnotation } from '@dxos/schema';
11
+
12
+ import { Agent } from '../../../types';
13
+ import { SyncTriggers } from './definitions';
14
+
15
+ export default SyncTriggers.pipe(
16
+ Operation.withHandler(
17
+ Effect.fn(function* ({ agent: agentRef }) {
18
+ const agent = yield* Database.load(agentRef);
19
+ yield* syncAgentTriggers(agent);
20
+ }),
21
+ ),
22
+ );
23
+
24
+ /**
25
+ * Foreign key {@link AGENT_TRIGGER_EXTENSION_KEY} => <agent id : ObjectId>.
26
+ */
27
+ const AGENT_TRIGGER_EXTENSION_KEY = 'org.dxos.extension.AgentTrigger';
28
+
29
+ /**
30
+ * Foreign key {@link AGENT_TRIGGER_TARGET_EXTENSION_KEY} => <dxn string of subscription target>.
31
+ */
32
+ const AGENT_TRIGGER_TARGET_EXTENSION_KEY = 'org.dxos.extension.AgentTriggerTarget';
33
+
34
+ /** Checks if an object's schema has the FeedAnnotation. */
35
+ const hasFeedAnnotation = (obj: Obj.Unknown): boolean => {
36
+ const schema = Obj.getSchema(obj);
37
+ if (!schema) {
38
+ return false;
39
+ }
40
+ const annotation = FeedAnnotation.get(schema);
41
+ return Option.isSome(annotation) && annotation.value === true;
42
+ };
43
+
44
+ /**
45
+ * Syncs triggers in the database with the agent subscriptions.
46
+ */
47
+ const syncAgentTriggers = (agent: Agent.Agent): Effect.Effect<void, never, Database.Service> =>
48
+ Effect.gen(function* () {
49
+ const triggers = yield* Database.runQuery(
50
+ Filter.foreignKeys(Trigger.Trigger, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),
51
+ );
52
+
53
+ // Remove all existing triggers — they will be recreated with the current config.
54
+ // This ensures operation, concurrency, and enabled stay in sync when agent fields change.
55
+ for (const trigger of triggers) {
56
+ yield* Database.remove(trigger);
57
+ }
58
+
59
+ const triggersEnabled = agent.enabled ?? true;
60
+
61
+ // Lazy import to avoid circular dependency issues.
62
+ const { Qualifier, AgentWorker } = yield* Effect.promise(() => import('../../project'));
63
+
64
+ for (const subscription of agent.subscriptions) {
65
+ const targetOption = yield* Database.loadOption(subscription);
66
+ if (Option.isNone(targetOption)) {
67
+ continue;
68
+ }
69
+ const target = targetOption.value;
70
+
71
+ let feedObj: Feed.Feed | undefined;
72
+ if (Obj.instanceOf(Feed.Feed, target)) {
73
+ feedObj = target;
74
+ } else if (hasFeedAnnotation(target)) {
75
+ const feedRef = (target as Obj.Unknown & { feed?: Ref.Ref<Feed.Feed> }).feed;
76
+ feedObj = feedRef ? Option.getOrUndefined(yield* Database.loadOption(feedRef)) : undefined;
77
+ }
78
+
79
+ const queueDxn = Option.fromNullable(feedObj).pipe(
80
+ Option.filter(Obj.instanceOf(Feed.Feed)),
81
+ Option.map(Feed.getQueueDxn),
82
+ Option.getOrUndefined,
83
+ );
84
+ if (!queueDxn) {
85
+ continue;
86
+ }
87
+
88
+ const filterEvents = agent.filterEvents ?? true;
89
+
90
+ yield* Database.add(
91
+ Trigger.make({
92
+ [Obj.Parent]: agent,
93
+ [Obj.Meta]: {
94
+ keys: [
95
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
96
+ { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: subscription.dxn.toString() },
97
+ ],
98
+ },
99
+ enabled: triggersEnabled,
100
+ spec: Trigger.specQueue(queueDxn.toString()),
101
+ function: Ref.make(Operation.serialize(filterEvents ? Qualifier : AgentWorker)),
102
+ input: {
103
+ agent: Ref.make(agent),
104
+ event: '{{event}}',
105
+ },
106
+ concurrency: filterEvents ? 5 : undefined,
107
+ }),
108
+ );
109
+ }
110
+
111
+ if ((agent.filterEvents ?? true) && agent.queue) {
112
+ yield* Database.add(
113
+ Trigger.make({
114
+ [Obj.Parent]: agent,
115
+ [Obj.Meta]: {
116
+ keys: [
117
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
118
+ {
119
+ source: AGENT_TRIGGER_TARGET_EXTENSION_KEY,
120
+ id: Obj.getDXN(agent)?.toString() ?? '',
121
+ },
122
+ ],
123
+ },
124
+ function: Ref.make(Operation.serialize(AgentWorker)),
125
+ enabled: triggersEnabled,
126
+ spec: Trigger.specQueue(agent.queue.dxn.toString()),
127
+ input: {
128
+ agent: Ref.make(agent),
129
+ event: '{{event}}',
130
+ },
131
+ }),
132
+ );
133
+ }
134
+
135
+ // Timer trigger bypasses the qualifier and invokes the agent worker directly on a schedule.
136
+ if (agent.cron) {
137
+ yield* Database.add(
138
+ Trigger.make({
139
+ [Obj.Parent]: agent,
140
+ [Obj.Meta]: {
141
+ keys: [
142
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
143
+ { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: `timer:${agent.cron}` },
144
+ ],
145
+ },
146
+ enabled: triggersEnabled,
147
+ spec: Trigger.specTimer(agent.cron),
148
+ function: Ref.make(Operation.serialize(AgentWorker)),
149
+ input: {
150
+ agent: Ref.make(agent),
151
+ event: '{{event}}',
152
+ },
153
+ }),
154
+ );
155
+ }
156
+
157
+ yield* Database.flush();
158
+ });
@@ -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 { Blueprint } 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: Blueprint.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_01CTpuVPdLw5PFntmAXa9DNF","modelId":"claude-opus-4-6","timestamp":"2026-05-10T07:24:10.136Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" user wants me to use the web search tool to answer this question, even though I","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" know the answer.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"Ep8CClkIDRgCKkApMUMNSZJpFQ+sNfR6X+YbNNz9lfhRvrb7nQ8q4pphL+8WwBRtUxHLpOX4zTRJyS2pbApqpp31ADPm5Utuq4T6Mg9jbGF1ZGUtb3B1cy00LTY4ABIMx14SqY2LTMQBw4hYGgxLAAku0oBogz5s7uoiMBF+JHdjBzZRjQxFjWSeiLRxZmLB/4F3rIqdilcxTkoitp70nqEKwwUTmS3zGlq+8yp00LhnC4kKPQy53TiY4vqAosPUXOHLFsFXsSwheUqXwGz+tsnuyB+ubQ7fDTMGtFDW38dJU5Mg71/YcAeFOyyaiKW+h05+fcYU5Lw4uSeOq7AHuWrKXohuYY/IW5MgyRjKMjTCfgSAC8tnluv7QTNvXONwNSQYAQ=="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","name":"AnthropicWebSearch","providerName":"web_search","providerExecuted":true,"metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","delta":"","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","delta":"{\"query\": \"c","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","delta":"apital","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","delta":" of Fra","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","delta":"nce","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","delta":"\"}","metadata":{}},{"type":"tool-params-end","id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","metadata":{}},{"id":"srvtoolu_01Cq4A6Hn88iDiZ6GvEdRkCe","type":"tool-result","providerName":"web_search","isFailure":false,"name":"AnthropicWebSearch","result":[{"encrypted_content":"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","page_age":"4 days 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":"EoAICioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDAqGyfmse6InK+8j0xoMl/OBKIwdnEa+Ipw1IjAScqUjqa1OZshXetuclwVepZXSu+fjlasctVjIi49xN+ws6JoSIF4ci6apmcrDFB8qgwfFP7C8JKKpwhno4Md5JXmO03E9lkPOiyf18VBe7TcWMWqwwVRzYTjvpaomtQFKdwpjwoRkBm+0chNI7YU63wVJ+wVPo3spS7iiokq4IC9yoOe/OIibQOVf6H2UaLVp2YPN/gavBlEyflefTzJdJnZJbwadc8CgRaZ8dZoUJMzWzPnBL93Maq1G5tfAxDc8m3nWcZGAA/xVmoaOGpdU/2t+81tJ04l1IDG0IbqEWICpqcacBsLRF/cTvRph6F1l8biFbJBm2lyesUMAjrA5ZsOzkZ28cX8GvJfr/6JJwh4yHD+iDPEuaGQsY4z0gwH45q6WmCu8Ri2VJtib6DOOeXq9xzIAJACF7pn012LGsIc8lgaQYGvYz2AsvV463yUR4tqAJUxnDZnSujBP8XBzveezq8Si2eUyn7nmy9BatXXcEHKOxr8rlzyG4cOnHdizygA4lx0LzUBEGjeL0x8sqQvFmI/3d8Au7w4Y7rXo4cxTJw+9l29nlEtKQykJ/Or126DXKdfHYpWOFp2kvXvY6ArDseFMz5DhfhJrdlTGpXyy2sw2iVemJXoegCvC92flonxIRjt9Pz53EUU2j6MomNN/u1mUBOaWB3xSymgE3P+XeNohVsPpFKHiNYXz/xi6gQfPbptMaF8G391P2VvlxL45oaj0AUceIYs9dG0z/HPmbPkYHnydyyI8WZYztgvcg36wJGamgNLDcpAGCyYHTlaM7phSuJ9+nlwsuTg3YSlO3fB0AI2QCcKVJMKrgiLNX4zgPMlZRXIkwJPeS2Gltae+PPpaoVaNhLYWgQ37x/r177UoWpwlOesYu7yVTCdBlrqiZ+1Na1BJy5mM46KajdLWxtVijiM4HWW7kb2pBR7Iqle6yptw0mcsPYG+jtB14e3w7Zlwjaf0PaKk6LTlBRDrNklo7+5bM3BACNej66CRrnRCYSkexYpARvcd2XTf5t6I6fxkTJMmJAb4xdnOwv55p/OrjAKBDbuRuWIx/2fG3Dx5fyAzT9aEMPoa8qDG5HPEaVXiOoqhZj03GHel8/2F1u/FFnyqUDi0Jl/iZFkAaZGxyTqaC8YtYP6Z8z22qCj1Dt10Woi/fK4R4InT4z0rCBAhKJdcYHmHGROPkKuWhScaBeDlhxecwWuCP3d1IBkHDZ6QNuQVQjKiw8NCzvvLjJj11MNFhs9Q2Y7D2PgP0pXo+RgD","title":"Paris facts: the capital of France in history","type":"web_search_result","url":"https://home.adelphi.edu/~ca19535/page%204.html"},{"encrypted_content":"EsQDCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDALW7BX240pJOQtu0hoMcH8Lswrw78o381PwIjAqePxDq21fHqKm5bl3gBK4gXF5vkpD/quV3rcYhTwKNU4H5Cqkf72ZXMTzP2+2s/4qxwICAhYjGLcV1V1leakOUP/0Zc6mMXxczisDHOyXMoOQA1OwZc8kGU1KmptGGwoKgOLEdTmy/Vf1uWLuBS/w0EIDOJfY0k6k2uSCdOGLwrLis4dL0VPNEiDPp81kcjsSbrRSRgF1SWBzzfVD/cuX108QgNL4wN2rKEJ4ILu+tOt6yqQqN+U43ZhU7mk2R0P5RlxjHGwQfMxfJW+qHI1P8a3H/5wmqJq0hekMq3e8zZF24kvQAS17HZvLV+MnJ4drDkE8l2xuqfMSxYIOhNtic51BlkhGnXKPnRyr7WBx6oj+2W7LmGDq0aMtwoGNij24KglWt/bInlcR9V/rUrqV5rhVhoUyvNah1tyY0FgQUAQFtuI5X7/2y1jK+Zn4h2V8kdxoOfQvJdc/P9eFlhEc5Tm55rV54W9LjPm4O2UVIexLD8TZ4wYjD9UYAw==","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":"4 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":"EqAXCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDBQ2HoleFYM6Ca8QDxoMy+4hc0VKm0rNHgJ8IjDSErZPKFXrowOqQ9Mi1oTZ5J+EmEzaDZx03vdO9UXA0HIpqNMMZ/zX4feTBDvZ8wEqoxafkuCG2oyCFl1pJajnjcy4VSFupiX/KuFnhfou6e5RvICdlb8hEQo3+1VD16wccIKcd69lo75EBhMUaH/RXAmXwFi3/zqf8ehfyqgsw24sgMqEeH2cK2dbzGZ4dZD1YzIT8goIhWHAkBy4YeHplEurVn0mP92pDQ7zB8RYZy78vty6KBuscv7il+rJMasAA01SybRwZjqHlSaCOcDWuov9XhojLCXkuleixnVb/qw9aC+l0rgjS7Pq4ivyuDGNtz4DWrZvfiiz6K5ZkTDzrAcuRiJwWuH5LT2xZJMrjeOErsasNtzb3TX5FF7ZC0v6NOmOVwTwmYc4TYnh4HCRJAQ+u2be6+U5iMZ0etUN+6yHiZAsDbG2RlbJoe2jm3fT3qZC9GGlNPVppfj2YBjmaJTWTfL+3CpH0PkpsUtiiMP1UTbooh4A3F125h6Vbvkg3sGCv6WcMQ2M0QhmaHWd7IxBlRXTvwgvuk9xMEY5OX+efKnIsZyNbNF8Sroeoa9Lgn1Scd83adiRW7/RCJa1lG5aQFBPPYF9lZ9NJkqfg/0wX21a061zEE/2BY9Tp413IDhzfFzA6Ig2Qc6qr/nKKmah+JMN7Osf6fkzzKWZH9ROxWUBimOJ195Jx5heJ6wBgGbtitjuDOLtSt0gvMwVHWLijdERNQwDhw1AjIahPi5c6suAU/tfx3BJOX+AG5nWPgNCtn7LUbOHxf0qcUi6reELR+4TE6q+K2IRCoNmw2Nh44WgpYybrWuQQgSbfAFahBlTSvmvUfbKXdpyng37nZux9aoZQDuddBqC0pcq+0Ih7bD+SmvhUIkkcCOAYZw0kUk5tiDERnptcCwZeEyaN0Pe++YPvYKE5gdiOhvM/N2uuUfGgW3p9vHEYQgW7C02I9UYwVELHVip+n1nKPMThDtxdYunrTmPUkBONYOdvodQPoSBL+syG2xL6mcz+dK5jf4Nn/ueUCwgSafzXG9qulRjBaota2201gXfourz/6W2D4mnsCtT6Or0GKzUdjZKmo3oWxlttnPIQJc+BOnvqPHNsF5c6V2VBWH/B3hksRtgzqvqvwU6TPefPuVALHreC61q4vKTR4u/qlPkdEHR0zsGSzWAHzgyBJEFGgctIYUJZxXCAUxJptrDfQh3e6eP7RqjJw66rdsRHDl4CHnRUS01Lhn0NPDX5A7Li9MppaaQyG1cak+SklaO57msaA0b6R4J5sRI1aOtQzJIV37D8/u5/jLYtqe157U44mZHRVVgupic3RO4XJDMaE/mgx8GBm1WhwS2omMIwiWUzMUA4CC413YswwNpcgvEZeuINx72O8QVTYYKKKYugL1H5x0mzcUAj711QRjvyDeaWjI2yKjDwASPOGcATFBTmGPYH/Pfub/ybQsLZ5jzLSxAHF6pcvr4+s/sL20wD69q/Fc7Q3JdOWQFDnVJlgVSI/RsmxJ0Zai6oQCtytF2oLTojoux6B3ZFr2iFxdZTqGMsWwzZ8u0EsrezgajQuJD6u38e97PO/7JrDsDXELEftJDLXIOgjGlZvwpwHBdr4Ec8B9qwGjRf9sSADhNuD5Q0+75D6roQITTZ5lR4i2DHgxTUdMgxzYOA8tu91oIZN49i4LasqKeVo2ezrtrGrwJu2pFBbRbzQfLM9EeNBfj447XyFtJkAO2cV3947MQpeULlGNcINRSUEK7ELDxWYzztjcxncjPLF2j2TGn5bZIfzwhcGHM8xrkMgH3UuVY4deRYNSaxajIOG8Z+fLqG4znNQBuPJ6W6XucFXnvo7YEXAesPI+0rw2+H4YkA7clclb27BCrUaBxs0jSji2KstBfjSrUtIEpDZ+LnVkVjSBRnVasTQL2GbIhbiP6pVx30B5o0+jgokjjnOniHdgtzPL+cNzyss3z1IQQ3WYMI3OhZWDa7evc1nJJZVb+scMTgUX2pQgkXDipqWlKc/m7cR95YJV0u3eyE/AC0yjM96Z2H2dXv/nl4OnvPp2QzodFXQ2F+1J3enSubZJDrXCBur9ZdZPsYxiUfU2XmNc2jq27OWEkCkUdvYk1GNETFU1RG3IR9if0chrwuMKQU6ihVp4ldh0Y9NHIZQ464lQfihdvn9Y7nkypYK87Fn7VmwznlZiu4pYXK531z7qd9solda5YcpgvnIMe7+5jaN7xXx4uNXaO10AlJbcbF1Oe0lEvjoySh2j9WyWQ4gQ+61RpReLsJaQ6cf17UddGjnZJLjOqf30OPqPI0DUmpJxazQKCDdFJUiumBw2X0TYoJ976RyK9dUq03QbP0ylHFXEA42lrTDpaPy3Hjv5R5K16jpK7XgkGqrcyKo2HMCH98CB/b3A715ddandZMOCljr2txucvFS0JJG+QeSezMSAkBY8zOba7YdXo3k68yBla7n5Sh86ef4+1bSKGPG8TWHR/kK5Zch5hQqAoHLwCmcdIoX9qKzzGHDJxNRGRHDCT2h1yacMg5yB2HYiHdin/gJO5Te0tUYgGMMSwpbIZwkPj4Ks+nN9dAketV7+7ZJvTVsQx6dCNIa55U3IkrVQLCB4MT2AsN7w/yLiazf4TZenJBqc+LqLWa8uy27uZraVL6Ci3AXCEnbVN86ynwUjcs6MKbEuCAdqTohdQi9Ov8T/hAMpbmzfulOhobyX+ylQZ0f3i19AasmB+QCnRFhiVQleQFwww3C8PnXIKOyfS7JhhdWr1jYE4ZSoL/+i58A/c8dvR57eUAKOa5n9ZzbRRB3o2BgqtNpvp/x9GwU9Cu6BO5kKrSHnRKPEHSNdPPnIP8YbU4/ogDnTTYjgyZ0tvXEDD4XebeHkGFKX8G+4wQCJZQuuzpFE1Et0g5p8Xhg9ppqb83qwYWhKSWBZzeO4CrSdD1t5xUvOqzDrJaMDB62oBlJjSM3FEdI3w7fzorixebkkwjBqWQ2YmhD0ar/2H9OrKbS4xXgjvePUm3OKFXqhG5gJHWHI9dArOiiInDnYA+5zzyB5uycGF+D9tebJq5fnBKI3ms9SjoTtmARs4Xi4tqtfsXDeVykSrn/y5yBM7RBRtGxiMq5VFq5MvPAhGr1yWSREUgYC5V1IwtXbqgqyM1CPcSogiz5vWYAtKo8mLvj0KWIVSGJ797o6kMssyYTnV3tAtR/QU3t5f6DPXZw8bvfdVampkpmdZtkLoZAlFw/apGgf58Ha2wBvi7H/CEzFNJ37LqR4aVkmlqtzV9MGu/ag5t+ie5em6cXuTVOBBlw+Ge9d2kLyvn04p5eGixoyQiRE+Rx09pcbGg6WzjQpjNtFNGIJnJuuOWzyS0IIQQxBKxwCSToJQYM8ZoiSvO9cPCiXA8YGf/ssN0YqOyoCWA1pN616ce8eiixizQ19knal5Y0sXI+bJ+1+2nHCx/HSdv8vVY2RMqljFkwFhbacxlqQb5FeimBfSimDgY9iWRNWsGCTSXU8Yrg1AHatCBd3xkXtuLAXnD9OZZC7+DfVUX4Bnd5pqT9m5mxwG5EYfRzhGE83qVx18JwPYBfZgukDjrVtRPG/KTQo52T2fq6YoncYdDalo/hvAdQ5KPwrqUneigmR/PBkMscxu2Yagq3Wa6RUnMUult79DNoywmybINaCJmzjy2VeuzypC0r6k9ONgalzJl+OLfUWF3DxDHZewyElM7WQDRU8tuTJDOojrYzGYy5wWAc/RVExBJflAiM1y7vpdbrzEK5WbUBGTvCs66HUhgvv8XoPQfcXcnc7cfN9VrFHEWCjXOpA+986Ez9h7YKNYh99fQtr5RsjCKTfveVTGg5VwL6radudERr2BxkCMC5siZcvPsiDmI1hyGAM=","page_age":"3 days ago","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","type":"web_search_result","url":"https://www.britannica.com/place/Paris"},{"encrypted_content":"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","title":"Paris, France | Geography and Cartography | Research Starters | EBSCO Research","type":"web_search_result","url":"https://www.ebsco.com/research-starters/geography-and-cartography/paris-france"},{"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"},{"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"}],"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_BNuo8RfdAaQePEXk","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":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDGUHHaiByiwUDKaxWBoMPstBgj8+I5wPHT+nIjCnIbFtV13XRXWkvR2yX2rLJQV0oVx34zyT/IS+vK9eedV0gCZkN7ZIveC29s6jrhEqE12K5qKDho6LiFdBo1u9ZvT9cT8YBA=="}}},{"type":"text-delta","id":"4","delta":"Paris is the capital and largest city of France, with","metadata":{}},{"type":"text-delta","id":"4","delta":" an estimated city population of 2.04 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_tykMv1EvxuKyD0hn","url":"https://www.britannica.com/place/Paris","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","metadata":{"anthropic":{"source":"url","citedText":"... Encyclopaedia Britannica's editors oversee subject areas in which they have extensive knowledge, whether from years of experience gained by workin...","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDF2i1JK8i1GagNnTQhoMw42NtI1zCSL//a/3IjAk2ipQwP46t0Jeg4CBGsRmmimLQJDJRfW4QeHZK5ykEoTVAU32rQt43dlHriTGcpYqE5YjHDY0f5J8ugTQlUtfl/ejF18YBA=="}}},{"type":"text-delta","id":"6","delta":"Paris is located in the north-central part of France along the Seine River.","metadata":{}},{"type":"text-end","id":"6","metadata":{}},{"type":"text-start","id":"7","metadata":{}},{"type":"text-delta","id":"7","delta":" ","metadata":{}},{"type":"text-end","id":"7","metadata":{}},{"type":"text-start","id":"8","metadata":{}},{"type":"source","sourceType":"url","id":"id_EqqlL08HkjCOhmkw","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":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDJfQF68FXpAoV5DTlBoMM/nKmOvVvFsGzRyZIjBlLgcBc6dJJmRvfIpvQsUAiyiPpB6E9GjWt5t9UnUQauS1A0xlVs4/e9lbUC/88PAqEyEu18HV2ONKoN3p7LaAdSswq8oYBA=="}}},{"type":"text-delta","id":"8","delta":"The capital of France has been Paris since its liberation","metadata":{}},{"type":"text-delta","id":"8","delta":" in 1944.","metadata":{}},{"type":"text-end","id":"8","metadata":{}},{"type":"text-start","id":"9","metadata":{}},{"type":"text-delta","id":"9","delta":"\n\nParis is renowned for its iconic landmarks and cultural significance. ","metadata":{}},{"type":"text-end","id":"9","metadata":{}},{"type":"text-start","id":"10","metadata":{}},{"type":"source","sourceType":"url","id":"id_y0SzWPboGR493BMc","url":"https://www.ebsco.com/research-starters/geography-and-cartography/paris-france","title":"Paris, France | Geography and Cartography | Research Starters | EBSCO Research","metadata":{"anthropic":{"source":"url","citedText":"Paris, the capital of France, is renowned globally for its iconic landmarks such as the Eiffel Tower, the Louvre Museum, and Notre-Dame Cathedral. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDJ5uscaLYLobnEYNMhoMMekwZQtvPUdCxRiRIjAAbeJsJRVoDg/uepE2uBjEjEa9P9wHec5i+LZ0+GzUDK9q5uKqnCLDy9Ov8Tc1vowqE5uwT8SrmwAW+19GNFDPCgC9VDkYBA=="}}},{"type":"text-delta","id":"10","delta":"It is renowned globally for its iconic landmarks such as the Eiffel Tower, the Louvre Museum, and Notre-Dame Cathedral.","metadata":{}},{"type":"text-end","id":"10","metadata":{}},{"type":"text-start","id":"11","metadata":{}},{"type":"text-delta","id":"11","delta":" ","metadata":{}},{"type":"text-end","id":"11","metadata":{}},{"type":"text-start","id":"12","metadata":{}},{"type":"source","sourceType":"url","id":"id_tj21wLz72g1wQQiW","url":"https://www.britannica.com/place/France","title":"France | History, Maps, Flag, Population, Cities, Capital, & Facts | Britannica","metadata":{"anthropic":{"source":"url","citedText":"The capital and by far the most important city of France is Paris, one of the world’s preeminent cultural and commercial centres. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDIW/JnQutxEjCzDxIxoMhYVKdllJsHNeloojIjCvILYaBTtK2+KxPsyDNj3BKF+L7ditByx3ki2FaCBsSm4eksijGgFzt6ijzaFTxXUqEzY1tkQYMcOGvPlVWk9w9x/R3SkYBA=="}}},{"type":"text-delta","id":"12","delta":"It is one of the world's preeminent cultural and commercial","metadata":{}},{"type":"text-delta","id":"12","delta":" centres.","metadata":{}},{"type":"text-end","id":"12","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2345,"outputTokens":295,"totalTokens":2640},"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
  });