@dxos/plugin-routine 0.10.0 → 0.11.1
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/PLUGIN.mdl +18 -13
- package/dist/lib/RoutinePlugin.mjs +2 -0
- package/dist/lib/RoutinePlugin.node.mjs +894 -0
- package/dist/lib/RoutinePlugin.node.mjs.map +1 -0
- package/dist/lib/RoutinePlugin.workerd.mjs +20 -0
- package/dist/lib/RoutinePlugin.workerd.mjs.map +1 -0
- package/dist/lib/capabilities/node.mjs +12 -0
- package/dist/lib/capabilities/node.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +14 -0
- package/dist/lib/capabilities.mjs.map +1 -0
- package/dist/lib/chunk-RoutineArticle.mjs +79 -0
- package/dist/lib/chunk-RoutineArticle.mjs.map +1 -0
- package/dist/lib/chunk-RoutineCompanion.mjs +192 -0
- package/dist/lib/chunk-RoutineCompanion.mjs.map +1 -0
- package/dist/lib/chunk-RoutinePlugin.mjs +38 -0
- package/dist/lib/chunk-RoutinePlugin.mjs.map +1 -0
- package/dist/lib/chunk-RoutineSettings.mjs +50 -0
- package/dist/lib/chunk-RoutineSettings.mjs.map +1 -0
- package/dist/lib/chunk-RoutineTraceCompanion.mjs +208 -0
- package/dist/lib/chunk-RoutineTraceCompanion.mjs.map +1 -0
- package/dist/lib/chunk-SkillArticle.mjs +28 -0
- package/dist/lib/chunk-SkillArticle.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +71 -0
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +23 -0
- package/dist/lib/chunk-create-object.mjs.map +1 -0
- package/dist/lib/chunk-create-routine.mjs +34 -0
- package/dist/lib/chunk-create-routine.mjs.map +1 -0
- package/dist/lib/chunk-create-trigger-from-template.mjs +48 -0
- package/dist/lib/chunk-create-trigger-from-template.mjs.map +1 -0
- package/dist/lib/chunk-layer-specs.mjs +179 -0
- package/dist/lib/chunk-layer-specs.mjs.map +1 -0
- package/dist/lib/{neutral/chunk-HLO4LYXT.mjs → chunk-meta.mjs} +19 -27
- package/dist/lib/chunk-meta.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +11 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -0
- package/dist/lib/chunk-paths.mjs +11 -0
- package/dist/lib/chunk-paths.mjs.map +1 -0
- package/dist/lib/chunk-react-surface.mjs +64 -0
- package/dist/lib/chunk-react-surface.mjs.map +1 -0
- package/dist/lib/chunk-registry-sync.mjs +104 -0
- package/dist/lib/chunk-registry-sync.mjs.map +1 -0
- package/dist/lib/chunk-run-routine.mjs +57 -0
- package/dist/lib/chunk-run-routine.mjs.map +1 -0
- package/dist/lib/chunk-templates.mjs +37 -0
- package/dist/lib/chunk-templates.mjs.map +1 -0
- package/dist/lib/chunk-trigger-runtime-controller.mjs +73 -0
- package/dist/lib/chunk-trigger-runtime-controller.mjs.map +1 -0
- package/dist/lib/chunk-types.mjs +149 -0
- package/dist/lib/chunk-types.mjs.map +1 -0
- package/dist/lib/chunk-util.mjs +142 -0
- package/dist/lib/chunk-util.mjs.map +1 -0
- package/dist/lib/components.mjs +1645 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +11 -0
- package/dist/lib/containers.mjs.map +1 -0
- package/dist/lib/hooks.mjs +37 -0
- package/dist/lib/hooks.mjs.map +1 -0
- package/dist/lib/index.mjs +5 -0
- package/dist/lib/meta.mjs +2 -0
- package/dist/lib/operations.mjs +7 -0
- package/dist/lib/operations.mjs.map +1 -0
- package/dist/lib/plugin.mjs +9 -0
- package/dist/lib/plugin.mjs.map +1 -0
- package/dist/lib/testing.mjs +2 -0
- package/dist/lib/translations.mjs +110 -0
- package/dist/lib/translations.mjs.map +1 -0
- package/dist/lib/types.mjs +2 -0
- package/dist/types/src/RoutinePlugin.d.ts.map +1 -1
- package/dist/types/src/RoutinePlugin.node.d.ts.map +1 -1
- package/dist/types/src/RoutinePlugin.workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts +0 -1
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/layer-specs.d.ts +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/registry-sync.d.ts +1 -1
- package/dist/types/src/capabilities/templates.d.ts +1 -1
- package/dist/types/src/capabilities/trigger-runtime-controller.d.ts +1 -1
- package/dist/types/src/commands/trigger/create/{queue.d.ts → feed.d.ts} +2 -2
- package/dist/types/src/commands/trigger/create/feed.d.ts.map +1 -0
- package/dist/types/src/commands/trigger/update/{queue.d.ts → feed.d.ts} +2 -2
- package/dist/types/src/commands/trigger/update/feed.d.ts.map +1 -0
- package/dist/types/src/commands/trigger/util.d.ts +1 -1
- package/dist/types/src/commands/trigger/util.d.ts.map +1 -1
- package/dist/types/src/components/InstructionsEditor/InstructionsEditor.d.ts +7 -5
- package/dist/types/src/components/InstructionsEditor/InstructionsEditor.d.ts.map +1 -1
- package/dist/types/src/components/InstructionsEditor/InstructionsEditor.stories.d.ts +3 -3
- package/dist/types/src/components/InstructionsEditor/InstructionsEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/RoutineCard/RoutineCard.d.ts +9 -0
- package/dist/types/src/components/RoutineCard/RoutineCard.d.ts.map +1 -0
- package/dist/types/src/components/RoutineCard/RoutineCard.stories.d.ts +21 -0
- package/dist/types/src/components/RoutineCard/RoutineCard.stories.d.ts.map +1 -0
- package/dist/types/src/components/RoutineCard/index.d.ts +2 -0
- package/dist/types/src/components/RoutineCard/index.d.ts.map +1 -0
- package/dist/types/src/components/RoutineForm/RoutineForm.d.ts +7 -2
- package/dist/types/src/components/RoutineForm/RoutineForm.d.ts.map +1 -1
- package/dist/types/src/components/Schedule/Schedule.d.ts +2 -26
- package/dist/types/src/components/Schedule/Schedule.d.ts.map +1 -1
- package/dist/types/src/components/Schedule/days.d.ts +24 -0
- package/dist/types/src/components/Schedule/days.d.ts.map +1 -0
- package/dist/types/src/components/Schedule/describe-schedule.d.ts +3 -0
- package/dist/types/src/components/Schedule/describe-schedule.d.ts.map +1 -0
- package/dist/types/src/components/Schedule/index.d.ts +2 -0
- package/dist/types/src/components/Schedule/index.d.ts.map +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +1 -1
- package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
- package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -2
- package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
- package/dist/types/src/components/TriggerEditor/TriggerKindSelector.d.ts +5 -2
- package/dist/types/src/components/TriggerEditor/TriggerKindSelector.d.ts.map +1 -1
- package/dist/types/src/components/TriggerEditor/trigger-kind-icon.d.ts +5 -0
- package/dist/types/src/components/TriggerEditor/trigger-kind-icon.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts +5 -10
- package/dist/types/src/containers/RoutineArticle/RoutineArticle.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts +6 -2
- package/dist/types/src/containers/RoutineArticle/RoutineArticle.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineCompanion/RoutineCompanion.d.ts +4 -12
- package/dist/types/src/containers/RoutineCompanion/RoutineCompanion.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineCompanion/RoutineCompanion.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineSettings/RoutineSettings.d.ts +4 -8
- package/dist/types/src/containers/RoutineSettings/RoutineSettings.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.d.ts +5 -3
- package/dist/types/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RoutineTraceCompanion/useRoutineRuns.d.ts +1 -1
- package/dist/types/src/containers/RoutineTraceCompanion/useRoutineRuns.d.ts.map +1 -1
- package/dist/types/src/containers/SkillArticle/SkillArticle.d.ts +4 -1
- package/dist/types/src/containers/SkillArticle/SkillArticle.d.ts.map +1 -1
- package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +1 -1
- package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/run-routine.d.ts.map +1 -1
- package/dist/types/src/operations/run-routine.test.d.ts +2 -0
- package/dist/types/src/operations/run-routine.test.d.ts.map +1 -0
- package/dist/types/src/paths.d.ts.map +1 -1
- package/dist/types/src/templates/index.d.ts +1 -1
- package/dist/types/src/templates/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-functions.d.ts +30 -6
- package/dist/types/src/testing/test-functions.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/RoutineCapabilities.d.ts +9 -3
- package/dist/types/src/types/RoutineCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/RoutineOperation.d.ts +2 -3
- package/dist/types/src/types/RoutineOperation.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +0 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +1 -0
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/routines-for-object.d.ts +6 -3
- package/dist/types/src/util/routines-for-object.d.ts.map +1 -1
- package/dist/types/src/util/wire.d.ts +21 -0
- package/dist/types/src/util/wire.d.ts.map +1 -0
- package/dist/types/src/util/wire.test.d.ts +2 -0
- package/dist/types/src/util/wire.test.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +3 -2
- package/package.json +73 -71
- package/src/RoutinePlugin.node.ts +1 -2
- package/src/RoutinePlugin.tsx +2 -4
- package/src/RoutinePlugin.workerd.ts +1 -2
- package/src/capabilities/app-graph-builder.ts +9 -7
- package/src/capabilities/create-object.ts +2 -2
- package/src/capabilities/index.ts +0 -1
- package/src/capabilities/layer-specs.ts +78 -12
- package/src/capabilities/{react-surface.tsx → react-surface.ts} +18 -22
- package/src/capabilities/trigger-runtime-controller.test.ts +12 -18
- package/src/capabilities/trigger-runtime-controller.ts +22 -25
- package/src/commands/trigger/create/{queue.ts → feed.ts} +1 -1
- package/src/commands/trigger/create/index.ts +2 -2
- package/src/commands/trigger/update/{queue.ts → feed.ts} +1 -1
- package/src/commands/trigger/update/index.ts +2 -2
- package/src/commands/trigger/util.ts +1 -2
- package/src/components/InstructionsEditor/InstructionsEditor.stories.tsx +7 -6
- package/src/components/InstructionsEditor/InstructionsEditor.tsx +31 -19
- package/src/components/RoutineCard/RoutineCard.stories.tsx +95 -0
- package/src/components/RoutineCard/RoutineCard.tsx +60 -0
- package/src/components/{MasterDetail → RoutineCard}/index.ts +1 -1
- package/src/components/RoutineForm/RoutineForm.tsx +60 -52
- package/src/components/Schedule/Schedule.stories.tsx +1 -1
- package/src/components/Schedule/Schedule.tsx +4 -73
- package/src/components/Schedule/days.ts +18 -0
- package/src/components/Schedule/describe-schedule.ts +64 -0
- package/src/components/Schedule/index.ts +2 -0
- package/src/components/TemplateEditor/TemplateEditor.stories.tsx +1 -1
- package/src/components/TemplateEditor/TemplateForm.tsx +1 -1
- package/src/components/TriggerEditor/TriggerEditor.stories.tsx +3 -3
- package/src/components/TriggerEditor/TriggerEditor.tsx +79 -66
- package/src/components/TriggerEditor/TriggerKindSelector.tsx +4 -30
- package/src/components/TriggerEditor/trigger-kind-icon.ts +38 -0
- package/src/components/index.ts +1 -1
- package/src/containers/RoutineArticle/RoutineArticle.stories.tsx +78 -19
- package/src/containers/RoutineArticle/RoutineArticle.tsx +8 -4
- package/src/containers/RoutineCompanion/RoutineCompanion.stories.tsx +5 -4
- package/src/containers/RoutineCompanion/RoutineCompanion.tsx +11 -7
- package/src/containers/RoutineSettings/RoutineSettings.tsx +22 -33
- package/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.stories.tsx +6 -5
- package/src/containers/RoutineTraceCompanion/RoutineTraceCompanion.tsx +3 -1
- package/src/containers/RoutineTraceCompanion/useRoutineRuns.ts +3 -5
- package/src/containers/SkillArticle/SkillArticle.tsx +2 -0
- package/src/hooks/useTriggerRuntimeControls.ts +2 -2
- package/src/index.ts +1 -0
- package/src/operations/create-routine.ts +1 -1
- package/src/operations/create-trigger-from-template.ts +2 -2
- package/src/operations/run-routine.test.ts +150 -0
- package/src/operations/run-routine.ts +18 -2
- package/src/paths.ts +5 -5
- package/src/templates/index.ts +5 -3
- package/src/translations.ts +5 -6
- package/src/types/RoutineCapabilities.ts +10 -4
- package/src/types/RoutineOperation.ts +7 -6
- package/src/types/index.ts +0 -1
- package/src/util/index.ts +1 -0
- package/src/util/routines-for-object.test.ts +37 -5
- package/src/util/routines-for-object.ts +33 -8
- package/src/util/wire.test.ts +77 -0
- package/src/util/wire.ts +76 -0
- package/dist/lib/neutral/RoutineArticle-UNTMV4CC.mjs +0 -95
- package/dist/lib/neutral/RoutineArticle-UNTMV4CC.mjs.map +0 -7
- package/dist/lib/neutral/RoutineCompanion-ZZ6WMY7I.mjs +0 -249
- package/dist/lib/neutral/RoutineCompanion-ZZ6WMY7I.mjs.map +0 -7
- package/dist/lib/neutral/RoutinePlugin.mjs +0 -10
- package/dist/lib/neutral/RoutinePlugin.mjs.map +0 -7
- package/dist/lib/neutral/RoutinePlugin.node.mjs +0 -1133
- package/dist/lib/neutral/RoutinePlugin.node.mjs.map +0 -7
- package/dist/lib/neutral/RoutinePlugin.workerd.mjs +0 -36
- package/dist/lib/neutral/RoutinePlugin.workerd.mjs.map +0 -7
- package/dist/lib/neutral/RoutineSettings-ZJOM4F3S.mjs +0 -48
- package/dist/lib/neutral/RoutineSettings-ZJOM4F3S.mjs.map +0 -7
- package/dist/lib/neutral/RoutineTraceCompanion-5U6R7LJE.mjs +0 -236
- package/dist/lib/neutral/RoutineTraceCompanion-5U6R7LJE.mjs.map +0 -7
- package/dist/lib/neutral/SkillArticle-WWDNKW2Z.mjs +0 -27
- package/dist/lib/neutral/SkillArticle-WWDNKW2Z.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-FALWLZTI.mjs +0 -90
- package/dist/lib/neutral/app-graph-builder-FALWLZTI.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/index.mjs +0 -25
- package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
- package/dist/lib/neutral/capabilities/node.mjs +0 -19
- package/dist/lib/neutral/capabilities/node.mjs.map +0 -7
- package/dist/lib/neutral/chunk-674LDIUJ.mjs +0 -9
- package/dist/lib/neutral/chunk-674LDIUJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HLO4LYXT.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-P3TDQKOO.mjs +0 -8
- package/dist/lib/neutral/chunk-P3TDQKOO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-R7J2MU2M.mjs +0 -263
- package/dist/lib/neutral/chunk-R7J2MU2M.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WLNL77C7.mjs +0 -14
- package/dist/lib/neutral/chunk-WLNL77C7.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YGWSAKLD.mjs +0 -65
- package/dist/lib/neutral/chunk-YGWSAKLD.mjs.map +0 -7
- package/dist/lib/neutral/components/index.mjs +0 -1921
- package/dist/lib/neutral/components/index.mjs.map +0 -7
- package/dist/lib/neutral/containers/index.mjs +0 -17
- package/dist/lib/neutral/containers/index.mjs.map +0 -7
- package/dist/lib/neutral/create-object-V23KVDMJ.mjs +0 -25
- package/dist/lib/neutral/create-object-V23KVDMJ.mjs.map +0 -7
- package/dist/lib/neutral/create-routine-6QBY6TWF.mjs +0 -38
- package/dist/lib/neutral/create-routine-6QBY6TWF.mjs.map +0 -7
- package/dist/lib/neutral/create-trigger-from-template-U3KNS77V.mjs +0 -70
- package/dist/lib/neutral/create-trigger-from-template-U3KNS77V.mjs.map +0 -7
- package/dist/lib/neutral/hooks/index.mjs +0 -47
- package/dist/lib/neutral/hooks/index.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -27
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/layer-specs-2TWJU5HI.mjs +0 -135
- package/dist/lib/neutral/layer-specs-2TWJU5HI.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/meta.mjs +0 -8
- package/dist/lib/neutral/meta.mjs.map +0 -7
- package/dist/lib/neutral/navigation-resolver-KQIWUH6F.mjs +0 -18
- package/dist/lib/neutral/navigation-resolver-KQIWUH6F.mjs.map +0 -7
- package/dist/lib/neutral/operation-handler-QKLJSDCQ.mjs +0 -13
- package/dist/lib/neutral/operation-handler-QKLJSDCQ.mjs.map +0 -7
- package/dist/lib/neutral/operations/index.mjs +0 -8
- package/dist/lib/neutral/operations/index.mjs.map +0 -7
- package/dist/lib/neutral/plugin.mjs +0 -16
- package/dist/lib/neutral/plugin.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-GMO7I7YE.mjs +0 -67
- package/dist/lib/neutral/react-surface-GMO7I7YE.mjs.map +0 -7
- package/dist/lib/neutral/registry-sync-DYPOC7ZG.mjs +0 -86
- package/dist/lib/neutral/registry-sync-DYPOC7ZG.mjs.map +0 -7
- package/dist/lib/neutral/run-routine-AEWO6SYD.mjs +0 -37
- package/dist/lib/neutral/run-routine-AEWO6SYD.mjs.map +0 -7
- package/dist/lib/neutral/templates-IIUCEBAX.mjs +0 -49
- package/dist/lib/neutral/templates-IIUCEBAX.mjs.map +0 -7
- package/dist/lib/neutral/testing.mjs +0 -8
- package/dist/lib/neutral/testing.mjs.map +0 -7
- package/dist/lib/neutral/translations.mjs +0 -115
- package/dist/lib/neutral/translations.mjs.map +0 -7
- package/dist/lib/neutral/trigger-runtime-controller-WIDDFGQT.mjs +0 -77
- package/dist/lib/neutral/trigger-runtime-controller-WIDDFGQT.mjs.map +0 -7
- package/dist/lib/neutral/types/index.mjs +0 -17
- package/dist/lib/neutral/types/index.mjs.map +0 -7
- package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -5
- package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
- package/dist/types/src/commands/trigger/create/queue.d.ts.map +0 -1
- package/dist/types/src/commands/trigger/update/queue.d.ts.map +0 -1
- package/dist/types/src/components/MasterDetail/MasterDetail.d.ts +0 -51
- package/dist/types/src/components/MasterDetail/MasterDetail.d.ts.map +0 -1
- package/dist/types/src/components/MasterDetail/MasterDetail.stories.d.ts +0 -16
- package/dist/types/src/components/MasterDetail/MasterDetail.stories.d.ts.map +0 -1
- package/dist/types/src/components/MasterDetail/index.d.ts +0 -2
- package/dist/types/src/components/MasterDetail/index.d.ts.map +0 -1
- package/dist/types/src/types/Routine.d.ts +0 -55
- package/dist/types/src/types/Routine.d.ts.map +0 -1
- package/dist/types/src/types/Routine.test.d.ts +0 -2
- package/dist/types/src/types/Routine.test.d.ts.map +0 -1
- package/src/capabilities/navigation-resolver.ts +0 -21
- package/src/components/MasterDetail/MasterDetail.stories.tsx +0 -100
- package/src/components/MasterDetail/MasterDetail.tsx +0 -175
- package/src/types/Routine.test.ts +0 -51
- package/src/types/Routine.ts +0 -144
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
2
|
+
import { ServiceResolver } from "@dxos/compute";
|
|
3
|
+
import { Obj } from "@dxos/echo";
|
|
4
|
+
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { TriggerDispatcher } from "@dxos/compute-runtime";
|
|
7
|
+
import { log } from "@dxos/log";
|
|
8
|
+
import * as Fiber from "effect/Fiber";
|
|
9
|
+
//#region src/capabilities/trigger-runtime-controller.ts
|
|
10
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-routine/src/capabilities/trigger-runtime-controller.ts";
|
|
11
|
+
var trigger_runtime_controller_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
12
|
+
const client = yield* Capability.get(ClientCapabilities.Client);
|
|
13
|
+
const runtime = yield* Capability.get(Capabilities.ProcessManagerRuntime);
|
|
14
|
+
const trackers = /* @__PURE__ */ new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the per-space `TriggerDispatcher` from the process-manager
|
|
17
|
+
* runtime and invoke `start()` / `stop()` according to the requested
|
|
18
|
+
* disabled state. Returns a fiber so the caller can cancel a pending
|
|
19
|
+
* transition when a new one supersedes it.
|
|
20
|
+
*/
|
|
21
|
+
const transition = (spaceId, disabled) => runtime.runFork(Effect.gen(function* () {
|
|
22
|
+
const dispatcher = yield* TriggerDispatcher;
|
|
23
|
+
yield* disabled ? dispatcher.stop() : dispatcher.start();
|
|
24
|
+
}).pipe(Effect.provide(ServiceResolver.provide({ space: spaceId }, TriggerDispatcher)), Effect.tapErrorCause((cause) => Effect.sync(() => log.warn("trigger dispatcher transition failed", {
|
|
25
|
+
spaceId,
|
|
26
|
+
disabled,
|
|
27
|
+
cause
|
|
28
|
+
}, {
|
|
29
|
+
"~LogMeta": "~LogMeta",
|
|
30
|
+
F: __dxlog_file,
|
|
31
|
+
L: 60,
|
|
32
|
+
S: this
|
|
33
|
+
})))));
|
|
34
|
+
const apply = (tracker, spaceId, disabled) => {
|
|
35
|
+
if (tracker.lastDisabled === disabled) return;
|
|
36
|
+
tracker.lastDisabled = disabled;
|
|
37
|
+
if (tracker.inFlight) runtime.runFork(Fiber.interrupt(tracker.inFlight));
|
|
38
|
+
tracker.inFlight = transition(spaceId, disabled);
|
|
39
|
+
};
|
|
40
|
+
const install = (space) => {
|
|
41
|
+
if (trackers.has(space.id)) return;
|
|
42
|
+
const tracker = { unsubscribe: () => {} };
|
|
43
|
+
trackers.set(space.id, tracker);
|
|
44
|
+
space.waitUntilReady().then(() => {
|
|
45
|
+
if (trackers.get(space.id) !== tracker) return;
|
|
46
|
+
const readDisabled = () => space.properties.triggersDisabled ?? false;
|
|
47
|
+
tracker.unsubscribe = Obj.subscribe(space.properties, () => apply(tracker, space.id, readDisabled()));
|
|
48
|
+
apply(tracker, space.id, readDisabled());
|
|
49
|
+
}).catch((err) => log.catch(err, void 0, {
|
|
50
|
+
"~LogMeta": "~LogMeta",
|
|
51
|
+
F: __dxlog_file,
|
|
52
|
+
L: 98,
|
|
53
|
+
S: this
|
|
54
|
+
}));
|
|
55
|
+
};
|
|
56
|
+
const installAll = (spaces) => {
|
|
57
|
+
for (const space of spaces) install(space);
|
|
58
|
+
};
|
|
59
|
+
const spacesSubscription = client.spaces.subscribe(installAll);
|
|
60
|
+
installAll(client.spaces.get());
|
|
61
|
+
return Capability.contributes(Capabilities.Null, null, () => Effect.sync(() => {
|
|
62
|
+
spacesSubscription.unsubscribe();
|
|
63
|
+
for (const tracker of trackers.values()) {
|
|
64
|
+
tracker.unsubscribe();
|
|
65
|
+
if (tracker.inFlight) runtime.runFork(Fiber.interrupt(tracker.inFlight));
|
|
66
|
+
}
|
|
67
|
+
trackers.clear();
|
|
68
|
+
}));
|
|
69
|
+
}));
|
|
70
|
+
//#endregion
|
|
71
|
+
export { trigger_runtime_controller_default as default };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=chunk-trigger-runtime-controller.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-trigger-runtime-controller.mjs","names":[],"sources":["../../src/capabilities/trigger-runtime-controller.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { ServiceResolver } from '@dxos/compute';\nimport { TriggerDispatcher } from '@dxos/compute-runtime';\nimport { Obj } from '@dxos/echo';\nimport { type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { type Space } from '@dxos/react-client/echo';\n\n//\n// Capability Module\n//\n// Watches `space.properties.triggersDisabled` for every space and toggles\n// the per-space {@link TriggerDispatcher} accordingly:\n//\n// - disabled (`true`) → `dispatcher.stop()`\n// - enabled (unset/`false`) → `dispatcher.start()`\n//\n// Per-trigger local/edge routing is handled by the trigger's `remote` flag\n// (the dispatcher skips remote triggers); this space-wide flag is only the\n// kill-switch for local execution. The dispatcher itself is contributed\n// unconditionally via `TriggerDispatcherSpec` in `layer-specs.ts`, so this\n// capability is only responsible for driving its lifecycle.\n//\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const runtime = yield* Capability.get(Capabilities.ProcessManagerRuntime);\n\n /** Per-space property-subscription unsubscribe, last-seen disabled state, and in-flight transition fiber. */\n type Tracker = {\n unsubscribe: () => void;\n lastDisabled?: boolean;\n inFlight?: Fiber.RuntimeFiber<unknown, unknown>;\n };\n const trackers = new Map<SpaceId, Tracker>();\n\n /**\n * Resolve the per-space `TriggerDispatcher` from the process-manager\n * runtime and invoke `start()` / `stop()` according to the requested\n * disabled state. Returns a fiber so the caller can cancel a pending\n * transition when a new one supersedes it.\n */\n const transition = (spaceId: SpaceId, disabled: boolean) =>\n runtime.runFork(\n Effect.gen(function* () {\n const dispatcher = yield* TriggerDispatcher;\n yield* disabled ? dispatcher.stop() : dispatcher.start();\n }).pipe(\n Effect.provide(ServiceResolver.provide({ space: spaceId }, TriggerDispatcher)),\n Effect.tapErrorCause((cause) =>\n Effect.sync(() => log.warn('trigger dispatcher transition failed', { spaceId, disabled, cause })),\n ),\n ),\n );\n\n const apply = (tracker: Tracker, spaceId: SpaceId, disabled: boolean): void => {\n if (tracker.lastDisabled === disabled) {\n return;\n }\n tracker.lastDisabled = disabled;\n if (tracker.inFlight) {\n runtime.runFork(Fiber.interrupt(tracker.inFlight));\n }\n tracker.inFlight = transition(spaceId, disabled);\n };\n\n const install = (space: Space): void => {\n if (trackers.has(space.id)) {\n return;\n }\n // Reserve the slot synchronously so concurrent `client.spaces.subscribe`\n // notifications (e.g. spaces array churn while we await readiness) don't\n // wire a second subscriber for the same space.\n const tracker: Tracker = { unsubscribe: () => {} };\n trackers.set(space.id, tracker);\n\n void space\n .waitUntilReady()\n .then(() => {\n // The capability could have been torn down between `set` and the\n // promise resolving; bail out without subscribing in that case.\n if (trackers.get(space.id) !== tracker) {\n return;\n }\n const readDisabled = (): boolean => space.properties.triggersDisabled ?? false;\n tracker.unsubscribe = Obj.subscribe(space.properties, () => apply(tracker, space.id, readDisabled()));\n apply(tracker, space.id, readDisabled());\n })\n .catch((err) => log.catch(err));\n };\n\n const installAll = (spaces: readonly Space[]): void => {\n for (const space of spaces) {\n install(space);\n }\n };\n\n const spacesSubscription = client.spaces.subscribe(installAll);\n installAll(client.spaces.get());\n\n return Capability.contributes(Capabilities.Null, null, () =>\n Effect.sync(() => {\n spacesSubscription.unsubscribe();\n for (const tracker of trackers.values()) {\n tracker.unsubscribe();\n if (tracker.inFlight) {\n runtime.runFork(Fiber.interrupt(tracker.inFlight));\n }\n }\n trackers.clear();\n }),\n );\n }),\n);\n"],"mappings":";;;;;;;;;;AAgCA,IAAA,qCAAe,WAAW,WACxB,OAAO,WAAW,aAAa;CAC7B,MAAM,SAAS,OAAO,WAAW,IAAI,mBAAmB,MAAM;CAC9D,MAAM,UAAU,OAAO,WAAW,IAAI,aAAa,qBAAqB;CAQxE,MAAM,2BAAW,IAAI,IAAsB;;;;;;;CAQ3C,MAAM,cAAc,SAAkB,aACpC,QAAQ,QACN,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO;EAC1B,OAAO,WAAW,WAAW,KAAK,IAAI,WAAW,MAAM;CACzD,CAAC,CAAC,CAAC,KACD,OAAO,QAAQ,gBAAgB,QAAQ,EAAE,OAAO,QAAQ,GAAG,iBAAiB,CAAC,GAC7E,OAAO,eAAe,UACpB,OAAO,WAAW,IAAI,KAAK,wCAAwC;EAAE;EAAS;EAAU;CAAM,GAAA;EAAA,YAAA;EAAA,GAAA;EAAA,GAAA;EAAA,GAAA;CAAA,CAAC,CAAC,CAClG,CACF,CACF;CAEF,MAAM,SAAS,SAAkB,SAAkB,aAA4B;EAC7E,IAAI,QAAQ,iBAAiB,UAC3B;EAEF,QAAQ,eAAe;EACvB,IAAI,QAAQ,UACV,QAAQ,QAAQ,MAAM,UAAU,QAAQ,QAAQ,CAAC;EAEnD,QAAQ,WAAW,WAAW,SAAS,QAAQ;CACjD;CAEA,MAAM,WAAW,UAAuB;EACtC,IAAI,SAAS,IAAI,MAAM,EAAE,GACvB;EAKF,MAAM,UAAmB,EAAE,mBAAmB,CAAC,EAAE;EACjD,SAAS,IAAI,MAAM,IAAI,OAAO;EAE9B,MACG,eAAe,CAAA,CACf,WAAW;GAGV,IAAI,SAAS,IAAI,MAAM,EAAE,MAAM,SAC7B;GAEF,MAAM,qBAA8B,MAAM,WAAW,oBAAoB;GACzE,QAAQ,cAAc,IAAI,UAAU,MAAM,kBAAkB,MAAM,SAAS,MAAM,IAAI,aAAa,CAAC,CAAC;GACpG,MAAM,SAAS,MAAM,IAAI,aAAa,CAAC;EACzC,CAAC,CAAA,CACA,OAAO,QAAQ,IAAI,MAAM,KAAE,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC,CAAC;CAClC;CAEA,MAAM,cAAc,WAAmC;EACrD,KAAK,MAAM,SAAS,QAClB,QAAQ,KAAK;CAEjB;CAEA,MAAM,qBAAqB,OAAO,OAAO,UAAU,UAAU;CAC7D,WAAW,OAAO,OAAO,IAAI,CAAC;CAE9B,OAAO,WAAW,YAAY,aAAa,MAAM,YAC/C,OAAO,WAAW;EAChB,mBAAmB,YAAY;EAC/B,KAAK,MAAM,WAAW,SAAS,OAAO,GAAG;GACvC,QAAQ,YAAY;GACpB,IAAI,QAAQ,UACV,QAAQ,QAAQ,MAAM,UAAU,QAAQ,QAAQ,CAAC;EAErD;EACA,SAAS,MAAM;CACjB,CAAC,CACH;AACF,CAAC,CACH"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Capability } from "@dxos/app-framework";
|
|
2
|
+
import { Instructions, Operation, Routine, Trigger } from "@dxos/compute";
|
|
3
|
+
import { meta } from "#meta";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import { DXN, Database, Obj, Ref, Type } from "@dxos/echo";
|
|
6
|
+
import { Chat } from "@dxos/assistant-toolkit";
|
|
7
|
+
import { EID as _EchoURIReference } from "@dxos/keys";
|
|
8
|
+
//#region \0rolldown/runtime.js
|
|
9
|
+
var __defProp = Object.defineProperty;
|
|
10
|
+
var __exportAll = (all, no_symbols) => {
|
|
11
|
+
let target = {};
|
|
12
|
+
for (var name in all) __defProp(target, name, {
|
|
13
|
+
get: all[name],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
17
|
+
return target;
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/types/schema.ts
|
|
21
|
+
var TriggerTemplate = Schema.Union(Schema.Struct({
|
|
22
|
+
type: Schema.Literal("timer"),
|
|
23
|
+
cron: Schema.String
|
|
24
|
+
}), Schema.Struct({
|
|
25
|
+
type: Schema.Literal("feed"),
|
|
26
|
+
feed: Schema.Any
|
|
27
|
+
}));
|
|
28
|
+
var AutomationAction;
|
|
29
|
+
(function(_AutomationAction) {
|
|
30
|
+
class CreateTriggerFromTemplate extends Schema.TaggedClass()(`${meta.profile.key}.action.create-trigger-from-template`, {
|
|
31
|
+
input: Schema.Struct({
|
|
32
|
+
db: Database.Database,
|
|
33
|
+
template: TriggerTemplate,
|
|
34
|
+
enabled: Schema.optional(Schema.Boolean),
|
|
35
|
+
scriptName: Schema.optional(Schema.String),
|
|
36
|
+
input: Schema.optional(Schema.Record({
|
|
37
|
+
key: Schema.String,
|
|
38
|
+
value: Schema.Any
|
|
39
|
+
}))
|
|
40
|
+
}),
|
|
41
|
+
output: Schema.Void
|
|
42
|
+
}) {}
|
|
43
|
+
_AutomationAction.CreateTriggerFromTemplate = CreateTriggerFromTemplate;
|
|
44
|
+
})(AutomationAction || (AutomationAction = {}));
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/types/RoutineCapabilities.ts
|
|
47
|
+
var RoutineCapabilities_exports = /* @__PURE__ */ __exportAll({
|
|
48
|
+
AgentDelegationStrategy: () => AgentDelegationStrategy,
|
|
49
|
+
BlankTemplateId: () => BlankTemplateId,
|
|
50
|
+
Template: () => Template
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Optional supervisor strategy for the agent chat service. When contributed (by a plugin that knows
|
|
54
|
+
* the agent/plan model, e.g. plugin-assistant), the conversational agent delegates outstanding work
|
|
55
|
+
* to sub-agents and folds their results back into the conversation. Consumed by the AgentService
|
|
56
|
+
* LayerSpec; absent by default (a plain conversational agent).
|
|
57
|
+
*/
|
|
58
|
+
var AgentDelegationStrategy = Capability.make("org.dxos.plugin.routine.capability.agentDelegationStrategy");
|
|
59
|
+
/**
|
|
60
|
+
* Id of the built-in blank template. Declared here (rather than on the template itself) so callers that
|
|
61
|
+
* scaffold a routine without the picker — e.g. a project's toolbar — can name it without importing the
|
|
62
|
+
* template module.
|
|
63
|
+
*/
|
|
64
|
+
var BlankTemplateId = "org.dxos.routine.blank";
|
|
65
|
+
var Template = Capability.make("org.dxos.plugin.routine.capability.template");
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region src/types/RoutineOperation.ts
|
|
68
|
+
var RoutineOperation_exports = /* @__PURE__ */ __exportAll({
|
|
69
|
+
CreateRoutine: () => CreateRoutine,
|
|
70
|
+
CreateTriggerFromTemplate: () => CreateTriggerFromTemplate,
|
|
71
|
+
RunPromptInNewChat: () => RunPromptInNewChat,
|
|
72
|
+
RunRoutine: () => RunRoutine,
|
|
73
|
+
_EchoURIReference: () => _EchoURIReference
|
|
74
|
+
});
|
|
75
|
+
var makeKey = (name) => DXN.make(`${meta.profile.key}.operation.${name}`);
|
|
76
|
+
var CreateTriggerFromTemplate = Operation.make({
|
|
77
|
+
meta: {
|
|
78
|
+
key: makeKey("createTriggerFromTemplate"),
|
|
79
|
+
name: "Create Trigger From Template",
|
|
80
|
+
icon: "ph--lightning--regular"
|
|
81
|
+
},
|
|
82
|
+
services: [Capability.Service],
|
|
83
|
+
input: Schema.Struct({
|
|
84
|
+
db: Database.Database,
|
|
85
|
+
template: TriggerTemplate,
|
|
86
|
+
enabled: Schema.optional(Schema.Boolean),
|
|
87
|
+
scriptName: Schema.optional(Schema.String),
|
|
88
|
+
input: Schema.optional(Schema.Record({
|
|
89
|
+
key: Schema.String,
|
|
90
|
+
value: Schema.Any
|
|
91
|
+
}))
|
|
92
|
+
}),
|
|
93
|
+
output: Schema.Void
|
|
94
|
+
});
|
|
95
|
+
var CreateRoutine = Operation.make({
|
|
96
|
+
meta: {
|
|
97
|
+
key: makeKey("createAutomation"),
|
|
98
|
+
name: "Create Routine",
|
|
99
|
+
icon: "ph--lightning--regular"
|
|
100
|
+
},
|
|
101
|
+
services: [Capability.Service],
|
|
102
|
+
input: Schema.Struct({
|
|
103
|
+
db: Database.Database,
|
|
104
|
+
templateId: Schema.String,
|
|
105
|
+
name: Schema.optional(Schema.String),
|
|
106
|
+
subject: Schema.optional(Obj.Unknown)
|
|
107
|
+
}),
|
|
108
|
+
output: Schema.Struct({
|
|
109
|
+
id: Schema.String,
|
|
110
|
+
subject: Schema.Array(Schema.String),
|
|
111
|
+
object: Obj.Unknown
|
|
112
|
+
})
|
|
113
|
+
});
|
|
114
|
+
var RunPromptInNewChat = Operation.make({
|
|
115
|
+
meta: {
|
|
116
|
+
key: makeKey("runPromptInNewChat"),
|
|
117
|
+
name: "Run Prompt In New Chat",
|
|
118
|
+
icon: "ph--chat-text--regular"
|
|
119
|
+
},
|
|
120
|
+
services: [Capability.Service],
|
|
121
|
+
input: Schema.Struct({
|
|
122
|
+
db: Database.Database,
|
|
123
|
+
/** Context objects to bind to the new chat. */
|
|
124
|
+
objects: Schema.optional(Schema.Array(Obj.Unknown)),
|
|
125
|
+
/** Skill keys to look up and bind to the new chat. */
|
|
126
|
+
skills: Schema.optional(Schema.Array(Schema.String)),
|
|
127
|
+
/** Raw instructions or an existing Routine object reference. */
|
|
128
|
+
instructions: Schema.Union(Schema.String, Ref.Ref(Instructions.Instructions)),
|
|
129
|
+
/**
|
|
130
|
+
* When true, skips opening the chat: runs the Agent prompt operation against the new chat via the compute runtime (traced).
|
|
131
|
+
*/
|
|
132
|
+
background: Schema.optional(Schema.Boolean)
|
|
133
|
+
}),
|
|
134
|
+
output: Schema.Struct({ object: Type.getSchema(Chat.Chat) })
|
|
135
|
+
});
|
|
136
|
+
var RunRoutine = Operation.make({
|
|
137
|
+
meta: {
|
|
138
|
+
key: makeKey("runAutomation"),
|
|
139
|
+
name: "Run Routine",
|
|
140
|
+
icon: "ph--play--regular"
|
|
141
|
+
},
|
|
142
|
+
services: [Capability.Service, Trigger.TriggerMonitorService],
|
|
143
|
+
input: Schema.Struct({ routine: Ref.Ref(Routine.Routine) }),
|
|
144
|
+
output: Schema.Void
|
|
145
|
+
});
|
|
146
|
+
//#endregion
|
|
147
|
+
export { RoutineCapabilities_exports as a, TriggerTemplate as c, RunRoutine as i, CreateTriggerFromTemplate as n, Template as o, RoutineOperation_exports as r, AutomationAction as s, CreateRoutine as t };
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=chunk-types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-types.mjs","names":[],"sources":["../../src/types/schema.ts","../../src/types/RoutineCapabilities.ts","../../src/types/RoutineOperation.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Database } from '@dxos/echo';\n\nimport { meta } from '#meta';\n\nexport const TriggerTemplate = Schema.Union(\n Schema.Struct({ type: Schema.Literal('timer'), cron: Schema.String }),\n Schema.Struct({ type: Schema.Literal('feed'), feed: Schema.Any }),\n);\n\nexport namespace AutomationAction {\n export class CreateTriggerFromTemplate extends Schema.TaggedClass<CreateTriggerFromTemplate>()(\n `${meta.profile.key}.action.create-trigger-from-template`,\n {\n input: Schema.Struct({\n db: Database.Database,\n template: TriggerTemplate,\n enabled: Schema.optional(Schema.Boolean),\n // TODO(wittjosiah): Improve how this lookup is done.\n scriptName: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n output: Schema.Void,\n },\n ) {}\n}\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport type * as Effect from 'effect/Effect';\n\nimport type { DelegationStrategy } from '@dxos/agent-runtime';\nimport { Capability } from '@dxos/app-framework';\nimport type { Routine } from '@dxos/compute';\nimport type { Database, Obj } from '@dxos/echo';\n\n/**\n * Optional supervisor strategy for the agent chat service. When contributed (by a plugin that knows\n * the agent/plan model, e.g. plugin-assistant), the conversational agent delegates outstanding work\n * to sub-agents and folds their results back into the conversation. Consumed by the AgentService\n * LayerSpec; absent by default (a plain conversational agent).\n */\nexport const AgentDelegationStrategy = Capability.make<DelegationStrategy>(\n 'org.dxos.plugin.routine.capability.agentDelegationStrategy',\n);\n\n/**\n * Id of the built-in blank template. Declared here (rather than on the template itself) so callers that\n * scaffold a routine without the picker — e.g. a project's toolbar — can name it without importing the\n * template module.\n */\nexport const BlankTemplateId = 'org.dxos.routine.blank';\n\n/**\n * An automation template contributed by a plugin. The create dialog and the per-object \"Automations\"\n * companion list contributed templates (`Capability.getAll(RoutineCapabilities.Template)`) and run the\n * chosen template's `scaffold` to build the automation.\n */\nexport type Template = {\n /** Stable id (e.g. 'org.dxos.routine.blank'). */\n id: string;\n /** Human-readable label shown in the picker. */\n label: string;\n /** Optional Phosphor icon name. */\n icon?: string;\n /**\n * Whether this template applies to the given companion subject. The subject is the object whose\n * \"Automations\" companion is open, or undefined in the global create dialog. Templates that need a\n * specific subject (e.g. a feed-bearing Mailbox) gate themselves here. Defaults to always-applies.\n */\n appliesTo?: (subject?: Obj.Unknown) => boolean;\n /**\n * Build the routine as a fully-wired in-memory {@link Routine.Routine} graph — the routine plus its owned\n * trigger and instructions, assembled by `makeRoutine`. The create flow persists it with a single\n * `Database.add` (which cascades the owned children); scaffold must NOT call `Database.add` itself.\n * `Database.Service` may still be used for read-only lookups (e.g. loading a feed ref). `subject` is set\n * when scaffolding from an object's companion.\n */\n scaffold: (ctx: { name?: string; subject?: Obj.Unknown }) => Effect.Effect<Routine.Routine, Error, Database.Service>;\n};\n\nexport const Template = Capability.make<Template>('org.dxos.plugin.routine.capability.template');\n","//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Chat } from '@dxos/assistant-toolkit';\nimport { Instructions, Operation, Routine, Trigger } from '@dxos/compute';\nimport { Database, DXN, Obj, Ref, Type } from '@dxos/echo';\n// Value-side `EID` import keeps TS declaration emit portable — `TriggerTemplate`\n// references `EID.Schema` and the inferred `CreateTriggerFromTemplate` type\n// otherwise needs a transitive `@dxos/keys` import that's hard for d.ts emit to surface.\nimport { EID as _EchoURIReference } from '@dxos/keys';\n\nimport { meta } from '#meta';\n\nimport { TriggerTemplate } from './schema';\nexport { _EchoURIReference };\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\nexport const CreateTriggerFromTemplate = Operation.make({\n meta: {\n key: makeKey('createTriggerFromTemplate'),\n name: 'Create Trigger From Template',\n icon: 'ph--lightning--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n db: Database.Database,\n template: TriggerTemplate,\n enabled: Schema.optional(Schema.Boolean),\n scriptName: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n output: Schema.Void,\n});\n\n// The single creation entrypoint for every path (create dialog, companion, sidebar) so placement and\n// ownership are established in one place. Output mirrors `SpaceCapabilities.CreateObjectResult`.\nexport const CreateRoutine = Operation.make({\n meta: {\n key: makeKey('createAutomation'),\n name: 'Create Routine',\n icon: 'ph--lightning--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n db: Database.Database,\n templateId: Schema.String,\n name: Schema.optional(Schema.String),\n subject: Schema.optional(Obj.Unknown),\n }),\n output: Schema.Struct({\n id: Schema.String,\n subject: Schema.Array(Schema.String),\n object: Obj.Unknown,\n }),\n});\n\nexport const RunPromptInNewChat = Operation.make({\n meta: {\n key: makeKey('runPromptInNewChat'),\n name: 'Run Prompt In New Chat',\n icon: 'ph--chat-text--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n db: Database.Database,\n /** Context objects to bind to the new chat. */\n objects: Schema.optional(Schema.Array(Obj.Unknown)),\n /** Skill keys to look up and bind to the new chat. */\n skills: Schema.optional(Schema.Array(Schema.String)),\n /** Raw instructions or an existing Routine object reference. */\n instructions: Schema.Union(Schema.String, Ref.Ref(Instructions.Instructions)),\n /**\n * When true, skips opening the chat: runs the Agent prompt operation against the new chat via the compute runtime (traced).\n */\n background: Schema.optional(Schema.Boolean),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Chat.Chat),\n }),\n});\n\n// Runs a routine's action now, routed by its first trigger — that is where both the runnable's input\n// (e.g. a sync routine's binding cursor) and the `remote` flag live. A `remote` trigger force-runs on the\n// EDGE dispatcher over HTTP, since that is the only runtime it is registered on; a local one runs\n// in-process. Without the trigger a manual run would invoke an input-taking runnable with nothing, and\n// would silently run an edge routine on the client.\nexport const RunRoutine = Operation.make({\n meta: {\n key: makeKey('runAutomation'),\n name: 'Run Routine',\n icon: 'ph--play--regular',\n },\n services: [Capability.Service, Trigger.TriggerMonitorService],\n input: Schema.Struct({\n routine: Ref.Ref(Routine.Routine),\n }),\n output: Schema.Void,\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAUA,IAAa,kBAAkB,OAAO,MACpC,OAAO,OAAO;CAAE,MAAM,OAAO,QAAQ,OAAO;CAAG,MAAM,OAAO;AAAO,CAAC,GACpE,OAAO,OAAO;CAAE,MAAM,OAAO,QAAQ,MAAM;CAAG,MAAM,OAAO;AAAI,CAAC,CAClE;AAEO,IAAA;;CACE,MAAM,kCAAkC,OAAO,YAAuC,CAAC,CAC5F,GAAG,KAAK,QAAQ,IAAI,uCACpB;EACE,OAAO,OAAO,OAAO;GACnB,IAAI,SAAS;GACb,UAAU;GACV,SAAS,OAAO,SAAS,OAAO,OAAO;GAEvC,YAAY,OAAO,SAAS,OAAO,MAAM;GACzC,OAAO,OAAO,SAAS,OAAO,OAAO;IAAE,KAAK,OAAO;IAAQ,OAAO,OAAO;GAAI,CAAC,CAAC;EACjF,CAAC;EACD,QAAQ,OAAO;CACjB,CACF,CAAC,CAAC,CAAC;;GACL,qBAAA,mBAAA,CAAA,EAAA;;;;;;;;;;;;;;ACbA,IAAa,0BAA0B,WAAW,KAChD,4DACF;;;;;;AAOA,IAAa,kBAAkB;AA8B/B,IAAa,WAAW,WAAW,KAAe,6CAA6C;;;;;;;;;;AClC/F,IAAM,WAAW,SAAiB,IAAI,KAAK,GAAG,KAAK,QAAQ,IAAI,aAAa,MAAM;AAElF,IAAa,4BAA4B,UAAU,KAAK;CACtD,MAAM;EACJ,KAAK,QAAQ,2BAA2B;EACxC,MAAM;EACN,MAAM;CACR;CACA,UAAU,CAAC,WAAW,OAAO;CAC7B,OAAO,OAAO,OAAO;EACnB,IAAI,SAAS;EACb,UAAU;EACV,SAAS,OAAO,SAAS,OAAO,OAAO;EACvC,YAAY,OAAO,SAAS,OAAO,MAAM;EACzC,OAAO,OAAO,SAAS,OAAO,OAAO;GAAE,KAAK,OAAO;GAAQ,OAAO,OAAO;EAAI,CAAC,CAAC;CACjF,CAAC;CACD,QAAQ,OAAO;AACjB,CAAC;AAID,IAAa,gBAAgB,UAAU,KAAK;CAC1C,MAAM;EACJ,KAAK,QAAQ,kBAAkB;EAC/B,MAAM;EACN,MAAM;CACR;CACA,UAAU,CAAC,WAAW,OAAO;CAC7B,OAAO,OAAO,OAAO;EACnB,IAAI,SAAS;EACb,YAAY,OAAO;EACnB,MAAM,OAAO,SAAS,OAAO,MAAM;EACnC,SAAS,OAAO,SAAS,IAAI,OAAO;CACtC,CAAC;CACD,QAAQ,OAAO,OAAO;EACpB,IAAI,OAAO;EACX,SAAS,OAAO,MAAM,OAAO,MAAM;EACnC,QAAQ,IAAI;CACd,CAAC;AACH,CAAC;AAED,IAAa,qBAAqB,UAAU,KAAK;CAC/C,MAAM;EACJ,KAAK,QAAQ,oBAAoB;EACjC,MAAM;EACN,MAAM;CACR;CACA,UAAU,CAAC,WAAW,OAAO;CAC7B,OAAO,OAAO,OAAO;EACnB,IAAI,SAAS;;EAEb,SAAS,OAAO,SAAS,OAAO,MAAM,IAAI,OAAO,CAAC;;EAElD,QAAQ,OAAO,SAAS,OAAO,MAAM,OAAO,MAAM,CAAC;;EAEnD,cAAc,OAAO,MAAM,OAAO,QAAQ,IAAI,IAAI,aAAa,YAAY,CAAC;;;;EAI5E,YAAY,OAAO,SAAS,OAAO,OAAO;CAC5C,CAAC;CACD,QAAQ,OAAO,OAAO,EACpB,QAAQ,KAAK,UAAU,KAAK,IAAI,EAClC,CAAC;AACH,CAAC;AAOD,IAAa,aAAa,UAAU,KAAK;CACvC,MAAM;EACJ,KAAK,QAAQ,eAAe;EAC5B,MAAM;EACN,MAAM;CACR;CACA,UAAU,CAAC,WAAW,SAAS,QAAQ,qBAAqB;CAC5D,OAAO,OAAO,OAAO,EACnB,SAAS,IAAI,IAAI,QAAQ,OAAO,EAClC,CAAC;CACD,QAAQ,OAAO;AACjB,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Instructions, Routine, Trigger } from "@dxos/compute";
|
|
2
|
+
import { Filter, Obj, Query, Ref } from "@dxos/echo";
|
|
3
|
+
import { RunInstructions } from "@dxos/assistant-toolkit";
|
|
4
|
+
import { Cursor } from "@dxos/link";
|
|
5
|
+
//#region src/util/routines-for-object.ts
|
|
6
|
+
/**
|
|
7
|
+
* Reactive query for all routines connected to an object O, via three structural paths:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Trigger path** (two hops): O is referenced by a Trigger (via `input` or `spec.feed`), and that
|
|
10
|
+
* Trigger is referenced by a Routine's `triggers` array.
|
|
11
|
+
* 2. **Cursor path** (three hops): a sync Trigger doesn't reference its synced target directly — its `binding`
|
|
12
|
+
* references an external-sync {@link Cursor}, and the Cursor's `spec.target` references O. So O is reached
|
|
13
|
+
* one hop further out (O ← Cursor ← Trigger ← Routine), keeping the target ref out of the operation input.
|
|
14
|
+
* 3. **Instructions path** (two hops): O is listed in an Instructions' `objects` context array, and those
|
|
15
|
+
* Instructions are the Routine's action (`spec.instructions`). Both hops traverse `Ref` fields, so they are
|
|
16
|
+
* fully queryable — no JavaScript parent-symbol traversal needed.
|
|
17
|
+
*
|
|
18
|
+
* ECHO's reverse-ref index is structural — it tracks every `Ref` regardless of schema path, including
|
|
19
|
+
* nested untyped records and union fields — so all variants are covered.
|
|
20
|
+
*/
|
|
21
|
+
var connectedRoutinesQuery = (object) => {
|
|
22
|
+
const byInput = Query.select(Filter.id(object.id)).referencedBy(Trigger.Trigger);
|
|
23
|
+
const byFeed = Query.select(Filter.id(object.id)).reference("feed").referencedBy(Trigger.Trigger);
|
|
24
|
+
const byCursor = Query.select(Filter.id(object.id)).referencedBy(Cursor.Cursor).referencedBy(Trigger.Trigger);
|
|
25
|
+
const byTrigger = Query.all(byInput, byFeed, byCursor).referencedBy(Routine.Routine, "triggers");
|
|
26
|
+
const byInstructions = Query.select(Filter.id(object.id)).referencedBy(Instructions.Instructions, "objects").referencedBy(Routine.Routine);
|
|
27
|
+
return Query.all(byTrigger, byInstructions);
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Pure predicate equivalent of {@link connectedRoutinesQuery}, over a pre-queried list of routines.
|
|
31
|
+
* Kept for unit tests (asserting the query and predicate agree) and the deferred quick-association check.
|
|
32
|
+
*/
|
|
33
|
+
var routinesForObject = (object, routines) => routines.filter((routine) => routineReferencesObject(routine, object));
|
|
34
|
+
var routineReferencesObject = (routine, object) => referencesViaTrigger(routine, object) || referencesViaInstructions(routine, object);
|
|
35
|
+
/**
|
|
36
|
+
* Trigger path: a trigger's `input` references O (directly, or via a bound {@link Cursor} whose `spec.target`
|
|
37
|
+
* is O), or a feed trigger is bound to O's feed.
|
|
38
|
+
*/
|
|
39
|
+
var referencesViaTrigger = (routine, object) => {
|
|
40
|
+
const objectFeedId = getFeedId(object);
|
|
41
|
+
return routine.triggers.some((ref) => {
|
|
42
|
+
const trigger = ref.target;
|
|
43
|
+
if (!Obj.instanceOf(Trigger.Trigger, trigger)) return false;
|
|
44
|
+
if (trigger.spec?.kind === "feed" && objectFeedId && trigger.spec.feed?.target?.id === objectFeedId) return true;
|
|
45
|
+
if (trigger.input == null) return false;
|
|
46
|
+
return referencesId(trigger.input, object.id) || referencesViaCursor(trigger.input, object.id);
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
/** Instructions path: the routine's owned instructions list O in their `objects` context array. */
|
|
50
|
+
var referencesViaInstructions = (routine, object) => Routine.instructionsRef(routine)?.target?.objects?.some((ref) => ref.target?.id === object.id) ?? false;
|
|
51
|
+
/** The feed id a feed-annotated object points at (e.g. `mailbox.feed`), if any. */
|
|
52
|
+
var getFeedId = (object) => {
|
|
53
|
+
const feedRef = object.feed;
|
|
54
|
+
return Ref.isRef(feedRef) ? feedRef.target?.id : void 0;
|
|
55
|
+
};
|
|
56
|
+
/** Recursively scan a value for a Cursor ref (e.g. a sync trigger's `binding`) that itself references O. */
|
|
57
|
+
var referencesViaCursor = (value, id) => {
|
|
58
|
+
if (Ref.isRef(value)) {
|
|
59
|
+
const cursor = value.target;
|
|
60
|
+
return Obj.instanceOf(Cursor.Cursor, cursor) && referencesId(cursor.spec, id);
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(value)) return value.some((entry) => referencesViaCursor(entry, id));
|
|
63
|
+
if (value && typeof value === "object") return Object.values(value).some((entry) => referencesViaCursor(entry, id));
|
|
64
|
+
return false;
|
|
65
|
+
};
|
|
66
|
+
/** Recursively scan a value for a Ref whose target is the given object id. */
|
|
67
|
+
var referencesId = (value, id) => {
|
|
68
|
+
if (Ref.isRef(value)) return value.target?.id === id;
|
|
69
|
+
if (Array.isArray(value)) return value.some((entry) => referencesId(entry, id));
|
|
70
|
+
if (value && typeof value === "object") return Object.values(value).some((entry) => referencesId(entry, id));
|
|
71
|
+
return false;
|
|
72
|
+
};
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/util/run-instructions.ts
|
|
75
|
+
/** A ref to the shared RunInstructions operation in the registry (resolved via the registry, not the database). */
|
|
76
|
+
var runInstructionsRef = () => Ref.fromURI(RunInstructions.meta.key);
|
|
77
|
+
/** Whether a trigger's `function` ref targets the registry RunInstructions operation (i.e. an instructions action). */
|
|
78
|
+
var isRunInstructions = (fn) => Ref.isRef(fn) && fn.uri === RunInstructions.meta.key;
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/util/wire.ts
|
|
81
|
+
/** Strip a stale `instructions` binding from a trigger input. */
|
|
82
|
+
var withoutInstructions = (input) => {
|
|
83
|
+
if (!input || !("instructions" in input)) return input;
|
|
84
|
+
const { instructions: _drop, ...rest } = input;
|
|
85
|
+
return rest;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Wire the routine's owned triggers to dispatch its current action (`spec`): an instructions action sets each
|
|
89
|
+
* trigger's `runnable` to RunInstructions with the owned instructions bound into `input`; an operation action
|
|
90
|
+
* binds the operation directly and drops any stale instructions binding. Call after the action (`spec`) changes
|
|
91
|
+
* so a trigger never keeps a binding for the previous action.
|
|
92
|
+
*/
|
|
93
|
+
var wireTriggers = (routine) => {
|
|
94
|
+
const instructions = Routine.instructionsRef(routine);
|
|
95
|
+
const fn = instructions ? runInstructionsRef() : Routine.runnableRef(routine);
|
|
96
|
+
for (const ref of routine.triggers) {
|
|
97
|
+
const trigger = ref.target;
|
|
98
|
+
if (!trigger) continue;
|
|
99
|
+
Obj.update(trigger, (trigger) => {
|
|
100
|
+
trigger.runnable = fn;
|
|
101
|
+
const base = withoutInstructions(trigger.input);
|
|
102
|
+
trigger.input = instructions ? {
|
|
103
|
+
input: {},
|
|
104
|
+
...base,
|
|
105
|
+
instructions
|
|
106
|
+
} : base;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Creates a fully-wired in-memory routine graph. `instructions` and `trigger` are optional extras beyond the
|
|
112
|
+
* schema fields: when provided they are parented under the routine and wired together (runnable, trigger
|
|
113
|
+
* runnable, the trigger's instructions input binding, and the `triggers` ref) so that a single `Database.add`
|
|
114
|
+
* cascades the whole graph. `triggers` defaults to `[]` so callers that supply a `trigger` need not provide it.
|
|
115
|
+
*/
|
|
116
|
+
var makeRoutine = ({ instructions, trigger, triggers = [], ...props }) => {
|
|
117
|
+
const routine = Routine.make({
|
|
118
|
+
...props,
|
|
119
|
+
triggers
|
|
120
|
+
});
|
|
121
|
+
if (instructions) {
|
|
122
|
+
Obj.setParent(instructions, routine);
|
|
123
|
+
Obj.update(routine, (routine) => {
|
|
124
|
+
routine.spec = {
|
|
125
|
+
kind: "instructions",
|
|
126
|
+
instructions: Ref.make(instructions)
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (trigger) {
|
|
131
|
+
Obj.setParent(trigger, routine);
|
|
132
|
+
Obj.update(routine, (routine) => {
|
|
133
|
+
routine.triggers.push(Ref.make(trigger));
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (routine.spec) wireTriggers(routine);
|
|
137
|
+
return routine;
|
|
138
|
+
};
|
|
139
|
+
//#endregion
|
|
140
|
+
export { connectedRoutinesQuery as a, runInstructionsRef as i, wireTriggers as n, routineReferencesObject as o, isRunInstructions as r, routinesForObject as s, makeRoutine as t };
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=chunk-util.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-util.mjs","names":[],"sources":["../../src/util/routines-for-object.ts","../../src/util/run-instructions.ts","../../src/util/wire.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { Instructions, Routine, Trigger } from '@dxos/compute';\nimport { Filter, Obj, Query, Ref } from '@dxos/echo';\nimport { Cursor } from '@dxos/link';\n\n/**\n * Reactive query for all routines connected to an object O, via three structural paths:\n *\n * 1. **Trigger path** (two hops): O is referenced by a Trigger (via `input` or `spec.feed`), and that\n * Trigger is referenced by a Routine's `triggers` array.\n * 2. **Cursor path** (three hops): a sync Trigger doesn't reference its synced target directly — its `binding`\n * references an external-sync {@link Cursor}, and the Cursor's `spec.target` references O. So O is reached\n * one hop further out (O ← Cursor ← Trigger ← Routine), keeping the target ref out of the operation input.\n * 3. **Instructions path** (two hops): O is listed in an Instructions' `objects` context array, and those\n * Instructions are the Routine's action (`spec.instructions`). Both hops traverse `Ref` fields, so they are\n * fully queryable — no JavaScript parent-symbol traversal needed.\n *\n * ECHO's reverse-ref index is structural — it tracks every `Ref` regardless of schema path, including\n * nested untyped records and union fields — so all variants are covered.\n */\nexport const connectedRoutinesQuery = (object: Obj.Unknown): Query.Query<Routine.Routine> => {\n // Trigger path: O ← Trigger (any ref path, incl. nested `input`) ← Routine.triggers.\n const byInput = Query.select(Filter.id(object.id)).referencedBy(Trigger.Trigger);\n // Feed variant: O's feed ← Trigger.spec.feed ← Routine.triggers.\n // `.reference('feed')` is empty for objects without a feed prop, so this adds nothing for non-feed objects.\n const byFeed = Query.select(Filter.id(object.id)).reference('feed').referencedBy(Trigger.Trigger);\n // Cursor variant: O ← Cursor (spec.target) ← Trigger (input.binding) ← Routine.triggers.\n const byCursor = Query.select(Filter.id(object.id)).referencedBy(Cursor.Cursor).referencedBy(Trigger.Trigger);\n const byTrigger = Query.all(byInput, byFeed, byCursor).referencedBy(Routine.Routine, 'triggers');\n\n // Instructions path: O ← Instructions.objects ← Routine (via `spec.instructions`). The second hop drops the\n // property key: the instructions ref is nested in the `spec` union, and the reverse-ref index is structural,\n // so a keyless `referencedBy` matches it (a routine only references its own owned instructions here).\n const byInstructions = Query.select(Filter.id(object.id))\n .referencedBy(Instructions.Instructions, 'objects')\n .referencedBy(Routine.Routine);\n\n return Query.all(byTrigger, byInstructions);\n};\n\n/**\n * Pure predicate equivalent of {@link connectedRoutinesQuery}, over a pre-queried list of routines.\n * Kept for unit tests (asserting the query and predicate agree) and the deferred quick-association check.\n */\nexport const routinesForObject = (object: Obj.Unknown, routines: Routine.Routine[]): Routine.Routine[] =>\n routines.filter((routine) => routineReferencesObject(routine, object));\n\nexport const routineReferencesObject = (routine: Routine.Routine, object: Obj.Unknown): boolean =>\n referencesViaTrigger(routine, object) || referencesViaInstructions(routine, object);\n\n/**\n * Trigger path: a trigger's `input` references O (directly, or via a bound {@link Cursor} whose `spec.target`\n * is O), or a feed trigger is bound to O's feed.\n */\nconst referencesViaTrigger = (routine: Routine.Routine, object: Obj.Unknown): boolean => {\n const objectFeedId = getFeedId(object);\n return routine.triggers.some((ref) => {\n const trigger = ref.target;\n if (!Obj.instanceOf(Trigger.Trigger, trigger)) {\n return false;\n }\n\n if (trigger.spec?.kind === 'feed' && objectFeedId && trigger.spec.feed?.target?.id === objectFeedId) {\n return true;\n }\n\n if (trigger.input == null) {\n return false;\n }\n return referencesId(trigger.input, object.id) || referencesViaCursor(trigger.input, object.id);\n });\n};\n\n/** Instructions path: the routine's owned instructions list O in their `objects` context array. */\nconst referencesViaInstructions = (routine: Routine.Routine, object: Obj.Unknown): boolean =>\n Routine.instructionsRef(routine)?.target?.objects?.some((ref) => ref.target?.id === object.id) ?? false;\n\n/** The feed id a feed-annotated object points at (e.g. `mailbox.feed`), if any. */\nconst getFeedId = (object: Obj.Unknown): string | undefined => {\n const feedRef = (object as { feed?: Ref.Ref<unknown> }).feed;\n return Ref.isRef(feedRef) ? feedRef.target?.id : undefined;\n};\n\n/** Recursively scan a value for a Cursor ref (e.g. a sync trigger's `binding`) that itself references O. */\nconst referencesViaCursor = (value: unknown, id: string): boolean => {\n if (Ref.isRef(value)) {\n const cursor = value.target;\n return Obj.instanceOf(Cursor.Cursor, cursor) && referencesId(cursor.spec, id);\n }\n if (Array.isArray(value)) {\n return value.some((entry) => referencesViaCursor(entry, id));\n }\n if (value && typeof value === 'object') {\n return Object.values(value).some((entry) => referencesViaCursor(entry, id));\n }\n return false;\n};\n\n/** Recursively scan a value for a Ref whose target is the given object id. */\nconst referencesId = (value: unknown, id: string): boolean => {\n if (Ref.isRef(value)) {\n return value.target?.id === id;\n }\n if (Array.isArray(value)) {\n return value.some((entry) => referencesId(entry, id));\n }\n if (value && typeof value === 'object') {\n return Object.values(value).some((entry) => referencesId(entry, id));\n }\n return false;\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { RunInstructions } from '@dxos/assistant-toolkit';\nimport { Ref } from '@dxos/echo';\n\n/** A ref to the shared RunInstructions operation in the registry (resolved via the registry, not the database). */\nexport const runInstructionsRef = () => Ref.fromURI(RunInstructions.meta.key);\n\n/** Whether a trigger's `function` ref targets the registry RunInstructions operation (i.e. an instructions action). */\nexport const isRunInstructions = (fn: unknown): boolean => Ref.isRef(fn) && fn.uri === RunInstructions.meta.key;\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { type Instructions, Routine, type Trigger } from '@dxos/compute';\nimport { Obj, Ref } from '@dxos/echo';\n\nimport { runInstructionsRef } from './run-instructions';\n\n/** Strip a stale `instructions` binding from a trigger input. */\nconst withoutInstructions = (input: Record<string, unknown> | undefined): Record<string, unknown> | undefined => {\n if (!input || !('instructions' in input)) {\n return input;\n }\n const { instructions: _drop, ...rest } = input;\n return rest;\n};\n\n/**\n * Wire the routine's owned triggers to dispatch its current action (`spec`): an instructions action sets each\n * trigger's `runnable` to RunInstructions with the owned instructions bound into `input`; an operation action\n * binds the operation directly and drops any stale instructions binding. Call after the action (`spec`) changes\n * so a trigger never keeps a binding for the previous action.\n */\nexport const wireTriggers = (routine: Routine.Routine): void => {\n const instructions = Routine.instructionsRef(routine);\n const fn = instructions ? runInstructionsRef() : Routine.runnableRef(routine);\n for (const ref of routine.triggers) {\n const trigger = ref.target;\n if (!trigger) {\n continue;\n }\n Obj.update(trigger, (trigger) => {\n trigger.runnable = fn;\n const base = withoutInstructions(trigger.input);\n trigger.input = instructions ? { input: {}, ...base, instructions } : base;\n });\n }\n};\n\n/**\n * Creates a fully-wired in-memory routine graph. `instructions` and `trigger` are optional extras beyond the\n * schema fields: when provided they are parented under the routine and wired together (runnable, trigger\n * runnable, the trigger's instructions input binding, and the `triggers` ref) so that a single `Database.add`\n * cascades the whole graph. `triggers` defaults to `[]` so callers that supply a `trigger` need not provide it.\n */\nexport const makeRoutine = ({\n instructions,\n trigger,\n triggers = [],\n ...props\n}: Omit<Obj.MakeProps<typeof Routine.Routine>, 'triggers'> & {\n triggers?: ReadonlyArray<Ref.Ref<Trigger.Trigger>>;\n instructions?: Instructions.Instructions;\n trigger?: Trigger.Trigger;\n}): Routine.Routine => {\n const routine = Routine.make({ ...props, triggers });\n if (instructions) {\n Obj.setParent(instructions, routine);\n Obj.update(routine, (routine) => {\n routine.spec = { kind: 'instructions', instructions: Ref.make(instructions) };\n });\n }\n if (trigger) {\n Obj.setParent(trigger, routine);\n Obj.update(routine, (routine) => {\n routine.triggers.push(Ref.make(trigger));\n });\n }\n // Wire every attached trigger (singular or `triggers`) from the action; preserves template-provided\n // input. Gated on `spec`: with no action yet, wiring would null out pre-set trigger runnables.\n if (routine.spec) {\n wireTriggers(routine);\n }\n return routine;\n};\n"],"mappings":"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"}
|