@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
@@ -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,132 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ TriggerEditor
4
+ } from "./chunk-ICHNUP5M.mjs";
5
+ import {
6
+ AUTOMATION_PLUGIN
7
+ } from "./chunk-X3LPRWIL.mjs";
8
+
9
+ // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/AutomationPanel.tsx
10
+ import React, { useState } from "react";
11
+ import { S } from "@dxos/echo-schema";
12
+ import { FunctionType, FunctionTrigger, FunctionTriggerSchema, TriggerKind, ScriptType } from "@dxos/functions";
13
+ import { useClient } from "@dxos/react-client";
14
+ import { create, Filter, useQuery, getSpace } from "@dxos/react-client/echo";
15
+ import { IconButton, Input, useTranslation, Button } from "@dxos/react-ui";
16
+ import { List } from "@dxos/react-ui-list";
17
+ import { ghostHover, mx } from "@dxos/react-ui-theme";
18
+ var grid = "grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]";
19
+ var AutomationPanel = ({ space, object }) => {
20
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
21
+ const client = useClient();
22
+ const triggers = useQuery(space, Filter.schema(FunctionTrigger));
23
+ const functions = useQuery(space, Filter.schema(FunctionType));
24
+ const scripts = useQuery(space, Filter.schema(ScriptType));
25
+ const [trigger, setTrigger] = useState();
26
+ const [selected, setSelected] = useState();
27
+ const handleSelect = (trigger2) => {
28
+ const { id: _, ...values } = trigger2;
29
+ setTrigger(values);
30
+ setSelected(trigger2);
31
+ };
32
+ const handleAdd = () => {
33
+ setTrigger(create(FunctionTriggerSchema, {
34
+ meta: {}
35
+ }));
36
+ setSelected(void 0);
37
+ };
38
+ const handleDelete = (trigger2) => {
39
+ space.db.remove(trigger2);
40
+ setTrigger(void 0);
41
+ setSelected(void 0);
42
+ };
43
+ const handleSave = (trigger2) => {
44
+ if (selected) {
45
+ Object.assign(selected, trigger2);
46
+ } else {
47
+ space.db.add(create(FunctionTrigger, trigger2));
48
+ }
49
+ setTrigger(void 0);
50
+ setSelected(void 0);
51
+ };
52
+ const handleCancel = () => {
53
+ setTrigger(void 0);
54
+ };
55
+ return /* @__PURE__ */ React.createElement("div", {
56
+ className: "flex flex-col w-full divide-y divide-separator overflow-y-auto"
57
+ }, /* @__PURE__ */ React.createElement(List.Root, {
58
+ items: triggers,
59
+ isItem: S.is(FunctionTrigger),
60
+ getId: (field) => field.id
61
+ }, ({ items: triggers2 }) => /* @__PURE__ */ React.createElement("div", {
62
+ role: "list",
63
+ className: "flex flex-col w-full"
64
+ }, triggers2?.map((trigger2) => {
65
+ const copyAction = getCopyAction(client, trigger2);
66
+ return /* @__PURE__ */ React.createElement(List.Item, {
67
+ key: trigger2.id,
68
+ item: trigger2,
69
+ classNames: mx(grid, ghostHover, "items-center", "px-2")
70
+ }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Switch, {
71
+ checked: trigger2.enabled,
72
+ onCheckedChange: (checked) => trigger2.enabled = checked
73
+ })), /* @__PURE__ */ React.createElement("div", {
74
+ className: "flex"
75
+ }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
76
+ classNames: "px-1 cursor-pointer w-0 shrink truncate",
77
+ onClick: () => handleSelect(trigger2)
78
+ }, getFunctionName(scripts, functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Button, {
79
+ onClick: () => navigator.clipboard.writeText(copyAction.contentProvider())
80
+ }, t(copyAction.translationKey))), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
81
+ onClick: () => handleDelete(trigger2)
82
+ }));
83
+ }))), trigger && /* @__PURE__ */ React.createElement(TriggerEditor, {
84
+ space,
85
+ trigger,
86
+ onSave: handleSave,
87
+ onCancel: handleCancel
88
+ }), !trigger && /* @__PURE__ */ React.createElement("div", {
89
+ className: "flex p-2 justify-center"
90
+ }, /* @__PURE__ */ React.createElement(IconButton, {
91
+ icon: "ph--plus--regular",
92
+ label: t("new trigger"),
93
+ onClick: handleAdd
94
+ })));
95
+ };
96
+ var getCopyAction = (client, trigger) => {
97
+ if (trigger?.spec?.type === TriggerKind.Email) {
98
+ return {
99
+ translationKey: "trigger copy email",
100
+ contentProvider: () => `${getSpace(trigger).id}@dxos.network`
101
+ };
102
+ }
103
+ if (trigger?.spec?.type === TriggerKind.Webhook) {
104
+ return {
105
+ translationKey: "trigger copy url",
106
+ contentProvider: () => getWebhookUrl(client, trigger)
107
+ };
108
+ }
109
+ return void 0;
110
+ };
111
+ var getWebhookUrl = (client, trigger) => {
112
+ const spaceId = getSpace(trigger).id;
113
+ const edgeUrl = new URL(client.config.values.runtime.services.edge.url);
114
+ const isSecure = edgeUrl.protocol.startsWith("https") || edgeUrl.protocol.startsWith("wss");
115
+ edgeUrl.protocol = isSecure ? "https" : "http";
116
+ return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
117
+ };
118
+ var getFunctionName = (scripts, functions, trigger) => {
119
+ const shortId = trigger.function && `${trigger.function?.slice(0, 16)}\u2026`;
120
+ const functionObject = functions.find((fn) => fn.name === trigger.function);
121
+ if (!functionObject) {
122
+ return shortId;
123
+ }
124
+ return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;
125
+ };
126
+
127
+ // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/index.ts
128
+ var AutomationPanel_default = AutomationPanel;
129
+ export {
130
+ AutomationPanel_default as default
131
+ };
132
+ //# sourceMappingURL=AutomationPanel-GQZZ4UBI.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,301 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import "./chunk-L2B6VGMG.mjs";
3
+ import {
4
+ Thread
5
+ } from "./chunk-U7HXYMPZ.mjs";
6
+ import {
7
+ AutomationCapabilities
8
+ } from "./chunk-ISYLEDVU.mjs";
9
+ import "./chunk-X3LPRWIL.mjs";
10
+
11
+ // packages/plugins/experimental/plugin-automation/src/components/ChatContainer.tsx
12
+ import React, { useCallback, useMemo } from "react";
13
+ import { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from "@dxos/app-framework";
14
+ import { createSystemPrompt } from "@dxos/artifact";
15
+ import { DXN as DXN2, QueueSubspaceTags } from "@dxos/keys";
16
+ import { getSpace } from "@dxos/react-client/echo";
17
+ import { useEdgeClient, useQueue } from "@dxos/react-edge-client";
18
+ import { StackItem } from "@dxos/react-ui-stack";
19
+
20
+ // packages/plugins/experimental/plugin-automation/src/hooks/processor.ts
21
+ import { computed, signal } from "@preact/signals-core";
22
+ import { Message } from "@dxos/artifact";
23
+ import { isToolUse, runTools } from "@dxos/assistant";
24
+ import { createStatic } from "@dxos/echo-schema";
25
+ import { invariant } from "@dxos/invariant";
26
+ import { log } from "@dxos/log";
27
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-automation/src/hooks/processor.ts";
28
+ var defaultOptions = {
29
+ model: "@anthropic/claude-3-5-sonnet-20241022",
30
+ systemPrompt: ""
31
+ };
32
+ var ChatProcessor = class {
33
+ constructor(_client, _tools, _extensions, _options = defaultOptions) {
34
+ this._client = _client;
35
+ this._tools = _tools;
36
+ this._extensions = _extensions;
37
+ this._options = _options;
38
+ this._history = [];
39
+ this._pending = signal([]);
40
+ this._streaming = signal([]);
41
+ }
42
+ get isStreaming() {
43
+ return computed(() => this._pending.value.length > 0);
44
+ }
45
+ get messages() {
46
+ return computed(() => [
47
+ ...this._pending.value,
48
+ ...this._streaming.value
49
+ ]);
50
+ }
51
+ /**
52
+ * Make GPT request.
53
+ */
54
+ async request(message, history = []) {
55
+ log.info("requesting...", {
56
+ message,
57
+ history: history.length
58
+ }, {
59
+ F: __dxlog_file,
60
+ L: 73,
61
+ S: this,
62
+ C: (f, a) => f(...a)
63
+ });
64
+ this._history = history;
65
+ this._pending.value = [
66
+ createStatic(Message, {
67
+ role: "user",
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: message
72
+ }
73
+ ]
74
+ })
75
+ ];
76
+ this._streaming.value = [];
77
+ await this.generate();
78
+ return this._reset();
79
+ }
80
+ /**
81
+ * Cancel pending requests.
82
+ * @returns Pending requests (incl. the request message).
83
+ */
84
+ async cancel() {
85
+ log.info("cancelling...", void 0, {
86
+ F: __dxlog_file,
87
+ L: 92,
88
+ S: this,
89
+ C: (f, a) => f(...a)
90
+ });
91
+ this._response?.abort();
92
+ return this._reset();
93
+ }
94
+ async _reset() {
95
+ const pending = this._pending.value;
96
+ this._history = [];
97
+ this._pending.value = [];
98
+ this._streaming.value = [];
99
+ return pending;
100
+ }
101
+ async generate() {
102
+ try {
103
+ let more = false;
104
+ do {
105
+ log.info("requesting...", {
106
+ history: this._history.length,
107
+ pending: this._pending.value.length
108
+ }, {
109
+ F: __dxlog_file,
110
+ L: 109,
111
+ S: this,
112
+ C: (f, a) => f(...a)
113
+ });
114
+ this._response = await this._client.generate({
115
+ ...this._options,
116
+ // TODO(burdon): Rename messages or separate history/message.
117
+ history: [
118
+ ...this._history,
119
+ ...this._pending.value
120
+ ],
121
+ tools: this._tools
122
+ });
123
+ queueMicrotask(async () => {
124
+ invariant(this._response, void 0, {
125
+ F: __dxlog_file,
126
+ L: 119,
127
+ S: this,
128
+ A: [
129
+ "this._response",
130
+ ""
131
+ ]
132
+ });
133
+ for await (const event of this._response) {
134
+ log.info("event", {
135
+ event: event.type
136
+ }, {
137
+ F: __dxlog_file,
138
+ L: 121,
139
+ S: this,
140
+ C: (f, a) => f(...a)
141
+ });
142
+ this._streaming.value = this._response.accumulatedMessages.map((message) => createStatic(Message, message));
143
+ }
144
+ });
145
+ const messages = await this._response.complete();
146
+ log.info("response", {
147
+ messages: messages.length
148
+ }, {
149
+ F: __dxlog_file,
150
+ L: 128,
151
+ S: this,
152
+ C: (f, a) => f(...a)
153
+ });
154
+ this._pending.value.push(...messages.map((message) => createStatic(Message, message)));
155
+ this._streaming.value = [];
156
+ more = false;
157
+ if (messages.length > 0 && isToolUse(messages.at(-1))) {
158
+ log.info("tool request...", void 0, {
159
+ F: __dxlog_file,
160
+ L: 135,
161
+ S: this,
162
+ C: (f, a) => f(...a)
163
+ });
164
+ const response = await runTools({
165
+ message: messages.at(-1),
166
+ tools: this._tools ?? [],
167
+ extensions: this._extensions
168
+ });
169
+ log.info("tool response", {
170
+ response
171
+ }, {
172
+ F: __dxlog_file,
173
+ L: 142,
174
+ S: this,
175
+ C: (f, a) => f(...a)
176
+ });
177
+ switch (response.type) {
178
+ case "continue": {
179
+ this._pending.value.push(response.message);
180
+ more = true;
181
+ break;
182
+ }
183
+ }
184
+ }
185
+ } while (more);
186
+ } catch (err) {
187
+ log.catch("request failed", {
188
+ err
189
+ }, {
190
+ F: __dxlog_file,
191
+ L: 154,
192
+ S: this,
193
+ C: (f, a) => f(...a)
194
+ });
195
+ } finally {
196
+ log.info("done", void 0, {
197
+ F: __dxlog_file,
198
+ L: 156,
199
+ S: this,
200
+ C: (f, a) => f(...a)
201
+ });
202
+ this._response = void 0;
203
+ this._streaming.value = [];
204
+ }
205
+ }
206
+ };
207
+
208
+ // packages/plugins/experimental/plugin-automation/src/hooks/useLocalTriggerManager.ts
209
+ import { useEffect, useState } from "react";
210
+ import { Mutex } from "@dxos/async";
211
+ import { Context } from "@dxos/context";
212
+ import { createSubscriptionTrigger } from "@dxos/functions";
213
+ import { FunctionTrigger } from "@dxos/functions";
214
+ import { invariant as invariant3 } from "@dxos/invariant";
215
+ import { log as log3 } from "@dxos/log";
216
+ import { useClient } from "@dxos/react-client";
217
+ import { Filter, useQuery } from "@dxos/react-client/echo";
218
+
219
+ // packages/plugins/experimental/plugin-automation/src/hooks/invocation-handler.ts
220
+ import { sleep } from "@dxos/async";
221
+ import { getObjectCore, ResultFormat } from "@dxos/echo-db";
222
+ import { FunctionType } from "@dxos/functions";
223
+ import { invariant as invariant2 } from "@dxos/invariant";
224
+ import { DXN, LOCAL_SPACE_TAG } from "@dxos/keys";
225
+ import { log as log2 } from "@dxos/log";
226
+
227
+ // packages/plugins/experimental/plugin-automation/src/hooks/useLocalTriggerManager.ts
228
+ var registerTriggersMutex = new Mutex();
229
+
230
+ // packages/plugins/experimental/plugin-automation/src/components/ChatContainer.tsx
231
+ var ChatContainer = ({ chat, role }) => {
232
+ const edgeClient = useEdgeClient();
233
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
234
+ const space = getSpace(chat);
235
+ const aiClient = useCapability(AutomationCapabilities.AiClient);
236
+ const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
237
+ const globalTools = useCapabilities(Capabilities.Tools);
238
+ const tools = useMemo(() => [
239
+ ...globalTools.flat(),
240
+ ...artifactDefinitions.flatMap((definition) => definition.tools)
241
+ ], [
242
+ globalTools,
243
+ artifactDefinitions
244
+ ]);
245
+ const systemPrompt = useMemo(() => createSystemPrompt({
246
+ artifacts: artifactDefinitions.map((definition) => definition.instructions)
247
+ }), [
248
+ artifactDefinitions
249
+ ]);
250
+ const processor = useMemo(() => new ChatProcessor(aiClient, tools, {
251
+ space,
252
+ dispatch
253
+ }, {
254
+ model: "@anthropic/claude-3-5-sonnet-20241022",
255
+ systemPrompt
256
+ }), [
257
+ aiClient,
258
+ tools,
259
+ space,
260
+ systemPrompt
261
+ ]);
262
+ const queueDxn = useMemo(() => new DXN2(DXN2.kind.QUEUE, [
263
+ QueueSubspaceTags.DATA,
264
+ space.id,
265
+ chat.queue.dxn.parts.at(-1)
266
+ ]), [
267
+ chat.queue.dxn
268
+ ]);
269
+ const queue = useQueue(edgeClient, queueDxn);
270
+ const messages = useMemo(() => [
271
+ ...queue.items,
272
+ ...processor.messages.value
273
+ ], [
274
+ queue.items,
275
+ processor.messages.value
276
+ ]);
277
+ const handleSubmit = useCallback(async (message) => {
278
+ if (processor.isStreaming) {
279
+ await processor.cancel();
280
+ }
281
+ const messages2 = await processor.request(message, queue.items);
282
+ await queue.append(messages2);
283
+ }, [
284
+ processor,
285
+ queue
286
+ ]);
287
+ return /* @__PURE__ */ React.createElement(StackItem.Content, {
288
+ toolbar: false,
289
+ role
290
+ }, /* @__PURE__ */ React.createElement(Thread, {
291
+ messages,
292
+ streaming: processor.isStreaming.value,
293
+ onSubmit: handleSubmit
294
+ }));
295
+ };
296
+ var ChatContainer_default = ChatContainer;
297
+ export {
298
+ ChatContainer,
299
+ ChatContainer_default as default
300
+ };
301
+ //# sourceMappingURL=ChatContainer-57ILGC3R.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
+ }
@@ -0,0 +1,23 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ AutomationCapabilities
4
+ } from "./chunk-ISYLEDVU.mjs";
5
+ import "./chunk-X3LPRWIL.mjs";
6
+
7
+ // packages/plugins/experimental/plugin-automation/src/capabilities/ai-client.ts
8
+ import { contributes } from "@dxos/app-framework";
9
+ import { AIServiceClientImpl } from "@dxos/assistant";
10
+ import { ClientCapabilities } from "@dxos/plugin-client";
11
+ var DEFAULT_AI_SERVICE_URL = "http://localhost:8788";
12
+ var ai_client_default = (context) => {
13
+ const client = context.requestCapability(ClientCapabilities.Client);
14
+ const endpoint = client.config.values.runtime?.app?.env?.DX_AI_SERVICE_URL ?? DEFAULT_AI_SERVICE_URL;
15
+ const aiClient = new AIServiceClientImpl({
16
+ endpoint
17
+ });
18
+ return contributes(AutomationCapabilities.AiClient, aiClient);
19
+ };
20
+ export {
21
+ ai_client_default as default
22
+ };
23
+ //# sourceMappingURL=ai-client-2GBZRHBA.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/ai-client.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes, type PluginsContext } from '@dxos/app-framework';\nimport { AIServiceClientImpl } from '@dxos/assistant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { AutomationCapabilities } from './capabilities';\n\n// TODO(wittjosiah): Factor out.\nconst DEFAULT_AI_SERVICE_URL = 'http://localhost:8788';\n\nexport default (context: PluginsContext) => {\n const client = context.requestCapability(ClientCapabilities.Client);\n const endpoint = client.config.values.runtime?.app?.env?.DX_AI_SERVICE_URL ?? DEFAULT_AI_SERVICE_URL;\n const aiClient = new AIServiceClientImpl({ endpoint });\n return contributes(AutomationCapabilities.AiClient, aiClient);\n};\n"],
5
+ "mappings": ";;;;;;;AAIA,SAASA,mBAAwC;AACjD,SAASC,2BAA2B;AACpC,SAASC,0BAA0B;AAKnC,IAAMC,yBAAyB;AAE/B,IAAA,oBAAe,CAACC,YAAAA;AACd,QAAMC,SAASD,QAAQE,kBAAkBC,mBAAmBC,MAAM;AAClE,QAAMC,WAAWJ,OAAOK,OAAOC,OAAOC,SAASC,KAAKC,KAAKC,qBAAqBZ;AAC9E,QAAMa,WAAW,IAAIC,oBAAoB;IAAER;EAAS,CAAA;AACpD,SAAOS,YAAYC,uBAAuBC,UAAUJ,QAAAA;AACtD;",
6
+ "names": ["contributes", "AIServiceClientImpl", "ClientCapabilities", "DEFAULT_AI_SERVICE_URL", "context", "client", "requestCapability", "ClientCapabilities", "Client", "endpoint", "config", "values", "runtime", "app", "env", "DX_AI_SERVICE_URL", "aiClient", "AIServiceClientImpl", "contributes", "AutomationCapabilities", "AiClient"]
7
+ }