@dxos/plugin-automation 0.9.0 → 0.9.1-main.c7dcc2e112

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.
Files changed (131) hide show
  1. package/dist/lib/neutral/{AutomationArticle-GN36NUX2.mjs → AutomationArticle-CG4ZML3C.mjs} +3 -2
  2. package/dist/lib/neutral/{AutomationCompanion-M26WR6VP.mjs → AutomationCompanion-67LW2WZS.mjs} +12 -13
  3. package/dist/lib/neutral/AutomationCompanion-67LW2WZS.mjs.map +7 -0
  4. package/dist/lib/neutral/AutomationPlugin.mjs +1 -1
  5. package/dist/lib/neutral/AutomationPlugin.node.mjs +4 -4
  6. package/dist/lib/neutral/AutomationPlugin.node.mjs.map +3 -3
  7. package/dist/lib/neutral/{AutomationSettings-YXUJDRQA.mjs → AutomationSettings-2XCCFX6X.mjs} +5 -5
  8. package/dist/lib/neutral/{AutomationSettings-YXUJDRQA.mjs.map → AutomationSettings-2XCCFX6X.mjs.map} +3 -3
  9. package/dist/lib/neutral/{TriggerSettings-XCHIZPOR.mjs → TriggerSettings-ABOTKRUA.mjs} +2 -2
  10. package/dist/lib/neutral/{app-graph-builder-BTTHS4VK.mjs → app-graph-builder-VX54SXD6.mjs} +6 -6
  11. package/dist/lib/neutral/app-graph-builder-VX54SXD6.mjs.map +7 -0
  12. package/dist/lib/neutral/capabilities/index.mjs +3 -3
  13. package/dist/lib/neutral/capabilities/node.mjs +1 -1
  14. package/dist/lib/neutral/{chunk-2JP77CMN.mjs → chunk-73DGSL37.mjs} +2 -2
  15. package/dist/lib/neutral/chunk-73DGSL37.mjs.map +7 -0
  16. package/dist/lib/neutral/{chunk-HPUHQ3L6.mjs → chunk-77QU5RSC.mjs} +3 -3
  17. package/dist/lib/neutral/chunk-77QU5RSC.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-D4RCXOP4.mjs +13 -0
  19. package/dist/lib/neutral/chunk-D4RCXOP4.mjs.map +7 -0
  20. package/dist/lib/neutral/{chunk-SONGOJRB.mjs → chunk-EJ5J22XS.mjs} +2 -2
  21. package/dist/lib/neutral/chunk-HHIFH3N3.mjs +45 -0
  22. package/dist/lib/neutral/chunk-HHIFH3N3.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-HQU5QWF4.mjs +349 -0
  24. package/dist/lib/neutral/chunk-HQU5QWF4.mjs.map +7 -0
  25. package/dist/lib/neutral/{chunk-FE7YFBX7.mjs → chunk-LVUL7GIN.mjs} +151 -60
  26. package/dist/lib/neutral/chunk-LVUL7GIN.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-GARB7S5R.mjs → chunk-YHK7FWGV.mjs} +5 -3
  28. package/dist/lib/neutral/chunk-YHK7FWGV.mjs.map +7 -0
  29. package/dist/lib/neutral/components/index.mjs +36 -2
  30. package/dist/lib/neutral/components/index.mjs.map +3 -3
  31. package/dist/lib/neutral/containers/index.mjs +4 -4
  32. package/dist/lib/neutral/{create-automation-OE3TNXYE.mjs → create-automation-AGYTF62E.mjs} +5 -9
  33. package/dist/lib/neutral/create-automation-AGYTF62E.mjs.map +7 -0
  34. package/dist/lib/neutral/{create-trigger-from-template-TERHKWJM.mjs → create-trigger-from-template-TYGCSR3Z.mjs} +5 -5
  35. package/dist/lib/neutral/create-trigger-from-template-TYGCSR3Z.mjs.map +7 -0
  36. package/dist/lib/neutral/index.mjs +10 -2
  37. package/dist/lib/neutral/meta.json +1 -1
  38. package/dist/lib/neutral/meta.mjs +1 -1
  39. package/dist/lib/neutral/{navigation-resolver-I3L5FHJO.mjs → navigation-resolver-FSJNF3DQ.mjs} +3 -3
  40. package/dist/lib/neutral/navigation-resolver-FSJNF3DQ.mjs.map +7 -0
  41. package/dist/lib/neutral/operations/index.mjs +1 -1
  42. package/dist/lib/neutral/plugin.mjs +2 -2
  43. package/dist/lib/neutral/{react-surface-IBRWUKPC.mjs → react-surface-W3J3CDHA.mjs} +2 -2
  44. package/dist/lib/neutral/{react-surface-IBRWUKPC.mjs.map → react-surface-W3J3CDHA.mjs.map} +3 -3
  45. package/dist/lib/neutral/testing.mjs +1 -1
  46. package/dist/lib/neutral/translations.mjs +6 -2
  47. package/dist/lib/neutral/translations.mjs.map +3 -3
  48. package/dist/lib/neutral/types/index.mjs +1 -1
  49. package/dist/types/dx.config.d.ts +28 -0
  50. package/dist/types/dx.config.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/index.d.ts +8 -13
  52. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  53. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -1
  54. package/dist/types/src/capabilities/node.d.ts +5 -5
  55. package/dist/types/src/capabilities/node.d.ts.map +1 -1
  56. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  57. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  58. package/dist/types/src/components/CronBuilder/CronBuilder.d.ts +16 -0
  59. package/dist/types/src/components/CronBuilder/CronBuilder.d.ts.map +1 -0
  60. package/dist/types/src/components/CronBuilder/CronBuilder.stories.d.ts +194 -0
  61. package/dist/types/src/components/CronBuilder/CronBuilder.stories.d.ts.map +1 -0
  62. package/dist/types/src/components/CronBuilder/cron.d.ts +17 -0
  63. package/dist/types/src/components/CronBuilder/cron.d.ts.map +1 -0
  64. package/dist/types/src/components/CronBuilder/cron.test.d.ts +2 -0
  65. package/dist/types/src/components/CronBuilder/cron.test.d.ts.map +1 -0
  66. package/dist/types/src/components/CronBuilder/index.d.ts +4 -0
  67. package/dist/types/src/components/CronBuilder/index.d.ts.map +1 -0
  68. package/dist/types/src/components/CronBuilder/schema.d.ts +96 -0
  69. package/dist/types/src/components/CronBuilder/schema.d.ts.map +1 -0
  70. package/dist/types/src/components/index.d.ts +1 -0
  71. package/dist/types/src/components/index.d.ts.map +1 -1
  72. package/dist/types/src/containers/AutomationArticle/AutomationArticle.d.ts +6 -0
  73. package/dist/types/src/containers/AutomationArticle/AutomationArticle.d.ts.map +1 -1
  74. package/dist/types/src/containers/AutomationArticle/AutomationArticle.stories.d.ts +120 -0
  75. package/dist/types/src/containers/AutomationArticle/AutomationArticle.stories.d.ts.map +1 -0
  76. package/dist/types/src/containers/AutomationCompanion/AutomationCompanion.d.ts.map +1 -1
  77. package/dist/types/src/index.d.ts +1 -0
  78. package/dist/types/src/index.d.ts.map +1 -1
  79. package/dist/types/src/meta.d.ts +28 -2
  80. package/dist/types/src/meta.d.ts.map +1 -1
  81. package/dist/types/src/paths.d.ts +2 -0
  82. package/dist/types/src/paths.d.ts.map +1 -1
  83. package/dist/types/src/translations.d.ts +9 -1
  84. package/dist/types/src/translations.d.ts.map +1 -1
  85. package/dist/types/src/types/AutomationCapabilities.d.ts +6 -1
  86. package/dist/types/src/types/AutomationCapabilities.d.ts.map +1 -1
  87. package/dist/types/tsconfig.tsbuildinfo +1 -1
  88. package/dx.config.ts +34 -0
  89. package/package.json +40 -38
  90. package/src/AutomationPlugin.test.ts +1 -1
  91. package/src/AutomationPlugin.tsx +1 -1
  92. package/src/capabilities/app-graph-builder.ts +5 -5
  93. package/src/capabilities/navigation-resolver.ts +2 -2
  94. package/src/capabilities/react-surface.tsx +1 -1
  95. package/src/commands/trigger/create/queue.ts +2 -2
  96. package/src/commands/trigger/update/queue.ts +2 -2
  97. package/src/components/CreateAutomationPanel/CreateAutomationPanel.tsx +1 -1
  98. package/src/components/CronBuilder/CronBuilder.stories.tsx +72 -0
  99. package/src/components/CronBuilder/CronBuilder.tsx +94 -0
  100. package/src/components/CronBuilder/cron.test.ts +131 -0
  101. package/src/components/CronBuilder/cron.ts +138 -0
  102. package/src/components/CronBuilder/index.ts +7 -0
  103. package/src/components/CronBuilder/schema.ts +119 -0
  104. package/src/components/index.ts +1 -0
  105. package/src/containers/AutomationArticle/AutomationArticle.stories.tsx +73 -0
  106. package/src/containers/AutomationArticle/AutomationArticle.tsx +186 -56
  107. package/src/containers/AutomationCompanion/AutomationCompanion.tsx +79 -72
  108. package/src/containers/AutomationSettings/AutomationSettings.tsx +3 -3
  109. package/src/containers/TriggerSettings/TriggerSettings.tsx +1 -1
  110. package/src/index.ts +1 -0
  111. package/src/meta.ts +2 -26
  112. package/src/operations/create-trigger-from-template.ts +3 -3
  113. package/src/paths.ts +7 -2
  114. package/src/translations.ts +7 -2
  115. package/src/types/AutomationCapabilities.ts +9 -1
  116. package/src/types/AutomationOperation.ts +1 -1
  117. package/src/types/schema.ts +1 -1
  118. package/dist/lib/neutral/AutomationCompanion-M26WR6VP.mjs.map +0 -7
  119. package/dist/lib/neutral/app-graph-builder-BTTHS4VK.mjs.map +0 -7
  120. package/dist/lib/neutral/chunk-2JP77CMN.mjs.map +0 -7
  121. package/dist/lib/neutral/chunk-DUGOIM7G.mjs +0 -36
  122. package/dist/lib/neutral/chunk-DUGOIM7G.mjs.map +0 -7
  123. package/dist/lib/neutral/chunk-FE7YFBX7.mjs.map +0 -7
  124. package/dist/lib/neutral/chunk-GARB7S5R.mjs.map +0 -7
  125. package/dist/lib/neutral/chunk-HPUHQ3L6.mjs.map +0 -7
  126. package/dist/lib/neutral/create-automation-OE3TNXYE.mjs.map +0 -7
  127. package/dist/lib/neutral/create-trigger-from-template-TERHKWJM.mjs.map +0 -7
  128. package/dist/lib/neutral/navigation-resolver-I3L5FHJO.mjs.map +0 -7
  129. /package/dist/lib/neutral/{AutomationArticle-GN36NUX2.mjs.map → AutomationArticle-CG4ZML3C.mjs.map} +0 -0
  130. /package/dist/lib/neutral/{TriggerSettings-XCHIZPOR.mjs.map → TriggerSettings-ABOTKRUA.mjs.map} +0 -0
  131. /package/dist/lib/neutral/{chunk-SONGOJRB.mjs.map → chunk-EJ5J22XS.mjs.map} +0 -0
@@ -4,7 +4,8 @@ import {
4
4
  AutomationInlineForm,
5
5
  GeneralSection,
6
6
  TriggerSection
7
- } from "./chunk-FE7YFBX7.mjs";
7
+ } from "./chunk-LVUL7GIN.mjs";
8
+ import "./chunk-HQU5QWF4.mjs";
8
9
  import "./chunk-J5LGTIGS.mjs";
9
10
  export {
10
11
  ActionSection,
@@ -14,4 +15,4 @@ export {
14
15
  TriggerSection,
15
16
  AutomationArticle as default
16
17
  };
17
- //# sourceMappingURL=AutomationArticle-GN36NUX2.mjs.map
18
+ //# sourceMappingURL=AutomationArticle-CG4ZML3C.mjs.map
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  AutomationInlineForm
3
- } from "./chunk-FE7YFBX7.mjs";
3
+ } from "./chunk-LVUL7GIN.mjs";
4
+ import "./chunk-HQU5QWF4.mjs";
4
5
  import "./chunk-J5LGTIGS.mjs";
5
6
 
6
7
  // src/containers/AutomationCompanion/AutomationCompanion.tsx
@@ -8,7 +9,7 @@ import React, { useCallback, useMemo, useRef, useState } from "react";
8
9
  import { useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
9
10
  import { Filter as Filter2, Obj as Obj2, Type } from "@dxos/echo";
10
11
  import { useQuery } from "@dxos/react-client/echo";
11
- import { DropdownMenu, Icon, Tooltip, useTranslation } from "@dxos/react-ui";
12
+ import { DropdownMenu, Icon, Panel, Toolbar, Tooltip, useTranslation } from "@dxos/react-ui";
12
13
  import { Accordion } from "@dxos/react-ui-list";
13
14
  import { meta } from "#meta";
14
15
  import { Automation as Automation2, AutomationCapabilities, AutomationOperation } from "#types";
@@ -25,16 +26,16 @@ var connectedAutomationsQuery = (object) => {
25
26
 
26
27
  // src/containers/AutomationCompanion/AutomationCompanion.tsx
27
28
  var AutomationCompanion = ({ db, object }) => {
28
- const { t } = useTranslation(meta.id);
29
+ const { t } = useTranslation(meta.profile.key);
29
30
  const templates = useCapabilities(AutomationCapabilities.Template);
30
31
  const applicableTemplates = useMemo(() => templates.filter((template) => template.appliesTo?.(object) ?? true), [
31
32
  templates,
32
33
  object
33
34
  ]);
34
35
  const { items, statusFor, open, setOpen, handleCreate } = useConnectedAutomations(db, object);
35
- return /* @__PURE__ */ React.createElement("div", {
36
- className: "flex flex-col"
37
- }, items.length === 0 ? /* @__PURE__ */ React.createElement("p", {
36
+ return /* @__PURE__ */ React.createElement(Panel.Root, null, /* @__PURE__ */ React.createElement(Panel.Toolbar, {
37
+ asChild: true
38
+ }, /* @__PURE__ */ React.createElement(Toolbar.Root, null)), /* @__PURE__ */ React.createElement(Panel.Content, null, items.length === 0 ? /* @__PURE__ */ React.createElement("p", {
38
39
  className: "text-sm text-description p-2"
39
40
  }, t("no-automations.message")) : /* @__PURE__ */ React.createElement(Accordion.Root, {
40
41
  items,
@@ -47,11 +48,9 @@ var AutomationCompanion = ({ db, object }) => {
47
48
  return /* @__PURE__ */ React.createElement(Accordion.Item, {
48
49
  key: automation.id,
49
50
  item: automation
50
- }, /* @__PURE__ */ React.createElement(Accordion.ItemHeader, null, /* @__PURE__ */ React.createElement(Icon, {
51
- icon: "ph--lightning--regular",
52
- size: 4,
53
- classNames: "mr-2 shrink-0"
54
- }), /* @__PURE__ */ React.createElement("span", {
51
+ }, /* @__PURE__ */ React.createElement(Accordion.ItemHeader, {
52
+ icon: "ph--lightning--regular"
53
+ }, /* @__PURE__ */ React.createElement("span", {
55
54
  className: "flex-1 truncate"
56
55
  }, Obj2.getLabel(automation) ?? t("object-name.placeholder", {
57
56
  ns: Type.getTypename(Automation2.Automation)
@@ -88,7 +87,7 @@ var AutomationCompanion = ({ db, object }) => {
88
87
  }, /* @__PURE__ */ React.createElement(Icon, {
89
88
  icon: template.icon ?? "ph--lightning--regular",
90
89
  size: 4
91
- }), /* @__PURE__ */ React.createElement("span", null, template.label)))), /* @__PURE__ */ React.createElement(DropdownMenu.Arrow, null))))));
90
+ }), /* @__PURE__ */ React.createElement("span", null, template.label)))), /* @__PURE__ */ React.createElement(DropdownMenu.Arrow, null)))))));
92
91
  };
93
92
  var useConnectedAutomations = (db, object) => {
94
93
  const { invokePromise } = useOperationInvoker();
@@ -162,4 +161,4 @@ export {
162
161
  AutomationCompanion,
163
162
  AutomationCompanion as default
164
163
  };
165
- //# sourceMappingURL=AutomationCompanion-M26WR6VP.mjs.map
164
+ //# sourceMappingURL=AutomationCompanion-67LW2WZS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/AutomationCompanion/AutomationCompanion.tsx", "../../../src/util/automations-for-object.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { type Database, Filter, Obj, Type } from '@dxos/echo';\nimport { useQuery } from '@dxos/react-client/echo';\nimport { DropdownMenu, Icon, Panel, Toolbar, Tooltip, useTranslation } from '@dxos/react-ui';\nimport { Accordion } from '@dxos/react-ui-list';\n\nimport { meta } from '#meta';\nimport { Automation, AutomationCapabilities, AutomationOperation } from '#types';\n\nimport { AutomationInlineForm } from '../../containers/AutomationArticle';\nimport { connectedAutomationsQuery } from '../../util/automations-for-object';\n\n/** Association state of a row relative to the companion's object. */\ntype Status = 'associated' | 'pending' | 'detached';\n\n// TODO(burdon): Use type.\nexport type AutomationCompanionProps = {\n db: Database.Database;\n object: Obj.Unknown;\n};\n\n/**\n * Renders the automations connected to an object as an accordion (see `useConnectedAutomations` for the\n * session-stable list it draws from), flagging non-associated rows with a warning badge. New automations are\n * created from a template dropdown (no dialog).\n */\nexport const AutomationCompanion = ({ db, object }: AutomationCompanionProps) => {\n const { t } = useTranslation(meta.profile.key);\n const templates = useCapabilities(AutomationCapabilities.Template);\n // Only offer templates applicable to this companion's subject (e.g. a CRM template needs a Mailbox).\n const applicableTemplates = useMemo(\n () => templates.filter((template) => template.appliesTo?.(object) ?? true),\n [templates, object],\n );\n const { items, statusFor, open, setOpen, handleCreate } = useConnectedAutomations(db, object);\n\n return (\n <Panel.Root>\n <Panel.Toolbar asChild>\n <Toolbar.Root />\n </Panel.Toolbar>\n <Panel.Content>\n {items.length === 0 ? (\n <p className='text-sm text-description p-2'>{t('no-automations.message')}</p>\n ) : (\n <Accordion.Root<Automation.Automation> items={items} value={open} onValueChange={setOpen}>\n {({ items }) => (\n <div className='flex flex-col divide-y divide-separator'>\n {items.map((automation) => {\n const status = statusFor(automation.id);\n return (\n <Accordion.Item key={automation.id} item={automation}>\n <Accordion.ItemHeader icon='ph--lightning--regular'>\n <span className='flex-1 truncate'>\n {Obj.getLabel(automation) ??\n t('object-name.placeholder', { ns: Type.getTypename(Automation.Automation) })}\n </span>\n {status !== 'associated' && (\n <Tooltip.Trigger\n asChild\n side='bottom'\n content={t(\n status === 'pending'\n ? 'automation-not-associated.message'\n : 'automation-detached.message',\n )}\n >\n <Icon icon='ph--warning--regular' size={4} classNames='text-warning-text shrink-0 mr-2' />\n </Tooltip.Trigger>\n )}\n </Accordion.ItemHeader>\n <Accordion.ItemBody>\n <AutomationInlineForm automation={automation} db={db} />\n </Accordion.ItemBody>\n </Accordion.Item>\n );\n })}\n </div>\n )}\n </Accordion.Root>\n )}\n\n <div className='border-t border-separator'>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n {/* Mirror the accordion item header layout (p-2 + icon mr-2) so the icon aligns with the rows above. */}\n <button type='button' className='group flex items-center p-2 dx-focus-ring-inset w-full text-start'>\n <Icon icon='ph--plus--regular' size={4} classNames='mr-2 shrink-0' />\n <span className='flex-1 truncate'>\n {t('add-object.label', { ns: Type.getTypename(Automation.Automation) })}\n </span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {applicableTemplates.map((template) => (\n <DropdownMenu.Item key={template.id} onClick={() => void handleCreate(template.id)}>\n <Icon icon={template.icon ?? 'ph--lightning--regular'} size={4} />\n <span>{template.label}</span>\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n </Panel.Content>\n </Panel.Root>\n );\n};\n\n//\n// Hooks\n//\n\n/**\n * Owns the companion's session-stable automation list. A reactive reverse-ref query supplies the live\n * connected set, accumulated into an append-only ordering so rows never reorder or disappear while mounted;\n * a row that loses its association (or a freshly-created one not yet connected) is surfaced via `statusFor`\n * rather than dropped. Also holds the accordion open state and a create handler that appends the new\n * automation and auto-expands it for immediate configuration.\n */\nconst useConnectedAutomations = (db: Database.Database, object: Obj.Unknown) => {\n const { invokePromise } = useOperationInvoker();\n\n // Live connected set (reactive reverse-ref query) + a by-id map for resolving rows that have left it.\n const connected = useQuery(db, connectedAutomationsQuery(object));\n const all = useQuery(db, Filter.type(Automation.Automation));\n const connectedIds = useMemo(() => new Set(connected.map((automation) => automation.id)), [connected]);\n const byId = useMemo(() => new Map(all.map((automation) => [automation.id, automation])), [all]);\n\n // Session-stable bookkeeping (held for the component lifetime).\n const seenOrder = useRef<string[]>([]);\n const everConnected = useRef<Set<string>>(new Set());\n const [createdIds, setCreatedIds] = useState<ReadonlySet<string>>(() => new Set());\n const [open, setOpen] = useState<string[]>([]);\n\n // Accumulate first-seen order and \"was ever connected\" — append-only, so rows never reorder or drop.\n for (const id of connectedIds) {\n everConnected.current.add(id);\n }\n for (const id of [...connectedIds, ...createdIds]) {\n if (!seenOrder.current.includes(id)) {\n seenOrder.current.push(id);\n }\n }\n\n // Resolve to live objects in stable order, dropping ids whose object was hard-deleted.\n const items = useMemo(\n () =>\n seenOrder.current.flatMap((id) => {\n const automation = byId.get(id);\n return automation ? [automation] : [];\n }),\n [byId, connectedIds, createdIds],\n );\n\n const statusFor = useCallback(\n (id: string): Status =>\n connectedIds.has(id) ? 'associated' : everConnected.current.has(id) ? 'detached' : 'pending',\n [connectedIds],\n );\n\n const handleCreate = useCallback(\n async (templateId: string) => {\n const { data, error } = await invokePromise(AutomationOperation.CreateAutomation, {\n db,\n templateId,\n subject: object,\n });\n if (error || !data) {\n return;\n }\n\n setCreatedIds((prev) => new Set(prev).add(data.object.id));\n setOpen((prev) => (prev.includes(data.object.id) ? prev : [...prev, data.object.id]));\n },\n [invokePromise, db, object],\n );\n\n return { items, statusFor, open, setOpen, handleCreate };\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { Trigger } from '@dxos/compute';\nimport { Filter, Obj, Query, Ref } from '@dxos/echo';\n\nimport { Automation } from '#types';\n\n/**\n * Reactive query for the automations connected to an object O — without a stored association field.\n *\n * Association is derived: an automation is connected when one of its triggers references O, either via a\n * `Ref` anywhere in the trigger's `input` (e.g. a magazine passed into AgentPrompt's input) or via a feed\n * trigger whose `spec.feed` resolves to `O.feed` (feed-annotated hosts like mailboxes). Both are reachable\n * by reverse-reference traversal because ECHO's reverse-ref index is structural — it records every ref in a\n * document regardless of schema path (incl. untyped records and union-nested fields). The traversal is two\n * hops: O ← Trigger ← Automation.\n */\nexport const connectedAutomationsQuery = (object: Obj.Unknown): Query.Query<Automation.Automation> => {\n // Triggers referencing O directly (any path, incl. nested in the untyped `input` record).\n const byInput = Query.select(Filter.id(object.id)).referencedBy(Trigger.Trigger);\n // Triggers referencing O's feed; `.reference('feed')` reads the path structurally and is empty for objects\n // without a feed prop, so this branch contributes nothing for non-feed objects.\n const byFeed = Query.select(Filter.id(object.id)).reference('feed').referencedBy(Trigger.Trigger);\n return Query.all(byInput, byFeed).referencedBy(Automation.Automation, 'triggers');\n};\n\n/**\n * Pure predicate equivalent of {@link connectedAutomationsQuery}, over a pre-queried list of automations.\n * Kept for unit tests (asserting the query and predicate agree) and the deferred quick-association check.\n */\nexport const automationsForObject = (\n object: Obj.Unknown,\n automations: Automation.Automation[],\n): Automation.Automation[] => automations.filter((automation) => automationReferencesObject(automation, object));\n\nexport const automationReferencesObject = (automation: Automation.Automation, object: Obj.Unknown): boolean => {\n const objectFeedId = getFeedId(object);\n return automation.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/** 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": ["React", "useCallback", "useMemo", "useRef", "useState", "useCapabilities", "useOperationInvoker", "Filter", "Obj", "Type", "useQuery", "DropdownMenu", "Icon", "Panel", "Toolbar", "Tooltip", "useTranslation", "Accordion", "meta", "Automation", "AutomationCapabilities", "AutomationOperation", "Trigger", "Filter", "Obj", "Query", "Ref", "Automation", "connectedAutomationsQuery", "object", "byInput", "select", "id", "referencedBy", "byFeed", "reference", "all", "AutomationCompanion", "db", "object", "t", "useTranslation", "meta", "profile", "key", "templates", "useCapabilities", "AutomationCapabilities", "Template", "applicableTemplates", "useMemo", "filter", "template", "appliesTo", "items", "statusFor", "open", "setOpen", "handleCreate", "useConnectedAutomations", "Panel", "Root", "Toolbar", "asChild", "Content", "length", "p", "className", "Accordion", "value", "onValueChange", "div", "map", "automation", "status", "id", "Item", "item", "ItemHeader", "icon", "span", "Obj", "getLabel", "ns", "Type", "getTypename", "Automation", "Tooltip", "Trigger", "side", "content", "Icon", "size", "classNames", "ItemBody", "AutomationInlineForm", "DropdownMenu", "button", "type", "Portal", "Viewport", "onClick", "label", "Arrow", "invokePromise", "useOperationInvoker", "connected", "useQuery", "connectedAutomationsQuery", "all", "Filter", "connectedIds", "Set", "byId", "Map", "seenOrder", "useRef", "everConnected", "createdIds", "setCreatedIds", "useState", "current", "add", "includes", "push", "flatMap", "get", "useCallback", "has", "templateId", "data", "error", "AutomationOperation", "CreateAutomation", "subject", "prev"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  AutomationPlugin,
3
3
  AutomationPlugin_default
4
- } from "./chunk-HPUHQ3L6.mjs";
4
+ } from "./chunk-77QU5RSC.mjs";
5
5
  import "./chunk-J5LGTIGS.mjs";
6
6
  export {
7
7
  AutomationPlugin,
@@ -27,7 +27,7 @@ import { CommandConfig } from "@dxos/cli-util";
27
27
  import { flushAndSync, print, spaceLayer, withTypes } from "@dxos/cli-util";
28
28
  import { Common } from "@dxos/cli-util";
29
29
  import { Operation as Operation2, Trigger as Trigger2 } from "@dxos/compute";
30
- import { Database as Database2, Feed as FeedNs, Filter as Filter2, JsonSchema, Ref as Ref2 } from "@dxos/echo";
30
+ import { Database as Database2, Feed as Feed$, Filter as Filter2, JsonSchema, Ref as Ref2 } from "@dxos/echo";
31
31
  import { EID } from "@dxos/keys";
32
32
 
33
33
  // src/commands/trigger/options.ts
@@ -324,7 +324,7 @@ var queue = Command.make("feed", {
324
324
  }
325
325
  const feed = yield* Option2.match(options.feed, {
326
326
  onNone: () => selectFeed(),
327
- onSome: (uri) => Database2.resolve(EID.parse(uri), FeedNs.Feed)
327
+ onSome: (uri) => Database2.resolve(EID.parse(uri), Feed$.Feed)
328
328
  });
329
329
  const input = yield* Option2.match(options.input, {
330
330
  onNone: () => promptForSchemaInput(fn6.inputSchema ? JsonSchema.toEffectSchema(fn6.inputSchema) : void 0),
@@ -607,7 +607,7 @@ import { CommandConfig as CommandConfig6 } from "@dxos/cli-util";
607
607
  import { flushAndSync as flushAndSync4, print as print5, spaceLayer as spaceLayer6, withTypes as withTypes5 } from "@dxos/cli-util";
608
608
  import { Common as Common6 } from "@dxos/cli-util";
609
609
  import { Operation as Operation5, Trigger as Trigger7 } from "@dxos/compute";
610
- import { Database as Database7, Feed as FeedNs2, Filter as Filter6, JsonSchema as JsonSchema4, Obj as Obj2, Ref as Ref6 } from "@dxos/echo";
610
+ import { Database as Database7, Feed as Feed$2, Filter as Filter6, JsonSchema as JsonSchema4, Obj as Obj2, Ref as Ref6 } from "@dxos/echo";
611
611
  import { EID as EID3 } from "@dxos/keys";
612
612
  var queue2 = Command7.make("feed", {
613
613
  spaceId: Common6.spaceId.pipe(Options7.optional),
@@ -689,7 +689,7 @@ var updateFeed = Effect7.fn(function* (trigger2, feedOption) {
689
689
  if (shouldChangeFeed) {
690
690
  const feed = yield* Option6.match(feedOption, {
691
691
  onNone: () => selectFeed(),
692
- onSome: (uri) => Database7.resolve(EID3.parse(uri), FeedNs2.Feed)
692
+ onSome: (uri) => Database7.resolve(EID3.parse(uri), Feed$2.Feed)
693
693
  });
694
694
  Obj2.update(trigger2, (trigger3) => {
695
695
  if (trigger3.spec?.kind === "feed") {