@dxos/assistant-toolkit 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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 (571) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/neutral/add-artifact-4IVGW6CI.mjs +30 -0
  3. package/dist/lib/neutral/add-artifact-4IVGW6CI.mjs.map +7 -0
  4. package/dist/lib/neutral/agent-F4L7UXME.mjs +65 -0
  5. package/dist/lib/neutral/agent-F4L7UXME.mjs.map +7 -0
  6. package/dist/lib/neutral/chunk-5GPL2WXU.mjs +292 -0
  7. package/dist/lib/neutral/chunk-5GPL2WXU.mjs.map +7 -0
  8. package/dist/lib/neutral/chunk-7UCYAP3T.mjs +332 -0
  9. package/dist/lib/neutral/chunk-7UCYAP3T.mjs.map +7 -0
  10. package/dist/lib/neutral/chunk-ANSF2BHN.mjs +67 -0
  11. package/dist/lib/neutral/chunk-ANSF2BHN.mjs.map +7 -0
  12. package/dist/lib/neutral/chunk-BCT55UTL.mjs +75 -0
  13. package/dist/lib/neutral/chunk-BCT55UTL.mjs.map +7 -0
  14. package/dist/lib/neutral/chunk-COL54UJ3.mjs +60 -0
  15. package/dist/lib/neutral/chunk-COL54UJ3.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-EJAQUAKM.mjs +73 -0
  17. package/dist/lib/neutral/chunk-EJAQUAKM.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  19. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
  20. package/dist/lib/neutral/chunk-KGU725LW.mjs +29 -0
  21. package/dist/lib/neutral/chunk-KGU725LW.mjs.map +7 -0
  22. package/dist/lib/neutral/chunk-KS3IA6FQ.mjs +101 -0
  23. package/dist/lib/neutral/chunk-KS3IA6FQ.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-MMQ7HFL4.mjs +107 -0
  25. package/dist/lib/neutral/chunk-MMQ7HFL4.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-NR3GTWRC.mjs +53 -0
  27. package/dist/lib/neutral/chunk-NR3GTWRC.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-PLGEBNTO.mjs +65 -0
  29. package/dist/lib/neutral/chunk-PLGEBNTO.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-W2722TC5.mjs +70 -0
  31. package/dist/lib/neutral/chunk-W2722TC5.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-WLR3BGO4.mjs +25 -0
  33. package/dist/lib/neutral/chunk-WLR3BGO4.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-ZFXLTBZG.mjs +73 -0
  35. package/dist/lib/neutral/chunk-ZFXLTBZG.mjs.map +7 -0
  36. package/dist/lib/neutral/context-add-S5MBW2NA.mjs +22 -0
  37. package/dist/lib/neutral/context-add-S5MBW2NA.mjs.map +7 -0
  38. package/dist/lib/neutral/context-remove-35O5T5N5.mjs +22 -0
  39. package/dist/lib/neutral/context-remove-35O5T5N5.mjs.map +7 -0
  40. package/dist/lib/neutral/create-project-3AGXJ4TD.mjs +35 -0
  41. package/dist/lib/neutral/create-project-3AGXJ4TD.mjs.map +7 -0
  42. package/dist/lib/neutral/delete-J3PMWP7Z.mjs +19 -0
  43. package/dist/lib/neutral/delete-J3PMWP7Z.mjs.map +7 -0
  44. package/dist/lib/neutral/enable-blueprints-IVKST3WH.mjs +47 -0
  45. package/dist/lib/neutral/enable-blueprints-IVKST3WH.mjs.map +7 -0
  46. package/dist/lib/neutral/fetch-KHMHV7JR.mjs +16 -0
  47. package/dist/lib/neutral/fetch-KHMHV7JR.mjs.map +7 -0
  48. package/dist/lib/neutral/fetch-messages-QOBBCTGC.mjs +139 -0
  49. package/dist/lib/neutral/fetch-messages-QOBBCTGC.mjs.map +7 -0
  50. package/dist/lib/neutral/get-context-FBYWIP72.mjs +35 -0
  51. package/dist/lib/neutral/get-context-FBYWIP72.mjs.map +7 -0
  52. package/dist/lib/neutral/index.mjs +914 -0
  53. package/dist/lib/neutral/index.mjs.map +7 -0
  54. package/dist/lib/neutral/load-GAT3T2AD.mjs +17 -0
  55. package/dist/lib/neutral/load-GAT3T2AD.mjs.map +7 -0
  56. package/dist/lib/neutral/meta.json +1 -0
  57. package/dist/lib/neutral/object-create-PL3WRP74.mjs +35 -0
  58. package/dist/lib/neutral/object-create-PL3WRP74.mjs.map +7 -0
  59. package/dist/lib/neutral/object-delete-PZJQN5KW.mjs +18 -0
  60. package/dist/lib/neutral/object-delete-PZJQN5KW.mjs.map +7 -0
  61. package/dist/lib/neutral/object-update-R43N3VJX.mjs +28 -0
  62. package/dist/lib/neutral/object-update-R43N3VJX.mjs.map +7 -0
  63. package/dist/lib/neutral/project-VVXXUMAI.mjs +23 -0
  64. package/dist/lib/neutral/project-VVXXUMAI.mjs.map +7 -0
  65. package/dist/lib/neutral/project-rules-KSVSOZJV.mjs +78 -0
  66. package/dist/lib/neutral/project-rules-KSVSOZJV.mjs.map +7 -0
  67. package/dist/lib/neutral/prompt-INL55Q2B.mjs +170 -0
  68. package/dist/lib/neutral/prompt-INL55Q2B.mjs.map +7 -0
  69. package/dist/lib/neutral/qualifier-DAF4H7V3.mjs +88 -0
  70. package/dist/lib/neutral/qualifier-DAF4H7V3.mjs.map +7 -0
  71. package/dist/lib/neutral/query-MP5NSQKO.mjs +69 -0
  72. package/dist/lib/neutral/query-MP5NSQKO.mjs.map +7 -0
  73. package/dist/lib/neutral/query-U56GNEV6.mjs +32 -0
  74. package/dist/lib/neutral/query-U56GNEV6.mjs.map +7 -0
  75. package/dist/lib/neutral/query-blueprints-PLWYVOI3.mjs +16 -0
  76. package/dist/lib/neutral/query-blueprints-PLWYVOI3.mjs.map +7 -0
  77. package/dist/lib/neutral/relation-create-YAAAFTR2.mjs +34 -0
  78. package/dist/lib/neutral/relation-create-YAAAFTR2.mjs.map +7 -0
  79. package/dist/lib/neutral/relation-delete-IEPKERFR.mjs +18 -0
  80. package/dist/lib/neutral/relation-delete-IEPKERFR.mjs.map +7 -0
  81. package/dist/lib/neutral/save-GWAPLT3Z.mjs +23 -0
  82. package/dist/lib/neutral/save-GWAPLT3Z.mjs.map +7 -0
  83. package/dist/lib/neutral/schema-add-5BNIINRS.mjs +24 -0
  84. package/dist/lib/neutral/schema-add-5BNIINRS.mjs.map +7 -0
  85. package/dist/lib/neutral/schema-list-54UK7S4R.mjs +38 -0
  86. package/dist/lib/neutral/schema-list-54UK7S4R.mjs.map +7 -0
  87. package/dist/lib/neutral/sync-issues-DWY76B3M.mjs +166 -0
  88. package/dist/lib/neutral/sync-issues-DWY76B3M.mjs.map +7 -0
  89. package/dist/lib/neutral/sync-triggers-NOIQLELD.mjs +135 -0
  90. package/dist/lib/neutral/sync-triggers-NOIQLELD.mjs.map +7 -0
  91. package/dist/lib/neutral/tag-add-NLVRGTC6.mjs +19 -0
  92. package/dist/lib/neutral/tag-add-NLVRGTC6.mjs.map +7 -0
  93. package/dist/lib/neutral/tag-remove-N4HFBIA2.mjs +19 -0
  94. package/dist/lib/neutral/tag-remove-N4HFBIA2.mjs.map +7 -0
  95. package/dist/lib/neutral/testing/index.mjs +76 -0
  96. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  97. package/dist/lib/neutral/update-blueprints-2SNK6HLG.mjs +16 -0
  98. package/dist/lib/neutral/update-blueprints-2SNK6HLG.mjs.map +7 -0
  99. package/dist/lib/neutral/update-tasks-QQUR53RN.mjs +13 -0
  100. package/dist/lib/neutral/update-tasks-QQUR53RN.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 +166 -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 +77 -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 +104 -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} +4 -1
  268. package/dist/types/src/blueprints/websearch/toolkit.d.ts.map +1 -0
  269. package/dist/types/src/{functions/research → crud}/graph.d.ts +12 -11
  270. package/dist/types/src/crud/graph.d.ts.map +1 -0
  271. package/dist/types/src/crud/graph.test.d.ts.map +1 -0
  272. package/dist/types/src/crud/index.d.ts +2 -0
  273. package/dist/types/src/crud/index.d.ts.map +1 -0
  274. package/dist/types/src/errors.d.ts +41 -0
  275. package/dist/types/src/errors.d.ts.map +1 -0
  276. package/dist/types/src/functions/agent/definitions.d.ts +61 -0
  277. package/dist/types/src/functions/agent/definitions.d.ts.map +1 -0
  278. package/dist/types/src/functions/agent/index.d.ts +3 -4
  279. package/dist/types/src/functions/agent/index.d.ts.map +1 -1
  280. package/dist/types/src/functions/agent/prompt.d.ts +2 -9
  281. package/dist/types/src/functions/agent/prompt.d.ts.map +1 -1
  282. package/dist/types/src/functions/agent/prompt.test.d.ts +2 -0
  283. package/dist/types/src/functions/agent/prompt.test.d.ts.map +1 -0
  284. package/dist/types/src/functions/index.d.ts +0 -6
  285. package/dist/types/src/functions/index.d.ts.map +1 -1
  286. package/dist/types/src/index.d.ts +3 -1
  287. package/dist/types/src/index.d.ts.map +1 -1
  288. package/dist/types/src/sync/sync.d.ts +3 -4
  289. package/dist/types/src/sync/sync.d.ts.map +1 -1
  290. package/dist/types/src/testing/index.d.ts +2 -1
  291. package/dist/types/src/testing/index.d.ts.map +1 -1
  292. package/dist/types/src/testing/plugins.d.ts +19 -0
  293. package/dist/types/src/testing/plugins.d.ts.map +1 -0
  294. package/dist/types/src/toolkits/WebToolkit.d.ts +38 -0
  295. package/dist/types/src/toolkits/WebToolkit.d.ts.map +1 -0
  296. package/dist/types/src/toolkits/index.d.ts +2 -0
  297. package/dist/types/src/toolkits/index.d.ts.map +1 -0
  298. package/dist/types/src/types/Agent.d.ts +79 -0
  299. package/dist/types/src/types/Agent.d.ts.map +1 -0
  300. package/dist/types/src/types/Chat.d.ts +56 -0
  301. package/dist/types/src/types/Chat.d.ts.map +1 -0
  302. package/dist/types/src/types/McpServer.d.ts +21 -0
  303. package/dist/types/src/types/McpServer.d.ts.map +1 -0
  304. package/dist/types/src/types/Memory.d.ts +12 -0
  305. package/dist/types/src/types/Memory.d.ts.map +1 -0
  306. package/dist/types/src/types/Plan.d.ts +89 -0
  307. package/dist/types/src/types/Plan.d.ts.map +1 -0
  308. package/dist/types/src/types/index.d.ts +6 -0
  309. package/dist/types/src/types/index.d.ts.map +1 -0
  310. package/dist/types/src/util/graphql.d.ts.map +1 -1
  311. package/dist/types/tsconfig.tsbuildinfo +1 -1
  312. package/package.json +46 -39
  313. package/src/blueprints/automation/blueprint.ts +105 -0
  314. package/src/blueprints/automation/index.ts +5 -0
  315. package/src/blueprints/blueprint-manager/blueprint.conversations.json +1 -0
  316. package/src/blueprints/blueprint-manager/blueprint.test.ts +202 -0
  317. package/src/blueprints/blueprint-manager/blueprint.ts +49 -0
  318. package/src/blueprints/blueprint-manager/functions/definitions.ts +57 -0
  319. package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +43 -0
  320. package/src/blueprints/blueprint-manager/functions/index.ts +13 -0
  321. package/src/blueprints/blueprint-manager/functions/query-blueprints.ts +18 -0
  322. package/src/blueprints/blueprint-manager/functions/update-blueprints.ts +18 -0
  323. package/src/blueprints/blueprint-manager/index.ts +6 -0
  324. package/src/blueprints/browser/blueprint.test.ts +61 -0
  325. package/src/blueprints/browser/blueprint.ts +40 -0
  326. package/src/blueprints/browser/index.ts +5 -0
  327. package/src/blueprints/database/blueprint.conversations.json +1 -0
  328. package/src/blueprints/database/blueprint.test.ts +531 -0
  329. package/src/blueprints/database/blueprint.ts +66 -0
  330. package/src/blueprints/database/functions/context-add.ts +24 -0
  331. package/src/blueprints/database/functions/context-remove.ts +24 -0
  332. package/src/blueprints/database/functions/definitions.ts +318 -0
  333. package/src/blueprints/database/functions/index.ts +23 -0
  334. package/src/blueprints/database/functions/load.ts +19 -0
  335. package/src/blueprints/database/functions/object-create.ts +38 -0
  336. package/src/blueprints/database/functions/object-delete.ts +20 -0
  337. package/src/blueprints/database/functions/object-update.ts +30 -0
  338. package/src/blueprints/database/functions/query.ts +63 -0
  339. package/src/blueprints/database/functions/relation-create.ts +34 -0
  340. package/src/blueprints/database/functions/relation-delete.ts +21 -0
  341. package/src/blueprints/database/functions/schema-add.ts +28 -0
  342. package/src/blueprints/database/functions/schema-list.ts +33 -0
  343. package/src/blueprints/database/functions/tag-add.ts +21 -0
  344. package/src/blueprints/database/functions/tag-remove.ts +21 -0
  345. package/src/blueprints/database/index.ts +21 -0
  346. package/src/blueprints/discord/blueprint.ts +41 -0
  347. package/src/blueprints/discord/functions/definitions.ts +70 -0
  348. package/src/blueprints/discord/functions/fetch-messages.test.ts +50 -0
  349. package/src/blueprints/discord/functions/fetch-messages.ts +198 -0
  350. package/src/blueprints/discord/functions/index.ts +9 -0
  351. package/src/blueprints/discord/index.ts +2 -3
  352. package/src/blueprints/github/functions/definitions.ts +26 -0
  353. package/src/blueprints/github/functions/fetch-prs.ts +24 -0
  354. package/src/blueprints/github/functions/index.ts +9 -0
  355. package/src/blueprints/github/index.ts +5 -0
  356. package/src/blueprints/index.ts +11 -6
  357. package/src/blueprints/linear/blueprint.ts +42 -0
  358. package/src/blueprints/linear/functions/definitions.ts +23 -0
  359. package/src/blueprints/linear/functions/index.ts +9 -0
  360. package/src/blueprints/linear/functions/linear.test.ts +57 -0
  361. package/src/{functions/linear → blueprints/linear/functions}/sync-issues.ts +44 -51
  362. package/src/blueprints/linear/index.ts +2 -3
  363. package/src/blueprints/memory/blueprint.conversations.json +1 -0
  364. package/src/blueprints/memory/blueprint.test.ts +139 -0
  365. package/src/blueprints/memory/blueprint.ts +41 -0
  366. package/src/blueprints/memory/functions/definitions.ts +68 -0
  367. package/src/blueprints/memory/functions/delete.ts +20 -0
  368. package/src/blueprints/memory/functions/index.ts +13 -0
  369. package/src/blueprints/memory/functions/query.ts +32 -0
  370. package/src/blueprints/memory/functions/save.ts +20 -0
  371. package/src/blueprints/memory/index.ts +6 -0
  372. package/src/blueprints/planning/blueprint.ts +24 -0
  373. package/src/blueprints/planning/functions/index.ts +9 -0
  374. package/src/blueprints/planning/functions/update-tasks.md +116 -0
  375. package/src/blueprints/planning/functions/update-tasks.test.ts +55 -0
  376. package/src/blueprints/planning/functions/update-tasks.ts +67 -0
  377. package/src/blueprints/planning/index.ts +3 -4
  378. package/src/blueprints/project/blueprint.conversations.json +1 -0
  379. package/src/blueprints/project/blueprint.test.ts +712 -0
  380. package/src/blueprints/project/blueprint.ts +64 -0
  381. package/src/blueprints/project/functions/add-artifact.ts +31 -0
  382. package/src/blueprints/project/functions/agent.ts +69 -0
  383. package/src/blueprints/project/functions/definitions.ts +92 -0
  384. package/src/blueprints/project/functions/get-context.ts +47 -0
  385. package/src/blueprints/project/functions/index.ts +14 -0
  386. package/src/blueprints/project/functions/qualifier.ts +90 -0
  387. package/src/blueprints/project/index.ts +6 -0
  388. package/src/blueprints/project-wizard/blueprint.ts +52 -0
  389. package/src/blueprints/project-wizard/functions/create-project.ts +32 -0
  390. package/src/blueprints/project-wizard/functions/definitions.ts +63 -0
  391. package/src/blueprints/project-wizard/functions/index.ts +13 -0
  392. package/src/blueprints/project-wizard/functions/project-rules.ts +77 -0
  393. package/src/blueprints/project-wizard/functions/sync-triggers.ts +153 -0
  394. package/src/blueprints/project-wizard/index.ts +6 -0
  395. package/src/blueprints/testing.ts +29 -8
  396. package/src/blueprints/websearch/blueprint.conversations.json +1 -0
  397. package/src/blueprints/websearch/blueprint.test.ts +39 -0
  398. package/src/blueprints/websearch/blueprint.ts +30 -0
  399. package/src/blueprints/websearch/functions/definitions.ts +25 -0
  400. package/src/blueprints/websearch/functions/fetch.ts +18 -0
  401. package/src/blueprints/websearch/functions/index.ts +9 -0
  402. package/src/blueprints/websearch/index.ts +3 -4
  403. package/src/blueprints/websearch/{websearch-toolkit.ts → toolkit.ts} +6 -1
  404. package/src/crud/graph.test.ts +44 -0
  405. package/src/crud/graph.ts +378 -0
  406. package/src/crud/index.ts +5 -0
  407. package/src/errors.ts +25 -0
  408. package/src/functions/READ_THIS.md +5 -0
  409. package/src/functions/agent/definitions.ts +56 -0
  410. package/src/functions/agent/index.ts +3 -5
  411. package/src/functions/agent/prompt.conversations.json +1 -0
  412. package/src/functions/agent/prompt.test.ts +78 -0
  413. package/src/functions/agent/prompt.ts +210 -87
  414. package/src/functions/index.ts +0 -6
  415. package/src/index.ts +3 -1
  416. package/src/sync/sync.ts +52 -34
  417. package/src/testing/index.ts +2 -1
  418. package/src/testing/plugins.tsx +79 -0
  419. package/src/toolkits/WebToolkit.ts +33 -0
  420. package/src/toolkits/index.ts +5 -0
  421. package/src/types/Agent.ts +238 -0
  422. package/src/types/Chat.ts +63 -0
  423. package/src/types/McpServer.ts +37 -0
  424. package/src/types/Memory.ts +24 -0
  425. package/src/types/Plan.ts +111 -0
  426. package/src/types/index.ts +9 -0
  427. package/dist/lib/browser/index.mjs +0 -2481
  428. package/dist/lib/browser/index.mjs.map +0 -7
  429. package/dist/lib/browser/meta.json +0 -1
  430. package/dist/lib/node-esm/index.mjs +0 -2483
  431. package/dist/lib/node-esm/index.mjs.map +0 -7
  432. package/dist/lib/node-esm/meta.json +0 -1
  433. package/dist/types/src/blueprints/design/design-blueprint.d.ts +0 -4
  434. package/dist/types/src/blueprints/design/design-blueprint.d.ts.map +0 -1
  435. package/dist/types/src/blueprints/design/design-blueprint.test.d.ts +0 -2
  436. package/dist/types/src/blueprints/design/design-blueprint.test.d.ts.map +0 -1
  437. package/dist/types/src/blueprints/design/index.d.ts +0 -3
  438. package/dist/types/src/blueprints/design/index.d.ts.map +0 -1
  439. package/dist/types/src/blueprints/discord/discord-blueprint.d.ts +0 -18
  440. package/dist/types/src/blueprints/discord/discord-blueprint.d.ts.map +0 -1
  441. package/dist/types/src/blueprints/linear/linear-blueprint.d.ts +0 -18
  442. package/dist/types/src/blueprints/linear/linear-blueprint.d.ts.map +0 -1
  443. package/dist/types/src/blueprints/planning/planning-blueprint.d.ts +0 -4
  444. package/dist/types/src/blueprints/planning/planning-blueprint.d.ts.map +0 -1
  445. package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts +0 -2
  446. package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts.map +0 -1
  447. package/dist/types/src/blueprints/research/index.d.ts +0 -3
  448. package/dist/types/src/blueprints/research/index.d.ts.map +0 -1
  449. package/dist/types/src/blueprints/research/research-blueprint.d.ts +0 -4
  450. package/dist/types/src/blueprints/research/research-blueprint.d.ts.map +0 -1
  451. package/dist/types/src/blueprints/research/research-blueprint.test.d.ts +0 -2
  452. package/dist/types/src/blueprints/research/research-blueprint.test.d.ts.map +0 -1
  453. package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts +0 -4
  454. package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts.map +0 -1
  455. package/dist/types/src/blueprints/websearch/websearch-toolkit.d.ts.map +0 -1
  456. package/dist/types/src/experimental/feed.test.d.ts +0 -2
  457. package/dist/types/src/experimental/feed.test.d.ts.map +0 -1
  458. package/dist/types/src/functions/discord/fetch-messages.d.ts.map +0 -1
  459. package/dist/types/src/functions/discord/fetch-messages.test.d.ts.map +0 -1
  460. package/dist/types/src/functions/discord/index.d.ts +0 -12
  461. package/dist/types/src/functions/discord/index.d.ts.map +0 -1
  462. package/dist/types/src/functions/document/index.d.ts +0 -12
  463. package/dist/types/src/functions/document/index.d.ts.map +0 -1
  464. package/dist/types/src/functions/document/read.d.ts +0 -7
  465. package/dist/types/src/functions/document/read.d.ts.map +0 -1
  466. package/dist/types/src/functions/document/update.d.ts +0 -6
  467. package/dist/types/src/functions/document/update.d.ts.map +0 -1
  468. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +0 -173
  469. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts.map +0 -1
  470. package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts +0 -2
  471. package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts.map +0 -1
  472. package/dist/types/src/functions/entity-extraction/index.d.ts +0 -174
  473. package/dist/types/src/functions/entity-extraction/index.d.ts.map +0 -1
  474. package/dist/types/src/functions/exa/exa.d.ts +0 -5
  475. package/dist/types/src/functions/exa/exa.d.ts.map +0 -1
  476. package/dist/types/src/functions/exa/index.d.ts +0 -3
  477. package/dist/types/src/functions/exa/index.d.ts.map +0 -1
  478. package/dist/types/src/functions/exa/mock.d.ts +0 -5
  479. package/dist/types/src/functions/exa/mock.d.ts.map +0 -1
  480. package/dist/types/src/functions/github/fetch-prs.d.ts +0 -6
  481. package/dist/types/src/functions/github/fetch-prs.d.ts.map +0 -1
  482. package/dist/types/src/functions/linear/index.d.ts +0 -9
  483. package/dist/types/src/functions/linear/index.d.ts.map +0 -1
  484. package/dist/types/src/functions/linear/linear.test.d.ts.map +0 -1
  485. package/dist/types/src/functions/linear/sync-issues.d.ts +0 -12
  486. package/dist/types/src/functions/linear/sync-issues.d.ts.map +0 -1
  487. package/dist/types/src/functions/research/create-document.d.ts +0 -7
  488. package/dist/types/src/functions/research/create-document.d.ts.map +0 -1
  489. package/dist/types/src/functions/research/graph.d.ts.map +0 -1
  490. package/dist/types/src/functions/research/graph.test.d.ts.map +0 -1
  491. package/dist/types/src/functions/research/index.d.ts +0 -19
  492. package/dist/types/src/functions/research/index.d.ts.map +0 -1
  493. package/dist/types/src/functions/research/research-graph.d.ts +0 -18
  494. package/dist/types/src/functions/research/research-graph.d.ts.map +0 -1
  495. package/dist/types/src/functions/research/research.d.ts +0 -13
  496. package/dist/types/src/functions/research/research.d.ts.map +0 -1
  497. package/dist/types/src/functions/research/research.test.d.ts +0 -2
  498. package/dist/types/src/functions/research/research.test.d.ts.map +0 -1
  499. package/dist/types/src/functions/research/types.d.ts +0 -384
  500. package/dist/types/src/functions/research/types.d.ts.map +0 -1
  501. package/dist/types/src/functions/tasks/index.d.ts +0 -15
  502. package/dist/types/src/functions/tasks/index.d.ts.map +0 -1
  503. package/dist/types/src/functions/tasks/read.d.ts +0 -7
  504. package/dist/types/src/functions/tasks/read.d.ts.map +0 -1
  505. package/dist/types/src/functions/tasks/task-list.d.ts +0 -74
  506. package/dist/types/src/functions/tasks/task-list.d.ts.map +0 -1
  507. package/dist/types/src/functions/tasks/task-list.test.d.ts +0 -2
  508. package/dist/types/src/functions/tasks/task-list.test.d.ts.map +0 -1
  509. package/dist/types/src/functions/tasks/update.d.ts +0 -9
  510. package/dist/types/src/functions/tasks/update.d.ts.map +0 -1
  511. package/dist/types/src/plugins.d.ts +0 -19
  512. package/dist/types/src/plugins.d.ts.map +0 -1
  513. package/dist/types/src/testing/data/exa-search-1748337321991.d.ts +0 -38
  514. package/dist/types/src/testing/data/exa-search-1748337321991.d.ts.map +0 -1
  515. package/dist/types/src/testing/data/exa-search-1748337331526.d.ts +0 -37
  516. package/dist/types/src/testing/data/exa-search-1748337331526.d.ts.map +0 -1
  517. package/dist/types/src/testing/data/exa-search-1748337344119.d.ts +0 -58
  518. package/dist/types/src/testing/data/exa-search-1748337344119.d.ts.map +0 -1
  519. package/dist/types/src/testing/data/index.d.ts +0 -3
  520. package/dist/types/src/testing/data/index.d.ts.map +0 -1
  521. package/src/blueprints/design/design-blueprint.test.ts +0 -108
  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 -129
  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 -45
  531. package/src/blueprints/websearch/websearch-blueprint.ts +0 -20
  532. package/src/experimental/feed.test.ts +0 -108
  533. package/src/functions/discord/fetch-messages.test.ts +0 -59
  534. package/src/functions/discord/fetch-messages.ts +0 -251
  535. package/src/functions/discord/index.ts +0 -9
  536. package/src/functions/document/index.ts +0 -11
  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 -100
  541. package/src/functions/entity-extraction/entity-extraction.ts +0 -163
  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 -86
  549. package/src/functions/research/create-document.ts +0 -69
  550. package/src/functions/research/graph.test.ts +0 -69
  551. package/src/functions/research/graph.ts +0 -388
  552. package/src/functions/research/index.ts +0 -15
  553. package/src/functions/research/instructions-research.tpl +0 -98
  554. package/src/functions/research/research-graph.ts +0 -47
  555. package/src/functions/research/research.conversations.json +0 -10714
  556. package/src/functions/research/research.test.ts +0 -240
  557. package/src/functions/research/research.ts +0 -155
  558. package/src/functions/research/types.ts +0 -24
  559. package/src/functions/tasks/index.ts +0 -11
  560. package/src/functions/tasks/read.ts +0 -34
  561. package/src/functions/tasks/task-list.test.ts +0 -99
  562. package/src/functions/tasks/task-list.ts +0 -165
  563. package/src/functions/tasks/update.ts +0 -52
  564. package/src/plugins.tsx +0 -68
  565. package/src/testing/data/exa-search-1748337321991.ts +0 -131
  566. package/src/testing/data/exa-search-1748337331526.ts +0 -144
  567. package/src/testing/data/exa-search-1748337344119.ts +0 -133
  568. package/src/testing/data/index.ts +0 -11
  569. /package/dist/types/src/{functions/discord → blueprints/discord/functions}/fetch-messages.test.d.ts +0 -0
  570. /package/dist/types/src/{functions/linear → blueprints/linear/functions}/linear.test.d.ts +0 -0
  571. /package/dist/types/src/{functions/research → crud}/graph.test.d.ts +0 -0
@@ -0,0 +1,153 @@
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
+ if (!feedObj || !Obj.instanceOf(Feed.Feed, feedObj) || !Feed.getQueueDxn(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.dxn.toString() },
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
+ yield* Database.add(
108
+ Trigger.make({
109
+ [Obj.Parent]: agent,
110
+ [Obj.Meta]: {
111
+ keys: [
112
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
113
+ {
114
+ source: AGENT_TRIGGER_TARGET_EXTENSION_KEY,
115
+ id: Obj.getDXN(agent)?.toString() ?? '',
116
+ },
117
+ ],
118
+ },
119
+ function: Ref.make(Operation.serialize(AgentWorker)),
120
+ enabled: triggersEnabled,
121
+ spec: Trigger.specQueue(agent.feed.dxn.toString()),
122
+ input: {
123
+ agent: Ref.make(agent),
124
+ event: '{{event}}',
125
+ },
126
+ }),
127
+ );
128
+ }
129
+
130
+ // Timer trigger bypasses the qualifier and invokes the agent worker directly on a schedule.
131
+ if (agent.cron) {
132
+ yield* Database.add(
133
+ Trigger.make({
134
+ [Obj.Parent]: agent,
135
+ [Obj.Meta]: {
136
+ keys: [
137
+ { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
138
+ { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: `timer:${agent.cron}` },
139
+ ],
140
+ },
141
+ enabled: triggersEnabled,
142
+ spec: Trigger.specTimer(agent.cron),
143
+ function: Ref.make(Operation.serialize(AgentWorker)),
144
+ input: {
145
+ agent: Ref.make(agent),
146
+ event: '{{event}}',
147
+ },
148
+ }),
149
+ );
150
+ }
151
+
152
+ yield* Database.flush();
153
+ });
@@ -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_01VRBPxPA6ioMwGrT9XyWorb","modelId":"claude-opus-4-6","timestamp":"2026-05-17T07:15:58.380Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The user wants me to use the web search tool to answer this question, even though I know","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" the answer.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"Ep8CClkIDRgCKkApMUMNSZJpFQ+sNfR6X+YbNNz9lfhRvrb7nQ8q4pphL+8WwBRtUxHLpOX4zTRJyS2pbApqpp31ADPm5Utuq4T6Mg9jbGF1ZGUtb3B1cy00LTY4ABIM9tZqH+gJT+Xblk1eGgyHJIV7ySY0aOzf+UAiMDGXNgKAqUvkZuPnXuJEBMaF25GfRGeBX5V08aFMgc8u7V+jzTrCsVkH7IApYMr+pCp0ITBBzjvolaDlxNk1rAOvpGwXebJ2Ss7TA0wxaqwm9b8TPiT8lNSzaa/+R7HeVpAiqGUqI3lbvCUM5uYi+ao7e3N5lsCRpAC7h2Fk2orKeNQyI8CTJ20mVPEcpxQgjipE5QYff3h6a76ylKvKK5JgFexAjtkYAQ=="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","name":"AnthropicWebSearch","providerName":"web_search","providerExecuted":true,"metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","delta":"","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","delta":"{\"qu","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","delta":"ery\": \"capit","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","delta":"al","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","delta":" of ","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","delta":"France","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","delta":"\"}","metadata":{}},{"type":"tool-params-end","id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","metadata":{}},{"id":"srvtoolu_01Wih5WKFLbHYQCHZHNZA54M","type":"tool-result","providerName":"web_search","isFailure":false,"name":"AnthropicWebSearch","result":[{"encrypted_content":"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","page_age":"15 hours 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":"EoAICioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDNpqKBJBct1ZH3zCLhoMrSk6PU6ZC5smvgaKIjCBWWS1MJd2vYFV4dSRZG3wXSKLoTCuprabegsnqpXWn0cIQVX3R6sfrnameZjwC8AqgwdohX2/2jK0fUPvY8bj0PjLXlYI5ZW0nCAKx/yGhiqJh04LSOAEb95zS5CoGn4J/pfgR2BOTOu7vUSOBOltLYUtfjx6z51AFWGlHaZ7nk3bz0Ye79Z7ci6U+SpZ8rakQDU/1rxZrKinhrABYfGuxJyFd9N6tJaXFJVjZjqDVW0FfYwv9WKB1Gc5tOzbJiE3QLQ5IdzN97zULtpQbSjjdgn2bxG4GuEnkM3PJraTed4i0bMvF1hl7fkMZLv1jKRq8Xn3WsdXTcbZjGq9bfDtrOvzCX/LLqqf2DS4nbIw9cjdxvrEAsMd8DD5QmtKhTVDI2NYGwxchnd/FUcAlXXY0It2lZpVRNSDIvj2Y/KD5hZOPOIdfBUG4oAjj3AePPsZjyTrP5R4rxgoeZ+aTbUkHiX9OuGhZ+oqYyKJgA77PPKtL1hPSlgWrcUPElvEdIu5ykSzkRpIo+uRLkrQrZguRvv1u0jB/QeYu6WKeFwUfbqZ+NEKH0k0JITjBtLfgDqmeXVs0SbOTTkJLzWTbDGfOYTOIxR1esQa7bsPwXYIfYrb/vsxXF1nePidC9VqI2f/q4bbOdh4RXnSXcZTF5YSMKRcxckDTUmAbFfjew6ZrBwkwQPxCOMDabraMacYG5EAFCSFqBsYhB/Qi3Xofz2yN7RXEUyK559+ZCSNhNoAudqf9pUA2Lh7HlPznSjX6uQxY1oad4ULM4lDSJMmYNzkWhpFx8FDVXpdCNq8GWbN7sZIWh/Jq/9ye8wMLs3vE9JUnIkSlTnUBAuij6nD1zwVULzmXAY4nJusf/usGE0f6CZaQXiSpa+g6uM/PQUspQn/fwMsl3mXoLW6WolVtFJVtoHxfnYlkDLcEp/HDMhI8TfK386uqtVX5KAzZP38u2ZvbtgnFONDBFgprNHe4izi+wSM5qYOoYOfbaHV5x3k8vmmCBkKqTKPMmjEvXPJ07jVS2W7qqDFjaBW0jWPKhx5OD4yN27OV/mVffLJSH8K5JttJ3iABpEtwoOWEX4EKTO5qeB/YA0mrhlonFeH+scbcLyUMDSI8IWr1SB65YrEeWG4Czbi/EE7IWiooQ1Fj+qc7CkFjcmITcwjWVO5BDyTTTp7sMFqLtG0MweUb9qi2i+04HADmrvtDzNYgOsAi/giPiGAg60wGFuTggkHkDw0oou23JTw7GVjX0z6nsaYTQ35dr4MlxgD","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":"5 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":"1 week ago","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","type":"web_search_result","url":"https://www.britannica.com/place/Paris"},{"encrypted_content":"EsQDCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDDxXLoAX7okp9HhYbBoMuDyiowYaSaNc1TNoIjDlfFQZWIbBfuU22jU+Ue/aigNMk6R7lysG+AsnWnr0/FvRWXUIT14dRz3hOdEpY/0qxwLa2fD2r969Oyp2ycFVjHweU5LbarvEfpdqFl1P8a4DwpX1dpa8q0BFiwLuwncMjpx5gA85Q3EGcjx1qqa0o7HRmSAlFx3BOrK5hRrcLzOgBVjJAPOtpH9mvE7KVjR4mdtLRTdtRJtUfWHkTstvTVklIVLZI5SAJ4GVmaNngeD89Ck7HoatiR+PIwMZYRSiC0EgQNVtOPbDo6Q8vIgaNodXk0hJNdvV0iu1Dqs5Av/CGOubxjTNehYa8GpBDUpeMwv253BT8+YgyXe1T/n4CYqdRevbSSpkFB1or4qGuiK1SQYns9A1IdONMq+Cb5KlUyySAkgsmktZ+7RsvyrH1A60GgsoHOFtIMHDvVUMUgH65BDIfbmXFU+jojO3ux80zHWhjrW5s0WUHWLanofymC3sFri0O18LsbFyRDDA44xOc7wQ8dX1H9wYAw==","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":"2 days ago","title":"France - Wikipedia","type":"web_search_result","url":"https://en.wikipedia.org/wiki/France"},{"encrypted_content":"EqAYCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDOBcu0pZ0+GDOUC+rRoMKp4LEKA6p/qWNvjyIjBVNcQMvDaGVQZ66xd2ZUcT4ym8mPaQSoRpBWskQd3POSFGTtAY8up6mqdPG83pocUqoxef48o3/PZB108hFygO4I5v9uWAnV6guhq05OZc1zHKfum+Wb+M+KWiinm7oaBDutzxjFpjpgx5SAHTPeNJ/kfWZjrWfxPa3TVZR3UKCCg3dzjbsYDKH9zYXJgNualxUc/Zzw5glpBXwtaAd//byR7EuWgQks4z3rWFOZ0lbcBpIhWfBFmmSzknCeCpvVhFDTkTkwPwEyCRgqeQbVPa/J1ZYkJvUk9ibXrsKwSoogEJIlsroGHXGlfTx+4jRdtL87FqPOM4d42XbX1dufcD1LLttlRG3JWjkbGkr5oQIl1eKDKumQgcBuobic/cBy89htVXLtsISyZ62JMbkPB2jCk92sk9gjTbmr2BJS4R63zdEf7/xcE330EMX0c2EbmrOQSz2/0I2fOvyxqcydSvc534Fbo1Xsa6owbwhgxotWdYdy/e5g3cJNsFfcafHsoNEweEbWSXEu819EXmYL6rvNtJle2CxWXkze1Zfwf+pus8NYgtSqIh+oClqpqefWwQ4AN9WwDu46/qciYnIeuhQIa3Z1MQ5biT9nTXquJBQqvurKYOse38TRxoRGAPHAEONn6KLEiAnTkvc8KDq/xw5PYgFz085mHy3i8sX84FW8qJa4OY6IaNoiS/0+SKyrqGXARdeJupcMir2yxcBN9x9JBWP6BRkaN03htU4LWnHcoYQqzdh4sSNkN6EKbVZoy+3tkhgTDEtCDGf5KL/MH0BxvldDxoKO6doDzcDcoqpXS/d6SIFkCY+ddXQGD1qSYt2kzDYdwpGX1l6tDOqfi0OubsMfLnOnEo0E/vgF1cp8FxBCVH6GqviNnCrAEIg60tVqdck/Wudn1WFBOELOL0YmQXgrc47J4kWMdDYh7WSOqTIGWVOt1d5oSIBEEUtHL12uXC0RexV9FjI4MFRQYaueZD27PWRuTw6ONwJkLpqwIOeevAV+O00vfrk8TWnfTwIH3IXsw2MfOARloRI0DwYx7dzS/GRJSbEv3Qh0K4axDAd3nuIpy9pDOH9Xrf60HDxicLWEuvu2qdFRAZGEytoTsEPvLrOJXhqIV1/HBl4j5bliE5VCB6dR/VcO2x9B5Jwmz0x7jyHHrQyjkagR1K70kT9oemSZiqOsLsPKYTA15i1KV1tCVDu/PFqF44VJEpE6SzyGICVE1CQSl1FfbeltwO4mSeCKrMCfTxF13HEa8VCSDmed5Qjw73snW0mnWGwkuA5XrsmRMlAYQoAIzbNpD5XN6cthr0RGU7UkD0GRM7vfiwKd3tkLqx1uuF+s3vrJdcHyYHnDKQdI5zrl8YQ+FXU5jYjovy1lnnXY4U3UpzX9bqcYMyeu21Tgv7pimih+/B8m8KHe1CgaKEivLyuHPjfkJOYw98pAeHNgShnyxxnDpVvr7i58nytUgxIksbRx32yaMoD5V2v+/osilNPYiBz/Nu16A3hhXxHbVIv+lZRD7ILXXTELZoFhMX/cja2FMOclW2Q1hc+45k8WVW5YTm8YFNeRYi/03tf4Rl3lhbTNFzfI5GwJk+7osLzu+yslLEVAvBzaYWKafEx1++ehwOWt7IYb+ro37mbgs9/DQiZSY90nS869pnL6RTp8NGjzb8fXQYj2NfAyOE7xKsxfgMda5RkwgkFijdFdqUfWHJ+MhBLDiGBmyH1z/yD8Sz5ifW1muEz9s9Xa+YnoDVEUlm/PwkMLxLe2k7fpEXK29rH6i3+9u3Ubg//WR4c7Qg0p5R+jt4FJ4bobKlXVDS7LXEIRT/Ye9vYQGOaBHl/JAZ6nyUnCXBJVoG/icTfDXUTWgEMrt7UqS5I7N5nlbE3VncMD0nOAagt8Lwk2ZrF6MplUEzg8hI0370KXdS1NKopsnZ6ORkp2OwkMl19pUpKofv8Td7plcCvlz0NskvEEplVE/K4sPvLQg//MzV/Xe2eRJfJNg8xnJdF2i68FhxOSPYItenBR0R6HwAmHmROG9gYZ039pNJidKkmnaO5UQTrefuEzSGmNSlKrXjsDyZvKk81Kyf1AbeUcMCyWk1jHAezqq9JKjGf3lK9b2gs6oNyk0Yypgx/gpplGKT397RYiZqvGQKotiwGLHuPPdidfIbMs0ermMJC+yvLXH0GhgnfkUFmQyly5w9yk0WqHhE1OdL4f7r9dxIoG0jeWws48NyXBagJgwByDJmqN7zDPCokSgaYRWxxQcnq/Cwv8QX+i6HxA3BIHQ/oyLHQ1YgrLQ5/PG+i0b7ZZVwIf6u7wgMikALe1NR/lJREmIc/sMPoD7fXjvLx4f8nXilVDQAvJzyVB7GOjXFfqPeyWlfiMfEIqNCY3DtAw2TnC8xdyYWOu/2nn/LsOIThKXj/z/cn0FmuWCoxf1/L2SKYYaPi0D6oU+gSTAZx738gOsvqC+dKJMCVHRpU/Z6yETD/fTyoj0FddJAY8TOspzNLp1SxuhvdlxrgkZEEvP1em+t+p/9mmIvkiLfU4QfxSXh3mF/eFOK3MWQOwuVQKV8+IlUEsU01r2NoRdvCOiC+BVXxXTzuHef8dtIsi525wDyZ+xWvOLpionu7jQq4PbDAFjLMg4x5phS2X3gobZ5/csCvmhL/tPFdqVTFQzVdLIxiJEGuJJAVfTOfRBVdDB87kAk7GDId3EqJDdM9X7TGVMIc8ig93yt0v8PK5HzEGKnV06S2vTjHcgI6/TRECwu51HWdZE6fQ1pSmeME0Lajb7uQX4kzJoarWHs4zBo1oPWL4qj3kvQgnOMUp28JtSRW49sx/QdPMnUMlN+GjpvzP/M8BAefpzK8XVUMmi2zAmLLRokl7DYs4pxwv7kZV0apXztOdmSLVkvvmHrF00cq9oRaRIsCK00TkD6CMwFj7ioKRtgNe9QKo3UQjKcOs/XWJpn2zclwO+4SBO7anotMNLZG/RrDcd9LDVmVIA6rzde2qE785ACXC1HUlNMZL5qdy+aMeis58k40alZeVEMTklpEO0YZWjUqi9Ggmh7wm60mDrSP4AmybTuAqoyKhQ+xsfhMJOXeNyRcUrW8m8UIJPiFgYEGhPMz8YPS0ONT5fcc2t2lAKc6t9duYysWrpSUOSfPTADiIVs6JBQXaj4YSskvNUUMSVnJya7S4igZ/1PLbr3NAORMIzfFwTU6/CF/k70/+5eEQIXdJexxYVjMgl/HweN3Z2aVD9FmJ2OWPRRYTSLcx3c6/bLMcmHE2XV5bCJ4MVZTT784GT1p9tpoJz25DuhhZC6NI4fCvvtPbn5hMA2Iq5Rvyp+N4Bz44YRQ+ZNXNv7nuREoQO/2oeyzkwd0pMfEj8UBTU5UhtXwyewxjhWQDlrjWYq8cYpE/poCKVOJ7Lra1I0aNW6G9bK2iCxQXRtlflk4Ckle4ozHo2zDVnk/KBDbJDVksm6mHMMDJdOmma/4vv3MpQcNPQaDLzob9l34mkQN7xtcHOucO6Clt7PRJ7Rn3Kx/khwmqdiBUp7UIjAY3hz/uJMudqAZ/wZ0jJXGuVOLAFwYqpVy4HrS4hQG94iSAtJM22dRyKJw/BInLVIksY6kzmVjhJxODD7dQTR6jh50vk56T/x/WrF7wqjEvCmfy/YSdDZW60mG0Pyd1K/IKOiOX5S5impSqWCxyVN+YxMjG9InO0Qnio/PC20glvkfwHKtFTXJmrLOsdquJOTEmaX1i9VgqqfFSfJXediL9wvWJK+qy0FLN1zZLwaxUopmZgeS7PiwvCN9EZvlH4lWcpMfNeW2eY3onK5yUpXveITS5L1BEpiNZOLG23quh18neILtIlEJvcY3FeYUKv9/ioUZ6QTOrk7JOg+z3iWQEegualdyTck6CAkd0kjw0PO2Nhjn9PCt7qVfU1AtC1H0C+VmMWWAIyMPS+tEeIDcEBEgNc6YJjJVIn9rQBvynx0Z+PAn/foo8dxBkQcR/+92ieqo6wQaGeHZxV9pEYILs7ROF0aYlOTvpNwfGZouM/hUKfy2qNrsJKyVi4CjIuYW8odS5EYAw==","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":"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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_MwhHwdMgunWUhLMA","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":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDExejY5xXB/fSzUkFBoM4lGFLCP6HxV0oUABIjBKrxddgYJUahlb1C+bkOk8CRdJT59qxm1fenbo8C2cMD/gOTAixqyM2WHEXCeNE4YqE02oyDrRmPhWVdurZ2JVv3K8haQYBA=="}}},{"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.2","metadata":{}},{"type":"text-delta","id":"4","delta":" 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_CUnH3HAFN6zyX5ga","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":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDEB4DhMG8B/g8S2VNBoMMQYR7MRxILNzBJGlIjCTu1y0m8cnryuMSwkVn6QXTLmxVW2eY9v/YYAujqkJeyV2KLbg1VZWMXreGlge3w4qE0ypLow8PfgnukBearZhbyWozTsYBA=="}}},{"type":"text-delta","id":"6","delta":"Paris is located","metadata":{}},{"type":"text-delta","id":"6","delta":" 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":", and ","metadata":{}},{"type":"text-end","id":"7","metadata":{}},{"type":"text-start","id":"8","metadata":{}},{"type":"source","sourceType":"url","id":"id_2W5qA009udW00gpB","url":"https://www.mappr.co/capital-cities/france/","title":"What is the Capital of France? | Mappr","metadata":{"anthropic":{"source":"url","citedText":"Also known as the “City of Light,” is not only the capital but also the most populous city of France. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDLIwEdIJqLgDuX3SwxoMMMTUxghJNuj5ZvhkIjCz68cQ9zmNfgLF2GC2gw3hLJ1CCOHXP7VRvpOOk0P0U6Sex7I2ms2LGhj2IH4ynY0qEyJjhg+/q21/sFH1HoAtQiQRTnAYBA=="}}},{"type":"text-delta","id":"8","delta":"it is also","metadata":{}},{"type":"text-delta","id":"8","delta":" known as the \"City of Light.\"","metadata":{}},{"type":"text-end","id":"8","metadata":{}},{"type":"text-start","id":"9","metadata":{}},{"type":"text-delta","id":"9","delta":"\n\n","metadata":{}},{"type":"text-end","id":"9","metadata":{}},{"type":"text-start","id":"10","metadata":{}},{"type":"source","sourceType":"url","id":"id_ulrXLnup0uuq8kUZ","url":"https://www.mappr.co/capital-cities/france/","title":"What is the Capital of France? | Mappr","metadata":{"anthropic":{"source":"url","citedText":"However, Paris only became the official capital of France during the reign of Clovis I, in the late 5th and early 6th century. Before Clovis, the Mero...","encryptedIndex":"EpMBCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDO0zNdhugg9FgPFXXhoMN6pnLLfJAWJ21d69IjASz9cVOe6DhdL8xKtNPLJbZTdwHXHWE7NeDUgawrLUvrHBCguQeYz9ONmdlDw6KOoqFxHum9MDpe3VclYrhBn+xoa/zPVKSEl+GAQ="}}},{"type":"text-delta","id":"10","delta":"Paris became the official capital of France during the reign of Clovis I in the","metadata":{}},{"type":"text-delta","id":"10","delta":" late 5th and early 6th century, when Clovis established his court","metadata":{}},{"type":"text-delta","id":"10","delta":" there.","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_ZGom9zFQGd0riF52","url":"https://www.mappr.co/capital-cities/france/","title":"What is the Capital of France? | Mappr","metadata":{"anthropic":{"source":"url","citedText":"Since then, with some interruptions, Paris has remained the capital of France. ","encryptedIndex":"EpABCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDPOO0X79sKOc3SXfuRoM7owcCPY6p1/1I9ySIjCngiRisMItSrRAK8X8DI3JoRXfVgV8NqakIEygZTLiAgFT+KDauZpQco0wRCmnCswqFO12/bdvDpbdi2gexgy6maFbw6LTGAQ="}}},{"type":"text-delta","id":"12","delta":"Since then, with some interruptions, Paris has remained the capital of France.","metadata":{}},{"type":"text-end","id":"12","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2345,"outputTokens":314,"totalTokens":2659},"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":27,"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,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'));
@@ -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);
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Layer from 'effect/Layer';
8
+
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';
13
+ import { log } from '@dxos/log';
14
+ import { Pipeline } from '@dxos/types';
15
+
16
+ import { makeGraphWriterHandler, makeGraphWriterToolkit } from './graph';
17
+
18
+ const TestLayer = Layer.empty.pipe(
19
+ Layer.provideMerge(ToolExecutionServices),
20
+ Layer.provideMerge(AssistantTestLayer({})),
21
+ );
22
+
23
+ describe('graph', () => {
24
+ const Toolkit = makeGraphWriterToolkit({ schema: [Pipeline.Pipeline] });
25
+ const ToolkitLayer = makeGraphWriterHandler(Toolkit);
26
+
27
+ it.effect.skip(
28
+ 'calculator',
29
+ Effect.fn(
30
+ function* (_) {
31
+ const request = new AiRequest.Request();
32
+ const toolkit = yield* OpaqueToolkit.fromContext(Toolkit);
33
+ const response = yield* request.run({
34
+ toolkit,
35
+ prompt: 'What is 10 + 20?',
36
+ });
37
+
38
+ log.info('response', { response });
39
+ },
40
+ Effect.provide(Layer.mergeAll(TestLayer, ToolkitLayer)),
41
+ TestHelpers.provideTestContext,
42
+ ),
43
+ );
44
+ });