@dxos/assistant-toolkit 0.8.4-main.c85a9c8dae → 0.8.4-main.fcc0d83b33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/neutral/add-artifact-XDFUXRY5.mjs +30 -0
- package/dist/lib/neutral/add-artifact-XDFUXRY5.mjs.map +7 -0
- package/dist/lib/neutral/agent-6OHUAIA2.mjs +65 -0
- package/dist/lib/neutral/agent-6OHUAIA2.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4T3LJGXI.mjs +76 -0
- package/dist/lib/neutral/chunk-4T3LJGXI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CVUA23QI.mjs +332 -0
- package/dist/lib/neutral/chunk-CVUA23QI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-EJAQUAKM.mjs +73 -0
- package/dist/lib/neutral/chunk-EJAQUAKM.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GSG4JGIY.mjs +100 -0
- package/dist/lib/neutral/chunk-GSG4JGIY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JN4GARRQ.mjs +53 -0
- package/dist/lib/neutral/chunk-JN4GARRQ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-KGU725LW.mjs +29 -0
- package/dist/lib/neutral/chunk-KGU725LW.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NR3GTWRC.mjs +53 -0
- package/dist/lib/neutral/chunk-NR3GTWRC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-P5LAPHCG.mjs +140 -0
- package/dist/lib/neutral/chunk-P5LAPHCG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SVI25Z2Y.mjs +293 -0
- package/dist/lib/neutral/chunk-SVI25Z2Y.mjs.map +7 -0
- package/dist/lib/neutral/chunk-VSDP6SRY.mjs +74 -0
- package/dist/lib/neutral/chunk-VSDP6SRY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-WIV7ZVRS.mjs +109 -0
- package/dist/lib/neutral/chunk-WIV7ZVRS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-WLR3BGO4.mjs +25 -0
- package/dist/lib/neutral/chunk-WLR3BGO4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YSYNXOZA.mjs +68 -0
- package/dist/lib/neutral/chunk-YSYNXOZA.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YXOVSRFU.mjs +70 -0
- package/dist/lib/neutral/chunk-YXOVSRFU.mjs.map +7 -0
- package/dist/lib/neutral/context-add-IIDPRRVB.mjs +22 -0
- package/dist/lib/neutral/context-add-IIDPRRVB.mjs.map +7 -0
- package/dist/lib/neutral/context-remove-RDYV4PD4.mjs +22 -0
- package/dist/lib/neutral/context-remove-RDYV4PD4.mjs.map +7 -0
- package/dist/lib/neutral/create-project-MPAMKQ3T.mjs +36 -0
- package/dist/lib/neutral/create-project-MPAMKQ3T.mjs.map +7 -0
- package/dist/lib/neutral/delete-J3PMWP7Z.mjs +19 -0
- package/dist/lib/neutral/delete-J3PMWP7Z.mjs.map +7 -0
- package/dist/lib/neutral/enable-blueprints-LELPQHY5.mjs +48 -0
- package/dist/lib/neutral/enable-blueprints-LELPQHY5.mjs.map +7 -0
- package/dist/lib/neutral/fetch-KHMHV7JR.mjs +16 -0
- package/dist/lib/neutral/fetch-KHMHV7JR.mjs.map +7 -0
- package/dist/lib/neutral/fetch-messages-OS74FP76.mjs +140 -0
- package/dist/lib/neutral/fetch-messages-OS74FP76.mjs.map +7 -0
- package/dist/lib/neutral/get-context-JRTOOA5O.mjs +35 -0
- package/dist/lib/neutral/get-context-JRTOOA5O.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +572 -3294
- package/dist/lib/neutral/index.mjs.map +4 -4
- package/dist/lib/neutral/load-LI7HHVD6.mjs +17 -0
- package/dist/lib/neutral/load-LI7HHVD6.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/object-create-52Z7YKIA.mjs +35 -0
- package/dist/lib/neutral/object-create-52Z7YKIA.mjs.map +7 -0
- package/dist/lib/neutral/object-delete-I266YAXI.mjs +18 -0
- package/dist/lib/neutral/object-delete-I266YAXI.mjs.map +7 -0
- package/dist/lib/neutral/object-update-HY4GI7LA.mjs +28 -0
- package/dist/lib/neutral/object-update-HY4GI7LA.mjs.map +7 -0
- package/dist/lib/neutral/project-JAU3A7AX.mjs +23 -0
- package/dist/lib/neutral/project-JAU3A7AX.mjs.map +7 -0
- package/dist/lib/neutral/project-rules-FLUQQRPB.mjs +78 -0
- package/dist/lib/neutral/project-rules-FLUQQRPB.mjs.map +7 -0
- package/dist/lib/neutral/prompt-4UMXX6QU.mjs +169 -0
- package/dist/lib/neutral/prompt-4UMXX6QU.mjs.map +7 -0
- package/dist/lib/neutral/qualifier-7BUCOEKK.mjs +88 -0
- package/dist/lib/neutral/qualifier-7BUCOEKK.mjs.map +7 -0
- package/dist/lib/neutral/query-B3NOYFCK.mjs +70 -0
- package/dist/lib/neutral/query-B3NOYFCK.mjs.map +7 -0
- package/dist/lib/neutral/query-U56GNEV6.mjs +32 -0
- package/dist/lib/neutral/query-U56GNEV6.mjs.map +7 -0
- package/dist/lib/neutral/query-blueprints-Z576ABT5.mjs +17 -0
- package/dist/lib/neutral/query-blueprints-Z576ABT5.mjs.map +7 -0
- package/dist/lib/neutral/relation-create-Z3NGW4VU.mjs +34 -0
- package/dist/lib/neutral/relation-create-Z3NGW4VU.mjs.map +7 -0
- package/dist/lib/neutral/relation-delete-LXY7W2YO.mjs +18 -0
- package/dist/lib/neutral/relation-delete-LXY7W2YO.mjs.map +7 -0
- package/dist/lib/neutral/save-GWAPLT3Z.mjs +23 -0
- package/dist/lib/neutral/save-GWAPLT3Z.mjs.map +7 -0
- package/dist/lib/neutral/schema-add-4TXJO2V7.mjs +24 -0
- package/dist/lib/neutral/schema-add-4TXJO2V7.mjs.map +7 -0
- package/dist/lib/neutral/schema-list-Q7HRRKGR.mjs +39 -0
- package/dist/lib/neutral/schema-list-Q7HRRKGR.mjs.map +7 -0
- package/dist/lib/neutral/sync-issues-A2RJNPEF.mjs +167 -0
- package/dist/lib/neutral/sync-issues-A2RJNPEF.mjs.map +7 -0
- package/dist/lib/neutral/sync-triggers-NV4JCRN5.mjs +137 -0
- package/dist/lib/neutral/sync-triggers-NV4JCRN5.mjs.map +7 -0
- package/dist/lib/neutral/tag-add-5NOHUTIE.mjs +19 -0
- package/dist/lib/neutral/tag-add-5NOHUTIE.mjs.map +7 -0
- package/dist/lib/neutral/tag-remove-QTKYDJAW.mjs +19 -0
- package/dist/lib/neutral/tag-remove-QTKYDJAW.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +8 -13
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/lib/neutral/update-blueprints-K7A5SHBZ.mjs +17 -0
- package/dist/lib/neutral/update-blueprints-K7A5SHBZ.mjs.map +7 -0
- package/dist/lib/neutral/update-tasks-UGGHWXT5.mjs +46 -0
- package/dist/lib/neutral/update-tasks-UGGHWXT5.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.map +1 -0
- package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts +60 -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 +5 -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 +2 -2
- package/dist/types/src/blueprints/browser/blueprint.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/blueprint.d.ts +2 -2
- package/dist/types/src/blueprints/database/blueprint.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/context-add.d.ts +5 -4
- package/dist/types/src/blueprints/database/functions/context-add.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/context-remove.d.ts +5 -4
- package/dist/types/src/blueprints/database/functions/context-remove.d.ts.map +1 -1
- 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 +3 -56
- package/dist/types/src/blueprints/database/functions/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/load.d.ts +5 -4
- package/dist/types/src/blueprints/database/functions/load.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/object-create.d.ts +5 -3
- package/dist/types/src/blueprints/database/functions/object-create.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/object-delete.d.ts +5 -4
- package/dist/types/src/blueprints/database/functions/object-delete.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/object-update.d.ts +5 -4
- package/dist/types/src/blueprints/database/functions/object-update.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/query.d.ts +7 -3
- package/dist/types/src/blueprints/database/functions/query.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/relation-create.d.ts +6 -5
- package/dist/types/src/blueprints/database/functions/relation-create.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/relation-delete.d.ts +5 -4
- package/dist/types/src/blueprints/database/functions/relation-delete.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/schema-add.d.ts +4 -2
- package/dist/types/src/blueprints/database/functions/schema-add.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/schema-list.d.ts +4 -2
- package/dist/types/src/blueprints/database/functions/schema-list.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/tag-add.d.ts +4 -3
- package/dist/types/src/blueprints/database/functions/tag-add.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/tag-remove.d.ts +4 -3
- package/dist/types/src/blueprints/database/functions/tag-remove.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/index.d.ts +1 -1
- package/dist/types/src/blueprints/database/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/discord/blueprint.d.ts +2 -2
- package/dist/types/src/blueprints/discord/blueprint.d.ts.map +1 -1
- package/dist/types/src/blueprints/discord/functions/definitions.d.ts +16 -0
- package/dist/types/src/blueprints/discord/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/discord/functions/fetch-messages.d.ts +4 -2
- package/dist/types/src/blueprints/discord/functions/fetch-messages.d.ts.map +1 -1
- package/dist/types/src/blueprints/discord/functions/index.d.ts +3 -11
- package/dist/types/src/blueprints/discord/functions/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/discord/index.d.ts +1 -0
- package/dist/types/src/blueprints/discord/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/github/functions/definitions.d.ts +8 -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 +5 -2
- package/dist/types/src/blueprints/github/functions/fetch-prs.d.ts.map +1 -1
- package/dist/types/src/blueprints/github/functions/index.d.ts +3 -6
- package/dist/types/src/blueprints/github/functions/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/github/index.d.ts +1 -0
- package/dist/types/src/blueprints/github/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/index.d.ts +4 -3
- package/dist/types/src/blueprints/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/linear/blueprint.d.ts +2 -2
- package/dist/types/src/blueprints/linear/blueprint.d.ts.map +1 -1
- package/dist/types/src/blueprints/linear/functions/definitions.d.ts +7 -0
- package/dist/types/src/blueprints/linear/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/linear/functions/index.d.ts +3 -8
- package/dist/types/src/blueprints/linear/functions/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts +5 -6
- package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts.map +1 -1
- package/dist/types/src/blueprints/linear/index.d.ts +1 -0
- 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.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 +2 -2
- package/dist/types/src/blueprints/planning/blueprint.d.ts.map +1 -1
- package/dist/types/src/blueprints/planning/functions/definitions.d.ts +11 -0
- package/dist/types/src/blueprints/planning/functions/definitions.d.ts.map +1 -0
- package/dist/types/src/blueprints/planning/functions/index.d.ts +3 -9
- package/dist/types/src/blueprints/planning/functions/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts +5 -3
- package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts.map +1 -1
- package/dist/types/src/blueprints/planning/index.d.ts +1 -0
- package/dist/types/src/blueprints/planning/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/blueprint.d.ts +2 -2
- package/dist/types/src/blueprints/project/blueprint.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/add-artifact.d.ts +4 -3
- package/dist/types/src/blueprints/project/functions/add-artifact.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/agent.d.ts +2 -60
- package/dist/types/src/blueprints/project/functions/agent.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/definitions.d.ts +158 -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 +6 -4
- package/dist/types/src/blueprints/project/functions/get-context.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/index.d.ts +3 -132
- package/dist/types/src/blueprints/project/functions/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/qualifier.d.ts +30 -17
- package/dist/types/src/blueprints/project/functions/qualifier.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/index.d.ts +2 -2
- package/dist/types/src/blueprints/project/index.d.ts.map +1 -1
- 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 +52 -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 +97 -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 +48 -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 +5 -15
- package/dist/types/src/blueprints/testing.d.ts.map +1 -1
- package/dist/types/src/blueprints/websearch/blueprint.d.ts +2 -2
- package/dist/types/src/blueprints/websearch/blueprint.d.ts.map +1 -1
- 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 +2 -1
- package/dist/types/src/blueprints/websearch/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/websearch/toolkit.d.ts +2 -0
- package/dist/types/src/blueprints/websearch/toolkit.d.ts.map +1 -1
- package/dist/types/src/crud/graph.d.ts +2 -2
- 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 -84
- package/dist/types/src/functions/agent/index.d.ts.map +1 -1
- package/dist/types/src/functions/agent/prompt.d.ts +2 -82
- 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 -2
- package/dist/types/src/functions/index.d.ts.map +1 -1
- package/dist/types/src/sync/sync.d.ts.map +1 -1
- package/dist/types/src/testing/plugins.d.ts.map +1 -1
- package/dist/types/src/toolkits/WebToolkit.d.ts.map +1 -1
- package/dist/types/src/types/Agent.d.ts +77 -0
- package/dist/types/src/types/Agent.d.ts.map +1 -0
- package/dist/types/src/types/Chat.d.ts +32 -7
- package/dist/types/src/types/Chat.d.ts.map +1 -1
- package/dist/types/src/types/McpServer.d.ts +18 -0
- package/dist/types/src/types/McpServer.d.ts.map +1 -0
- package/dist/types/src/types/Memory.d.ts +12 -0
- package/dist/types/src/types/Memory.d.ts.map +1 -0
- package/dist/types/src/types/Plan.d.ts +23 -11
- package/dist/types/src/types/Plan.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +3 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/util/graphql.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -31
- package/src/blueprints/automation/blueprint.ts +107 -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 +199 -0
- package/src/blueprints/blueprint-manager/blueprint.ts +49 -0
- package/src/blueprints/blueprint-manager/functions/definitions.ts +58 -0
- package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +44 -0
- package/src/blueprints/blueprint-manager/functions/index.ts +13 -0
- package/src/blueprints/blueprint-manager/functions/query-blueprints.ts +19 -0
- package/src/blueprints/blueprint-manager/functions/update-blueprints.ts +19 -0
- package/src/blueprints/blueprint-manager/index.ts +6 -0
- package/src/blueprints/browser/blueprint.test.ts +22 -30
- package/src/blueprints/browser/blueprint.ts +4 -5
- package/src/blueprints/database/blueprint.conversations.json +1 -1
- package/src/blueprints/database/blueprint.test.ts +309 -98
- package/src/blueprints/database/blueprint.ts +36 -9
- package/src/blueprints/database/functions/context-add.ts +15 -26
- package/src/blueprints/database/functions/context-remove.ts +16 -27
- package/src/blueprints/database/functions/definitions.ts +318 -0
- package/src/blueprints/database/functions/index.ts +18 -28
- package/src/blueprints/database/functions/load.ts +11 -23
- package/src/blueprints/database/functions/object-create.ts +28 -25
- package/src/blueprints/database/functions/object-delete.ts +13 -20
- package/src/blueprints/database/functions/object-update.ts +23 -25
- package/src/blueprints/database/functions/query.ts +48 -110
- package/src/blueprints/database/functions/relation-create.ts +25 -38
- package/src/blueprints/database/functions/relation-delete.ts +14 -21
- package/src/blueprints/database/functions/schema-add.ts +19 -31
- package/src/blueprints/database/functions/schema-list.ts +27 -27
- package/src/blueprints/database/functions/tag-add.ts +14 -24
- package/src/blueprints/database/functions/tag-remove.ts +14 -23
- package/src/blueprints/database/index.ts +16 -1
- package/src/blueprints/discord/blueprint.ts +5 -10
- package/src/blueprints/discord/functions/definitions.ts +71 -0
- package/src/blueprints/discord/functions/fetch-messages.test.ts +15 -25
- package/src/blueprints/discord/functions/fetch-messages.ts +98 -151
- package/src/blueprints/discord/functions/index.ts +4 -4
- package/src/blueprints/discord/index.ts +1 -0
- package/src/blueprints/github/functions/definitions.ts +27 -0
- package/src/blueprints/github/functions/fetch-prs.ts +15 -22
- package/src/blueprints/github/functions/index.ts +4 -4
- package/src/blueprints/github/index.ts +2 -0
- package/src/blueprints/index.ts +4 -3
- package/src/blueprints/linear/blueprint.ts +5 -10
- package/src/blueprints/linear/functions/definitions.ts +24 -0
- package/src/blueprints/linear/functions/index.ts +4 -4
- package/src/blueprints/linear/functions/linear.test.ts +8 -7
- package/src/blueprints/linear/functions/sync-issues.ts +31 -39
- package/src/blueprints/linear/index.ts +1 -0
- 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 +68 -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 +5 -9
- package/src/blueprints/planning/functions/definitions.ts +137 -0
- package/src/blueprints/planning/functions/index.ts +4 -4
- package/src/blueprints/planning/functions/update-tasks.ts +35 -158
- package/src/blueprints/planning/index.ts +1 -0
- package/src/blueprints/project/blueprint.conversations.json +1 -0
- package/src/blueprints/project/blueprint.test.ts +245 -109
- package/src/blueprints/project/blueprint.ts +20 -24
- package/src/blueprints/project/functions/add-artifact.ts +19 -30
- package/src/blueprints/project/functions/agent.ts +43 -46
- package/src/blueprints/project/functions/definitions.ts +92 -0
- package/src/blueprints/project/functions/get-context.ts +36 -53
- package/src/blueprints/project/functions/index.ts +9 -10
- package/src/blueprints/project/functions/qualifier.ts +66 -72
- package/src/blueprints/project/index.ts +2 -2
- package/src/blueprints/project-wizard/blueprint.ts +52 -0
- package/src/blueprints/project-wizard/functions/create-project.ts +33 -0
- package/src/blueprints/project-wizard/functions/definitions.ts +64 -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 +159 -0
- package/src/blueprints/project-wizard/index.ts +6 -0
- package/src/blueprints/testing.ts +7 -23
- package/src/blueprints/websearch/blueprint.conversations.json +1 -0
- package/src/blueprints/websearch/blueprint.test.ts +39 -0
- package/src/blueprints/websearch/blueprint.ts +6 -8
- package/src/blueprints/websearch/functions/definitions.ts +25 -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 +2 -1
- package/src/blueprints/websearch/toolkit.ts +6 -1
- package/src/crud/graph.test.ts +10 -12
- package/src/crud/graph.ts +3 -3
- package/src/errors.ts +25 -0
- package/src/functions/agent/definitions.ts +53 -0
- package/src/functions/agent/index.ts +4 -4
- package/src/functions/agent/prompt.conversations.json +1 -0
- package/src/functions/agent/prompt.test.ts +83 -0
- package/src/functions/agent/prompt.ts +211 -96
- package/src/functions/index.ts +0 -2
- package/src/sync/sync.ts +23 -12
- package/src/testing/plugins.tsx +10 -3
- package/src/toolkits/WebToolkit.ts +1 -1
- package/src/types/Agent.ts +239 -0
- package/src/types/Chat.ts +24 -10
- package/src/types/McpServer.ts +37 -0
- package/src/types/Memory.ts +24 -0
- package/src/types/Plan.ts +7 -4
- package/src/types/index.ts +3 -1
- package/dist/types/src/blueprints/design/blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/design/blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/design/blueprint.test.d.ts.map +0 -1
- package/dist/types/src/blueprints/design/index.d.ts +0 -2
- package/dist/types/src/blueprints/design/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/markdown/blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/markdown/blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/markdown/functions/create.d.ts +0 -6
- package/dist/types/src/blueprints/markdown/functions/create.d.ts.map +0 -1
- package/dist/types/src/blueprints/markdown/functions/index.d.ts +0 -30
- package/dist/types/src/blueprints/markdown/functions/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/markdown/functions/read.d.ts +0 -14
- package/dist/types/src/blueprints/markdown/functions/read.d.ts.map +0 -1
- package/dist/types/src/blueprints/markdown/functions/update.d.ts +0 -13
- package/dist/types/src/blueprints/markdown/functions/update.d.ts.map +0 -1
- package/dist/types/src/blueprints/markdown/index.d.ts +0 -3
- package/dist/types/src/blueprints/markdown/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/planning-old/blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/blueprint.test.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/functions/index.d.ts +0 -29
- package/dist/types/src/blueprints/planning-old/functions/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/functions/read.d.ts +0 -14
- package/dist/types/src/blueprints/planning-old/functions/read.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/functions/task-list.d.ts +0 -74
- package/dist/types/src/blueprints/planning-old/functions/task-list.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/functions/task-list.test.d.ts +0 -2
- package/dist/types/src/blueprints/planning-old/functions/task-list.test.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/functions/update.d.ts +0 -16
- package/dist/types/src/blueprints/planning-old/functions/update.d.ts.map +0 -1
- package/dist/types/src/blueprints/planning-old/index.d.ts +0 -2
- package/dist/types/src/blueprints/planning-old/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/research/blueprint.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/blueprint.test.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/functions/document-create.d.ts +0 -10
- package/dist/types/src/blueprints/research/functions/document-create.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/functions/index.d.ts +0 -19
- package/dist/types/src/blueprints/research/functions/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/functions/research.d.ts +0 -14
- package/dist/types/src/blueprints/research/functions/research.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/functions/research.test.d.ts +0 -2
- package/dist/types/src/blueprints/research/functions/research.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/types/ResearchGraph.d.ts +0 -18
- package/dist/types/src/blueprints/research/types/ResearchGraph.d.ts.map +0 -1
- package/dist/types/src/blueprints/research/types/index.d.ts +0 -7
- package/dist/types/src/blueprints/research/types/index.d.ts.map +0 -1
- package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +0 -179
- 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 -179
- package/dist/types/src/functions/entity-extraction/index.d.ts.map +0 -1
- package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts +0 -38
- package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts.map +0 -1
- package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts +0 -37
- package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts.map +0 -1
- package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts +0 -58
- package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts.map +0 -1
- package/dist/types/src/functions/exa/data/index.d.ts +0 -3
- package/dist/types/src/functions/exa/data/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 -9
- 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/types/Project.d.ts +0 -67
- package/dist/types/src/types/Project.d.ts.map +0 -1
- package/src/blueprints/browser/blueprint.conversations.json +0 -1
- package/src/blueprints/design/blueprint.test.ts +0 -96
- package/src/blueprints/design/blueprint.ts +0 -46
- package/src/blueprints/design/index.ts +0 -5
- package/src/blueprints/markdown/blueprint.ts +0 -38
- package/src/blueprints/markdown/functions/create.ts +0 -29
- package/src/blueprints/markdown/functions/index.ts +0 -13
- package/src/blueprints/markdown/functions/read.ts +0 -32
- package/src/blueprints/markdown/functions/update.ts +0 -32
- package/src/blueprints/markdown/index.ts +0 -6
- package/src/blueprints/planning-old/blueprint.test.ts +0 -122
- package/src/blueprints/planning-old/blueprint.ts +0 -110
- package/src/blueprints/planning-old/functions/index.ts +0 -11
- package/src/blueprints/planning-old/functions/read.ts +0 -34
- package/src/blueprints/planning-old/functions/task-list.test.ts +0 -99
- package/src/blueprints/planning-old/functions/task-list.ts +0 -165
- package/src/blueprints/planning-old/functions/update.ts +0 -52
- package/src/blueprints/planning-old/index.ts +0 -5
- package/src/blueprints/research/blueprint.test.ts +0 -7
- package/src/blueprints/research/blueprint.ts +0 -65
- package/src/blueprints/research/functions/document-create.ts +0 -73
- package/src/blueprints/research/functions/index.ts +0 -11
- package/src/blueprints/research/functions/research-instructions.tpl +0 -106
- package/src/blueprints/research/functions/research.conversations.json +0 -1
- package/src/blueprints/research/functions/research.test.ts +0 -149
- package/src/blueprints/research/functions/research.ts +0 -175
- package/src/blueprints/research/index.ts +0 -6
- package/src/blueprints/research/types/ResearchGraph.ts +0 -49
- package/src/blueprints/research/types/index.ts +0 -32
- package/src/functions/entity-extraction/entity-extraction.conversations.json +0 -1
- package/src/functions/entity-extraction/entity-extraction.test.ts +0 -74
- package/src/functions/entity-extraction/entity-extraction.ts +0 -181
- package/src/functions/entity-extraction/index.ts +0 -9
- package/src/functions/exa/data/exa-search-1748337321991.ts +0 -131
- package/src/functions/exa/data/exa-search-1748337331526.ts +0 -144
- package/src/functions/exa/data/exa-search-1748337344119.ts +0 -133
- package/src/functions/exa/data/index.ts +0 -11
- package/src/functions/exa/exa.ts +0 -37
- package/src/functions/exa/index.ts +0 -11
- package/src/functions/exa/mock.ts +0 -71
- package/src/types/Project.ts +0 -196
- /package/dist/types/src/blueprints/{design → blueprint-manager}/blueprint.test.d.ts +0 -0
- /package/dist/types/src/blueprints/{planning-old → memory}/blueprint.test.d.ts +0 -0
- /package/dist/types/src/blueprints/{research → websearch}/blueprint.test.d.ts +0 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { Operation } from '@dxos/compute';
|
|
8
|
+
import { trim } from '@dxos/util';
|
|
9
|
+
|
|
10
|
+
import { AgentRules } from './definitions';
|
|
11
|
+
|
|
12
|
+
export default AgentRules.pipe(
|
|
13
|
+
Operation.withHandler(
|
|
14
|
+
Effect.fnUntraced(function* () {
|
|
15
|
+
return trim`
|
|
16
|
+
You can ask the user for qualifying questions about the agents.
|
|
17
|
+
If agents should actively read incoming emails, query for mailboxes and add a subscription to them.
|
|
18
|
+
If the user wants the agent to run on a schedule (e.g. "every morning", "every 5 minutes"), set the agent's \`cron\` field to a standard cron expression (e.g. \`0 9 * * *\` for daily at 09:00, \`*/5 * * * *\` for every 5 minutes). Timer triggers bypass the qualifier and invoke the agent worker directly on the schedule.
|
|
19
|
+
Use [query-blueprints] from the Blueprint Manager to query for available blueprints and their keys.
|
|
20
|
+
Use [create-agent] function to create a new agent.
|
|
21
|
+
|
|
22
|
+
Notable blueprints (query to get their keys):
|
|
23
|
+
|
|
24
|
+
- Blueprint Manger - allows agent to self-enable blueprints (always include this one).
|
|
25
|
+
- Database -- CRUD on objects in the ECHO database.
|
|
26
|
+
- Markdown -- Create and edit markdown documents.
|
|
27
|
+
- Websearch -- Search the web for information.
|
|
28
|
+
- Browser -- Virtual browser via playwright when simple WebSearch is not enough.
|
|
29
|
+
- Memory -- Memory to store and retrieve information.
|
|
30
|
+
|
|
31
|
+
Experimental blueprints that are discouraged:
|
|
32
|
+
|
|
33
|
+
- Research
|
|
34
|
+
- Design
|
|
35
|
+
- Agent (not wizard) -- those are agent internals, they are auto-added to every new agent.
|
|
36
|
+
|
|
37
|
+
<example_agent>
|
|
38
|
+
## CRM from your inbox
|
|
39
|
+
|
|
40
|
+
Blueprints: database, websearch, browser
|
|
41
|
+
|
|
42
|
+
Subscribe to your inboxes.
|
|
43
|
+
Spec says that on every email we should extract People and Organizations and save them to the database, but first query the database for existing people and organizations to avoid duplicates.
|
|
44
|
+
Also run a quick research on the web to find more information about the person or organization and save it to the database.
|
|
45
|
+
</example_agent>
|
|
46
|
+
|
|
47
|
+
<example_agent>
|
|
48
|
+
## Parcel tracking
|
|
49
|
+
|
|
50
|
+
Blueprints: database
|
|
51
|
+
|
|
52
|
+
Based on emails from vendors (amazon, fedex, etc.) track the status of the parcels ordered online and keep a table of orders.
|
|
53
|
+
|
|
54
|
+
Before creating an agent, use the Database blueprint to create an Order schema:
|
|
55
|
+
- seller
|
|
56
|
+
- name
|
|
57
|
+
- price
|
|
58
|
+
- status (enum of: pending, shipped, waiting for pickup, delivered, cancelled, returned)
|
|
59
|
+
- tracking numbers/notes
|
|
60
|
+
- date of delivery
|
|
61
|
+
- shipping address
|
|
62
|
+
</example_agent>
|
|
63
|
+
|
|
64
|
+
<example_agent>
|
|
65
|
+
## Comms assistant
|
|
66
|
+
|
|
67
|
+
Blueprints: database, markdown, inbox
|
|
68
|
+
|
|
69
|
+
Helps user maintain comms with external parites via email.
|
|
70
|
+
Ask user specifically who they want to communicate with and on what topic.
|
|
71
|
+
Agent should keep a markdown document in artifacts outlining the current state of the comms.
|
|
72
|
+
Agent should propose drafts to follow up on the comms. Only propose sensible drafts, do not propose drafts that are not relevant or actionable.
|
|
73
|
+
</example_agent>
|
|
74
|
+
`;
|
|
75
|
+
}),
|
|
76
|
+
),
|
|
77
|
+
);
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Option from 'effect/Option';
|
|
7
|
+
|
|
8
|
+
import { Trigger } from '@dxos/compute';
|
|
9
|
+
import { Operation } from '@dxos/compute';
|
|
10
|
+
import { Database, Feed, Filter, Obj, Ref } from '@dxos/echo';
|
|
11
|
+
import { FeedAnnotation } from '@dxos/schema';
|
|
12
|
+
|
|
13
|
+
import { Agent } from '../../../types';
|
|
14
|
+
import { SyncTriggers } from './definitions';
|
|
15
|
+
|
|
16
|
+
export default SyncTriggers.pipe(
|
|
17
|
+
Operation.withHandler(
|
|
18
|
+
Effect.fn(function* ({ agent: agentRef }) {
|
|
19
|
+
const agent = yield* Database.load(agentRef);
|
|
20
|
+
yield* syncAgentTriggers(agent);
|
|
21
|
+
}),
|
|
22
|
+
),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Foreign key {@link AGENT_TRIGGER_EXTENSION_KEY} => <agent id : ObjectId>.
|
|
27
|
+
*/
|
|
28
|
+
const AGENT_TRIGGER_EXTENSION_KEY = 'org.dxos.extension.AgentTrigger';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Foreign key {@link AGENT_TRIGGER_TARGET_EXTENSION_KEY} => <dxn string of subscription target>.
|
|
32
|
+
*/
|
|
33
|
+
const AGENT_TRIGGER_TARGET_EXTENSION_KEY = 'org.dxos.extension.AgentTriggerTarget';
|
|
34
|
+
|
|
35
|
+
/** Checks if an object's schema has the FeedAnnotation. */
|
|
36
|
+
const hasFeedAnnotation = (obj: Obj.Unknown): boolean => {
|
|
37
|
+
const schema = Obj.getSchema(obj);
|
|
38
|
+
if (!schema) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const annotation = FeedAnnotation.get(schema);
|
|
42
|
+
return Option.isSome(annotation) && annotation.value === true;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Syncs triggers in the database with the agent subscriptions.
|
|
47
|
+
*/
|
|
48
|
+
const syncAgentTriggers = (agent: Agent.Agent): Effect.Effect<void, never, Database.Service> =>
|
|
49
|
+
Effect.gen(function* () {
|
|
50
|
+
const triggers = yield* Database.runQuery(
|
|
51
|
+
Filter.foreignKeys(Trigger.Trigger, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
// Remove all existing triggers — they will be recreated with the current config.
|
|
55
|
+
// This ensures operation, concurrency, and enabled stay in sync when agent fields change.
|
|
56
|
+
for (const trigger of triggers) {
|
|
57
|
+
yield* Database.remove(trigger);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const triggersEnabled = agent.enabled ?? true;
|
|
61
|
+
|
|
62
|
+
// Lazy import to avoid circular dependency issues.
|
|
63
|
+
const { Qualifier, AgentWorker } = yield* Effect.promise(() => import('../../project'));
|
|
64
|
+
|
|
65
|
+
for (const subscription of agent.subscriptions) {
|
|
66
|
+
const targetOption = yield* Database.loadOption(subscription);
|
|
67
|
+
if (Option.isNone(targetOption)) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const target = targetOption.value;
|
|
71
|
+
|
|
72
|
+
let feedObj: Feed.Feed | undefined;
|
|
73
|
+
if (Obj.instanceOf(Feed.Feed, target)) {
|
|
74
|
+
feedObj = target;
|
|
75
|
+
} else if (hasFeedAnnotation(target)) {
|
|
76
|
+
const feedRef = (target as Obj.Unknown & { feed?: Ref.Ref<Feed.Feed> }).feed;
|
|
77
|
+
feedObj = feedRef ? Option.getOrUndefined(yield* Database.loadOption(feedRef)) : undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const queueDxn = Option.fromNullable(feedObj).pipe(
|
|
81
|
+
Option.filter(Obj.instanceOf(Feed.Feed)),
|
|
82
|
+
Option.map(Feed.getQueueDxn),
|
|
83
|
+
Option.getOrUndefined,
|
|
84
|
+
);
|
|
85
|
+
if (!queueDxn) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const filterEvents = agent.filterEvents ?? true;
|
|
90
|
+
|
|
91
|
+
yield* Database.add(
|
|
92
|
+
Trigger.make({
|
|
93
|
+
[Obj.Parent]: agent,
|
|
94
|
+
[Obj.Meta]: {
|
|
95
|
+
keys: [
|
|
96
|
+
{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
|
|
97
|
+
{ source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: subscription.dxn.toString() },
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
enabled: triggersEnabled,
|
|
101
|
+
spec: Trigger.specQueue(queueDxn.toString()),
|
|
102
|
+
function: Ref.make(Operation.serialize(filterEvents ? Qualifier : AgentWorker)),
|
|
103
|
+
input: {
|
|
104
|
+
agent: Ref.make(agent),
|
|
105
|
+
event: '{{event}}',
|
|
106
|
+
},
|
|
107
|
+
concurrency: filterEvents ? 5 : undefined,
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if ((agent.filterEvents ?? true) && agent.queue) {
|
|
113
|
+
yield* Database.add(
|
|
114
|
+
Trigger.make({
|
|
115
|
+
[Obj.Parent]: agent,
|
|
116
|
+
[Obj.Meta]: {
|
|
117
|
+
keys: [
|
|
118
|
+
{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
|
|
119
|
+
{
|
|
120
|
+
source: AGENT_TRIGGER_TARGET_EXTENSION_KEY,
|
|
121
|
+
id: Obj.getDXN(agent)?.toString() ?? '',
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
function: Ref.make(Operation.serialize(AgentWorker)),
|
|
126
|
+
enabled: triggersEnabled,
|
|
127
|
+
spec: Trigger.specQueue(agent.queue.dxn.toString()),
|
|
128
|
+
input: {
|
|
129
|
+
agent: Ref.make(agent),
|
|
130
|
+
event: '{{event}}',
|
|
131
|
+
},
|
|
132
|
+
}),
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Timer trigger bypasses the qualifier and invokes the agent worker directly on a schedule.
|
|
137
|
+
if (agent.cron) {
|
|
138
|
+
yield* Database.add(
|
|
139
|
+
Trigger.make({
|
|
140
|
+
[Obj.Parent]: agent,
|
|
141
|
+
[Obj.Meta]: {
|
|
142
|
+
keys: [
|
|
143
|
+
{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },
|
|
144
|
+
{ source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: `timer:${agent.cron}` },
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
enabled: triggersEnabled,
|
|
148
|
+
spec: Trigger.specTimer(agent.cron),
|
|
149
|
+
function: Ref.make(Operation.serialize(AgentWorker)),
|
|
150
|
+
input: {
|
|
151
|
+
agent: Ref.make(agent),
|
|
152
|
+
event: '{{event}}',
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
yield* Database.flush();
|
|
159
|
+
});
|
|
@@ -7,41 +7,25 @@ import * as Effect from 'effect/Effect';
|
|
|
7
7
|
import { pipe } from 'effect/Function';
|
|
8
8
|
|
|
9
9
|
import { ConsolePrinter } from '@dxos/ai';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
type AiConversation,
|
|
13
|
-
type AiConversationRunProps,
|
|
14
|
-
GenerationObserver,
|
|
15
|
-
} from '@dxos/assistant';
|
|
16
|
-
import type { Blueprint } from '@dxos/blueprints';
|
|
10
|
+
import { AiContextService, type AiSession, type AiSessionRunProps, GenerationObserver } from '@dxos/assistant';
|
|
11
|
+
import type { Definition } from '@dxos/compute';
|
|
17
12
|
import { Database, Ref } from '@dxos/echo';
|
|
18
|
-
import { type FunctionDefinition } from '@dxos/functions';
|
|
19
13
|
import { log } from '@dxos/log';
|
|
20
14
|
|
|
21
|
-
export type TestStep = Pick<
|
|
15
|
+
export type TestStep = Pick<AiSessionRunProps, 'prompt' | 'system'> & {
|
|
22
16
|
test?: () => Promise<void>;
|
|
23
17
|
};
|
|
24
18
|
|
|
25
|
-
/**
|
|
26
|
-
* Blueprint definition type for testing.
|
|
27
|
-
* Mirrors AppCapabilities.BlueprintDefinition to avoid circular dependency with app-toolkit.
|
|
28
|
-
*/
|
|
29
|
-
export interface BlueprintDefinition {
|
|
30
|
-
key: string;
|
|
31
|
-
functions: FunctionDefinition.Any[];
|
|
32
|
-
make: () => Blueprint.Blueprint;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
19
|
/**
|
|
36
20
|
* Runs the prompt steps, calling the test function after each step.
|
|
37
21
|
*/
|
|
38
|
-
export const runSteps = Effect.fn(function* (
|
|
22
|
+
export const runSteps = Effect.fn(function* (session: AiSession, steps: TestStep[]) {
|
|
39
23
|
for (const { test, ...props } of steps) {
|
|
40
|
-
yield*
|
|
24
|
+
yield* session.createRequest({
|
|
41
25
|
...props,
|
|
42
26
|
observer: GenerationObserver.fromPrinter(new ConsolePrinter({ mode: 'json' })),
|
|
43
27
|
});
|
|
44
|
-
const messages = yield* Effect.promise(() =>
|
|
28
|
+
const messages = yield* Effect.promise(() => session.getHistory());
|
|
45
29
|
log.info('conversation', { messages });
|
|
46
30
|
if (test) {
|
|
47
31
|
yield* Effect.promise(() => test());
|
|
@@ -53,7 +37,7 @@ export const runSteps = Effect.fn(function* (conversation: AiConversation, steps
|
|
|
53
37
|
* Binds blueprints from the blueprint definitions.
|
|
54
38
|
*/
|
|
55
39
|
// TODO(dmaretskyi): Potentially the agent will auto-bind the blueprints.
|
|
56
|
-
export const addBlueprints = Effect.fnUntraced(function* (blueprints:
|
|
40
|
+
export const addBlueprints = Effect.fnUntraced(function* (blueprints: Definition[]) {
|
|
57
41
|
yield* AiContextService.bindContext({
|
|
58
42
|
blueprints: yield* pipe(
|
|
59
43
|
blueprints,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"conversations":[{"parameters":{"model":"@anthropic/claude-opus-4-6","stream":true,"tools":[{"name":"fetch-web-page","description":"Fetches the content of a web page and returns the HTML. \nUse this to get the content of a web page.","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The URL of the web page to fetch."}},"additionalProperties":false}},{"name":"AnthropicWebSearch","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"## Blueprints Definitions\n\n<blueprint>\n \n</blueprint>","options":{}},{"role":"user","content":"What is the capital of France? Make sure to use the web search tool.","options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01Ufv8pJb6Ry13g4beHHysCX","modelId":"claude-opus-4-6","timestamp":"2026-05-03T07:29:41.725Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" user asks about the capital of France and explicitly requests that I use the web search tool.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"EpwCClkIDRgCKkCBvqhrPFMZB5TfUfcYt+kCmxoxEqUqP0UaKJNoyxPFKS3GJDd6oIltLwVk6WAYhGg+D0SFW/tTfnAGumqpRid3Mg9jbGF1ZGUtb3B1cy00LTY4ABIM7kkTv8a+fLu1H851GgyTNyFVjW6kby7Iw6ciMBbCrJ92V0tMo+8J+EJmYzKOTayz/3BTcuumOirvlqc1Y4puzThpfSRgHgGEBgggUSpxsVT3GERrlGtE2piT8zLuDIJA7Zx3P0rYhSxh2rAyPsNxwhAMP+8HDsg00PmBeJoq5cjNFO/NUUoKYF5Lj8+gmU7Ng4lFzx9beUBAeGj6GrVwX2atvx5DDNhVufTPUv3BNc/UthgmSqSdIg20OhmBXbEYAQ=="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","name":"AnthropicWebSearch","providerName":"web_search","providerExecuted":true,"metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"{\"query\": \"c","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"apital ","metadata":{}},{"type":"tool-params-delta","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","delta":"of France\"}","metadata":{}},{"type":"tool-params-end","id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","metadata":{}},{"id":"srvtoolu_01DZ9aYNrup4vd8qKpXh1Nqt","type":"tool-result","providerName":"web_search","isFailure":false,"name":"AnthropicWebSearch","result":[{"encrypted_content":"EpggCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDPkGI33ncD4vtj9xzRoMHGG88zQqEi/XX+pPIjDJNV+fpEHTXzPaKJy/+pKKKhLnDd6Uy/0eD3/TmUAL+7TjW7XUu0+tNKyjk5LadFsqmx/BIT3dQrH383OYue2yzK4sFBTdKRINu3Y2Ena4tcoNwYHfMM3DPpKUazdyhQppESRIOHxaoud0jR/gtjgwKd9GCt9IjBqvDmVFKT6wzbvDuAK2mNFcED6gxCz08XjCMcpyAlokW8ehA1VT2woYIiszqWGpaAeAoyyHPQwIUQg8XYOrftyaa+hwzHpu0RdvdLUsmmgsore/5OBxXIR9q61Zwot5P386bWzoJGhAHC9KhVa08uUoYiJPk8RZFrBmePYEB8E2qCqjPgyFtURAW8CWDVVYBrWi8DLYRtGBSNiNgKOSMiMdBqEJJ3+BMPpDd3+DA3yc3vYS4DZYdoCSxmQiAeiPwI9dWdj66GMhw2HQGphFwg5uUEf/uO2EPbMoOUSjevf1H1+bQxrYN2W8EKnEZMlG2fCdMOeDZwhQ+x/ARxcKYvwycKpJ6DTHOeH/XPgStYiraRiWljTw3H3aW9mSoV7lhW3pTxQ8uVn20/aMstAPHwAW86BfEKbXFp5Hv768e8Fo0YT0DpgBEDhEP3j02gOotBVxU2Pd9Zg9w46RO1clZXylFvxgtZTTOAkBcDPTtZd+aJvlNXISC/u/UownwMGl7iBL/Z4LwAVhpyIDbYUx8GUpKb/1C8AjgBmr/8Pc76BwpQhZOwthwgNMbIhjj5I9XnhEUPztr6tNmPb2+mNBOnPJZs79it6zSlhQaECoLbOQALlF4S6yTM3PQmnYwMvO0csuOBLqLgwGThdMzEod4GRKrpyAyf9Pp3Txl3aVmsirx55sSVAgO7lSldGJ+wW5d0H97c8T00qDxveV4W13ONqmeQ5BLWNG6jgrRv82EUvCR9cUvwK3HSPY9DknjFb1ELwajrmEVaGoA4NFXniO0ABeGcyW9+D2tjNyseK26z9AXnFjgxz2fBT4C3uIaQwLWBEOof2wDPsfiNd2Q0sTFfkroG5ZKuT+Rd24pcNmrJjB8/tcCEorqMe7U8Y0U+pqtPp/XGUZOLVkWjA0gZBj2rMi7T5nNhKAzhAHtI7l1x8rb4QhZfGLUCIXzUH51UGMedP5j4Swps3F3T3OcGB9JnfmMkvZp23AIZwWFEhyUAReyzO09TDkL/fiAf45lkn27yEW9EE1zhJ/lOh5YtTcCE+qYlFdFeUqn3TWXFpzn57Lk5JlgPIxpeEzvAbsYcbh4QIvfqZGng+3xa6Do6eJ42IsAp+Nnjo/231EK24lERR5ovmgqX9N337MbFJdrCaR95DIQA/sikR5zs3NNm650SpIpepS1Zq0GtaOFEyRfSpeHCh9uKlnYVINd2Jjaa26eK3jvHerU9pVCRtpfgp5W1epTCN5jl/dse+nxuOTs/IEEzfqDfvmlABWFnRuXjWU6WIoX3hOd0YlMAhJuDO49YnAXZq/h6sqh8rjO20hCP8qVo7FrRGajQlUg+8Yk7b9FbDDj1sIV9TPHgfNX8Lc0K7sA10grC9t8tl4ApCAOC3C/o4n1aYJ5ZdLDdFjZUHZW3ycQKtqJUCxuJSJesO75affHMGG1lPtqpQnAsv7JRlRg8GIm/4/NluDgFwZcKLXKYe7WludKR5PV1Gvvy57KhmEfZEbl42nlYoMQxdI/ZufLXLTNlPAFXSKmJhRnEyPIQ/Zbv9I5KJwtLJh2jWqfH6l8iPw4gIMHyya6RM5qv5dnqpbANaHif28/JJRXI+QXzejHXeyz02CrentKfRws7YRRKUvg3/kQ4TNzH3eTd1x3lrCNfPoyx7jcljevseuQygQ10/ghYVhp/C90/ChO11QiX94igcYPZZZEmAa465o2E8DrXux4fLxpGEwAMa3RnDGrDjyco6C9XX3toBZOcYQF5KglCmqFMv1Ie7g8LIZcavdH3/MasshqOHMrdi5RbmAXHk2/9Vo2YMkUyE3IaQRXqv5E+ZBesx0RJa8i9Z9JOJ8Kpgml2z7ahwRQpi8n1xkb4C4tntsSd+YJaHhws3vxLjnkwT5UFiJVuhZLiWTYgDvIHmQT6q6Beu+k5Be/RWRGfzIwqyOk2GsOtiT1I32cuX5r0BSidQIei6tS9F0tMs958JLfKkNiwbg2/5IGpqAPPyA5JKjJZC1z/KvmP7Y68F895p4GyrmE4RJ9wcCAV69c1v4Hsbmdq93RsZaThIvPkR/VROs0ZlIFI4ufQ3UXmMnJn/yorT3FxX3xxffh+6GE8YvEdPV/bA9mtIY6XFVH5o3vz9/4LARI3Y8peqCBs/yXYkV7XtIb+pOSvN0RduR9HNE85UxLQsD30l5j3g80YZdw9dn/vXpTGR023Rj25pTWeqvy0n02ERfJznlmS2GgfF85VLGxvxLCME9L9N07gb9yYio9cWGpE9r1EhMDoIgs1uvbAlSMmDswcr4HSalI+IfIGnDzENXUzLBbcuSejdlF5n/v8dQ47v4b46ymBezNTFHrKllIGmueAMjxpZIP3JGEiTbEFYdCYFUBuSdgGAXYpwmveaa/Eki83E9F+Him1EfcqSqCnJ8Ix/gpWTsKa/EgR96mvu+dC74b6RiJWobwnl782g1lutkXo1XLqnae7adKNyWFOKDsTe5MtqD/RWNLYZ1D9eKBzXUBaExWj8bwkCPI6fwM63A0OI8QU+DrHSLB02joz09U4R0SlrzQSwuVbTtzrUVCdWcwpU8XxHelIYHxTwQdVGbgruEueRIBu8hEyZfLw+x0KqJFL8HdxvAAH/82NfPmBLRd4tZlhMSTjBG9N0tyfJuAKrJNCfGs+RTJDCfLmCGleUqD77x+VhCclto/k1GNZfk9jrM+BjCWds1rBrstZnEblnG4wZWxTrgunOvQ7qqWvgM0TYzzXucD6k8JM7Ldwj0hdZHn5iK7phA3XNtignNiOY0QIqMW9CowmjmdDj5MmmPD2THY6ze/tD7oa12Uc1s/OY4zfWT+wi6hQsZPiFvjp7pjbkI+rFUIAFQ1eQlJwbiMDYN918wO0ACsFx7h9IFsHFHAxNkpZsdO5VigDlrNGjbyzf5gXQOtdi+iKovHL9FE0eDT52lAB8yxAvy/tMJtRUiTrHJ9ORCW3BzHJRJaoHH0zdPdrs1Zo851BSrNXJnKN8NJMiGVFO/mOhh+7ixbZ/Wb/rGn8C4sFsl2EhMwaMrwIL0W8IghmArqKd8w/RPyAAg4ldrx+X71Z8rmmiw0gn3FhpnnUJiRS10+p8JzOUdK3Ft3uDg3NRfMDIJBLWhDlItrOrmwv6r+JZneMXKRH3UPZGNTSaLLjowcjuzwYG/D07tVyp7T69J2+g73LXmqlvI+cTLDMDvGuetwM0XAm/Rx/FvM5G6VvK+FW1TrPZgbNsTF6Oke+fMdtqsPXjT5YTA8JIpMucvg6bWHpU9k2Ealu3ShuotKvTTZq+/rFpiThK5yC1j8ccwYLgW8OE4Ko25YdaWTVFKuuZRD2oloUEAuYTXpC1trbyipUkV3BFCZyB2fEkEufxjqOWbQVNtSlQWZ64BN4CcNxPkNzGAQg9DrwlTT2XtUHFpymQcuKKyTcF7zEJM/R5yfto2RcOD5sXkNdK11WGjZELxKVWTx7rIKvwfElIO7sqGM0KJ/ClDJlwWpkTtep5tlv25UD2EwzYJu+9Zc8RSx4yMz3B2Akuum1QBVBL1jeW6Cttzf7mECjGJlULRDVyDJ3Qm6KFr5D/1dC/RFslVDGAMSELBgNXgC1q3izaDISCTdu2/PNZ+QeKzfH5aI+sImTgl3fceg+KzAPtH+N66cejvWkcxOTS4jygdfHufu2v6GYNshvcskgcr966ppRhPhy9mOPATO9oR3A5wbpmX3sbIMMB+HgXUPNKglARcMr3yHiViMDoHOhEZTycLuNV8swjzCm/U3t23ncxWzzhvC4Ftg+4mZmGx5guRW51S5iYBZXwIgo6iNsbZvaL4lNDoEFJZ3LSfpOVWvdEKdXiN87fSeeCLvNWFF2UikV9m8yEf1fjvqv5VJqaGPCAtdcSFhGnlobACNGXNZqRetTZjmlDfQM/F4xz3gh7LFtHApkBih73mU9sfsTgnwlK2Q1jbHiZQrL4EFthQtZt6p7dEfa7oQHGhqCSQIwpUHWFlq2qPYZ7hSpV2CgGfh+EM5tt/FGuz9kawXXByCkf090rjynaW1YmvmF3hrS7WLl1XDlEAUBYUFYY0AoKpArBxdf6lY9d2w3EjFXKcN2d7kr/G8VWy6G93xIkkJEXUHn+K63Vdfpd+ZhkEt7tgSOgNt3VPd6H1b8OG9lKQltwIn9s9vMJx2ah7kM5lPPfXW3J0n4zIYk7I4CLIn11Cx7UigdCcLI9q8VxE+LGIpSr+ty1AOMcwozMqPc83fkohMiP5FDBPuB835JWqnyg6k8DBrAFtD37rWHuoc3bghaqM/t8Gia17aRu66Kb4vdDzp8RXlspkudPwNjrsyfVrFOsd3NILLOVuHh/16hi5C3pfpi91LJ/0K4V3JLvwrAnZ4jw1Uyt3n1mjWUJaQAmXVJH2n4SyAt4F9CSk3A4KuJyObzWE71hH475bHNij6eUkJ6eMCiyX6C0hdWbdv36OGEbVc/CaSsH2hSakY/R60kOH+zKPT3wQWr1jx+Ql7IDADJbVqD+RoLh+1mhhk5rovWi6JlC0kW1xk2Yw+quUfWwhB4icQC5h7L+DHpNJWLIDgodjK3eapABsEBKUmRXJ49jSBJnc+hTHJp0TKDlX/BHX7f7ZcaCjGcU+ZVlmAIycL6bOLolLk5bV8na3RWIR8L4RfcWn9k9Jpthj6DhDAYBaRmb9ZvqlRFeAtq+GW5iUHeOl1itq/xWnO1B/ZVMQPu+k6HfXD/rvKRKmryoba+pvCNhup/Mt6oVNI/UybcNQ9rkZN4/sxnRILsx6P9X+Xbeq60xLEDDKJrlDEbjXimVTu8YO562pGENmTuE2x4Es7dkuECezclnPErYs/d+e2Q57+fgdft/QIhL8pu9GB1T8jzULTj4qWqFPSfhV9qcGeNZnyUlbxFDL6Nl5RDmBEWpORFBzQiYx6aRO9RRzClGKSVCCuCZBX51oD7q/VLuNJ0WUBlYEQ8s+lPoZTAXKQX8NHLYLIQt+sHQu0Q8rxs5eHmO8kyCg+hSIvNMG48TeRZhPLdcGXVfllDWvjbpO9QysBaZyDUvXf2pZTHb34hHEpRmKUgVJBq9FDILM0O0p1sNfGvtIvDAG/rjsyI2lRm/OThb+X3QmODbKCDqfNKAsSK3SWzErTVdLwZUyuU78cOs5vPC82WI1hkgCn5wnE9mB7QM4OsFDSEEQW1ELn9TEHdij1cN85HSILrNLUcf2HbyiDgVTF/G8eRij6wEG1L7uvN4Yx7Am75YWRzDYmgxV3RgD","page_age":"1 week ago","title":"Paris - Wikipedia","type":"web_search_result","url":"https://en.wikipedia.org/wiki/Paris"},{"encrypted_content":"Es8RCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDP2bBiK/InFw8+Go8RoMPU+oXDZCP3hXO8krIjDKP1luldjY4dPebCciFKP8jiL9Iqkkbh8pEDArLWL76H4xpyn1eelqicUYHChJwXsq0hDWF4LWgAbz7bgTGTFj5mmw+3XEneB/e8TB/+VGGFmM0Zd4RPsoG8o/ICFsyLaEycgA0ZyOneIuxpmcDnM7Ln9uu791j5bZdvq9JWcfxc2zwUhFDQoLrtZyw9PUZfnOH77PSAcV35dZOvU3mOrhZSwYjiJ9BrBm/lhxMGiM3HiKDkp85NLubutjGEWxBGBMgM+2CUwuNqnAWpD1Rb2EVzQ4RmVJ2GYG+maBF+/v9+TwA+n/TrpOyzjdcGXKI75D7MdzcUIGKNNfF40R506BZMrUKrVGqkoupO3q+vmnI1PoR+19gf+kXKHsqpq07PnhuIbrxsKqa3GN4tVQBJKpTonlRIC01LinlZUIsTqbb+Le+lP4ESSk/knG/2g8dUynSj+ohdYdGtJUPEHk3A0XSt2ewziYkg+LCWAzhqrn0JWXdOATrHYUoW7mwO0dc5YvdUhh7IYKt9m+bi25OgvdOqS2VK6+Ln1y+5l2DRlk9+mPIzqY3MQpNPJdHKRwBfHaUIZGOczyNOfSbCcPZopoAqX77Z0HXQmOYfMfpByp2lnJ9r1vKIezZMV6MrgutAYYif7JAMusB/BYWQjqaHBa6nqeSMyaXblLddo7ycvpqdphygUMFpa8kSBpW49X3lw5tdbTT4r6LQvRLZTL2+CGDbnAZNHNDMGCNIZ3Gt2sA15MeKnoctSgzU3xH1xpC5WOdegYW9o5R6YUA1W/BXh4OqHYoImkTgfiqpGKpjTnA4L1SOh9JbiAHdqZBSWyC/cJE6V4PFq4sdN1RkQQ1H7Yj3EZVfoizTYoHLwkgbDWoHlvARCh5j0Y0JavbdE/ud3xPGsEoPS+pHhbjg9ba8s16k2XXxeoQjS9BG1niJAeDCEMozN8fb0UqgGPKtFXaerduL6+YqNcQO/35VskFhPBi7Zl5h94U5qPXL8WO2GGAXFsRdMQ1/jVp/ggumtBbSNiELBmfXYml8NOb3XIytpBtwzMmuq5wtLS9N/xn52mNAXFZakXVA1T65VkVSAUhomTYtSrYwoBiUZsDasW4I75fOrYstmIWd0rnF3LrMQkMikrfLZ3fD5yJo+beZ8YKWAE/9MItdmYoTeWi17Oemdl9so8cEI6M1WDjQT7QN9wxel3f42EKlQ6f5BwoCy8zTM66/UXiqKyswHFNMeKuKPVYNU9kKR367M71em3B2KQpWNvlTdLRLnsxFz/CHXqzonSWBRFzrCC+J/SgISxbiclUalN99Tg3JaVM3ICds8AEDmWX3LaiuOHv6xKwM8e1plgbQ431HEdx8EJVdxHuysiNdWu+Av4z4ogGhhybGYuUz1I5nR0ycQ/X69OpZ6tX1OcifGujH6GN8x2xuZr3KNyrroHxMGn/1rdlyusrGwCHh6D7zFk3/wSpxGr/160SR3XdSTR27aJ72BsRq4E1hDQeP1l24gQlgD95dS9pGi1PdUV5w5UnWBiyDJM2KZhV7gipDy/4u4wSkJ6oOkD69e6B5DH8TEGszpDzFjnY7JqkwJIXPJNTO0Fs8xSSiuPg4E/bAuOwXr3m2xpzGJpOHhgvozdmgQR0eEX6MPGu5AWGFHurZJl3CtP7s2Z8N2Dt+Ash9a/tqaJZjRRxi7It1ZQQp56/vZNvaMepKs/RMIEV9rhJOXNwA9mfAYpckAeKIIhcfcJ+FSeW3VtMJPr/AHY2do1bLfBSsu0IYzQXN6l9WnOxDAv2zsn1CHyK3BDrxWoFOrr9KzvNl50Mv9uFamZEV9Bh7XmC5mePvBAA6cxPZsDjCMEAfybsflmw5xpOxK3f+Owea9V6vnmn+ttSJ78L1SDxzuT11rwElF3CfGj7MglsPnMJfAwphMtmrSN+MsydpoFf5hIWGTzE7KWP/iBGI6qojsr2SeiuxJ+TampCOt8s8XW+w8unubSKxdfaUmp2UlTim+Aalk3/XiawKjxXmUxy/QWQ42DGnJdF/3bxiqAp4g/v18FVbViJ+Xs5gbq8tR2VDtYliVC9R34zyZbk7maa0b4Uycsd9XaCNdwn7UtCtV+oINMimiWBja3MOkUyMDUQ0Z7WkmZfzXhampq+r2oW357C4UZ/Ss/7fYMasDk+opbmgAwac5ls9D9jKSwS1MK4XvM959Q1tAAawJIE7FSTXv28/RS5+t2Hmi9IViqvvb02gKVDOUjC0OvFX6I+kZSuS+x8OPByFjtyW9WLASRF+DZMfFnDCAcM4pffRNDdI160uvhrV/ElKcRTZim/d4eDn2CJVEKtPOojS2SnvS3glFBmbvBYOPxIQFV5ISM7ZteyHSLGgt/Sg7BgfO/vtLormINl68aBnBLIUVtdl1EdOe8qR9kYg+YbaQANOj5fkw17ASaPQD6Shr57ebv840FW7xrg8loU1Oc2DJBGFiHvQcAqx1Z+yAti/NMfUPhaZP3yihkx37qFck3JT09iqvvbhGbz9qVx22rOFgWgORfZf5qUCk6pnMXXyeuyNO5/Bo/XuxGCiyK8ivUKVKZncB0xPgXUbHJuHOMom1se11DYlqT6Tn73P6DPzSDTqt6hC9HMZgY/Fb9XXwtcRWs5eMlvueegB4GF/fUwXQ99Wk189yZP1Bh3+vIATv3j0FeTqKB5r+AyQxLPyJQ5MQ/IX7HGuQ/VRkFjBC7b1jNzLWuOJIc0JlySHzEAMsEV4/09il1tQ0jcMnT/tRSxqTw6du+Flj9KthTfZMVkqwirhcAi1IQE9+pJWgic68COflmYG76JfMVy0kYcpOUAEPmrXL+meqtAI560MX9o0LHQ5kGvzutB6zlh9JV46kBESNgMA0oLyeDDDDFrJ/vkZUEC86CTYst4DrVX3vn3M+8iK9yCTIYAw==","page_age":"March 10, 2026","title":"List of capitals of France - Wikipedia","type":"web_search_result","url":"https://en.wikipedia.org/wiki/List_of_capitals_of_France"},{"encrypted_content":"EoAICioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDAum2h1ewx1dNU64ShoMcbvhMhUZAiJfoNAlIjDYwjFq1KNEShN65jhPG43By43OXUiqeLEB61K1VfR39asZ8fpl1JmbNBZK56pLpzUqgwf+UgPDhc7yqgkew7fiW8/j0H8xrc5my4gXfbSqaFN4qtonMZ/8Bcau9xwB9KV8CaY/MuIUJ6qbMeRGjjsEIxrx+O7exa5Gz9S1nMPc73VWCS/sElVFf5XLevMuUz21Gm6GfgxgJgZgAh5/tlIgYtcoBkIvEqdxDadjJ/ZmiLgTy3L0BXE4jl0jJ+Sk9B5f7JoG9Ihz8BidsUwIL+fQ/ytQsbfnEm0BkRyuoJ7p1o0y59Z0LMQvYGG/H/uX/AsSQDFd5dmS6sS9yqoi9i1+UmBUM/JfQWAB/D7IvLb/FxEcfPytP8BXDeQfmZCDYK1CRP5NyCeeYpjE/qAoFnE1qTCH52PCoHhSVjhAnGQzymQx897S2Ap84HlCJB9z5Y+bmO1FmwKS4uZrBvf/PX9pHaehBu3wMf2QK6HwJ+ASSmATQ/I3coCFkcOnby+LkZ0/ipUojvwIyVMzhgYW2MgXZjfcsLCudzSgxtWeJpXXIfUkGZBsby6fIoyTecVUZToe4rdjghgIrHsucj7jy20q6aDvOtD25RV4TV6P75iLUxUVwdi28Ebz/7Zlkn8RB2dbiTFdzPsaXTPD2caQ9bEZUyXj4HoNaDYLx42nG3m4XQfvdx5XguGEuc/xgrels8sVuwDBJrvt9OG4dpn7hPhH8skAu6InieYK/MCxxAMx/DFql1v+Mu14tfMjLpdnfpa67HDHKW1WnfXmFM/WHs0Lu78IV0Kp/Uvk4CxoXDz5GfAst880btTRJrPTRasuTszpQBEn2N2EfpGEMjRTb7O2K83ZB8Xmo1OD8eIITzjH6T1JQLaattY6uapmkU55cU2LPGsW7nA63Yd2wywXs5Q8OZVcAmZAis/vM6T6zB+Ux+IORRruxzqoU5wVrP6qrhurRr62fA01m8zooMEmObpkiwVfCNJdNo6z9/zcL53p7rc4ZauOCRoBb2qOdahNdfEu2jIqSgeJ9QcuNW3vrjv8gmiJnkjUCucTfQT1+iWY9S9I0ATQYZzXLtIfK/G7DIrrPyLutTjbSyccvjKRAdUvFo3CNuWiaDSio3hmIHZu/teSCSFwIuKSsLm7ov8ABxCqtYy4/gxZqCu8jWDxjTgsvcYHaaagMQyxBCAL+MJV95Z7x0Po35D6taA4bpIU2Tx8JNfvdbHWcCyuQVrfKMrl9NeAo3PMMCPqvlp7zJijEHErb4toSBgD","title":"Paris facts: the capital of France in history","type":"web_search_result","url":"https://home.adelphi.edu/~ca19535/page%204.html"},{"encrypted_content":"EsQDCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDBcG83g2FtNB/uwNohoMqELMWCCeD4apzlNhIjCRPBxmh6AFZGv+/5HpnuOIX2DoImS7YkyIP8iCg6+grehTkp8pDCrQnpVpzMb8xFAqxwId2pU6hDCGIf86pdIVgvHNdhMiYgByM6E5HLBWnQKOfnJdSRBH1ozvzSimt+tCe4SDBmYMcxYJIfiQcWGhTQbt6kBMf3r5CCHmDF+dbnrMOsWtBwPgj7lWeoXaz7aoeUYNqt2QN3NjWQdMbdsML2arloqAnEHi8QfhpmKJOAwX8AeOGIbcWch5xTCEYb+HNczf4ZF2kO17WwWvPsOYUDFHij3/WhiGNr1+3KWi2I3ia8nfTaiZVa45EECHJcWAs+VWEWtXozGyg9+l/S2f0hH3gEoBcR1OTm6YIjhJepId2TK3ycqiNKEK8pBVlTe1XLjVs4hNd+XOgsZdQVVanFg+AD/fUOk2vtcxNp1d9cPw6yZcX1iXNB+H7v1JLOB4hu3C+cEZKqYz7gT0y3lbvPoX+CUzeAsTAohcsoiUWh0r0hZxu3GmExIYAw==","page_age":"September 16, 2025","title":"Paris, France - Intercultural City - Intercultural Cities Programme - www.coe.int","type":"web_search_result","url":"https://www.coe.int/en/web/interculturalcities/paris"},{"encrypted_content":"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","page_age":"3 days ago","title":"France | History, Maps, Flag, Population, Cities, Capital, & Facts | Britannica","type":"web_search_result","url":"https://www.britannica.com/place/France"},{"encrypted_content":"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","page_age":"December 1, 2022","title":"Discover the city of Paris | Paris the capital city of France","type":"web_search_result","url":"https://www.cia-france.com/french-kids-teenage-courses/paris-school/visit-paris"},{"encrypted_content":"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","page_age":"5 days ago","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","type":"web_search_result","url":"https://www.britannica.com/place/Paris"},{"encrypted_content":"EsUBCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDBeutxYXKz1s7fTLSBoMeijqoaep3kNwVyCxIjC1Krrs8T1CsAJD8JiVx2S7Aes8fjfaltJk3wpDPUFyXq4PgmbAXjkYF/a6PVSHf+QqSaAthG5JnYOuPsavT38Ia7YHlAxZF5QiDHUi1ztOvDkhRQwh+ucuqp4r7BIqtlRZC+lNQtxTy6NnHTbSiMxdPnuY8MC/DtytOjsYAw==","title":"Paris 🇫🇷, the capital and largest city of France, is located in ...","type":"web_search_result","url":"https://www.facebook.com/61551442420211/posts/paris-the-capital-and-largest-city-of-france-is-located-in-the-northern-part-of-/122180773544048080/"},{"encrypted_content":"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","page_age":"November 28, 2024","title":"What is the capital of France? Overview of Paris/","type":"web_search_result","url":"https://www.iroamly.com/france-travel/what-is-the-capital-of-france.html"},{"encrypted_content":"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","title":"Facts About France | Map, Population & Capital | Study.com","type":"web_search_result","url":"https://study.com/academy/lesson/facts-about-france-location-population-history.html"}],"providerExecuted":true,"metadata":{}},{"type":"text-start","id":"3","metadata":{}},{"type":"text-delta","id":"3","delta":"The","metadata":{}},{"type":"text-delta","id":"3","delta":" capital of France is **Paris**. ","metadata":{}},{"type":"text-end","id":"3","metadata":{}},{"type":"text-start","id":"4","metadata":{}},{"type":"source","sourceType":"url","id":"id_fwUBOLBrWwcuyNqK","url":"https://en.wikipedia.org/wiki/Paris","title":"Paris - Wikipedia","metadata":{"anthropic":{"source":"url","citedText":"Paris is the capital and largest city of France, with an estimated city population of 2.04 million in an area of 105.4 km2 (40.7 sq mi), and a metropo...","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDPEDmYObIs3O1MRjthoMX0x7AqyA5zzr6ui/IjDPs2o+gZrKct/MV8yKk9lxe+xK5xB8vqmppkPa4bUeUYkb3uidb1LnF6+sCgUEPOQqEy8MiG6rWIWTJXdBrQ0RrtxUjwkYBA=="}}},{"type":"text-delta","id":"4","delta":"Paris is the capital and largest city of France,","metadata":{}},{"type":"text-delta","id":"4","delta":" with an estimated city population of 2.04 million and a metropolitan population","metadata":{}},{"type":"text-delta","id":"4","delta":" of 13.2 million.","metadata":{}},{"type":"text-end","id":"4","metadata":{}},{"type":"text-start","id":"5","metadata":{}},{"type":"text-delta","id":"5","delta":" ","metadata":{}},{"type":"text-end","id":"5","metadata":{}},{"type":"text-start","id":"6","metadata":{}},{"type":"source","sourceType":"url","id":"id_EmhrrcqHK3Ln29Oi","url":"https://www.britannica.com/place/Paris","title":"Paris | Definition, Map, Population, Facts, & History | Britannica","metadata":{"anthropic":{"source":"url","citedText":"Paris, city and capital of France, located along the Seine River, in the north-central part of the country. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDFT2x0eMuJ2+mrhpzxoM9qih2j2EUr9ZoqGfIjDhNqItV+C8pt9vmjzhN8h+vEavYAEF1uzX8iql8MWgarlK7njWhemgqMhFCP/io2YqE529/WSIr5GXr0cgip6TAXRwzzQYBA=="}}},{"type":"text-delta","id":"6","delta":"It is situated along","metadata":{}},{"type":"text-delta","id":"6","delta":" the Seine River, in the north-central part of the country.","metadata":{}},{"type":"text-end","id":"6","metadata":{}},{"type":"text-start","id":"7","metadata":{}},{"type":"text-delta","id":"7","delta":"\n\n","metadata":{}},{"type":"text-end","id":"7","metadata":{}},{"type":"text-start","id":"8","metadata":{}},{"type":"source","sourceType":"url","id":"id_M8JykQskNEW0NWW0","url":"https://en.wikipedia.org/wiki/List_of_capitals_of_France","title":"List of capitals of France - Wikipedia","metadata":{"anthropic":{"source":"url","citedText":"The capital of France has been Paris since its liberation in 1944. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDD56zsiLaXCYCfT+rxoM2+R8f8hQNHfgvJgGIjC8spp5wvgU6ok7eHxmKtNp2cTVsujrWbL8ea9TdX43PGTtK6rgsdYTxuKBGVLf9r0qE30VvwZZrucC4RJrDl2lFgSVguoYBA=="}}},{"type":"text-delta","id":"8","delta":"Paris has been","metadata":{}},{"type":"text-delta","id":"8","delta":" the capital of France since its liberation in 1944","metadata":{}},{"type":"text-end","id":"8","metadata":{}},{"type":"text-start","id":"9","metadata":{}},{"type":"text-delta","id":"9","delta":", though its history as","metadata":{}},{"type":"text-delta","id":"9","delta":" the French capital goes back much further. ","metadata":{}},{"type":"text-end","id":"9","metadata":{}},{"type":"text-start","id":"10","metadata":{}},{"type":"source","sourceType":"url","id":"id_RKtjkhfDCb6xTpdL","url":"https://home.adelphi.edu/~ca19535/page%204.html","title":"Paris facts: the capital of France in history","metadata":{"anthropic":{"source":"url","citedText":"Paris first became the capital of France in 508 under King Clovis. ","encryptedIndex":"Eo8BCioIDxgCIiRlOTk3NGY0Mi0xMmMzLTRlYWUtOTA5OS01OGNiNGE1MzQyY2YSDOmD0gZDTk4EUhZxTRoM7o3FKIIkPpokD8MPIjD7SHZyHs2FbmkDuzxdr6QKhNyLcARG1P9qp5+GsL1n2QKy2+CBozckttRU1v/0/MAqE7X5OvyUYhzCyjTd6OSJljZaS54YBA=="}}},{"type":"text-delta","id":"10","delta":"Paris first became the capital of France in 508","metadata":{}},{"type":"text-delta","id":"10","delta":" under King Clovis.","metadata":{}},{"type":"text-end","id":"10","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":2345,"outputTokens":264,"totalTokens":2609},"metadata":{"anthropic":{"usage":{"cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":0},"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"input_tokens":2345,"output_tokens":9,"server_tool_use":null,"service_tier":"standard"}}}}]}]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, it } from '@effect/vitest';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
|
|
8
|
+
import { TestHelpers } from '@dxos/effect/testing';
|
|
9
|
+
import { AgentService } from '@dxos/functions-runtime';
|
|
10
|
+
import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
|
|
11
|
+
|
|
12
|
+
import WebSearchBlueprint from './blueprint';
|
|
13
|
+
import { WebSearchHandlers } from './functions';
|
|
14
|
+
import { WebSearchToolkitOpaque } from './toolkit';
|
|
15
|
+
|
|
16
|
+
const TestLayer = AssistantTestLayer({
|
|
17
|
+
blueprints: [WebSearchBlueprint.make()],
|
|
18
|
+
operationHandlers: [WebSearchHandlers],
|
|
19
|
+
toolkits: [WebSearchToolkitOpaque],
|
|
20
|
+
tracing: 'pretty',
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('WebToolkit', () => {
|
|
24
|
+
it.effect(
|
|
25
|
+
'WebFetch handler returns response text',
|
|
26
|
+
Effect.fnUntraced(
|
|
27
|
+
function* ({ expect }) {
|
|
28
|
+
const session = yield* AgentService.createSession({
|
|
29
|
+
blueprints: [WebSearchBlueprint.make()],
|
|
30
|
+
});
|
|
31
|
+
yield* session.submitPrompt('What is the capital of France? Make sure to use the web search tool.');
|
|
32
|
+
yield* session.waitForCompletion();
|
|
33
|
+
},
|
|
34
|
+
Effect.provide(TestLayer),
|
|
35
|
+
TestHelpers.provideTestContext,
|
|
36
|
+
),
|
|
37
|
+
{ timeout: 30_000 },
|
|
38
|
+
);
|
|
39
|
+
});
|
|
@@ -2,30 +2,28 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import { type AppCapabilities } from '@dxos/app-toolkit';
|
|
7
|
-
import { Blueprint } from '@dxos/blueprints';
|
|
5
|
+
import { Blueprint } from '@dxos/compute';
|
|
8
6
|
import { Ref } from '@dxos/echo';
|
|
9
7
|
import { Text } from '@dxos/schema';
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
import { Fetch } from './functions';
|
|
12
10
|
|
|
13
|
-
const
|
|
11
|
+
const BLUEPRINT_KEY = 'org.dxos.blueprint.web-search';
|
|
14
12
|
|
|
15
13
|
const make = () =>
|
|
16
14
|
Blueprint.make({
|
|
17
15
|
key: BLUEPRINT_KEY,
|
|
18
16
|
name: 'Web Search',
|
|
19
17
|
description: 'Search the web.',
|
|
18
|
+
agentCanEnable: true,
|
|
20
19
|
instructions: {
|
|
21
20
|
source: Ref.make(Text.make()),
|
|
22
21
|
},
|
|
23
|
-
tools:
|
|
22
|
+
tools: Blueprint.toolDefinitions({ operations: [Fetch], tools: ['AnthropicWebSearch'] }),
|
|
24
23
|
});
|
|
25
24
|
|
|
26
|
-
const blueprint:
|
|
25
|
+
const blueprint: Blueprint.Definition = {
|
|
27
26
|
key: BLUEPRINT_KEY,
|
|
28
|
-
functions,
|
|
29
27
|
make,
|
|
30
28
|
};
|
|
31
29
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { Operation } from '@dxos/compute';
|
|
8
|
+
import { trim } from '@dxos/util';
|
|
9
|
+
|
|
10
|
+
export const Fetch = Operation.make({
|
|
11
|
+
meta: {
|
|
12
|
+
key: 'org.dxos.function.web-search.fetch',
|
|
13
|
+
name: 'Fetch web page',
|
|
14
|
+
description: trim`
|
|
15
|
+
Fetches the content of a web page and returns the HTML.
|
|
16
|
+
Use this to get the content of a web page.
|
|
17
|
+
`,
|
|
18
|
+
},
|
|
19
|
+
input: Schema.Struct({
|
|
20
|
+
url: Schema.String.annotations({
|
|
21
|
+
description: 'The URL of the web page to fetch.',
|
|
22
|
+
}),
|
|
23
|
+
}),
|
|
24
|
+
output: Schema.String,
|
|
25
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { Operation } from '@dxos/compute';
|
|
8
|
+
|
|
9
|
+
import { Fetch } from './definitions';
|
|
10
|
+
|
|
11
|
+
export default Fetch.pipe(
|
|
12
|
+
Operation.withHandler(
|
|
13
|
+
Effect.fn(function* ({ url }) {
|
|
14
|
+
const response = yield* Effect.promise(() => fetch(url).then((response) => response.text()));
|
|
15
|
+
return response;
|
|
16
|
+
}),
|
|
17
|
+
),
|
|
18
|
+
);
|
|
@@ -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
|
@@ -6,23 +6,21 @@ import { describe, it } from '@effect/vitest';
|
|
|
6
6
|
import * as Effect from 'effect/Effect';
|
|
7
7
|
import * as Layer from 'effect/Layer';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { OpaqueToolkit } from '@dxos/ai';
|
|
10
|
+
import { AiRequest, ToolExecutionServices } from '@dxos/assistant';
|
|
11
11
|
import { TestHelpers } from '@dxos/effect/testing';
|
|
12
|
+
import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
|
|
12
13
|
import { log } from '@dxos/log';
|
|
13
14
|
import { Pipeline } from '@dxos/types';
|
|
14
15
|
|
|
15
16
|
import { makeGraphWriterHandler, makeGraphWriterToolkit } from './graph';
|
|
16
17
|
|
|
17
|
-
const TestLayer =
|
|
18
|
+
const TestLayer = Layer.empty.pipe(
|
|
19
|
+
Layer.provideMerge(ToolExecutionServices),
|
|
20
|
+
Layer.provideMerge(AssistantTestLayer({})),
|
|
21
|
+
);
|
|
18
22
|
|
|
19
23
|
describe('graph', () => {
|
|
20
|
-
// let builder: EchoTestBuilder;
|
|
21
|
-
// test('findRelatedSchema', async () => {
|
|
22
|
-
// const db = await createEchoDatabase();
|
|
23
|
-
// const relatedSchemas = await findRelatedSchema(db, Schema.Struct({}));
|
|
24
|
-
// });
|
|
25
|
-
|
|
26
24
|
const Toolkit = makeGraphWriterToolkit({ schema: [Pipeline.Pipeline] });
|
|
27
25
|
const ToolkitLayer = makeGraphWriterHandler(Toolkit);
|
|
28
26
|
|
|
@@ -30,9 +28,9 @@ describe('graph', () => {
|
|
|
30
28
|
'calculator',
|
|
31
29
|
Effect.fn(
|
|
32
30
|
function* (_) {
|
|
33
|
-
const
|
|
34
|
-
const toolkit = yield* Toolkit;
|
|
35
|
-
const response = yield*
|
|
31
|
+
const request = new AiRequest();
|
|
32
|
+
const toolkit = yield* OpaqueToolkit.fromContext(Toolkit);
|
|
33
|
+
const response = yield* request.run({
|
|
36
34
|
toolkit,
|
|
37
35
|
prompt: 'What is 10 + 20?',
|
|
38
36
|
});
|
package/src/crud/graph.ts
CHANGED
|
@@ -11,8 +11,11 @@ import * as Option from 'effect/Option';
|
|
|
11
11
|
import * as Schema from 'effect/Schema';
|
|
12
12
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
13
13
|
|
|
14
|
+
import { ContextQueueService } from '@dxos/compute';
|
|
14
15
|
import { Entity, Filter, Obj, Query, Type } from '@dxos/echo';
|
|
15
16
|
import { Database } from '@dxos/echo';
|
|
17
|
+
import { type Queue } from '@dxos/echo-db';
|
|
18
|
+
import { isEncodedReference } from '@dxos/echo-protocol';
|
|
16
19
|
import {
|
|
17
20
|
ReferenceAnnotationId,
|
|
18
21
|
RelationSourceDXNId,
|
|
@@ -23,10 +26,7 @@ import {
|
|
|
23
26
|
getTypeAnnotation,
|
|
24
27
|
getTypeIdentifierAnnotation,
|
|
25
28
|
} from '@dxos/echo/internal';
|
|
26
|
-
import { type Queue } from '@dxos/echo-db';
|
|
27
|
-
import { isEncodedReference } from '@dxos/echo-protocol';
|
|
28
29
|
import { mapAst } from '@dxos/effect';
|
|
29
|
-
import { ContextQueueService } from '@dxos/functions';
|
|
30
30
|
import { DXN, ObjectId } from '@dxos/keys';
|
|
31
31
|
import { log } from '@dxos/log';
|
|
32
32
|
import { deepMapValues, isNonNullable, trim } from '@dxos/util';
|