@dxos/assistant-toolkit 0.8.4-main.e8ec1fe → 0.8.4-main.effb148878

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 (572) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/neutral/add-artifact-ZKSSMPLY.mjs +30 -0
  3. package/dist/lib/neutral/add-artifact-ZKSSMPLY.mjs.map +7 -0
  4. package/dist/lib/neutral/agent-UIASE5LZ.mjs +65 -0
  5. package/dist/lib/neutral/agent-UIASE5LZ.mjs.map +7 -0
  6. package/dist/lib/neutral/chunk-AF5TWFLV.mjs +66 -0
  7. package/dist/lib/neutral/chunk-AF5TWFLV.mjs.map +7 -0
  8. package/dist/lib/neutral/chunk-CMHECL6N.mjs +282 -0
  9. package/dist/lib/neutral/chunk-CMHECL6N.mjs.map +7 -0
  10. package/dist/lib/neutral/chunk-DC5KITJP.mjs +74 -0
  11. package/dist/lib/neutral/chunk-DC5KITJP.mjs.map +7 -0
  12. package/dist/lib/neutral/chunk-EUHZLWCG.mjs +26 -0
  13. package/dist/lib/neutral/chunk-EUHZLWCG.mjs.map +7 -0
  14. package/dist/lib/neutral/chunk-EUTROPCP.mjs +345 -0
  15. package/dist/lib/neutral/chunk-EUTROPCP.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-FNN6ERC6.mjs +61 -0
  17. package/dist/lib/neutral/chunk-FNN6ERC6.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-GEMRKH7J.mjs +103 -0
  19. package/dist/lib/neutral/chunk-GEMRKH7J.mjs.map +7 -0
  20. package/dist/lib/neutral/chunk-GHGJCH73.mjs +76 -0
  21. package/dist/lib/neutral/chunk-GHGJCH73.mjs.map +7 -0
  22. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  23. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-LO2S3ICN.mjs +26 -0
  25. package/dist/lib/neutral/chunk-LO2S3ICN.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-MMIERIDT.mjs +70 -0
  27. package/dist/lib/neutral/chunk-MMIERIDT.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-OC77MYT5.mjs +48 -0
  29. package/dist/lib/neutral/chunk-OC77MYT5.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-ONQXVECY.mjs +110 -0
  31. package/dist/lib/neutral/chunk-ONQXVECY.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-PAEPER4S.mjs +70 -0
  33. package/dist/lib/neutral/chunk-PAEPER4S.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-RIF2TKJJ.mjs +76 -0
  35. package/dist/lib/neutral/chunk-RIF2TKJJ.mjs.map +7 -0
  36. package/dist/lib/neutral/context-add-VNJUVPSY.mjs +22 -0
  37. package/dist/lib/neutral/context-add-VNJUVPSY.mjs.map +7 -0
  38. package/dist/lib/neutral/context-remove-ZASL7ABZ.mjs +22 -0
  39. package/dist/lib/neutral/context-remove-ZASL7ABZ.mjs.map +7 -0
  40. package/dist/lib/neutral/create-project-VNC2KKBG.mjs +35 -0
  41. package/dist/lib/neutral/create-project-VNC2KKBG.mjs.map +7 -0
  42. package/dist/lib/neutral/delete-NLBJMMBJ.mjs +19 -0
  43. package/dist/lib/neutral/delete-NLBJMMBJ.mjs.map +7 -0
  44. package/dist/lib/neutral/enable-blueprints-SMGQ2WCU.mjs +47 -0
  45. package/dist/lib/neutral/enable-blueprints-SMGQ2WCU.mjs.map +7 -0
  46. package/dist/lib/neutral/fetch-VV3DU75K.mjs +16 -0
  47. package/dist/lib/neutral/fetch-VV3DU75K.mjs.map +7 -0
  48. package/dist/lib/neutral/fetch-messages-YXH77S3S.mjs +139 -0
  49. package/dist/lib/neutral/fetch-messages-YXH77S3S.mjs.map +7 -0
  50. package/dist/lib/neutral/get-context-LG2CNVII.mjs +35 -0
  51. package/dist/lib/neutral/get-context-LG2CNVII.mjs.map +7 -0
  52. package/dist/lib/neutral/index.mjs +915 -0
  53. package/dist/lib/neutral/index.mjs.map +7 -0
  54. package/dist/lib/neutral/load-K7HEJA54.mjs +17 -0
  55. package/dist/lib/neutral/load-K7HEJA54.mjs.map +7 -0
  56. package/dist/lib/neutral/meta.json +1 -0
  57. package/dist/lib/neutral/object-create-EN6PJN3L.mjs +35 -0
  58. package/dist/lib/neutral/object-create-EN6PJN3L.mjs.map +7 -0
  59. package/dist/lib/neutral/object-delete-RMA5ZKGY.mjs +18 -0
  60. package/dist/lib/neutral/object-delete-RMA5ZKGY.mjs.map +7 -0
  61. package/dist/lib/neutral/object-update-JW5PLR2T.mjs +28 -0
  62. package/dist/lib/neutral/object-update-JW5PLR2T.mjs.map +7 -0
  63. package/dist/lib/neutral/project-OGO5ABSZ.mjs +23 -0
  64. package/dist/lib/neutral/project-OGO5ABSZ.mjs.map +7 -0
  65. package/dist/lib/neutral/project-rules-IVA3DSOW.mjs +78 -0
  66. package/dist/lib/neutral/project-rules-IVA3DSOW.mjs.map +7 -0
  67. package/dist/lib/neutral/prompt-YVFNLD7U.mjs +170 -0
  68. package/dist/lib/neutral/prompt-YVFNLD7U.mjs.map +7 -0
  69. package/dist/lib/neutral/qualifier-UTPO5E3S.mjs +89 -0
  70. package/dist/lib/neutral/qualifier-UTPO5E3S.mjs.map +7 -0
  71. package/dist/lib/neutral/query-3FK3ED6L.mjs +69 -0
  72. package/dist/lib/neutral/query-3FK3ED6L.mjs.map +7 -0
  73. package/dist/lib/neutral/query-GXZT4KUX.mjs +32 -0
  74. package/dist/lib/neutral/query-GXZT4KUX.mjs.map +7 -0
  75. package/dist/lib/neutral/query-blueprints-GA2JM54N.mjs +16 -0
  76. package/dist/lib/neutral/query-blueprints-GA2JM54N.mjs.map +7 -0
  77. package/dist/lib/neutral/relation-create-XOFKYPL2.mjs +34 -0
  78. package/dist/lib/neutral/relation-create-XOFKYPL2.mjs.map +7 -0
  79. package/dist/lib/neutral/relation-delete-MVJKKVEQ.mjs +18 -0
  80. package/dist/lib/neutral/relation-delete-MVJKKVEQ.mjs.map +7 -0
  81. package/dist/lib/neutral/save-TFQMJKG7.mjs +23 -0
  82. package/dist/lib/neutral/save-TFQMJKG7.mjs.map +7 -0
  83. package/dist/lib/neutral/schema-add-I7BFBU55.mjs +24 -0
  84. package/dist/lib/neutral/schema-add-I7BFBU55.mjs.map +7 -0
  85. package/dist/lib/neutral/schema-list-TYGGAO2P.mjs +49 -0
  86. package/dist/lib/neutral/schema-list-TYGGAO2P.mjs.map +7 -0
  87. package/dist/lib/neutral/sync-issues-3U3EL6KO.mjs +166 -0
  88. package/dist/lib/neutral/sync-issues-3U3EL6KO.mjs.map +7 -0
  89. package/dist/lib/neutral/sync-triggers-M6U6RAKN.mjs +138 -0
  90. package/dist/lib/neutral/sync-triggers-M6U6RAKN.mjs.map +7 -0
  91. package/dist/lib/neutral/tag-add-RCE2QULJ.mjs +19 -0
  92. package/dist/lib/neutral/tag-add-RCE2QULJ.mjs.map +7 -0
  93. package/dist/lib/neutral/tag-remove-EPKB5CDE.mjs +19 -0
  94. package/dist/lib/neutral/tag-remove-EPKB5CDE.mjs.map +7 -0
  95. package/dist/lib/neutral/testing/index.mjs +73 -0
  96. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  97. package/dist/lib/neutral/update-blueprints-VOGJKSMQ.mjs +16 -0
  98. package/dist/lib/neutral/update-blueprints-VOGJKSMQ.mjs.map +7 -0
  99. package/dist/lib/neutral/update-tasks-PNNNCPWH.mjs +13 -0
  100. package/dist/lib/neutral/update-tasks-PNNNCPWH.mjs.map +7 -0
  101. package/dist/types/src/blueprints/automation/blueprint.d.ts +4 -0
  102. package/dist/types/src/blueprints/automation/blueprint.d.ts.map +1 -0
  103. package/dist/types/src/blueprints/automation/index.d.ts +2 -0
  104. package/dist/types/src/blueprints/automation/index.d.ts.map +1 -0
  105. package/dist/types/src/blueprints/blueprint-manager/blueprint.d.ts +4 -0
  106. package/dist/types/src/blueprints/blueprint-manager/blueprint.d.ts.map +1 -0
  107. package/dist/types/src/blueprints/blueprint-manager/blueprint.test.d.ts +2 -0
  108. package/dist/types/src/blueprints/blueprint-manager/blueprint.test.d.ts.map +1 -0
  109. package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts +61 -0
  110. package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts.map +1 -0
  111. package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts +36 -0
  112. package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts.map +1 -0
  113. package/dist/types/src/blueprints/blueprint-manager/functions/index.d.ts +4 -0
  114. package/dist/types/src/blueprints/blueprint-manager/functions/index.d.ts.map +1 -0
  115. package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts +27 -0
  116. package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts.map +1 -0
  117. package/dist/types/src/blueprints/blueprint-manager/functions/update-blueprints.d.ts +4 -0
  118. package/dist/types/src/blueprints/blueprint-manager/functions/update-blueprints.d.ts.map +1 -0
  119. package/dist/types/src/blueprints/blueprint-manager/index.d.ts +3 -0
  120. package/dist/types/src/blueprints/blueprint-manager/index.d.ts.map +1 -0
  121. package/dist/types/src/blueprints/browser/blueprint.d.ts +4 -0
  122. package/dist/types/src/blueprints/browser/blueprint.d.ts.map +1 -0
  123. package/dist/types/src/blueprints/browser/blueprint.test.d.ts +2 -0
  124. package/dist/types/src/blueprints/browser/blueprint.test.d.ts.map +1 -0
  125. package/dist/types/src/blueprints/browser/index.d.ts +2 -0
  126. package/dist/types/src/blueprints/browser/index.d.ts.map +1 -0
  127. package/dist/types/src/blueprints/database/blueprint.d.ts +4 -0
  128. package/dist/types/src/blueprints/database/blueprint.d.ts.map +1 -0
  129. package/dist/types/src/blueprints/database/blueprint.test.d.ts +2 -0
  130. package/dist/types/src/blueprints/database/blueprint.test.d.ts.map +1 -0
  131. package/dist/types/src/blueprints/database/functions/context-add.d.ts +7 -0
  132. package/dist/types/src/blueprints/database/functions/context-add.d.ts.map +1 -0
  133. package/dist/types/src/blueprints/database/functions/context-remove.d.ts +7 -0
  134. package/dist/types/src/blueprints/database/functions/context-remove.d.ts.map +1 -0
  135. package/dist/types/src/blueprints/database/functions/definitions.d.ts +59 -0
  136. package/dist/types/src/blueprints/database/functions/definitions.d.ts.map +1 -0
  137. package/dist/types/src/blueprints/database/functions/index.d.ts +4 -0
  138. package/dist/types/src/blueprints/database/functions/index.d.ts.map +1 -0
  139. package/dist/types/src/blueprints/database/functions/load.d.ts +7 -0
  140. package/dist/types/src/blueprints/database/functions/load.d.ts.map +1 -0
  141. package/dist/types/src/blueprints/database/functions/object-create.d.ts +8 -0
  142. package/dist/types/src/blueprints/database/functions/object-create.d.ts.map +1 -0
  143. package/dist/types/src/blueprints/database/functions/object-delete.d.ts +7 -0
  144. package/dist/types/src/blueprints/database/functions/object-delete.d.ts.map +1 -0
  145. package/dist/types/src/blueprints/database/functions/object-update.d.ts +10 -0
  146. package/dist/types/src/blueprints/database/functions/object-update.d.ts.map +1 -0
  147. package/dist/types/src/blueprints/database/functions/query.d.ts +12 -0
  148. package/dist/types/src/blueprints/database/functions/query.d.ts.map +1 -0
  149. package/dist/types/src/blueprints/database/functions/relation-create.d.ts +10 -0
  150. package/dist/types/src/blueprints/database/functions/relation-create.d.ts.map +1 -0
  151. package/dist/types/src/blueprints/database/functions/relation-delete.d.ts +7 -0
  152. package/dist/types/src/blueprints/database/functions/relation-delete.d.ts.map +1 -0
  153. package/dist/types/src/blueprints/database/functions/schema-add.d.ts +9 -0
  154. package/dist/types/src/blueprints/database/functions/schema-add.d.ts.map +1 -0
  155. package/dist/types/src/blueprints/database/functions/schema-list.d.ts +7 -0
  156. package/dist/types/src/blueprints/database/functions/schema-list.d.ts.map +1 -0
  157. package/dist/types/src/blueprints/database/functions/tag-add.d.ts +8 -0
  158. package/dist/types/src/blueprints/database/functions/tag-add.d.ts.map +1 -0
  159. package/dist/types/src/blueprints/database/functions/tag-remove.d.ts +8 -0
  160. package/dist/types/src/blueprints/database/functions/tag-remove.d.ts.map +1 -0
  161. package/dist/types/src/blueprints/database/index.d.ts +3 -0
  162. package/dist/types/src/blueprints/database/index.d.ts.map +1 -0
  163. package/dist/types/src/blueprints/discord/blueprint.d.ts +4 -0
  164. package/dist/types/src/blueprints/discord/blueprint.d.ts.map +1 -0
  165. package/dist/types/src/blueprints/discord/functions/definitions.d.ts +15 -0
  166. package/dist/types/src/blueprints/discord/functions/definitions.d.ts.map +1 -0
  167. package/dist/types/src/{functions/discord → blueprints/discord/functions}/fetch-messages.d.ts +3 -2
  168. package/dist/types/src/blueprints/discord/functions/fetch-messages.d.ts.map +1 -0
  169. package/dist/types/src/blueprints/discord/functions/fetch-messages.test.d.ts.map +1 -0
  170. package/dist/types/src/blueprints/discord/functions/index.d.ts +4 -0
  171. package/dist/types/src/blueprints/discord/functions/index.d.ts.map +1 -0
  172. package/dist/types/src/blueprints/discord/index.d.ts +2 -2
  173. package/dist/types/src/blueprints/discord/index.d.ts.map +1 -1
  174. package/dist/types/src/blueprints/github/functions/definitions.d.ts +7 -0
  175. package/dist/types/src/blueprints/github/functions/definitions.d.ts.map +1 -0
  176. package/dist/types/src/blueprints/github/functions/fetch-prs.d.ts +8 -0
  177. package/dist/types/src/blueprints/github/functions/fetch-prs.d.ts.map +1 -0
  178. package/dist/types/src/blueprints/github/functions/index.d.ts +4 -0
  179. package/dist/types/src/blueprints/github/functions/index.d.ts.map +1 -0
  180. package/dist/types/src/blueprints/github/index.d.ts +2 -0
  181. package/dist/types/src/blueprints/github/index.d.ts.map +1 -0
  182. package/dist/types/src/blueprints/index.d.ts +11 -6
  183. package/dist/types/src/blueprints/index.d.ts.map +1 -1
  184. package/dist/types/src/blueprints/linear/blueprint.d.ts +4 -0
  185. package/dist/types/src/blueprints/linear/blueprint.d.ts.map +1 -0
  186. package/dist/types/src/blueprints/linear/functions/definitions.d.ts +6 -0
  187. package/dist/types/src/blueprints/linear/functions/definitions.d.ts.map +1 -0
  188. package/dist/types/src/blueprints/linear/functions/index.d.ts +4 -0
  189. package/dist/types/src/blueprints/linear/functions/index.d.ts.map +1 -0
  190. package/dist/types/src/blueprints/linear/functions/linear.test.d.ts.map +1 -0
  191. package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts +10 -0
  192. package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts.map +1 -0
  193. package/dist/types/src/blueprints/linear/index.d.ts +2 -2
  194. package/dist/types/src/blueprints/linear/index.d.ts.map +1 -1
  195. package/dist/types/src/blueprints/memory/blueprint.d.ts +4 -0
  196. package/dist/types/src/blueprints/memory/blueprint.d.ts.map +1 -0
  197. package/dist/types/src/blueprints/memory/blueprint.test.d.ts +2 -0
  198. package/dist/types/src/blueprints/memory/blueprint.test.d.ts.map +1 -0
  199. package/dist/types/src/blueprints/memory/functions/definitions.d.ts +17 -0
  200. package/dist/types/src/blueprints/memory/functions/definitions.d.ts.map +1 -0
  201. package/dist/types/src/blueprints/memory/functions/delete.d.ts +10 -0
  202. package/dist/types/src/blueprints/memory/functions/delete.d.ts.map +1 -0
  203. package/dist/types/src/blueprints/memory/functions/index.d.ts +4 -0
  204. package/dist/types/src/blueprints/memory/functions/index.d.ts.map +1 -0
  205. package/dist/types/src/blueprints/memory/functions/query.d.ts +8 -0
  206. package/dist/types/src/blueprints/memory/functions/query.d.ts.map +1 -0
  207. package/dist/types/src/blueprints/memory/functions/save.d.ts +8 -0
  208. package/dist/types/src/blueprints/memory/functions/save.d.ts.map +1 -0
  209. package/dist/types/src/blueprints/memory/index.d.ts +3 -0
  210. package/dist/types/src/blueprints/memory/index.d.ts.map +1 -0
  211. package/dist/types/src/blueprints/planning/blueprint.d.ts +4 -0
  212. package/dist/types/src/blueprints/planning/blueprint.d.ts.map +1 -0
  213. package/dist/types/src/blueprints/planning/functions/index.d.ts +4 -0
  214. package/dist/types/src/blueprints/planning/functions/index.d.ts.map +1 -0
  215. package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts +24 -0
  216. package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts.map +1 -0
  217. package/dist/types/src/blueprints/planning/functions/update-tasks.test.d.ts +2 -0
  218. package/dist/types/src/blueprints/planning/functions/update-tasks.test.d.ts.map +1 -0
  219. package/dist/types/src/blueprints/planning/index.d.ts +2 -2
  220. package/dist/types/src/blueprints/planning/index.d.ts.map +1 -1
  221. package/dist/types/src/blueprints/project/blueprint.d.ts +4 -0
  222. package/dist/types/src/blueprints/project/blueprint.d.ts.map +1 -0
  223. package/dist/types/src/blueprints/project/blueprint.test.d.ts +2 -0
  224. package/dist/types/src/blueprints/project/blueprint.test.d.ts.map +1 -0
  225. package/dist/types/src/blueprints/project/functions/add-artifact.d.ts +4 -0
  226. package/dist/types/src/blueprints/project/functions/add-artifact.d.ts.map +1 -0
  227. package/dist/types/src/blueprints/project/functions/agent.d.ts +4 -0
  228. package/dist/types/src/blueprints/project/functions/agent.d.ts.map +1 -0
  229. package/dist/types/src/blueprints/project/functions/definitions.d.ts +173 -0
  230. package/dist/types/src/blueprints/project/functions/definitions.d.ts.map +1 -0
  231. package/dist/types/src/blueprints/project/functions/get-context.d.ts +4 -0
  232. package/dist/types/src/blueprints/project/functions/get-context.d.ts.map +1 -0
  233. package/dist/types/src/blueprints/project/functions/index.d.ts +4 -0
  234. package/dist/types/src/blueprints/project/functions/index.d.ts.map +1 -0
  235. package/dist/types/src/blueprints/project/functions/qualifier.d.ts +5 -0
  236. package/dist/types/src/blueprints/project/functions/qualifier.d.ts.map +1 -0
  237. package/dist/types/src/blueprints/project/index.d.ts +3 -0
  238. package/dist/types/src/blueprints/project/index.d.ts.map +1 -0
  239. package/dist/types/src/blueprints/project-wizard/blueprint.d.ts +4 -0
  240. package/dist/types/src/blueprints/project-wizard/blueprint.d.ts.map +1 -0
  241. package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts +55 -0
  242. package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts.map +1 -0
  243. package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts +103 -0
  244. package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts.map +1 -0
  245. package/dist/types/src/blueprints/project-wizard/functions/index.d.ts +4 -0
  246. package/dist/types/src/blueprints/project-wizard/functions/index.d.ts.map +1 -0
  247. package/dist/types/src/blueprints/project-wizard/functions/project-rules.d.ts +4 -0
  248. package/dist/types/src/blueprints/project-wizard/functions/project-rules.d.ts.map +1 -0
  249. package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts +52 -0
  250. package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts.map +1 -0
  251. package/dist/types/src/blueprints/project-wizard/index.d.ts +3 -0
  252. package/dist/types/src/blueprints/project-wizard/index.d.ts.map +1 -0
  253. package/dist/types/src/blueprints/testing.d.ts +9 -5
  254. package/dist/types/src/blueprints/testing.d.ts.map +1 -1
  255. package/dist/types/src/blueprints/websearch/blueprint.d.ts +4 -0
  256. package/dist/types/src/blueprints/websearch/blueprint.d.ts.map +1 -0
  257. package/dist/types/src/blueprints/websearch/blueprint.test.d.ts +2 -0
  258. package/dist/types/src/blueprints/websearch/blueprint.test.d.ts.map +1 -0
  259. package/dist/types/src/blueprints/websearch/functions/definitions.d.ts +5 -0
  260. package/dist/types/src/blueprints/websearch/functions/definitions.d.ts.map +1 -0
  261. package/dist/types/src/blueprints/websearch/functions/fetch.d.ts +6 -0
  262. package/dist/types/src/blueprints/websearch/functions/fetch.d.ts.map +1 -0
  263. package/dist/types/src/blueprints/websearch/functions/index.d.ts +4 -0
  264. package/dist/types/src/blueprints/websearch/functions/index.d.ts.map +1 -0
  265. package/dist/types/src/blueprints/websearch/index.d.ts +3 -3
  266. package/dist/types/src/blueprints/websearch/index.d.ts.map +1 -1
  267. package/dist/types/src/blueprints/websearch/{websearch-toolkit.d.ts → toolkit.d.ts} +3 -1
  268. package/dist/types/src/blueprints/websearch/toolkit.d.ts.map +1 -0
  269. package/dist/types/src/crud/graph.d.ts +15 -15
  270. package/dist/types/src/crud/graph.d.ts.map +1 -1
  271. package/dist/types/src/errors.d.ts +41 -0
  272. package/dist/types/src/errors.d.ts.map +1 -0
  273. package/dist/types/src/functions/agent/definitions.d.ts +61 -0
  274. package/dist/types/src/functions/agent/definitions.d.ts.map +1 -0
  275. package/dist/types/src/functions/agent/index.d.ts +3 -4
  276. package/dist/types/src/functions/agent/index.d.ts.map +1 -1
  277. package/dist/types/src/functions/agent/prompt.d.ts +2 -7
  278. package/dist/types/src/functions/agent/prompt.d.ts.map +1 -1
  279. package/dist/types/src/functions/agent/prompt.test.d.ts +2 -0
  280. package/dist/types/src/functions/agent/prompt.test.d.ts.map +1 -0
  281. package/dist/types/src/functions/index.d.ts +0 -6
  282. package/dist/types/src/functions/index.d.ts.map +1 -1
  283. package/dist/types/src/index.d.ts +2 -2
  284. package/dist/types/src/index.d.ts.map +1 -1
  285. package/dist/types/src/sync/sync.d.ts +3 -4
  286. package/dist/types/src/sync/sync.d.ts.map +1 -1
  287. package/dist/types/src/testing/index.d.ts +2 -1
  288. package/dist/types/src/testing/index.d.ts.map +1 -1
  289. package/dist/types/src/testing/plugins.d.ts +19 -0
  290. package/dist/types/src/testing/plugins.d.ts.map +1 -0
  291. package/dist/types/src/toolkits/WebToolkit.d.ts +38 -0
  292. package/dist/types/src/toolkits/WebToolkit.d.ts.map +1 -0
  293. package/dist/types/src/toolkits/index.d.ts +1 -2
  294. package/dist/types/src/toolkits/index.d.ts.map +1 -1
  295. package/dist/types/src/types/Agent.d.ts +78 -0
  296. package/dist/types/src/types/Agent.d.ts.map +1 -0
  297. package/dist/types/src/types/Chat.d.ts +53 -0
  298. package/dist/types/src/types/Chat.d.ts.map +1 -0
  299. package/dist/types/src/types/McpServer.d.ts +20 -0
  300. package/dist/types/src/types/McpServer.d.ts.map +1 -0
  301. package/dist/types/src/types/Memory.d.ts +11 -0
  302. package/dist/types/src/types/Memory.d.ts.map +1 -0
  303. package/dist/types/src/types/Plan.d.ts +87 -0
  304. package/dist/types/src/types/Plan.d.ts.map +1 -0
  305. package/dist/types/src/types/index.d.ts +6 -0
  306. package/dist/types/src/types/index.d.ts.map +1 -0
  307. package/dist/types/src/util/graphql.d.ts.map +1 -1
  308. package/dist/types/tsconfig.tsbuildinfo +1 -1
  309. package/package.json +46 -41
  310. package/src/blueprints/automation/blueprint.ts +105 -0
  311. package/src/blueprints/automation/index.ts +5 -0
  312. package/src/blueprints/blueprint-manager/blueprint.conversations.json +1 -0
  313. package/src/blueprints/blueprint-manager/blueprint.test.ts +202 -0
  314. package/src/blueprints/blueprint-manager/blueprint.ts +49 -0
  315. package/src/blueprints/blueprint-manager/functions/definitions.ts +60 -0
  316. package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +43 -0
  317. package/src/blueprints/blueprint-manager/functions/index.ts +13 -0
  318. package/src/blueprints/blueprint-manager/functions/query-blueprints.ts +18 -0
  319. package/src/blueprints/blueprint-manager/functions/update-blueprints.ts +18 -0
  320. package/src/blueprints/blueprint-manager/index.ts +6 -0
  321. package/src/blueprints/browser/blueprint.test.ts +61 -0
  322. package/src/blueprints/browser/blueprint.ts +40 -0
  323. package/src/blueprints/browser/index.ts +5 -0
  324. package/src/blueprints/database/blueprint.conversations.json +1 -0
  325. package/src/blueprints/database/blueprint.test.ts +531 -0
  326. package/src/blueprints/database/blueprint.ts +66 -0
  327. package/src/blueprints/database/functions/context-add.ts +24 -0
  328. package/src/blueprints/database/functions/context-remove.ts +24 -0
  329. package/src/blueprints/database/functions/definitions.ts +331 -0
  330. package/src/blueprints/database/functions/index.ts +23 -0
  331. package/src/blueprints/database/functions/load.ts +19 -0
  332. package/src/blueprints/database/functions/object-create.ts +38 -0
  333. package/src/blueprints/database/functions/object-delete.ts +20 -0
  334. package/src/blueprints/database/functions/object-update.ts +30 -0
  335. package/src/blueprints/database/functions/query.ts +63 -0
  336. package/src/blueprints/database/functions/relation-create.ts +34 -0
  337. package/src/blueprints/database/functions/relation-delete.ts +21 -0
  338. package/src/blueprints/database/functions/schema-add.ts +28 -0
  339. package/src/blueprints/database/functions/schema-list.ts +40 -0
  340. package/src/blueprints/database/functions/tag-add.ts +21 -0
  341. package/src/blueprints/database/functions/tag-remove.ts +21 -0
  342. package/src/blueprints/database/index.ts +21 -0
  343. package/src/blueprints/discord/blueprint.ts +41 -0
  344. package/src/blueprints/discord/functions/definitions.ts +71 -0
  345. package/src/blueprints/discord/functions/fetch-messages.test.ts +50 -0
  346. package/src/blueprints/discord/functions/fetch-messages.ts +198 -0
  347. package/src/blueprints/discord/functions/index.ts +9 -0
  348. package/src/blueprints/discord/index.ts +2 -3
  349. package/src/blueprints/github/functions/definitions.ts +27 -0
  350. package/src/blueprints/github/functions/fetch-prs.ts +24 -0
  351. package/src/blueprints/github/functions/index.ts +9 -0
  352. package/src/blueprints/github/index.ts +5 -0
  353. package/src/blueprints/index.ts +11 -6
  354. package/src/blueprints/linear/blueprint.ts +42 -0
  355. package/src/blueprints/linear/functions/definitions.ts +24 -0
  356. package/src/blueprints/linear/functions/index.ts +9 -0
  357. package/src/blueprints/linear/functions/linear.test.ts +57 -0
  358. package/src/{functions/linear → blueprints/linear/functions}/sync-issues.ts +40 -47
  359. package/src/blueprints/linear/index.ts +2 -3
  360. package/src/blueprints/memory/blueprint.conversations.json +1 -0
  361. package/src/blueprints/memory/blueprint.test.ts +139 -0
  362. package/src/blueprints/memory/blueprint.ts +41 -0
  363. package/src/blueprints/memory/functions/definitions.ts +71 -0
  364. package/src/blueprints/memory/functions/delete.ts +20 -0
  365. package/src/blueprints/memory/functions/index.ts +13 -0
  366. package/src/blueprints/memory/functions/query.ts +32 -0
  367. package/src/blueprints/memory/functions/save.ts +20 -0
  368. package/src/blueprints/memory/index.ts +6 -0
  369. package/src/blueprints/planning/blueprint.ts +24 -0
  370. package/src/blueprints/planning/functions/index.ts +9 -0
  371. package/src/blueprints/planning/functions/update-tasks.md +116 -0
  372. package/src/blueprints/planning/functions/update-tasks.test.ts +55 -0
  373. package/src/blueprints/planning/functions/update-tasks.ts +68 -0
  374. package/src/blueprints/planning/index.ts +3 -4
  375. package/src/blueprints/project/blueprint.conversations.json +1 -0
  376. package/src/blueprints/project/blueprint.test.ts +712 -0
  377. package/src/blueprints/project/blueprint.ts +64 -0
  378. package/src/blueprints/project/functions/add-artifact.ts +31 -0
  379. package/src/blueprints/project/functions/agent.ts +69 -0
  380. package/src/blueprints/project/functions/definitions.ts +94 -0
  381. package/src/blueprints/project/functions/get-context.ts +47 -0
  382. package/src/blueprints/project/functions/index.ts +14 -0
  383. package/src/blueprints/project/functions/qualifier.ts +91 -0
  384. package/src/blueprints/project/index.ts +6 -0
  385. package/src/blueprints/project-wizard/blueprint.ts +52 -0
  386. package/src/blueprints/project-wizard/functions/create-project.ts +32 -0
  387. package/src/blueprints/project-wizard/functions/definitions.ts +65 -0
  388. package/src/blueprints/project-wizard/functions/index.ts +13 -0
  389. package/src/blueprints/project-wizard/functions/project-rules.ts +77 -0
  390. package/src/blueprints/project-wizard/functions/sync-triggers.ts +156 -0
  391. package/src/blueprints/project-wizard/index.ts +6 -0
  392. package/src/blueprints/testing.ts +29 -8
  393. package/src/blueprints/websearch/blueprint.conversations.json +1 -0
  394. package/src/blueprints/websearch/blueprint.test.ts +39 -0
  395. package/src/blueprints/websearch/blueprint.ts +30 -0
  396. package/src/blueprints/websearch/functions/definitions.ts +26 -0
  397. package/src/blueprints/websearch/functions/fetch.ts +18 -0
  398. package/src/blueprints/websearch/functions/index.ts +9 -0
  399. package/src/blueprints/websearch/index.ts +3 -4
  400. package/src/blueprints/websearch/{websearch-toolkit.ts → toolkit.ts} +6 -1
  401. package/src/crud/graph.test.ts +13 -38
  402. package/src/crud/graph.ts +158 -175
  403. package/src/errors.ts +25 -0
  404. package/src/functions/READ_THIS.md +5 -0
  405. package/src/functions/agent/definitions.ts +57 -0
  406. package/src/functions/agent/index.ts +3 -5
  407. package/src/functions/agent/prompt.conversations.json +1 -0
  408. package/src/functions/agent/prompt.test.ts +78 -0
  409. package/src/functions/agent/prompt.ts +212 -102
  410. package/src/functions/index.ts +0 -6
  411. package/src/index.ts +2 -2
  412. package/src/sync/sync.ts +58 -38
  413. package/src/testing/index.ts +2 -1
  414. package/src/testing/plugins.tsx +74 -0
  415. package/src/toolkits/WebToolkit.ts +33 -0
  416. package/src/toolkits/index.ts +1 -2
  417. package/src/types/Agent.ts +235 -0
  418. package/src/types/Chat.ts +56 -0
  419. package/src/types/McpServer.ts +34 -0
  420. package/src/types/Memory.ts +24 -0
  421. package/src/types/Plan.ts +103 -0
  422. package/src/types/index.ts +9 -0
  423. package/dist/lib/browser/index.mjs +0 -2777
  424. package/dist/lib/browser/index.mjs.map +0 -7
  425. package/dist/lib/browser/meta.json +0 -1
  426. package/dist/lib/node-esm/index.mjs +0 -2778
  427. package/dist/lib/node-esm/index.mjs.map +0 -7
  428. package/dist/lib/node-esm/meta.json +0 -1
  429. package/dist/types/src/blueprints/design/design-blueprint.d.ts +0 -4
  430. package/dist/types/src/blueprints/design/design-blueprint.d.ts.map +0 -1
  431. package/dist/types/src/blueprints/design/design-blueprint.test.d.ts +0 -2
  432. package/dist/types/src/blueprints/design/design-blueprint.test.d.ts.map +0 -1
  433. package/dist/types/src/blueprints/design/index.d.ts +0 -3
  434. package/dist/types/src/blueprints/design/index.d.ts.map +0 -1
  435. package/dist/types/src/blueprints/discord/discord-blueprint.d.ts +0 -18
  436. package/dist/types/src/blueprints/discord/discord-blueprint.d.ts.map +0 -1
  437. package/dist/types/src/blueprints/linear/linear-blueprint.d.ts +0 -18
  438. package/dist/types/src/blueprints/linear/linear-blueprint.d.ts.map +0 -1
  439. package/dist/types/src/blueprints/planning/planning-blueprint.d.ts +0 -4
  440. package/dist/types/src/blueprints/planning/planning-blueprint.d.ts.map +0 -1
  441. package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts +0 -2
  442. package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts.map +0 -1
  443. package/dist/types/src/blueprints/research/index.d.ts +0 -3
  444. package/dist/types/src/blueprints/research/index.d.ts.map +0 -1
  445. package/dist/types/src/blueprints/research/research-blueprint.d.ts +0 -4
  446. package/dist/types/src/blueprints/research/research-blueprint.d.ts.map +0 -1
  447. package/dist/types/src/blueprints/research/research-blueprint.test.d.ts +0 -2
  448. package/dist/types/src/blueprints/research/research-blueprint.test.d.ts.map +0 -1
  449. package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts +0 -4
  450. package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts.map +0 -1
  451. package/dist/types/src/blueprints/websearch/websearch-toolkit.d.ts.map +0 -1
  452. package/dist/types/src/experimental/feed.test.d.ts +0 -2
  453. package/dist/types/src/experimental/feed.test.d.ts.map +0 -1
  454. package/dist/types/src/functions/discord/fetch-messages.d.ts.map +0 -1
  455. package/dist/types/src/functions/discord/fetch-messages.test.d.ts.map +0 -1
  456. package/dist/types/src/functions/discord/index.d.ts +0 -12
  457. package/dist/types/src/functions/discord/index.d.ts.map +0 -1
  458. package/dist/types/src/functions/document/index.d.ts +0 -13
  459. package/dist/types/src/functions/document/index.d.ts.map +0 -1
  460. package/dist/types/src/functions/document/read.d.ts +0 -7
  461. package/dist/types/src/functions/document/read.d.ts.map +0 -1
  462. package/dist/types/src/functions/document/update.d.ts +0 -6
  463. package/dist/types/src/functions/document/update.d.ts.map +0 -1
  464. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +0 -173
  465. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts.map +0 -1
  466. package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts +0 -2
  467. package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts.map +0 -1
  468. package/dist/types/src/functions/entity-extraction/index.d.ts +0 -174
  469. package/dist/types/src/functions/entity-extraction/index.d.ts.map +0 -1
  470. package/dist/types/src/functions/exa/exa.d.ts +0 -5
  471. package/dist/types/src/functions/exa/exa.d.ts.map +0 -1
  472. package/dist/types/src/functions/exa/index.d.ts +0 -3
  473. package/dist/types/src/functions/exa/index.d.ts.map +0 -1
  474. package/dist/types/src/functions/exa/mock.d.ts +0 -5
  475. package/dist/types/src/functions/exa/mock.d.ts.map +0 -1
  476. package/dist/types/src/functions/github/fetch-prs.d.ts +0 -6
  477. package/dist/types/src/functions/github/fetch-prs.d.ts.map +0 -1
  478. package/dist/types/src/functions/linear/index.d.ts +0 -9
  479. package/dist/types/src/functions/linear/index.d.ts.map +0 -1
  480. package/dist/types/src/functions/linear/linear.test.d.ts.map +0 -1
  481. package/dist/types/src/functions/linear/sync-issues.d.ts +0 -12
  482. package/dist/types/src/functions/linear/sync-issues.d.ts.map +0 -1
  483. package/dist/types/src/functions/research/document-create.d.ts +0 -9
  484. package/dist/types/src/functions/research/document-create.d.ts.map +0 -1
  485. package/dist/types/src/functions/research/index.d.ts +0 -21
  486. package/dist/types/src/functions/research/index.d.ts.map +0 -1
  487. package/dist/types/src/functions/research/research-graph.d.ts +0 -18
  488. package/dist/types/src/functions/research/research-graph.d.ts.map +0 -1
  489. package/dist/types/src/functions/research/research.d.ts +0 -14
  490. package/dist/types/src/functions/research/research.d.ts.map +0 -1
  491. package/dist/types/src/functions/research/research.test.d.ts +0 -2
  492. package/dist/types/src/functions/research/research.test.d.ts.map +0 -1
  493. package/dist/types/src/functions/research/types.d.ts +0 -6
  494. package/dist/types/src/functions/research/types.d.ts.map +0 -1
  495. package/dist/types/src/functions/tasks/index.d.ts +0 -15
  496. package/dist/types/src/functions/tasks/index.d.ts.map +0 -1
  497. package/dist/types/src/functions/tasks/read.d.ts +0 -7
  498. package/dist/types/src/functions/tasks/read.d.ts.map +0 -1
  499. package/dist/types/src/functions/tasks/task-list.d.ts +0 -74
  500. package/dist/types/src/functions/tasks/task-list.d.ts.map +0 -1
  501. package/dist/types/src/functions/tasks/task-list.test.d.ts +0 -2
  502. package/dist/types/src/functions/tasks/task-list.test.d.ts.map +0 -1
  503. package/dist/types/src/functions/tasks/update.d.ts +0 -9
  504. package/dist/types/src/functions/tasks/update.d.ts.map +0 -1
  505. package/dist/types/src/plugins.d.ts +0 -19
  506. package/dist/types/src/plugins.d.ts.map +0 -1
  507. package/dist/types/src/testing/data/exa-search-1748337321991.d.ts +0 -38
  508. package/dist/types/src/testing/data/exa-search-1748337321991.d.ts.map +0 -1
  509. package/dist/types/src/testing/data/exa-search-1748337331526.d.ts +0 -37
  510. package/dist/types/src/testing/data/exa-search-1748337331526.d.ts.map +0 -1
  511. package/dist/types/src/testing/data/exa-search-1748337344119.d.ts +0 -58
  512. package/dist/types/src/testing/data/exa-search-1748337344119.d.ts.map +0 -1
  513. package/dist/types/src/testing/data/index.d.ts +0 -3
  514. package/dist/types/src/testing/data/index.d.ts.map +0 -1
  515. package/dist/types/src/toolkits/AssistantToolkit.d.ts +0 -17
  516. package/dist/types/src/toolkits/AssistantToolkit.d.ts.map +0 -1
  517. package/dist/types/src/toolkits/AssistantToolkit.test.d.ts +0 -2
  518. package/dist/types/src/toolkits/AssistantToolkit.test.d.ts.map +0 -1
  519. package/dist/types/src/toolkits/SystemToolkit.d.ts +0 -67
  520. package/dist/types/src/toolkits/SystemToolkit.d.ts.map +0 -1
  521. package/src/blueprints/design/design-blueprint.test.ts +0 -103
  522. package/src/blueprints/design/design-blueprint.ts +0 -33
  523. package/src/blueprints/design/index.ts +0 -7
  524. package/src/blueprints/discord/discord-blueprint.ts +0 -34
  525. package/src/blueprints/linear/linear-blueprint.ts +0 -35
  526. package/src/blueprints/planning/planning-blueprint.test.ts +0 -124
  527. package/src/blueprints/planning/planning-blueprint.ts +0 -98
  528. package/src/blueprints/research/index.ts +0 -7
  529. package/src/blueprints/research/research-blueprint.test.ts +0 -7
  530. package/src/blueprints/research/research-blueprint.ts +0 -53
  531. package/src/blueprints/websearch/websearch-blueprint.ts +0 -20
  532. package/src/experimental/feed.test.ts +0 -111
  533. package/src/functions/discord/fetch-messages.test.ts +0 -58
  534. package/src/functions/discord/fetch-messages.ts +0 -252
  535. package/src/functions/discord/index.ts +0 -9
  536. package/src/functions/document/index.ts +0 -12
  537. package/src/functions/document/read.ts +0 -29
  538. package/src/functions/document/update.ts +0 -30
  539. package/src/functions/entity-extraction/entity-extraction.conversations.json +0 -1
  540. package/src/functions/entity-extraction/entity-extraction.test.ts +0 -92
  541. package/src/functions/entity-extraction/entity-extraction.ts +0 -165
  542. package/src/functions/entity-extraction/index.ts +0 -9
  543. package/src/functions/exa/exa.ts +0 -37
  544. package/src/functions/exa/index.ts +0 -6
  545. package/src/functions/exa/mock.ts +0 -71
  546. package/src/functions/github/fetch-prs.ts +0 -30
  547. package/src/functions/linear/index.ts +0 -9
  548. package/src/functions/linear/linear.test.ts +0 -83
  549. package/src/functions/research/document-create.ts +0 -75
  550. package/src/functions/research/index.ts +0 -14
  551. package/src/functions/research/research-graph.ts +0 -47
  552. package/src/functions/research/research-instructions.tpl +0 -106
  553. package/src/functions/research/research.conversations.json +0 -1
  554. package/src/functions/research/research.test.ts +0 -179
  555. package/src/functions/research/research.ts +0 -190
  556. package/src/functions/research/types.ts +0 -26
  557. package/src/functions/tasks/index.ts +0 -11
  558. package/src/functions/tasks/read.ts +0 -34
  559. package/src/functions/tasks/task-list.test.ts +0 -99
  560. package/src/functions/tasks/task-list.ts +0 -165
  561. package/src/functions/tasks/update.ts +0 -52
  562. package/src/plugins.tsx +0 -68
  563. package/src/testing/data/exa-search-1748337321991.ts +0 -131
  564. package/src/testing/data/exa-search-1748337331526.ts +0 -144
  565. package/src/testing/data/exa-search-1748337344119.ts +0 -133
  566. package/src/testing/data/index.ts +0 -11
  567. package/src/toolkits/AssistantToolkit.conversations.json +0 -1
  568. package/src/toolkits/AssistantToolkit.test.ts +0 -88
  569. package/src/toolkits/AssistantToolkit.ts +0 -47
  570. package/src/toolkits/SystemToolkit.ts +0 -231
  571. /package/dist/types/src/{functions/discord → blueprints/discord/functions}/fetch-messages.test.d.ts +0 -0
  572. /package/dist/types/src/{functions/linear → blueprints/linear/functions}/linear.test.d.ts +0 -0
@@ -0,0 +1,156 @@
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, Type } 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 type = Obj.getType(obj);
37
+ if (!type) {
38
+ return false;
39
+ }
40
+ const annotation = FeedAnnotation.get(Type.getSchema(type));
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
+ if (!feedObj || !Obj.instanceOf(Feed.Feed, feedObj) || !Feed.getQueueUri(feedObj)) {
80
+ continue;
81
+ }
82
+
83
+ const filterEvents = agent.filterEvents ?? true;
84
+
85
+ yield* Database.add(
86
+ Trigger.make({
87
+ [Obj.Parent]: agent,
88
+ [Obj.Meta]: {
89
+ keys: [
90
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
91
+ { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: subscription.uri },
92
+ ],
93
+ },
94
+ enabled: triggersEnabled,
95
+ spec: Trigger.specFeed(feedObj),
96
+ function: Ref.make(Operation.serialize(filterEvents ? Qualifier : AgentWorker)),
97
+ input: {
98
+ agent: Ref.make(agent),
99
+ event: '{{event}}',
100
+ },
101
+ concurrency: filterEvents ? 5 : undefined,
102
+ }),
103
+ );
104
+ }
105
+
106
+ if ((agent.filterEvents ?? true) && agent.feed) {
107
+ const agentFeedOption = yield* Database.loadOption(agent.feed);
108
+ if (Option.isSome(agentFeedOption) && Feed.getQueueUri(agentFeedOption.value)) {
109
+ yield* Database.add(
110
+ Trigger.make({
111
+ [Obj.Parent]: agent,
112
+ [Obj.Meta]: {
113
+ keys: [
114
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
115
+ {
116
+ source: AGENT_TRIGGER_TARGET_EXTENSION_KEY,
117
+ id: Obj.getURI(agent) ?? '',
118
+ },
119
+ ],
120
+ },
121
+ function: Ref.make(Operation.serialize(AgentWorker)),
122
+ enabled: triggersEnabled,
123
+ spec: Trigger.specFeed(agentFeedOption.value),
124
+ input: {
125
+ agent: Ref.make(agent),
126
+ event: '{{event}}',
127
+ },
128
+ }),
129
+ );
130
+ }
131
+ }
132
+
133
+ // Timer trigger bypasses the qualifier and invokes the agent worker directly on a schedule.
134
+ if (agent.cron) {
135
+ yield* Database.add(
136
+ Trigger.make({
137
+ [Obj.Parent]: agent,
138
+ [Obj.Meta]: {
139
+ keys: [
140
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
141
+ { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: `timer:${agent.cron}` },
142
+ ],
143
+ },
144
+ enabled: triggersEnabled,
145
+ spec: Trigger.specTimer(agent.cron),
146
+ function: Ref.make(Operation.serialize(AgentWorker)),
147
+ input: {
148
+ agent: Ref.make(agent),
149
+ event: '{{event}}',
150
+ },
151
+ }),
152
+ );
153
+ }
154
+
155
+ yield* Database.flush();
156
+ });
@@ -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';
@@ -2,27 +2,36 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import * as Toolkit from '@effect/ai/Toolkit';
5
+ import * as Arr from 'effect/Array';
6
6
  import * as Effect from 'effect/Effect';
7
+ import { pipe } from 'effect/Function';
7
8
 
8
9
  import { ConsolePrinter } from '@dxos/ai';
9
- import { type AiConversation, type AiConversationRunParams, GenerationObserver } from '@dxos/assistant';
10
+ import { AiContext, AiRequest, AiSession, GenerationObserver } from '@dxos/assistant';
11
+ import type { Blueprint } from '@dxos/compute';
12
+ import { Database, Ref } from '@dxos/echo';
10
13
  import { log } from '@dxos/log';
11
14
 
12
- export type TestStep = Pick<AiConversationRunParams, 'prompt' | 'system'> & {
15
+ export type TestStep = Pick<AiSession.RunProps, 'prompt' | 'system'> & {
13
16
  test?: () => Promise<void>;
14
17
  };
15
18
 
16
19
  /**
17
20
  * Runs the prompt steps, calling the test function after each step.
18
21
  */
19
- export const runSteps = Effect.fn(function* (conversation: AiConversation, steps: TestStep[]) {
22
+ export const runSteps: (
23
+ session: AiSession.Session,
24
+ steps: TestStep[],
25
+ ) => Effect.Effect<void, AiRequest.RunError, AiRequest.RunRequirements> = Effect.fn(function* (
26
+ session: AiSession.Session,
27
+ steps: TestStep[],
28
+ ) {
20
29
  for (const { test, ...props } of steps) {
21
- yield* conversation.createRequest({
30
+ yield* session.createRequest({
22
31
  ...props,
23
32
  observer: GenerationObserver.fromPrinter(new ConsolePrinter({ mode: 'json' })),
24
33
  });
25
- const messages = yield* Effect.promise(() => conversation.getHistory());
34
+ const messages = yield* Effect.promise(() => session.getHistory());
26
35
  log.info('conversation', { messages });
27
36
  if (test) {
28
37
  yield* Effect.promise(() => test());
@@ -30,5 +39,17 @@ export const runSteps = Effect.fn(function* (conversation: AiConversation, steps
30
39
  }
31
40
  });
32
41
 
33
- // TODO(wittjosiah): Don't cast.
34
- export const testToolkit = Toolkit.empty as Toolkit.Toolkit<any>;
42
+ /**
43
+ * Binds blueprints from the blueprint definitions.
44
+ */
45
+ // TODO(dmaretskyi): Potentially the agent will auto-bind the blueprints.
46
+ export const addBlueprints = Effect.fnUntraced(function* (blueprints: Blueprint.Definition[]) {
47
+ yield* AiContext.Service.bindContext({
48
+ blueprints: yield* pipe(
49
+ blueprints,
50
+ Arr.map((blueprint) => blueprint.make()),
51
+ Effect.forEach(Database.add),
52
+ Effect.map(Arr.map(Ref.make)),
53
+ ),
54
+ });
55
+ });
@@ -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_01RCXDALYPVvrpE4CecnbFNs","modelId":"claude-opus-4-6","timestamp":"2026-05-24T07:22:25.487Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" user is asking about the capital of France and explicitly requesting that I use the web search tool. Even though I know","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" the answer, I'll comply with their request.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"Eu0CCmMIDhgCKkCEP/279tJ3SfSSsQMzEAyEMCq0oW+KDp1MFyjaP8RqaZ/mvoNo1ik0m5DTxb/+mMXVq38eFQySzvFY6vhyPxhfMg9jbGF1ZGUtb3B1cy00LTY4AEIIdGhpbmtpbmcSDJXtR+TjI5aTuRtKzBoMYNxtCt4kr0q90Vl3IjD85eQpgoBhEbUfKl3yxGsuddFmbO0drJnJMBwNI33alqByowqXCPVAOCbDcf07W58qtwEG3QFS6uQzruSR2739RFI+i7fF/jgQG53+64tbGfWsyF7W6p5Irdf6qLVx++d9glGHqIpfw6XWCs99f1DQa1u8k5PRG/kUWrpXj/HRSlgdJAthZc3TT9KSXwjF+zBSTHha1e8QUetuuj2b5M3l1a+CszDjEJyduzivEdCgDikxbrqtgm1hacqQsQthhpDgSgEJ1zR1Gw4OhI8EVEReXnIO2eKSrQAN1vR3uQ5dd/YWS428EB4ZEmsYAQ=="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","name":"AnthropicWebSearch","providerName":"web_search","providerExecuted":true,"metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","delta":"","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","delta":"{\"qu","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","delta":"ery\"","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","delta":": \"capita","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","delta":"l of France\"}","metadata":{}},{"type":"tool-params-end","id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","metadata":{}},{"id":"srvtoolu_01LhFCRoTrQ1jKuLMZt5dqPw","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":"Ev8HCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDCd4qO2M/yTYP+kGQxoMy+J87CT6COWvehkwIjB/vWzvcJu+pQMBR8OFCrV0jEPI1AeA/2kRusIMGbOBIGtl3VunbTFUO3Nxu8IvzlQqggf/ng97JE6hYRkeas+mIL6lpQR9bChUMMgnYng1DwHkMic8tebHxq88SDRjRK7S4/XyfhaIOtkGv4SetIhlt9hs+vBQO0PFzLfcfOUGhYwVdrmmnBLxHzzqKP1iMbbBjD75GKOjflHgYXWoa0PebPPAve+H+PCVe/xaPtUsyTAisdVJEA3/5mek/fe0RQatocke5u1nV6pSuV0aCZl86eeZGmgVres175w+c1oJ7MiZbr7v2ftmjM9+FAuv8g2/P/EV4cPGa+FArjQFOkKCnIDvWwzgzDPWxtwN7pcLWGBZCLCx+zUAXcxkUDjbiMMFSEB0nzJikOnstpQ0yKtwQk506+1hY2VNBCIge0GmTqQKILBvjvaVwpmp7Kh184K+dQ9sb12glYZJiakWayqaYbFRja1gn2S85dGUjaP5N4LqLZ9yBkUk6LGgyUxSbHWjC+U9HvrEQ30IBnjlhNZXsm8vKj87Y838VPbZAPubZpma+Bta/ON3uPcsL/i+dxKUb8lxV2XROXOpgtk7Lj5dStir1mcxzYpdvQ9WUMhFYEHw+1W1ZUVb04tJl5HlTTtCArPsh4ELFjw7s/dIjf8HJ1oi238EGfJIwgPXGY4T5Cb+k/mrGwh2zALfeiX0OXBfrtXjI+5B4CO3s2zaEExeE68ixLEsOpEhxkhHx0a3xB+0M0PG/BNHVcFqrsIo6c9Ot/D6Gnxzdqg3tOr4WWv6TGn9pC8Fa8fLTv+KzzlQ8ewnwojoYpM/3Q4ec43BfIDcbXk9J8r2V7wzcb7kTyraSJcZvCAvYagrHzWUsFKOtQ63ZwkJ4ZJbOCuhChnZ3LNEkoLXOiMaUE1gT0yAp9DWd+mT+/+VEvRsoKjXKZMP+9W+jcFAnCWCTYJm4m0EFSwOU6eEVbp07Pw05BA7nRlBGaw53aYImxEujtLzAFetb7x1m+64QLTUCUz4n3A1QE2Wf4h7md2l+fjt1G9hM/1hdN8fULGfCe0h+sgg7fgM+jFMm7c9sMUWZwwAJBbjxqvz9zioIi6AeZMyvptW7vWqhYZmvcV+icaS5/AXttPApeov05wcHqAnbX+XdX/c9YnTY5wwPCJbHasxIJ8HDxLNokhRBpgsZQVbbW+VBotRhnK1qyP1nU8Bc3T3UZkwqXJaa1tYWWZB4NPI6SAW9LRftEz4CxSTnxNAxutw+pnocFQGDvFjGAM=","title":"Paris facts: the capital of France in history","type":"web_search_result","url":"https://home.adelphi.edu/~ca19535/page%204.html"},{"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":"3 days ago","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","type":"web_search_result","url":"https://www.britannica.com/place/Paris"},{"encrypted_content":"EsQDCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDBIOHBcdwBRmHj+8LRoMOAYXrvRxEDL1JzqnIjB+kre8rIrgXIh7Yf8OHa04aegXBnK2o37iPO4gJS6tadKOqEAsM1/utlhKIMIPm38qxwKjSRw6OBJvdWFy4yrnIgQkZ1qi1WOne0V4IUC1Z30MLlJQQiXPaRSCn69BIN6XJFtGM53e6TrLOKXqg39hlU7uUHiLEaiBH8s9sRkcKxXTIRTL2uPN5WURBTNbnPA887DnlZbId2/S6znYh5sdGzZO3hYTHslZodUSsSHQHigwnWzxTPWRgvzRa/2XQtVjk4H+wmSgAnrbn4TlsnQcSfsLu1tLwrFj5N9sqffi4fsnkMXj9jwWFcXSNWUiLSc5MWIZ8d8hMwfuGkO8eI8fHpsHln/dxIkafhj3xyi7jdLd3+GObIuFXrI0qO74NHEWjI3rj7ObyyCvGZwYFEDTni1LQlr+kx8jGYEYUjDK9tHO4hdBNUmJx0H+neKFB014OcCANzdMTYmFN9QwXTuHlrPYUwmpyGHFD3iZfxIyypCcIRl8pijT1g0YAw==","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":"January 31, 2021","title":"What is the Capital of France? | Mappr","type":"web_search_result","url":"https://www.mappr.co/capital-cities/france/"},{"encrypted_content":"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","page_age":"January 22, 2026","title":"Capital of France | Paris Travel Guide, Facts & Highlights","type":"web_search_result","url":"https://simcorner.com/blogs/travel-guides/capital-of-france"},{"encrypted_content":"EoEnCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDN5kMGWGyt5CgT8ovxoMMfPiZcd9QPZLJO28IjDWKtJm1eXO6pA4xRgsv5JohwTdmyQUmiU8cOUU2hTy1miMJsuef4+M6M+iiQWjnyoqhCbGyumU31pvhzaClIwzp3wem4ybPPqW+WixPvDc2a56zRyOgPLBrP2uIUpO3C+t/0XL30AJ2LWa3mD6RSvsLhtQ/S37O3g56L3yv0CxyHi3EKu2W5lnQ0lRbY9iADvpT6G67jH+uBk1sOlk5IfXZ63wgeZmxzJwFIJG79CXuhKjfi9is3qvYRjYUXXny6dVDrd4Ck11C9YFEW7H0uaYrG3Nl7w3xpodCvAglHM+5zdCoFhOwWNAs0FAD76g9wu/9NjWe2Oof5+lvhpducA38c1TP+wN0y/Mhe/wwiapFwBRsU0KINmmMo4eJ9+CrH2vd/4du68JfT+m/2JwR/bDnzr6CoqNvW/lmvpXbjxbPWHlu5cZ3tY/XyBSHgRMxgJjXOI1No5E5W4RkfNaXHsfnsxJoinyvSUIRcDTdlxtPYAo9zxdQ7kpilbyArt5DzWGC5nOgQOFLgmk0cvvSv2ZmOhS2AtcbZMadztwUkrm7rkwmMBBODToTdFSpvpFwLFLuNeYwgTcdql1j9m/+BS0i5035zyREZG4DDyP7TUBInC/shspdt9PEWjeBgm/kVbClJ6g4OY7/WTR2Q3j5HhNOOurqS+CvjuLbAgVzSVrKZVG7x2dbGgoiSYuVF2pnkpTskZwySU+m79D0pddGqlSP1cGQ4MTNpMPOBweXdP0QaJExJlzf2CJm8If4znYXrfckUmzAfPjleUVWUb19VxC7ORvnxCk3Ulm0XHrGr1lk8gBLr3ODchxyFM3GivTkpWP3mXRqiPTUjcPSxWGejKHyTJm/owJ7pbW5V3LNcDNHs4USlb4ARVg3zil0nnNBosaLe7K6GXRRoL8iATYAcuUJyDjhM/JS/PElH12MHCrhLu9BZ2CToNH9bi7ccqUMRsK8TA70N117/SMj/lENmRsCmiIScf5UTyE573LnysHTQ0i2Y1AZcOXmJ7Ceq96q8K3N+4SrXQIYM57ZKs+4h5t7+9w02+I0FpPMbS2EQjQqJMaCW5LbMdm+PU6IK4WFo1z6ObgCt2osVqniXBdz5/N8gCHZxlTAhjbQvD5XMAVO2NBE35G/JQmRLVFmz51OTor3CyaOkHz31Z/5o198kI26hQoH3grWI215QlNw7014eNdk+tJ6t0hqkeW1Q4rLj7Fmsv1RehIxydqraxkLUpCVSexZe94EVF+G0V7vUZEFY0sDNyn4J2Ms0IHmRTvC9EeRIjOkjUMCHjJ0z5qDJ04x7XLCOQT/LjCMDnlkuayBTksqwOpIMZvVkxI0oI+ZjFmenGRIecxrPtrvjGZeSDGFx2jBZ7ZRvG6E/Khw19PJE7m4vxax0eQk071Iefso14MBr4jP0V9Hi/TcQjLrCUmRIpKfokIYhadIGeew4RQq3arfYyn0QKTDJPP6nhbCkw6EX4KYvV1ab79CotOeGsaycFtDaOM12iYRWhgYUF2lpqDvL5jwU1UYFxUjm1wR+BeJuLtqiffV/WD1QWsCQr+wvgh15N0DQ6RosyK4A5y4yChWGuc+XUUP3jCYmy7aYaIABi/W30un4or7kr7LPTVvtKt9i8slamFEAKU8zCuiz5O5dJmKMdw4GN+CKmV2zhgeey6rftdBno39Icb65SAkbiFt2yUiLKFgW/l4UTowSjAVMcY5JjJpXhW+NLg63qidW5Q9I9tb/bmnB9V5kHSBnKWXl27TNwSQ3ov3IjjSkquVGRXzpYlP+AwZJI6FjZvdz7sq4i8OGb2kkggseNS4U5yFLKhoVdYf9Q3oc+nEWmNVE9dhCk9kDBGAWw7ZLDHoPIDUnh+h7ilqKrzc+pf+ZdbucWiT3mpriOGp3NulXbhYKPLyZB6ZYiMkyTHu5gFFG29ntSANfMEaaCTcIQs+lgCDWcUi42lPd2WmTCZBtzBkoEhhYFuuMTrK5hntdyi/hOgvMPDWQhrQ8NyaBcCyXTLiIGP4mv2QBcgcr8EnMHV8YOvEQMQi9rxnECc9/87ZpAF1+hHpICg8Dm9PuiYWxh3X3qyGzLWWTM062UOrif5NsH7xSrk8olEVILcvRLHHlbFVKKqg+Tan7UmwHbqJ+J86p4m7D04BPLm5OuDqjlbwTggOcxeMhwkHOpfN9m3uFe1zEWz7i1o20qL/Hc+6M3ivzzKuNZkj/glkRf50yfoxKyPXpsqiX1Q+Fy3/XfGmTRZSD8oHDnMwEygsdBPX1OQQ4kJCpuwtaUHjln8bnfxZ70PPNJcw3MyKZeo3naVumX2gxlrFkc/S9nR4rFmEjL7Ox4Q7FEcLQ/EuwKc0zPOP8gsOJH9mobmMrZ7O455oMkIqpVhZHSmQ2Ix/1wvfs1+ExeHyQzDb46pGrVtr/1hZDPjz/FFn8tPoOEmOnU7PrbzaU4Cj7b9S22aqXK4zK2Z7ey3UR20E6oJlYKgXo7WV60Ju+TEkyYL4sJu0Ysx0MZ0McJoGSrS0V4AuE9nx8jupi3TAlEJAeW0ky/sMSCz1h197LTh/I73iuIyYk6PTnN9PsjrzuPze6wyRx2r1zLGfrHxNvGt7z+gjCzQSCvwtRQcDmeuTESCE1I/jxUBM7HL/DfXZA+nI3dhHlVIiqJfLwF2oBI9WnE1Ue4sHYFXhs66zZzQ9iQPORg+V/NpaduRbi6qOG88JyZbjct372Q/ET38Cs2+MqL1+0fmAOyG96RsPl/jdAeQKTAZFBPbjR8bowbuhx8MG5LwVnBNIMi1RkETWDXsuL2LrV1lP+z9lfDIyOK8VFxdfVSoqjhsfnB4iBB+TuvhGklctREVQvQFcoTFkvHP0ZeuAY8oQTCpSa6TtKwNJ/HkcASVkqNIBQJ5rkxvAF/RS9a8EpcGDv+0h/xRhZoM+BnPr6sQ0Q9JtVIz3T/xaPWMCKWvJcheFVb5QH71KubbRfkTmmTl7AN8Zs+rNKuJBHKqBt0VSkmK1ylLIzNmD//L+XzYBiJUQEBcs5PpXv0PKwnSILbysqrBBnLMcb7BDOukcD3pJkIbjOI71wN4Uwsh9gyHJWHA73X+tnmi+v2wKMCNDVpNEyq593Q0Tac55Ga1VHVasRDsKOiDW2KoCiDiOZMQqEgC0mnjzpYcJO71NlhNG8Yh3O0q/jYncpe3404WjYeksaU9cluHUuZS98fwCFsuoGFBBW0cYkAX0kzDZabZ+hkZKPPjm4vrKUrPGs3afCHKk/dD3aWq7Wr/Eqh0nchNkFCm4iaKQZp1TNoNXk1gFj1P2AcpXMlzGxkBTT0JXL30NVCnJs0uI+niPSfkwwgXiRFSC5Kc9mz+Cc7iQhHY7yIYt/bOAZAX+9mCEF1T9D/L3AdQwl4JL9Ql2zyGSQKCmoiwvG3xlu6v+sbAh1F0+i1exNTtbnA+a4GqJqsHMIOVIOkwzlk/KjuUZ1vJ6d17ddTaUkjrutz45ozMrhirdEOu2OXVueEVZ04+ot3btzp+avAO1cSIPJkkxECsvi0eLFUlvfQ0jxLv4QhvMMdO1rR4zWe1+bNCQpq21Q2eVIPQHHitTtfwvUvKKMeWwkqXzYJ9uKqfuWytAhw0GWqdJAs3V8RWD5U2qheNrt50/gCVDs6+qsulcb1Wfd1kLlMvbUsS/9eNO2koHhxkvFS0/BFSio39WiEIUbSzoBf8Yl5XdtZr/uIP8vJRxS1K2+dgR5mJZT2h2Q5Yc41Cjmi3cpxNip1xWN5lvQCw0pETyJ6WfTeomjeyPjH/YwUVZcsaCZIRmHF9KGxprUtW/UyQ0yS3aTy/FvLiLgv75YF5DQeWcZyunGKztS0/05zzK1R+tdIOjfMWZpaxm+pxiHrLM+dQhHRb/DCKb6WPzusMkhRRjH8i7KfJy2kMKAQdjMa9qZXlQsQFKEgOSc0nyXdMDEXYE0VEH3jl6zbQwxWIGOhGL5MM2vKJ1Vd1GaN4ahFpOWBfiyUsLbQ44iEdkXYQlLKax2ckvz3NjKXoc6+zjjIDOXSoavTGX4luZwKgKyBRJXP7NZtP12jdgmUlWIojgTjrnO73FS80cndVEvW3VYqHUMlHTv2OJAC51LG2YUeJxufRWNR0aKzax5pKcmu+Io4ht4UxFxJvvOtBkfxBsYs7WboiWL2WZkBrln8YIcrAupOyS5KdQskdvGlIn8jRAxsblJjwf8rW2skEs6nN4rg8LBCd8ePW8sDXkOPX4ns3WPcPIq/inpGmPQDmv808d3n0JPFb4bXinWM9CnRi53ThUwkkVlqeKmaHwmVWaX/5WgMg1bW4IKP0W0XY+QjBeQPkfs+33FZ/Ok7Wisu4W68wEPGPUZO/RbJfgw17WB5rN0Bj0AKlesPUcy6dHlxY/E0PhfYhWAFEUTb8oWlQ9VB/jK7cdn/+eeciNeTYcYOQdYpayr1weWhEXlwfaOIM14D4NuBjaZZbG5hAFZq7PAGiDEIOom2QHlXblF8dRdAx9oMS8z79p0cdOin3BGPrKLgEgtHl7zzpd4HtU3DOTq6PJIPdqVLWWYX7x2xTszeq1ArpAPgzT4kvmMdRzJMq9UuHtPtEHFX7QLXA+hRWA88Xwi8pxx+51mJU3Vrf9IBbN1+H9aLltw8q8eBH2fc2cBpzxBLN+OEGf9+ksqZvIGRwNfZaztSmqdxKA2xpMn7Cw6YqAnfluXirYc5+VIHA7dVhFmXtnq0SCg0gSlbnRDlWcf5QL9YH7GYBbXQd1GA1nwOrMtSOCz++u1ailpHX0xFWbYAifEluVE+/9Db54ie69hv0dN8QWbbNilUWlhd9Xp64Ko1t+pu6NXn9oicapRjEHSgDeO2ngS9BhZCftmMxeHpROb1Q1SL4taJU87eGHBpjkG4peL3P7sIuXrLuoFFsmZzaqQqbSFF6smE3h3FWRGI2qnfmewsvMhE/iC0FxnoodEH+yITr4bX5BOd32tdiHnfYo3uByVxf+9H9frucOBDXJrD+hgVKfT6Tv3VWTgkvTGPebM2yJ/BsGmjbFreMlGwt9YmbTm/iFBKdK5XY0ROdHuuW4ggGqV3zDWDU+ZjIMky3cKK2Igz1VoyRUD4+HSZ8wdFLcbyHtZZ7IcQTNCN2PsNJ6/tvmu2shaFN846N+a17IZsDbMC1e2Phx+had2L0gzO+HMFTF0N0eofDSuJcbf08YtbW3Acl0Ug7I+NIR1fk3lmXmWChMz03OcEHNx4ixR3qp53c6Wr1WVmrcIT+ax5Ie60zwCBS0kF8f907xa8qYXm+nyQdCGbf6RgNDWyIXUYgqmLs3cMi76lZ/GgDotmEIp8zeFLrylTfqsZOdHCJ7XpXQ72MLLEtg62tTbWcXcrvbnobF2MQ6YgtxlorsvO0nhc8qsdTJwgWRSmMx1w1n7/Nn2xnSP/EVA3aaNPFkJpcD8gE8z2YgDQeylUc++yRJD6tEmD+0L7wYBKbhwZUGdeeCgWBifdp70p0FTWdufilvpeUK/XdZ6Ito8eeZU28jd2I64EvEHgOjcbe71bx1rFVr1XjxKlbw0WpOIaCidw3Ejs/7LR1uEVk9fSuMTOtFa4zK3Ug5reUd1l926C73CVxx5QPva+81R4Yk+E6aGyDZusxBchioylHhmL2MKTkLdhUlERU3vYiURXO/cjjJkqNCzobnAO36LX0CAo+4csO9D+PTrU7ZRRYAPKmn3v5XTMppv0JS5WRan5Uhmvrpbhd+NGKtZw4jrSlRPODWjYe+xnH8aongFuoAiN7pQ9I69fJyUhfK99xKjQMWmrPbI9s3udysqRjJcWsamyjtbRnMEg51Wt5NnDk8dxTA+I9Hjf0p3qlX/FZHhB0PZno01cifCb9fqa7AK2FvYFmPPUtalxuNnw9rJHp2F5sm5at9jvDJSSQi3peccLJqIdTTiDplrTtQpSroFu92R4U82LsTxLPxvE8v8ug6ol+Xs0LfaRb75m3+zmoMwNbfkGG+dlbmk4+YhoFZO06ySAzJwMNJ9ACQ1tyYid/zUV66fUO9VpJZNcRhwd6md2gMUljehDIA/tTAFLT5tTuKAvqIkmJpeM/VjfE1LEqQuscYmlBgOlqVkaUv/+2Q9Vk/Lg+vf+ELZ7x2p7UloJFPn5sVBJJzHI9m5y56adYkfcHeXUleEYB8l3437CH7prUSGaXu8cVNydUR7sUV5D4VELtAlfP+FUl9m9IWkmx0TxFEp2t1lc081zObQ86qAM7Wrg3oj/6EsschWZJGaq5M+eQSizK+A2qoorg1pbacdNnLpfogWejBDdT+cgLZd1jvLdBINT0mScSTas7U/dTY+zsKGvCYncL39Klu0lnz3IbANA8SuZp/rkfVY8ix0NuWqa8gKR68fTMB4Q3okta5fSrLxJpcoKxQA/JoUORFblV/TbGkbT1nwZTMWtv7riIg9+PRZGS1YRcGyp8aUKU60XoUXXssBOBzFnh8ha2Fda7dG+qOB1Lq4VehoyUYPwgwWQtqAN4OjCim4OyWBTD0KtZEiQ2Mt4WjBQnPm05/CYqjcdo3qfQxrgIljpW0x43aWiJ06jEOJXEnzq8l3BfqJMoZ2N+7BgD","page_age":"2 days ago","title":"France - Wikipedia","type":"web_search_result","url":"https://en.wikipedia.org/wiki/France"},{"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"}],"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_IxzUUOn5S52QZMii","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":"Eo8BCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDGUTlyyMmAK6fMfwmRoMZlIr/hzw+RqumG8RIjCcR9VShBEE2FzuU173b1jpHV42PTt5KyXE7mrRK7DwztuC1agwxKcbyA3Pp+FXVmkqEwdQmNcGCxNqFIvJILAlb2JMPigYBA=="}}},{"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 and a metropolitan population of 13","metadata":{}},{"type":"text-delta","id":"4","delta":".2 million as of January 2026.","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_Sujn4u5bY8eVf0nU","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":"Eo8BCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDERvWj9oKtAuYCoJ6RoMp6PN7BKtQMk2Ul04IjBTroJ9VEA9swU7gr0G0fqSe+prP+5jDIVGiQVx5EIk/CTmjkiOWm40d/Pu3RfWhaAqEydvJXIQ0gDtpiqSukjI/BJH6rAYBA=="}}},{"type":"text-delta","id":"6","delta":"It is located 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_1oVpatHngPq3MGlm","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":"Eo8BCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDOuBRA27+pw82BrKzxoM/rVovGw5sf3CqZ0TIjClj9c9nrbnjJK5Kyqk9Y6CJ2++571btaS4685MNrNgOw92X63Ysyzc5hnzNTIfAP0qEwqFy5p0577tObPligltqTmNakgYBA=="}}},{"type":"text-delta","id":"8","delta":"Paris is by","metadata":{}},{"type":"text-delta","id":"8","delta":" far the most important city of France and one of the world's preeminent cultural","metadata":{}},{"type":"text-delta","id":"8","delta":" and commercial centres.","metadata":{}},{"type":"text-end","id":"8","metadata":{}},{"type":"text-start","id":"9","metadata":{}},{"type":"text-delta","id":"9","delta":" Often called the \"City of Light,\" ","metadata":{}},{"type":"text-end","id":"9","metadata":{}},{"type":"text-start","id":"10","metadata":{}},{"type":"source","sourceType":"url","id":"id_esfLYtQuLuMRflIy","url":"https://www.britannica.com/place/Paris","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","metadata":{"anthropic":{"source":"url","citedText":"Its sobriquet “the City of Light” (“la Ville Lumière”), earned during the Enlightenment, remains appropriate, for Paris has retained its importance as...","encryptedIndex":"EpABCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDIQkQZSh78YLv14YLBoMPlkdnGNQbsSLXIS5IjCrY2sm2bFDnBDlJzxiKME35ZNgVsB8pPWAN8QX/oT/s6XErWpCY2Lnq8YSOypNvEsqFHUuHpMhGMflbzQGLOGrkMHODq07GAQ="}}},{"type":"text-delta","id":"10","delta":"Paris earned","metadata":{}},{"type":"text-delta","id":"10","delta":" this sobriquet during the Enlightenment and has retained its","metadata":{}},{"type":"text-delta","id":"10","delta":" importance as a centre for education and intellectual pursuits.","metadata":{}},{"type":"text-end","id":"10","metadata":{}},{"type":"text-start","id":"11","metadata":{}},{"type":"text-delta","id":"11","delta":"\n\n","metadata":{}},{"type":"text-end","id":"11","metadata":{}},{"type":"text-start","id":"12","metadata":{}},{"type":"source","sourceType":"url","id":"id_qBCTYKS03wtmCoRZ","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":"Eo8BCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDJDHd6hZM448wmV1GBoME1DqkF5ZxS7lzDuWIjA5e3qnTTqMOmlGF9tp2qQ9UFxrUXZ5F4EA0+TwF8jh8/pFlQJjylf1gZBjUjmKx64qE4ZX1Jxsx/Mf9bxiczqN4jywYFwYBA=="}}},{"type":"text-delta","id":"12","delta":"Paris has been the capital of France since its liberation in","metadata":{}},{"type":"text-delta","id":"12","delta":" 1944","metadata":{}},{"type":"text-end","id":"12","metadata":{}},{"type":"text-start","id":"13","metadata":{}},{"type":"text-delta","id":"13","delta":", though its history as a capital goes back much further — ","metadata":{}},{"type":"text-end","id":"13","metadata":{}},{"type":"text-start","id":"14","metadata":{}},{"type":"source","sourceType":"url","id":"id_Vv86f7iYVAC8jFaA","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":"Eo8BCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDHNOx9gpGwA3gr35PRoM+omClq+MCicaeP9XIjAZmvT8VAyibvxvboW3NGr/0q4UT/KvHKkmn64yOS0NreITGglw1kfE6iQE1y0OFgAqE1mfmh2LSPTfuWzGDRO2wrtaoB4YBA=="}}},{"type":"text-delta","id":"14","delta":"Paris first became the capital of France in 508 under King Clovis.","metadata":{}},{"type":"text-end","id":"14","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2345,"outputTokens":376,"totalTokens":2721},"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
+ });
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Blueprint } from '@dxos/compute';
6
+ import { Ref } from '@dxos/echo';
7
+ import { Text } from '@dxos/schema';
8
+
9
+ import { Fetch } from './functions';
10
+
11
+ const BLUEPRINT_KEY = 'org.dxos.blueprint.web-search';
12
+
13
+ const make = () =>
14
+ Blueprint.make({
15
+ key: BLUEPRINT_KEY,
16
+ name: 'Web Search',
17
+ description: 'Search the web.',
18
+ agentCanEnable: true,
19
+ instructions: {
20
+ source: Ref.make(Text.make()),
21
+ },
22
+ tools: Blueprint.toolDefinitions({ operations: [Fetch], tools: ['AnthropicWebSearch'] }),
23
+ });
24
+
25
+ const blueprint: Blueprint.Definition = {
26
+ key: BLUEPRINT_KEY,
27
+ make,
28
+ };
29
+
30
+ export default blueprint;
@@ -0,0 +1,26 @@
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
+ icon: 'ph--globe-simple--regular',
15
+ description: trim`
16
+ Fetches the content of a web page and returns the HTML.
17
+ Use this to get the content of a web page.
18
+ `,
19
+ },
20
+ input: Schema.Struct({
21
+ url: Schema.String.annotations({
22
+ description: 'The URL of the web page to fetch.',
23
+ }),
24
+ }),
25
+ output: Schema.String,
26
+ });
@@ -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'));
@@ -2,7 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import blueprint from './websearch-blueprint';
6
-
7
- export { WebSearchToolkit } from './websearch-toolkit';
8
- export default blueprint;
5
+ export { default as WebSearchBlueprint } from './blueprint';
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);
@@ -2,60 +2,35 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import * as AnthropicClient from '@effect/ai-anthropic/AnthropicClient';
6
- import * as FetchHttpClient from '@effect/platform/FetchHttpClient';
7
5
  import { describe, it } from '@effect/vitest';
8
- import * as Config from 'effect/Config';
9
6
  import * as Effect from 'effect/Effect';
10
- import * as Function from 'effect/Function';
11
7
  import * as Layer from 'effect/Layer';
12
8
 
13
- import { AiService, ToolExecutionService, ToolResolverService } from '@dxos/ai';
14
- import * as AiServiceRouter from '@dxos/ai/AiServiceRouter';
15
- import { tapHttpErrors } from '@dxos/ai/testing';
16
- import { AiSession } from '@dxos/assistant';
17
- import { TestHelpers } from '@dxos/effect';
18
- import { DatabaseService, TracingService } from '@dxos/functions';
9
+ import { OpaqueToolkit } from '@dxos/ai';
10
+ import { AiRequest, ToolExecutionServices } from '@dxos/assistant';
11
+ import { TestHelpers } from '@dxos/effect/testing';
12
+ import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
19
13
  import { log } from '@dxos/log';
20
- import { Project } from '@dxos/types';
14
+ import { Pipeline } from '@dxos/types';
21
15
 
22
16
  import { makeGraphWriterHandler, makeGraphWriterToolkit } from './graph';
23
17
 
24
- // import { type EchoTestBuilder } from '@dxos/echo-db/testing';
25
-
26
- const TestLayer = Function.pipe(
27
- AiService.model('@anthropic/claude-3-5-sonnet-20241022'),
28
- Layer.provideMerge(DatabaseService.notAvailable),
29
- Layer.provideMerge(ToolResolverService.layerEmpty),
30
- Layer.provideMerge(ToolExecutionService.layerEmpty),
31
- Layer.provide(AiServiceRouter.AiServiceRouter),
32
- Layer.provide(
33
- AnthropicClient.layerConfig({
34
- apiKey: Config.redacted('ANTHROPIC_API_KEY'),
35
- transformClient: tapHttpErrors,
36
- }),
37
- ),
38
- Layer.provide(FetchHttpClient.layer),
39
- Layer.provideMerge(TracingService.layerNoop),
18
+ const TestLayer = Layer.empty.pipe(
19
+ Layer.provideMerge(ToolExecutionServices),
20
+ Layer.provideMerge(AssistantTestLayer({})),
40
21
  );
41
22
 
42
23
  describe('graph', () => {
43
- // let builder: EchoTestBuilder;
44
- // test('findRelatedSchema', async () => {
45
- // const db = await createEchoDatabase();
46
- // const relatedSchemas = await findRelatedSchema(db, Schema.Struct({}));
47
- // });
48
-
49
- const Toolkit = makeGraphWriterToolkit({ schema: [Project.Project] });
24
+ const Toolkit = makeGraphWriterToolkit({ schema: [Pipeline.Pipeline] });
50
25
  const ToolkitLayer = makeGraphWriterHandler(Toolkit);
51
26
 
52
27
  it.effect.skip(
53
28
  'calculator',
54
29
  Effect.fn(
55
30
  function* (_) {
56
- const session = new AiSession();
57
- const toolkit = yield* Toolkit;
58
- const response = yield* session.run({
31
+ const request = new AiRequest.Request();
32
+ const toolkit = yield* OpaqueToolkit.fromContext(Toolkit);
33
+ const response = yield* request.run({
59
34
  toolkit,
60
35
  prompt: 'What is 10 + 20?',
61
36
  });
@@ -63,7 +38,7 @@ describe('graph', () => {
63
38
  log.info('response', { response });
64
39
  },
65
40
  Effect.provide(Layer.mergeAll(TestLayer, ToolkitLayer)),
66
- TestHelpers.runIf(process.env.ANTHROPIC_API_KEY),
41
+ TestHelpers.provideTestContext,
67
42
  ),
68
43
  );
69
44
  });