@dxos/plugin-routine 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/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
package/src/util/wire.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Instructions, Routine, type Trigger } from '@dxos/compute';
|
|
6
|
+
import { Obj, Ref } from '@dxos/echo';
|
|
7
|
+
|
|
8
|
+
import { runInstructionsRef } from './run-instructions';
|
|
9
|
+
|
|
10
|
+
/** Strip a stale `instructions` binding from a trigger input. */
|
|
11
|
+
const withoutInstructions = (input: Record<string, unknown> | undefined): Record<string, unknown> | undefined => {
|
|
12
|
+
if (!input || !('instructions' in input)) {
|
|
13
|
+
return input;
|
|
14
|
+
}
|
|
15
|
+
const { instructions: _drop, ...rest } = input;
|
|
16
|
+
return rest;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Wire the routine's owned triggers to dispatch its current action (`spec`): an instructions action sets each
|
|
21
|
+
* trigger's `runnable` to RunInstructions with the owned instructions bound into `input`; an operation action
|
|
22
|
+
* binds the operation directly and drops any stale instructions binding. Call after the action (`spec`) changes
|
|
23
|
+
* so a trigger never keeps a binding for the previous action.
|
|
24
|
+
*/
|
|
25
|
+
export const wireTriggers = (routine: Routine.Routine): void => {
|
|
26
|
+
const instructions = Routine.instructionsRef(routine);
|
|
27
|
+
const fn = instructions ? runInstructionsRef() : Routine.runnableRef(routine);
|
|
28
|
+
for (const ref of routine.triggers) {
|
|
29
|
+
const trigger = ref.target;
|
|
30
|
+
if (!trigger) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
Obj.update(trigger, (trigger) => {
|
|
34
|
+
trigger.runnable = fn;
|
|
35
|
+
const base = withoutInstructions(trigger.input);
|
|
36
|
+
trigger.input = instructions ? { input: {}, ...base, instructions } : base;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Creates a fully-wired in-memory routine graph. `instructions` and `trigger` are optional extras beyond the
|
|
43
|
+
* schema fields: when provided they are parented under the routine and wired together (runnable, trigger
|
|
44
|
+
* runnable, the trigger's instructions input binding, and the `triggers` ref) so that a single `Database.add`
|
|
45
|
+
* cascades the whole graph. `triggers` defaults to `[]` so callers that supply a `trigger` need not provide it.
|
|
46
|
+
*/
|
|
47
|
+
export const makeRoutine = ({
|
|
48
|
+
instructions,
|
|
49
|
+
trigger,
|
|
50
|
+
triggers = [],
|
|
51
|
+
...props
|
|
52
|
+
}: Omit<Obj.MakeProps<typeof Routine.Routine>, 'triggers'> & {
|
|
53
|
+
triggers?: ReadonlyArray<Ref.Ref<Trigger.Trigger>>;
|
|
54
|
+
instructions?: Instructions.Instructions;
|
|
55
|
+
trigger?: Trigger.Trigger;
|
|
56
|
+
}): Routine.Routine => {
|
|
57
|
+
const routine = Routine.make({ ...props, triggers });
|
|
58
|
+
if (instructions) {
|
|
59
|
+
Obj.setParent(instructions, routine);
|
|
60
|
+
Obj.update(routine, (routine) => {
|
|
61
|
+
routine.spec = { kind: 'instructions', instructions: Ref.make(instructions) };
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (trigger) {
|
|
65
|
+
Obj.setParent(trigger, routine);
|
|
66
|
+
Obj.update(routine, (routine) => {
|
|
67
|
+
routine.triggers.push(Ref.make(trigger));
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Wire every attached trigger (singular or `triggers`) from the action; preserves template-provided
|
|
71
|
+
// input. Gated on `spec`: with no action yet, wiring would null out pre-set trigger runnables.
|
|
72
|
+
if (routine.spec) {
|
|
73
|
+
wireTriggers(routine);
|
|
74
|
+
}
|
|
75
|
+
return routine;
|
|
76
|
+
};
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
-
|
|
3
|
-
// src/containers/RoutineArticle/RoutineArticle.tsx
|
|
4
|
-
import { Atom, RegistryContext } from "@effect-atom/atom-react";
|
|
5
|
-
import React, { useCallback, useContext, useMemo } from "react";
|
|
6
|
-
import { useOperationInvoker } from "@dxos/app-framework/ui";
|
|
7
|
-
import { Obj, Ref } from "@dxos/echo";
|
|
8
|
-
import { useObject } from "@dxos/react-client/echo";
|
|
9
|
-
import { Panel } from "@dxos/react-ui";
|
|
10
|
-
import { Menu, MenuBuilder, useMenuBuilder } from "@dxos/react-ui-menu";
|
|
11
|
-
import { RoutineForm } from "#components";
|
|
12
|
-
import { meta } from "#meta";
|
|
13
|
-
import { RoutineOperation } from "#types";
|
|
14
|
-
var RoutineArticle = ({ role, attendableId, subject }) => {
|
|
15
|
-
const { invokePromise } = useOperationInvoker();
|
|
16
|
-
const registry = useContext(RegistryContext);
|
|
17
|
-
const [routine] = useObject(subject);
|
|
18
|
-
const db = Obj.getDatabase(subject);
|
|
19
|
-
const runningAtom = useMemo(() => Atom.make(false), []);
|
|
20
|
-
const canRun = useMemo(() => Boolean(routine.spec) && routine.triggers.length > 0, [
|
|
21
|
-
routine.spec,
|
|
22
|
-
routine.triggers
|
|
23
|
-
]);
|
|
24
|
-
const handleRun = useCallback(() => {
|
|
25
|
-
if (!invokePromise || !db) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const triggerRef = routine.triggers[0];
|
|
29
|
-
registry.set(runningAtom, true);
|
|
30
|
-
void invokePromise(RoutineOperation.RunRoutine, {
|
|
31
|
-
routine: Ref.make(subject)
|
|
32
|
-
}, {
|
|
33
|
-
spaceId: db.spaceId,
|
|
34
|
-
notify: {
|
|
35
|
-
error: [
|
|
36
|
-
"run-error.message",
|
|
37
|
-
{
|
|
38
|
-
ns: meta.profile.key
|
|
39
|
-
}
|
|
40
|
-
]
|
|
41
|
-
},
|
|
42
|
-
...triggerRef ? {
|
|
43
|
-
tracing: {
|
|
44
|
-
trigger: triggerRef
|
|
45
|
-
}
|
|
46
|
-
} : {}
|
|
47
|
-
}).finally(() => registry.set(runningAtom, false));
|
|
48
|
-
}, [
|
|
49
|
-
invokePromise,
|
|
50
|
-
db,
|
|
51
|
-
subject,
|
|
52
|
-
routine,
|
|
53
|
-
registry,
|
|
54
|
-
runningAtom
|
|
55
|
-
]);
|
|
56
|
-
const menuActions = useArticleMenuActions({
|
|
57
|
-
canRun,
|
|
58
|
-
runningAtom,
|
|
59
|
-
handleRun
|
|
60
|
-
});
|
|
61
|
-
if (!db) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
return /* @__PURE__ */ React.createElement(Menu.Root, {
|
|
65
|
-
...menuActions,
|
|
66
|
-
attendableId
|
|
67
|
-
}, /* @__PURE__ */ React.createElement(Panel.Root, {
|
|
68
|
-
role
|
|
69
|
-
}, /* @__PURE__ */ React.createElement(Panel.Toolbar, null, /* @__PURE__ */ React.createElement(Menu.Toolbar, {
|
|
70
|
-
className: "dx-document"
|
|
71
|
-
})), /* @__PURE__ */ React.createElement(Panel.Content, null, /* @__PURE__ */ React.createElement(RoutineForm, {
|
|
72
|
-
db,
|
|
73
|
-
routine: subject
|
|
74
|
-
}))));
|
|
75
|
-
};
|
|
76
|
-
var useArticleMenuActions = ({ canRun, runningAtom, handleRun }) => useMenuBuilder((get) => MenuBuilder.make().action("run", {
|
|
77
|
-
label: [
|
|
78
|
-
"run.label",
|
|
79
|
-
{
|
|
80
|
-
ns: meta.profile.key
|
|
81
|
-
}
|
|
82
|
-
],
|
|
83
|
-
icon: "ph--play--regular",
|
|
84
|
-
disabled: get(runningAtom) || !canRun,
|
|
85
|
-
disposition: "toolbar",
|
|
86
|
-
testId: "routine.toolbar.run"
|
|
87
|
-
}, () => handleRun()).build(), [
|
|
88
|
-
canRun,
|
|
89
|
-
handleRun,
|
|
90
|
-
runningAtom
|
|
91
|
-
]);
|
|
92
|
-
export {
|
|
93
|
-
RoutineArticle as default
|
|
94
|
-
};
|
|
95
|
-
//# sourceMappingURL=RoutineArticle-UNTMV4CC.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/RoutineArticle/RoutineArticle.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj, Ref } from '@dxos/echo';\nimport { useObject } from '@dxos/react-client/echo';\nimport { Panel } from '@dxos/react-ui';\nimport { Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';\n\nimport { RoutineForm } from '#components';\nimport { meta } from '#meta';\nimport { Routine, RoutineOperation } from '#types';\n\nexport type RoutineArticleProps = AppSurface.ObjectArticleProps<Routine.Routine>;\n\n/**\n * Article surface for a {@link Routine}. The form edits the live routine in place; each trigger's on/off state\n * is toggled inline in the trigger editor. The toolbar exposes Run.\n *\n * TODO(wittjosiah): Disable editing while the routine is running (you shouldn't mutate running code). This was\n * previously wired as \"read-only when enabled\" via a routine-level toggle, but that is not how we want to\n * achieve it — reintroduce a run-state-based lock instead.\n */\nexport const RoutineArticle = ({ role, attendableId, subject }: RoutineArticleProps) => {\n const { invokePromise } = useOperationInvoker();\n const registry = useContext(RegistryContext);\n // Subscribe so the run affordance tracks the routine's action (`spec`).\n const [routine] = useObject(subject);\n const db = Obj.getDatabase(subject);\n\n const runningAtom = useMemo(() => Atom.make(false), []);\n\n // Require both a spec and at least one trigger: manual runs are attributed to the first trigger\n // so they appear in history, and without a trigger the run would be invisible there.\n const canRun = useMemo(() => Boolean(routine.spec) && routine.triggers.length > 0, [routine.spec, routine.triggers]);\n\n const handleRun = useCallback(() => {\n if (!invokePromise || !db) {\n return;\n }\n // Thread the routine's first trigger as trace attribution so the run appears in history.\n // Manual runs bypass the trigger dispatcher (which normally stamps meta.trigger), so we\n // do it here — history filters on trigger entity id, and without this the run is invisible.\n const triggerRef = routine.triggers[0];\n registry.set(runningAtom, true);\n void invokePromise(\n RoutineOperation.RunRoutine,\n { routine: Ref.make(subject) },\n {\n spaceId: db.spaceId,\n notify: { error: ['run-error.message', { ns: meta.profile.key }] },\n ...(triggerRef ? { tracing: { trigger: triggerRef } } : {}),\n },\n ).finally(() => registry.set(runningAtom, false));\n }, [invokePromise, db, subject, routine, registry, runningAtom]);\n\n const menuActions = useArticleMenuActions({ canRun, runningAtom, handleRun });\n\n if (!db) {\n return null;\n }\n\n return (\n <Menu.Root {...menuActions} attendableId={attendableId}>\n <Panel.Root role={role}>\n <Panel.Toolbar>\n <Menu.Toolbar className='dx-document' />\n </Panel.Toolbar>\n <Panel.Content>\n <RoutineForm db={db} routine={subject} />\n </Panel.Content>\n </Panel.Root>\n </Menu.Root>\n );\n};\n\n//\n// Hooks\n//\n\ntype ArticleMenuActionsOptions = {\n canRun: boolean;\n runningAtom: Atom.Writable<boolean>;\n handleRun: () => void;\n};\n\nconst useArticleMenuActions = ({ canRun, runningAtom, handleRun }: ArticleMenuActionsOptions) =>\n useMenuBuilder(\n (get) =>\n MenuBuilder.make()\n .action(\n 'run',\n {\n label: ['run.label', { ns: meta.profile.key }],\n icon: 'ph--play--regular',\n disabled: get(runningAtom) || !canRun,\n disposition: 'toolbar',\n testId: 'routine.toolbar.run',\n },\n () => handleRun(),\n )\n .build(),\n [canRun, handleRun, runningAtom],\n );\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAASA,MAAMC,uBAAuB;AACtC,OAAOC,SAASC,aAAaC,YAAYC,eAAe;AAExD,SAASC,2BAA2B;AAEpC,SAASC,KAAKC,WAAW;AACzB,SAASC,iBAAiB;AAC1B,SAASC,aAAa;AACtB,SAASC,MAAMC,aAAaC,sBAAsB;AAElD,SAASC,mBAAmB;AAC5B,SAASC,YAAY;AACrB,SAAkBC,wBAAwB;AAYnC,IAAMC,iBAAiB,CAAC,EAAEC,MAAMC,cAAcC,QAAO,MAAuB;AACjF,QAAM,EAAEC,cAAa,IAAKf,oBAAAA;AAC1B,QAAMgB,WAAWlB,WAAWH,eAAAA;AAE5B,QAAM,CAACsB,OAAAA,IAAWd,UAAUW,OAAAA;AAC5B,QAAMI,KAAKjB,IAAIkB,YAAYL,OAAAA;AAE3B,QAAMM,cAAcrB,QAAQ,MAAML,KAAK2B,KAAK,KAAA,GAAQ,CAAA,CAAE;AAItD,QAAMC,SAASvB,QAAQ,MAAMwB,QAAQN,QAAQO,IAAI,KAAKP,QAAQQ,SAASC,SAAS,GAAG;IAACT,QAAQO;IAAMP,QAAQQ;GAAS;AAEnH,QAAME,YAAY9B,YAAY,MAAA;AAC5B,QAAI,CAACkB,iBAAiB,CAACG,IAAI;AACzB;IACF;AAIA,UAAMU,aAAaX,QAAQQ,SAAS,CAAA;AACpCT,aAASa,IAAIT,aAAa,IAAA;AAC1B,SAAKL,cACHL,iBAAiBoB,YACjB;MAAEb,SAASf,IAAImB,KAAKP,OAAAA;IAAS,GAC7B;MACEiB,SAASb,GAAGa;MACZC,QAAQ;QAAEC,OAAO;UAAC;UAAqB;YAAEC,IAAIzB,KAAK0B,QAAQC;UAAI;;MAAG;MACjE,GAAIR,aAAa;QAAES,SAAS;UAAEC,SAASV;QAAW;MAAE,IAAI,CAAC;IAC3D,CAAA,EACAW,QAAQ,MAAMvB,SAASa,IAAIT,aAAa,KAAA,CAAA;EAC5C,GAAG;IAACL;IAAeG;IAAIJ;IAASG;IAASD;IAAUI;GAAY;AAE/D,QAAMoB,cAAcC,sBAAsB;IAAEnB;IAAQF;IAAaO;EAAU,CAAA;AAE3E,MAAI,CAACT,IAAI;AACP,WAAO;EACT;AAEA,SACE,sBAAA,cAACb,KAAKqC,MAAI;IAAE,GAAGF;IAAa3B;KAC1B,sBAAA,cAACT,MAAMsC,MAAI;IAAC9B;KACV,sBAAA,cAACR,MAAMuC,SAAO,MACZ,sBAAA,cAACtC,KAAKsC,SAAO;IAACC,WAAU;OAE1B,sBAAA,cAACxC,MAAMyC,SAAO,MACZ,sBAAA,cAACrC,aAAAA;IAAYU;IAAQD,SAASH;;AAKxC;AAYA,IAAM2B,wBAAwB,CAAC,EAAEnB,QAAQF,aAAaO,UAAS,MAC7DpB,eACE,CAACuC,QACCxC,YAAYe,KAAI,EACb0B,OACC,OACA;EACEC,OAAO;IAAC;IAAa;MAAEd,IAAIzB,KAAK0B,QAAQC;IAAI;;EAC5Ca,MAAM;EACNC,UAAUJ,IAAI1B,WAAAA,KAAgB,CAACE;EAC/B6B,aAAa;EACbC,QAAQ;AACV,GACA,MAAMzB,UAAAA,CAAAA,EAEP0B,MAAK,GACV;EAAC/B;EAAQK;EAAWP;CAAY;",
|
|
6
|
-
"names": ["Atom", "RegistryContext", "React", "useCallback", "useContext", "useMemo", "useOperationInvoker", "Obj", "Ref", "useObject", "Panel", "Menu", "MenuBuilder", "useMenuBuilder", "RoutineForm", "meta", "RoutineOperation", "RoutineArticle", "role", "attendableId", "subject", "invokePromise", "registry", "routine", "db", "getDatabase", "runningAtom", "make", "canRun", "Boolean", "spec", "triggers", "length", "handleRun", "triggerRef", "set", "RunRoutine", "spaceId", "notify", "error", "ns", "profile", "key", "tracing", "trigger", "finally", "menuActions", "useArticleMenuActions", "Root", "Toolbar", "className", "Content", "get", "action", "label", "icon", "disabled", "disposition", "testId", "build"]
|
|
7
|
-
}
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import "./chunk-674LDIUJ.mjs";
|
|
2
|
-
import "./chunk-J5LGTIGS.mjs";
|
|
3
|
-
|
|
4
|
-
// src/containers/RoutineCompanion/RoutineCompanion.tsx
|
|
5
|
-
import { Atom } from "@effect-atom/atom-react";
|
|
6
|
-
import * as Effect from "effect/Effect";
|
|
7
|
-
import React, { useCallback, useMemo, useRef, useState } from "react";
|
|
8
|
-
import { useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
9
|
-
import { Database, Filter as Filter2, Obj as Obj2, Type } from "@dxos/echo";
|
|
10
|
-
import { EffectEx } from "@dxos/effect";
|
|
11
|
-
import { SpaceOperation } from "@dxos/plugin-space";
|
|
12
|
-
import { useQuery } from "@dxos/react-client/echo";
|
|
13
|
-
import { Panel, ScrollArea, useTranslation } from "@dxos/react-ui";
|
|
14
|
-
import { Menu, MenuBuilder, useMenuBuilder } from "@dxos/react-ui-menu";
|
|
15
|
-
import { MasterDetail, RoutineForm } from "#components";
|
|
16
|
-
import { meta } from "#meta";
|
|
17
|
-
import { Routine as Routine2, RoutineCapabilities } from "#types";
|
|
18
|
-
|
|
19
|
-
// src/util/routines-for-object.ts
|
|
20
|
-
import { Instructions, Trigger } from "@dxos/compute";
|
|
21
|
-
import { Filter, Obj, Query, Ref } from "@dxos/echo";
|
|
22
|
-
import { Routine } from "#types";
|
|
23
|
-
var connectedRoutinesQuery = (object) => {
|
|
24
|
-
const byInput = Query.select(Filter.id(object.id)).referencedBy(Trigger.Trigger);
|
|
25
|
-
const byFeed = Query.select(Filter.id(object.id)).reference("feed").referencedBy(Trigger.Trigger);
|
|
26
|
-
const byTrigger = Query.all(byInput, byFeed).referencedBy(Routine.Routine, "triggers");
|
|
27
|
-
const byInstructions = Query.select(Filter.id(object.id)).referencedBy(Instructions.Instructions, "objects").referencedBy(Routine.Routine);
|
|
28
|
-
return Query.all(byTrigger, byInstructions);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
// src/containers/RoutineCompanion/RoutineCompanion.tsx
|
|
32
|
-
var RoutineCompanion = ({ subject: object, attendableId }) => {
|
|
33
|
-
const db = Obj2.getDatabase(object);
|
|
34
|
-
const { t } = useTranslation(meta.profile.key);
|
|
35
|
-
const { invokePromise } = useOperationInvoker();
|
|
36
|
-
const { items, statusFor } = useConnectedRoutines(db, object);
|
|
37
|
-
const [selectedId, setSelectedId] = useState();
|
|
38
|
-
const [draft, setDraft] = useState();
|
|
39
|
-
const [savedRoutine, setSavedRoutine] = useState();
|
|
40
|
-
const selected = useMemo(() => items.find((routine) => routine.id === selectedId) ?? savedRoutine, [
|
|
41
|
-
items,
|
|
42
|
-
selectedId,
|
|
43
|
-
savedRoutine
|
|
44
|
-
]);
|
|
45
|
-
const handleSelect = useCallback((id) => {
|
|
46
|
-
if (draft) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
setSavedRoutine(void 0);
|
|
50
|
-
setSelectedId(id);
|
|
51
|
-
}, [
|
|
52
|
-
draft
|
|
53
|
-
]);
|
|
54
|
-
const handleCreateFromTemplate = useCallback(async (template) => {
|
|
55
|
-
if (!db) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
const scaffolded = await EffectEx.runPromise(template.scaffold({
|
|
59
|
-
subject: object
|
|
60
|
-
}).pipe(Effect.provideService(Database.Service, Database.makeService(db))));
|
|
61
|
-
setSavedRoutine(void 0);
|
|
62
|
-
setSelectedId(void 0);
|
|
63
|
-
setDraft(scaffolded);
|
|
64
|
-
}, [
|
|
65
|
-
db,
|
|
66
|
-
object
|
|
67
|
-
]);
|
|
68
|
-
const allTemplates = useCapabilities(RoutineCapabilities.Template);
|
|
69
|
-
const templates = useMemo(() => allTemplates.filter((template) => template.appliesTo?.(object) ?? true), [
|
|
70
|
-
allTemplates,
|
|
71
|
-
object
|
|
72
|
-
]);
|
|
73
|
-
const menuActions = useCompanionMenuActions({
|
|
74
|
-
t,
|
|
75
|
-
templates,
|
|
76
|
-
draft,
|
|
77
|
-
handleCreateFromTemplate
|
|
78
|
-
});
|
|
79
|
-
const handleCancel = useCallback(() => {
|
|
80
|
-
setDraft(void 0);
|
|
81
|
-
}, []);
|
|
82
|
-
const handleSave = useCallback(async () => {
|
|
83
|
-
if (!draft || !db) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
const persistedRoutine = db.add(draft);
|
|
87
|
-
await db.flush();
|
|
88
|
-
setSelectedId(persistedRoutine.id);
|
|
89
|
-
setSavedRoutine(persistedRoutine);
|
|
90
|
-
setDraft(void 0);
|
|
91
|
-
}, [
|
|
92
|
-
draft,
|
|
93
|
-
db
|
|
94
|
-
]);
|
|
95
|
-
const handleDelete = useCallback((routine) => {
|
|
96
|
-
if (!db) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
setSavedRoutine((current) => current?.id === routine.id ? void 0 : current);
|
|
100
|
-
setSelectedId((current) => current === routine.id ? void 0 : current);
|
|
101
|
-
void invokePromise?.(SpaceOperation.RemoveObjects, {
|
|
102
|
-
objects: [
|
|
103
|
-
routine
|
|
104
|
-
]
|
|
105
|
-
}, {
|
|
106
|
-
spaceId: db.spaceId
|
|
107
|
-
});
|
|
108
|
-
}, [
|
|
109
|
-
invokePromise,
|
|
110
|
-
db
|
|
111
|
-
]);
|
|
112
|
-
const getMenu = useGetMenu({
|
|
113
|
-
t,
|
|
114
|
-
handleDelete
|
|
115
|
-
});
|
|
116
|
-
const getIcon = useCallback((get, routine) => {
|
|
117
|
-
const { icon, hue } = Obj2.getIcon(routine) ?? {
|
|
118
|
-
icon: "ph--lightning--regular",
|
|
119
|
-
hue: void 0
|
|
120
|
-
};
|
|
121
|
-
const { enabled } = get(routineEnabled(routine));
|
|
122
|
-
return {
|
|
123
|
-
icon,
|
|
124
|
-
hue: enabled ? hue : void 0
|
|
125
|
-
};
|
|
126
|
-
}, []);
|
|
127
|
-
const getLabel = useCallback((get, routine) => get(Obj2.labelAtom(routine)) || t("object-name.placeholder", {
|
|
128
|
-
ns: Type.getTypename(Routine2.Routine)
|
|
129
|
-
}) || "", [
|
|
130
|
-
t
|
|
131
|
-
]);
|
|
132
|
-
const getAdornment = useCallback((_get, routine) => statusFor(routine.id) === "detached" ? {
|
|
133
|
-
icon: "ph--warning--regular",
|
|
134
|
-
label: t("routine-detached.message")
|
|
135
|
-
} : void 0, [
|
|
136
|
-
statusFor,
|
|
137
|
-
t
|
|
138
|
-
]);
|
|
139
|
-
if (!db) {
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
const shown = draft ?? selected;
|
|
143
|
-
const detail = shown ? /* @__PURE__ */ React.createElement(RoutineForm, {
|
|
144
|
-
key: shown.id,
|
|
145
|
-
db,
|
|
146
|
-
routine: shown,
|
|
147
|
-
onSave: draft ? () => void handleSave() : void 0,
|
|
148
|
-
onCancel: draft ? handleCancel : void 0
|
|
149
|
-
}) : null;
|
|
150
|
-
return /* @__PURE__ */ React.createElement(Menu.Root, {
|
|
151
|
-
...menuActions,
|
|
152
|
-
attendableId
|
|
153
|
-
}, /* @__PURE__ */ React.createElement(Panel.Root, null, /* @__PURE__ */ React.createElement(Panel.Toolbar, null, /* @__PURE__ */ React.createElement(Menu.Toolbar, {
|
|
154
|
-
className: "dx-document"
|
|
155
|
-
})), /* @__PURE__ */ React.createElement(Panel.Content, {
|
|
156
|
-
asChild: true,
|
|
157
|
-
className: "pt-trim-md"
|
|
158
|
-
}, /* @__PURE__ */ React.createElement(ScrollArea.Root, null, /* @__PURE__ */ React.createElement(ScrollArea.Viewport, null, /* @__PURE__ */ React.createElement(MasterDetail, {
|
|
159
|
-
classNames: "dx-document",
|
|
160
|
-
items,
|
|
161
|
-
selectedId,
|
|
162
|
-
detail,
|
|
163
|
-
onSelect: handleSelect,
|
|
164
|
-
getMenu,
|
|
165
|
-
getIcon,
|
|
166
|
-
getLabel,
|
|
167
|
-
getAdornment,
|
|
168
|
-
emptyLabel: t("no-routines.message")
|
|
169
|
-
}))))));
|
|
170
|
-
};
|
|
171
|
-
var useConnectedRoutines = (db, object) => {
|
|
172
|
-
const connected = useQuery(db, connectedRoutinesQuery(object));
|
|
173
|
-
const connectedIds = useMemo(() => new Set(connected.map((routine) => routine.id)), [
|
|
174
|
-
connected
|
|
175
|
-
]);
|
|
176
|
-
const all = useQuery(db, Filter2.type(Routine2.Routine));
|
|
177
|
-
const byId = useMemo(() => new Map(all.map((routine) => [
|
|
178
|
-
routine.id,
|
|
179
|
-
routine
|
|
180
|
-
])), [
|
|
181
|
-
all
|
|
182
|
-
]);
|
|
183
|
-
const seenOrder = useRef([]);
|
|
184
|
-
const seenForObject = useRef(object.id);
|
|
185
|
-
if (seenForObject.current !== object.id) {
|
|
186
|
-
seenForObject.current = object.id;
|
|
187
|
-
seenOrder.current = [];
|
|
188
|
-
}
|
|
189
|
-
for (const id of connectedIds) {
|
|
190
|
-
if (!seenOrder.current.includes(id)) {
|
|
191
|
-
seenOrder.current.push(id);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
const items = useMemo(() => seenOrder.current.flatMap((id) => byId.has(id) ? [
|
|
195
|
-
byId.get(id)
|
|
196
|
-
] : []), [
|
|
197
|
-
byId,
|
|
198
|
-
connectedIds
|
|
199
|
-
]);
|
|
200
|
-
const statusFor = useCallback((id) => connectedIds.has(id) ? "associated" : "detached", [
|
|
201
|
-
connectedIds
|
|
202
|
-
]);
|
|
203
|
-
return {
|
|
204
|
-
items,
|
|
205
|
-
statusFor
|
|
206
|
-
};
|
|
207
|
-
};
|
|
208
|
-
var routineEnabled = Atom.family((routine) => Atom.make((get) => {
|
|
209
|
-
const triggers = get(Obj2.atomProperty(routine, "triggers"));
|
|
210
|
-
const hasTriggers = triggers.length > 0;
|
|
211
|
-
return {
|
|
212
|
-
hasTriggers,
|
|
213
|
-
enabled: hasTriggers && triggers.every((ref) => get(Obj2.atomProperty(ref, "enabled")) === true)
|
|
214
|
-
};
|
|
215
|
-
}));
|
|
216
|
-
var useGetMenu = ({ t, handleDelete }) => useCallback((_get, routine) => MenuBuilder.make().action("delete", {
|
|
217
|
-
label: t("delete.label"),
|
|
218
|
-
icon: "ph--trash--regular",
|
|
219
|
-
testId: "routine.companion.delete"
|
|
220
|
-
}, () => handleDelete(routine)).build(), [
|
|
221
|
-
t,
|
|
222
|
-
handleDelete
|
|
223
|
-
]);
|
|
224
|
-
var useCompanionMenuActions = ({ t, templates, draft, handleCreateFromTemplate }) => useMenuBuilder(() => MenuBuilder.make().separator("gap").group("create", {
|
|
225
|
-
variant: "dropdownMenu",
|
|
226
|
-
label: t("add-routine.label"),
|
|
227
|
-
icon: "ph--plus--regular",
|
|
228
|
-
iconOnly: true,
|
|
229
|
-
caretDown: false,
|
|
230
|
-
disabled: draft != null || templates.length === 0,
|
|
231
|
-
testId: "routine.companion.create"
|
|
232
|
-
}, (group) => {
|
|
233
|
-
for (const template of templates) {
|
|
234
|
-
group.action(template.id, {
|
|
235
|
-
label: template.label,
|
|
236
|
-
icon: template.icon ?? "ph--lightning--regular"
|
|
237
|
-
}, () => void handleCreateFromTemplate(template));
|
|
238
|
-
}
|
|
239
|
-
}).build(), [
|
|
240
|
-
t,
|
|
241
|
-
templates,
|
|
242
|
-
draft,
|
|
243
|
-
handleCreateFromTemplate
|
|
244
|
-
]);
|
|
245
|
-
export {
|
|
246
|
-
RoutineCompanion,
|
|
247
|
-
RoutineCompanion as default
|
|
248
|
-
};
|
|
249
|
-
//# sourceMappingURL=RoutineCompanion-ZZ6WMY7I.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/RoutineCompanion/RoutineCompanion.tsx", "../../../src/util/routines-for-object.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Database, Filter, Obj, Type } from '@dxos/echo';\nimport { EffectEx } from '@dxos/effect';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { useQuery } from '@dxos/react-client/echo';\nimport { Panel, ScrollArea, useTranslation } from '@dxos/react-ui';\nimport { type ActionGraphProps, Menu, MenuBuilder, useMenuBuilder } from '@dxos/react-ui-menu';\n\nimport { MasterDetail, type MasterDetailAdornment, type MasterDetailIcon, RoutineForm } from '#components';\nimport { meta } from '#meta';\nimport { Routine, RoutineCapabilities } from '#types';\n\nimport { connectedRoutinesQuery } from '../../util';\n\n/** Association state of a row relative to the companion's object. */\ntype Status = 'associated' | 'detached';\n\nexport type RoutineCompanionProps = AppSurface.ObjectArticleProps<Obj.Unknown>;\n\n/**\n * Per-object companion: a master-detail list of automations connected to the object, via\n * {@link connectedRoutinesQuery} (covers both trigger-input and instructions-context paths).\n *\n * The list is session-stable: a routine seen connected stays listed even after it loses its association\n * (flagged with a 'detached' adornment) so it doesn't vanish mid-edit. The toolbar create menu offers a\n * template picker (contributed via {@link RoutineCapabilities.Template}, filtered by `appliesTo`); each\n * template's `scaffold` returns a fully-wired in-memory routine graph, shown editable in {@link RoutineForm}\n * and committed on Save with a single `Database.add` (which cascades the owned children). Existing routines\n * are edited in place.\n */\nexport const RoutineCompanion = ({ subject: object, attendableId }: RoutineCompanionProps) => {\n // A non-persisted subject has no database; `db` may be undefined. Every hook below tolerates that, and the\n // render is guarded after the last hook (see below) so hook order is identical across renders either way.\n const db = Obj.getDatabase(object);\n\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const { items, statusFor } = useConnectedRoutines(db, object);\n\n const [selectedId, setSelectedId] = useState<string | undefined>();\n const [draft, setDraft] = useState<Routine.Routine | undefined>();\n // After saving a draft, hold the persisted routine directly so the detail panel renders immediately\n // before the reactive queries catch up to include the newly-connected routine.\n const [savedRoutine, setSavedRoutine] = useState<Routine.Routine | undefined>();\n const selected = useMemo(\n () => items.find((routine) => routine.id === selectedId) ?? savedRoutine,\n [items, selectedId, savedRoutine],\n );\n\n const handleSelect = useCallback(\n (id: string | undefined) => {\n // Ignore selection changes while a draft is active — the edit (or create) must be saved or cancelled first.\n if (draft) {\n return;\n }\n setSavedRoutine(undefined);\n setSelectedId(id);\n },\n [draft],\n );\n\n const handleCreateFromTemplate = useCallback(\n async (template: RoutineCapabilities.Template) => {\n if (!db) {\n return;\n }\n\n // The scaffold returns a fully-wired in-memory routine draft graph (its owned trigger/instructions\n // bound and parented); nothing is persisted until Save.\n const scaffolded = await EffectEx.runPromise(\n template.scaffold({ subject: object }).pipe(Effect.provideService(Database.Service, Database.makeService(db))),\n );\n\n setSavedRoutine(undefined);\n setSelectedId(undefined);\n setDraft(scaffolded);\n },\n [db, object],\n );\n\n // Templates filtered to those applicable to this companion's subject.\n const allTemplates = useCapabilities(RoutineCapabilities.Template);\n const templates = useMemo(\n () => allTemplates.filter((template) => template.appliesTo?.(object) ?? true),\n [allTemplates, object],\n );\n\n // Toolbar create menu: a `+` dropdown of applicable templates, pushed to the trailing edge by a growing gap\n // separator (disabled while a draft is in progress so it can't be silently replaced).\n const menuActions = useCompanionMenuActions({ t, templates, draft, handleCreateFromTemplate });\n\n const handleCancel = useCallback(() => {\n // Draft was never persisted, nothing to clean up.\n setDraft(undefined);\n }, []);\n\n const handleSave = useCallback(async () => {\n if (!draft || !db) {\n return;\n }\n\n // The draft is a fully-wired graph (see `Routine.make`); a single add cascades the owned trigger and\n // instructions, and the subject carried in the instructions' `objects` is the structural connection the\n // query finds.\n const persistedRoutine = db.add(draft);\n await db.flush();\n setSelectedId(persistedRoutine.id);\n // Provide the persisted routine directly so the detail panel renders before the reactive queries\n // catch up to include the newly-connected routine.\n setSavedRoutine(persistedRoutine);\n setDraft(undefined);\n }, [draft, db]);\n\n const handleDelete = useCallback(\n (routine: Routine.Routine) => {\n if (!db) {\n return;\n }\n\n setSavedRoutine((current) => (current?.id === routine.id ? undefined : current));\n setSelectedId((current) => (current === routine.id ? undefined : current));\n // Route through the space operation so the deletion is undoable (toast + RestoreObjects), rather than\n // mutating the database directly.\n void invokePromise?.(SpaceOperation.RemoveObjects, { objects: [routine] }, { spaceId: db.spaceId });\n },\n [invokePromise, db],\n );\n\n // Per-row overflow menu: delete. (A routine's on/off state is toggled per-trigger inline in the form,\n // not from the list.)\n const getMenu = useGetMenu({ t, handleDelete });\n\n // Row icon, reactive per row: an enabled routine takes its type's hue (amber); disabled uses the default\n // icon colour. Subscribes (via `get`) only to this routine's triggers' `enabled` flags.\n const getIcon = useCallback((get: Atom.Context, routine: Routine.Routine): MasterDetailIcon => {\n const { icon, hue } = Obj.getIcon(routine) ?? { icon: 'ph--lightning--regular', hue: undefined };\n const { enabled } = get(routineEnabled(routine));\n return { icon, hue: enabled ? hue : undefined };\n }, []);\n\n // Row label, reactive per row via the object's label atom, so a rename updates the row live.\n const getLabel = useCallback(\n (get: Atom.Context, routine: Routine.Routine): string =>\n get(Obj.labelAtom(routine)) || t('object-name.placeholder', { ns: Type.getTypename(Routine.Routine) }) || '',\n [t],\n );\n\n // Trailing adornment: a warning badge on a row whose routine has left the connected set (it stays in the\n // session-stable list — see {@link useConnectedRoutines} — rather than disappearing while still selected/edited).\n const getAdornment = useCallback(\n (_get: Atom.Context, routine: Routine.Routine): MasterDetailAdornment | undefined =>\n statusFor(routine.id) === 'detached'\n ? { icon: 'ph--warning--regular', label: t('routine-detached.message') }\n : undefined,\n [statusFor, t],\n );\n\n // Render guard placed after every hook so hook order stays stable: a non-persisted subject (no database)\n // has nothing to list.\n if (!db) {\n return null;\n }\n\n // One form for both flows. A selected (persisted) routine is edited in place. The create-from-template draft\n // is the only Save/Cancel flow: an in-memory routine shown editable, discarded on Cancel and persisted by a\n // single `Database.add` on Save. The `key` (the routine id) remounts the uncontrolled form when the shown\n // routine changes; the draft carries a fresh id, so no edits leak between rows.\n const shown = draft ?? selected;\n const detail = shown ? (\n <RoutineForm\n key={shown.id}\n db={db}\n routine={shown}\n onSave={draft ? () => void handleSave() : undefined}\n onCancel={draft ? handleCancel : undefined}\n />\n ) : null;\n\n return (\n <Menu.Root {...menuActions} attendableId={attendableId}>\n <Panel.Root>\n <Panel.Toolbar>\n <Menu.Toolbar className='dx-document' />\n </Panel.Toolbar>\n <Panel.Content asChild className='pt-trim-md'>\n <ScrollArea.Root>\n <ScrollArea.Viewport>\n <MasterDetail<Routine.Routine>\n classNames='dx-document'\n items={items}\n selectedId={selectedId}\n detail={detail}\n onSelect={handleSelect}\n getMenu={getMenu}\n getIcon={getIcon}\n getLabel={getLabel}\n getAdornment={getAdornment}\n emptyLabel={t('no-routines.message')}\n />\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n </Panel.Content>\n </Panel.Root>\n </Menu.Root>\n );\n};\n\n//\n// Hooks\n//\n\n/**\n * The companion's automation list, session-stable and frozen against disconnection: routines connected to the\n * object via {@link connectedRoutinesQuery} (trigger-input and instructions-context paths unified) are\n * accumulated append-only so rows never reorder, and a routine that leaves the connected set stays in the list\n * (flagged `detached` via {@link statusFor}) rather than vanishing mid-edit — only a hard-deleted routine drops\n * out. Detached rows are resolved from the space's full routine set since the connected query no longer returns\n * them. A freshly-saved routine appears once the query reflects it.\n */\nconst useConnectedRoutines = (\n db: Database.Database | undefined,\n object: Obj.Unknown,\n): { items: Routine.Routine[]; statusFor: (id: string) => Status } => {\n const connected = useQuery(db, connectedRoutinesQuery(object));\n const connectedIds = useMemo(() => new Set(connected.map((routine) => routine.id)), [connected]);\n\n // All routines in the space — used to resolve rows that have left the connected set (still exist, just detached).\n const all = useQuery(db, Filter.type(Routine.Routine));\n const byId = useMemo(() => new Map(all.map((routine) => [routine.id, routine])), [all]);\n\n // Session-stable, append-only: a routine seen connected this session is remembered so its row never reorders\n // or disappears on disconnect. Scoped to the current subject — reset if this instance is reused for another\n // object so the previous subject's rows don't leak in.\n const seenOrder = useRef<string[]>([]);\n const seenForObject = useRef(object.id);\n if (seenForObject.current !== object.id) {\n seenForObject.current = object.id;\n seenOrder.current = [];\n }\n for (const id of connectedIds) {\n if (!seenOrder.current.includes(id)) {\n seenOrder.current.push(id);\n }\n }\n\n // Resolve to live objects in stable order, dropping only ids whose routine was hard-deleted.\n const items = useMemo(\n () => seenOrder.current.flatMap((id) => (byId.has(id) ? [byId.get(id)!] : [])),\n [byId, connectedIds],\n );\n\n const statusFor = useCallback(\n (id: string): Status => (connectedIds.has(id) ? 'associated' : 'detached'),\n [connectedIds],\n );\n\n return { items, statusFor };\n};\n\n/**\n * Reactive family for a routine's on/off state — subscribes (via `get`) to its triggers' `enabled` flags so the\n * row icon re-derives when a flag flips. Keyed by the routine instance.\n */\nconst routineEnabled = Atom.family(\n (routine: Routine.Routine): Atom.Atom<{ hasTriggers: boolean; enabled: boolean }> =>\n Atom.make((get) => {\n const triggers = get(Obj.atomProperty(routine, 'triggers'));\n const hasTriggers = triggers.length > 0;\n return {\n hasTriggers,\n enabled: hasTriggers && triggers.every((ref) => get(Obj.atomProperty(ref, 'enabled')) === true),\n };\n }),\n);\n\ntype GetMenuOptions = {\n t: ReturnType<typeof useTranslation>['t'];\n handleDelete: (routine: Routine.Routine) => void;\n};\n\nconst useGetMenu = ({ t, handleDelete }: GetMenuOptions) =>\n useCallback(\n (_get: Atom.Context, routine: Routine.Routine): ActionGraphProps =>\n MenuBuilder.make()\n .action(\n 'delete',\n {\n label: t('delete.label'),\n icon: 'ph--trash--regular',\n testId: 'routine.companion.delete',\n },\n () => handleDelete(routine),\n )\n .build(),\n [t, handleDelete],\n );\n\ntype CompanionMenuActionsOptions = {\n t: ReturnType<typeof useTranslation>['t'];\n templates: RoutineCapabilities.Template[];\n draft: Routine.Routine | undefined;\n handleCreateFromTemplate: (template: RoutineCapabilities.Template) => Promise<void>;\n};\n\nconst useCompanionMenuActions = ({ t, templates, draft, handleCreateFromTemplate }: CompanionMenuActionsOptions) =>\n useMenuBuilder(\n () =>\n MenuBuilder.make()\n .separator('gap')\n .group(\n 'create',\n {\n variant: 'dropdownMenu',\n label: t('add-routine.label'),\n icon: 'ph--plus--regular',\n iconOnly: true,\n caretDown: false,\n disabled: draft != null || templates.length === 0,\n testId: 'routine.companion.create',\n },\n (group) => {\n for (const template of templates) {\n group.action(\n template.id,\n { label: template.label, icon: template.icon ?? 'ph--lightning--regular' },\n () => void handleCreateFromTemplate(template),\n );\n }\n },\n )\n .build(),\n [t, templates, draft, handleCreateFromTemplate],\n );\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { Instructions, Trigger } from '@dxos/compute';\nimport { Filter, Obj, Query, Ref } from '@dxos/echo';\n\nimport { Routine } from '#types';\n\n/**\n * Reactive query for all routines connected to an object O, via two 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. **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 const byTrigger = Query.all(byInput, byFeed).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/** Trigger path: a trigger's `input` references O, or a feed trigger is bound to O's feed. */\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 return trigger.input != null && referencesId(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 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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Atom", "Effect", "React", "useCallback", "useMemo", "useRef", "useState", "useCapabilities", "useOperationInvoker", "Database", "Filter", "Obj", "Type", "EffectEx", "SpaceOperation", "useQuery", "Panel", "ScrollArea", "useTranslation", "Menu", "MenuBuilder", "useMenuBuilder", "MasterDetail", "RoutineForm", "meta", "Routine", "RoutineCapabilities", "Instructions", "Trigger", "Filter", "Obj", "Query", "Ref", "Routine", "connectedRoutinesQuery", "object", "byInput", "select", "id", "referencedBy", "byFeed", "reference", "byTrigger", "all", "byInstructions", "RoutineCompanion", "subject", "object", "attendableId", "db", "Obj", "getDatabase", "t", "useTranslation", "meta", "profile", "key", "invokePromise", "useOperationInvoker", "items", "statusFor", "useConnectedRoutines", "selectedId", "setSelectedId", "useState", "draft", "setDraft", "savedRoutine", "setSavedRoutine", "selected", "useMemo", "find", "routine", "id", "handleSelect", "useCallback", "undefined", "handleCreateFromTemplate", "template", "scaffolded", "EffectEx", "runPromise", "scaffold", "pipe", "provideService", "Database", "Service", "makeService", "allTemplates", "useCapabilities", "RoutineCapabilities", "Template", "templates", "filter", "appliesTo", "menuActions", "useCompanionMenuActions", "handleCancel", "handleSave", "persistedRoutine", "add", "flush", "handleDelete", "current", "SpaceOperation", "RemoveObjects", "objects", "spaceId", "getMenu", "useGetMenu", "getIcon", "get", "icon", "hue", "enabled", "routineEnabled", "getLabel", "labelAtom", "ns", "Type", "getTypename", "Routine", "getAdornment", "_get", "label", "shown", "detail", "RoutineForm", "onSave", "onCancel", "Menu", "Root", "Panel", "Toolbar", "className", "Content", "asChild", "ScrollArea", "Viewport", "MasterDetail", "classNames", "onSelect", "emptyLabel", "connected", "useQuery", "connectedRoutinesQuery", "connectedIds", "Set", "map", "all", "Filter", "type", "byId", "Map", "seenOrder", "useRef", "seenForObject", "includes", "push", "flatMap", "has", "Atom", "family", "make", "triggers", "atomProperty", "hasTriggers", "length", "every", "ref", "MenuBuilder", "action", "testId", "build", "useMenuBuilder", "separator", "group", "variant", "iconOnly", "caretDown", "disabled"]
|
|
7
|
-
}
|