@dxos/assistant-toolkit 0.8.4-main.dfabb4ec29 → 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-ZUJ5DMSY.mjs → add-artifact-ZKSSMPLY.mjs} +6 -6
- package/dist/lib/neutral/{add-artifact-ZUJ5DMSY.mjs.map → add-artifact-ZKSSMPLY.mjs.map} +3 -3
- package/dist/lib/neutral/{agent-5NIKAYUK.mjs → agent-UIASE5LZ.mjs} +7 -7
- package/dist/lib/neutral/{agent-5NIKAYUK.mjs.map → agent-UIASE5LZ.mjs.map} +2 -2
- package/dist/lib/neutral/chunk-AF5TWFLV.mjs +66 -0
- package/dist/lib/neutral/chunk-AF5TWFLV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-P4ZMYO4K.mjs → chunk-CMHECL6N.mjs} +21 -33
- package/dist/lib/neutral/chunk-CMHECL6N.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ZFXLTBZG.mjs → chunk-DC5KITJP.mjs} +3 -2
- package/dist/lib/neutral/chunk-DC5KITJP.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-WLR3BGO4.mjs → chunk-EUHZLWCG.mjs} +2 -1
- package/dist/lib/neutral/chunk-EUHZLWCG.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-IKBIORQX.mjs → chunk-EUTROPCP.mjs} +22 -9
- package/dist/lib/neutral/chunk-EUTROPCP.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-GV66MKAQ.mjs → chunk-FNN6ERC6.mjs} +4 -3
- package/dist/lib/neutral/chunk-FNN6ERC6.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-246ACKSH.mjs → chunk-GEMRKH7J.mjs} +15 -12
- package/dist/lib/neutral/chunk-GEMRKH7J.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-EJAQUAKM.mjs → chunk-GHGJCH73.mjs} +8 -5
- package/dist/lib/neutral/chunk-GHGJCH73.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-KGU725LW.mjs → chunk-LO2S3ICN.mjs} +4 -7
- package/dist/lib/neutral/chunk-LO2S3ICN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TO5IX24K.mjs → chunk-MMIERIDT.mjs} +12 -9
- package/dist/lib/neutral/chunk-MMIERIDT.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-NR3GTWRC.mjs → chunk-OC77MYT5.mjs} +8 -13
- package/dist/lib/neutral/chunk-OC77MYT5.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ROMZO4CB.mjs → chunk-ONQXVECY.mjs} +11 -9
- package/dist/lib/neutral/chunk-ONQXVECY.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-QO5SU37C.mjs → chunk-PAEPER4S.mjs} +3 -3
- package/dist/lib/neutral/{chunk-XUF53B6B.mjs → chunk-RIF2TKJJ.mjs} +10 -9
- package/dist/lib/neutral/chunk-RIF2TKJJ.mjs.map +7 -0
- package/dist/lib/neutral/{context-add-VB7AOY3G.mjs → context-add-VNJUVPSY.mjs} +4 -4
- package/dist/lib/neutral/context-add-VNJUVPSY.mjs.map +7 -0
- package/dist/lib/neutral/{context-remove-VCM3VPSO.mjs → context-remove-ZASL7ABZ.mjs} +4 -4
- package/dist/lib/neutral/context-remove-ZASL7ABZ.mjs.map +7 -0
- package/dist/lib/neutral/{create-project-EIF4OJMY.mjs → create-project-VNC2KKBG.mjs} +7 -7
- package/dist/lib/neutral/{delete-J3PMWP7Z.mjs → delete-NLBJMMBJ.mjs} +3 -3
- package/dist/lib/neutral/{enable-blueprints-LBDZH2CY.mjs → enable-blueprints-SMGQ2WCU.mjs} +4 -4
- package/dist/lib/neutral/enable-blueprints-SMGQ2WCU.mjs.map +7 -0
- package/dist/lib/neutral/{fetch-KHMHV7JR.mjs → fetch-VV3DU75K.mjs} +2 -2
- package/dist/lib/neutral/{fetch-messages-QOBBCTGC.mjs → fetch-messages-YXH77S3S.mjs} +2 -2
- package/dist/lib/neutral/{get-context-TN7X7U2H.mjs → get-context-LG2CNVII.mjs} +7 -7
- package/dist/lib/neutral/{get-context-TN7X7U2H.mjs.map → get-context-LG2CNVII.mjs.map} +3 -3
- package/dist/lib/neutral/index.mjs +84 -85
- package/dist/lib/neutral/index.mjs.map +3 -3
- package/dist/lib/neutral/{load-ALP3TK2E.mjs → load-K7HEJA54.mjs} +2 -2
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/{object-create-Z57Y3X6Y.mjs → object-create-EN6PJN3L.mjs} +4 -4
- package/dist/lib/neutral/{object-create-Z57Y3X6Y.mjs.map → object-create-EN6PJN3L.mjs.map} +2 -2
- package/dist/lib/neutral/{object-delete-X53LS37B.mjs → object-delete-RMA5ZKGY.mjs} +2 -2
- package/dist/lib/neutral/{object-update-GVKSBR7T.mjs → object-update-JW5PLR2T.mjs} +3 -3
- package/dist/lib/neutral/{object-update-GVKSBR7T.mjs.map → object-update-JW5PLR2T.mjs.map} +2 -2
- package/dist/lib/neutral/{project-HPHTZ2CI.mjs → project-OGO5ABSZ.mjs} +6 -6
- package/dist/lib/neutral/{project-rules-IVDHKSKI.mjs → project-rules-IVA3DSOW.mjs} +5 -5
- package/dist/lib/neutral/{prompt-Y7NN7M5D.mjs → prompt-YVFNLD7U.mjs} +5 -5
- package/dist/lib/neutral/{prompt-Y7NN7M5D.mjs.map → prompt-YVFNLD7U.mjs.map} +3 -3
- package/dist/lib/neutral/{qualifier-VDOY5CWU.mjs → qualifier-UTPO5E3S.mjs} +15 -14
- package/dist/lib/neutral/qualifier-UTPO5E3S.mjs.map +7 -0
- package/dist/lib/neutral/{query-PPJU5622.mjs → query-3FK3ED6L.mjs} +4 -5
- package/dist/lib/neutral/query-3FK3ED6L.mjs.map +7 -0
- package/dist/lib/neutral/{query-U56GNEV6.mjs → query-GXZT4KUX.mjs} +3 -3
- package/dist/lib/neutral/{query-blueprints-KXADGHSA.mjs → query-blueprints-GA2JM54N.mjs} +2 -2
- package/dist/lib/neutral/{relation-create-XJ2IX6X3.mjs → relation-create-XOFKYPL2.mjs} +3 -3
- package/dist/lib/neutral/{relation-create-XJ2IX6X3.mjs.map → relation-create-XOFKYPL2.mjs.map} +3 -3
- package/dist/lib/neutral/{relation-delete-EP4KXAFL.mjs → relation-delete-MVJKKVEQ.mjs} +2 -2
- package/dist/lib/neutral/{save-GWAPLT3Z.mjs → save-TFQMJKG7.mjs} +3 -3
- package/dist/lib/neutral/{schema-add-Z5CY6P24.mjs → schema-add-I7BFBU55.mjs} +2 -2
- 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-4YE5XAK5.mjs → sync-issues-3U3EL6KO.mjs} +5 -6
- package/dist/lib/neutral/sync-issues-3U3EL6KO.mjs.map +7 -0
- package/dist/lib/neutral/{sync-triggers-CDMJVW6E.mjs → sync-triggers-M6U6RAKN.mjs} +39 -37
- package/dist/lib/neutral/sync-triggers-M6U6RAKN.mjs.map +7 -0
- package/dist/lib/neutral/{tag-add-VNIIOVJA.mjs → tag-add-RCE2QULJ.mjs} +3 -3
- package/dist/lib/neutral/{tag-add-VNIIOVJA.mjs.map → tag-add-RCE2QULJ.mjs.map} +3 -3
- package/dist/lib/neutral/{tag-remove-6R2R27W3.mjs → tag-remove-EPKB5CDE.mjs} +3 -3
- package/dist/lib/neutral/{tag-remove-6R2R27W3.mjs.map → tag-remove-EPKB5CDE.mjs.map} +3 -3
- package/dist/lib/neutral/testing/index.mjs +7 -10
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/lib/neutral/{update-blueprints-N2AK2VUR.mjs → update-blueprints-VOGJKSMQ.mjs} +2 -2
- 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/blueprint-manager/functions/definitions.d.ts +10 -12
- package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts +6 -7
- package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts.map +1 -1
- package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts +4 -5
- package/dist/types/src/blueprints/database/functions/context-add.d.ts +3 -3
- 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 +3 -3
- package/dist/types/src/blueprints/database/functions/context-remove.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/definitions.d.ts +17 -17
- package/dist/types/src/blueprints/database/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/load.d.ts +2 -2
- package/dist/types/src/blueprints/database/functions/load.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/object-delete.d.ts +1 -1
- package/dist/types/src/blueprints/database/functions/object-update.d.ts +2 -2
- package/dist/types/src/blueprints/database/functions/object-update.d.ts.map +1 -1
- package/dist/types/src/blueprints/database/functions/query.d.ts +2 -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 +3 -3
- 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 +1 -1
- 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 +3 -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 +3 -3
- package/dist/types/src/blueprints/database/functions/tag-remove.d.ts.map +1 -1
- package/dist/types/src/blueprints/discord/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/github/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/linear/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts.map +1 -1
- package/dist/types/src/blueprints/memory/functions/definitions.d.ts +2 -2
- package/dist/types/src/blueprints/memory/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/memory/functions/delete.d.ts +2 -2
- package/dist/types/src/blueprints/planning/functions/index.d.ts +1 -1
- package/dist/types/src/blueprints/planning/functions/index.d.ts.map +1 -1
- package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts +14 -1
- package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts.map +1 -1
- 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/project/functions/add-artifact.d.ts +1 -5
- package/dist/types/src/blueprints/project/functions/add-artifact.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/definitions.d.ts +60 -45
- package/dist/types/src/blueprints/project/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/get-context.d.ts +1 -12
- package/dist/types/src/blueprints/project/functions/get-context.d.ts.map +1 -1
- package/dist/types/src/blueprints/project/functions/qualifier.d.ts +3 -71
- package/dist/types/src/blueprints/project/functions/qualifier.d.ts.map +1 -1
- package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts +22 -18
- package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts +43 -36
- package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts +21 -17
- package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts.map +1 -1
- package/dist/types/src/blueprints/testing.d.ts +4 -4
- package/dist/types/src/blueprints/testing.d.ts.map +1 -1
- package/dist/types/src/blueprints/websearch/functions/definitions.d.ts.map +1 -1
- package/dist/types/src/crud/graph.d.ts +8 -11
- package/dist/types/src/crud/graph.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +3 -3
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/functions/agent/definitions.d.ts +12 -13
- package/dist/types/src/functions/agent/definitions.d.ts.map +1 -1
- package/dist/types/src/sync/sync.d.ts +1 -2
- package/dist/types/src/sync/sync.d.ts.map +1 -1
- package/dist/types/src/testing/plugins.d.ts +1 -1
- package/dist/types/src/testing/plugins.d.ts.map +1 -1
- package/dist/types/src/types/Agent.d.ts +23 -22
- package/dist/types/src/types/Agent.d.ts.map +1 -1
- package/dist/types/src/types/Chat.d.ts +17 -20
- package/dist/types/src/types/Chat.d.ts.map +1 -1
- package/dist/types/src/types/McpServer.d.ts +1 -2
- package/dist/types/src/types/McpServer.d.ts.map +1 -1
- package/dist/types/src/types/Memory.d.ts +1 -2
- package/dist/types/src/types/Memory.d.ts.map +1 -1
- package/dist/types/src/types/Plan.d.ts +14 -16
- package/dist/types/src/types/Plan.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -26
- package/src/blueprints/automation/blueprint.ts +3 -3
- package/src/blueprints/blueprint-manager/blueprint.conversations.json +1 -1
- package/src/blueprints/blueprint-manager/blueprint.test.ts +23 -19
- package/src/blueprints/blueprint-manager/functions/definitions.ts +8 -5
- package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +2 -2
- package/src/blueprints/database/blueprint.conversations.json +1 -1
- package/src/blueprints/database/blueprint.test.ts +15 -15
- package/src/blueprints/database/functions/context-add.ts +2 -2
- package/src/blueprints/database/functions/context-remove.ts +2 -2
- package/src/blueprints/database/functions/definitions.ts +19 -6
- package/src/blueprints/database/functions/object-create.ts +2 -2
- package/src/blueprints/database/functions/object-update.ts +1 -1
- package/src/blueprints/database/functions/query.ts +3 -4
- package/src/blueprints/database/functions/relation-create.ts +1 -1
- package/src/blueprints/database/functions/schema-list.ts +17 -10
- package/src/blueprints/database/functions/tag-add.ts +1 -1
- package/src/blueprints/database/functions/tag-remove.ts +1 -1
- package/src/blueprints/discord/functions/definitions.ts +1 -0
- package/src/blueprints/discord/functions/fetch-messages.test.ts +7 -2
- package/src/blueprints/github/functions/definitions.ts +1 -0
- package/src/blueprints/linear/functions/definitions.ts +1 -0
- package/src/blueprints/linear/functions/linear.test.ts +1 -2
- package/src/blueprints/linear/functions/sync-issues.ts +1 -2
- package/src/blueprints/memory/blueprint.conversations.json +1 -1
- package/src/blueprints/memory/functions/definitions.ts +3 -0
- package/src/blueprints/planning/blueprint.ts +1 -1
- package/src/blueprints/planning/functions/index.ts +1 -1
- package/src/blueprints/planning/functions/{definitions.ts → update-tasks.md} +29 -50
- package/src/blueprints/planning/functions/update-tasks.test.ts +55 -0
- package/src/blueprints/planning/functions/update-tasks.ts +26 -3
- package/src/blueprints/project/blueprint.conversations.json +1 -1
- package/src/blueprints/project/blueprint.test.ts +12 -14
- package/src/blueprints/project/functions/add-artifact.ts +1 -0
- package/src/blueprints/project/functions/agent.ts +2 -2
- package/src/blueprints/project/functions/definitions.ts +8 -6
- package/src/blueprints/project/functions/get-context.ts +2 -1
- package/src/blueprints/project/functions/qualifier.ts +8 -7
- package/src/blueprints/project-wizard/functions/definitions.ts +6 -4
- package/src/blueprints/project-wizard/functions/sync-triggers.ts +32 -34
- package/src/blueprints/testing.ts +10 -4
- package/src/blueprints/websearch/blueprint.conversations.json +1 -1
- package/src/blueprints/websearch/functions/definitions.ts +1 -0
- package/src/crud/graph.test.ts +1 -1
- package/src/crud/graph.ts +142 -151
- package/src/errors.ts +3 -3
- package/src/functions/agent/definitions.ts +2 -1
- package/src/functions/agent/prompt.conversations.json +1 -1
- package/src/functions/agent/prompt.test.ts +8 -11
- package/src/functions/agent/prompt.ts +2 -2
- package/src/sync/sync.ts +7 -6
- package/src/testing/plugins.tsx +8 -13
- package/src/types/Agent.ts +24 -29
- package/src/types/Chat.ts +9 -16
- package/src/types/McpServer.ts +3 -6
- package/src/types/Memory.ts +3 -3
- package/src/types/Plan.ts +4 -11
- package/dist/lib/neutral/chunk-246ACKSH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EJAQUAKM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-FIGO6CA6.mjs +0 -140
- package/dist/lib/neutral/chunk-FIGO6CA6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GV66MKAQ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-IKBIORQX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-KGU725LW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-NR3GTWRC.mjs.map +0 -7
- package/dist/lib/neutral/chunk-P4ZMYO4K.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ROMZO4CB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TO5IX24K.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WLR3BGO4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XUF53B6B.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZFXLTBZG.mjs.map +0 -7
- package/dist/lib/neutral/context-add-VB7AOY3G.mjs.map +0 -7
- package/dist/lib/neutral/context-remove-VCM3VPSO.mjs.map +0 -7
- package/dist/lib/neutral/enable-blueprints-LBDZH2CY.mjs.map +0 -7
- package/dist/lib/neutral/qualifier-VDOY5CWU.mjs.map +0 -7
- package/dist/lib/neutral/query-PPJU5622.mjs.map +0 -7
- package/dist/lib/neutral/schema-list-W326VPVX.mjs +0 -38
- package/dist/lib/neutral/schema-list-W326VPVX.mjs.map +0 -7
- package/dist/lib/neutral/sync-issues-4YE5XAK5.mjs.map +0 -7
- package/dist/lib/neutral/sync-triggers-CDMJVW6E.mjs.map +0 -7
- package/dist/lib/neutral/update-tasks-H7SWIFQL.mjs +0 -46
- package/dist/lib/neutral/update-tasks-H7SWIFQL.mjs.map +0 -7
- package/dist/types/src/blueprints/planning/functions/definitions.d.ts +0 -11
- package/dist/types/src/blueprints/planning/functions/definitions.d.ts.map +0 -1
- /package/dist/lib/neutral/{chunk-QO5SU37C.mjs.map → chunk-PAEPER4S.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-project-EIF4OJMY.mjs.map → create-project-VNC2KKBG.mjs.map} +0 -0
- /package/dist/lib/neutral/{delete-J3PMWP7Z.mjs.map → delete-NLBJMMBJ.mjs.map} +0 -0
- /package/dist/lib/neutral/{fetch-KHMHV7JR.mjs.map → fetch-VV3DU75K.mjs.map} +0 -0
- /package/dist/lib/neutral/{fetch-messages-QOBBCTGC.mjs.map → fetch-messages-YXH77S3S.mjs.map} +0 -0
- /package/dist/lib/neutral/{load-ALP3TK2E.mjs.map → load-K7HEJA54.mjs.map} +0 -0
- /package/dist/lib/neutral/{object-delete-X53LS37B.mjs.map → object-delete-RMA5ZKGY.mjs.map} +0 -0
- /package/dist/lib/neutral/{project-HPHTZ2CI.mjs.map → project-OGO5ABSZ.mjs.map} +0 -0
- /package/dist/lib/neutral/{project-rules-IVDHKSKI.mjs.map → project-rules-IVA3DSOW.mjs.map} +0 -0
- /package/dist/lib/neutral/{query-U56GNEV6.mjs.map → query-GXZT4KUX.mjs.map} +0 -0
- /package/dist/lib/neutral/{query-blueprints-KXADGHSA.mjs.map → query-blueprints-GA2JM54N.mjs.map} +0 -0
- /package/dist/lib/neutral/{relation-delete-EP4KXAFL.mjs.map → relation-delete-MVJKKVEQ.mjs.map} +0 -0
- /package/dist/lib/neutral/{save-GWAPLT3Z.mjs.map → save-TFQMJKG7.mjs.map} +0 -0
- /package/dist/lib/neutral/{schema-add-Z5CY6P24.mjs.map → schema-add-I7BFBU55.mjs.map} +0 -0
- /package/dist/lib/neutral/{update-blueprints-N2AK2VUR.mjs.map → update-blueprints-VOGJKSMQ.mjs.map} +0 -0
package/src/crud/graph.ts
CHANGED
|
@@ -11,23 +11,18 @@ 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 { Entity, Filter, Obj, Query, Type } from '@dxos/echo';
|
|
15
|
-
import { Database } from '@dxos/echo';
|
|
16
|
-
import { type Queue } from '@dxos/echo-db';
|
|
14
|
+
import { Database, Entity, Feed, Filter, Obj, Query, Type } from '@dxos/echo';
|
|
17
15
|
import { isEncodedReference } from '@dxos/echo-protocol';
|
|
18
16
|
import {
|
|
19
17
|
ReferenceAnnotationId,
|
|
20
|
-
RelationSourceDXNId,
|
|
21
18
|
RelationSourceId,
|
|
22
|
-
RelationTargetDXNId,
|
|
23
19
|
RelationTargetId,
|
|
24
20
|
createObject,
|
|
25
21
|
getTypeAnnotation,
|
|
26
22
|
getTypeIdentifierAnnotation,
|
|
27
23
|
} from '@dxos/echo/internal';
|
|
28
24
|
import { mapAst } from '@dxos/effect';
|
|
29
|
-
import {
|
|
30
|
-
import { DXN, ObjectId } from '@dxos/keys';
|
|
25
|
+
import { DXN, EchoURI, ObjectId, type URI } from '@dxos/keys';
|
|
31
26
|
import { log } from '@dxos/log';
|
|
32
27
|
import { deepMapValues, isNonNullable, trim } from '@dxos/util';
|
|
33
28
|
|
|
@@ -37,8 +32,7 @@ export const Subgraph = Schema.Struct({
|
|
|
37
32
|
objects: Schema.Array(Schema.Any),
|
|
38
33
|
});
|
|
39
34
|
|
|
40
|
-
export
|
|
41
|
-
|
|
35
|
+
export type Subgraph = Schema.Schema.Type<typeof Subgraph>;
|
|
42
36
|
export type RelatedSchema = {
|
|
43
37
|
schema: Type.AnyEntity;
|
|
44
38
|
kind: 'reference' | 'relation';
|
|
@@ -57,14 +51,15 @@ export const findRelatedSchema = async (db: Database.Database, anchor: Type.AnyE
|
|
|
57
51
|
|
|
58
52
|
// TODO(dmaretskyi): Also do references.
|
|
59
53
|
return allSchemas
|
|
60
|
-
.filter((
|
|
54
|
+
.filter((type) => {
|
|
55
|
+
const schema = Type.getSchema(type);
|
|
61
56
|
if (getTypeAnnotation(schema)?.kind !== Entity.Kind.Relation) {
|
|
62
57
|
return false;
|
|
63
58
|
}
|
|
64
59
|
|
|
65
60
|
return (
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
isSchemaAddressableByDXN(anchor, getTypeAnnotation(schema)!.sourceSchema!) ||
|
|
62
|
+
isSchemaAddressableByDXN(anchor, getTypeAnnotation(schema)!.targetSchema!)
|
|
68
63
|
);
|
|
69
64
|
})
|
|
70
65
|
.map(
|
|
@@ -79,17 +74,12 @@ export const findRelatedSchema = async (db: Database.Database, anchor: Type.AnyE
|
|
|
79
74
|
* Non-strict DXN comparison.
|
|
80
75
|
* Returns true if the DXN could be resolved to the schema.
|
|
81
76
|
*/
|
|
82
|
-
const
|
|
83
|
-
if (getTypeIdentifierAnnotation(
|
|
77
|
+
const isSchemaAddressableByDXN = (type: Type.AnyEntity, dxn: DXN.DXN): boolean => {
|
|
78
|
+
if (getTypeIdentifierAnnotation(Type.getSchema(type)) === dxn) {
|
|
84
79
|
return true;
|
|
85
80
|
}
|
|
86
81
|
|
|
87
|
-
|
|
88
|
-
if (t) {
|
|
89
|
-
return t.type === Type.getTypename(schema);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return false;
|
|
82
|
+
return DXN.getName(dxn) === Type.getTypename(type);
|
|
93
83
|
};
|
|
94
84
|
|
|
95
85
|
/**
|
|
@@ -106,7 +96,7 @@ export const LocalSearchToolkit = Toolkit.make(
|
|
|
106
96
|
},
|
|
107
97
|
success: Schema.Unknown,
|
|
108
98
|
failure: Schema.Never,
|
|
109
|
-
dependencies: [Database.Service],
|
|
99
|
+
dependencies: [Database.Service, Feed.FeedService],
|
|
110
100
|
}),
|
|
111
101
|
);
|
|
112
102
|
|
|
@@ -115,11 +105,11 @@ export const LocalSearchHandler = LocalSearchToolkit.toLayer({
|
|
|
115
105
|
const objects = yield* Database.runQuery(Query.select(Filter.text(query, { type: 'vector' })));
|
|
116
106
|
const results = [...objects];
|
|
117
107
|
|
|
118
|
-
const
|
|
119
|
-
if (Option.isSome(
|
|
120
|
-
const
|
|
121
|
-
// TODO(dmaretskyi): Text search on the
|
|
122
|
-
results.push(...
|
|
108
|
+
const feedOption = yield* Effect.serviceOption(Feed.ContextFeedService);
|
|
109
|
+
if (Option.isSome(feedOption)) {
|
|
110
|
+
const feedObjects = yield* Feed.runQuery(feedOption.value.feed, Filter.everything());
|
|
111
|
+
// TODO(dmaretskyi): Text search on the feed.
|
|
112
|
+
results.push(...feedObjects);
|
|
123
113
|
}
|
|
124
114
|
|
|
125
115
|
return trim`
|
|
@@ -150,7 +140,7 @@ export const makeGraphWriterToolkit = ({ schema }: { schema: Type.AnyEntity[] })
|
|
|
150
140
|
parameters: createExtractionSchema(schema).fields,
|
|
151
141
|
success: Schema.Unknown,
|
|
152
142
|
failure: Schema.Never,
|
|
153
|
-
dependencies: [Database.Service,
|
|
143
|
+
dependencies: [Database.Service, Feed.ContextFeedService, Feed.FeedService],
|
|
154
144
|
}).annotateContext(Context.make(GraphWriterSchema, { schema })),
|
|
155
145
|
);
|
|
156
146
|
};
|
|
@@ -160,7 +150,7 @@ export const makeGraphWriterHandler = (
|
|
|
160
150
|
{
|
|
161
151
|
onAppend,
|
|
162
152
|
}: {
|
|
163
|
-
onAppend?: (object:
|
|
153
|
+
onAppend?: (object: URI.URI[]) => void;
|
|
164
154
|
} = {},
|
|
165
155
|
) => {
|
|
166
156
|
const { schema } = Context.get(
|
|
@@ -171,11 +161,11 @@ export const makeGraphWriterHandler = (
|
|
|
171
161
|
return toolkit.toLayer({
|
|
172
162
|
graph_writer: Effect.fn(function* (input) {
|
|
173
163
|
const { db } = yield* Database.Service;
|
|
174
|
-
const {
|
|
175
|
-
const data = yield*
|
|
176
|
-
yield*
|
|
164
|
+
const { feed } = yield* Feed.ContextFeedService;
|
|
165
|
+
const data = yield* sanitizeObjects(schema, input as any, db, feed);
|
|
166
|
+
yield* Feed.append(feed, data as Obj.Unknown[]);
|
|
177
167
|
|
|
178
|
-
const dxns = data.map((obj) =>
|
|
168
|
+
const dxns = data.map((obj) => Entity.getURI(obj));
|
|
179
169
|
onAppend?.(dxns);
|
|
180
170
|
return dxns;
|
|
181
171
|
}),
|
|
@@ -188,149 +178,150 @@ export const makeGraphWriterHandler = (
|
|
|
188
178
|
export const createExtractionSchema = (types: Type.AnyEntity[]) => {
|
|
189
179
|
return Schema.Struct({
|
|
190
180
|
...Object.fromEntries(
|
|
191
|
-
types
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
181
|
+
types
|
|
182
|
+
.map((type) => preprocessSchema(Type.getSchema(type)))
|
|
183
|
+
.map((schema, index) => [
|
|
184
|
+
`objects_${getSanitizedSchemaName(types[index])}`,
|
|
185
|
+
Schema.optional(Schema.Array(schema)).annotations({
|
|
186
|
+
description: `The objects of type: ${DXN.getName(DXN.tryMake(Type.getURI(types[index])!)!)}. ${SchemaAST.getDescriptionAnnotation(Type.getSchema(types[index]).ast).pipe(Option.getOrElse(() => ''))}`,
|
|
187
|
+
}),
|
|
188
|
+
]),
|
|
197
189
|
),
|
|
198
190
|
});
|
|
199
191
|
};
|
|
200
192
|
|
|
201
193
|
export const getSanitizedSchemaName = (schema: Type.AnyEntity) => {
|
|
202
|
-
return Type.
|
|
203
|
-
.asTypeDXN()!
|
|
204
|
-
.type.replaceAll(/[^a-zA-Z0-9]+/g, '_');
|
|
194
|
+
return DXN.getName(DXN.tryMake(Type.getURI(schema)!)!).replaceAll(/[^a-zA-Z0-9]+/g, '_');
|
|
205
195
|
};
|
|
206
196
|
|
|
207
|
-
export const sanitizeObjects =
|
|
197
|
+
export const sanitizeObjects = (
|
|
208
198
|
types: Type.AnyEntity[],
|
|
209
199
|
data: Record<string, readonly unknown[]>,
|
|
210
200
|
db: Database.Database,
|
|
211
|
-
|
|
212
|
-
):
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
(
|
|
216
|
-
|
|
217
|
-
data:
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
201
|
+
feed?: Feed.Feed,
|
|
202
|
+
): Effect.Effect<Entity.Unknown[], never, Feed.FeedService> =>
|
|
203
|
+
Effect.gen(function* () {
|
|
204
|
+
const entries = types
|
|
205
|
+
.map(
|
|
206
|
+
(type) =>
|
|
207
|
+
data[`objects_${getSanitizedSchemaName(type)}`]?.map((object: any) => ({
|
|
208
|
+
data: object,
|
|
209
|
+
schema: type,
|
|
210
|
+
})) ?? [],
|
|
211
|
+
)
|
|
212
|
+
.flat();
|
|
213
|
+
|
|
214
|
+
const idMap = new Map<string, string>();
|
|
215
|
+
const existingIds = new Set<ObjectId>();
|
|
216
|
+
const enitties = new Map<ObjectId, Entity.Unknown>();
|
|
217
|
+
|
|
218
|
+
const resolveId = (id: string): EchoURI.EchoURI | undefined => {
|
|
219
|
+
if (ObjectId.isValid(id)) {
|
|
220
|
+
existingIds.add(id);
|
|
221
|
+
return EchoURI.make({ objectId: id });
|
|
222
|
+
}
|
|
232
223
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
224
|
+
const mappedId = idMap.get(id);
|
|
225
|
+
if (mappedId && ObjectId.isValid(mappedId)) {
|
|
226
|
+
return EchoURI.make({ objectId: mappedId });
|
|
227
|
+
}
|
|
237
228
|
|
|
238
|
-
|
|
239
|
-
|
|
229
|
+
return undefined;
|
|
230
|
+
};
|
|
240
231
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
232
|
+
const res = entries
|
|
233
|
+
.map((entry) => {
|
|
234
|
+
// This entry mutates existing object.
|
|
235
|
+
if (ObjectId.isValid(entry.data.id)) {
|
|
236
|
+
return entry;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
idMap.set(entry.data.id, ObjectId.random());
|
|
240
|
+
entry.data.id = idMap.get(entry.data.id);
|
|
245
241
|
return entry;
|
|
246
|
-
}
|
|
242
|
+
})
|
|
243
|
+
.map((entry) => {
|
|
244
|
+
const data = deepMapValues(entry.data, (value, recurse) => {
|
|
245
|
+
if (isEncodedReference(value)) {
|
|
246
|
+
const ref = value['/'];
|
|
247
|
+
const id = resolveId(ref);
|
|
248
|
+
|
|
249
|
+
if (id) {
|
|
250
|
+
// Link to an existing object.
|
|
251
|
+
return { '/': id.toString() };
|
|
252
|
+
} else {
|
|
253
|
+
// Search URIs?
|
|
254
|
+
return { '/': `search:?q=${encodeURIComponent(ref)}` };
|
|
255
|
+
}
|
|
256
|
+
}
|
|
247
257
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
if (id) {
|
|
259
|
-
// Link to an existing object.
|
|
260
|
-
return { '/': id.toString() };
|
|
261
|
-
} else {
|
|
262
|
-
// Search URIs?
|
|
263
|
-
return { '/': `search:?q=${encodeURIComponent(ref)}` };
|
|
258
|
+
return recurse(value);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
let sourceUri: EchoURI.EchoURI | undefined;
|
|
262
|
+
let targetUri: EchoURI.EchoURI | undefined;
|
|
263
|
+
if (Entity.getKind(Type.getSchema(entry.schema)) === 'relation') {
|
|
264
|
+
sourceUri = resolveId(data.source);
|
|
265
|
+
if (!sourceUri) {
|
|
266
|
+
log.warn('source not found', { source: data.source });
|
|
264
267
|
}
|
|
268
|
+
targetUri = resolveId(data.target);
|
|
269
|
+
if (!targetUri) {
|
|
270
|
+
log.warn('target not found', { target: data.target });
|
|
271
|
+
}
|
|
272
|
+
delete data.source;
|
|
273
|
+
delete data.target;
|
|
265
274
|
}
|
|
266
275
|
|
|
267
|
-
return
|
|
268
|
-
|
|
276
|
+
return {
|
|
277
|
+
data,
|
|
278
|
+
schema: entry.schema,
|
|
279
|
+
sourceUri,
|
|
280
|
+
targetUri,
|
|
281
|
+
};
|
|
282
|
+
})
|
|
283
|
+
.filter((object) => !existingIds.has(object.data.id)); // TODO(dmaretskyi): This dissallows updating existing objects.
|
|
284
|
+
|
|
285
|
+
// TODO(dmaretskyi): Use ref resolver.
|
|
286
|
+
const dbObjects = yield* Effect.promise(() => db.query(Query.select(Filter.id(...existingIds))).run());
|
|
287
|
+
const feedObjects = feed && existingIds.size > 0 ? yield* Feed.runQuery(feed, Filter.id(...existingIds)) : [];
|
|
288
|
+
const objects = [...dbObjects, ...feedObjects].filter(isNonNullable);
|
|
289
|
+
|
|
290
|
+
// TODO(dmaretskyi): Returns everything if IDs are empty!
|
|
291
|
+
log.info('objects', { dbObjects, feedObjects, existingIds });
|
|
292
|
+
const missing = Array.from(existingIds).filter((id) => !objects.some((object) => object.id === id));
|
|
293
|
+
if (missing.length > 0) {
|
|
294
|
+
throw new Error(`Object IDs do not point to existing objects: ${missing.join(', ')}`);
|
|
295
|
+
}
|
|
269
296
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
297
|
+
return res.flatMap(({ data, schema, sourceUri, targetUri }) => {
|
|
298
|
+
let skip = false;
|
|
299
|
+
if (sourceUri) {
|
|
300
|
+
const id = EchoURI.getObjectId(sourceUri);
|
|
301
|
+
const obj = objects.find((object) => object.id === id) ?? (id ? enitties.get(id) : undefined);
|
|
302
|
+
if (obj) {
|
|
303
|
+
data[RelationSourceId] = obj;
|
|
304
|
+
} else {
|
|
305
|
+
skip = true;
|
|
274
306
|
}
|
|
275
|
-
const targetDxn = resolveId(data.target);
|
|
276
|
-
if (!targetDxn) {
|
|
277
|
-
log.warn('target not found', { target: data.target });
|
|
278
|
-
}
|
|
279
|
-
delete data.source;
|
|
280
|
-
delete data.target;
|
|
281
|
-
data[RelationSourceDXNId] = sourceDxn;
|
|
282
|
-
data[RelationTargetDXNId] = targetDxn;
|
|
283
307
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
// TODO(dmaretskyi): Use ref resolver.
|
|
293
|
-
const dbObjects = await db.query(Query.select(Filter.id(...existingIds))).run();
|
|
294
|
-
const queueObjects = (await queue?.getObjectsById([...existingIds])) ?? [];
|
|
295
|
-
const objects = [...dbObjects, ...queueObjects].filter(isNonNullable);
|
|
296
|
-
|
|
297
|
-
// TODO(dmaretskyi): Returns everything if IDs are empty!
|
|
298
|
-
log.info('objects', { dbObjects, queueObjects, existingIds });
|
|
299
|
-
const missing = Array.from(existingIds).filter((id) => !objects.some((object) => object.id === id));
|
|
300
|
-
if (missing.length > 0) {
|
|
301
|
-
throw new Error(`Object IDs do not point to existing objects: ${missing.join(', ')}`);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
return res.flatMap(({ data, schema }) => {
|
|
305
|
-
let skip = false;
|
|
306
|
-
if (RelationSourceDXNId in data) {
|
|
307
|
-
const id = (data[RelationSourceDXNId] as DXN).asEchoDXN()?.echoId;
|
|
308
|
-
const obj = objects.find((object) => object.id === id) ?? enitties.get(id!);
|
|
309
|
-
if (obj) {
|
|
310
|
-
delete data[RelationSourceDXNId];
|
|
311
|
-
data[RelationSourceId] = obj;
|
|
312
|
-
} else {
|
|
313
|
-
skip = true;
|
|
308
|
+
if (targetUri) {
|
|
309
|
+
const id = EchoURI.getObjectId(targetUri);
|
|
310
|
+
const obj = objects.find((object) => object.id === id) ?? (id ? enitties.get(id) : undefined);
|
|
311
|
+
if (obj) {
|
|
312
|
+
data[RelationTargetId] = obj;
|
|
313
|
+
} else {
|
|
314
|
+
skip = true;
|
|
315
|
+
}
|
|
314
316
|
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
if (obj) {
|
|
320
|
-
delete data[RelationTargetDXNId];
|
|
321
|
-
data[RelationTargetId] = obj;
|
|
322
|
-
} else {
|
|
323
|
-
skip = true;
|
|
317
|
+
if (!skip) {
|
|
318
|
+
const obj = createObject(schema, data);
|
|
319
|
+
enitties.set(obj.id, obj);
|
|
320
|
+
return [obj];
|
|
324
321
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const obj = createObject(schema, data);
|
|
328
|
-
enitties.set(obj.id, obj);
|
|
329
|
-
return [obj];
|
|
330
|
-
}
|
|
331
|
-
return [];
|
|
322
|
+
return [];
|
|
323
|
+
});
|
|
332
324
|
});
|
|
333
|
-
};
|
|
334
325
|
|
|
335
326
|
const SoftRef = Schema.Struct({
|
|
336
327
|
'/': Schema.String,
|
package/src/errors.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { BaseError } from '@dxos/errors';
|
|
6
|
-
import {
|
|
6
|
+
import { type EchoURI } from '@dxos/keys';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Agent could not execute prompt.
|
|
@@ -13,8 +13,8 @@ export class PromptError extends BaseError.extend('PromptError') {
|
|
|
13
13
|
message: string,
|
|
14
14
|
context: {
|
|
15
15
|
description?: string;
|
|
16
|
-
prompt?:
|
|
17
|
-
chat?:
|
|
16
|
+
prompt?: EchoURI.EchoURI;
|
|
17
|
+
chat?: EchoURI.EchoURI;
|
|
18
18
|
},
|
|
19
19
|
) {
|
|
20
20
|
super({
|
|
@@ -17,6 +17,7 @@ export const AgentPrompt = Operation.make({
|
|
|
17
17
|
key: 'org.dxos.function.prompt',
|
|
18
18
|
name: 'Run Routine',
|
|
19
19
|
description: 'Agentic worker that executes a provided prompt using blueprints and tools.',
|
|
20
|
+
icon: 'ph--brain--regular',
|
|
20
21
|
},
|
|
21
22
|
input: Schema.Struct({
|
|
22
23
|
prompt: Ref.Ref(Routine.Routine),
|
|
@@ -29,8 +30,8 @@ export const AgentPrompt = Operation.make({
|
|
|
29
30
|
/**
|
|
30
31
|
* @default @anthropic/claude-opus-4-6
|
|
31
32
|
*/
|
|
32
|
-
|
|
33
33
|
model: Schema.optional(ModelName),
|
|
34
|
+
|
|
34
35
|
/**
|
|
35
36
|
* Input object or data.
|
|
36
37
|
* References get auto-resolved.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"conversations":[{"parameters":{"model":"@anthropic/claude-opus-4-6","stream":true,"tools":[{"name":"completeJob","inputSchema":{"type":"object","required":[],"properties":{"success":{"$id":"/schemas/any","title":"any"},"failure":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Short message describing the error."},"description":{"type":"string","description":"Optional longer message describing in detail what went wrong"}},"additionalProperties":false}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"You are an agent running in the non-interactive mode.\nThe user is unable to see what you are doing, and cannot answer any questions.\nDo not ask questions.\nComplete the task before you, and at the end call [completeJob] with the output.\nIf you are unable to complete the task, call [completeJob] with the failure reason.\nIf no output is required, call [completeJob] with an empty object: {}\nDo not stop until you call [completeJob].","options":{}},{"role":"user","content":"Reply with a single word: ack.\n<input>{}</input>","options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"
|
|
1
|
+
{"conversations":[{"parameters":{"model":"@anthropic/claude-opus-4-6","stream":true,"tools":[{"name":"completeJob","inputSchema":{"type":"object","required":[],"properties":{"success":{"$id":"/schemas/any","title":"any"},"failure":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Short message describing the error."},"description":{"type":"string","description":"Optional longer message describing in detail what went wrong"}},"additionalProperties":false}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"You are an agent running in the non-interactive mode.\nThe user is unable to see what you are doing, and cannot answer any questions.\nDo not ask questions.\nComplete the task before you, and at the end call [completeJob] with the output.\nIf you are unable to complete the task, call [completeJob] with the failure reason.\nIf no output is required, call [completeJob] with an empty object: {}\nDo not stop until you call [completeJob].","options":{}},{"role":"user","content":"Reply with a single word: ack.\n<input>{}</input>","options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01RWJEaimVWQv6G7KQb7nyxH","modelId":"claude-opus-4-6","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"reasoning-start","id":"0","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"The","metadata":{}},{"type":"reasoning-delta","id":"0","delta":" user wants me to reply with a single word \"ack\" and complete the job.","metadata":{}},{"type":"reasoning-delta","id":"0","delta":"","metadata":{"anthropic":{"type":"thinking","signature":"Eo4CCmMIDhgCKkDmvWuElJmvgQqKv/OM8h45Qm9vFiau8OtHTiKeFGzABfFt5k5Oc9XiWXg1jeCrSXFmAcI3XEaKXp6jF8PCj/O0Mg9jbGF1ZGUtb3B1cy00LTY4AEIIdGhpbmtpbmcSDDUOa8R7GBJZ9thEWRoMUDN6YGnPA72hCBI6IjCaJjLZWMigJgV2aqiRxRvBlfCCyrN2xF9Pz4UxQh/uotfEKFGHalNCRUoFOaLl8mIqWaDJIFdnK5kYd+6xF9Ivz65Ynb0Mjzt1o53BQoNtRHIf/VhdR8BKSaEv5NlOuPwd8zAoPCS4A+XXS0zq3y0oP48gxYnMoQUaWlabu1n/AgOntuEJj1yZp1uRGAE="}}},{"type":"reasoning-end","id":"0","metadata":{}},{"type":"tool-params-start","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","name":"completeJob","providerExecuted":false,"metadata":{}},{"type":"tool-params-delta","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","delta":"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","delta":"{\"success\"","metadata":{}},{"type":"tool-params-delta","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","delta":": ","metadata":{}},{"type":"tool-params-delta","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","delta":"\"a","metadata":{}},{"type":"tool-params-delta","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","delta":"ck\"}","metadata":{}},{"type":"tool-params-end","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","metadata":{}},{"type":"finish","reason":"tool-calls","usage":{"inputTokens":757,"outputTokens":89,"totalTokens":846},"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":757,"output_tokens":9,"server_tool_use":null,"service_tier":"standard"}}}}]},{"parameters":{"model":"@anthropic/claude-opus-4-6","stream":true,"tools":[{"name":"completeJob","inputSchema":{"type":"object","required":[],"properties":{"success":{"$id":"/schemas/any","title":"any"},"failure":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"Short message describing the error."},"description":{"type":"string","description":"Optional longer message describing in detail what went wrong"}},"additionalProperties":false}},"additionalProperties":false}}]},"prompt":{"content":[{"role":"system","content":"You are an agent running in the non-interactive mode.\nThe user is unable to see what you are doing, and cannot answer any questions.\nDo not ask questions.\nComplete the task before you, and at the end call [completeJob] with the output.\nIf you are unable to complete the task, call [completeJob] with the failure reason.\nIf no output is required, call [completeJob] with an empty object: {}\nDo not stop until you call [completeJob].","options":{}},{"role":"user","content":"Reply with a single word: ack.\n<input>{}</input>","options":{}},{"role":"assistant","content":[{"type":"reasoning","text":"The user wants me to reply with a single word \"ack\" and complete the job.","options":{}},{"type":"tool-call","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","name":"completeJob","params":{"success":"ack"},"providerExecuted":false,"options":{}}],"options":{}},{"role":"tool","content":[{"type":"tool-result","id":"toolu_01BTVEaU6r95t7x3gq8fsC8B","name":"completeJob","isFailure":false,"result":{},"providerExecuted":false,"options":{}}],"options":{"anthropic":{"cacheControl":{"ttl":"5m","type":"ephemeral"}}}}]},"response":[{"type":"response-metadata","id":"msg_01PT5i54k8QVpY13gXEJ9o43","modelId":"claude-opus-4-6","timestamp":"1970-01-01T00:00:00.000Z","metadata":{}},{"type":"finish","reason":"stop","usage":{"inputTokens":824,"outputTokens":2,"totalTokens":826},"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":824,"output_tokens":2,"server_tool_use":null,"service_tier":"standard"}}}}]}]}
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
import { describe, expect, it } from '@effect/vitest';
|
|
6
6
|
import * as Effect from 'effect/Effect';
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { AiContext } from '@dxos/assistant';
|
|
9
9
|
import { Routine, Operation, OperationHandlerSet } from '@dxos/compute';
|
|
10
|
-
import { Database, Feed, Obj, Ref } from '@dxos/echo';
|
|
10
|
+
import { Database, Feed, Filter, Obj, Ref } from '@dxos/echo';
|
|
11
11
|
import { TestHelpers } from '@dxos/effect/testing';
|
|
12
|
-
import { QueueService } from '@dxos/functions';
|
|
13
12
|
import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
|
|
14
13
|
import { ObjectId } from '@dxos/keys';
|
|
15
14
|
import { Text } from '@dxos/schema';
|
|
@@ -25,13 +24,13 @@ const operationHandlerSet = OperationHandlerSet.make(defaultAgentPrompt);
|
|
|
25
24
|
|
|
26
25
|
const TestLayer = AssistantTestLayer({
|
|
27
26
|
operationHandlers: operationHandlerSet,
|
|
28
|
-
types: [Chat.Chat, Message.Message,
|
|
27
|
+
types: [Chat.Chat, Message.Message, AiContext.Binding, Text.Text],
|
|
29
28
|
aiServicePreset: 'edge-remote',
|
|
30
29
|
});
|
|
31
30
|
|
|
32
|
-
const
|
|
33
|
-
Effect.
|
|
34
|
-
const items =
|
|
31
|
+
const countFeedMessages = (feed: Feed.Feed) =>
|
|
32
|
+
Effect.gen(function* () {
|
|
33
|
+
const items = yield* Feed.runQuery(feed, Filter.everything());
|
|
35
34
|
return items.filter(Obj.instanceOf(Message.Message)).length;
|
|
36
35
|
});
|
|
37
36
|
|
|
@@ -41,9 +40,7 @@ describe('Agent prompt', () => {
|
|
|
41
40
|
Effect.fnUntraced(
|
|
42
41
|
function* (_) {
|
|
43
42
|
const feed = yield* Database.add(Feed.make());
|
|
44
|
-
const
|
|
45
|
-
const queue = yield* QueueService.getQueue<Message.Message | ContextBinding>(queueDxn);
|
|
46
|
-
const messageCountBefore = yield* countQueueMessages(queue);
|
|
43
|
+
const messageCountBefore = yield* countFeedMessages(feed);
|
|
47
44
|
|
|
48
45
|
const chat = yield* Database.add(
|
|
49
46
|
Chat.make({
|
|
@@ -68,7 +65,7 @@ describe('Agent prompt', () => {
|
|
|
68
65
|
chat: Ref.make(chat),
|
|
69
66
|
});
|
|
70
67
|
|
|
71
|
-
const messageCountAfter = yield*
|
|
68
|
+
const messageCountAfter = yield* countFeedMessages(feed);
|
|
72
69
|
|
|
73
70
|
expect(messageCountAfter).toBeGreaterThan(messageCountBefore);
|
|
74
71
|
expect(result).toBe('ack');
|
|
@@ -100,7 +100,7 @@ export default AgentPrompt.pipe(
|
|
|
100
100
|
});
|
|
101
101
|
|
|
102
102
|
const runtime = yield* Effect.runtime<Feed.FeedService>();
|
|
103
|
-
const session = yield* acquireReleaseResource(() => new AiSession({ feed, runtime }));
|
|
103
|
+
const session = yield* acquireReleaseResource(() => new AiSession.Session({ feed, runtime }));
|
|
104
104
|
|
|
105
105
|
yield* Effect.promise(() =>
|
|
106
106
|
session.context.bind({
|
|
@@ -213,7 +213,7 @@ const ToolExecutionService = ({ feed }: ToolExecutionServiceOptions) =>
|
|
|
213
213
|
log('invoking operation', { operationDef, input });
|
|
214
214
|
const result = yield* operationInvoker
|
|
215
215
|
.invoke(operationDef, input, {
|
|
216
|
-
conversation: Obj.
|
|
216
|
+
conversation: Obj.getURI(feed),
|
|
217
217
|
})
|
|
218
218
|
.pipe(Effect.orDie);
|
|
219
219
|
log('result', { result });
|
package/src/sync/sync.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
|
-
import { Filter, Obj, Query, Ref } from '@dxos/echo';
|
|
8
|
-
import { Database } from '@dxos/echo';
|
|
7
|
+
import { Database, Filter, Obj, Query, Ref } from '@dxos/echo';
|
|
9
8
|
import { failedInvariant } from '@dxos/invariant';
|
|
9
|
+
import { EchoURI } from '@dxos/keys';
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -39,22 +39,23 @@ export const syncObjects: (
|
|
|
39
39
|
if (!ref.target) {
|
|
40
40
|
continue;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
const targetUri = EchoURI.tryParse(Obj.getURI(ref.target));
|
|
43
|
+
if (targetUri && EchoURI.isLocal(targetUri)) {
|
|
43
44
|
// obj not persisted to db.
|
|
44
45
|
const [target] = yield* syncObjects([ref.target], { foreignKeyId });
|
|
45
46
|
(obj as any)[key] = Ref.make(target);
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
const
|
|
50
|
+
const type = Obj.getType(obj) ?? failedInvariant('No type.');
|
|
50
51
|
const foreignId = Obj.getKeys(obj, foreignKeyId)[0]?.id ?? failedInvariant('No foreign key.');
|
|
51
52
|
const [existing] = yield* Database.runQuery(
|
|
52
|
-
Query.select(Filter.foreignKeys(
|
|
53
|
+
Query.select(Filter.foreignKeys(type, [{ source: foreignKeyId, id: foreignId }])),
|
|
53
54
|
);
|
|
54
55
|
log('sync object', {
|
|
55
56
|
type: Obj.getTypename(obj),
|
|
56
57
|
foreignId,
|
|
57
|
-
existing: existing ? Obj.
|
|
58
|
+
existing: existing ? Obj.getURI(existing) : undefined,
|
|
58
59
|
});
|
|
59
60
|
if (!existing) {
|
|
60
61
|
yield* Database.add(obj);
|
package/src/testing/plugins.tsx
CHANGED
|
@@ -7,20 +7,15 @@ import React from 'react';
|
|
|
7
7
|
|
|
8
8
|
import { Capabilities, Capability } from '@dxos/app-framework';
|
|
9
9
|
import { Surface } from '@dxos/app-framework/ui';
|
|
10
|
-
import { Format, type Obj, Type } from '@dxos/echo';
|
|
10
|
+
import { DXN, Format, type Obj, Type } from '@dxos/echo';
|
|
11
11
|
import { Card } from '@dxos/react-ui';
|
|
12
12
|
import { Syntax } from '@dxos/react-ui-syntax-highlighter';
|
|
13
13
|
|
|
14
14
|
export const MapSchema = Schema.Struct({
|
|
15
15
|
coordinates: Format.GeoPoint,
|
|
16
|
-
}).pipe(
|
|
17
|
-
Type.object({
|
|
18
|
-
typename: 'com.example.type.map',
|
|
19
|
-
version: '0.1.0',
|
|
20
|
-
}),
|
|
21
|
-
);
|
|
16
|
+
}).pipe(Type.makeObject(DXN.make('com.example.type.map', '0.1.0')));
|
|
22
17
|
|
|
23
|
-
export type MapSchema =
|
|
18
|
+
export type MapSchema = Type.InstanceType<typeof MapSchema>;
|
|
24
19
|
|
|
25
20
|
// TODO(burdon): Move to ECHO def.
|
|
26
21
|
export type ArtifactsContext = {
|
|
@@ -46,13 +41,13 @@ export const capabilities: Capability.Any[] = [
|
|
|
46
41
|
role: 'card--content',
|
|
47
42
|
filter: (data: any): data is any => isImage(data.value),
|
|
48
43
|
component: ({ data }) => (
|
|
49
|
-
<Card.
|
|
44
|
+
<Card.Body>
|
|
50
45
|
<img
|
|
51
46
|
className='grow object-cover'
|
|
52
47
|
src={`data:image/jpeg;base64,${data.value.source.data}`}
|
|
53
48
|
alt={data.value.prompt ?? `Generated image [id=${data.value.id}]`}
|
|
54
49
|
/>
|
|
55
|
-
</Card.
|
|
50
|
+
</Card.Body>
|
|
56
51
|
),
|
|
57
52
|
}),
|
|
58
53
|
),
|
|
@@ -61,9 +56,9 @@ export const capabilities: Capability.Any[] = [
|
|
|
61
56
|
Surface.create({
|
|
62
57
|
id: 'plugin-default',
|
|
63
58
|
role: 'card--content',
|
|
64
|
-
position: '
|
|
59
|
+
position: 'last',
|
|
65
60
|
component: ({ data }) => (
|
|
66
|
-
<Card.
|
|
61
|
+
<Card.Body>
|
|
67
62
|
<Syntax.Root data={data}>
|
|
68
63
|
<Syntax.Content>
|
|
69
64
|
<Syntax.Filter />
|
|
@@ -72,7 +67,7 @@ export const capabilities: Capability.Any[] = [
|
|
|
72
67
|
</Syntax.Viewport>
|
|
73
68
|
</Syntax.Content>
|
|
74
69
|
</Syntax.Root>
|
|
75
|
-
</Card.
|
|
70
|
+
</Card.Body>
|
|
76
71
|
),
|
|
77
72
|
}),
|
|
78
73
|
),
|