@dxos/assistant-toolkit 0.10.0 → 0.11.0
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/chunk-Chat.mjs +144 -0
- package/dist/lib/chunk-Chat.mjs.map +1 -0
- package/dist/lib/chunk-Memory.mjs +19 -0
- package/dist/lib/chunk-Memory.mjs.map +1 -0
- package/dist/lib/{neutral/agent-rules-KWCBKJ5W.mjs → chunk-agent-rules.mjs} +8 -15
- package/dist/lib/chunk-agent-rules.mjs.map +1 -0
- package/dist/lib/chunk-agent.mjs +45 -0
- package/dist/lib/chunk-agent.mjs.map +1 -0
- package/dist/lib/chunk-artifact-add.mjs +31 -0
- package/dist/lib/chunk-artifact-add.mjs.map +1 -0
- package/dist/lib/chunk-artifact-list.mjs +23 -0
- package/dist/lib/chunk-artifact-list.mjs.map +1 -0
- package/dist/lib/chunk-context-add.mjs +16 -0
- package/dist/lib/chunk-context-add.mjs.map +1 -0
- package/dist/lib/chunk-context-remove.mjs +16 -0
- package/dist/lib/chunk-context-remove.mjs.map +1 -0
- package/dist/lib/chunk-create-agent.mjs +23 -0
- package/dist/lib/chunk-create-agent.mjs.map +1 -0
- package/dist/lib/chunk-definitions.mjs +52 -0
- package/dist/lib/chunk-definitions.mjs.map +1 -0
- package/dist/lib/chunk-definitions2.mjs +56 -0
- package/dist/lib/chunk-definitions2.mjs.map +1 -0
- package/dist/lib/chunk-definitions3.mjs +24 -0
- package/dist/lib/chunk-definitions3.mjs.map +1 -0
- package/dist/lib/chunk-delete.mjs +14 -0
- package/dist/lib/chunk-delete.mjs.map +1 -0
- package/dist/lib/chunk-enable-skills.mjs +39 -0
- package/dist/lib/chunk-enable-skills.mjs.map +1 -0
- package/dist/lib/chunk-fetch-messages.mjs +113 -0
- package/dist/lib/chunk-fetch-messages.mjs.map +1 -0
- package/dist/lib/chunk-fetch.mjs +20 -0
- package/dist/lib/chunk-fetch.mjs.map +1 -0
- package/dist/lib/chunk-get-context.mjs +55 -0
- package/dist/lib/chunk-get-context.mjs.map +1 -0
- package/dist/lib/chunk-get-current-date.mjs +17 -0
- package/dist/lib/chunk-get-current-date.mjs.map +1 -0
- package/dist/lib/chunk-load.mjs +13 -0
- package/dist/lib/chunk-load.mjs.map +1 -0
- package/dist/lib/chunk-object-create.mjs +42 -0
- package/dist/lib/chunk-object-create.mjs.map +1 -0
- package/dist/lib/chunk-object-delete.mjs +14 -0
- package/dist/lib/chunk-object-delete.mjs.map +1 -0
- package/dist/lib/chunk-object-update.mjs +19 -0
- package/dist/lib/chunk-object-update.mjs.map +1 -0
- package/dist/lib/chunk-operations.mjs +714 -0
- package/dist/lib/chunk-operations.mjs.map +1 -0
- package/dist/lib/chunk-plan-reminder.mjs +80 -0
- package/dist/lib/chunk-plan-reminder.mjs.map +1 -0
- package/dist/lib/chunk-query-skills.mjs +12 -0
- package/dist/lib/chunk-query-skills.mjs.map +1 -0
- package/dist/lib/chunk-query.mjs +36 -0
- package/dist/lib/chunk-query.mjs.map +1 -0
- package/dist/lib/chunk-query2.mjs +18 -0
- package/dist/lib/chunk-query2.mjs.map +1 -0
- package/dist/lib/chunk-relation-create.mjs +41 -0
- package/dist/lib/chunk-relation-create.mjs.map +1 -0
- package/dist/lib/chunk-relation-delete.mjs +14 -0
- package/dist/lib/chunk-relation-delete.mjs.map +1 -0
- package/dist/lib/chunk-relay.mjs +76 -0
- package/dist/lib/chunk-relay.mjs.map +1 -0
- package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
- package/dist/lib/chunk-run-instructions.mjs +145 -0
- package/dist/lib/chunk-run-instructions.mjs.map +1 -0
- package/dist/lib/chunk-save.mjs +17 -0
- package/dist/lib/chunk-save.mjs.map +1 -0
- package/dist/lib/chunk-schema-add.mjs +19 -0
- package/dist/lib/chunk-schema-add.mjs.map +1 -0
- package/dist/lib/chunk-schema-list.mjs +29 -0
- package/dist/lib/chunk-schema-list.mjs.map +1 -0
- package/dist/lib/chunk-set-alarm.mjs +55 -0
- package/dist/lib/chunk-set-alarm.mjs.map +1 -0
- package/dist/lib/chunk-sync-automation.mjs +130 -0
- package/dist/lib/chunk-sync-automation.mjs.map +1 -0
- package/dist/lib/chunk-sync-issues.mjs +127 -0
- package/dist/lib/chunk-sync-issues.mjs.map +1 -0
- package/dist/lib/chunk-sync.mjs +91 -0
- package/dist/lib/chunk-sync.mjs.map +1 -0
- package/dist/lib/chunk-tag-add.mjs +14 -0
- package/dist/lib/chunk-tag-add.mjs.map +1 -0
- package/dist/lib/chunk-tag-remove.mjs +14 -0
- package/dist/lib/chunk-tag-remove.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +198 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/chunk-update-tasks.mjs +34 -0
- package/dist/lib/chunk-update-tasks.mjs.map +1 -0
- package/dist/lib/index.mjs +614 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/testing.mjs +102 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/types/src/skills/agent/operations/definitions.d.ts +16 -46
- package/dist/types/src/skills/agent/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/skills/agent/operations/get-context.test.d.ts +2 -0
- package/dist/types/src/skills/agent/operations/get-context.test.d.ts.map +1 -0
- package/dist/types/src/skills/agent/operations/index.d.ts.map +1 -1
- package/dist/types/src/skills/agent/operations/relay.d.ts +11 -0
- package/dist/types/src/skills/agent/operations/relay.d.ts.map +1 -0
- package/dist/types/src/skills/agent/operations/relay.test.d.ts +2 -0
- package/dist/types/src/skills/agent/operations/relay.test.d.ts.map +1 -0
- package/dist/types/src/skills/agent/skill.d.ts.map +1 -1
- package/dist/types/src/skills/agent-wizard/operations/definitions.d.ts +4 -1
- package/dist/types/src/skills/agent-wizard/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/skills/agent-wizard/operations/sync-automation.d.ts +26 -0
- package/dist/types/src/skills/agent-wizard/operations/sync-automation.d.ts.map +1 -0
- package/dist/types/src/skills/agent-wizard/operations/sync-automation.test.d.ts +2 -0
- package/dist/types/src/skills/agent-wizard/operations/sync-automation.test.d.ts.map +1 -0
- package/dist/types/src/skills/agent-wizard/skill.d.ts.map +1 -1
- package/dist/types/src/skills/database/operations/context-add.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/context-add.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/context-remove.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/context-remove.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/definitions.d.ts +7 -2
- package/dist/types/src/skills/database/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/skills/database/operations/load.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/load.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/object-create.d.ts +4 -1
- package/dist/types/src/skills/database/operations/object-create.d.ts.map +1 -1
- package/dist/types/src/skills/database/operations/object-create.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/object-create.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/object-delete.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/object-delete.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/object-update.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/object-update.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/query.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/query.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/relation-create.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/relation-create.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/schema-add.d.ts +3 -1
- package/dist/types/src/skills/database/operations/schema-add.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/schema-add.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/schema-list.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/schema-list.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/tag-add.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/tag-add.test.d.ts.map +1 -0
- package/dist/types/src/skills/database/operations/tag-remove.test.d.ts +2 -0
- package/dist/types/src/skills/database/operations/tag-remove.test.d.ts.map +1 -0
- package/dist/types/src/skills/delegation/operations/delegate-task.d.ts +6 -5
- package/dist/types/src/skills/delegation/operations/delegate-task.d.ts.map +1 -1
- package/dist/types/src/skills/index.d.ts +1 -0
- package/dist/types/src/skills/index.d.ts.map +1 -1
- package/dist/types/src/skills/linear/operations/sync-issues.d.ts.map +1 -1
- package/dist/types/src/skills/memory/operations/delete.test.d.ts +2 -0
- package/dist/types/src/skills/memory/operations/delete.test.d.ts.map +1 -0
- package/dist/types/src/skills/memory/operations/query.test.d.ts +2 -0
- package/dist/types/src/skills/memory/operations/query.test.d.ts.map +1 -0
- package/dist/types/src/skills/memory/operations/save.test.d.ts +2 -0
- package/dist/types/src/skills/memory/operations/save.test.d.ts.map +1 -0
- package/dist/types/src/skills/planning/operations/definitions.d.ts +1 -3
- package/dist/types/src/skills/planning/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/skills/planning/operations/plan-reminder.d.ts +7 -6
- package/dist/types/src/skills/planning/operations/plan-reminder.d.ts.map +1 -1
- package/dist/types/src/skills/planning/operations/plan-reminder.test.d.ts +2 -0
- package/dist/types/src/skills/planning/operations/plan-reminder.test.d.ts.map +1 -0
- package/dist/types/src/skills/planning/operations/update-tasks.d.ts +3 -1
- package/dist/types/src/skills/planning/operations/update-tasks.d.ts.map +1 -1
- package/dist/types/src/skills/project/index.d.ts +3 -0
- package/dist/types/src/skills/project/index.d.ts.map +1 -0
- package/dist/types/src/skills/project/operations/artifact-add.d.ts +5 -0
- package/dist/types/src/skills/project/operations/artifact-add.d.ts.map +1 -0
- package/dist/types/src/skills/project/operations/artifact-list.d.ts +5 -0
- package/dist/types/src/skills/project/operations/artifact-list.d.ts.map +1 -0
- package/dist/types/src/skills/project/operations/definitions.d.ts +23 -0
- package/dist/types/src/skills/project/operations/definitions.d.ts.map +1 -0
- package/dist/types/src/skills/project/operations/index.d.ts +4 -0
- package/dist/types/src/skills/project/operations/index.d.ts.map +1 -0
- package/dist/types/src/skills/project/skill.d.ts +4 -0
- package/dist/types/src/skills/project/skill.d.ts.map +1 -0
- package/dist/types/src/skills/project/skill.test.d.ts.map +1 -0
- package/dist/types/src/skills/skill-manager/skill.d.ts.map +1 -1
- package/dist/types/src/supervisor/delegation-strategy.d.ts +5 -5
- package/dist/types/src/supervisor/delegation-strategy.d.ts.map +1 -1
- package/dist/types/src/supervisor/delegation-strategy.test.d.ts +2 -0
- package/dist/types/src/supervisor/delegation-strategy.test.d.ts.map +1 -0
- package/dist/types/src/sync/sync.test.d.ts +2 -0
- package/dist/types/src/sync/sync.test.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/operations.d.ts +7 -0
- package/dist/types/src/testing/operations.d.ts.map +1 -0
- package/dist/types/src/types/Agent.d.ts +28 -31
- package/dist/types/src/types/Agent.d.ts.map +1 -1
- package/dist/types/src/types/Chat.d.ts +28 -14
- package/dist/types/src/types/Chat.d.ts.map +1 -1
- package/dist/types/src/types/Chat.test.d.ts +2 -0
- package/dist/types/src/types/Chat.test.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +1 -2
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +30 -29
- package/src/operations/run-instructions.test.ts +26 -34
- package/src/operations/skill-resolution.test.ts +6 -1
- package/src/skills/agent/operations/definitions.ts +18 -62
- package/src/skills/agent/operations/get-context.test.ts +81 -0
- package/src/skills/agent/operations/get-context.ts +9 -36
- package/src/skills/agent/operations/index.ts +1 -3
- package/src/skills/agent/operations/relay.test.ts +63 -0
- package/src/skills/agent/operations/relay.ts +124 -0
- package/src/skills/agent/skill.ts +3 -15
- package/src/skills/agent-wizard/operations/create-agent.ts +3 -3
- package/src/skills/agent-wizard/operations/definitions.ts +19 -4
- package/src/skills/agent-wizard/operations/index.ts +1 -1
- package/src/skills/agent-wizard/operations/sync-automation.test.ts +103 -0
- package/src/skills/agent-wizard/operations/sync-automation.ts +205 -0
- package/src/skills/agent-wizard/skill.ts +9 -10
- package/src/skills/alarm/skill.test.ts +2 -2
- package/src/skills/browser/skill.test.ts +4 -4
- package/src/skills/database/operations/context-add.test.ts +46 -0
- package/src/skills/database/operations/context-remove.test.ts +46 -0
- package/src/skills/database/operations/definitions.ts +23 -7
- package/src/skills/database/operations/load.test.ts +38 -0
- package/src/skills/database/operations/object-create.test.ts +116 -0
- package/src/skills/database/operations/object-create.ts +13 -2
- package/src/skills/database/operations/object-delete.test.ts +37 -0
- package/src/skills/database/operations/object-update.test.ts +39 -0
- package/src/skills/database/operations/query.test.ts +128 -0
- package/src/skills/database/operations/relation-create.test.ts +46 -0
- package/src/skills/database/operations/schema-add.test.ts +79 -0
- package/src/skills/database/operations/schema-list.test.ts +42 -0
- package/src/skills/database/operations/tag-add.test.ts +41 -0
- package/src/skills/database/operations/tag-remove.test.ts +43 -0
- package/src/skills/delegation/operations/delegate-task.test.ts +51 -36
- package/src/skills/delegation/operations/delegate-task.ts +31 -48
- package/src/skills/discord/operations/fetch-messages.test.ts +2 -2
- package/src/skills/github/operations/fetch-prs.ts +1 -1
- package/src/skills/index.ts +1 -0
- package/src/skills/linear/operations/linear.test.ts +1 -1
- package/src/skills/linear/operations/sync-issues.ts +6 -23
- package/src/skills/memory/operations/delete.test.ts +37 -0
- package/src/skills/memory/operations/query.test.ts +76 -0
- package/src/skills/memory/operations/save.test.ts +43 -0
- package/src/skills/planning/operations/definitions.ts +9 -6
- package/src/skills/planning/operations/plan-reminder.test.ts +123 -0
- package/src/skills/planning/operations/plan-reminder.ts +49 -31
- package/src/skills/planning/operations/update-tasks.md +23 -22
- package/src/skills/planning/operations/update-tasks.test.ts +31 -17
- package/src/skills/planning/operations/update-tasks.ts +17 -25
- package/src/skills/project/index.ts +6 -0
- package/src/skills/project/operations/artifact-add.ts +47 -0
- package/src/skills/project/operations/artifact-list.ts +41 -0
- package/src/skills/project/operations/definitions.ts +63 -0
- package/src/skills/project/operations/index.ts +12 -0
- package/src/skills/project/skill.test.ts +78 -0
- package/src/skills/project/skill.ts +42 -0
- package/src/skills/skill-manager/operations/definitions.ts +1 -1
- package/src/skills/skill-manager/skill.test.ts +1 -1
- package/src/skills/skill-manager/skill.ts +7 -5
- package/src/skills/websearch/skill.test.ts +2 -2
- package/src/supervisor/delegation-strategy.test.ts +129 -0
- package/src/supervisor/delegation-strategy.ts +92 -56
- package/src/sync/sync.test.ts +95 -0
- package/src/sync/sync.ts +5 -3
- package/src/testing/index.ts +1 -0
- package/src/testing/operations.ts +65 -0
- package/src/types/Agent.test.ts +36 -66
- package/src/types/Agent.ts +108 -137
- package/src/types/Chat.test.ts +234 -0
- package/src/types/Chat.ts +80 -26
- package/src/types/index.ts +1 -2
- package/dist/lib/neutral/add-artifact-5JNUYLCA.mjs +0 -24
- package/dist/lib/neutral/add-artifact-5JNUYLCA.mjs.map +0 -7
- package/dist/lib/neutral/agent-BFAYIBJI.mjs +0 -65
- package/dist/lib/neutral/agent-BFAYIBJI.mjs.map +0 -7
- package/dist/lib/neutral/agent-rules-KWCBKJ5W.mjs.map +0 -7
- package/dist/lib/neutral/chunk-3KA66YBF.mjs +0 -62
- package/dist/lib/neutral/chunk-3KA66YBF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-6SGNFL6I.mjs +0 -85
- package/dist/lib/neutral/chunk-6SGNFL6I.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BDTGFPM7.mjs +0 -113
- package/dist/lib/neutral/chunk-BDTGFPM7.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EPQCDGIV.mjs +0 -27
- package/dist/lib/neutral/chunk-EPQCDGIV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-H4W22FFJ.mjs +0 -232
- package/dist/lib/neutral/chunk-H4W22FFJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-JBTXZQ5G.mjs +0 -60
- package/dist/lib/neutral/chunk-JBTXZQ5G.mjs.map +0 -7
- package/dist/lib/neutral/chunk-JKOOA5OS.mjs +0 -97
- package/dist/lib/neutral/chunk-JKOOA5OS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-JTEBE7KA.mjs +0 -66
- package/dist/lib/neutral/chunk-JTEBE7KA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-KLFXJ2Z3.mjs +0 -36
- package/dist/lib/neutral/chunk-KLFXJ2Z3.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LBA5UOLF.mjs +0 -87
- package/dist/lib/neutral/chunk-LBA5UOLF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LL3MOQUZ.mjs +0 -120
- package/dist/lib/neutral/chunk-LL3MOQUZ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MFVIGJBW.mjs +0 -68
- package/dist/lib/neutral/chunk-MFVIGJBW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-PBARVBNJ.mjs +0 -86
- package/dist/lib/neutral/chunk-PBARVBNJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VJ5QBYM5.mjs +0 -61
- package/dist/lib/neutral/chunk-VJ5QBYM5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YQSQRSXG.mjs +0 -367
- package/dist/lib/neutral/chunk-YQSQRSXG.mjs.map +0 -7
- package/dist/lib/neutral/chunk-Z2HFOZXK.mjs +0 -191
- package/dist/lib/neutral/chunk-Z2HFOZXK.mjs.map +0 -7
- package/dist/lib/neutral/context-add-DZTPB3FK.mjs +0 -22
- package/dist/lib/neutral/context-add-DZTPB3FK.mjs.map +0 -7
- package/dist/lib/neutral/context-remove-XSBOM4VJ.mjs +0 -22
- package/dist/lib/neutral/context-remove-XSBOM4VJ.mjs.map +0 -7
- package/dist/lib/neutral/create-agent-5WTOFIEK.mjs +0 -35
- package/dist/lib/neutral/create-agent-5WTOFIEK.mjs.map +0 -7
- package/dist/lib/neutral/definitions-VRR5OGXI.mjs +0 -17
- package/dist/lib/neutral/definitions-VRR5OGXI.mjs.map +0 -7
- package/dist/lib/neutral/delegate-task-UX64NK4M.mjs +0 -13
- package/dist/lib/neutral/delegate-task-UX64NK4M.mjs.map +0 -7
- package/dist/lib/neutral/delete-IU7HPU3K.mjs +0 -19
- package/dist/lib/neutral/delete-IU7HPU3K.mjs.map +0 -7
- package/dist/lib/neutral/enable-skills-FHEJXQVB.mjs +0 -47
- package/dist/lib/neutral/enable-skills-FHEJXQVB.mjs.map +0 -7
- package/dist/lib/neutral/fetch-5LY25EBR.mjs +0 -24
- package/dist/lib/neutral/fetch-5LY25EBR.mjs.map +0 -7
- package/dist/lib/neutral/fetch-messages-CQMDI36G.mjs +0 -139
- package/dist/lib/neutral/fetch-messages-CQMDI36G.mjs.map +0 -7
- package/dist/lib/neutral/get-context-Q4YY6DRV.mjs +0 -77
- package/dist/lib/neutral/get-context-Q4YY6DRV.mjs.map +0 -7
- package/dist/lib/neutral/get-current-date-JR5F7ZS3.mjs +0 -17
- package/dist/lib/neutral/get-current-date-JR5F7ZS3.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -875
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/load-S6HC5TGX.mjs +0 -17
- package/dist/lib/neutral/load-S6HC5TGX.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/object-create-PVDQ62CG.mjs +0 -32
- package/dist/lib/neutral/object-create-PVDQ62CG.mjs.map +0 -7
- package/dist/lib/neutral/object-delete-3CSL6XI6.mjs +0 -18
- package/dist/lib/neutral/object-delete-3CSL6XI6.mjs.map +0 -7
- package/dist/lib/neutral/object-update-NIGMZINM.mjs +0 -28
- package/dist/lib/neutral/object-update-NIGMZINM.mjs.map +0 -7
- package/dist/lib/neutral/plan-reminder-N4X6JPBI.mjs +0 -88
- package/dist/lib/neutral/plan-reminder-N4X6JPBI.mjs.map +0 -7
- package/dist/lib/neutral/qualifier-5CIRZYX5.mjs +0 -91
- package/dist/lib/neutral/qualifier-5CIRZYX5.mjs.map +0 -7
- package/dist/lib/neutral/query-K4R7UHLU.mjs +0 -32
- package/dist/lib/neutral/query-K4R7UHLU.mjs.map +0 -7
- package/dist/lib/neutral/query-NCTCRYTD.mjs +0 -59
- package/dist/lib/neutral/query-NCTCRYTD.mjs.map +0 -7
- package/dist/lib/neutral/query-skills-7GQFSU4V.mjs +0 -17
- package/dist/lib/neutral/query-skills-7GQFSU4V.mjs.map +0 -7
- package/dist/lib/neutral/relation-create-QKXHTL7G.mjs +0 -34
- package/dist/lib/neutral/relation-create-QKXHTL7G.mjs.map +0 -7
- package/dist/lib/neutral/relation-delete-PDIWT2JX.mjs +0 -18
- package/dist/lib/neutral/relation-delete-PDIWT2JX.mjs.map +0 -7
- package/dist/lib/neutral/run-instructions-72ASH5EZ.mjs +0 -165
- package/dist/lib/neutral/run-instructions-72ASH5EZ.mjs.map +0 -7
- package/dist/lib/neutral/save-UYVRA4RS.mjs +0 -23
- package/dist/lib/neutral/save-UYVRA4RS.mjs.map +0 -7
- package/dist/lib/neutral/schema-add-5NOK2RWE.mjs +0 -25
- package/dist/lib/neutral/schema-add-5NOK2RWE.mjs.map +0 -7
- package/dist/lib/neutral/schema-list-BZUR5KMX.mjs +0 -37
- package/dist/lib/neutral/schema-list-BZUR5KMX.mjs.map +0 -7
- package/dist/lib/neutral/set-alarm-BD3NEYSU.mjs +0 -65
- package/dist/lib/neutral/set-alarm-BD3NEYSU.mjs.map +0 -7
- package/dist/lib/neutral/sync-issues-O76MCMD3.mjs +0 -166
- package/dist/lib/neutral/sync-issues-O76MCMD3.mjs.map +0 -7
- package/dist/lib/neutral/sync-triggers-YBTLPCUB.mjs +0 -138
- package/dist/lib/neutral/sync-triggers-YBTLPCUB.mjs.map +0 -7
- package/dist/lib/neutral/tag-add-L5WNOBYY.mjs +0 -18
- package/dist/lib/neutral/tag-add-L5WNOBYY.mjs.map +0 -7
- package/dist/lib/neutral/tag-remove-WV5RPE5W.mjs +0 -18
- package/dist/lib/neutral/tag-remove-WV5RPE5W.mjs.map +0 -7
- package/dist/lib/neutral/testing/index.mjs +0 -65
- package/dist/lib/neutral/testing/index.mjs.map +0 -7
- package/dist/lib/neutral/update-tasks-HX4ILWOU.mjs +0 -46
- package/dist/lib/neutral/update-tasks-HX4ILWOU.mjs.map +0 -7
- package/dist/types/src/skills/agent/operations/add-artifact.d.ts +0 -4
- package/dist/types/src/skills/agent/operations/add-artifact.d.ts.map +0 -1
- package/dist/types/src/skills/agent/operations/agent.d.ts +0 -4
- package/dist/types/src/skills/agent/operations/agent.d.ts.map +0 -1
- package/dist/types/src/skills/agent/operations/qualifier.d.ts +0 -5
- package/dist/types/src/skills/agent/operations/qualifier.d.ts.map +0 -1
- package/dist/types/src/skills/agent/skill.test.d.ts.map +0 -1
- package/dist/types/src/skills/agent-wizard/operations/sync-triggers.d.ts +0 -8
- package/dist/types/src/skills/agent-wizard/operations/sync-triggers.d.ts.map +0 -1
- package/dist/types/src/skills/database/skill.test.d.ts +0 -2
- package/dist/types/src/skills/database/skill.test.d.ts.map +0 -1
- package/dist/types/src/skills/memory/skill.test.d.ts +0 -2
- package/dist/types/src/skills/memory/skill.test.d.ts.map +0 -1
- package/dist/types/src/skills/planning/skill.test.d.ts +0 -2
- package/dist/types/src/skills/planning/skill.test.d.ts.map +0 -1
- package/dist/types/src/types/Plan.d.ts +0 -80
- package/dist/types/src/types/Plan.d.ts.map +0 -1
- package/src/operations/run-instructions.conversations.json +0 -1
- package/src/skills/agent/operations/add-artifact.ts +0 -20
- package/src/skills/agent/operations/agent.ts +0 -69
- package/src/skills/agent/operations/qualifier.ts +0 -97
- package/src/skills/agent/skill.conversations.json +0 -1
- package/src/skills/agent/skill.test.ts +0 -728
- package/src/skills/agent-wizard/operations/sync-triggers.ts +0 -169
- package/src/skills/database/skill.conversations.json +0 -1
- package/src/skills/database/skill.test.ts +0 -531
- package/src/skills/memory/skill.conversations.json +0 -1
- package/src/skills/memory/skill.test.ts +0 -138
- package/src/skills/planning/skill.conversations.json +0 -1
- package/src/skills/planning/skill.test.ts +0 -123
- package/src/types/Plan.ts +0 -123
- /package/dist/types/src/skills/{agent → project}/skill.test.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-run-instructions.mjs","names":[],"sources":["../../src/operations/run-instructions.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Tool from '@effect/ai/Tool';\nimport * as Toolkit from '@effect/ai/Toolkit';\nimport * as Deferred from 'effect/Deferred';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\n\nimport { AiService, OpaqueToolkit } from '@dxos/ai';\nimport {\n AiSession,\n getOperationFromTool,\n makeToolExecutionService,\n makeToolResolverFromOperations,\n} from '@dxos/assistant';\nimport { Operation, Template, Trace } from '@dxos/compute';\nimport { Database, Feed, JsonSchema, Obj, Ref } from '@dxos/echo';\nimport { EffectEx } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trim } from '@dxos/util';\n\nimport { PromptError } from '../errors';\nimport * as Chat from '../types/Chat';\nimport { RunInstructions } from './definitions';\n\nconst DEFAULT_MODEL: DXN.DXN = DXN.make('com.anthropic.model.claude-opus-4-8.default');\n\nconst routineOutputSchema = (output: JsonSchema.JsonSchema): Schema.Schema.All => {\n // Routines default to Void output; completeJob still needs to accept arbitrary success payloads.\n if ('$id' in output && output.$id === '/schemas/unknown') {\n return Schema.Any;\n }\n return JsonSchema.toEffectSchema(output);\n};\n\nexport default RunInstructions.pipe(\n Operation.withHandler(\n Effect.fnUntraced(\n function* (data) {\n log.info('processing input', { input: data.input });\n\n const input = yield* Ref.isRef(data.input)\n ? Database.load(data.input).pipe(Effect.map(Obj.toJSON))\n : Effect.succeed(data.input);\n\n yield* Database.flush();\n const instructions = yield* Database.load(data.instructions);\n yield* Trace.emitStatus(`Running ${instructions.id}`);\n\n log.info('starting agent', { instructions: instructions.id, input });\n\n // Bind the instructions' own refs, dropping any that no longer resolve. The refs must be\n // bound as-is (not re-wrapped via `Ref.make`) to preserve their registry DXN: bindings\n // are persisted to the conversation feed, and registry-only skills have no space-DB\n // identity, so an EID ref would not resolve when the binding is re-read.\n const skillRefs = yield* Effect.filter(instructions.skills, (ref) =>\n Database.load(ref).pipe(\n Effect.as(true),\n Effect.catchTag('EntityNotFoundError', () => Effect.succeed(false)),\n ),\n );\n\n // Bind the instructions' context objects (sibling of skills), dropping any that no longer resolve.\n const objectRefs = yield* Effect.filter(instructions.objects ?? [], (ref) =>\n Database.load(ref).pipe(\n Effect.as(true),\n Effect.catchTag('EntityNotFoundError', () => Effect.succeed(false)),\n ),\n );\n\n const textDoc = yield* Database.load(instructions.text);\n let promptText = Template.process(textDoc.content, input);\n\n if (input !== undefined) {\n promptText += `\\n<input>${JSON.stringify(input)}</input>`;\n }\n\n let systemText = trim`\n You are an agent running in the non-interactive mode.\n The user is unable to see what you are doing, and cannot answer any questions.\n Do not ask questions.\n Complete the task before you, and at the end call [completeJob] with the output.\n If you are unable to complete the task, call [completeJob] with the failure reason.\n If no output is required, call [completeJob] with an empty object: {}\n Do not stop until you call [completeJob].\n `;\n if (data.systemInstructions) {\n systemText += `\\n${data.systemInstructions}`;\n }\n\n const modelLayer = AiService.model(DXN.getName(data.model ?? DEFAULT_MODEL));\n\n let feed: Feed.Feed;\n if (data.chat) {\n const chat = yield* Database.load(data.chat);\n invariant(Obj.instanceOf(Chat.Chat, chat), 'Expected Chat object.');\n feed = yield* Database.load(chat.feed);\n } else {\n feed = yield* Database.add(Feed.make());\n }\n\n const resultSink = yield* Deferred.make<unknown, PromptError>();\n const promptToolkit = makePromptAgentToolkit({\n output: routineOutputSchema(instructions.output),\n resultSink,\n });\n\n const runtime = yield* Effect.runtime<Database.Service>();\n const session = yield* EffectEx.acquireReleaseResource(() => new AiSession.Session({ feed, runtime }));\n\n yield* Effect.promise(() =>\n session.context.bind({\n skills: skillRefs,\n objects: data.chat ? [...objectRefs, data.chat] : objectRefs,\n }),\n );\n\n yield* session\n .createRequest({\n prompt: promptText,\n system: systemText,\n toolkit: promptToolkit,\n })\n .pipe(\n Effect.provide(\n Layer.mergeAll(modelLayer, ToolExecutionService({ feed }), makeToolResolverFromOperations()),\n ),\n );\n\n return yield* Deferred.poll(resultSink).pipe(\n Effect.flatten,\n Effect.flatten,\n Effect.catchTag('NoSuchElementException', () =>\n Effect.gen(function* () {\n yield* session\n .createRequest({\n prompt: 'You must signal task completion by calling [completeJob] with the output or failure reason.',\n system: systemText,\n toolkit: promptToolkit,\n })\n .pipe(\n Effect.provide(\n Layer.mergeAll(modelLayer, ToolExecutionService({ feed }), makeToolResolverFromOperations()),\n ),\n );\n\n return yield* Deferred.poll(resultSink).pipe(\n Effect.flatten,\n Effect.flatten,\n Effect.catchTag('NoSuchElementException', () =>\n Effect.fail(new PromptError('Agent did not signal task completion.', {})),\n ),\n );\n }),\n ),\n );\n },\n Effect.tapBoth({\n onSuccess: () => Database.flush(),\n onFailure: () => Database.flush(),\n }),\n Effect.scoped,\n ),\n ),\n Operation.opaqueHandler,\n);\n\nconst makePromptAgentToolkit = (options: {\n output: Schema.Schema.All;\n resultSink: Deferred.Deferred<unknown, PromptError>;\n}) => {\n class PromptAgentToolkit extends Toolkit.make(\n Tool.make('completeJob', {\n parameters: {\n success: Schema.optional(options.output),\n failure: Schema.optional(\n Schema.Struct({\n message: Schema.String.annotations({\n description: 'Short message describing the error.',\n }),\n description: Schema.optional(Schema.String).annotations({\n description: 'Optional longer message describing in detail what went wrong',\n }),\n }),\n ),\n },\n }),\n ) {}\n const layer = PromptAgentToolkit.toLayer({\n completeJob: Effect.fnUntraced(function* (result) {\n if (result.failure) {\n yield* Deferred.fail(\n options.resultSink,\n new PromptError(result.failure.message, {\n description: result.failure.description,\n }),\n );\n } else {\n yield* Deferred.succeed(options.resultSink, result.success);\n }\n }),\n });\n\n return OpaqueToolkit.make(PromptAgentToolkit, layer);\n};\n\ninterface ToolExecutionServiceOptions {\n feed: Feed.Feed;\n}\n\nconst ToolExecutionService = ({ feed }: ToolExecutionServiceOptions) =>\n Layer.unwrapEffect(\n Effect.gen(function* () {\n const operationInvoker = yield* Operation.Service;\n return makeToolExecutionService({\n invoke: (tool, input) =>\n Effect.gen(function* () {\n const operationDef = getOperationFromTool(tool).pipe(Option.getOrThrow);\n log('invoking operation', { operationDef, input });\n const result = yield* operationInvoker\n .invoke(operationDef, input, {\n conversation: Obj.getURI(feed),\n })\n .pipe(Effect.orDie);\n log('result', { result });\n return result;\n }),\n });\n }),\n );\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { t as Memory } from "./chunk-Memory.mjs";
|
|
2
|
+
import { u as SaveMemory } from "./chunk-operations.mjs";
|
|
3
|
+
import { Operation } from "@dxos/compute";
|
|
4
|
+
import { Database, Entity, Obj } from "@dxos/echo";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
//#region src/skills/memory/operations/save.ts
|
|
7
|
+
var save_default = SaveMemory.pipe(Operation.withHandler(Effect.fn(function* ({ title, content }) {
|
|
8
|
+
const memory = yield* Database.add(Obj.make(Memory, {
|
|
9
|
+
title,
|
|
10
|
+
content
|
|
11
|
+
}));
|
|
12
|
+
return Entity.toJSON(memory);
|
|
13
|
+
})));
|
|
14
|
+
//#endregion
|
|
15
|
+
export { save_default as default };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=chunk-save.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-save.mjs","names":[],"sources":["../../src/skills/memory/operations/save.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Database, Entity, Obj } from '@dxos/echo';\n\nimport { Memory } from '../../../types/Memory';\nimport { SaveMemory } from './definitions';\n\nexport default SaveMemory.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ title, content }) {\n const memory = yield* Database.add(Obj.make(Memory, { title, content }));\n return Entity.toJSON(memory);\n }),\n ),\n);\n"],"mappings":";;;;;;AAYA,IAAA,eAAe,WAAW,KACxB,UAAU,YACR,OAAO,GAAG,WAAW,EAAE,OAAO,WAAW;CACvC,MAAM,SAAS,OAAO,SAAS,IAAI,IAAI,KAAK,QAAQ;EAAE;EAAO;CAAQ,CAAC,CAAC;CACvE,OAAO,OAAO,OAAO,MAAM;AAC7B,CAAC,CACH,CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { T as SchemaAdd } from "./chunk-operations.mjs";
|
|
2
|
+
import { Operation } from "@dxos/compute";
|
|
3
|
+
import { Database, Type } from "@dxos/echo";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
//#region src/skills/database/operations/schema-add.ts
|
|
6
|
+
var schema_add_default = SchemaAdd.pipe(Operation.withHandler(Effect.fn(function* ({ name, typename, jsonSchema }) {
|
|
7
|
+
const schema = yield* Database.addType(Type.makeObjectFromJsonSchema({
|
|
8
|
+
typename,
|
|
9
|
+
version: "0.1.0",
|
|
10
|
+
jsonSchema
|
|
11
|
+
}));
|
|
12
|
+
if (name) Type.update(schema, (draft) => {
|
|
13
|
+
draft.name = name;
|
|
14
|
+
});
|
|
15
|
+
})));
|
|
16
|
+
//#endregion
|
|
17
|
+
export { schema_add_default as default };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=chunk-schema-add.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-schema-add.mjs","names":[],"sources":["../../src/skills/database/operations/schema-add.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Database, Type } from '@dxos/echo';\n\nimport { SchemaAdd } from './definitions';\n\nexport default SchemaAdd.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ name, typename, jsonSchema }) {\n const schema = yield* Database.addType(Type.makeObjectFromJsonSchema({ typename, version: '0.1.0', jsonSchema }));\n if (name) {\n Type.update(schema, (draft) => {\n draft.name = name;\n });\n }\n }),\n ),\n);\n"],"mappings":";;;;;AAWA,IAAA,qBAAe,UAAU,KACvB,UAAU,YACR,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,cAAc;CACnD,MAAM,SAAS,OAAO,SAAS,QAAQ,KAAK,yBAAyB;EAAE;EAAU,SAAS;EAAS;CAAW,CAAC,CAAC;CAChH,IAAI,MACF,KAAK,OAAO,SAAS,UAAU;EAC7B,MAAM,OAAO;CACf,CAAC;AAEL,CAAC,CACH,CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { E as SchemaList } from "./chunk-operations.mjs";
|
|
2
|
+
import { Instructions, Operation, Skill } from "@dxos/compute";
|
|
3
|
+
import { Database, Feed, Filter, JsonSchema, Query, Scope, Type, View } from "@dxos/echo";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
//#region src/skills/database/operations/schema-list.ts
|
|
6
|
+
var excludedTypenames = [
|
|
7
|
+
Type.Type,
|
|
8
|
+
View.View,
|
|
9
|
+
Instructions.Instructions,
|
|
10
|
+
Skill.Skill,
|
|
11
|
+
Feed.Feed
|
|
12
|
+
].map((type) => Type.getTypename(type));
|
|
13
|
+
var schema_list_default = SchemaList.pipe(Operation.withHandler(Effect.fn(function* () {
|
|
14
|
+
return [...yield* Database.query(Query.select(Filter.type(Type.Type)).from(Scope.space(), Scope.registry())).run].filter((schema) => !excludedTypenames.includes(Type.getTypename(schema))).sort((a, b) => {
|
|
15
|
+
const aKey = `${Type.getTypename(a)}:${Type.getVersion(a)}`;
|
|
16
|
+
const bKey = `${Type.getTypename(b)}:${Type.getVersion(b)}`;
|
|
17
|
+
return aKey.localeCompare(bKey);
|
|
18
|
+
}).map((schema) => {
|
|
19
|
+
return {
|
|
20
|
+
typename: Type.getTypename(schema),
|
|
21
|
+
jsonSchema: JsonSchema.toJsonSchema(schema),
|
|
22
|
+
kind: Type.isRelation(schema) ? "relation" : "record"
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
})));
|
|
26
|
+
//#endregion
|
|
27
|
+
export { schema_list_default as default };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=chunk-schema-list.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-schema-list.mjs","names":[],"sources":["../../src/skills/database/operations/schema-list.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Instructions, Operation, Skill } from '@dxos/compute';\nimport { Database, Feed, Filter, JsonSchema, Query, Scope, Type, View } from '@dxos/echo';\n\nimport { SchemaList } from './definitions';\n\n// TODO(dmaretskyi): This is a balance between not filling the agent's context with too many types and not excluding important types.\nconst EXCLUDED_TYPES = [Type.Type, View.View, Instructions.Instructions, Skill.Skill, Feed.Feed];\nconst excludedTypenames = EXCLUDED_TYPES.map((type) => Type.getTypename(type));\n\nexport default SchemaList.pipe(\n Operation.withHandler(\n Effect.fn(function* () {\n const types = yield* Database.query(Query.select(Filter.type(Type.Type)).from(Scope.space(), Scope.registry()))\n .run;\n return [...types]\n .filter((schema) => !excludedTypenames.includes(Type.getTypename(schema)))\n .sort((a, b) => {\n const aKey = `${Type.getTypename(a)}:${Type.getVersion(a)}`;\n const bKey = `${Type.getTypename(b)}:${Type.getVersion(b)}`;\n return aKey.localeCompare(bKey);\n })\n .map((schema) => {\n return {\n typename: Type.getTypename(schema),\n jsonSchema: JsonSchema.toJsonSchema(schema),\n kind: Type.isRelation(schema) ? 'relation' : 'record',\n };\n });\n }),\n ),\n);\n"],"mappings":";;;;;AAaA,IAAM,oBAAoB;CADF,KAAK;CAAM,KAAK;CAAM,aAAa;CAAc,MAAM;CAAO,KAAK;AACjE,CAAA,CAAe,KAAK,SAAS,KAAK,YAAY,IAAI,CAAC;AAE7E,IAAA,sBAAe,WAAW,KACxB,UAAU,YACR,OAAO,GAAG,aAAa;CAGrB,OAAO,CAAC,GAAG,OAFU,SAAS,MAAM,MAAM,OAAO,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC,CAAA,CAC3G,GACa,CAAA,CACb,QAAQ,WAAW,CAAC,kBAAkB,SAAS,KAAK,YAAY,MAAM,CAAC,CAAC,CAAA,CACxE,MAAM,GAAG,MAAM;EACd,MAAM,OAAO,GAAG,KAAK,YAAY,CAAC,EAAE,GAAG,KAAK,WAAW,CAAC;EACxD,MAAM,OAAO,GAAG,KAAK,YAAY,CAAC,EAAE,GAAG,KAAK,WAAW,CAAC;EACxD,OAAO,KAAK,cAAc,IAAI;CAChC,CAAC,CAAA,CACA,KAAK,WAAW;EACf,OAAO;GACL,UAAU,KAAK,YAAY,MAAM;GACjC,YAAY,WAAW,aAAa,MAAM;GAC1C,MAAM,KAAK,WAAW,MAAM,IAAI,aAAa;EAC/C;CACF,CAAC;AACL,CAAC,CACH,CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { I as SetAlarm } from "./chunk-operations.mjs";
|
|
2
|
+
import { Operation } from "@dxos/compute";
|
|
3
|
+
import { Harness } from "@dxos/assistant";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Option from "effect/Option";
|
|
6
|
+
import * as Clock from "effect/Clock";
|
|
7
|
+
import * as DateTime from "effect/DateTime";
|
|
8
|
+
import * as Either from "effect/Either";
|
|
9
|
+
import * as Duration from "effect/Duration";
|
|
10
|
+
//#region src/skills/alarm/operations/resolve-wake-at.ts
|
|
11
|
+
var DURATION_PATTERN = /^(\d+(?:\.\d+)?)\s+(\S+)$/;
|
|
12
|
+
/**
|
|
13
|
+
* Resolves an alarm specification into an absolute UNIX timestamp (ms).
|
|
14
|
+
* Returns a {@link Either.left} with a human-readable message describing invalid input.
|
|
15
|
+
*/
|
|
16
|
+
var resolveWakeAt = (input, now) => {
|
|
17
|
+
const { in: inDuration, at } = input;
|
|
18
|
+
if (inDuration != null && at != null) return Either.left("Specify either \"in\" or \"at\", not both.");
|
|
19
|
+
if (at != null) {
|
|
20
|
+
const timestamp = new Date(at).getTime();
|
|
21
|
+
if (Number.isNaN(timestamp)) return Either.left(`Invalid "at" timestamp: "${at}". Provide an ISO-8601 date-time string.`);
|
|
22
|
+
return Either.right(timestamp);
|
|
23
|
+
}
|
|
24
|
+
if (inDuration != null) {
|
|
25
|
+
if (!inDuration.trim().match(DURATION_PATTERN)) return Either.left(`Invalid "in" duration: "${inDuration}". Use a value like "30 seconds" or "5 minutes".`);
|
|
26
|
+
const duration = Duration.decodeUnknown(inDuration.trim());
|
|
27
|
+
if (Option.isNone(duration)) return Either.left(`Invalid "in" duration: "${inDuration}". Use a value like "30 seconds" or "5 minutes".`);
|
|
28
|
+
return Either.right(now + Duration.toMillis(duration.value));
|
|
29
|
+
}
|
|
30
|
+
return Either.left("Specify either \"in\" (a duration from now) or \"at\" (an absolute time).");
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/skills/alarm/operations/set-alarm.ts
|
|
34
|
+
/**
|
|
35
|
+
* Schedules a self-wake on the owning host via {@link Harness.setAlarm}. The host delivers the
|
|
36
|
+
* (optional) reminder message when the alarm fires.
|
|
37
|
+
*/
|
|
38
|
+
var set_alarm_default = SetAlarm.pipe(Operation.withHandler(Effect.fn(function* ({ in: inDuration, at, message }) {
|
|
39
|
+
const now = yield* Clock.currentTimeMillis;
|
|
40
|
+
const resolved = resolveWakeAt({
|
|
41
|
+
in: inDuration,
|
|
42
|
+
at
|
|
43
|
+
}, now);
|
|
44
|
+
if (Either.isLeft(resolved)) return resolved.left;
|
|
45
|
+
const wakeAt = DateTime.unsafeMake(resolved.right);
|
|
46
|
+
yield* Harness.setAlarm({
|
|
47
|
+
at: wakeAt,
|
|
48
|
+
message: message ?? null
|
|
49
|
+
});
|
|
50
|
+
return `Alarm scheduled to wake you at ${new Date(resolved.right).toISOString()}.`;
|
|
51
|
+
})));
|
|
52
|
+
//#endregion
|
|
53
|
+
export { set_alarm_default as default };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=chunk-set-alarm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-set-alarm.mjs","names":[],"sources":["../../src/skills/alarm/operations/resolve-wake-at.ts","../../src/skills/alarm/operations/set-alarm.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Duration from 'effect/Duration';\nimport * as Either from 'effect/Either';\nimport * as Option from 'effect/Option';\n\ninterface ResolveAlarmInput {\n /** Duration from now, e.g. `'30 seconds'`, `'5 minutes'`, `'1 hour'`. */\n in?: string;\n /** Absolute ISO-8601 timestamp, e.g. `'2026-06-04T18:00:00.000Z'`. */\n at?: string;\n}\n\nconst DURATION_PATTERN = /^(\\d+(?:\\.\\d+)?)\\s+(\\S+)$/;\n\n/**\n * Resolves an alarm specification into an absolute UNIX timestamp (ms).\n * Returns a {@link Either.left} with a human-readable message describing invalid input.\n */\nexport const resolveWakeAt = (input: ResolveAlarmInput, now: number): Either.Either<number, string> => {\n const { in: inDuration, at } = input;\n if (inDuration != null && at != null) {\n return Either.left('Specify either \"in\" or \"at\", not both.');\n }\n if (at != null) {\n const timestamp = new Date(at).getTime();\n if (Number.isNaN(timestamp)) {\n return Either.left(`Invalid \"at\" timestamp: \"${at}\". Provide an ISO-8601 date-time string.`);\n }\n return Either.right(timestamp);\n }\n if (inDuration != null) {\n const match = inDuration.trim().match(DURATION_PATTERN);\n if (!match) {\n return Either.left(`Invalid \"in\" duration: \"${inDuration}\". Use a value like \"30 seconds\" or \"5 minutes\".`);\n }\n const duration = Duration.decodeUnknown(inDuration.trim());\n if (Option.isNone(duration)) {\n return Either.left(`Invalid \"in\" duration: \"${inDuration}\". Use a value like \"30 seconds\" or \"5 minutes\".`);\n }\n return Either.right(now + Duration.toMillis(duration.value));\n }\n return Either.left('Specify either \"in\" (a duration from now) or \"at\" (an absolute time).');\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Clock from 'effect/Clock';\nimport * as DateTime from 'effect/DateTime';\nimport * as Effect from 'effect/Effect';\nimport * as Either from 'effect/Either';\n\nimport { Harness } from '@dxos/assistant';\nimport { Operation } from '@dxos/compute';\n\nimport { SetAlarm } from './definitions';\nimport { resolveWakeAt } from './resolve-wake-at';\n\n/**\n * Schedules a self-wake on the owning host via {@link Harness.setAlarm}. The host delivers the\n * (optional) reminder message when the alarm fires.\n */\nexport default SetAlarm.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ in: inDuration, at, message }) {\n const now = yield* Clock.currentTimeMillis;\n const resolved = resolveWakeAt({ in: inDuration, at }, now);\n if (Either.isLeft(resolved)) {\n return resolved.left;\n }\n const wakeAt = DateTime.unsafeMake(resolved.right);\n yield* Harness.setAlarm({ at: wakeAt, message: message ?? null });\n return `Alarm scheduled to wake you at ${new Date(resolved.right).toISOString()}.`;\n }),\n ),\n);\n"],"mappings":";;;;;;;;;;AAeA,IAAM,mBAAmB;;;;;AAMzB,IAAa,iBAAiB,OAA0B,QAA+C;CACrG,MAAM,EAAE,IAAI,YAAY,OAAO;CAC/B,IAAI,cAAc,QAAQ,MAAM,MAC9B,OAAO,OAAO,KAAK,4CAAwC;CAE7D,IAAI,MAAM,MAAM;EACd,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC,CAAC,QAAQ;EACvC,IAAI,OAAO,MAAM,SAAS,GACxB,OAAO,OAAO,KAAK,4BAA4B,GAAG,yCAAyC;EAE7F,OAAO,OAAO,MAAM,SAAS;CAC/B;CACA,IAAI,cAAc,MAAM;EAEtB,IAAI,CADU,WAAW,KAAK,CAAC,CAAC,MAAM,gBACjC,GACH,OAAO,OAAO,KAAK,2BAA2B,WAAW,iDAAiD;EAE5G,MAAM,WAAW,SAAS,cAAc,WAAW,KAAK,CAAC;EACzD,IAAI,OAAO,OAAO,QAAQ,GACxB,OAAO,OAAO,KAAK,2BAA2B,WAAW,iDAAiD;EAE5G,OAAO,OAAO,MAAM,MAAM,SAAS,SAAS,SAAS,KAAK,CAAC;CAC7D;CACA,OAAO,OAAO,KAAK,2EAAuE;AAC5F;;;;;;;AC1BA,IAAA,oBAAe,SAAS,KACtB,UAAU,YACR,OAAO,GAAG,WAAW,EAAE,IAAI,YAAY,IAAI,WAAW;CACpD,MAAM,MAAM,OAAO,MAAM;CACzB,MAAM,WAAW,cAAc;EAAE,IAAI;EAAY;CAAG,GAAG,GAAG;CAC1D,IAAI,OAAO,OAAO,QAAQ,GACxB,OAAO,SAAS;CAElB,MAAM,SAAS,SAAS,WAAW,SAAS,KAAK;CACjD,OAAO,QAAQ,SAAS;EAAE,IAAI;EAAQ,SAAS,WAAW;CAAK,CAAC;CAChE,OAAO,kCAAkC,IAAI,KAAK,SAAS,KAAK,CAAC,CAAC,YAAY,EAAE;AAClF,CAAC,CACH,CACF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { i as loadChat } from "./chunk-types.mjs";
|
|
2
|
+
import { V as SyncAutomation } from "./chunk-operations.mjs";
|
|
3
|
+
import { Operation, Routine, Trigger } from "@dxos/compute";
|
|
4
|
+
import { Database, Feed, Filter, Obj, Ref, Type } from "@dxos/echo";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { FeedAnnotation } from "@dxos/schema";
|
|
7
|
+
import * as Option from "effect/Option";
|
|
8
|
+
//#region src/skills/agent-wizard/operations/sync-automation.ts
|
|
9
|
+
var sync_automation_default = SyncAutomation.pipe(Operation.withHandler(Effect.fn(function* ({ agent: agentRef, subscriptions, cron, qualify }) {
|
|
10
|
+
yield* syncAgentAutomation(yield* Database.load(agentRef), {
|
|
11
|
+
subscriptions,
|
|
12
|
+
cron,
|
|
13
|
+
qualify: qualify ?? true
|
|
14
|
+
});
|
|
15
|
+
})));
|
|
16
|
+
/**
|
|
17
|
+
* Foreign key {@link AGENT_TRIGGER_EXTENSION_KEY} => <agent id : EntityId>.
|
|
18
|
+
*/
|
|
19
|
+
var AGENT_TRIGGER_EXTENSION_KEY = "org.dxos.extension.AgentTrigger";
|
|
20
|
+
/**
|
|
21
|
+
* Foreign key {@link AGENT_TRIGGER_TARGET_EXTENSION_KEY} => <dxn string of subscription target>.
|
|
22
|
+
*/
|
|
23
|
+
var AGENT_TRIGGER_TARGET_EXTENSION_KEY = "org.dxos.extension.AgentTriggerTarget";
|
|
24
|
+
/** Reads a feed-annotated object's `feed` ref without assuming its schema shape. */
|
|
25
|
+
var getFeedRef = (obj) => {
|
|
26
|
+
if (!("feed" in obj)) return;
|
|
27
|
+
const candidate = obj.feed;
|
|
28
|
+
return Ref.isRef(candidate) ? candidate : void 0;
|
|
29
|
+
};
|
|
30
|
+
/** Checks if an object's schema has the FeedAnnotation. */
|
|
31
|
+
var hasFeedAnnotation = (obj) => {
|
|
32
|
+
const type = Obj.getType(obj);
|
|
33
|
+
if (!type) return false;
|
|
34
|
+
const annotation = FeedAnnotation.get(Type.getSchema(type));
|
|
35
|
+
return Option.isSome(annotation) && annotation.value === true;
|
|
36
|
+
};
|
|
37
|
+
/** A schedule routine's target key is `timer:<cron>`; subscription keys are the target's URI. */
|
|
38
|
+
var isTimerKey = (id) => id?.startsWith("timer:") ?? false;
|
|
39
|
+
var targetKeyOf = (entity) => Obj.getMeta(entity).keys.find((key) => key.source === AGENT_TRIGGER_TARGET_EXTENSION_KEY)?.id;
|
|
40
|
+
/**
|
|
41
|
+
* Compiles the agent's automation config into Routines whose triggers run the Relay: the relay
|
|
42
|
+
* qualifies each event with a cheap model and forwards relevant ones onto the chat's durable
|
|
43
|
+
* session. Re-running deletes and recreates the categories present in the config.
|
|
44
|
+
*/
|
|
45
|
+
var syncAgentAutomation = (agent, config) => Effect.gen(function* () {
|
|
46
|
+
const chat = yield* loadChat(agent);
|
|
47
|
+
if (!chat) return;
|
|
48
|
+
const chatRef = Ref.make(chat);
|
|
49
|
+
const triggers = yield* Database.query(Filter.foreignKeys(Trigger.Trigger, [{
|
|
50
|
+
source: AGENT_TRIGGER_EXTENSION_KEY,
|
|
51
|
+
id: agent.id
|
|
52
|
+
}])).run;
|
|
53
|
+
const routines = yield* Database.query(Filter.foreignKeys(Routine.Routine, [{
|
|
54
|
+
source: AGENT_TRIGGER_EXTENSION_KEY,
|
|
55
|
+
id: agent.id
|
|
56
|
+
}])).run;
|
|
57
|
+
const shouldRemove = (entity) => {
|
|
58
|
+
return isTimerKey(targetKeyOf(entity)) ? config.cron !== void 0 : config.subscriptions !== void 0;
|
|
59
|
+
};
|
|
60
|
+
for (const trigger of triggers.filter(shouldRemove)) yield* Database.remove(trigger);
|
|
61
|
+
for (const routine of routines.filter(shouldRemove)) yield* Database.remove(routine);
|
|
62
|
+
const triggersEnabled = agent.enabled ?? true;
|
|
63
|
+
const { Relay } = yield* Effect.promise(() => import("./chunk-operations.mjs").then((n) => n.K));
|
|
64
|
+
const makeRoutine = (options) => Effect.gen(function* () {
|
|
65
|
+
const keys = [{
|
|
66
|
+
source: AGENT_TRIGGER_EXTENSION_KEY,
|
|
67
|
+
id: agent.id
|
|
68
|
+
}, {
|
|
69
|
+
source: AGENT_TRIGGER_TARGET_EXTENSION_KEY,
|
|
70
|
+
id: options.targetKey
|
|
71
|
+
}];
|
|
72
|
+
const runnable = yield* Database.add(Operation.serialize(Relay));
|
|
73
|
+
const trigger = yield* Database.add(Trigger.make({
|
|
74
|
+
[Obj.Parent]: agent,
|
|
75
|
+
[Obj.Meta]: { keys },
|
|
76
|
+
enabled: triggersEnabled,
|
|
77
|
+
spec: options.spec,
|
|
78
|
+
runnable: Ref.make(runnable),
|
|
79
|
+
input: options.input,
|
|
80
|
+
...options.concurrency !== void 0 ? { concurrency: options.concurrency } : {}
|
|
81
|
+
}));
|
|
82
|
+
yield* Database.add(Obj.make(Routine.Routine, {
|
|
83
|
+
[Obj.Parent]: agent,
|
|
84
|
+
[Obj.Meta]: { keys },
|
|
85
|
+
name: options.name,
|
|
86
|
+
spec: {
|
|
87
|
+
kind: "runnable",
|
|
88
|
+
runnable: Ref.make(runnable)
|
|
89
|
+
},
|
|
90
|
+
triggers: [Ref.make(trigger)]
|
|
91
|
+
}));
|
|
92
|
+
});
|
|
93
|
+
for (const subscription of config.subscriptions ?? []) {
|
|
94
|
+
const targetOption = yield* Database.load(subscription).pipe(Effect.map(Option.some), Effect.catchTag("EntityNotFoundError", () => Effect.succeed(Option.none())));
|
|
95
|
+
if (Option.isNone(targetOption)) continue;
|
|
96
|
+
const target = targetOption.value;
|
|
97
|
+
let feedObj;
|
|
98
|
+
if (Obj.instanceOf(Feed.Feed, target)) feedObj = target;
|
|
99
|
+
else if (hasFeedAnnotation(target)) {
|
|
100
|
+
const feedRef = getFeedRef(target);
|
|
101
|
+
feedObj = feedRef ? Option.getOrUndefined(yield* Database.load(feedRef).pipe(Effect.map(Option.some), Effect.catchTag("EntityNotFoundError", () => Effect.succeed(Option.none())))) : void 0;
|
|
102
|
+
}
|
|
103
|
+
if (!feedObj || !Obj.instanceOf(Feed.Feed, feedObj) || !Feed.getFeedUri(feedObj)) continue;
|
|
104
|
+
yield* makeRoutine({
|
|
105
|
+
name: `${agent.name ?? "Agent"} — ${Obj.getLabel(target) ?? "subscription"}`,
|
|
106
|
+
targetKey: subscription.uri,
|
|
107
|
+
spec: Trigger.specFeed(feedObj),
|
|
108
|
+
input: {
|
|
109
|
+
chat: chatRef,
|
|
110
|
+
event: "{{event}}",
|
|
111
|
+
...config.qualify ? {} : { qualify: false }
|
|
112
|
+
},
|
|
113
|
+
concurrency: config.qualify ? 5 : void 0
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (config.cron) yield* makeRoutine({
|
|
117
|
+
name: `${agent.name ?? "Agent"} — schedule`,
|
|
118
|
+
targetKey: `timer:${config.cron}`,
|
|
119
|
+
spec: Trigger.specTimer(config.cron),
|
|
120
|
+
input: {
|
|
121
|
+
chat: chatRef,
|
|
122
|
+
prompt: "Scheduled wake: continue your instructions and review outstanding work."
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
yield* Database.flush();
|
|
126
|
+
});
|
|
127
|
+
//#endregion
|
|
128
|
+
export { sync_automation_default as default, syncAgentAutomation };
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=chunk-sync-automation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-sync-automation.mjs","names":[],"sources":["../../src/skills/agent-wizard/operations/sync-automation.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { Operation, Routine, Trigger } from '@dxos/compute';\nimport { Database, Feed, Filter, Obj, Ref, Type } from '@dxos/echo';\nimport { FeedAnnotation } from '@dxos/schema';\n\nimport { Agent } from '../../../types';\nimport { SyncAutomation } from './definitions';\n\nexport default SyncAutomation.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ agent: agentRef, subscriptions, cron, qualify }) {\n const agent = yield* Database.load(agentRef);\n yield* syncAgentAutomation(agent, { subscriptions, cron, qualify: qualify ?? true });\n }),\n ),\n);\n\n/**\n * Foreign key {@link AGENT_TRIGGER_EXTENSION_KEY} => <agent id : EntityId>.\n */\nconst AGENT_TRIGGER_EXTENSION_KEY = 'org.dxos.extension.AgentTrigger';\n\n/**\n * Foreign key {@link AGENT_TRIGGER_TARGET_EXTENSION_KEY} => <dxn string of subscription target>.\n */\nconst AGENT_TRIGGER_TARGET_EXTENSION_KEY = 'org.dxos.extension.AgentTriggerTarget';\n\n/** Reads a feed-annotated object's `feed` ref without assuming its schema shape. */\nconst getFeedRef = (obj: Obj.Unknown): Ref.Ref<Obj.Unknown> | undefined => {\n if (!('feed' in obj)) {\n return undefined;\n }\n const candidate = obj.feed;\n // The target is type-checked after loading (`Obj.instanceOf(Feed.Feed, …)`), so the ref stays untyped here.\n return Ref.isRef(candidate) ? candidate : undefined;\n};\n\n/** Checks if an object's schema has the FeedAnnotation. */\nconst hasFeedAnnotation = (obj: Obj.Unknown): boolean => {\n const type = Obj.getType(obj);\n if (!type) {\n return false;\n }\n const annotation = FeedAnnotation.get(Type.getSchema(type));\n return Option.isSome(annotation) && annotation.value === true;\n};\n\nexport type AutomationConfig = {\n /** Omitted (vs empty) leaves existing subscription routines untouched. */\n subscriptions?: readonly Ref.Ref<Obj.Unknown>[];\n /** Omitted leaves an existing schedule routine untouched; empty string removes it. */\n cron?: string;\n /** Run the cheap-model relevance check before forwarding subscription events. */\n qualify: boolean;\n};\n\n/** A schedule routine's target key is `timer:<cron>`; subscription keys are the target's URI. */\nconst isTimerKey = (id: string | undefined): boolean => id?.startsWith('timer:') ?? false;\n\nconst targetKeyOf = (entity: Obj.Unknown): string | undefined =>\n Obj.getMeta(entity).keys.find((key) => key.source === AGENT_TRIGGER_TARGET_EXTENSION_KEY)?.id;\n\n/**\n * Compiles the agent's automation config into Routines whose triggers run the Relay: the relay\n * qualifies each event with a cheap model and forwards relevant ones onto the chat's durable\n * session. Re-running deletes and recreates the categories present in the config.\n */\nexport const syncAgentAutomation = (\n agent: Agent.Agent,\n config: AutomationConfig,\n): Effect.Effect<void, never, Database.Service> =>\n Effect.gen(function* () {\n // Resolve the chat before the destructive phase: a transient resolution gap must not wipe\n // existing automation without recreating it.\n const chat = yield* Agent.loadChat(agent);\n if (!chat) {\n return;\n }\n const chatRef = Ref.make(chat);\n\n const triggers = yield* Database.query(\n Filter.foreignKeys(Trigger.Trigger, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),\n ).run;\n const routines = yield* Database.query(\n Filter.foreignKeys(Routine.Routine, [{ source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id }]),\n ).run;\n\n // Reconcile per category: only the categories present in the config are recreated, so a\n // subscriptions-only update (e.g. a UI toggle) cannot silently drop the schedule routine.\n // Recreation keeps operation, concurrency, and enabled in sync when the config changes.\n const shouldRemove = (entity: Obj.Unknown): boolean => {\n const timer = isTimerKey(targetKeyOf(entity));\n return timer ? config.cron !== undefined : config.subscriptions !== undefined;\n };\n for (const trigger of triggers.filter(shouldRemove)) {\n yield* Database.remove(trigger);\n }\n for (const routine of routines.filter(shouldRemove)) {\n yield* Database.remove(routine);\n }\n\n const triggersEnabled = agent.enabled ?? true;\n\n // Lazy import to avoid circular dependency issues.\n const { Relay } = yield* Effect.promise(() => import('../../agent/operations/definitions'));\n\n const makeRoutine = (options: {\n name: string;\n targetKey: string;\n spec: Trigger.Trigger['spec'];\n input: Record<string, unknown>;\n concurrency?: number;\n }): Effect.Effect<void, never, Database.Service> =>\n Effect.gen(function* () {\n const keys = [\n { source: AGENT_TRIGGER_EXTENSION_KEY, id: agent.id },\n { source: AGENT_TRIGGER_TARGET_EXTENSION_KEY, id: options.targetKey },\n ];\n const runnable = yield* Database.add(Operation.serialize(Relay));\n const trigger = yield* Database.add(\n Trigger.make({\n [Obj.Parent]: agent,\n [Obj.Meta]: { keys },\n enabled: triggersEnabled,\n spec: options.spec,\n runnable: Ref.make(runnable),\n input: options.input,\n ...(options.concurrency !== undefined ? { concurrency: options.concurrency } : {}),\n }),\n );\n // The Routine is the user-facing aggregate (action + trigger), shared with projects.\n yield* Database.add(\n Obj.make(Routine.Routine, {\n [Obj.Parent]: agent,\n [Obj.Meta]: { keys },\n name: options.name,\n spec: { kind: 'runnable', runnable: Ref.make(runnable) },\n triggers: [Ref.make(trigger)],\n }),\n );\n });\n\n for (const subscription of config.subscriptions ?? []) {\n const targetOption = yield* Database.load(subscription).pipe(\n Effect.map(Option.some),\n Effect.catchTag('EntityNotFoundError', () => Effect.succeed(Option.none())),\n );\n if (Option.isNone(targetOption)) {\n continue;\n }\n const target = targetOption.value;\n\n let feedObj: Feed.Feed | undefined;\n if (Obj.instanceOf(Feed.Feed, target)) {\n feedObj = target;\n } else if (hasFeedAnnotation(target)) {\n const feedRef = getFeedRef(target);\n feedObj = feedRef\n ? Option.getOrUndefined(\n yield* Database.load(feedRef).pipe(\n Effect.map(Option.some),\n Effect.catchTag('EntityNotFoundError', () => Effect.succeed(Option.none())),\n ),\n )\n : undefined;\n }\n\n if (!feedObj || !Obj.instanceOf(Feed.Feed, feedObj) || !Feed.getFeedUri(feedObj)) {\n continue;\n }\n\n yield* makeRoutine({\n name: `${agent.name ?? 'Agent'} — ${Obj.getLabel(target) ?? 'subscription'}`,\n targetKey: subscription.uri,\n spec: Trigger.specFeed(feedObj),\n input: {\n chat: chatRef,\n event: '{{event}}',\n ...(config.qualify ? {} : { qualify: false }),\n },\n concurrency: config.qualify ? 5 : undefined,\n });\n }\n\n // Timer wake: a synthetic prompt through the same relay path (no event, so no qualification).\n if (config.cron) {\n yield* makeRoutine({\n name: `${agent.name ?? 'Agent'} — schedule`,\n targetKey: `timer:${config.cron}`,\n spec: Trigger.specTimer(config.cron),\n input: {\n chat: chatRef,\n prompt: 'Scheduled wake: continue your instructions and review outstanding work.',\n },\n });\n }\n\n yield* Database.flush();\n });\n"],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { n as SyncIssues, t as syncObjects } from "./chunk-sync.mjs";
|
|
2
|
+
import { Credential, Operation } from "@dxos/compute";
|
|
3
|
+
import { Database, Filter, Obj, Query, Ref } from "@dxos/echo";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { Person, Task } from "@dxos/types";
|
|
6
|
+
import { withAuthorization } from "@dxos/compute-runtime";
|
|
7
|
+
import { log } from "@dxos/log";
|
|
8
|
+
import * as Array from "effect/Array";
|
|
9
|
+
import * as Function from "effect/Function";
|
|
10
|
+
import * as FetchHttpClient from "@effect/platform/FetchHttpClient";
|
|
11
|
+
import * as HttpClient from "@effect/platform/HttpClient";
|
|
12
|
+
import * as HttpBody from "@effect/platform/HttpBody";
|
|
13
|
+
//#region src/util/graphql.ts
|
|
14
|
+
/**
|
|
15
|
+
* @returns JSON body for the graphql request.
|
|
16
|
+
*/
|
|
17
|
+
var graphqlRequestBody = (query, variables = {}) => HttpBody.json({
|
|
18
|
+
query,
|
|
19
|
+
variables
|
|
20
|
+
});
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/skills/linear/operations/sync-issues.ts
|
|
23
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/core/compute/assistant-toolkit/src/skills/linear/operations/sync-issues.ts";
|
|
24
|
+
var queryIssues = `
|
|
25
|
+
query Issues($teamId: String!, $after: DateTimeOrDuration!) {
|
|
26
|
+
team(id: $teamId) {
|
|
27
|
+
id
|
|
28
|
+
name
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
issues(last: 150, orderBy: updatedAt, filter: {
|
|
32
|
+
updatedAt: { gt: $after }
|
|
33
|
+
}) {
|
|
34
|
+
edges {
|
|
35
|
+
node {
|
|
36
|
+
id
|
|
37
|
+
title
|
|
38
|
+
createdAt
|
|
39
|
+
updatedAt
|
|
40
|
+
description
|
|
41
|
+
assignee { id, name }
|
|
42
|
+
state {
|
|
43
|
+
name
|
|
44
|
+
}
|
|
45
|
+
project {
|
|
46
|
+
id
|
|
47
|
+
name
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
cursor
|
|
51
|
+
}
|
|
52
|
+
pageInfo {
|
|
53
|
+
hasNextPage
|
|
54
|
+
endCursor
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
var LINEAR_ID_KEY = "linear.app/id";
|
|
61
|
+
var LINEAR_TEAM_ID_KEY = "linear.app/teamId";
|
|
62
|
+
var LINEAR_UPDATED_AT_KEY = "linear.app/updatedAt";
|
|
63
|
+
var sync_issues_default = SyncIssues.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ team }) {
|
|
64
|
+
const credential = yield* Credential.CredentialsService.getCredential({ service: "linear.app" });
|
|
65
|
+
const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization(credential.apiKey)));
|
|
66
|
+
const after = yield* getLatestUpdateTimestamp(team, Task.Task);
|
|
67
|
+
log.info("will fetch", { after }, {
|
|
68
|
+
"~LogMeta": "~LogMeta",
|
|
69
|
+
F: __dxlog_file,
|
|
70
|
+
L: 85,
|
|
71
|
+
S: this
|
|
72
|
+
});
|
|
73
|
+
const tasks = (yield* (yield* client.post("https://api.linear.app/graphql", { body: yield* graphqlRequestBody(queryIssues, {
|
|
74
|
+
teamId: team,
|
|
75
|
+
after
|
|
76
|
+
}) })).json).data.team.issues.edges.map((edge) => mapLinearIssue(edge.node, { teamId: team }));
|
|
77
|
+
log.info("Fetched tasks", { count: tasks.length }, {
|
|
78
|
+
"~LogMeta": "~LogMeta",
|
|
79
|
+
F: __dxlog_file,
|
|
80
|
+
L: 97,
|
|
81
|
+
S: this
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
objects: yield* syncObjects(tasks, { foreignKeyId: LINEAR_ID_KEY }),
|
|
85
|
+
syncComplete: tasks.length < 150
|
|
86
|
+
};
|
|
87
|
+
}, Effect.provide(FetchHttpClient.layer))));
|
|
88
|
+
var getLatestUpdateTimestamp = Effect.fnUntraced(function* (teamId, dataType) {
|
|
89
|
+
const existingTasks = yield* Database.query(Query.type(dataType).select(Filter.foreignKeys(dataType, [{
|
|
90
|
+
source: LINEAR_TEAM_ID_KEY,
|
|
91
|
+
id: teamId
|
|
92
|
+
}]))).run;
|
|
93
|
+
return Function.pipe(existingTasks, Array.map((task) => Obj.getKeys(task, LINEAR_UPDATED_AT_KEY).at(0)?.id), Array.filter((x) => x !== void 0), Array.reduce("2025-01-01T00:00:00.000Z", (acc, x) => x > acc ? x : acc));
|
|
94
|
+
});
|
|
95
|
+
var mapLinearPerson = (person, { teamId }) => Obj.make(Person.Person, {
|
|
96
|
+
[Obj.Meta]: { keys: [{
|
|
97
|
+
id: person.id,
|
|
98
|
+
source: LINEAR_ID_KEY
|
|
99
|
+
}, {
|
|
100
|
+
id: teamId,
|
|
101
|
+
source: LINEAR_TEAM_ID_KEY
|
|
102
|
+
}] },
|
|
103
|
+
nickname: person.name
|
|
104
|
+
});
|
|
105
|
+
var mapLinearIssue = (issue, { teamId }) => Obj.make(Task.Task, {
|
|
106
|
+
[Obj.Meta]: { keys: [
|
|
107
|
+
{
|
|
108
|
+
id: issue.id,
|
|
109
|
+
source: LINEAR_ID_KEY
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: issue.updatedAt,
|
|
113
|
+
source: LINEAR_UPDATED_AT_KEY
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: teamId,
|
|
117
|
+
source: LINEAR_TEAM_ID_KEY
|
|
118
|
+
}
|
|
119
|
+
] },
|
|
120
|
+
title: issue.title ?? void 0,
|
|
121
|
+
description: issue.description ?? void 0,
|
|
122
|
+
assignee: !issue.assignee ? void 0 : { contact: Ref.make(mapLinearPerson(issue.assignee, { teamId })) }
|
|
123
|
+
});
|
|
124
|
+
//#endregion
|
|
125
|
+
export { LINEAR_ID_KEY, LINEAR_TEAM_ID_KEY, LINEAR_UPDATED_AT_KEY, sync_issues_default as default };
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=chunk-sync-issues.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-sync-issues.mjs","names":[],"sources":["../../src/util/graphql.ts","../../src/skills/linear/operations/sync-issues.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as HttpBody from '@effect/platform/HttpBody';\n\n/**\n * Template tag literal to get syntax highlighting for the query.\n *\n * @example\n * ```ts\n * const query = gql`\n * query Team($teamId: String!) {\n * team(id: $teamId) {\n * id\n * name\n * }\n * }\n * `;\n * ```\n */\nexport const gql = (query: string) => query;\n\n/**\n * @returns JSON body for the graphql request.\n */\nexport const graphqlRequestBody = (query: string, variables: Record<string, any> = {}) =>\n HttpBody.json({\n query,\n variables,\n });\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as FetchHttpClient from '@effect/platform/FetchHttpClient';\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as Array from 'effect/Array';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\n\nimport { Credential, Operation } from '@dxos/compute';\nimport { withAuthorization } from '@dxos/compute-runtime';\nimport { Database, Filter, Obj, Query, Ref, type Type } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { Person, Task } from '@dxos/types';\n\nimport { syncObjects } from '../../../sync';\nimport { graphqlRequestBody } from '../../../util';\nimport { SyncIssues } from './definitions';\n\nconst queryIssues = `\nquery Issues($teamId: String!, $after: DateTimeOrDuration!) {\n team(id: $teamId) {\n id\n name\n\n\n issues(last: 150, orderBy: updatedAt, filter: {\n updatedAt: { gt: $after }\n }) {\n edges {\n node {\n id\n title\n createdAt\n updatedAt\n description\n assignee { id, name }\n state {\n name\n }\n project {\n id\n name\n }\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n}\n`;\n\ntype LinearIssue = {\n id: string;\n title: string;\n createdAt: string;\n updatedAt: string;\n description: string;\n assignee: LinearPerson;\n state: { name: string };\n project: { id: string; name: string };\n};\n\ntype LinearPerson = {\n id: string;\n name: string;\n};\n\nexport const LINEAR_ID_KEY = 'linear.app/id';\nexport const LINEAR_TEAM_ID_KEY = 'linear.app/teamId';\nexport const LINEAR_UPDATED_AT_KEY = 'linear.app/updatedAt';\n\nexport default SyncIssues.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ team }) {\n const credential = yield* Credential.CredentialsService.getCredential({ service: 'linear.app' });\n const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization(credential.apiKey!)));\n\n const after = yield* getLatestUpdateTimestamp(team, Task.Task);\n log.info('will fetch', { after });\n\n const response = yield* client.post('https://api.linear.app/graphql', {\n body: yield* graphqlRequestBody(queryIssues, {\n teamId: team,\n after,\n }),\n });\n const json: any = yield* response.json;\n const tasks = (json.data.team.issues.edges as any[]).map((edge: any) =>\n mapLinearIssue(edge.node as LinearIssue, { teamId: team }),\n );\n log.info('Fetched tasks', { count: tasks.length });\n\n return {\n objects: yield* syncObjects(tasks, { foreignKeyId: LINEAR_ID_KEY }),\n syncComplete: tasks.length < 150,\n };\n }, Effect.provide(FetchHttpClient.layer)),\n ),\n);\n\nconst getLatestUpdateTimestamp: (\n teamId: string,\n dataType: Type.AnyObj,\n) => Effect.Effect<string, never, Database.Service> = Effect.fnUntraced(function* (teamId, dataType) {\n const existingTasks = yield* Database.query(\n Query.type(dataType).select(Filter.foreignKeys(dataType, [{ source: LINEAR_TEAM_ID_KEY, id: teamId }])),\n ).run;\n return Function.pipe(\n existingTasks,\n Array.map((task) => Obj.getKeys(task, LINEAR_UPDATED_AT_KEY).at(0)?.id),\n Array.filter((x) => x !== undefined),\n Array.reduce('2025-01-01T00:00:00.000Z', (acc: string, x: string) => (x > acc ? x : acc)),\n );\n});\n\nconst mapLinearPerson = (person: LinearPerson, { teamId }: { teamId: string }): Person.Person =>\n Obj.make(Person.Person, {\n [Obj.Meta]: {\n keys: [\n {\n id: person.id,\n source: LINEAR_ID_KEY,\n },\n {\n id: teamId,\n source: LINEAR_TEAM_ID_KEY,\n },\n ],\n },\n nickname: person.name,\n });\n\nconst mapLinearIssue = (issue: LinearIssue, { teamId }: { teamId: string }): Task.Task =>\n Obj.make(Task.Task, {\n [Obj.Meta]: {\n keys: [\n {\n id: issue.id,\n source: LINEAR_ID_KEY,\n },\n {\n id: issue.updatedAt,\n source: LINEAR_UPDATED_AT_KEY,\n },\n {\n id: teamId,\n source: LINEAR_TEAM_ID_KEY,\n },\n ],\n },\n title: issue.title ?? undefined,\n description: issue.description ?? undefined,\n assignee: !issue.assignee ? undefined : { contact: Ref.make(mapLinearPerson(issue.assignee, { teamId })) },\n // TODO(dmaretskyi): Sync those (+ linear team as org?).\n // state: issue.state.name,\n // Container membership (TaskSet parent edge) is not mapped here: `syncObjects` upserts\n // detached objects, and parent edges need persisted objects — plugin-linear's sync owns\n // real project mirroring.\n });\n"],"mappings":";;;;;;;;;;;;;;;;AA0BA,IAAa,sBAAsB,OAAe,YAAiC,CAAC,MAClF,SAAS,KAAK;CACZ;CACA;AACF,CAAC;;;;ACVH,IAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDpB,IAAa,gBAAgB;AAC7B,IAAa,qBAAqB;AAClC,IAAa,wBAAwB;AAErC,IAAA,sBAAe,WAAW,KACxB,UAAU,YACR,OAAO,WAAW,WAAW,EAAE,QAAQ;CACrC,MAAM,aAAa,OAAO,WAAW,mBAAmB,cAAc,EAAE,SAAS,aAAa,CAAC;CAC/F,MAAM,SAAS,OAAO,WAAW,WAAW,KAAK,OAAO,IAAI,kBAAkB,WAAW,MAAO,CAAC,CAAC;CAElG,MAAM,QAAQ,OAAO,yBAAyB,MAAM,KAAK,IAAI;CAC7D,IAAI,KAAK,cAAc,EAAE,MAAM,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA;CAAA,CAAC;CAShC,MAAM,SAAS,QADU,OAND,OAAO,KAAK,kCAAkC,EACpE,MAAM,OAAO,mBAAmB,aAAa;EAC3C,QAAQ;EACR;CACF,CAAC,EACH,CAAC,EAAA,CACiC,KAAA,CACd,KAAK,KAAK,OAAO,MAAgB,KAAK,SACxD,eAAe,KAAK,MAAqB,EAAE,QAAQ,KAAK,CAAC,CAC3D;CACA,IAAI,KAAK,iBAAiB,EAAE,OAAO,MAAM,OAAO,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA;CAAA,CAAC;CAEjD,OAAO;EACL,SAAS,OAAO,YAAY,OAAO,EAAE,cAAc,cAAc,CAAC;EAClE,cAAc,MAAM,SAAS;CAC/B;AACF,GAAG,OAAO,QAAQ,gBAAgB,KAAK,CAAC,CAC1C,CACF;AAEA,IAAM,2BAGgD,OAAO,WAAW,WAAW,QAAQ,UAAU;CACnG,MAAM,gBAAgB,OAAO,SAAS,MACpC,MAAM,KAAK,QAAQ,CAAC,CAAC,OAAO,OAAO,YAAY,UAAU,CAAC;EAAE,QAAQ;EAAoB,IAAI;CAAO,CAAC,CAAC,CAAC,CACxG,CAAC,CAAC;CACF,OAAO,SAAS,KACd,eACA,MAAM,KAAK,SAAS,IAAI,QAAQ,MAAM,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GACtE,MAAM,QAAQ,MAAM,MAAM,KAAA,CAAS,GACnC,MAAM,OAAO,6BAA6B,KAAa,MAAe,IAAI,MAAM,IAAI,GAAI,CAC1F;AACF,CAAC;AAED,IAAM,mBAAmB,QAAsB,EAAE,aAC/C,IAAI,KAAK,OAAO,QAAQ;EACrB,IAAI,OAAO,EACV,MAAM,CACJ;EACE,IAAI,OAAO;EACX,QAAQ;CACV,GACA;EACE,IAAI;EACJ,QAAQ;CACV,CACF,EACF;CACA,UAAU,OAAO;AACnB,CAAC;AAEH,IAAM,kBAAkB,OAAoB,EAAE,aAC5C,IAAI,KAAK,KAAK,MAAM;EACjB,IAAI,OAAO,EACV,MAAM;EACJ;GACE,IAAI,MAAM;GACV,QAAQ;EACV;EACA;GACE,IAAI,MAAM;GACV,QAAQ;EACV;EACA;GACE,IAAI;GACJ,QAAQ;EACV;CACF,EACF;CACA,OAAO,MAAM,SAAS,KAAA;CACtB,aAAa,MAAM,eAAe,KAAA;CAClC,UAAU,CAAC,MAAM,WAAW,KAAA,IAAY,EAAE,SAAS,IAAI,KAAK,gBAAgB,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE;AAM3G,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { Credential, Operation } from "@dxos/compute";
|
|
3
|
+
import * as Schema from "effect/Schema";
|
|
4
|
+
import { Database, Filter, Obj, Query, Ref } from "@dxos/echo";
|
|
5
|
+
import { DXN as DXN$1, EID } from "@dxos/keys";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import { log } from "@dxos/log";
|
|
8
|
+
import { failedInvariant } from "@dxos/invariant";
|
|
9
|
+
//#region src/skills/linear/operations/definitions.ts
|
|
10
|
+
var definitions_exports = /* @__PURE__ */ __exportAll({ SyncIssues: () => SyncIssues });
|
|
11
|
+
var SyncIssues = Operation.make({
|
|
12
|
+
meta: {
|
|
13
|
+
key: DXN$1.make("org.dxos.function.linear.syncIssues"),
|
|
14
|
+
name: "Linear",
|
|
15
|
+
description: "Sync issues from Linear.",
|
|
16
|
+
icon: "ph--arrows-clockwise--regular"
|
|
17
|
+
},
|
|
18
|
+
input: Schema.Struct({ team: Schema.String.annotations({ description: "Linear team id." }) }),
|
|
19
|
+
output: Schema.Any,
|
|
20
|
+
services: [Credential.CredentialsService, Database.Service]
|
|
21
|
+
});
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/sync/sync.ts
|
|
24
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/core/compute/assistant-toolkit/src/sync/sync.ts";
|
|
25
|
+
/**
|
|
26
|
+
* Syncs objects to the database.
|
|
27
|
+
* If there's an object with a matching foreign key in the database, it will be updated.
|
|
28
|
+
* Otherwise, a new object will be added.
|
|
29
|
+
* Recursively syncs top-level refs.
|
|
30
|
+
*
|
|
31
|
+
* @param opts.foreignKeyId - The key to use for matching objects.
|
|
32
|
+
*/
|
|
33
|
+
var syncObjects = Effect.fn("syncObjects")(function* (objs, { foreignKeyId }) {
|
|
34
|
+
return yield* Effect.forEach(objs, Effect.fnUntraced(function* (obj) {
|
|
35
|
+
for (const key of Object.keys(obj)) {
|
|
36
|
+
if (typeof key !== "string" || key === "id") continue;
|
|
37
|
+
if (!Ref.isRef(obj[key])) continue;
|
|
38
|
+
const ref = obj[key];
|
|
39
|
+
if (!ref.target) continue;
|
|
40
|
+
const targetUri = EID.tryParse(Obj.getURI(ref.target));
|
|
41
|
+
if (targetUri && EID.isLocal(targetUri)) {
|
|
42
|
+
const [target] = yield* syncObjects([ref.target], { foreignKeyId });
|
|
43
|
+
obj[key] = Ref.make(target);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const type = Obj.getType(obj) ?? failedInvariant("No type.");
|
|
47
|
+
const foreignId = Obj.getKeys(obj, foreignKeyId)[0]?.id ?? failedInvariant("No foreign key.");
|
|
48
|
+
const [existing] = yield* Database.query(Query.select(Filter.foreignKeys(type, [{
|
|
49
|
+
source: foreignKeyId,
|
|
50
|
+
id: foreignId
|
|
51
|
+
}]))).run;
|
|
52
|
+
log("sync object", {
|
|
53
|
+
type: Obj.getTypename(obj),
|
|
54
|
+
foreignId,
|
|
55
|
+
existing: existing ? Obj.getURI(existing) : void 0
|
|
56
|
+
}, {
|
|
57
|
+
"~LogMeta": "~LogMeta",
|
|
58
|
+
F: __dxlog_file,
|
|
59
|
+
L: 55,
|
|
60
|
+
S: this
|
|
61
|
+
});
|
|
62
|
+
if (!existing) {
|
|
63
|
+
yield* Database.add(obj);
|
|
64
|
+
return obj;
|
|
65
|
+
} else {
|
|
66
|
+
copyObjectData(existing, obj);
|
|
67
|
+
return existing;
|
|
68
|
+
}
|
|
69
|
+
}), { concurrency: 1 });
|
|
70
|
+
});
|
|
71
|
+
var copyObjectData = (existing, newObj) => {
|
|
72
|
+
Obj.update(existing, (existing) => {
|
|
73
|
+
for (const key of Object.keys(newObj)) {
|
|
74
|
+
if (typeof key !== "string" || key === "id") continue;
|
|
75
|
+
if (typeof newObj[key] !== "string" && typeof newObj[key] !== "number" && typeof newObj[key] !== "boolean" && !Ref.isRef(newObj[key])) continue;
|
|
76
|
+
existing[key] = newObj[key];
|
|
77
|
+
}
|
|
78
|
+
for (const key of Object.keys(existing)) {
|
|
79
|
+
if (typeof key !== "string" || key === "id") continue;
|
|
80
|
+
if (!(key in newObj)) delete existing[key];
|
|
81
|
+
}
|
|
82
|
+
for (const foreignKey of Obj.getMeta(newObj).keys) {
|
|
83
|
+
Obj.deleteKeys(existing, foreignKey.source);
|
|
84
|
+
Obj.getMeta(existing).keys.push(foreignKey);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
//#endregion
|
|
89
|
+
export { SyncIssues as n, definitions_exports as r, syncObjects as t };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=chunk-sync.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-sync.mjs","names":[],"sources":["../../src/skills/linear/operations/definitions.ts","../../src/sync/sync.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Credential, Operation } from '@dxos/compute';\nimport { Database } from '@dxos/echo';\nimport { DXN } from '@dxos/keys';\n\nexport const SyncIssues = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.linear.syncIssues'),\n name: 'Linear',\n description: 'Sync issues from Linear.',\n icon: 'ph--arrows-clockwise--regular',\n },\n input: Schema.Struct({\n team: Schema.String.annotations({\n description: 'Linear team id.',\n }),\n }),\n output: Schema.Any,\n services: [Credential.CredentialsService, Database.Service],\n});\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Database, Filter, Obj, Query, Ref } from '@dxos/echo';\nimport { failedInvariant } from '@dxos/invariant';\nimport { EID } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\n/**\n * Syncs objects to the database.\n * If there's an object with a matching foreign key in the database, it will be updated.\n * Otherwise, a new object will be added.\n * Recursively syncs top-level refs.\n *\n * @param opts.foreignKeyId - The key to use for matching objects.\n */\nexport const syncObjects: (\n objs: Obj.Unknown[],\n opts: { foreignKeyId: string },\n) => Effect.Effect<Obj.Unknown[], never, Database.Service> = Effect.fn('syncObjects')(function* (\n objs,\n { foreignKeyId },\n) {\n return yield* Effect.forEach(\n objs,\n Effect.fnUntraced(function* (obj) {\n // Sync referenced objects.\n for (const key of Object.keys(obj)) {\n if (typeof key !== 'string' || key === 'id') {\n continue;\n }\n if (!Ref.isRef((obj as any)[key])) {\n continue;\n }\n const ref: Ref.Unknown = (obj as any)[key];\n if (!ref.target) {\n continue;\n }\n const targetUri = EID.tryParse(Obj.getURI(ref.target));\n if (targetUri && EID.isLocal(targetUri)) {\n // obj not persisted to db.\n const [target] = yield* syncObjects([ref.target], { foreignKeyId });\n (obj as any)[key] = Ref.make(target);\n }\n }\n\n const type = Obj.getType(obj) ?? failedInvariant('No type.');\n const foreignId = Obj.getKeys(obj, foreignKeyId)[0]?.id ?? failedInvariant('No foreign key.');\n const [existing] = yield* Database.query(\n Query.select(Filter.foreignKeys(type, [{ source: foreignKeyId, id: foreignId }])),\n ).run;\n log('sync object', {\n type: Obj.getTypename(obj),\n foreignId,\n existing: existing ? Obj.getURI(existing) : undefined,\n });\n if (!existing) {\n yield* Database.add(obj);\n return obj;\n } else {\n copyObjectData(existing, obj);\n return existing;\n }\n }),\n { concurrency: 1 },\n );\n});\n\nconst copyObjectData = (existing: Obj.Unknown, newObj: Obj.Unknown) => {\n Obj.update(existing, (existing) => {\n // Copy properties from newObj to existing.\n for (const key of Object.keys(newObj)) {\n if (typeof key !== 'string' || key === 'id') {\n continue;\n }\n if (\n typeof (newObj as any)[key] !== 'string' &&\n typeof (newObj as any)[key] !== 'number' &&\n typeof (newObj as any)[key] !== 'boolean' &&\n !Ref.isRef((newObj as any)[key])\n ) {\n continue;\n }\n\n (existing as any)[key] = (newObj as any)[key];\n }\n\n // Delete properties that don't exist in newObj.\n for (const key of Object.keys(existing)) {\n if (typeof key !== 'string' || key === 'id') {\n continue;\n }\n\n if (!(key in newObj)) {\n delete (existing as any)[key];\n }\n }\n\n // Update foreign keys. The push copies by value, so `existing` does not share mutable state\n // with `newObj`.\n for (const foreignKey of Obj.getMeta(newObj).keys) {\n Obj.deleteKeys(existing, foreignKey.source);\n Obj.getMeta(existing).keys.push(foreignKey);\n }\n });\n};\n"],"mappings":";;;;;;;;;;AAUA,IAAa,aAAa,UAAU,KAAK;CACvC,MAAM;EACJ,KAAK,MAAI,KAAK,qCAAqC;EACnD,MAAM;EACN,aAAa;EACb,MAAM;CACR;CACA,OAAO,OAAO,OAAO,EACnB,MAAM,OAAO,OAAO,YAAY,EAC9B,aAAa,kBACf,CAAC,EACH,CAAC;CACD,QAAQ,OAAO;CACf,UAAU,CAAC,WAAW,oBAAoB,SAAS,OAAO;AAC5D,CAAC;;;;;;;;;;;;ACLD,IAAa,cAGgD,OAAO,GAAG,aAAa,CAAC,CAAC,WACpF,MACA,EAAE,gBACF;CACA,OAAO,OAAO,OAAO,QACnB,MACA,OAAO,WAAW,WAAW,KAAK;EAEhC,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG,GAAG;GAClC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC;GAEF,IAAI,CAAC,IAAI,MAAO,IAAY,IAAI,GAC9B;GAEF,MAAM,MAAoB,IAAY;GACtC,IAAI,CAAC,IAAI,QACP;GAEF,MAAM,YAAY,IAAI,SAAS,IAAI,OAAO,IAAI,MAAM,CAAC;GACrD,IAAI,aAAa,IAAI,QAAQ,SAAS,GAAG;IAEvC,MAAM,CAAC,UAAU,OAAO,YAAY,CAAC,IAAI,MAAM,GAAG,EAAE,aAAa,CAAC;IAClE,IAAa,OAAO,IAAI,KAAK,MAAM;GACrC;EACF;EAEA,MAAM,OAAO,IAAI,QAAQ,GAAG,KAAK,gBAAgB,UAAU;EAC3D,MAAM,YAAY,IAAI,QAAQ,KAAK,YAAY,CAAC,CAAC,EAAE,EAAE,MAAM,gBAAgB,iBAAiB;EAC5F,MAAM,CAAC,YAAY,OAAO,SAAS,MACjC,MAAM,OAAO,OAAO,YAAY,MAAM,CAAC;GAAE,QAAQ;GAAc,IAAI;EAAU,CAAC,CAAC,CAAC,CAClF,CAAC,CAAC;EACF,IAAI,eAAe;GACjB,MAAM,IAAI,YAAY,GAAG;GACzB;GACA,UAAU,WAAW,IAAI,OAAO,QAAQ,IAAI,KAAA;EAC9C,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC;EACD,IAAI,CAAC,UAAU;GACb,OAAO,SAAS,IAAI,GAAG;GACvB,OAAO;EACT,OAAO;GACL,eAAe,UAAU,GAAG;GAC5B,OAAO;EACT;CACF,CAAC,GACD,EAAE,aAAa,EAAE,CACnB;AACF,CAAC;AAED,IAAM,kBAAkB,UAAuB,WAAwB;CACrE,IAAI,OAAO,WAAW,aAAa;EAEjC,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG;GACrC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC;GAEF,IACE,OAAQ,OAAe,SAAS,YAChC,OAAQ,OAAe,SAAS,YAChC,OAAQ,OAAe,SAAS,aAChC,CAAC,IAAI,MAAO,OAAe,IAAI,GAE/B;GAGF,SAAkB,OAAQ,OAAe;EAC3C;EAGA,KAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG;GACvC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC;GAGF,IAAI,EAAE,OAAO,SACX,OAAQ,SAAiB;EAE7B;EAIA,KAAK,MAAM,cAAc,IAAI,QAAQ,MAAM,CAAC,CAAC,MAAM;GACjD,IAAI,WAAW,UAAU,WAAW,MAAM;GAC1C,IAAI,QAAQ,QAAQ,CAAC,CAAC,KAAK,KAAK,UAAU;EAC5C;CACF,CAAC;AACH"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { D as TagAdd } from "./chunk-operations.mjs";
|
|
2
|
+
import { Operation } from "@dxos/compute";
|
|
3
|
+
import { Database, Entity } from "@dxos/echo";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
//#region src/skills/database/operations/tag-add.ts
|
|
6
|
+
var tag_add_default = TagAdd.pipe(Operation.withHandler(Effect.fn(function* ({ tag, obj }) {
|
|
7
|
+
const object = yield* Database.load(obj);
|
|
8
|
+
Entity.update(object, (object) => Entity.addTag(object, tag));
|
|
9
|
+
return Entity.toJSON(object);
|
|
10
|
+
})));
|
|
11
|
+
//#endregion
|
|
12
|
+
export { tag_add_default as default };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=chunk-tag-add.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-tag-add.mjs","names":[],"sources":["../../src/skills/database/operations/tag-add.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Database, Entity } from '@dxos/echo';\n\nimport { TagAdd } from './definitions';\n\nexport default TagAdd.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ tag, obj }) {\n const object = yield* Database.load(obj);\n Entity.update(object, (object) => Entity.addTag(object, tag));\n return Entity.toJSON(object);\n }),\n ),\n);\n"],"mappings":";;;;;AAWA,IAAA,kBAAe,OAAO,KACpB,UAAU,YACR,OAAO,GAAG,WAAW,EAAE,KAAK,OAAO;CACjC,MAAM,SAAS,OAAO,SAAS,KAAK,GAAG;CACvC,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,QAAQ,GAAG,CAAC;CAC5D,OAAO,OAAO,OAAO,MAAM;AAC7B,CAAC,CACH,CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { O as TagRemove } from "./chunk-operations.mjs";
|
|
2
|
+
import { Operation } from "@dxos/compute";
|
|
3
|
+
import { Database, Entity } from "@dxos/echo";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
//#region src/skills/database/operations/tag-remove.ts
|
|
6
|
+
var tag_remove_default = TagRemove.pipe(Operation.withHandler(Effect.fn(function* ({ tag, obj }) {
|
|
7
|
+
const object = yield* Database.load(obj);
|
|
8
|
+
Entity.update(object, (object) => Entity.removeTag(object, tag));
|
|
9
|
+
return Entity.toJSON(object);
|
|
10
|
+
})));
|
|
11
|
+
//#endregion
|
|
12
|
+
export { tag_remove_default as default };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=chunk-tag-remove.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-tag-remove.mjs","names":[],"sources":["../../src/skills/database/operations/tag-remove.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Database, Entity } from '@dxos/echo';\n\nimport { TagRemove } from './definitions';\n\nexport default TagRemove.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ tag, obj }) {\n const object = yield* Database.load(obj);\n Entity.update(object, (object) => Entity.removeTag(object, tag));\n return Entity.toJSON(object);\n }),\n ),\n);\n"],"mappings":";;;;;AAWA,IAAA,qBAAe,UAAU,KACvB,UAAU,YACR,OAAO,GAAG,WAAW,EAAE,KAAK,OAAO;CACjC,MAAM,SAAS,OAAO,SAAS,KAAK,GAAG;CACvC,OAAO,OAAO,SAAS,WAAW,OAAO,UAAU,QAAQ,GAAG,CAAC;CAC/D,OAAO,OAAO,OAAO,MAAM;AAC7B,CAAC,CACH,CACF"}
|