@dxos/plugin-automation 0.7.4 → 0.7.5-labs.5f04cf6

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 (201) hide show
  1. package/dist/lib/browser/{AssistantPanel-N3QSALKY.mjs → AssistantPanel-KO6DZBTU.mjs} +10 -11
  2. package/dist/lib/browser/AssistantPanel-KO6DZBTU.mjs.map +7 -0
  3. package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs +131 -0
  4. package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs.map +7 -0
  5. package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs +300 -0
  6. package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs.map +7 -0
  7. package/dist/lib/browser/ai-client-6CRYUC6D.mjs +22 -0
  8. package/dist/lib/browser/ai-client-6CRYUC6D.mjs.map +7 -0
  9. package/dist/lib/browser/app-graph-builder-IJTTULDP.mjs +131 -0
  10. package/dist/lib/browser/app-graph-builder-IJTTULDP.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-7KB4UMXO.mjs → chunk-C3VRGDR6.mjs} +30 -4
  12. package/dist/lib/browser/chunk-C3VRGDR6.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-EKJVAFT2.mjs +226 -0
  14. package/dist/lib/browser/chunk-EKJVAFT2.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-X5KMOH3I.mjs → chunk-HKX3D3ZP.mjs} +3 -3
  16. package/dist/lib/browser/chunk-HKX3D3ZP.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-HZ4TA7HY.mjs +15 -0
  18. package/dist/lib/browser/chunk-HZ4TA7HY.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-JSNPW6JF.mjs +14 -0
  20. package/dist/lib/browser/chunk-JSNPW6JF.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-KPSDH6XZ.mjs +118 -0
  22. package/dist/lib/browser/chunk-KPSDH6XZ.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-YZF3SDZL.mjs +139 -0
  24. package/dist/lib/browser/chunk-YZF3SDZL.mjs.map +7 -0
  25. package/dist/lib/browser/index.mjs +143 -249
  26. package/dist/lib/browser/index.mjs.map +4 -4
  27. package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs +24 -0
  28. package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs.map +7 -0
  29. package/dist/lib/browser/meta.json +1 -1
  30. package/dist/lib/browser/react-surface-IGMBLSV7.mjs +49 -0
  31. package/dist/lib/browser/react-surface-IGMBLSV7.mjs.map +7 -0
  32. package/dist/lib/browser/types/index.mjs +6 -3
  33. package/dist/lib/node/{AssistantPanel-RIA4TI3B.cjs → AssistantPanel-PPFS2HKK.cjs} +20 -21
  34. package/dist/lib/node/AssistantPanel-PPFS2HKK.cjs.map +7 -0
  35. package/dist/lib/node/{AutomationPanel-HZS5WKI5.cjs → AutomationPanel-RXJDVLCF.cjs} +52 -72
  36. package/dist/lib/node/AutomationPanel-RXJDVLCF.cjs.map +7 -0
  37. package/dist/lib/node/ChatContainer-GS2SC5OG.cjs +318 -0
  38. package/dist/lib/node/ChatContainer-GS2SC5OG.cjs.map +7 -0
  39. package/dist/lib/node/ai-client-A3RRU55B.cjs +38 -0
  40. package/dist/lib/node/ai-client-A3RRU55B.cjs.map +7 -0
  41. package/dist/lib/node/app-graph-builder-MF5M4QRS.cjs +147 -0
  42. package/dist/lib/node/app-graph-builder-MF5M4QRS.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-DTJ7XVO2.cjs → chunk-5VF5JKUN.cjs} +7 -7
  44. package/dist/lib/node/chunk-5VF5JKUN.cjs.map +7 -0
  45. package/dist/lib/node/{chunk-CUCUWUAF.cjs → chunk-BUQOZA4N.cjs} +32 -8
  46. package/dist/lib/node/chunk-BUQOZA4N.cjs.map +7 -0
  47. package/dist/lib/node/chunk-DNLBVFR7.cjs +147 -0
  48. package/dist/lib/node/chunk-DNLBVFR7.cjs.map +7 -0
  49. package/dist/lib/node/chunk-TWDGP26W.cjs +172 -0
  50. package/dist/lib/node/chunk-TWDGP26W.cjs.map +7 -0
  51. package/dist/lib/node/chunk-VEGLN4YN.cjs +250 -0
  52. package/dist/lib/node/chunk-VEGLN4YN.cjs.map +7 -0
  53. package/dist/lib/node/chunk-Z2YFE5SJ.cjs +49 -0
  54. package/dist/lib/node/chunk-Z2YFE5SJ.cjs.map +7 -0
  55. package/dist/lib/node/{meta.cjs → chunk-ZS5RZ7RM.cjs} +12 -8
  56. package/dist/lib/node/chunk-ZS5RZ7RM.cjs.map +7 -0
  57. package/dist/lib/node/index.cjs +159 -279
  58. package/dist/lib/node/index.cjs.map +4 -4
  59. package/dist/lib/node/intent-resolver-TBHYXBDI.cjs +39 -0
  60. package/dist/lib/node/intent-resolver-TBHYXBDI.cjs.map +7 -0
  61. package/dist/lib/node/meta.json +1 -1
  62. package/dist/lib/node/react-surface-BVUZMKYS.cjs +69 -0
  63. package/dist/lib/node/react-surface-BVUZMKYS.cjs.map +7 -0
  64. package/dist/lib/node/types/index.cjs +10 -7
  65. package/dist/lib/node/types/index.cjs.map +2 -2
  66. package/dist/lib/node-esm/{AssistantPanel-72YH43CH.mjs → AssistantPanel-XSSKKCJY.mjs} +10 -11
  67. package/dist/lib/node-esm/AssistantPanel-XSSKKCJY.mjs.map +7 -0
  68. package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs +132 -0
  69. package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs.map +7 -0
  70. package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs +301 -0
  71. package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs.map +7 -0
  72. package/dist/lib/node-esm/ai-client-2GBZRHBA.mjs +23 -0
  73. package/dist/lib/node-esm/ai-client-2GBZRHBA.mjs.map +7 -0
  74. package/dist/lib/node-esm/app-graph-builder-5N7OK23B.mjs +132 -0
  75. package/dist/lib/node-esm/app-graph-builder-5N7OK23B.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-5QUXIXNB.mjs +227 -0
  77. package/dist/lib/node-esm/chunk-5QUXIXNB.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-ICHNUP5M.mjs +119 -0
  79. package/dist/lib/node-esm/chunk-ICHNUP5M.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-ISYLEDVU.mjs +16 -0
  81. package/dist/lib/node-esm/chunk-ISYLEDVU.mjs.map +7 -0
  82. package/dist/lib/node-esm/{chunk-23LY7DYS.mjs → chunk-JCYVS5GG.mjs} +29 -4
  83. package/dist/lib/node-esm/chunk-JCYVS5GG.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-L2B6VGMG.mjs +16 -0
  85. package/dist/lib/node-esm/chunk-L2B6VGMG.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs +141 -0
  87. package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs.map +7 -0
  88. package/dist/lib/node-esm/{chunk-HNOBZHWK.mjs → chunk-X3LPRWIL.mjs} +3 -3
  89. package/dist/lib/node-esm/chunk-X3LPRWIL.mjs.map +7 -0
  90. package/dist/lib/node-esm/index.mjs +143 -249
  91. package/dist/lib/node-esm/index.mjs.map +4 -4
  92. package/dist/lib/node-esm/intent-resolver-DPJJHFGK.mjs +25 -0
  93. package/dist/lib/node-esm/intent-resolver-DPJJHFGK.mjs.map +7 -0
  94. package/dist/lib/node-esm/meta.json +1 -1
  95. package/dist/lib/node-esm/react-surface-77S6XJOM.mjs +50 -0
  96. package/dist/lib/node-esm/react-surface-77S6XJOM.mjs.map +7 -0
  97. package/dist/lib/node-esm/types/index.mjs +6 -3
  98. package/dist/types/src/AutomationPlugin.d.ts +1 -3
  99. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  100. package/dist/types/src/artifacts.stories.d.ts +30 -0
  101. package/dist/types/src/artifacts.stories.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/ai-client.d.ts +5 -0
  103. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/app-graph-builder.d.ts +180 -0
  105. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  107. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/index.d.ts +182 -0
  109. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  110. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  111. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  112. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  113. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  114. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts.map +1 -1
  115. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +1 -1
  116. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  117. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/ChatContainer.d.ts +8 -0
  119. package/dist/types/src/components/ChatContainer.d.ts.map +1 -0
  120. package/dist/types/src/components/Thread/Thread.d.ts +14 -0
  121. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -0
  122. package/dist/types/src/components/Thread/Thread.stories.d.ts +12 -0
  123. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -0
  124. package/dist/types/src/components/Thread/index.d.ts +2 -0
  125. package/dist/types/src/components/Thread/index.d.ts.map +1 -0
  126. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -2
  127. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  128. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/index.d.ts +8 -1
  130. package/dist/types/src/components/index.d.ts.map +1 -1
  131. package/dist/types/src/hooks/email.d.ts.map +1 -1
  132. package/dist/types/src/hooks/index.d.ts +1 -0
  133. package/dist/types/src/hooks/index.d.ts.map +1 -1
  134. package/dist/types/src/hooks/invocation-handler.d.ts.map +1 -1
  135. package/dist/types/src/hooks/processor.d.ts +46 -0
  136. package/dist/types/src/hooks/processor.d.ts.map +1 -0
  137. package/dist/types/src/hooks/processor.test.d.ts +2 -0
  138. package/dist/types/src/hooks/processor.test.d.ts.map +1 -0
  139. package/dist/types/src/index.d.ts +1 -2
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/meta.d.ts +1 -2
  142. package/dist/types/src/meta.d.ts.map +1 -1
  143. package/dist/types/src/testing/testing.d.ts +2 -0
  144. package/dist/types/src/testing/testing.d.ts.map +1 -1
  145. package/dist/types/src/translations.d.ts +76 -0
  146. package/dist/types/src/translations.d.ts.map +1 -1
  147. package/dist/types/src/types/schema.d.ts +40 -39
  148. package/dist/types/src/types/schema.d.ts.map +1 -1
  149. package/dist/types/src/types/types.d.ts +16 -5
  150. package/dist/types/src/types/types.d.ts.map +1 -1
  151. package/dist/types/tsconfig.tsbuildinfo +1 -0
  152. package/package.json +48 -47
  153. package/src/AutomationPlugin.tsx +85 -194
  154. package/src/artifacts.stories.tsx +180 -0
  155. package/src/capabilities/ai-client.ts +19 -0
  156. package/src/capabilities/app-graph-builder.ts +127 -0
  157. package/src/capabilities/capabilities.ts +12 -0
  158. package/src/capabilities/index.ts +12 -0
  159. package/src/capabilities/intent-resolver.ts +22 -0
  160. package/src/capabilities/react-surface.tsx +34 -0
  161. package/src/components/AssistantPanel/AssistantPanel.tsx +10 -8
  162. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +1 -2
  163. package/src/components/AutomationPanel/AutomationPanel.tsx +61 -39
  164. package/src/components/ChatContainer.tsx +80 -0
  165. package/src/components/PromptEditor/PromptEditor.stories.tsx +3 -3
  166. package/src/components/Thread/Thread.stories.tsx +142 -0
  167. package/src/components/Thread/Thread.tsx +149 -0
  168. package/src/components/Thread/index.ts +5 -0
  169. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +1 -2
  170. package/src/components/TriggerEditor/TriggerEditor.tsx +83 -16
  171. package/src/components/index.ts +5 -0
  172. package/src/hooks/email.ts +2 -2
  173. package/src/hooks/index.ts +1 -0
  174. package/src/hooks/invocation-handler.ts +2 -2
  175. package/src/hooks/processor.test.ts +15 -0
  176. package/src/hooks/processor.ts +161 -0
  177. package/src/index.ts +1 -4
  178. package/src/meta.ts +1 -1
  179. package/src/testing/testing.ts +9 -2
  180. package/src/translations.ts +13 -0
  181. package/src/types/schema.ts +9 -2
  182. package/src/types/types.ts +15 -21
  183. package/dist/lib/browser/AssistantPanel-N3QSALKY.mjs.map +0 -7
  184. package/dist/lib/browser/AutomationPanel-AQMN2CQR.mjs +0 -153
  185. package/dist/lib/browser/AutomationPanel-AQMN2CQR.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-7KB4UMXO.mjs.map +0 -7
  187. package/dist/lib/browser/chunk-X5KMOH3I.mjs.map +0 -7
  188. package/dist/lib/browser/meta.mjs +0 -9
  189. package/dist/lib/browser/meta.mjs.map +0 -7
  190. package/dist/lib/node/AssistantPanel-RIA4TI3B.cjs.map +0 -7
  191. package/dist/lib/node/AutomationPanel-HZS5WKI5.cjs.map +0 -7
  192. package/dist/lib/node/chunk-CUCUWUAF.cjs.map +0 -7
  193. package/dist/lib/node/chunk-DTJ7XVO2.cjs.map +0 -7
  194. package/dist/lib/node/meta.cjs.map +0 -7
  195. package/dist/lib/node-esm/AssistantPanel-72YH43CH.mjs.map +0 -7
  196. package/dist/lib/node-esm/AutomationPanel-JUHOWQWW.mjs +0 -154
  197. package/dist/lib/node-esm/AutomationPanel-JUHOWQWW.mjs.map +0 -7
  198. package/dist/lib/node-esm/chunk-23LY7DYS.mjs.map +0 -7
  199. package/dist/lib/node-esm/chunk-HNOBZHWK.mjs.map +0 -7
  200. package/dist/lib/node-esm/meta.mjs +0 -10
  201. package/dist/lib/node-esm/meta.mjs.map +0 -7
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  AUTOMATION_PLUGIN
3
- } from "./chunk-X5KMOH3I.mjs";
3
+ } from "./chunk-HKX3D3ZP.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-automation/src/components/AssistantPanel/AssistantPanel.tsx
6
6
  import React, { useEffect, useRef, useState } from "react";
7
- import { AIServiceClientImpl, ObjectId } from "@dxos/assistant";
7
+ import { AIServiceClientImpl } from "@dxos/assistant";
8
+ import { ObjectId } from "@dxos/echo-schema";
8
9
  import { SpaceId } from "@dxos/keys";
9
10
  import { useClient, useConfig } from "@dxos/react-client";
10
11
  import { ContextMenu } from "@dxos/react-ui";
@@ -190,12 +191,12 @@ var AssistantPanel = ({ subject, classNames }) => {
190
191
  const threadId2 = properties[PROPERTIES_ASSISTANT_KEY].threadId;
191
192
  setContextSpaceId(contextSpaceId2);
192
193
  setThreadId(threadId2);
193
- const messages = await aiClient.current.getMessagesInThread(contextSpaceId2, threadId2);
194
+ const messages = await aiClient.current.getMessages(contextSpaceId2, threadId2);
194
195
  setHistory(messages);
195
196
  });
196
197
  }, []);
197
198
  const handleRequest = async (input2) => {
198
- if (input2 === "") {
199
+ if (!aiClient.current || input2 === "") {
199
200
  return;
200
201
  }
201
202
  setInput("");
@@ -211,7 +212,7 @@ var AssistantPanel = ({ subject, classNames }) => {
211
212
  }
212
213
  ]
213
214
  };
214
- await aiClient.current.insertMessages([
215
+ await aiClient.current.appendMessages([
215
216
  userMessage
216
217
  ]);
217
218
  setHistory([
@@ -235,7 +236,7 @@ var AssistantPanel = ({ subject, classNames }) => {
235
236
  ...generationStream.accumulatedMessages
236
237
  ]);
237
238
  }
238
- await aiClient.current.insertMessages(await generationStream.complete());
239
+ await aiClient.current.appendMessages(await generationStream.complete());
239
240
  };
240
241
  const getSystemPrompt = async () => {
241
242
  return createSystemInstructions({
@@ -248,7 +249,7 @@ var AssistantPanel = ({ subject, classNames }) => {
248
249
  properties[PROPERTIES_ASSISTANT_KEY].threadId = ObjectId.random();
249
250
  const threadId2 = properties[PROPERTIES_ASSISTANT_KEY].threadId;
250
251
  setThreadId(threadId2);
251
- const messages = await aiClient.current.getMessagesInThread(contextSpaceId, threadId2);
252
+ const messages = await aiClient.current.getMessages(contextSpaceId, threadId2);
252
253
  setHistory(messages);
253
254
  };
254
255
  return /* @__PURE__ */ React.createElement("div", {
@@ -273,9 +274,7 @@ var AssistantPanel = ({ subject, classNames }) => {
273
274
  }, /* @__PURE__ */ React.createElement(Icon, {
274
275
  icon: "ph--play--regular",
275
276
  size: 4
276
- }))), /* @__PURE__ */ React.createElement(ContextMenu.Portal, null, /* @__PURE__ */ React.createElement(ContextMenu.Content, {
277
- classNames: "z-[31]"
278
- }, /* @__PURE__ */ React.createElement(ContextMenu.Viewport, null, /* @__PURE__ */ React.createElement(ContextMenu.Item, {
277
+ }))), /* @__PURE__ */ React.createElement(ContextMenu.Portal, null, /* @__PURE__ */ React.createElement(ContextMenu.Content, null, /* @__PURE__ */ React.createElement(ContextMenu.Viewport, null, /* @__PURE__ */ React.createElement(ContextMenu.Item, {
279
278
  onClick: clearThread
280
279
  }, "Clear thread"), /* @__PURE__ */ React.createElement(ContextMenu.Item, {
281
280
  onClick: async () => console.log(await getSystemPrompt())
@@ -338,4 +337,4 @@ var AssistantPanel_default = AssistantPanel;
338
337
  export {
339
338
  AssistantPanel_default as default
340
339
  };
341
- //# sourceMappingURL=AssistantPanel-N3QSALKY.mjs.map
340
+ //# sourceMappingURL=AssistantPanel-KO6DZBTU.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AssistantPanel/AssistantPanel.tsx", "../../../src/components/AssistantPanel/system-instructions.ts", "../../../src/components/AssistantPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\n/* eslint-disable no-console */\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { type Message } from '@dxos/artifact';\nimport { type AIServiceClient, AIServiceClientImpl } from '@dxos/assistant';\nimport type { ReactiveEchoObject } from '@dxos/echo-db';\nimport { ObjectId } from '@dxos/echo-schema';\nimport { SpaceId } from '@dxos/keys';\nimport { useClient, useConfig } from '@dxos/react-client';\nimport { ContextMenu, type ThemedClassName } from '@dxos/react-ui';\nimport { Icon, Input, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { createSystemInstructions } from './system-instructions';\nimport { AUTOMATION_PLUGIN } from '../../meta';\n\nconst PROPERTIES_ASSISTANT_KEY = 'dxos.assistant.beta.properties';\n\nexport type AssistantPanelProps = ThemedClassName<{\n subject?: ReactiveEchoObject<any>;\n}>;\n\nexport const AssistantPanel = ({ subject, classNames }: AssistantPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const config = useConfig();\n const client = useClient();\n const aiClient = useRef<AIServiceClient>();\n const [contextSpaceId, setContextSpaceId] = useState<SpaceId | undefined>();\n const [threadId, setThreadId] = useState<ObjectId | undefined>();\n const [history, setHistory] = useState<Message[]>([]);\n const [input, setInput] = useState('');\n\n useEffect(() => {\n if (!aiClient.current) {\n const endpoint = config.values.runtime?.services?.ai?.server;\n if (!endpoint) {\n throw new Error('AI service endpoint is not configured');\n }\n aiClient.current = new AIServiceClientImpl({\n endpoint,\n });\n }\n\n queueMicrotask(async () => {\n const properties = client.spaces.default.properties;\n\n properties[PROPERTIES_ASSISTANT_KEY] ??= {};\n properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId ??= SpaceId.random();\n properties[PROPERTIES_ASSISTANT_KEY].threadId ??= ObjectId.random();\n\n const contextSpaceId = properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId;\n const threadId = properties[PROPERTIES_ASSISTANT_KEY].threadId;\n\n setContextSpaceId(contextSpaceId);\n setThreadId(threadId);\n\n const messages = await aiClient.current!.getMessages(contextSpaceId, threadId);\n setHistory(messages);\n });\n }, []);\n\n const handleRequest = async (input: string) => {\n if (!aiClient.current || input === '') {\n return;\n }\n\n setInput('');\n\n // TODO(dmaretskyi): Can we call `create(Message, { ... })` here?\n const userMessage: Message = {\n id: ObjectId.random(),\n spaceId: contextSpaceId!,\n threadId: threadId!,\n role: 'user',\n content: [{ type: 'text', text: input }],\n };\n await aiClient.current.appendMessages([userMessage]);\n setHistory([...history, userMessage]);\n\n const generationStream = await aiClient.current.generate({\n model: '@anthropic/claude-3-5-sonnet-20241022',\n spaceId: contextSpaceId!,\n threadId: threadId!,\n tools: [],\n systemPrompt: await getSystemPrompt(),\n });\n\n const historyBefore = [...history, userMessage];\n for await (const _event of generationStream) {\n setHistory([...historyBefore, ...generationStream.accumulatedMessages]);\n }\n\n await aiClient.current!.appendMessages(await generationStream.complete());\n };\n\n const getSystemPrompt = async () => {\n return createSystemInstructions({ subject });\n };\n\n const clearThread = async () => {\n const properties = client.spaces.default.properties;\n\n properties[PROPERTIES_ASSISTANT_KEY] ??= {};\n // properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId ??= SpaceId.random();\n properties[PROPERTIES_ASSISTANT_KEY].threadId = ObjectId.random();\n\n // const contextSpaceId = properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId;\n const threadId = properties[PROPERTIES_ASSISTANT_KEY].threadId;\n\n // setContextSpaceId(contextSpaceId);\n setThreadId(threadId);\n\n const messages = await aiClient.current!.getMessages(contextSpaceId!, threadId);\n setHistory(messages);\n };\n\n // TODO(burdon): Factor out with script plugin.\n return (\n <div className={mx('flex flex-col h-full overflow-hidden', classNames)}>\n {history.length > 0 && (\n <div className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>\n {history.map((message) => (\n <MessageItem key={message.id} message={message} />\n ))}\n </div>\n )}\n\n <Toolbar.Root classNames='p-1'>\n <Input.Root>\n <Input.TextInput\n autoFocus\n placeholder={t('ask me anything')}\n value={input}\n onChange={(ev) => setInput(ev.target.value)}\n onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}\n />\n </Input.Root>\n <ContextMenu.Root>\n <ContextMenu.Trigger asChild>\n <Toolbar.Button onClick={() => handleRequest(input)}>\n <Icon icon='ph--play--regular' size={4} />\n </Toolbar.Button>\n </ContextMenu.Trigger>\n <ContextMenu.Portal>\n <ContextMenu.Content>\n <ContextMenu.Viewport>\n <ContextMenu.Item onClick={clearThread}>Clear thread</ContextMenu.Item>\n <ContextMenu.Item onClick={async () => console.log(await getSystemPrompt())}>\n Print instructions to console\n </ContextMenu.Item>\n </ContextMenu.Viewport>\n </ContextMenu.Content>\n </ContextMenu.Portal>\n </ContextMenu.Root>\n\n {/* <Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>\n <Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />\n </Toolbar.Button> */}\n </Toolbar.Root>\n </div>\n );\n};\n\nconst MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {\n const { id: _, role, content } = message;\n const styleContainer = 'flex flex-col overflow-x-hidden overflow-y-auto rounded-md gap-2 divide-y divide-separator';\n\n return (\n <div className={mx('flex', role === 'user' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>\n {content.map((content, i) => {\n switch (content.type) {\n case 'text': {\n const { cot, message } = parseMessage(content.text);\n return (\n <div\n key={i}\n role='none'\n className={mx(\n styleContainer,\n role === 'user' ? 'bg-primary-400 dark:bg-primary-600' : 'bg-hoverSurface',\n )}\n >\n {cot && <div className='p-2 whitespace-pre-wrap text-xs text-subdued'>{cot}</div>}\n <div className='p-2 whitespace-pre-wrap'>{message}</div>\n </div>\n );\n }\n\n case 'tool_use': {\n return (\n <div key={i} className={mx(styleContainer, 'text-xs')}>\n <div>\n <span className='p-2 text-primary'>Tool use</span>: {content.name} {content.id}\n </div>\n <SyntaxHighlighter language='json'>{content.inputJson}</SyntaxHighlighter>\n </div>\n );\n }\n\n case 'tool_result': {\n return (\n <div key={i} className={mx(styleContainer, 'text-xs', content.isError && 'text-error')}>\n <div>\n <span className='p-2 text-primary'>Tool result</span>: {content.toolUseId}\n </div>\n <SyntaxHighlighter language='json'>{content.content}</SyntaxHighlighter>\n </div>\n );\n }\n }\n\n return null;\n })}\n </div>\n );\n};\n\n// TODO(burdon): Move to server-side parsing.\nconst parseMessage = (text: string): { cot?: string; message: string } => {\n const regex = /<cot>([\\s\\S]*?)<\\/cot>\\s*([\\s\\S]*)/;\n const match = text.match(regex);\n return {\n cot: match?.[1].trim(),\n message: match?.[2] ?? text ?? '\\u00D8',\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { asyncTimeout } from '@dxos/async';\nimport type { ReactiveEchoObject } from '@dxos/echo-db';\nimport { getTypename } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { Filter, getSpace, ResultFormat } from '@dxos/react-client/echo';\n\n// TODO(burdon): Move into assistant-protocol.\nexport type ThreadContext = {\n subject?: ReactiveEchoObject<any>;\n};\n\nexport const createSystemInstructions = async (context: ThreadContext): Promise<string> => {\n let instructions = `\n <instructions>\n Before replying always think step-by-step on how to proceed.\n Print your thoughts inside <cot> tags.\n\n <example>\n <cot>To answer the question I need to ...</cot>\n </example>\n </instructions>\n\n <current_time>${new Date().toLocaleString()}</current_time>\n `;\n\n if (context.subject) {\n instructions += `\n <user_attention>\n The user is currently interacting with an object in Composer application:\n\n ${await formatContextObject(context.subject)}\n </user_attention>\n `;\n }\n\n return looseFormatXml(instructions);\n};\n\nconst formatContextObject = async (object: ReactiveEchoObject<any>): Promise<string> => {\n let data;\n try {\n data = await asyncTimeout(preprocessContextObject(object), CONTEXT_OBJECT_QUERY_TIMEOUT);\n } catch (err: any) {\n log.error('Failed to preprocess context object:', { err });\n data = object;\n }\n\n if (typeof data === 'string') {\n return data;\n } else {\n return `\n <object>\n <type>${getTypename(object)}</type>\n <id>${object.id}</id>\n ${formatObjectAsXMLTags(data)}\n </object>\n `;\n }\n};\n\nconst preprocessContextObject = async (object: ReactiveEchoObject<any>): Promise<Record<string, any> | string> => {\n const space = getSpace(object);\n if (!space) {\n return { ...object };\n }\n\n // TODO(dmaretskyi): Serialize based on schema annotations.\n switch (getTypename(object)) {\n // TODO(dmaretskyi): Reference types somehow without plugin-automation depending on other plugins.\n case 'dxos.org/type/Document': {\n const data = space.db\n .query({ id: object.id }, { format: ResultFormat.Plain, include: { content: true } })\n .first() ?? { content: { content: '' } };\n\n return {\n ...data,\n threads: undefined,\n };\n }\n\n case 'dxos.org/type/Table': {\n // TODO(dmaretskyi): Load references.\n const schema = object.view ? space?.db.schemaRegistry.getSchema(object.view.query.type) : undefined;\n const { objects: rows } =\n (schema &&\n (await space.db\n .query(Filter.schema(schema), { format: ResultFormat.Plain, limit: TABLE_ROWS_LIMIT })\n .run())) ??\n {};\n\n // TODO(dmaretskyi): Format table schema.\n return `\n <object>\n <id>${object.id}</id>\n <type>${getTypename(object)}</type>\n ${formatObjectAsXMLTags(object)}\n\n <rows>\n <!-- Limited to first ${TABLE_ROWS_LIMIT} rows. -->\n ${rows\n ?.map(\n (row: any) => `<row>\n ${formatObjectAsXMLTags(row)}\n </row>`,\n )\n .join('\\n')}\n </rows>\n\n `;\n }\n\n default:\n return { ...object };\n }\n};\n\nconst formatObjectAsXMLTags = (object: any, depth = 1): string => {\n return Object.entries(object)\n .filter(([key, value]) => ['string', 'number', 'boolean', 'object'].includes(typeof value))\n .map(([key, value]) => {\n if (typeof value === 'object' && value !== null) {\n if (depth === 0) {\n return '';\n } else {\n return `<${key}>\n ${formatObjectAsXMLTags(value, depth - 1)}\n </${key}>`;\n }\n }\n\n return `<${key}>${value}</${key}>`;\n })\n .join('\\n');\n};\n\nconst CONTEXT_OBJECT_QUERY_TIMEOUT = 5_000;\n\nconst TABLE_ROWS_LIMIT = 10;\n\n/**\n * Formats XML indentation for instructions so they are easier to read during debugging.\n */\nconst looseFormatXml = (xml: string): string => {\n let currentIndent = 0;\n\n return xml\n .split('\\n')\n .map((line) => {\n if (line.match(RE_CLOSE_TAG_LINE)) {\n currentIndent--;\n }\n const indent = currentIndent;\n if (line.match(RE_OPEN_TAG_LINE)) {\n currentIndent++;\n }\n return ' '.repeat(indent * 2) + line.trimStart();\n })\n .join('\\n');\n};\n\nconst RE_OPEN_TAG_LINE = /^[ ]*<[a-zA-Z0-9\\-_]+>[ ]*$/;\nconst RE_CLOSE_TAG_LINE = /^[ ]*<\\/[a-zA-Z0-9\\-_]+>[ ]*$/;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AssistantPanel } from './AssistantPanel';\n\nexport default AssistantPanel;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useEffect", "useRef", "useState", "AIServiceClientImpl", "ObjectId", "SpaceId", "useClient", "useConfig", "ContextMenu", "Icon", "Input", "Toolbar", "useTranslation", "SyntaxHighlighter", "mx", "asyncTimeout", "getTypename", "log", "Filter", "getSpace", "ResultFormat", "createSystemInstructions", "context", "instructions", "Date", "toLocaleString", "subject", "formatContextObject", "looseFormatXml", "object", "data", "preprocessContextObject", "CONTEXT_OBJECT_QUERY_TIMEOUT", "err", "error", "id", "formatObjectAsXMLTags", "space", "db", "query", "format", "Plain", "include", "content", "first", "threads", "undefined", "schema", "view", "schemaRegistry", "getSchema", "type", "objects", "rows", "limit", "TABLE_ROWS_LIMIT", "run", "map", "row", "join", "depth", "Object", "entries", "filter", "key", "value", "includes", "xml", "currentIndent", "split", "line", "match", "RE_CLOSE_TAG_LINE", "indent", "RE_OPEN_TAG_LINE", "repeat", "trimStart", "PROPERTIES_ASSISTANT_KEY", "AssistantPanel", "subject", "classNames", "t", "useTranslation", "AUTOMATION_PLUGIN", "config", "useConfig", "client", "useClient", "aiClient", "useRef", "contextSpaceId", "setContextSpaceId", "useState", "threadId", "setThreadId", "history", "setHistory", "input", "setInput", "useEffect", "current", "endpoint", "values", "runtime", "services", "ai", "server", "Error", "AIServiceClientImpl", "queueMicrotask", "properties", "spaces", "default", "SpaceId", "random", "ObjectId", "messages", "getMessages", "handleRequest", "userMessage", "id", "spaceId", "role", "content", "type", "text", "appendMessages", "generationStream", "generate", "model", "tools", "systemPrompt", "getSystemPrompt", "historyBefore", "_event", "accumulatedMessages", "complete", "createSystemInstructions", "clearThread", "div", "className", "mx", "length", "map", "message", "MessageItem", "key", "Toolbar", "Root", "Input", "TextInput", "autoFocus", "placeholder", "value", "onChange", "ev", "target", "onKeyDown", "ContextMenu", "Trigger", "asChild", "Button", "onClick", "Icon", "icon", "size", "Portal", "Content", "Viewport", "Item", "console", "log", "_", "styleContainer", "i", "cot", "parseMessage", "span", "name", "SyntaxHighlighter", "language", "inputJson", "isError", "toolUseId", "regex", "match", "trim", "AssistantPanel"]
7
+ }
@@ -0,0 +1,131 @@
1
+ import {
2
+ TriggerEditor
3
+ } from "./chunk-KPSDH6XZ.mjs";
4
+ import {
5
+ AUTOMATION_PLUGIN
6
+ } from "./chunk-HKX3D3ZP.mjs";
7
+
8
+ // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/AutomationPanel.tsx
9
+ import React, { useState } from "react";
10
+ import { S } from "@dxos/echo-schema";
11
+ import { FunctionType, FunctionTrigger, FunctionTriggerSchema, TriggerKind, ScriptType } from "@dxos/functions";
12
+ import { useClient } from "@dxos/react-client";
13
+ import { create, Filter, useQuery, getSpace } from "@dxos/react-client/echo";
14
+ import { IconButton, Input, useTranslation, Button } from "@dxos/react-ui";
15
+ import { List } from "@dxos/react-ui-list";
16
+ import { ghostHover, mx } from "@dxos/react-ui-theme";
17
+ var grid = "grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]";
18
+ var AutomationPanel = ({ space, object }) => {
19
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
20
+ const client = useClient();
21
+ const triggers = useQuery(space, Filter.schema(FunctionTrigger));
22
+ const functions = useQuery(space, Filter.schema(FunctionType));
23
+ const scripts = useQuery(space, Filter.schema(ScriptType));
24
+ const [trigger, setTrigger] = useState();
25
+ const [selected, setSelected] = useState();
26
+ const handleSelect = (trigger2) => {
27
+ const { id: _, ...values } = trigger2;
28
+ setTrigger(values);
29
+ setSelected(trigger2);
30
+ };
31
+ const handleAdd = () => {
32
+ setTrigger(create(FunctionTriggerSchema, {
33
+ meta: {}
34
+ }));
35
+ setSelected(void 0);
36
+ };
37
+ const handleDelete = (trigger2) => {
38
+ space.db.remove(trigger2);
39
+ setTrigger(void 0);
40
+ setSelected(void 0);
41
+ };
42
+ const handleSave = (trigger2) => {
43
+ if (selected) {
44
+ Object.assign(selected, trigger2);
45
+ } else {
46
+ space.db.add(create(FunctionTrigger, trigger2));
47
+ }
48
+ setTrigger(void 0);
49
+ setSelected(void 0);
50
+ };
51
+ const handleCancel = () => {
52
+ setTrigger(void 0);
53
+ };
54
+ return /* @__PURE__ */ React.createElement("div", {
55
+ className: "flex flex-col w-full divide-y divide-separator overflow-y-auto"
56
+ }, /* @__PURE__ */ React.createElement(List.Root, {
57
+ items: triggers,
58
+ isItem: S.is(FunctionTrigger),
59
+ getId: (field) => field.id
60
+ }, ({ items: triggers2 }) => /* @__PURE__ */ React.createElement("div", {
61
+ role: "list",
62
+ className: "flex flex-col w-full"
63
+ }, triggers2?.map((trigger2) => {
64
+ const copyAction = getCopyAction(client, trigger2);
65
+ return /* @__PURE__ */ React.createElement(List.Item, {
66
+ key: trigger2.id,
67
+ item: trigger2,
68
+ classNames: mx(grid, ghostHover, "items-center", "px-2")
69
+ }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
70
+ checked: trigger2.enabled,
71
+ onCheckedChange: (checked) => trigger2.enabled = checked
72
+ })), /* @__PURE__ */ React.createElement("div", {
73
+ className: "flex"
74
+ }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
75
+ classNames: "px-1 cursor-pointer w-0 shrink truncate",
76
+ onClick: () => handleSelect(trigger2)
77
+ }, getFunctionName(scripts, functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Button, {
78
+ onClick: () => navigator.clipboard.writeText(copyAction.contentProvider())
79
+ }, t(copyAction.translationKey))), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
80
+ onClick: () => handleDelete(trigger2)
81
+ }));
82
+ }))), trigger && /* @__PURE__ */ React.createElement(TriggerEditor, {
83
+ space,
84
+ trigger,
85
+ onSave: handleSave,
86
+ onCancel: handleCancel
87
+ }), !trigger && /* @__PURE__ */ React.createElement("div", {
88
+ className: "flex p-2 justify-center"
89
+ }, /* @__PURE__ */ React.createElement(IconButton, {
90
+ icon: "ph--plus--regular",
91
+ label: t("new trigger"),
92
+ onClick: handleAdd
93
+ })));
94
+ };
95
+ var getCopyAction = (client, trigger) => {
96
+ if (trigger?.spec?.type === TriggerKind.Email) {
97
+ return {
98
+ translationKey: "trigger copy email",
99
+ contentProvider: () => `${getSpace(trigger).id}@dxos.network`
100
+ };
101
+ }
102
+ if (trigger?.spec?.type === TriggerKind.Webhook) {
103
+ return {
104
+ translationKey: "trigger copy url",
105
+ contentProvider: () => getWebhookUrl(client, trigger)
106
+ };
107
+ }
108
+ return void 0;
109
+ };
110
+ var getWebhookUrl = (client, trigger) => {
111
+ const spaceId = getSpace(trigger).id;
112
+ const edgeUrl = new URL(client.config.values.runtime.services.edge.url);
113
+ const isSecure = edgeUrl.protocol.startsWith("https") || edgeUrl.protocol.startsWith("wss");
114
+ edgeUrl.protocol = isSecure ? "https" : "http";
115
+ return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
116
+ };
117
+ var getFunctionName = (scripts, functions, trigger) => {
118
+ const shortId = trigger.function && `${trigger.function?.slice(0, 16)}\u2026`;
119
+ const functionObject = functions.find((fn) => fn.name === trigger.function);
120
+ if (!functionObject) {
121
+ return shortId;
122
+ }
123
+ return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;
124
+ };
125
+
126
+ // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/index.ts
127
+ var AutomationPanel_default = AutomationPanel;
128
+ export {
129
+ AutomationPanel_default as default
130
+ };
131
+ //# sourceMappingURL=AutomationPanel-BMLM533Z.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport {\n FunctionType,\n FunctionTrigger,\n FunctionTriggerSchema,\n TriggerKind,\n type FunctionTriggerType,\n ScriptType,\n} from '@dxos/functions';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { create, Filter, useQuery, type Space, type ReactiveObject, getSpace } from '@dxos/react-client/echo';\nimport { IconButton, Input, useTranslation, Button } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = {\n space: Space;\n object?: ReactiveObject<any>;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ space, object }: AutomationPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const client = useClient();\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const [trigger, setTrigger] = useState<FunctionTriggerType>();\n const [selected, setSelected] = useState<FunctionTrigger>();\n\n const handleSelect = (trigger: FunctionTrigger) => {\n const { id: _, ...values } = trigger;\n setTrigger(values);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(create(FunctionTriggerSchema, { meta: {} }));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: FunctionTrigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(create(FunctionTrigger, trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n };\n\n return (\n <div className='flex flex-col w-full divide-y divide-separator overflow-y-auto'>\n <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>\n {({ items: triggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {triggers?.map((trigger) => {\n const copyAction = getCopyAction(client, trigger);\n return (\n <List.Item<FunctionTrigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center', 'px-2')}\n >\n <Input.Root>\n <Input.Switch\n checked={trigger.enabled}\n onCheckedChange={(checked) => (trigger.enabled = checked)}\n />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle\n classNames='px-1 cursor-pointer w-0 shrink truncate'\n onClick={() => handleSelect(trigger)}\n >\n {getFunctionName(scripts, functions, trigger) ?? '∅'}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose copy action */}\n {copyAction && (\n <Button onClick={() => navigator.clipboard.writeText(copyAction.contentProvider())}>\n {t(copyAction.translationKey)}\n </Button>\n )}\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n );\n })}\n </div>\n )}\n </List.Root>\n\n {trigger && <TriggerEditor space={space} trigger={trigger} onSave={handleSave} onCancel={handleCancel} />}\n\n {!trigger && (\n <div className='flex p-2 justify-center'>\n <IconButton icon='ph--plus--regular' label={t('new trigger')} onClick={handleAdd} />\n </div>\n )}\n </div>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {\n if (trigger?.spec?.type === TriggerKind.Email) {\n return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };\n }\n\n if (trigger?.spec?.type === TriggerKind.Webhook) {\n return { translationKey: 'trigger copy url', contentProvider: () => getWebhookUrl(client, trigger) };\n }\n\n return undefined;\n};\n\nconst getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {\n const spaceId = getSpace(trigger)!.id;\n const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);\n const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');\n edgeUrl.protocol = isSecure ? 'https' : 'http';\n return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();\n};\n\nconst getFunctionName = (scripts: ScriptType[], functions: FunctionType[], trigger: FunctionTriggerType) => {\n const shortId = trigger.function && `${trigger.function?.slice(0, 16)}…`;\n const functionObject = functions.find((fn) => fn.name === trigger.function);\n if (!functionObject) {\n return shortId;\n }\n return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useState", "S", "FunctionType", "FunctionTrigger", "FunctionTriggerSchema", "TriggerKind", "ScriptType", "useClient", "create", "Filter", "useQuery", "getSpace", "IconButton", "Input", "useTranslation", "Button", "List", "ghostHover", "mx", "grid", "AutomationPanel", "space", "object", "t", "useTranslation", "AUTOMATION_PLUGIN", "client", "useClient", "triggers", "useQuery", "Filter", "schema", "FunctionTrigger", "functions", "FunctionType", "scripts", "ScriptType", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "id", "_", "values", "handleAdd", "create", "FunctionTriggerSchema", "meta", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "div", "className", "List", "Root", "items", "isItem", "S", "is", "getId", "field", "role", "map", "copyAction", "getCopyAction", "Item", "key", "item", "classNames", "mx", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Button", "navigator", "clipboard", "writeText", "contentProvider", "translationKey", "ItemDeleteButton", "TriggerEditor", "onSave", "onCancel", "IconButton", "icon", "label", "spec", "type", "TriggerKind", "Email", "getSpace", "Webhook", "getWebhookUrl", "spaceId", "edgeUrl", "URL", "config", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "slice", "functionObject", "find", "fn", "name", "s", "source", "target", "AutomationPanel"]
7
+ }
@@ -0,0 +1,300 @@
1
+ import "./chunk-JSNPW6JF.mjs";
2
+ import {
3
+ Thread
4
+ } from "./chunk-YZF3SDZL.mjs";
5
+ import {
6
+ AutomationCapabilities
7
+ } from "./chunk-HZ4TA7HY.mjs";
8
+ import "./chunk-HKX3D3ZP.mjs";
9
+
10
+ // packages/plugins/experimental/plugin-automation/src/components/ChatContainer.tsx
11
+ import React, { useCallback, useMemo } from "react";
12
+ import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from "@dxos/app-framework";
13
+ import { createSystemPrompt } from "@dxos/artifact";
14
+ import { DXN as DXN2, QueueSubspaceTags } from "@dxos/keys";
15
+ import { getSpace } from "@dxos/react-client/echo";
16
+ import { useEdgeClient, useQueue } from "@dxos/react-edge-client";
17
+ import { StackItem } from "@dxos/react-ui-stack";
18
+
19
+ // packages/plugins/experimental/plugin-automation/src/hooks/processor.ts
20
+ import { computed, signal } from "@preact/signals-core";
21
+ import { Message } from "@dxos/artifact";
22
+ import { isToolUse, runTools } from "@dxos/assistant";
23
+ import { createStatic } from "@dxos/echo-schema";
24
+ import { invariant } from "@dxos/invariant";
25
+ import { log } from "@dxos/log";
26
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-automation/src/hooks/processor.ts";
27
+ var defaultOptions = {
28
+ model: "@anthropic/claude-3-5-sonnet-20241022",
29
+ systemPrompt: ""
30
+ };
31
+ var ChatProcessor = class {
32
+ constructor(_client, _tools, _extensions, _options = defaultOptions) {
33
+ this._client = _client;
34
+ this._tools = _tools;
35
+ this._extensions = _extensions;
36
+ this._options = _options;
37
+ this._history = [];
38
+ this._pending = signal([]);
39
+ this._streaming = signal([]);
40
+ }
41
+ get isStreaming() {
42
+ return computed(() => this._pending.value.length > 0);
43
+ }
44
+ get messages() {
45
+ return computed(() => [
46
+ ...this._pending.value,
47
+ ...this._streaming.value
48
+ ]);
49
+ }
50
+ /**
51
+ * Make GPT request.
52
+ */
53
+ async request(message, history = []) {
54
+ log.info("requesting...", {
55
+ message,
56
+ history: history.length
57
+ }, {
58
+ F: __dxlog_file,
59
+ L: 73,
60
+ S: this,
61
+ C: (f, a) => f(...a)
62
+ });
63
+ this._history = history;
64
+ this._pending.value = [
65
+ createStatic(Message, {
66
+ role: "user",
67
+ content: [
68
+ {
69
+ type: "text",
70
+ text: message
71
+ }
72
+ ]
73
+ })
74
+ ];
75
+ this._streaming.value = [];
76
+ await this.generate();
77
+ return this._reset();
78
+ }
79
+ /**
80
+ * Cancel pending requests.
81
+ * @returns Pending requests (incl. the request message).
82
+ */
83
+ async cancel() {
84
+ log.info("cancelling...", void 0, {
85
+ F: __dxlog_file,
86
+ L: 92,
87
+ S: this,
88
+ C: (f, a) => f(...a)
89
+ });
90
+ this._response?.abort();
91
+ return this._reset();
92
+ }
93
+ async _reset() {
94
+ const pending = this._pending.value;
95
+ this._history = [];
96
+ this._pending.value = [];
97
+ this._streaming.value = [];
98
+ return pending;
99
+ }
100
+ async generate() {
101
+ try {
102
+ let more = false;
103
+ do {
104
+ log.info("requesting...", {
105
+ history: this._history.length,
106
+ pending: this._pending.value.length
107
+ }, {
108
+ F: __dxlog_file,
109
+ L: 109,
110
+ S: this,
111
+ C: (f, a) => f(...a)
112
+ });
113
+ this._response = await this._client.generate({
114
+ ...this._options,
115
+ // TODO(burdon): Rename messages or separate history/message.
116
+ history: [
117
+ ...this._history,
118
+ ...this._pending.value
119
+ ],
120
+ tools: this._tools
121
+ });
122
+ queueMicrotask(async () => {
123
+ invariant(this._response, void 0, {
124
+ F: __dxlog_file,
125
+ L: 119,
126
+ S: this,
127
+ A: [
128
+ "this._response",
129
+ ""
130
+ ]
131
+ });
132
+ for await (const event of this._response) {
133
+ log.info("event", {
134
+ event: event.type
135
+ }, {
136
+ F: __dxlog_file,
137
+ L: 121,
138
+ S: this,
139
+ C: (f, a) => f(...a)
140
+ });
141
+ this._streaming.value = this._response.accumulatedMessages.map((message) => createStatic(Message, message));
142
+ }
143
+ });
144
+ const messages = await this._response.complete();
145
+ log.info("response", {
146
+ messages: messages.length
147
+ }, {
148
+ F: __dxlog_file,
149
+ L: 128,
150
+ S: this,
151
+ C: (f, a) => f(...a)
152
+ });
153
+ this._pending.value.push(...messages.map((message) => createStatic(Message, message)));
154
+ this._streaming.value = [];
155
+ more = false;
156
+ if (messages.length > 0 && isToolUse(messages.at(-1))) {
157
+ log.info("tool request...", void 0, {
158
+ F: __dxlog_file,
159
+ L: 135,
160
+ S: this,
161
+ C: (f, a) => f(...a)
162
+ });
163
+ const response = await runTools({
164
+ message: messages.at(-1),
165
+ tools: this._tools ?? [],
166
+ extensions: this._extensions
167
+ });
168
+ log.info("tool response", {
169
+ response
170
+ }, {
171
+ F: __dxlog_file,
172
+ L: 142,
173
+ S: this,
174
+ C: (f, a) => f(...a)
175
+ });
176
+ switch (response.type) {
177
+ case "continue": {
178
+ this._pending.value.push(response.message);
179
+ more = true;
180
+ break;
181
+ }
182
+ }
183
+ }
184
+ } while (more);
185
+ } catch (err) {
186
+ log.catch("request failed", {
187
+ err
188
+ }, {
189
+ F: __dxlog_file,
190
+ L: 154,
191
+ S: this,
192
+ C: (f, a) => f(...a)
193
+ });
194
+ } finally {
195
+ log.info("done", void 0, {
196
+ F: __dxlog_file,
197
+ L: 156,
198
+ S: this,
199
+ C: (f, a) => f(...a)
200
+ });
201
+ this._response = void 0;
202
+ this._streaming.value = [];
203
+ }
204
+ }
205
+ };
206
+
207
+ // packages/plugins/experimental/plugin-automation/src/hooks/useLocalTriggerManager.ts
208
+ import { useEffect, useState } from "react";
209
+ import { Mutex } from "@dxos/async";
210
+ import { Context } from "@dxos/context";
211
+ import { createSubscriptionTrigger } from "@dxos/functions";
212
+ import { FunctionTrigger } from "@dxos/functions";
213
+ import { invariant as invariant3 } from "@dxos/invariant";
214
+ import { log as log3 } from "@dxos/log";
215
+ import { useClient } from "@dxos/react-client";
216
+ import { Filter, useQuery } from "@dxos/react-client/echo";
217
+
218
+ // packages/plugins/experimental/plugin-automation/src/hooks/invocation-handler.ts
219
+ import { sleep } from "@dxos/async";
220
+ import { getObjectCore, ResultFormat } from "@dxos/echo-db";
221
+ import { FunctionType } from "@dxos/functions";
222
+ import { invariant as invariant2 } from "@dxos/invariant";
223
+ import { DXN, LOCAL_SPACE_TAG } from "@dxos/keys";
224
+ import { log as log2 } from "@dxos/log";
225
+
226
+ // packages/plugins/experimental/plugin-automation/src/hooks/useLocalTriggerManager.ts
227
+ var registerTriggersMutex = new Mutex();
228
+
229
+ // packages/plugins/experimental/plugin-automation/src/components/ChatContainer.tsx
230
+ var ChatContainer = ({ chat, role }) => {
231
+ const edgeClient = useEdgeClient();
232
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
233
+ const space = getSpace(chat);
234
+ const aiClient = useCapability(AutomationCapabilities.AiClient);
235
+ const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
236
+ const globalTools = useCapabilities(Capabilities.Tools);
237
+ const tools = useMemo(() => [
238
+ ...globalTools.flat(),
239
+ ...artifactDefinitions.flatMap((definition) => definition.tools)
240
+ ], [
241
+ globalTools,
242
+ artifactDefinitions
243
+ ]);
244
+ const systemPrompt = useMemo(() => createSystemPrompt({
245
+ artifacts: artifactDefinitions.map((definition) => definition.instructions)
246
+ }), [
247
+ artifactDefinitions
248
+ ]);
249
+ const processor = useMemo(() => new ChatProcessor(aiClient, tools, {
250
+ space,
251
+ dispatch
252
+ }, {
253
+ model: "@anthropic/claude-3-5-sonnet-20241022",
254
+ systemPrompt
255
+ }), [
256
+ aiClient,
257
+ tools,
258
+ space,
259
+ systemPrompt
260
+ ]);
261
+ const queueDxn = useMemo(() => new DXN2(DXN2.kind.QUEUE, [
262
+ QueueSubspaceTags.DATA,
263
+ space.id,
264
+ chat.queue.dxn.parts.at(-1)
265
+ ]), [
266
+ chat.queue.dxn
267
+ ]);
268
+ const queue = useQueue(edgeClient, queueDxn);
269
+ const messages = useMemo(() => [
270
+ ...queue.items,
271
+ ...processor.messages.value
272
+ ], [
273
+ queue.items,
274
+ processor.messages.value
275
+ ]);
276
+ const handleSubmit = useCallback(async (message) => {
277
+ if (processor.isStreaming) {
278
+ await processor.cancel();
279
+ }
280
+ const messages2 = await processor.request(message, queue.items);
281
+ await queue.append(messages2);
282
+ }, [
283
+ processor,
284
+ queue
285
+ ]);
286
+ return /* @__PURE__ */ React.createElement(StackItem.Content, {
287
+ toolbar: false,
288
+ role
289
+ }, /* @__PURE__ */ React.createElement(Thread, {
290
+ messages,
291
+ streaming: processor.isStreaming.value,
292
+ onSubmit: handleSubmit
293
+ }));
294
+ };
295
+ var ChatContainer_default = ChatContainer;
296
+ export {
297
+ ChatContainer,
298
+ ChatContainer_default as default
299
+ };
300
+ //# sourceMappingURL=ChatContainer-SIAJFRFF.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ChatContainer.tsx", "../../../src/hooks/processor.ts", "../../../src/hooks/useLocalTriggerManager.ts", "../../../src/hooks/invocation-handler.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';\nimport { createSystemPrompt, type Message } from '@dxos/artifact';\nimport { DXN, QueueSubspaceTags } from '@dxos/keys';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useEdgeClient, useQueue } from '@dxos/react-edge-client';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { Thread } from './Thread';\nimport { AutomationCapabilities } from '../capabilities';\nimport { ChatProcessor } from '../hooks';\nimport { type GptChatType } from '../types';\n\nexport const ChatContainer = ({ chat, role }: { chat: GptChatType; role: string }) => {\n const edgeClient = useEdgeClient();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const space = getSpace(chat);\n const aiClient = useCapability(AutomationCapabilities.AiClient);\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n const globalTools = useCapabilities(Capabilities.Tools);\n const tools = useMemo(\n () => [...globalTools.flat(), ...artifactDefinitions.flatMap((definition) => definition.tools)],\n [globalTools, artifactDefinitions],\n );\n const systemPrompt = useMemo(\n () => createSystemPrompt({ artifacts: artifactDefinitions.map((definition) => definition.instructions) }),\n [artifactDefinitions],\n );\n\n // TODO(burdon): Create hook.\n // TODO(wittjosiah): Should these be created in the component?\n // TODO(zan): Combine with ai service client?\n const processor = useMemo(\n () =>\n new ChatProcessor(\n aiClient,\n tools,\n { space, dispatch },\n { model: '@anthropic/claude-3-5-sonnet-20241022', systemPrompt },\n ),\n [aiClient, tools, space, systemPrompt],\n );\n // TODO(wittjosiah): Remove transformation.\n const queueDxn = useMemo(\n () => new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space!.id, chat.queue.dxn.parts.at(-1)!]),\n [chat.queue.dxn],\n );\n const queue = useQueue<Message>(edgeClient, queueDxn);\n const messages = useMemo(\n () => [...queue.items, ...processor.messages.value],\n [queue.items, processor.messages.value],\n );\n\n const handleSubmit = useCallback(\n async (message: string) => {\n // TODO(burdon): Button to cancel. Otherwise queue request.\n if (processor.isStreaming) {\n await processor.cancel();\n }\n\n const messages = await processor.request(message, queue.items);\n // TODO(burdon): Append on success only? If approved by user? Clinet/server.\n await queue.append(messages);\n },\n [processor, queue],\n );\n\n return (\n <StackItem.Content toolbar={false} role={role}>\n <Thread messages={messages} streaming={processor.isStreaming.value} onSubmit={handleSubmit} />\n </StackItem.Content>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ReadonlySignal, type Signal, computed, signal } from '@preact/signals-core';\n\nimport { type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { type Tool, Message } from '@dxos/artifact';\nimport {\n type AIServiceClientImpl,\n type GenerateRequest,\n type GenerationStream,\n isToolUse,\n runTools,\n} from '@dxos/assistant';\nimport { createStatic } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\n\nconst defaultOptions: Pick<GenerateRequest, 'model' | 'systemPrompt'> = {\n model: '@anthropic/claude-3-5-sonnet-20241022',\n systemPrompt: '',\n};\n\n// TODO(burdon): Factor out.\ndeclare global {\n interface ToolContextExtensions {\n space?: Space;\n dispatch?: PromiseIntentDispatcher;\n }\n}\n\n/**\n * Handles interactions with an AI service.\n * Manages message history, and executes tools based on AI responses.\n * Maintains a queue of messages and handles streaming responses from the AI service.\n * Supports cancellation of in-progress requests.\n */\n// TODO(burdon): Tests.\nexport class ChatProcessor {\n /** Prior history from queue. */\n private _history: Message[] = [];\n\n /** Pending messages (incl. the initial user message). */\n private _pending: Signal<Message[]> = signal([]);\n\n /** Streaming messages (from the AI service). */\n private _streaming: Signal<Message[]> = signal([]);\n\n /** Current streaming response. */\n private _response: GenerationStream | undefined;\n\n constructor(\n private readonly _client: AIServiceClientImpl,\n private readonly _tools?: Tool[],\n private readonly _extensions?: ToolContextExtensions,\n private readonly _options: Pick<GenerateRequest, 'model' | 'systemPrompt'> = defaultOptions,\n ) {}\n\n get isStreaming(): ReadonlySignal<boolean> {\n return computed(() => this._pending.value.length > 0);\n }\n\n get messages(): ReadonlySignal<Message[]> {\n return computed(() => [...this._pending.value, ...this._streaming.value]);\n }\n\n /**\n * Make GPT request.\n */\n async request(message: string, history: Message[] = []): Promise<Message[]> {\n log.info('requesting...', { message, history: history.length });\n this._history = history;\n this._pending.value = [\n createStatic(Message, {\n role: 'user',\n content: [{ type: 'text', text: message }],\n }),\n ];\n this._streaming.value = [];\n\n await this.generate();\n return this._reset();\n }\n\n /**\n * Cancel pending requests.\n * @returns Pending requests (incl. the request message).\n */\n async cancel(): Promise<Message[]> {\n log.info('cancelling...');\n this._response?.abort();\n return this._reset();\n }\n\n private async _reset(): Promise<Message[]> {\n const pending = this._pending.value;\n this._history = [];\n this._pending.value = [];\n this._streaming.value = [];\n return pending;\n }\n\n private async generate() {\n try {\n let more = false;\n do {\n log.info('requesting...', { history: this._history.length, pending: this._pending.value.length });\n this._response = await this._client.generate({\n ...this._options,\n // TODO(burdon): Rename messages or separate history/message.\n history: [...this._history, ...this._pending.value],\n tools: this._tools,\n });\n\n // Process the stream.\n queueMicrotask(async () => {\n invariant(this._response);\n for await (const event of this._response) {\n log.info('event', { event: event.type });\n this._streaming.value = this._response.accumulatedMessages.map((message) => createStatic(Message, message));\n }\n });\n\n // Update pending messages.\n const messages = await this._response.complete();\n log.info('response', { messages: messages.length });\n this._pending.value.push(...messages.map((message) => createStatic(Message, message)));\n this._streaming.value = [];\n\n // Resolve tool use locally.\n more = false;\n if (messages.length > 0 && isToolUse(messages.at(-1)!)) {\n log.info('tool request...');\n const response = await runTools({\n message: messages.at(-1)!,\n tools: this._tools ?? [],\n extensions: this._extensions,\n });\n\n log.info('tool response', { response });\n switch (response.type) {\n case 'continue': {\n this._pending.value.push(response.message);\n more = true;\n break;\n }\n }\n }\n } while (more);\n } catch (err) {\n // TODO(burdon): Handle error.\n log.catch('request failed', { err });\n } finally {\n log.info('done');\n this._response = undefined;\n this._streaming.value = [];\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { Mutex } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { createSubscriptionTrigger, type TriggerFactory } from '@dxos/functions';\nimport { FunctionTrigger } from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\n\nimport { invokeFunction } from './invocation-handler';\n\nconst registerTriggersMutex = new Mutex();\n\nexport const useLocalTriggerManager = (space: Space) => {\n const client = useClient();\n\n // TODO(burdon): Factor out, creating context for plugin (runs outside of component).\n const [registry] = useState(new Map<string, Context>());\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n useEffect(() => {\n setTimeout(async () => {\n // Mark-and-sweep removing disabled triggers.\n await registerTriggersMutex.executeSynchronized(async () => {\n const deprecated = new Set(Array.from(registry.keys()));\n log('triggers', {\n deprecated,\n all: triggers.map((t) => t.id),\n enabled: triggers.filter((t) => t.enabled).map((t) => t.id),\n });\n\n for (const trigger of triggers) {\n if (trigger.enabled) {\n if (registry.has(trigger.id)) {\n deprecated.delete(trigger.id);\n continue;\n }\n log.info('activating trigger', trigger.id);\n\n const ctx = new Context();\n registry.set(trigger.id, ctx);\n const triggerSpec = trigger.spec;\n invariant(triggerSpec);\n\n let triggerFactory: TriggerFactory<any>;\n if (triggerSpec.type === 'subscription') {\n triggerFactory = createSubscriptionTrigger;\n } else {\n log.info('unsupported trigger', { type: triggerSpec.type });\n continue;\n }\n\n await triggerFactory(ctx, space, trigger.spec, (data: any) => {\n return invokeFunction(client, space, trigger, data);\n });\n }\n }\n\n for (const id of deprecated) {\n const ctx = registry.get(id);\n if (ctx) {\n await ctx.dispose();\n registry.delete(id);\n }\n }\n });\n });\n }, [JSON.stringify(triggers)]);\n\n useEffect(() => {\n return () => {\n for (const ctx of registry.values()) {\n void ctx.dispose();\n }\n };\n }, []);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { sleep } from '@dxos/async';\nimport { getObjectCore, ResultFormat } from '@dxos/echo-db';\nimport { type AnyObjectData } from '@dxos/echo-schema';\nimport { FunctionType } from '@dxos/functions';\nimport { type FunctionTrigger } from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { DXN, LOCAL_SPACE_TAG } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Client, type Config } from '@dxos/react-client';\nimport { type Space } from '@dxos/react-client/echo';\n\nconst MAX_RETRIES = 3;\nconst RETRY_DELAY = 1_000;\n\nconst callFunction = async (funcUrl: string, trigger: any, data: any) => {\n const body = { event: 'trigger', trigger, data };\n\n let retryCount = 0;\n while (retryCount < MAX_RETRIES) {\n log.info('exec', { funcUrl, body, retryCount });\n const response = await fetch(funcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.text();\n log.info('response', { status: response.status, body: data });\n if (response.status === 409) {\n retryCount++;\n await sleep(RETRY_DELAY * Math.min(retryCount, 2));\n continue;\n }\n\n return { status: response.status, data };\n }\n return { status: 500 };\n};\n\nexport const invokeFunction = async (client: Client, space: Space, trigger: FunctionTrigger, data: any) => {\n try {\n invariant(trigger.spec);\n invariant(trigger.function);\n\n const script = await space.db.query({ id: trigger.function }, { format: ResultFormat.Plain }).first();\n const { objects: functions } = await space.db\n .query({ __typename: FunctionType.typename }, { format: ResultFormat.Plain })\n .run();\n const func = functions.find((fn) => referenceEquals(fn.source, trigger.function!)) as AnyObjectData | undefined;\n const funcSlug = func?.__meta.keys.find((key) => key.source === USERFUNCTIONS_META_KEY)?.id;\n if (!funcSlug) {\n log.warn('function not deployed', { scriptId: script.id, name: script.name });\n return 404;\n }\n\n const funcUrl = getFunctionUrl(client.config, funcSlug, space.id);\n const triggerData: AnyObjectData = {\n ...getObjectCore(trigger).toPlainObject(),\n // TODO: Remove when functions can query by DXN.\n promptId: trigger.meta?.prompt?.id,\n };\n // TODO: Remove when functions can add objects and easily modify collections (push, splice).\n return (await callFunction(funcUrl, triggerData, data)).status;\n } catch (err) {\n return 400;\n }\n};\n\nconst USERFUNCTIONS_META_KEY = 'dxos.org/service/function';\n\nconst getFunctionUrl = (config: Config, slug: string, spaceId?: string) => {\n const baseUrl = new URL('functions/', config.values.runtime?.services?.edge?.url);\n\n // Leading slashes cause the URL to be treated as an absolute path.\n const relativeUrl = slug.replace(/^\\//, '');\n const url = new URL(`./${relativeUrl}`, baseUrl.toString());\n spaceId && url.searchParams.set('spaceId', spaceId);\n url.protocol = 'https';\n return url.toString();\n};\n\n// TODO(dmaretskyi): Factor out.\n\ntype ReferenceLike = { '/': string } | string;\n\nconst referenceEquals = (a: ReferenceLike, b: ReferenceLike): boolean => {\n const aDXN = toDXN(a);\n const bDXN = toDXN(b);\n return aDXN.toString() === bDXN.toString();\n};\n\nconst toDXN = (ref: ReferenceLike): DXN => {\n if (typeof ref === 'string') {\n if (ref.startsWith('dxn:')) {\n return DXN.parse(ref);\n } else {\n return new DXN(DXN.kind.ECHO, [LOCAL_SPACE_TAG, ref]);\n }\n }\n\n invariant(typeof ref['/'] === 'string');\n return DXN.parse(ref['/']);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useMemo", "Capabilities", "useCapabilities", "useCapability", "useIntentDispatcher", "createSystemPrompt", "DXN", "QueueSubspaceTags", "getSpace", "useEdgeClient", "useQueue", "StackItem", "computed", "signal", "Message", "isToolUse", "runTools", "createStatic", "invariant", "log", "defaultOptions", "model", "systemPrompt", "ChatProcessor", "constructor", "_client", "_tools", "_extensions", "_options", "_history", "_pending", "_streaming", "isStreaming", "value", "length", "messages", "request", "message", "history", "info", "role", "content", "type", "text", "generate", "_reset", "cancel", "_response", "abort", "pending", "more", "tools", "queueMicrotask", "event", "accumulatedMessages", "map", "complete", "push", "at", "response", "extensions", "err", "catch", "undefined", "useEffect", "useState", "Mutex", "Context", "createSubscriptionTrigger", "FunctionTrigger", "invariant", "log", "useClient", "Filter", "useQuery", "sleep", "getObjectCore", "ResultFormat", "FunctionType", "invariant", "DXN", "LOCAL_SPACE_TAG", "log", "registerTriggersMutex", "Mutex", "ChatContainer", "chat", "role", "edgeClient", "useEdgeClient", "dispatchPromise", "dispatch", "useIntentDispatcher", "space", "getSpace", "aiClient", "useCapability", "AutomationCapabilities", "AiClient", "artifactDefinitions", "useCapabilities", "Capabilities", "ArtifactDefinition", "globalTools", "Tools", "tools", "useMemo", "flat", "flatMap", "definition", "systemPrompt", "createSystemPrompt", "artifacts", "map", "instructions", "processor", "ChatProcessor", "model", "queueDxn", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "id", "queue", "dxn", "parts", "at", "useQueue", "messages", "items", "value", "handleSubmit", "useCallback", "message", "isStreaming", "cancel", "request", "append", "StackItem", "Content", "toolbar", "Thread", "streaming", "onSubmit"]
7
+ }