@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.
- package/LICENSE +102 -5
- package/dist/lib/neutral/add-artifact-ZKSSMPLY.mjs +30 -0
- package/dist/lib/neutral/add-artifact-ZKSSMPLY.mjs.map +7 -0
- package/dist/lib/neutral/agent-UIASE5LZ.mjs +65 -0
- package/dist/lib/neutral/agent-UIASE5LZ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-AF5TWFLV.mjs +66 -0
- package/dist/lib/neutral/chunk-AF5TWFLV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CMHECL6N.mjs +282 -0
- package/dist/lib/neutral/chunk-CMHECL6N.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DC5KITJP.mjs +74 -0
- package/dist/lib/neutral/chunk-DC5KITJP.mjs.map +7 -0
- package/dist/lib/neutral/chunk-EUHZLWCG.mjs +26 -0
- package/dist/lib/neutral/chunk-EUHZLWCG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-EUTROPCP.mjs +345 -0
- package/dist/lib/neutral/chunk-EUTROPCP.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FNN6ERC6.mjs +61 -0
- package/dist/lib/neutral/chunk-FNN6ERC6.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GEMRKH7J.mjs +103 -0
- package/dist/lib/neutral/chunk-GEMRKH7J.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GHGJCH73.mjs +76 -0
- package/dist/lib/neutral/chunk-GHGJCH73.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LO2S3ICN.mjs +26 -0
- package/dist/lib/neutral/chunk-LO2S3ICN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MMIERIDT.mjs +70 -0
- package/dist/lib/neutral/chunk-MMIERIDT.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OC77MYT5.mjs +48 -0
- package/dist/lib/neutral/chunk-OC77MYT5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ONQXVECY.mjs +110 -0
- package/dist/lib/neutral/chunk-ONQXVECY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-PAEPER4S.mjs +70 -0
- package/dist/lib/neutral/chunk-PAEPER4S.mjs.map +7 -0
- package/dist/lib/neutral/chunk-RIF2TKJJ.mjs +76 -0
- package/dist/lib/neutral/chunk-RIF2TKJJ.mjs.map +7 -0
- package/dist/lib/neutral/context-add-VNJUVPSY.mjs +22 -0
- package/dist/lib/neutral/context-add-VNJUVPSY.mjs.map +7 -0
- package/dist/lib/neutral/context-remove-ZASL7ABZ.mjs +22 -0
- package/dist/lib/neutral/context-remove-ZASL7ABZ.mjs.map +7 -0
- package/dist/lib/neutral/create-project-VNC2KKBG.mjs +35 -0
- package/dist/lib/neutral/create-project-VNC2KKBG.mjs.map +7 -0
- package/dist/lib/neutral/delete-NLBJMMBJ.mjs +19 -0
- package/dist/lib/neutral/delete-NLBJMMBJ.mjs.map +7 -0
- package/dist/lib/neutral/enable-blueprints-SMGQ2WCU.mjs +47 -0
- package/dist/lib/neutral/enable-blueprints-SMGQ2WCU.mjs.map +7 -0
- package/dist/lib/neutral/fetch-VV3DU75K.mjs +16 -0
- package/dist/lib/neutral/fetch-VV3DU75K.mjs.map +7 -0
- package/dist/lib/neutral/fetch-messages-YXH77S3S.mjs +139 -0
- package/dist/lib/neutral/fetch-messages-YXH77S3S.mjs.map +7 -0
- package/dist/lib/neutral/get-context-LG2CNVII.mjs +35 -0
- package/dist/lib/neutral/get-context-LG2CNVII.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +915 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/load-K7HEJA54.mjs +17 -0
- package/dist/lib/neutral/load-K7HEJA54.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/object-create-EN6PJN3L.mjs +35 -0
- package/dist/lib/neutral/object-create-EN6PJN3L.mjs.map +7 -0
- package/dist/lib/neutral/object-delete-RMA5ZKGY.mjs +18 -0
- package/dist/lib/neutral/object-delete-RMA5ZKGY.mjs.map +7 -0
- package/dist/lib/neutral/object-update-JW5PLR2T.mjs +28 -0
- package/dist/lib/neutral/object-update-JW5PLR2T.mjs.map +7 -0
- package/dist/lib/neutral/project-OGO5ABSZ.mjs +23 -0
- package/dist/lib/neutral/project-OGO5ABSZ.mjs.map +7 -0
- package/dist/lib/neutral/project-rules-IVA3DSOW.mjs +78 -0
- package/dist/lib/neutral/project-rules-IVA3DSOW.mjs.map +7 -0
- package/dist/lib/neutral/prompt-YVFNLD7U.mjs +170 -0
- package/dist/lib/neutral/prompt-YVFNLD7U.mjs.map +7 -0
- package/dist/lib/neutral/qualifier-UTPO5E3S.mjs +89 -0
- package/dist/lib/neutral/qualifier-UTPO5E3S.mjs.map +7 -0
- package/dist/lib/neutral/query-3FK3ED6L.mjs +69 -0
- package/dist/lib/neutral/query-3FK3ED6L.mjs.map +7 -0
- package/dist/lib/neutral/query-GXZT4KUX.mjs +32 -0
- package/dist/lib/neutral/query-GXZT4KUX.mjs.map +7 -0
- package/dist/lib/neutral/query-blueprints-GA2JM54N.mjs +16 -0
- package/dist/lib/neutral/query-blueprints-GA2JM54N.mjs.map +7 -0
- package/dist/lib/neutral/relation-create-XOFKYPL2.mjs +34 -0
- package/dist/lib/neutral/relation-create-XOFKYPL2.mjs.map +7 -0
- package/dist/lib/neutral/relation-delete-MVJKKVEQ.mjs +18 -0
- package/dist/lib/neutral/relation-delete-MVJKKVEQ.mjs.map +7 -0
- package/dist/lib/neutral/save-TFQMJKG7.mjs +23 -0
- package/dist/lib/neutral/save-TFQMJKG7.mjs.map +7 -0
- package/dist/lib/neutral/schema-add-I7BFBU55.mjs +24 -0
- package/dist/lib/neutral/schema-add-I7BFBU55.mjs.map +7 -0
- package/dist/lib/neutral/schema-list-TYGGAO2P.mjs +49 -0
- package/dist/lib/neutral/schema-list-TYGGAO2P.mjs.map +7 -0
- package/dist/lib/neutral/sync-issues-3U3EL6KO.mjs +166 -0
- package/dist/lib/neutral/sync-issues-3U3EL6KO.mjs.map +7 -0
- package/dist/lib/neutral/sync-triggers-M6U6RAKN.mjs +138 -0
- package/dist/lib/neutral/sync-triggers-M6U6RAKN.mjs.map +7 -0
- package/dist/lib/neutral/tag-add-RCE2QULJ.mjs +19 -0
- package/dist/lib/neutral/tag-add-RCE2QULJ.mjs.map +7 -0
- package/dist/lib/neutral/tag-remove-EPKB5CDE.mjs +19 -0
- package/dist/lib/neutral/tag-remove-EPKB5CDE.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +73 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/lib/neutral/update-blueprints-VOGJKSMQ.mjs +16 -0
- package/dist/lib/neutral/update-blueprints-VOGJKSMQ.mjs.map +7 -0
- package/dist/lib/neutral/update-tasks-PNNNCPWH.mjs +13 -0
- package/dist/lib/neutral/update-tasks-PNNNCPWH.mjs.map +7 -0
- package/dist/types/src/blueprints/automation/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/automation/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/automation/index.d.ts +2 -0
- package/dist/types/src/blueprints/automation/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/blueprint-manager/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/blueprint-manager/blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts +61 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts +36 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts +27 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/update-blueprints.d.ts +4 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/update-blueprints.d.ts.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/index.d.ts +3 -0
- package/dist/types/src/blueprints/blueprint-manager/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/browser/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/browser/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/browser/blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/browser/blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/browser/index.d.ts +2 -0
- package/dist/types/src/blueprints/browser/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/database/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/database/blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/context-add.d.ts +7 -0
- package/dist/types/src/blueprints/database/functions/context-add.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/context-remove.d.ts +7 -0
- package/dist/types/src/blueprints/database/functions/context-remove.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/definitions.d.ts +59 -0
- package/dist/types/src/blueprints/database/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/database/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/load.d.ts +7 -0
- package/dist/types/src/blueprints/database/functions/load.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/object-create.d.ts +8 -0
- package/dist/types/src/blueprints/database/functions/object-create.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/object-delete.d.ts +7 -0
- package/dist/types/src/blueprints/database/functions/object-delete.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/object-update.d.ts +10 -0
- package/dist/types/src/blueprints/database/functions/object-update.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/query.d.ts +12 -0
- package/dist/types/src/blueprints/database/functions/query.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/relation-create.d.ts +10 -0
- package/dist/types/src/blueprints/database/functions/relation-create.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/relation-delete.d.ts +7 -0
- package/dist/types/src/blueprints/database/functions/relation-delete.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/schema-add.d.ts +9 -0
- package/dist/types/src/blueprints/database/functions/schema-add.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/schema-list.d.ts +7 -0
- package/dist/types/src/blueprints/database/functions/schema-list.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/tag-add.d.ts +8 -0
- package/dist/types/src/blueprints/database/functions/tag-add.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/functions/tag-remove.d.ts +8 -0
- package/dist/types/src/blueprints/database/functions/tag-remove.d.ts.map +1 -0
- package/dist/types/src/blueprints/database/index.d.ts +3 -0
- package/dist/types/src/blueprints/database/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/discord/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/functions/definitions.d.ts +15 -0
- package/dist/types/src/blueprints/discord/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/{functions/discord → blueprints/discord/functions}/fetch-messages.d.ts +3 -2
- package/dist/types/src/blueprints/discord/functions/fetch-messages.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/functions/fetch-messages.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/discord/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/index.d.ts +2 -2
- package/dist/types/src/blueprints/discord/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/github/functions/definitions.d.ts +7 -0
- package/dist/types/src/blueprints/github/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/github/functions/fetch-prs.d.ts +8 -0
- package/dist/types/src/blueprints/github/functions/fetch-prs.d.ts.map +1 -0
- package/dist/types/src/blueprints/github/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/github/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/github/index.d.ts +2 -0
- package/dist/types/src/blueprints/github/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/index.d.ts +11 -6
- package/dist/types/src/blueprints/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/linear/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/linear/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/functions/definitions.d.ts +6 -0
- package/dist/types/src/blueprints/linear/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/linear/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/functions/linear.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts +10 -0
- package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/index.d.ts +2 -2
- package/dist/types/src/blueprints/linear/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/memory/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/memory/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/memory/blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/memory/blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/memory/functions/definitions.d.ts +17 -0
- package/dist/types/src/blueprints/memory/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/memory/functions/delete.d.ts +10 -0
- package/dist/types/src/blueprints/memory/functions/delete.d.ts.map +1 -0
- package/dist/types/src/blueprints/memory/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/memory/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/memory/functions/query.d.ts +8 -0
- package/dist/types/src/blueprints/memory/functions/query.d.ts.map +1 -0
- package/dist/types/src/blueprints/memory/functions/save.d.ts +8 -0
- package/dist/types/src/blueprints/memory/functions/save.d.ts.map +1 -0
- package/dist/types/src/blueprints/memory/index.d.ts +3 -0
- package/dist/types/src/blueprints/memory/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/planning/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/planning/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts +24 -0
- package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/functions/update-tasks.test.d.ts +2 -0
- package/dist/types/src/blueprints/planning/functions/update-tasks.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/index.d.ts +2 -2
- package/dist/types/src/blueprints/planning/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/project/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/project/blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/functions/add-artifact.d.ts +4 -0
- package/dist/types/src/blueprints/project/functions/add-artifact.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/functions/agent.d.ts +4 -0
- package/dist/types/src/blueprints/project/functions/agent.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/functions/definitions.d.ts +173 -0
- package/dist/types/src/blueprints/project/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/functions/get-context.d.ts +4 -0
- package/dist/types/src/blueprints/project/functions/get-context.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/project/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/functions/qualifier.d.ts +5 -0
- package/dist/types/src/blueprints/project/functions/qualifier.d.ts.map +1 -0
- package/dist/types/src/blueprints/project/index.d.ts +3 -0
- package/dist/types/src/blueprints/project/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/project-wizard/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/project-wizard/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts +55 -0
- package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts.map +1 -0
- package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts +103 -0
- package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/project-wizard/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/project-wizard/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/project-wizard/functions/project-rules.d.ts +4 -0
- package/dist/types/src/blueprints/project-wizard/functions/project-rules.d.ts.map +1 -0
- package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts +52 -0
- package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts.map +1 -0
- package/dist/types/src/blueprints/project-wizard/index.d.ts +3 -0
- package/dist/types/src/blueprints/project-wizard/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/testing.d.ts +9 -5
- package/dist/types/src/blueprints/testing.d.ts.map +1 -1
- package/dist/types/src/blueprints/websearch/blueprint.d.ts +4 -0
- package/dist/types/src/blueprints/websearch/blueprint.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/blueprint.test.d.ts +2 -0
- package/dist/types/src/blueprints/websearch/blueprint.test.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/functions/definitions.d.ts +5 -0
- package/dist/types/src/blueprints/websearch/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/functions/fetch.d.ts +6 -0
- package/dist/types/src/blueprints/websearch/functions/fetch.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/functions/index.d.ts +4 -0
- package/dist/types/src/blueprints/websearch/functions/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/websearch/index.d.ts +3 -3
- package/dist/types/src/blueprints/websearch/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/websearch/{websearch-toolkit.d.ts → toolkit.d.ts} +3 -1
- package/dist/types/src/blueprints/websearch/toolkit.d.ts.map +1 -0
- package/dist/types/src/crud/graph.d.ts +15 -15
- package/dist/types/src/crud/graph.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +41 -0
- package/dist/types/src/errors.d.ts.map +1 -0
- package/dist/types/src/functions/agent/definitions.d.ts +61 -0
- package/dist/types/src/functions/agent/definitions.d.ts.map +1 -0
- package/dist/types/src/functions/agent/index.d.ts +3 -4
- package/dist/types/src/functions/agent/index.d.ts.map +1 -1
- package/dist/types/src/functions/agent/prompt.d.ts +2 -7
- package/dist/types/src/functions/agent/prompt.d.ts.map +1 -1
- package/dist/types/src/functions/agent/prompt.test.d.ts +2 -0
- package/dist/types/src/functions/agent/prompt.test.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +0 -6
- package/dist/types/src/functions/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/sync/sync.d.ts +3 -4
- package/dist/types/src/sync/sync.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +2 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/plugins.d.ts +19 -0
- package/dist/types/src/testing/plugins.d.ts.map +1 -0
- package/dist/types/src/toolkits/WebToolkit.d.ts +38 -0
- package/dist/types/src/toolkits/WebToolkit.d.ts.map +1 -0
- package/dist/types/src/toolkits/index.d.ts +1 -2
- package/dist/types/src/toolkits/index.d.ts.map +1 -1
- package/dist/types/src/types/Agent.d.ts +78 -0
- package/dist/types/src/types/Agent.d.ts.map +1 -0
- package/dist/types/src/types/Chat.d.ts +53 -0
- package/dist/types/src/types/Chat.d.ts.map +1 -0
- package/dist/types/src/types/McpServer.d.ts +20 -0
- package/dist/types/src/types/McpServer.d.ts.map +1 -0
- package/dist/types/src/types/Memory.d.ts +11 -0
- package/dist/types/src/types/Memory.d.ts.map +1 -0
- package/dist/types/src/types/Plan.d.ts +87 -0
- package/dist/types/src/types/Plan.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +6 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/util/graphql.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +46 -41
- package/src/blueprints/automation/blueprint.ts +105 -0
- package/src/blueprints/automation/index.ts +5 -0
- package/src/blueprints/blueprint-manager/blueprint.conversations.json +1 -0
- package/src/blueprints/blueprint-manager/blueprint.test.ts +202 -0
- package/src/blueprints/blueprint-manager/blueprint.ts +49 -0
- package/src/blueprints/blueprint-manager/functions/definitions.ts +60 -0
- package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +43 -0
- package/src/blueprints/blueprint-manager/functions/index.ts +13 -0
- package/src/blueprints/blueprint-manager/functions/query-blueprints.ts +18 -0
- package/src/blueprints/blueprint-manager/functions/update-blueprints.ts +18 -0
- package/src/blueprints/blueprint-manager/index.ts +6 -0
- package/src/blueprints/browser/blueprint.test.ts +61 -0
- package/src/blueprints/browser/blueprint.ts +40 -0
- package/src/blueprints/browser/index.ts +5 -0
- package/src/blueprints/database/blueprint.conversations.json +1 -0
- package/src/blueprints/database/blueprint.test.ts +531 -0
- package/src/blueprints/database/blueprint.ts +66 -0
- package/src/blueprints/database/functions/context-add.ts +24 -0
- package/src/blueprints/database/functions/context-remove.ts +24 -0
- package/src/blueprints/database/functions/definitions.ts +331 -0
- package/src/blueprints/database/functions/index.ts +23 -0
- package/src/blueprints/database/functions/load.ts +19 -0
- package/src/blueprints/database/functions/object-create.ts +38 -0
- package/src/blueprints/database/functions/object-delete.ts +20 -0
- package/src/blueprints/database/functions/object-update.ts +30 -0
- package/src/blueprints/database/functions/query.ts +63 -0
- package/src/blueprints/database/functions/relation-create.ts +34 -0
- package/src/blueprints/database/functions/relation-delete.ts +21 -0
- package/src/blueprints/database/functions/schema-add.ts +28 -0
- package/src/blueprints/database/functions/schema-list.ts +40 -0
- package/src/blueprints/database/functions/tag-add.ts +21 -0
- package/src/blueprints/database/functions/tag-remove.ts +21 -0
- package/src/blueprints/database/index.ts +21 -0
- package/src/blueprints/discord/blueprint.ts +41 -0
- package/src/blueprints/discord/functions/definitions.ts +71 -0
- package/src/blueprints/discord/functions/fetch-messages.test.ts +50 -0
- package/src/blueprints/discord/functions/fetch-messages.ts +198 -0
- package/src/blueprints/discord/functions/index.ts +9 -0
- package/src/blueprints/discord/index.ts +2 -3
- package/src/blueprints/github/functions/definitions.ts +27 -0
- package/src/blueprints/github/functions/fetch-prs.ts +24 -0
- package/src/blueprints/github/functions/index.ts +9 -0
- package/src/blueprints/github/index.ts +5 -0
- package/src/blueprints/index.ts +11 -6
- package/src/blueprints/linear/blueprint.ts +42 -0
- package/src/blueprints/linear/functions/definitions.ts +24 -0
- package/src/blueprints/linear/functions/index.ts +9 -0
- package/src/blueprints/linear/functions/linear.test.ts +57 -0
- package/src/{functions/linear → blueprints/linear/functions}/sync-issues.ts +40 -47
- package/src/blueprints/linear/index.ts +2 -3
- package/src/blueprints/memory/blueprint.conversations.json +1 -0
- package/src/blueprints/memory/blueprint.test.ts +139 -0
- package/src/blueprints/memory/blueprint.ts +41 -0
- package/src/blueprints/memory/functions/definitions.ts +71 -0
- package/src/blueprints/memory/functions/delete.ts +20 -0
- package/src/blueprints/memory/functions/index.ts +13 -0
- package/src/blueprints/memory/functions/query.ts +32 -0
- package/src/blueprints/memory/functions/save.ts +20 -0
- package/src/blueprints/memory/index.ts +6 -0
- package/src/blueprints/planning/blueprint.ts +24 -0
- package/src/blueprints/planning/functions/index.ts +9 -0
- package/src/blueprints/planning/functions/update-tasks.md +116 -0
- package/src/blueprints/planning/functions/update-tasks.test.ts +55 -0
- package/src/blueprints/planning/functions/update-tasks.ts +68 -0
- package/src/blueprints/planning/index.ts +3 -4
- package/src/blueprints/project/blueprint.conversations.json +1 -0
- package/src/blueprints/project/blueprint.test.ts +712 -0
- package/src/blueprints/project/blueprint.ts +64 -0
- package/src/blueprints/project/functions/add-artifact.ts +31 -0
- package/src/blueprints/project/functions/agent.ts +69 -0
- package/src/blueprints/project/functions/definitions.ts +94 -0
- package/src/blueprints/project/functions/get-context.ts +47 -0
- package/src/blueprints/project/functions/index.ts +14 -0
- package/src/blueprints/project/functions/qualifier.ts +91 -0
- package/src/blueprints/project/index.ts +6 -0
- package/src/blueprints/project-wizard/blueprint.ts +52 -0
- package/src/blueprints/project-wizard/functions/create-project.ts +32 -0
- package/src/blueprints/project-wizard/functions/definitions.ts +65 -0
- package/src/blueprints/project-wizard/functions/index.ts +13 -0
- package/src/blueprints/project-wizard/functions/project-rules.ts +77 -0
- package/src/blueprints/project-wizard/functions/sync-triggers.ts +156 -0
- package/src/blueprints/project-wizard/index.ts +6 -0
- package/src/blueprints/testing.ts +29 -8
- package/src/blueprints/websearch/blueprint.conversations.json +1 -0
- package/src/blueprints/websearch/blueprint.test.ts +39 -0
- package/src/blueprints/websearch/blueprint.ts +30 -0
- package/src/blueprints/websearch/functions/definitions.ts +26 -0
- package/src/blueprints/websearch/functions/fetch.ts +18 -0
- package/src/blueprints/websearch/functions/index.ts +9 -0
- package/src/blueprints/websearch/index.ts +3 -4
- package/src/blueprints/websearch/{websearch-toolkit.ts → toolkit.ts} +6 -1
- package/src/crud/graph.test.ts +13 -38
- package/src/crud/graph.ts +158 -175
- package/src/errors.ts +25 -0
- package/src/functions/READ_THIS.md +5 -0
- package/src/functions/agent/definitions.ts +57 -0
- package/src/functions/agent/index.ts +3 -5
- package/src/functions/agent/prompt.conversations.json +1 -0
- package/src/functions/agent/prompt.test.ts +78 -0
- package/src/functions/agent/prompt.ts +212 -102
- package/src/functions/index.ts +0 -6
- package/src/index.ts +2 -2
- package/src/sync/sync.ts +58 -38
- package/src/testing/index.ts +2 -1
- package/src/testing/plugins.tsx +74 -0
- package/src/toolkits/WebToolkit.ts +33 -0
- package/src/toolkits/index.ts +1 -2
- package/src/types/Agent.ts +235 -0
- package/src/types/Chat.ts +56 -0
- package/src/types/McpServer.ts +34 -0
- package/src/types/Memory.ts +24 -0
- package/src/types/Plan.ts +103 -0
- package/src/types/index.ts +9 -0
- package/dist/lib/browser/index.mjs +0 -2777
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/node-esm/index.mjs +0 -2778
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/types/src/blueprints/design/design-blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/design/design-blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/design/design-blueprint.test.d.ts +0 -2
- package/dist/types/src/blueprints/design/design-blueprint.test.d.ts.map +0 -1
- package/dist/types/src/blueprints/design/index.d.ts +0 -3
- package/dist/types/src/blueprints/design/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/discord/discord-blueprint.d.ts +0 -18
- package/dist/types/src/blueprints/discord/discord-blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/linear/linear-blueprint.d.ts +0 -18
- package/dist/types/src/blueprints/linear/linear-blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning/planning-blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/planning/planning-blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts +0 -2
- package/dist/types/src/blueprints/planning/planning-blueprint.test.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/index.d.ts +0 -3
- package/dist/types/src/blueprints/research/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/research-blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/research/research-blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/research-blueprint.test.d.ts +0 -2
- package/dist/types/src/blueprints/research/research-blueprint.test.d.ts.map +0 -1
- package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/websearch/websearch-toolkit.d.ts.map +0 -1
- package/dist/types/src/experimental/feed.test.d.ts +0 -2
- package/dist/types/src/experimental/feed.test.d.ts.map +0 -1
- package/dist/types/src/functions/discord/fetch-messages.d.ts.map +0 -1
- package/dist/types/src/functions/discord/fetch-messages.test.d.ts.map +0 -1
- package/dist/types/src/functions/discord/index.d.ts +0 -12
- package/dist/types/src/functions/discord/index.d.ts.map +0 -1
- package/dist/types/src/functions/document/index.d.ts +0 -13
- package/dist/types/src/functions/document/index.d.ts.map +0 -1
- package/dist/types/src/functions/document/read.d.ts +0 -7
- package/dist/types/src/functions/document/read.d.ts.map +0 -1
- package/dist/types/src/functions/document/update.d.ts +0 -6
- package/dist/types/src/functions/document/update.d.ts.map +0 -1
- package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +0 -173
- package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts.map +0 -1
- package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts +0 -2
- package/dist/types/src/functions/entity-extraction/entity-extraction.test.d.ts.map +0 -1
- package/dist/types/src/functions/entity-extraction/index.d.ts +0 -174
- package/dist/types/src/functions/entity-extraction/index.d.ts.map +0 -1
- package/dist/types/src/functions/exa/exa.d.ts +0 -5
- package/dist/types/src/functions/exa/exa.d.ts.map +0 -1
- package/dist/types/src/functions/exa/index.d.ts +0 -3
- package/dist/types/src/functions/exa/index.d.ts.map +0 -1
- package/dist/types/src/functions/exa/mock.d.ts +0 -5
- package/dist/types/src/functions/exa/mock.d.ts.map +0 -1
- package/dist/types/src/functions/github/fetch-prs.d.ts +0 -6
- package/dist/types/src/functions/github/fetch-prs.d.ts.map +0 -1
- package/dist/types/src/functions/linear/index.d.ts +0 -9
- package/dist/types/src/functions/linear/index.d.ts.map +0 -1
- package/dist/types/src/functions/linear/linear.test.d.ts.map +0 -1
- package/dist/types/src/functions/linear/sync-issues.d.ts +0 -12
- package/dist/types/src/functions/linear/sync-issues.d.ts.map +0 -1
- package/dist/types/src/functions/research/document-create.d.ts +0 -9
- package/dist/types/src/functions/research/document-create.d.ts.map +0 -1
- package/dist/types/src/functions/research/index.d.ts +0 -21
- package/dist/types/src/functions/research/index.d.ts.map +0 -1
- package/dist/types/src/functions/research/research-graph.d.ts +0 -18
- package/dist/types/src/functions/research/research-graph.d.ts.map +0 -1
- package/dist/types/src/functions/research/research.d.ts +0 -14
- package/dist/types/src/functions/research/research.d.ts.map +0 -1
- package/dist/types/src/functions/research/research.test.d.ts +0 -2
- package/dist/types/src/functions/research/research.test.d.ts.map +0 -1
- package/dist/types/src/functions/research/types.d.ts +0 -6
- package/dist/types/src/functions/research/types.d.ts.map +0 -1
- package/dist/types/src/functions/tasks/index.d.ts +0 -15
- package/dist/types/src/functions/tasks/index.d.ts.map +0 -1
- package/dist/types/src/functions/tasks/read.d.ts +0 -7
- package/dist/types/src/functions/tasks/read.d.ts.map +0 -1
- package/dist/types/src/functions/tasks/task-list.d.ts +0 -74
- package/dist/types/src/functions/tasks/task-list.d.ts.map +0 -1
- package/dist/types/src/functions/tasks/task-list.test.d.ts +0 -2
- package/dist/types/src/functions/tasks/task-list.test.d.ts.map +0 -1
- package/dist/types/src/functions/tasks/update.d.ts +0 -9
- package/dist/types/src/functions/tasks/update.d.ts.map +0 -1
- package/dist/types/src/plugins.d.ts +0 -19
- package/dist/types/src/plugins.d.ts.map +0 -1
- package/dist/types/src/testing/data/exa-search-1748337321991.d.ts +0 -38
- package/dist/types/src/testing/data/exa-search-1748337321991.d.ts.map +0 -1
- package/dist/types/src/testing/data/exa-search-1748337331526.d.ts +0 -37
- package/dist/types/src/testing/data/exa-search-1748337331526.d.ts.map +0 -1
- package/dist/types/src/testing/data/exa-search-1748337344119.d.ts +0 -58
- package/dist/types/src/testing/data/exa-search-1748337344119.d.ts.map +0 -1
- package/dist/types/src/testing/data/index.d.ts +0 -3
- package/dist/types/src/testing/data/index.d.ts.map +0 -1
- package/dist/types/src/toolkits/AssistantToolkit.d.ts +0 -17
- package/dist/types/src/toolkits/AssistantToolkit.d.ts.map +0 -1
- package/dist/types/src/toolkits/AssistantToolkit.test.d.ts +0 -2
- package/dist/types/src/toolkits/AssistantToolkit.test.d.ts.map +0 -1
- package/dist/types/src/toolkits/SystemToolkit.d.ts +0 -67
- package/dist/types/src/toolkits/SystemToolkit.d.ts.map +0 -1
- package/src/blueprints/design/design-blueprint.test.ts +0 -103
- package/src/blueprints/design/design-blueprint.ts +0 -33
- package/src/blueprints/design/index.ts +0 -7
- package/src/blueprints/discord/discord-blueprint.ts +0 -34
- package/src/blueprints/linear/linear-blueprint.ts +0 -35
- package/src/blueprints/planning/planning-blueprint.test.ts +0 -124
- package/src/blueprints/planning/planning-blueprint.ts +0 -98
- package/src/blueprints/research/index.ts +0 -7
- package/src/blueprints/research/research-blueprint.test.ts +0 -7
- package/src/blueprints/research/research-blueprint.ts +0 -53
- package/src/blueprints/websearch/websearch-blueprint.ts +0 -20
- package/src/experimental/feed.test.ts +0 -111
- package/src/functions/discord/fetch-messages.test.ts +0 -58
- package/src/functions/discord/fetch-messages.ts +0 -252
- package/src/functions/discord/index.ts +0 -9
- package/src/functions/document/index.ts +0 -12
- package/src/functions/document/read.ts +0 -29
- package/src/functions/document/update.ts +0 -30
- package/src/functions/entity-extraction/entity-extraction.conversations.json +0 -1
- package/src/functions/entity-extraction/entity-extraction.test.ts +0 -92
- package/src/functions/entity-extraction/entity-extraction.ts +0 -165
- package/src/functions/entity-extraction/index.ts +0 -9
- package/src/functions/exa/exa.ts +0 -37
- package/src/functions/exa/index.ts +0 -6
- package/src/functions/exa/mock.ts +0 -71
- package/src/functions/github/fetch-prs.ts +0 -30
- package/src/functions/linear/index.ts +0 -9
- package/src/functions/linear/linear.test.ts +0 -83
- package/src/functions/research/document-create.ts +0 -75
- package/src/functions/research/index.ts +0 -14
- package/src/functions/research/research-graph.ts +0 -47
- package/src/functions/research/research-instructions.tpl +0 -106
- package/src/functions/research/research.conversations.json +0 -1
- package/src/functions/research/research.test.ts +0 -179
- package/src/functions/research/research.ts +0 -190
- package/src/functions/research/types.ts +0 -26
- package/src/functions/tasks/index.ts +0 -11
- package/src/functions/tasks/read.ts +0 -34
- package/src/functions/tasks/task-list.test.ts +0 -99
- package/src/functions/tasks/task-list.ts +0 -165
- package/src/functions/tasks/update.ts +0 -52
- package/src/plugins.tsx +0 -68
- package/src/testing/data/exa-search-1748337321991.ts +0 -131
- package/src/testing/data/exa-search-1748337331526.ts +0 -144
- package/src/testing/data/exa-search-1748337344119.ts +0 -133
- package/src/testing/data/index.ts +0 -11
- package/src/toolkits/AssistantToolkit.conversations.json +0 -1
- package/src/toolkits/AssistantToolkit.test.ts +0 -88
- package/src/toolkits/AssistantToolkit.ts +0 -47
- package/src/toolkits/SystemToolkit.ts +0 -231
- /package/dist/types/src/{functions/discord → blueprints/discord/functions}/fetch-messages.test.d.ts +0 -0
- /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
|
+
});
|
|
@@ -2,27 +2,36 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import * as
|
|
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 {
|
|
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<
|
|
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
|
|
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*
|
|
30
|
+
yield* session.createRequest({
|
|
22
31
|
...props,
|
|
23
32
|
observer: GenerationObserver.fromPrinter(new ConsolePrinter({ mode: 'json' })),
|
|
24
33
|
});
|
|
25
|
-
const messages = yield* Effect.promise(() =>
|
|
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
|
-
|
|
34
|
-
|
|
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":"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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":"EtwgCioIEBgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDCAMi4wa5bEWh1a8YhoMWC/0pcHsZRwfBYyWIjAL09cxozLophdsKROC4cRbyyI53z6SH5bSQhAradWvcGOwonm5TBQiNSVKUpKwG0Mq3x9YTLBXH/rN0FJKxuO/f6iCXFjMgpfQKoy6LTy5LR784chrgee1dt4uzwYljDq1yBXswF2Lc0yUUzL4WD3EynRRa3c+UzcW6U73luO5Pf4bZeIompfQ+leTsJy/mILKDcvQOrH/moOgugm2R8y+z1U3bGsEP4kU4p6ohn0AAvFZu8oZFsFvapvDvng8FyNTNnEhNjbRoaLqpKtcrSXJwu5IpN+AoUgY93tQMRIykgxI9mkITZpgId7wnZtYs8TwjIeHnG8rAcMsuAWJNYjl053T1k1wce1LKfJfhQNNQfxxlf3tzguc/c9Yf/PnFvYoS546QIlQaa4C6ggQgLURLza6EBspiEvmabmCfPzQHbWM/l8RFSxmyxIhZ2j0R7j2C5W+lAghAFBMK54JjeCRPYwCMhQ4EI3umV8UwE0Vkm0ccAYkTNBRglZp0koZTqorO8efExdHvyyrYuuF2zhUtU7zaiD7tUWOG/16qAyRTA3/5Bzm7xVmXxPUwgASmUkVwc6l8ywHfmlL62UWdEvhCtaJK2MHq4fTHs9j085OJRthjkMQ4AA1yQkaIRMAYeicHfzdZwhoBGyHvzLk6hyODz/wbLrAt5KJS1oaTfKvk7iawXEFsKbGGkfZYicjLyrNzaIItFk3zbQsrgFkUfCGzCiplNP/rvYiMoCBshVfQjaz484oCyhVG11oPqgafO81zT6gt1n7wiN2SnToOjf1Z/wEvaM8WeT7Vl43q8vKe+4j0BBZzN04pQMAe+Av9UQno745O7zqxZCVZscO0LcwUjLeYdWSxNRCiP5F4j68atrrYKrUk/ZlgAeKawVZeQcHUbnkCHQQlL52gR/reof1IAfTPzj8qategYfTdxi5l2OvsKBab2Ku+3uiZWqSgYx1wOMIsUqLn7pawqSIiWvwhDN+dPn9uQbl6gmfjY247hpkhwP+uazNWIJPsucsJpzEWgF+liPMA/axFu5AMbwAzyZIlsKqTLc8EU8/tLH3YUYcUf95UZiV5wnlsRBZAcu6ZIMl1hhKq4I7MAkRVdOVhI+xut6cDteEl0NMagf7YzeUd2sU660kH/Ivz/b1A5AW9Bm+veKmj3HUa7JFZiDbxsdB2f1ymCeRPyTrq6ZrgYzgXAVTXBNZxQnecqznq6ORqSnp43dDNOpK0rTJfXxdSrrYMWTz9zDJBEnP/JCJu/eQ36FnKqPn4Te1WV9/cSt4Ik/iWyHZtLSSfFluBnYQUpCfD2B/Tn1gWzd7HqA/eBpY/FKYLxtSJd05vYHNMMKNmSE46zxO8699Jgp6hCBUZfWwJSlnB+sn6G18BEwaWck7P4/BNG1jcokwHK5Sz9T02BN2h1R6BVWJnr3Ff8GUDKLTxS1YpbFS62Df4ru0RXqvMT84Zogp7la9a8dZQB0vUCIaAordA+6FRU4e8O/NZdCwKBCASNWkjjV0qtliHwZ5UnR+cH8gkRSbed+zPZ2lMjTmDxLPEQP8wzbjcJwv8zBeiuPn2dncx6GJC8oIO1owV+ysr0so4c0eI8Ovjk/ht2Q24StSBrGygbT3tEn77WfeP4lujpPor93nf/Uv3PTkBbtq2ZufAAmElnugO9EaQioI/uSRB5mThlaZ6Lb9V6HmkzcDBuXTElzA8i3NihdrAO8zF9xxGM2JFm/ipCp3FyLNW8eQ+prmVOwsijuNLFamZ9IhVNg2q6TjlZAX9cZLxgLx2Tehk0LZlzCVR2o84yJKYJpTf6FwKakvhD4M/frpAwQ5+HLAE8JGjo5tJp2IGtK/el/rH87hiFVog5r/DzcqaO7csRtd+DnsSV5Ux1Sln9HGV2EylNozXG73CUP49O1lqTynHnAI/F4xzBhqoBdezIVKSsqRL4/lQsgg5zhGfBG71+ICjpzEktvtSzYlhB0VfJ/eP3iuV0W7p9lTpbUaO2NlKaQl2DnZM+qbMGsPBAR26KJOe+lGkyDEHFyW0ASm7kaw5vChBNLakQLzBdVrMRj2lKRz8NNXIZbTnSLwCc0VSD/RTymtGrS7SFtHIWIWtj5hvKOrstCOo+v2S2pJLXu9G4KLFYwgK/eHW2KQ5jeZW0iJkw8OQ22xax4AYy3vZzxkF5k4ul5Uf07JIusNhtt8zrOYVI8Y0h8FGzZ6RZO+RydMvUIFSohsIxwsbjD01lC1Y1+qL6Tysicj69TwNBCtf4YP8fERF2PAz+ajQNoXjJz0ii3EGx3CuNtYl1jP5kZR/0hSrgtIu/cn8YZ1iSx0ArmikaCOwiVdQqBKXTPZDZG27elorTvvzZn/1Jp0Pl9Uf+RaPM6ufqv06Li7WUerC5ctEliulGSmoNPYrdtLCElJ37v/LQSic7BrrfVsL5KDLp+Q6rbfU1348y4oHQOeAAZihyo2q5r71WDwgysdCt36pACQrFAaOgPJ4ii2IP1ikBRZWJ/Jz5+S5faOzQQttcsajFXxlTMDkUDjIMLYX3AWWqle9daPzAJNxZ+nrMb+niQttgGW+o3Xnl6+oGcnkdd726z2yTDaHUvR5SWEaXile1bzeNkrLms5kTZ/9wr2fXdWwLZycN5whKRA4xxtya1JIitHYxd22RIqFzlo3eCiaHa8AYug8Idky51pKiMzXSMqYY6WmFgV+c6ng3bhENI2x8yCGL4OLNfFf+x1+1SKQfbx92cF7PYJ7dNpY2GU47+vkCHIhlh0hYtbfl7KcwFSn6XW2sKuYRNIIMK7fdD4wmKCD7bSqBk4dUe3I9wVoJpX1nMsfVRBQYoZahDk2fBcUIzstPK/CFzhC+BQyWV+t8GK/D/gsVEjerHXWpXuVwD8K1Sdgm0RxK0Co/4Qcy9C04+qMPByiSRts/ssYHn0yC+w7fFYOquGzhdbcth87i20JHGKUU++pl1ym/NUmkcz4/By6suWiuQaDNEbYhpUAjASGI66ZvQNrJiwHVtArA59rooZqaLkXO4qVeq8qTK+7KEOZKFqh7seqG3S4sSKPdIlPpgJ4VSISFAgnkoAgDMvLlb3dMLcyrk95JDy5tSWgr7xf9Gx0hw7msZD4gTb/eVgaIU2CIcvQuY9B2tYdxhkztQR8b9UZkOZrFWTBS+s2pn71DIMeo9efXCttnxjwA7irmVOgeJmlO6YxKo2EfrFksgRVsEV/eRhq+o0aqDXZBzOQxEJNDhkWEaUITu2d8Npr9m6pSOvVKPYMqiiRJcgqaPvGZ087/RTiOqmH4F8zkz/b19ScmxN1HoX0+5ZhG1XHvq6qgZTHHe3INvWeQc0+LOqk4fGbowUBrE9Lt9AlPjNvy4W0bo1pJNnrzAUu5xKSzSmHmcrtMe+M43V4WAPuI91xLFvLMP4PoVHU+cRHexKud0NWV9lXt+Ik6s8hLHEgQfhN9kUDnKQMmVwYae5YY9mfbcFM132kEO1zS0JOFjGgtxuGL01AuUy4Uf+RXbKL4fLNhPwVqlnypAmVfUH/FdOs1FFlSsOltLwkokqo7WRTmKdfvam5dE8BBml5RnXgw5/qOtP4rTDUWPuStkTJjcJgJf0Ls0Q+KOHeNsuKqPwMR7/hJ6y6OuH1JFbJFTPtv/ydnPJAEkr2MBjEjTtIBbdQ1DcrszUpmpWca6NcCYzTK9b44SPlMCISL5c3GWQNsCbicmVWBPMbflOKDguOgv9/C/cD+0wNev6vg6piYCREEw0Nglsghd+iP4Xwm1eIErAeGTYKogut1PdHmn4LHMNt5QMzwcd+/3lHKV9vvbP5CGfKesL1r7h4tDIjpX3i1uC1wnV75KeX4U/3yl0TTt1pTuuN5RmKiWywUWVT9fW4SrFBJkJRdGIpkYlxpb4U09ZKBAnEP88NOK7Irjiv/CmnR3Keum6YfYE28H305niEQM/z973JSITN3tMGRM+Hd9Yu6Uh+oQhMkrMavvO2TcTYT5INbp+yeYGbBLQopCq/WT2iQ//Uvb11qzAqgE0ejjXNJ6jBGd/obLF4CPjyAYvPXK6uoNIn8dBKm01SrqVHiMXUN+sl2RQxd40ulYBIdJooxnMEH7Q6YYu1ECMqvJeKiyrZeaX/dtRR7fHRCVvqdVuWLnNocUcKzNZzMw7fcPdftbJF5ELbgvE9n5V9wm58lbHZlRJaxsmrGlqnZrtKY3vnw9N+zlLx7PMv3hNHE6IrirsgL+WlipJ9Hnd4ATxVmHNGSONaotPSjLn8WRw0bxtheb4I3UU0PY4NSzXsmm8G/aMeemiwO6C2wcJJMXCimW20+Ikpwo9stXJP6XbKr6P0/VJeFoqx8pAAFno9IeUGxuUq3Ifs8mSlh5Wz8MVqfRSu6EId732091qqJkeF54RcmMHGXR3E4+OE0cOAANRrWQ+wnLNq4jbieL6ta4l2TCwlq+7+i5+S2M4JBkCRF+0v1Nncu8d9LY3At6wGPpTrrtJXpNMbMmL35DAuCShdwvccmNw1dsv9+msKDt+XSKXixaSYyBxnKH0zfNpCxg/Yv3eIfwcRJ7GPrkBewtYmcHQDlQQSJ70ksdmk13eNVwRvd97oqbEC7R9UaMo4PHV4PwWoHumUoq1J6n8UXOPcqA4LsDlZCuuclrCh+CDO+qP6k2gktWZBRkmCUfvWTySaI4yAgk0BpW0gh0SYTfLMC5S2/tMVLBMISoDnP9msa3jsBWDiaWU+WN8FxywdH28b9tHGBrdPRp1ah8zOm0hAF3RIrH1mvN4y6rigrTGIeSoOPBN2a9jFVclc0V7d8mvzlqv0H6/J8mTQqyFMThRG1iSqapSaL4GSsSdcPnzDQWekr3aVjlMqG8TwDLp+djlKDt1iaj2Kc6aEvQdyT5lxBizz/KfIqzsHnnF2N1ewznuU+UI1jdTHfxZY+2mNFnQqjEdMmxPMed3T553FJNpnULjzMdHHIRAWj+pAXPQDHwW/ISlJudLO0MPwcklEi3l9aXzyvJrva95WurYtO/S9Xw/Zs72ggLPWeYng5EXXDbjX5AJPUdJkRtw8/NBx4BGED33SUjWzNC97nhZJvIJrdwFcJciG9NhUnYUh8rzZYbYbwV7nmy7KHGsquk7i+g97/0MOkgazT/TAl+b0FsfiLDPGvdYEoy+8vZ1sLkOEYstytlNyieM4My0tzxc/F2ze2nRwdeH3vc4A7uGBzNpCYELFn8IGBfWNFn7yQAowNOEmSQUD03VVYT9gCvdE8s4OTmx7E2LGmVrqvWKos928oM+z+R6egWrpAPB1VHFtm6mZGcVdvJDjxVfAmLvYNuIo0RnLyt6Fo1Xge3xAgEkOLxU8fDH+xu4wrNY+NINj/szju0Im4iHUYft5eMlrfDTAl7voLmRPjkhQM/9vL4IWqhQ0R7etzKT6NZmv6/4f6IU3LW1RP8bQr9dZyzAsyzKjnuZTz8EirhvWwti3aGRiXJc2RH3M2phMezPAUOpf1ZgfoCnSaVas89bBfv4ScJa8R08GAM=","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
|
+
);
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export {
|
|
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);
|
package/src/crud/graph.test.ts
CHANGED
|
@@ -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 {
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
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 {
|
|
14
|
+
import { Pipeline } from '@dxos/types';
|
|
21
15
|
|
|
22
16
|
import { makeGraphWriterHandler, makeGraphWriterToolkit } from './graph';
|
|
23
17
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
|
57
|
-
const toolkit = yield* Toolkit;
|
|
58
|
-
const response = yield*
|
|
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.
|
|
41
|
+
TestHelpers.provideTestContext,
|
|
67
42
|
),
|
|
68
43
|
);
|
|
69
44
|
});
|