@dxos/plugin-automation 0.7.5-labs.f5080a1 → 0.7.5-labs.ff2ff30

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 (176) hide show
  1. package/dist/lib/browser/AutomationPanel-VW2XIUPU.mjs +8 -0
  2. package/dist/lib/browser/ChatContainer-5TAVTN3T.mjs +12 -0
  3. package/dist/lib/browser/{ai-client-UJLNYP7B.mjs → ai-client-5CNY6JBF.mjs} +3 -3
  4. package/dist/lib/browser/{app-graph-builder-3H5TCRG4.mjs → app-graph-builder-FZGK55G7.mjs} +39 -4
  5. package/dist/lib/browser/app-graph-builder-FZGK55G7.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-BQHXJZ4K.mjs → chunk-2H2EUYXL.mjs} +2 -2
  7. package/dist/lib/browser/{chunk-DL7XA62G.mjs → chunk-DVE33EZL.mjs} +224 -153
  8. package/dist/lib/browser/{chunk-DL7XA62G.mjs.map → chunk-DVE33EZL.mjs.map} +4 -4
  9. package/dist/lib/browser/{chunk-PQGFC2ZO.mjs → chunk-MJK7GL5P.mjs} +61 -38
  10. package/dist/lib/browser/chunk-MJK7GL5P.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-Z54KIF6H.mjs → chunk-NQFZ6XRX.mjs} +3 -2
  12. package/dist/lib/browser/{chunk-Z54KIF6H.mjs.map → chunk-NQFZ6XRX.mjs.map} +2 -2
  13. package/dist/lib/browser/{chunk-43WRHV2L.mjs → chunk-Q4IMHYGH.mjs} +2 -2
  14. package/dist/lib/browser/{chunk-DQ7ZSYJJ.mjs → chunk-R4JH4TLE.mjs} +3 -1
  15. package/dist/lib/browser/chunk-R4JH4TLE.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +16 -11
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/{intent-resolver-5YVZJFS3.mjs → intent-resolver-BWAXKT27.mjs} +3 -3
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-WRHRCEV5.mjs → react-surface-ILBDBZCN.mjs} +15 -7
  21. package/dist/lib/browser/react-surface-ILBDBZCN.mjs.map +7 -0
  22. package/dist/lib/browser/types/index.mjs +2 -2
  23. package/dist/lib/node/{AutomationPanel-CO26O75P.cjs → AutomationPanel-G6EDDYWW.cjs} +7 -7
  24. package/dist/lib/node/{AutomationPanel-CO26O75P.cjs.map → AutomationPanel-G6EDDYWW.cjs.map} +2 -2
  25. package/dist/lib/node/{ChatContainer-5URBEXQD.cjs → ChatContainer-EN24W3K4.cjs} +10 -10
  26. package/dist/lib/node/ChatContainer-EN24W3K4.cjs.map +7 -0
  27. package/dist/lib/node/{ai-client-AOB6TLNW.cjs → ai-client-FKLPDELV.cjs} +7 -7
  28. package/dist/lib/node/{app-graph-builder-CDEQJEHY.cjs → app-graph-builder-T76NYV42.cjs} +48 -14
  29. package/dist/lib/node/app-graph-builder-T76NYV42.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-NH7STAX6.cjs → chunk-CJGJXNY3.cjs} +245 -174
  31. package/dist/lib/node/chunk-CJGJXNY3.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-TQEDPRY5.cjs → chunk-EQYHOTGG.cjs} +7 -4
  33. package/dist/lib/node/chunk-EQYHOTGG.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-H3RSMGJG.cjs → chunk-GB7245FH.cjs} +6 -6
  35. package/dist/lib/node/{chunk-D2QQXWOY.cjs → chunk-HMBKP6VG.cjs} +80 -58
  36. package/dist/lib/node/chunk-HMBKP6VG.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-OCW5GAVZ.cjs → chunk-QXIHYOMF.cjs} +8 -7
  38. package/dist/lib/node/{chunk-OCW5GAVZ.cjs.map → chunk-QXIHYOMF.cjs.map} +2 -2
  39. package/dist/lib/node/{chunk-AWZVJZ2I.cjs → chunk-U5Z7LFWB.cjs} +6 -6
  40. package/dist/lib/node/index.cjs +79 -74
  41. package/dist/lib/node/index.cjs.map +3 -3
  42. package/dist/lib/node/{intent-resolver-MJFZT5IU.cjs → intent-resolver-C6OKFVEW.cjs} +8 -8
  43. package/dist/lib/node/meta.json +1 -1
  44. package/dist/lib/node/{react-surface-HDAVE6NU.cjs → react-surface-LWDY7SQG.cjs} +23 -17
  45. package/dist/lib/node/react-surface-LWDY7SQG.cjs.map +7 -0
  46. package/dist/lib/node/types/index.cjs +11 -11
  47. package/dist/lib/node/types/index.cjs.map +1 -1
  48. package/dist/lib/node-esm/{AutomationPanel-VQZUKPK2.mjs → AutomationPanel-V3IWQAMO.mjs} +3 -3
  49. package/dist/lib/node-esm/{ChatContainer-23QIVDG5.mjs → ChatContainer-CNTY3C2D.mjs} +5 -5
  50. package/dist/lib/node-esm/{ai-client-RUCCJ7JZ.mjs → ai-client-XGNA6SJ5.mjs} +3 -3
  51. package/dist/lib/node-esm/{app-graph-builder-GR3URVNX.mjs → app-graph-builder-IJQEN7WT.mjs} +39 -4
  52. package/dist/lib/node-esm/app-graph-builder-IJQEN7WT.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-NSVQZ3EH.mjs → chunk-6HLBYDUI.mjs} +3 -2
  54. package/dist/lib/node-esm/{chunk-NSVQZ3EH.mjs.map → chunk-6HLBYDUI.mjs.map} +2 -2
  55. package/dist/lib/node-esm/{chunk-7JO77AAS.mjs → chunk-DNCXRGAF.mjs} +2 -2
  56. package/dist/lib/node-esm/{chunk-JFHI22MF.mjs → chunk-EMVA6QUT.mjs} +3 -1
  57. package/dist/lib/node-esm/chunk-EMVA6QUT.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-LSSWQIQD.mjs → chunk-IJRTDSKN.mjs} +2 -2
  59. package/dist/lib/node-esm/{chunk-JJFWFS6P.mjs → chunk-QP47VJT6.mjs} +224 -153
  60. package/dist/lib/node-esm/{chunk-JJFWFS6P.mjs.map → chunk-QP47VJT6.mjs.map} +4 -4
  61. package/dist/lib/node-esm/{chunk-VN2AFV25.mjs → chunk-ZLIAMW45.mjs} +61 -38
  62. package/dist/lib/node-esm/chunk-ZLIAMW45.mjs.map +7 -0
  63. package/dist/lib/node-esm/index.mjs +16 -11
  64. package/dist/lib/node-esm/index.mjs.map +3 -3
  65. package/dist/lib/node-esm/{intent-resolver-FCKNRTKQ.mjs → intent-resolver-DCP4ZDBA.mjs} +3 -3
  66. package/dist/lib/node-esm/meta.json +1 -1
  67. package/dist/lib/node-esm/{react-surface-FZ5OFRDE.mjs → react-surface-SBDXFVIN.mjs} +15 -7
  68. package/dist/lib/node-esm/react-surface-SBDXFVIN.mjs.map +7 -0
  69. package/dist/lib/node-esm/types/index.mjs +2 -2
  70. package/dist/types/src/capabilities/app-graph-builder.d.ts +23 -22
  71. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  73. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts +3 -0
  74. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts.map +1 -0
  75. package/dist/types/src/components/AmbientChatDialog/index.d.ts +2 -0
  76. package/dist/types/src/components/AmbientChatDialog/index.d.ts.map +1 -0
  77. package/dist/types/src/components/Box/StatusLine.d.ts.map +1 -0
  78. package/dist/types/src/components/Box/StatusLine.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/Box/Tabbed.d.ts +15 -0
  80. package/dist/types/src/components/Box/Tabbed.d.ts.map +1 -0
  81. package/dist/types/src/components/Box/Tabbed.stories.d.ts.map +1 -0
  82. package/dist/types/src/components/{Thread → Box}/ToggleContainer.d.ts +3 -3
  83. package/dist/types/src/components/Box/ToggleContainer.d.ts.map +1 -0
  84. package/dist/types/src/components/Box/ToggleContainer.stories.d.ts.map +1 -0
  85. package/dist/types/src/components/Box/index.d.ts +4 -0
  86. package/dist/types/src/components/Box/index.d.ts.map +1 -0
  87. package/dist/types/src/components/Prompt/Prompt.d.ts +7 -0
  88. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -0
  89. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +8 -0
  90. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -0
  91. package/dist/types/src/components/Prompt/index.d.ts +2 -0
  92. package/dist/types/src/components/Prompt/index.d.ts.map +1 -0
  93. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts +20 -0
  94. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts.map +1 -0
  95. package/dist/types/src/components/Thread/Thread.stories.d.ts +1 -0
  96. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -1
  97. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  98. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  99. package/dist/types/src/components/index.d.ts +1 -0
  100. package/dist/types/src/components/index.d.ts.map +1 -1
  101. package/dist/types/src/meta.d.ts +1 -0
  102. package/dist/types/src/meta.d.ts.map +1 -1
  103. package/dist/types/src/translations.d.ts +3 -0
  104. package/dist/types/src/translations.d.ts.map +1 -1
  105. package/package.json +52 -50
  106. package/src/AutomationPlugin.tsx +5 -5
  107. package/src/capabilities/app-graph-builder.ts +34 -3
  108. package/src/capabilities/react-surface.tsx +8 -2
  109. package/src/components/AmbientChatDialog/AmbientChatDialog.tsx +26 -0
  110. package/src/components/AmbientChatDialog/index.ts +5 -0
  111. package/src/components/{Thread → Box}/Tabbed.stories.tsx +1 -2
  112. package/src/components/Box/Tabbed.tsx +89 -0
  113. package/src/components/{Thread → Box}/ToggleContainer.stories.tsx +0 -1
  114. package/src/components/{Thread → Box}/ToggleContainer.tsx +28 -23
  115. package/src/components/Box/index.ts +7 -0
  116. package/src/components/Prompt/Prompt.stories.tsx +50 -0
  117. package/src/components/Prompt/Prompt.tsx +36 -0
  118. package/src/components/Prompt/index.ts +5 -0
  119. package/src/components/Prompt/prompt-autocomplete.ts +200 -0
  120. package/src/components/PromptEditor/PromptEditor.stories.tsx +3 -3
  121. package/src/components/Thread/Thread.stories.tsx +8 -1
  122. package/src/components/Thread/Thread.tsx +1 -1
  123. package/src/components/Thread/ThreadMessage.tsx +41 -19
  124. package/src/components/TriggerEditor/TriggerEditor.tsx +6 -1
  125. package/src/components/index.ts +1 -0
  126. package/src/meta.ts +2 -0
  127. package/src/translations.ts +1 -0
  128. package/dist/lib/browser/AutomationPanel-YPD3AGQN.mjs +0 -8
  129. package/dist/lib/browser/ChatContainer-ODZECATM.mjs +0 -12
  130. package/dist/lib/browser/app-graph-builder-3H5TCRG4.mjs.map +0 -7
  131. package/dist/lib/browser/chunk-DQ7ZSYJJ.mjs.map +0 -7
  132. package/dist/lib/browser/chunk-PQGFC2ZO.mjs.map +0 -7
  133. package/dist/lib/browser/react-surface-WRHRCEV5.mjs.map +0 -7
  134. package/dist/lib/node/ChatContainer-5URBEXQD.cjs.map +0 -7
  135. package/dist/lib/node/app-graph-builder-CDEQJEHY.cjs.map +0 -7
  136. package/dist/lib/node/chunk-D2QQXWOY.cjs.map +0 -7
  137. package/dist/lib/node/chunk-NH7STAX6.cjs.map +0 -7
  138. package/dist/lib/node/chunk-TQEDPRY5.cjs.map +0 -7
  139. package/dist/lib/node/react-surface-HDAVE6NU.cjs.map +0 -7
  140. package/dist/lib/node-esm/app-graph-builder-GR3URVNX.mjs.map +0 -7
  141. package/dist/lib/node-esm/chunk-JFHI22MF.mjs.map +0 -7
  142. package/dist/lib/node-esm/chunk-VN2AFV25.mjs.map +0 -7
  143. package/dist/lib/node-esm/react-surface-FZ5OFRDE.mjs.map +0 -7
  144. package/dist/types/src/components/Thread/ScrollContainer.d.ts +0 -15
  145. package/dist/types/src/components/Thread/ScrollContainer.d.ts.map +0 -1
  146. package/dist/types/src/components/Thread/StatusLine.d.ts.map +0 -1
  147. package/dist/types/src/components/Thread/StatusLine.stories.d.ts.map +0 -1
  148. package/dist/types/src/components/Thread/Tabbed.d.ts +0 -9
  149. package/dist/types/src/components/Thread/Tabbed.d.ts.map +0 -1
  150. package/dist/types/src/components/Thread/Tabbed.stories.d.ts.map +0 -1
  151. package/dist/types/src/components/Thread/ToggleContainer.d.ts.map +0 -1
  152. package/dist/types/src/components/Thread/ToggleContainer.stories.d.ts.map +0 -1
  153. package/src/components/Thread/ScrollContainer.tsx +0 -92
  154. package/src/components/Thread/Tabbed.tsx +0 -72
  155. /package/dist/lib/browser/{AutomationPanel-YPD3AGQN.mjs.map → AutomationPanel-VW2XIUPU.mjs.map} +0 -0
  156. /package/dist/lib/browser/{ChatContainer-ODZECATM.mjs.map → ChatContainer-5TAVTN3T.mjs.map} +0 -0
  157. /package/dist/lib/browser/{ai-client-UJLNYP7B.mjs.map → ai-client-5CNY6JBF.mjs.map} +0 -0
  158. /package/dist/lib/browser/{chunk-BQHXJZ4K.mjs.map → chunk-2H2EUYXL.mjs.map} +0 -0
  159. /package/dist/lib/browser/{chunk-43WRHV2L.mjs.map → chunk-Q4IMHYGH.mjs.map} +0 -0
  160. /package/dist/lib/browser/{intent-resolver-5YVZJFS3.mjs.map → intent-resolver-BWAXKT27.mjs.map} +0 -0
  161. /package/dist/lib/node/{ai-client-AOB6TLNW.cjs.map → ai-client-FKLPDELV.cjs.map} +0 -0
  162. /package/dist/lib/node/{chunk-H3RSMGJG.cjs.map → chunk-GB7245FH.cjs.map} +0 -0
  163. /package/dist/lib/node/{chunk-AWZVJZ2I.cjs.map → chunk-U5Z7LFWB.cjs.map} +0 -0
  164. /package/dist/lib/node/{intent-resolver-MJFZT5IU.cjs.map → intent-resolver-C6OKFVEW.cjs.map} +0 -0
  165. /package/dist/lib/node-esm/{AutomationPanel-VQZUKPK2.mjs.map → AutomationPanel-V3IWQAMO.mjs.map} +0 -0
  166. /package/dist/lib/node-esm/{ChatContainer-23QIVDG5.mjs.map → ChatContainer-CNTY3C2D.mjs.map} +0 -0
  167. /package/dist/lib/node-esm/{ai-client-RUCCJ7JZ.mjs.map → ai-client-XGNA6SJ5.mjs.map} +0 -0
  168. /package/dist/lib/node-esm/{chunk-7JO77AAS.mjs.map → chunk-DNCXRGAF.mjs.map} +0 -0
  169. /package/dist/lib/node-esm/{chunk-LSSWQIQD.mjs.map → chunk-IJRTDSKN.mjs.map} +0 -0
  170. /package/dist/lib/node-esm/{intent-resolver-FCKNRTKQ.mjs.map → intent-resolver-DCP4ZDBA.mjs.map} +0 -0
  171. /package/dist/types/src/components/{Thread → Box}/StatusLine.d.ts +0 -0
  172. /package/dist/types/src/components/{Thread → Box}/StatusLine.stories.d.ts +0 -0
  173. /package/dist/types/src/components/{Thread → Box}/Tabbed.stories.d.ts +0 -0
  174. /package/dist/types/src/components/{Thread → Box}/ToggleContainer.stories.d.ts +0 -0
  175. /package/src/components/{Thread → Box}/StatusLine.stories.tsx +0 -0
  176. /package/src/components/{Thread → Box}/StatusLine.tsx +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ChatContainer/ChatContainer.tsx", "../../../src/hooks/processor.ts", "../../../src/hooks/useChatProcessor.tsx", "../../../src/capabilities/index.ts", "../../../src/tools/function.ts", "../../../src/tools/openapi.ts", "../../../src/hooks/useLocalTriggerManager.ts", "../../../src/hooks/invocation-handler.ts", "../../../src/hooks/useMessageQueue.ts", "../../../src/hooks/useServices.ts", "../../../src/testing/test-functions.ts", "../../../src/testing/test-services.ts", "../../../src/components/Thread/Thread.tsx", "../../../src/components/Thread/ThreadMessage.tsx", "../../../src/components/Box/StatusLine.tsx", "../../../src/components/Box/Tabbed.tsx", "../../../src/components/Box/ToggleContainer.tsx", "../../../src/components/MarkdownViewer/MarkdownViewer.tsx", "../../../src/components/ChatContainer/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { useChatProcessor, useMessageQueue } from '../../hooks';\nimport { type AIChatType } from '../../types';\nimport { Thread } from '../Thread';\n\nexport const ChatContainer = ({ chat, role }: { chat: AIChatType; role: string }) => {\n const processor = useChatProcessor(chat);\n const messageQueue = useMessageQueue(chat);\n const messages = [...(messageQueue?.items ?? []), ...processor.messages.value];\n\n const handleSubmit = useCallback(\n async (text: string) => {\n if (processor.streaming.value) {\n await processor.cancel();\n }\n\n invariant(messageQueue);\n await processor.request(text, {\n history: messageQueue.items,\n onComplete: (messages) => messageQueue.append(messages),\n });\n },\n [processor, messageQueue],\n );\n\n const handleStop = useCallback(() => {\n if (processor.streaming.value) {\n void processor.cancel();\n }\n }, [processor]);\n\n return (\n <StackItem.Content toolbar={false} role={role}>\n <Thread\n messages={messages}\n streaming={processor.streaming.value}\n collapse={true}\n onSubmit={handleSubmit}\n onSuggest={handleSubmit}\n onStop={handleStop}\n />\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Signal, batch, computed, signal } from '@preact/signals-core';\n\nimport { type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { type Tool, Message, type MessageContentBlock } from '@dxos/artifact';\nimport {\n isToolUse,\n runTools,\n type AIServiceClientImpl,\n type GenerateRequest,\n type GenerationStream,\n MixedStreamParser,\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\n// TODO(burdon): Factor out.\ndeclare global {\n interface ToolContextExtensions {\n space?: Space;\n dispatch?: PromiseIntentDispatcher;\n }\n}\n\ntype RequestOptions = {\n history?: Message[];\n onComplete?: (messages: Message[]) => void;\n};\n\nexport type ChatProcessorOptions = Pick<GenerateRequest, 'model' | 'systemPrompt'>;\n\nconst defaultOptions: ChatProcessorOptions = {\n model: '@anthropic/claude-3-5-sonnet-20241022',\n systemPrompt: 'you are a helpful assistant',\n};\n\n/**\n * Handles interactions with the AI service.\n * Maintains a queue of messages and handles streaming responses from the AI service.\n * Executes tools based on AI responses.\n * Supports cancellation of in-progress requests.\n */\nexport class ChatProcessor {\n /** SSE stream parser. */\n private readonly _parser = new MixedStreamParser();\n\n /** Current streaming response (iterator). */\n private _stream: GenerationStream | undefined;\n\n /** Pending messages (incl. the user request). */\n private readonly _pending: Signal<Message[]> = signal([]);\n\n /** Current streaming block (from the AI service). */\n private readonly _block: Signal<MessageContentBlock | undefined> = signal(undefined);\n\n /** Prior history from queue. */\n private _history: Message[] = [];\n\n /**\n * Streaming state.\n * @reactive\n */\n public readonly streaming: Signal<boolean> = computed(() => this._block.value !== undefined);\n\n /**\n * Array of Messages (incl. the current message being streamed).\n * @reactive\n */\n public readonly messages: Signal<Message[]> = computed(() => {\n const messages = [...this._pending.value];\n if (this._block.value) {\n const current = messages.pop();\n invariant(current);\n const { content, ...rest } = current;\n const message = { ...rest, content: [...content, this._block.value] };\n messages.push(message);\n }\n\n return messages;\n });\n\n constructor(\n private readonly _client: AIServiceClientImpl,\n private _tools?: Tool[],\n private readonly _extensions?: ToolContextExtensions,\n private readonly _options: ChatProcessorOptions = defaultOptions,\n ) {\n // Message complete.\n this._parser.message.on((message) => {\n batch(() => {\n this._pending.value = [...this._pending.value, message];\n this._block.value = undefined;\n });\n });\n\n // Streaming update (happens before message complete).\n this._parser.update.on((block) => {\n batch(() => {\n this._block.value = block;\n });\n });\n }\n\n /**\n * Update tools.\n */\n setTools(tools: Tool[]) {\n this._tools = tools;\n }\n\n /**\n * Make GPT request.\n */\n async request(message: string, options: RequestOptions = {}): Promise<Message[]> {\n batch(() => {\n this._history = options.history ?? [];\n this._pending.value = [\n createStatic(Message, {\n role: 'user',\n content: [{ type: 'text', text: message }],\n }),\n ];\n this._block.value = undefined;\n });\n\n await this._generate();\n options.onComplete?.(this._pending.value);\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._stream?.abort();\n return this._reset();\n }\n\n private async _reset(): Promise<Message[]> {\n const messages = this._pending.value;\n batch(() => {\n this._history = [];\n this._pending.value = [];\n this._block.value = undefined;\n });\n\n return messages;\n }\n\n /**\n * Generate a response from the AI service.\n * Iterates over tool requests.\n */\n private async _generate() {\n try {\n let more = false;\n do {\n log.info('requesting...', { history: this._history.length, messages: this._pending.value.length });\n this._stream = 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 // Wait until complete.\n await this._parser.parse(this._stream);\n await this._stream.complete();\n\n // Add messages.\n log.info('response', { messages: this._pending.value });\n\n // Resolve tool use locally.\n more = false;\n const message = this._pending.value.at(-1);\n invariant(message);\n if (isToolUse(message)) {\n log.info('tool request...');\n const response = await runTools({\n message: this._pending.value.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 = [...this._pending.value, 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._stream = undefined;\n }\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';\nimport { createSystemPrompt, type Tool } from '@dxos/artifact';\nimport { FunctionType } from '@dxos/functions';\nimport { useConfig } from '@dxos/react-client';\nimport { Filter, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { isNotNullOrUndefined } from '@dxos/util';\n\nimport { AutomationCapabilities } from '../capabilities';\nimport { ChatProcessor } from '../hooks';\nimport { covertFunctionToTool, createToolsFromService } from '../tools';\nimport { ServiceType, type AIChatType } from '../types';\n\n/**\n * Creates a processor for the chat.\n */\nexport const useChatProcessor = (chat: AIChatType) => {\n const aiClient = useCapability(AutomationCapabilities.AiClient);\n const globalTools = useCapabilities(Capabilities.Tools);\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const space = getSpace(chat);\n\n // Services.\n const services = useQuery(space, Filter.schema(ServiceType));\n const [serviceTools, setServiceTools] = useState<Tool[]>([]);\n useEffect(() => {\n queueMicrotask(async () => {\n const tools = await Promise.all(services.map((service) => createToolsFromService(service)));\n setServiceTools(tools.flat());\n });\n }, [services]);\n\n // Tools.\n const config = useConfig();\n const functions = useQuery(space, Filter.schema(FunctionType));\n const tools = useMemo(\n () => [\n ...globalTools.flat(),\n ...artifactDefinitions.flatMap((definition) => definition.tools),\n ...serviceTools,\n ...functions\n .map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))\n .filter(isNotNullOrUndefined),\n ],\n [globalTools, artifactDefinitions, serviceTools, functions, space?.id],\n );\n\n // Prompt.\n const systemPrompt = useMemo(\n () => createSystemPrompt({ artifacts: artifactDefinitions.map((definition) => definition.instructions) }),\n [artifactDefinitions],\n );\n\n // Create processor.\n const processor = useMemo(\n () =>\n new ChatProcessor(\n aiClient,\n tools,\n {\n space,\n dispatch,\n },\n {\n model: '@anthropic/claude-3-5-sonnet-20241022',\n systemPrompt,\n },\n ),\n [aiClient, tools, space, dispatch, systemPrompt],\n );\n\n // Update processor.\n // useEffect(() => {\n // if (processor) {\n // processor.setTools(tools.flat());\n // }\n // }, [processor, tools]);\n\n return processor;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AiClient = lazy(() => import('./ai-client'));\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\n\nexport * from './capabilities';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineTool, ToolResult } from '@dxos/artifact';\nimport type { Tool } from '@dxos/artifact';\nimport { toEffectSchema } from '@dxos/echo-schema';\nimport { getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions';\nimport type { FunctionType } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport type { SpaceId } from '@dxos/react-client/echo';\nimport { getMeta } from '@dxos/react-client/echo';\n\nexport const covertFunctionToTool = (\n fn: FunctionType,\n edgeUrl: string,\n spaceId?: SpaceId | undefined,\n): Tool | undefined => {\n if (!fn.description || !fn.inputSchema) {\n return undefined;\n }\n\n const existingFunctionUrl = getUserFunctionUrlInMetadata(getMeta(fn));\n if (!existingFunctionUrl) {\n return undefined;\n }\n const url = getInvocationUrl(existingFunctionUrl, edgeUrl, {\n spaceId,\n });\n\n return defineTool({\n name: fn.name,\n description: fn.description,\n schema: toEffectSchema(fn.inputSchema),\n execute: async (input) => {\n log.info('execute function tool', { name: fn.name, url, input });\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input),\n });\n return ToolResult.Success(await response.text());\n },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport jsonpointer from 'jsonpointer';\nimport { type OpenAPIV2, type OpenAPIV3_1 } from 'openapi-types';\n\nimport { ToolResult, type Tool } from '@dxos/artifact';\nimport { JsonSchemaType, normalizeSchema, S, toEffectSchema } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { deepMapValues } from '@dxos/util';\n\nimport type { ApiAuthorization, ServiceType } from '../types';\n\nexport type CreateToolsFromApiOptions = {\n authorization?: ApiAuthorization;\n instructions?: string;\n};\n\nexport const createToolsFromService = async (service: ServiceType): Promise<Tool[]> => {\n invariant(service.interfaces?.length === 1 && service.interfaces[0].kind === 'api');\n const iface = service.interfaces[0];\n invariant(iface.schemaUrl);\n invariant(iface.schemaUrl);\n return createToolsFromApi(iface.schemaUrl, { authorization: iface.authorization });\n};\n\nexport const createToolsFromApi = async (url: string, options?: CreateToolsFromApiOptions): Promise<Tool[]> => {\n const res = await fetch(url);\n const spec = (await res.json()) as OpenAPIV2.Document;\n log('spec', { spec });\n\n const tools: Tool[] = [];\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n if (typeof pathItem !== 'object') {\n continue;\n }\n\n // TODO(burdon): ???\n const { ...methods } = pathItem;\n for (const [method, m] of Object.entries(methods)) {\n const methodItem: OpenAPIV2.OperationObject = m as OpenAPIV2.OperationObject;\n log('methodItem', { path, method, methodItem });\n\n const parametersResolved: OpenAPIV2.ParameterObject[] =\n methodItem.parameters?.map((parameter: any) => {\n const resolved = resolveJsonSchema(parameter, spec);\n return resolved;\n }) ?? [];\n\n const inputSchema: JsonSchemaType = {\n type: 'object',\n properties: {},\n };\n\n const endpointParameters: OpenAPIV2.ParameterObject[] = [];\n for (const parameter of parametersResolved) {\n log('parameter', { parameter });\n\n if (\n options?.authorization?.type === 'api-key' &&\n options.authorization.placement.type === 'query' &&\n parameter.in === 'query' &&\n parameter.name === options.authorization.placement.name\n ) {\n continue;\n }\n\n endpointParameters.push(parameter);\n\n if (parameter.schema) {\n inputSchema.properties![parameter.name] = normalizeSchema(parameter.schema);\n } else if (typeof parameter.type === 'string') {\n const { name, in: _in, required, ...schema } = parameter;\n inputSchema.properties![name] = normalizeSchema(schema);\n if (required) {\n inputSchema.required ??= [];\n inputSchema.required!.push(name);\n }\n }\n }\n\n log('inputSchema', { inputSchema });\n S.validateSync(JsonSchemaType)(inputSchema);\n\n const description = methodItem.description ?? methodItem.summary;\n if (!description) {\n log.warn('no description', { path, method });\n continue;\n }\n\n const endpoint: EndpointDescriptor = {\n document: spec,\n path,\n method,\n parameters: endpointParameters,\n authorization: options?.authorization,\n };\n\n tools.push({\n name: getToolName(path, method, methodItem),\n description: options?.instructions ? `${options.instructions}\\n\\n${description}` : description,\n parameters: inputSchema,\n execute: async (input) => {\n const response = await callApiEndpoint(endpoint, input);\n return ToolResult.Success(response);\n },\n });\n }\n }\n\n return tools;\n};\n\nconst getToolName = (path: string, method: string, methodItem: OpenAPIV2.OperationObject) => {\n if (methodItem.operationId) {\n return methodItem.operationId;\n }\n\n // Generate a name from the path and method.\n let name = `${method.toLowerCase()}_${path.replaceAll(/[{}/]/g, '_')}`;\n while (name.length > MAX_TOOL_NAME_LENGTH) {\n const lengthBefore = name.length;\n\n for (const word of GENERIC_WORDS) {\n if (name.includes(word)) {\n name = name.replace(word, '');\n break;\n }\n }\n name = name.replaceAll('__', '_').replace(/_$/, '');\n\n const lengthAfter = name.length;\n if (lengthBefore === lengthAfter) {\n break;\n }\n }\n name = name.replaceAll('__', '_').replace(/_$/, '').replace(/^_/, '');\n\n return name.slice(0, MAX_TOOL_NAME_LENGTH);\n};\n\nconst MAX_TOOL_NAME_LENGTH = 64;\nconst GENERIC_WORDS = [\n 'services',\n 'service',\n 'api',\n 'rest',\n 'endpoint',\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n 'head',\n 'options',\n 'trace',\n 'service',\n 'api',\n 'endpoint',\n];\n\ntype EndpointDescriptor = {\n document: OpenAPIV3_1.Document | OpenAPIV2.Document;\n path: string;\n method: string;\n parameters: OpenAPIV2.ParameterObject[];\n authorization?: ApiAuthorization;\n};\n\nconst callApiEndpoint = async (endpoint: EndpointDescriptor, input: any) => {\n log.info('endpoint', { method: endpoint.method, name: endpoint.path, input });\n\n let url = getEndpointUrl(endpoint);\n const request: RequestInit = {\n method: endpoint.method,\n headers: {},\n };\n const query = new URLSearchParams();\n let body: any;\n for (const parameter of endpoint.parameters) {\n if (input[parameter.name] === undefined) {\n continue;\n }\n\n switch (parameter.in) {\n case 'header': {\n if (parameter.example) {\n (request.headers as any)[parameter.name] = parameter.default;\n }\n break;\n }\n case 'path': {\n url = url.replace(`{${parameter.name}}`, encodeURIComponent(input[parameter.name]));\n break;\n }\n case 'body': {\n const value = input[parameter.name];\n\n // Client-side validation\n const effectSchema = toEffectSchema(parameter.schema);\n S.validateSync(effectSchema)(value);\n\n if (body) {\n throw new Error(`Duplicate body parameter: ${parameter.name}`);\n }\n body = value;\n break;\n }\n case 'query': {\n query.set(parameter.name, input[parameter.name]);\n break;\n }\n }\n }\n\n if (\n (endpoint.authorization?.type === 'api-key' && endpoint.authorization.placement.type === 'authorization-header') ||\n endpoint.authorization?.type === 'oauth'\n ) {\n (request.headers as any).Authorization = await resolveAuthorization(endpoint.authorization);\n } else if (endpoint.authorization?.type === 'api-key' && endpoint.authorization.placement.type === 'query') {\n query.set(endpoint.authorization.placement.name, endpoint.authorization.key);\n }\n\n if (query.size > 0) {\n url += `?${query.toString()}`;\n }\n\n if (body) {\n request.body = JSON.stringify(body);\n (request.headers as any)['Content-Type'] = 'application/json';\n }\n\n log.info('request', { url, request });\n const response = await fetch(url, request);\n\n log.info('response', { ok: response.ok, status: response.status, statusText: response.statusText });\n\n if (response.ok) {\n const contentType = response.headers.get('Content-Type');\n if (contentType?.includes('application/json')) {\n return await response.json();\n } else {\n return await response.text();\n }\n } else {\n if (response.headers.get('Content-Type')?.includes('application/json')) {\n const responseBody = await response.text();\n let error: any;\n try {\n error = JSON.parse(responseBody);\n } catch {\n error = responseBody;\n }\n log.error('error', { error });\n throw new Error(error.message);\n } else {\n const error = await response.text();\n log.error('error', { error });\n throw new Error(error);\n }\n }\n};\n\nconst getEndpointUrl = (endpoint: EndpointDescriptor) => {\n let url = '';\n if (isV3_1(endpoint.document) && endpoint.document.servers && endpoint.document.servers.length > 0) {\n url = endpoint.document.servers[0].url;\n } else {\n invariant(!isV3_1(endpoint.document));\n url = `${endpoint.document.schemes?.[0] ?? 'https'}://${endpoint.document.host}`;\n }\n\n if (!isV3_1(endpoint.document) && endpoint.document.basePath) {\n url += endpoint.document.basePath;\n }\n\n url += endpoint.path;\n\n return url;\n};\n\nexport const resolveAuthorization = async (authorization: ApiAuthorization): Promise<string> => {\n switch (authorization.type) {\n case 'api-key': {\n invariant(authorization.placement.type === 'authorization-header');\n return `Bearer ${authorization.key}`;\n }\n case 'oauth': {\n const response = await fetch(authorization.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: `grant_type=${authorization.grantType}&client_id=${authorization.clientId}&client_secret=${authorization.clientSecret}`,\n });\n const data = await response.json();\n return `Bearer ${data.access_token}`;\n }\n default: {\n throw new Error(`Unknown authorization type: ${(authorization as any).type}`);\n }\n }\n};\n\n/**\n * Resolves all $ref properties in a JSON schema.\n * Doesn't assume the structure of the schema.\n * The function looks from $ref properties in the schema and resolves them to their values in the base object.\n */\nconst resolveJsonSchema = (schema: any, base: any) => {\n return deepMapValues(schema, (value, recurse) => {\n if (typeof value === 'object' && value !== null && '$ref' in value && typeof value.$ref === 'string') {\n if (value.$ref.startsWith('#')) {\n const resolved = jsonpointer.get(base, value.$ref.slice(1));\n if (resolved) {\n return recurse(resolved);\n } else {\n log.warn('unresolved', { ref: value.$ref, base });\n }\n }\n }\n return recurse(value);\n });\n};\n\nconst isV3_1 = (document: OpenAPIV3_1.Document | OpenAPIV2.Document): document is OpenAPIV3_1.Document => {\n return (document as any).openapi === '3.0.1';\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", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { 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';\n\nimport { type AIChatType } from '../types';\n\nexport const useMessageQueue = (chat: AIChatType) => {\n const edgeClient = useEdgeClient();\n const space = getSpace(chat);\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\n return useQueue<Message>(edgeClient, queueDxn);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { type Space } from '@dxos/client/echo';\n\nimport { MockServiceRegistry } from '../testing';\nimport { type ServiceType, type ServiceQuery } from '../types';\n\n/**\n * Retrieves matching services from the registry.\n */\nexport const useServices = (space: Space, query?: ServiceQuery): ServiceType[] => {\n const registry = useMemo(() => new MockServiceRegistry(), []);\n const [services, setServices] = useState<ServiceType[]>([]);\n useEffect(() => {\n const t = setTimeout(async () => {\n const services = await registry.queryServices(query);\n setServices(services);\n });\n\n return () => clearTimeout(t);\n }, [query, registry]);\n\n return services;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createSystemPrompt } from '@dxos/artifact';\nimport { type GenerateRequest } from '@dxos/assistant';\nimport { AST, S, toJsonSchema } from '@dxos/echo-schema';\n\nexport const createProcessorOptions = (artifacts: string[]): Pick<GenerateRequest, 'model' | 'systemPrompt'> => ({\n model: '@anthropic/claude-3-5-sonnet-20241022',\n systemPrompt: createSystemPrompt({ artifacts }),\n});\n\nexport const functions = [\n {\n name: 'example.com/function/chess',\n version: '0.1.0',\n inputSchema: toJsonSchema(\n S.Struct({\n level: S.Number.annotations({\n [AST.TitleAnnotationId]: 'Level',\n }),\n }),\n ),\n },\n {\n name: 'example.com/function/forex',\n version: '0.1.0',\n binding: 'FOREX',\n inputSchema: toJsonSchema(\n S.Struct({\n from: S.String.annotations({\n [AST.TitleAnnotationId]: 'Currency from',\n }),\n to: S.String.annotations({\n [AST.TitleAnnotationId]: 'Currency to',\n }),\n }),\n ),\n },\n];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createStatic } from '@dxos/echo-schema';\n\nimport {\n type ApiAuthorization,\n type BaseServiceRegistry,\n type ServiceQuery,\n ServiceType,\n categoryIcons,\n} from '../types';\n\nexport class MockServiceRegistry implements BaseServiceRegistry {\n async queryServices(query?: ServiceQuery): Promise<ServiceType[]> {\n return TEST_SERVICES;\n }\n}\n\n// TODO(burdon): Can we generalize credentials?\n\nconst AMADEUS_AUTH: ApiAuthorization = {\n type: 'oauth',\n clientId: 'BOEnpLd1sMyKjAPGKYeAPFFy60u53QEG',\n clientSecret: 'n4qldSN7usvD57gm',\n tokenUrl: 'https://test.api.amadeus.com/v1/security/oauth2/token',\n grantType: 'client_credentials',\n};\n\nconst VISUAL_CROSSING_CREDENTIALS: ApiAuthorization = {\n type: 'api-key',\n key: 'FDPRVS953KB4GQQLD25GRT975',\n placement: {\n type: 'query',\n name: 'key',\n },\n};\n\n// Registries:\n// - https://apis.guru\n// - https://rapidapi.com\n// - https://github.com/konfig-sdks/openapi-examples\n// - https://publicapis.io/?utm_source=chatgpt.com\n\n// Examples:\n// - https://petstore.swagger.io/v2/swagger.json (testing)\n// - https://lichess.org/api\n// - https://github.com/konfig-sdks/openapi-examples/tree/main/xkcd\n// - https://api.coindesk.com/v1/bpi/currentprice.json\n// - https://www.coingecko.com/en/api/documentation\n\n// TODO(burdon): Support yaml endpoints.\n// - e.g., https://github.com/konfig-sdks/openapi-examples/blob/main/xkcd/openapi.yaml\n\nconst TEST_SERVICES: ServiceType[] = [\n createStatic(ServiceType, {\n serviceId: 'amadeus.com/service/FlightSearch',\n name: 'Amadeus Flight Search',\n description: 'Search for local and international flights.',\n category: 'travel',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/amadeus.com/amadeus-flight-availabilities-search/1.0.2/swagger.json',\n authorization: AMADEUS_AUTH,\n },\n ],\n }),\n\n createStatic(ServiceType, {\n serviceId: 'amadeus.com/service/HotelSearch',\n name: 'Amadeus Hotel Search',\n description: 'Search for local and international hotels.',\n category: 'travel',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/amadeus.com/amadeus-hotel-search/3.0.8/swagger.json',\n authorization: AMADEUS_AUTH,\n },\n ],\n }),\n\n createStatic(ServiceType, {\n serviceId: 'visualcrossing.com/service/Weather',\n name: 'Visual Crossing Weather',\n description: 'Search for global weather forecasts.',\n category: 'weather',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/openapi.json',\n authorization: VISUAL_CROSSING_CREDENTIALS,\n },\n ],\n }),\n\n // TODO(burdon): Needs auth.\n createStatic(ServiceType, {\n serviceId: 'abstractapi.com/service/GeoLocation',\n name: 'Abstract GeoLocation',\n description: 'Get the location of any IP address.',\n category: 'geolocation',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/abstractapi.com/geolocation/1.0.0/openapi.json',\n },\n ],\n }),\n\n //\n // Testing\n //\n\n ...Array.from({ length: 20 }, (_, i) =>\n createStatic(ServiceType, {\n serviceId: `example.com/service/test-${i}`,\n name: `Test ${i}`,\n description: `Test ${i}`,\n category: Object.keys(categoryIcons)[Math.floor(Math.random() * Object.keys(categoryIcons).length)],\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://petstore.swagger.io/v2/swagger.json',\n },\n ],\n }),\n ),\n] as const;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type KeyboardEventHandler, useCallback, useMemo, useRef, useState } from 'react';\n\nimport { type Message } from '@dxos/artifact';\nimport { IconButton, Input, useTranslation } from '@dxos/react-ui';\nimport { ScrollContainer, type ScrollController } from '@dxos/react-ui-components';\nimport { Spinner } from '@dxos/react-ui-sfx';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { ThreadMessage, type ThreadMessageProps } from './ThreadMessage';\nimport { AUTOMATION_PLUGIN } from '../../meta';\n\nexport type ThreadProps = {\n messages?: Message[];\n streaming?: boolean;\n onSubmit?: (message: string) => void;\n onStop?: () => void;\n} & Pick<ThreadMessageProps, 'collapse' | 'debug' | 'onSuggest' | 'onDelete'>;\n\n// TODO(burdon): Factor out scroll logic.\nexport const Thread = ({\n messages,\n streaming,\n collapse,\n debug,\n onSubmit,\n onStop,\n onSuggest,\n onDelete,\n}: ThreadProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const scroller = useRef<ScrollController>(null);\n\n const [text, setText] = useState('');\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLInputElement>>(\n (ev) => {\n switch (ev.key) {\n case 'Escape': {\n setText('');\n break;\n }\n\n case 'Enter': {\n const value = text.trim();\n if (value.length > 0) {\n scroller.current?.scrollToBottom();\n onSubmit?.(value);\n setText('');\n }\n break;\n }\n }\n },\n [text],\n );\n\n /**\n * Reduce message blocks into collections of messages that contain related contiguous blocks.\n * For example, collapse all tool request/response pairs into a single message.\n */\n // TODO(dmaretskyi): This needs to be a separate type: `id` is not a valid ObjectId, this needs to accommodate messageId for deletion.\n const { messages: lines = [] } = useMemo(() => {\n if (!collapse) {\n return { messages: messages ?? [] };\n }\n\n return (messages ?? []).reduce<{ messages: Message[]; current?: Message }>(\n ({ current, messages }, message) => {\n let i = 0;\n for (const block of message.content) {\n switch (block.type) {\n case 'tool_use':\n case 'tool_result': {\n if (current) {\n current.content.push(block);\n } else {\n current = {\n id: [message.id, i].join('_'),\n role: message.role,\n content: [block],\n };\n messages.push(current);\n }\n break;\n }\n\n case 'text':\n default: {\n current = undefined;\n messages.push({\n id: [message.id, i].join('_'),\n role: message.role,\n content: [block],\n });\n break;\n }\n }\n\n i++;\n }\n\n return { current, messages };\n },\n { messages: [] as Message[] },\n );\n }, [messages, collapse]);\n\n return (\n <div className='flex flex-col grow overflow-hidden'>\n <ScrollContainer ref={scroller} classNames='py-2 gap-2 overflow-x-hidden'>\n {lines.map((message) => (\n <ThreadMessage\n key={message.id}\n classNames='px-4'\n message={message}\n collapse={collapse}\n debug={debug}\n onSuggest={onSuggest}\n onDelete={onDelete}\n />\n ))}\n </ScrollContainer>\n\n {onSubmit && (\n <div className='flex p-4 gap-3 items-center'>\n <Spinner active={streaming} />\n <Input.Root>\n <Input.TextInput\n autoFocus\n classNames='px-2 baseSurface rounded'\n placeholder={t('chat input placeholder')}\n value={text}\n onChange={(ev) => setText(ev.target.value)}\n onKeyDown={handleKeyDown}\n />\n </Input.Root>\n {onStop && (\n <IconButton\n disabled={!streaming}\n classNames={mx('!p-1 !opacity-20 transition', streaming && '!opacity-80')}\n variant='ghost'\n size={5}\n onClick={onStop}\n icon='ph--x--regular'\n label={t('chat stop')}\n iconOnly\n />\n )}\n </div>\n )}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState, type FC } from 'react';\n\nimport { type MessageContentBlock, type Message } from '@dxos/artifact';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { Button, ButtonGroup, Icon, type ThemedClassName } from '@dxos/react-ui';\nimport { Json } from '@dxos/react-ui-syntax-highlighter';\nimport { mx } from '@dxos/react-ui-theme';\nimport { safeParseJson } from '@dxos/util';\n\nimport { ToggleContainer, StatusLine, Tabs } from '../Box';\nimport { MarkdownViewer } from '../MarkdownViewer';\n\nexport type ThreadMessageProps = ThemedClassName<{\n message: Message;\n collapse?: boolean;\n debug?: boolean;\n onSuggest?: (text: string) => void;\n onDelete?: (id: string) => void;\n}>;\n\nexport const ThreadMessage: FC<ThreadMessageProps> = ({\n classNames,\n message,\n collapse,\n debug,\n onSuggest,\n onDelete,\n}) => {\n if (typeof message !== 'object') {\n return <div className={mx(classNames)}>{message}</div>;\n }\n\n const { role, content = [] } = message;\n\n // TODO(burdon): Factor out tool blocks.\n const toolBlocks = content.filter((block) => block.type === 'tool_use' || block.type === 'tool_result');\n if (collapse && toolBlocks.length > 0) {\n let request: (MessageContentBlock & { type: 'tool_use' }) | undefined;\n const items = toolBlocks.map((block) => {\n switch (block.type) {\n case 'tool_use': {\n request = block;\n // TODO(burdon): Get plugin name.\n return { title: `Calling ${block.name}...`, block };\n }\n\n case 'tool_result': {\n if (!request) {\n log.warn('unexpected message', { block });\n return { title: 'Error', block };\n }\n\n return { title: `Processed ${request.name}`, block };\n }\n\n default: {\n request = undefined;\n return { title: 'Error', block };\n }\n }\n });\n\n return (\n <div className={mx('flex', classNames)}>\n <div className='w-full p-1 px-2 overflow-hidden rounded-md bg-baseSurface'>\n <TabbedContainer items={items} />\n </div>\n </div>\n );\n }\n\n return (\n <div className={mx('flex flex-col shrink-0 gap-2')}>\n {debug && (\n <div className='text-xs text-subdued'>\n {message.id}{' '}\n {onDelete && (\n <span className='cursor-pointer underline' onClick={() => onDelete(message.id)}>\n delete\n </span>\n )}\n </div>\n )}\n {content.map((block, idx) => (\n <div key={idx} className={mx('flex', classNames, block.type === 'text' && role === 'user' && 'justify-end')}>\n <Block role={role} block={block} onSuggest={onSuggest ?? (() => {})} />\n </div>\n ))}\n </div>\n );\n};\n\nconst Block = ({\n block,\n role,\n onSuggest,\n}: Pick<Message, 'role'> & { block: MessageContentBlock; onSuggest: (text: string) => void }) => {\n const Component = componentMap[block.type] ?? componentMap.default;\n return (\n <div\n className={mx(\n 'p-1 px-2 overflow-hidden rounded-md',\n (block.type !== 'text' || block.disposition) && 'w-full bg-baseSurface',\n block.type === 'text' && role === 'user' && 'bg-primary-200 dark:bg-primary-500',\n )}\n >\n <Component block={block} onSuggest={onSuggest} />\n </div>\n );\n};\n\nconst titles: Record<string, string> = {\n ['cot' as const]: 'Chain of thought',\n ['artifact' as const]: 'Artifact',\n ['tool_use' as const]: 'Tool request',\n ['tool_result' as const]: 'Tool result',\n};\n\ntype BlockComponent = FC<{ block: MessageContentBlock; onSuggest: (text: string) => void }>;\n\nconst componentMap: Record<string, BlockComponent> = {\n text: ({ block }) => {\n invariant(block.type === 'text');\n const title = block.disposition ? titles[block.disposition] : undefined;\n if (!title) {\n return (\n <MarkdownViewer content={block.text} classNames={[block.disposition === 'cot' && 'text-sm text-subdued']} />\n );\n }\n\n return (\n <ToggleContainer\n title={title}\n icon={\n block.pending ? (\n <Icon icon={'ph--circle-notch--regular'} classNames='text-subdued ml-2 animate-spin' size={4} />\n ) : undefined\n }\n open={block.disposition === 'cot'}\n >\n <MarkdownViewer content={block.text} classNames={[block.disposition === 'cot' && 'text-sm text-subdued']} />\n </ToggleContainer>\n );\n },\n\n json: ({ block, onSuggest }) => {\n invariant(block.type === 'json');\n\n switch (block.disposition) {\n case 'suggest': {\n const { text = '' }: { text: string } = safeParseJson(block.json ?? '{}') ?? ({} as any);\n return <Button onClick={() => onSuggest(text)}>{text}</Button>;\n }\n\n case 'select': {\n const { options = [] }: { options: string[] } = safeParseJson(block.json ?? '{}') ?? ({} as any);\n return (\n <ButtonGroup>\n {options.map((option) => (\n <Button key={option} onClick={() => onSuggest(option)}>\n {option}\n </Button>\n ))}\n </ButtonGroup>\n );\n }\n\n default: {\n const title = block.disposition ? titles[block.disposition] : undefined;\n return (\n <ToggleContainer title={title ?? 'JSON'}>\n <Json data={safeParseJson(block.json ?? block)} classNames='!p-1 text-xs' />\n </ToggleContainer>\n );\n }\n }\n },\n\n default: ({ block }) => {\n let title = titles[block.type];\n if (block.type === 'tool_use') {\n title = `Tool [${block.name}]`; // TODO(burdon): Get label from tool.\n }\n\n return (\n <ToggleContainer title={title ?? 'JSON'}>\n <Json data={block} classNames='!p-1 text-xs' />\n </ToggleContainer>\n );\n },\n};\n\nconst TabbedContainer = ({ items }: { items: { title: string; block: any }[] }) => {\n const lines = items.map((item) => item.title);\n const tabsRef = useRef<HTMLDivElement>(null);\n const [selected, setSelected] = useState(0);\n const [open, setOpen] = useState(false);\n useEffect(() => {\n if (open) {\n tabsRef.current?.focus();\n }\n }, [open]);\n\n const handleSelect = (index: number) => {\n if (index === selected) {\n setOpen(false);\n } else {\n setSelected(index);\n }\n };\n\n return (\n <ToggleContainer title={<StatusLine lines={lines} autoAdvance />} open={open} onChangeOpen={setOpen}>\n <div className='flex gap-2 w-full'>\n <Tabs ref={tabsRef} length={items.length} selected={selected} onSelect={handleSelect} />\n <Json data={items[selected].block} classNames='!p-1 text-xs' />\n </div>\n </ToggleContainer>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nconst emptyLines: string[] = [];\n\nexport type StatusLineProps = ThemedClassName<{\n line?: number;\n lines?: string[];\n transition?: number;\n advance?: number;\n autoAdvance?: boolean;\n}>;\n\nexport const StatusLine = ({\n classNames,\n line = -1,\n lines = emptyLines,\n transition = 300,\n advance = 1_000,\n autoAdvance,\n}: StatusLineProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentLine, setCurrentLine] = useState(line);\n useEffect(() => {\n setCurrentLine(line);\n }, [line]);\n\n useEffect(() => {\n if (!autoAdvance) {\n return;\n }\n\n const next = () => {\n setCurrentLine((prev) => {\n if (prev >= lines.length - 1) {\n clearInterval(interval);\n return prev;\n }\n\n return prev + 1;\n });\n };\n\n next();\n const interval = setInterval(next, advance);\n\n return () => clearInterval(interval);\n }, [lines.length, autoAdvance, advance]);\n\n useEffect(() => {\n if (containerRef.current) {\n containerRef.current.style.transition = `transform ${transition}ms ease-in-out`;\n containerRef.current.style.transform = `translateY(-${currentLine * 24}px)`;\n }\n }, [currentLine]);\n\n return (\n <div className={mx('relative h-[24px] overflow-hidden', classNames)}>\n <div ref={containerRef} className='h-[24px]'>\n <div className='flex flex-col'>\n {lines.map((line, i) => (\n <div key={i} className={mx('flex h-[24px] items-center')}>\n <span className='truncate'>{line}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef } from 'react';\n\nimport { Icon, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nconst numbers = [\n { regular: 'ph--number-circle-zero--thin', active: 'ph--number-circle-zero--duotone' },\n { regular: 'ph--number-circle-one--thin', active: 'ph--number-circle-one--duotone' },\n { regular: 'ph--number-circle-two--thin', active: 'ph--number-circle-two--duotone' },\n { regular: 'ph--number-circle-three--thin', active: 'ph--number-circle-three--duotone' },\n { regular: 'ph--number-circle-four--thin', active: 'ph--number-circle-four--duotone' },\n { regular: 'ph--number-circle-five--thin', active: 'ph--number-circle-five--duotone' },\n { regular: 'ph--number-circle-six--thin', active: 'ph--number-circle-six--duotone' },\n { regular: 'ph--number-circle-seven--thin', active: 'ph--number-circle-seven--duotone' },\n { regular: 'ph--number-circle-eight--thin', active: 'ph--number-circle-eight--duotone' },\n { regular: 'ph--number-circle-nine--thin', active: 'ph--number-circle-nine--duotone' },\n];\n\nexport type TabsProps = ThemedClassName<{\n length: number;\n selected?: number;\n onSelect?: (index: number) => void;\n}>;\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(\n ({ classNames, length, selected = 0, onSelect }, forwardedRef) => {\n return (\n <div\n ref={forwardedRef}\n className={mx('flex flex-col overflow-hidden outline-none', classNames)}\n tabIndex={-1}\n onKeyDown={(ev) => {\n // TODO(burdon): Focus when open Toggle.\n switch (ev.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n ev.preventDefault();\n ev.stopPropagation();\n if (selected < length - 1) {\n onSelect?.(selected + 1);\n }\n break;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n ev.preventDefault();\n ev.stopPropagation();\n if (selected > 0) {\n onSelect?.(selected - 1);\n }\n break;\n }\n\n case 'Enter': {\n ev.preventDefault();\n ev.stopPropagation();\n onSelect?.(selected);\n break;\n }\n }\n }}\n >\n {Array.from({ length }).map((_, i) => {\n const icon = numbers[i + 1];\n return (\n <div\n key={i}\n className={mx(\n 'relative flex w-[24px] h-[28px] justify-center cursor-pointer text-subdued',\n selected === i && '!text-cyan-550 !dark:text-cyan-300',\n )}\n >\n {i < length - 1 && <div className='absolute left-[11.5px] top-[21px] w-[1px] h-[10px] bg-neutral-400' />}\n <Icon\n icon={selected === i ? icon.regular : icon.regular}\n classNames='z-10 !p-0 !w-[24px] !h-[24px] outline-none'\n onClick={() => onSelect?.(i)}\n />\n </div>\n );\n })}\n </div>\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren, useEffect, useState } from 'react';\n\nimport { Icon, useControlledState, type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type ToggleContainerProps = ThemedClassName<\n PropsWithChildren<{\n title?: string | JSX.Element;\n icon?: JSX.Element;\n open?: boolean;\n duration?: number;\n /** Should shrink the width when closed. */\n shrinkX?: boolean;\n onChangeOpen?: (open: boolean) => void;\n }>\n>;\n\nexport const ToggleContainer = ({\n classNames,\n title,\n icon,\n open: _open,\n duration = 400,\n shrinkX = false,\n children,\n onChangeOpen,\n}: ToggleContainerProps) => {\n const [open, setOpen] = useControlledState(_open);\n const [expandX, setExpandX] = useState(shrinkX ? open : true);\n const [expandY, setExpandY] = useState(open);\n\n useEffect(() => {\n let t: NodeJS.Timeout;\n if (open) {\n if (shrinkX) {\n setExpandX(true);\n }\n t = setTimeout(\n () => {\n setExpandY(true);\n },\n shrinkX ? duration : 0,\n );\n } else {\n setExpandY(false);\n if (shrinkX) {\n t = setTimeout(() => {\n setExpandX(false);\n }, duration);\n }\n }\n\n return () => clearTimeout(t);\n }, [open]);\n\n const handleToggle = () => {\n if (onChangeOpen) {\n onChangeOpen(!open);\n } else {\n setOpen((open) => !open);\n }\n };\n\n return (\n <div className={mx('overflow-hidden', classNames)}>\n {title && (\n <div\n className='flex gap-1 py-1 items-center text-sm text-subdued cursor-pointer select-none'\n onClick={handleToggle}\n >\n <div className='flex w-[24px] h-[24px] items-center justify-center'>\n <Icon\n size={4}\n icon={'ph--caret-right--regular'}\n style={{ transitionDuration: `${shrinkX ? duration * 2 : duration}ms` }}\n classNames={['transition transition-transform ease-in-out', open ? 'rotate-90' : 'transform-none']}\n />\n </div>\n <div className='flex-1 pis-1 pie-1 truncate'>{title}</div>\n {icon}\n </div>\n )}\n <div\n style={{ transitionDuration: `${duration}ms` }}\n className={mx(\n 'grid transition-[grid-template-columns] ease-in-out',\n expandX ? 'grid-cols-[1fr]' : 'grid-cols-[0fr]',\n )}\n >\n <div className='overflow-hidden'>\n <div\n style={{ transitionDuration: `${duration}ms` }}\n className={mx(\n 'grid transition-[grid-template-rows] ease-in-out',\n expandY ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n <div className={mx('flex overflow-hidden transition-opacity')}>{children}</div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type FC } from 'react';\nimport ReactMarkdown from 'react-markdown';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { mx } from '@dxos/react-ui-theme';\nimport { omit } from '@dxos/util';\n\ntype MarkdownViewerProps = ThemedClassName<{\n content?: string;\n}>;\n\n/**\n * Transform text into react elements.\n *\n * https://github.com/remarkjs/react-markdown\n * markdown -> remark -> [mdast -> remark plugins] -> [hast -> rehype plugins] -> components -> react elements.\n */\n// TODO(burdon): Styles.\n// TODO(burdon): Factor out (react-ui-syntax-highlighter).\nexport const MarkdownViewer: FC<MarkdownViewerProps> = ({ classNames, content = '' }) => {\n return (\n <div className={mx('space-y-2', classNames)}>\n <ReactMarkdown\n components={{\n a: ({ node, children, href, ...props }) => (\n <a\n href={href}\n className='text-primary-500 hover:text-primary-500'\n target='_blank'\n rel='noopener noreferrer'\n {...props}\n >\n {children}\n </a>\n ),\n ol: ({ node, children, ...props }) => (\n <ol className='leading-tight list-decimal pl-6' {...omit(props, ['ordered'])}>\n {children}\n </ol>\n ),\n ul: ({ node, children, ...props }) => (\n <ul className='leading-tight list-disc pl-6' {...omit(props, ['ordered'])}>\n {children}\n </ul>\n ),\n li: ({ node, children, ...props }) => (\n <li className='' {...omit(props, ['ordered'])}>\n {children}\n </li>\n ),\n blockquote: ({ node, children, ...props }) => (\n <blockquote className='border-l-4 border-primary-500 pl-4 my-4 text-primary-500' {...props}>\n {children}\n </blockquote>\n ),\n code: ({ children, className }) => {\n const [_, language] = /language-(\\w+)/.exec(className || '') || [];\n return (\n <SyntaxHighlighter PreTag='div' language={language} className='p-0'>\n {children}\n </SyntaxHighlighter>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\n// const Cursor = () => {\n// return <span className='animate-[pulse_1s_steps(1)_infinite] text-primary-500'>▊</span>;\n// };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ChatContainer } from './ChatContainer';\n\nexport * from './ChatContainer';\nexport default ChatContainer;\n"],
5
+ "mappings": "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",
6
+ "names": ["import_invariant", "import_react", "import_artifact", "import_app_framework", "import_echo_schema", "import_functions", "import_log", "import_echo", "import_util", "import_react_client", "import_async", "import_keys", "import_react_ui", "import_react_ui_theme", "import_react_ui_syntax_highlighter", "defaultOptions", "model", "systemPrompt", "ChatProcessor", "constructor", "_client", "_tools", "_extensions", "_options", "_parser", "MixedStreamParser", "_pending", "signal", "_block", "undefined", "_history", "streaming", "computed", "value", "messages", "current", "pop", "invariant", "content", "rest", "message", "push", "on", "batch", "update", "block", "setTools", "tools", "request", "options", "history", "createStatic", "Message", "role", "type", "text", "_generate", "onComplete", "_reset", "cancel", "log", "info", "_stream", "abort", "more", "length", "generate", "parse", "complete", "at", "isToolUse", "response", "runTools", "extensions", "err", "catch", "AiClient", "lazy", "AppGraphBuilder", "IntentResolver", "ReactSurface", "covertFunctionToTool", "fn", "edgeUrl", "spaceId", "description", "inputSchema", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "url", "getInvocationUrl", "defineTool", "name", "schema", "toEffectSchema", "execute", "input", "fetch", "method", "headers", "body", "JSON", "stringify", "ToolResult", "Success", "createToolsFromService", "service", "interfaces", "kind", "iface", "schemaUrl", "createToolsFromApi", "authorization", "res", "spec", "json", "path", "pathItem", "Object", "entries", "paths", "methods", "m", "methodItem", "parametersResolved", "parameters", "map", "parameter", "resolved", "resolveJsonSchema", "properties", "endpointParameters", "placement", "in", "normalizeSchema", "_in", "required", "S", "validateSync", "JsonSchemaType", "summary", "warn", "endpoint", "document", "getToolName", "instructions", "callApiEndpoint", "operationId", "toLowerCase", "replaceAll", "MAX_TOOL_NAME_LENGTH", "lengthBefore", "word", "GENERIC_WORDS", "includes", "replace", "lengthAfter", "slice", "getEndpointUrl", "query", "URLSearchParams", "example", "default", "encodeURIComponent", "effectSchema", "Error", "set", "Authorization", "resolveAuthorization", "key", "size", "toString", "ok", "status", "statusText", "contentType", "get", "responseBody", "error", "isV3_1", "servers", "schemes", "host", "basePath", "tokenUrl", "grantType", "clientId", "clientSecret", "data", "access_token", "base", "deepMapValues", "recurse", "$ref", "startsWith", "jsonpointer", "ref", "openapi", "useChatProcessor", "chat", "aiClient", "useCapability", "AutomationCapabilities", "globalTools", "useCapabilities", "Capabilities", "Tools", "artifactDefinitions", "ArtifactDefinition", "dispatchPromise", "dispatch", "useIntentDispatcher", "space", "getSpace", "services", "useQuery", "Filter", "ServiceType", "serviceTools", "setServiceTools", "useState", "useEffect", "queueMicrotask", "Promise", "all", "flat", "config", "useConfig", "functions", "FunctionType", "useMemo", "flatMap", "definition", "values", "runtime", "edge", "id", "filter", "isNotNullOrUndefined", "createSystemPrompt", "artifacts", "processor", "registerTriggersMutex", "Mutex", "useMessageQueue", "edgeClient", "useEdgeClient", "queueDxn", "DXN", "QUEUE", "QueueSubspaceTags", "DATA", "queue", "dxn", "parts", "useQueue", "version", "toJsonSchema", "Struct", "level", "Number", "annotations", "AST", "TitleAnnotationId", "binding", "from", "String", "to", "MockServiceRegistry", "queryServices", "TEST_SERVICES", "AMADEUS_AUTH", "VISUAL_CROSSING_CREDENTIALS", "serviceId", "category", "Array", "_", "i", "keys", "categoryIcons", "Math", "floor", "random", "useServices", "registry", "setServices", "t", "setTimeout", "clearTimeout", "emptyLines", "StatusLine", "classNames", "line", "lines", "transition", "advance", "autoAdvance", "containerRef", "useRef", "currentLine", "setCurrentLine", "next", "prev", "clearInterval", "interval", "setInterval", "style", "transform", "React", "div", "className", "mx", "span", "numbers", "regular", "active", "Tabs", "forwardRef", "selected", "onSelect", "forwardedRef", "tabIndex", "onKeyDown", "ev", "preventDefault", "stopPropagation", "icon", "Icon", "onClick", "ToggleContainer", "title", "open", "_open", "duration", "shrinkX", "children", "onChangeOpen", "setOpen", "useControlledState", "expandX", "setExpandX", "expandY", "setExpandY", "handleToggle", "transitionDuration", "MarkdownViewer", "ReactMarkdown", "components", "a", "node", "href", "props", "target", "rel", "ol", "omit", "ul", "li", "blockquote", "code", "language", "exec", "SyntaxHighlighter", "PreTag", "ThreadMessage", "collapse", "debug", "onSuggest", "onDelete", "toolBlocks", "items", "TabbedContainer", "idx", "Block", "Component", "componentMap", "disposition", "titles", "pending", "safeParseJson", "Button", "ButtonGroup", "option", "Json", "item", "tabsRef", "setSelected", "focus", "handleSelect", "index", "Thread", "onSubmit", "onStop", "useTranslation", "AUTOMATION_PLUGIN", "scroller", "setText", "handleKeyDown", "useCallback", "trim", "scrollToBottom", "reduce", "join", "ScrollContainer", "Spinner", "Input", "Root", "TextInput", "autoFocus", "placeholder", "onChange", "IconButton", "disabled", "variant", "label", "iconOnly", "ChatContainer", "messageQueue", "handleSubmit", "append", "handleStop", "StackItem", "Content", "toolbar"]
7
+ }
@@ -16,13 +16,15 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_TQEDPRY5_exports = {};
20
- __export(chunk_TQEDPRY5_exports, {
19
+ var chunk_EQYHOTGG_exports = {};
20
+ __export(chunk_EQYHOTGG_exports, {
21
+ AMBIENT_CHAT_DIALOG: () => AMBIENT_CHAT_DIALOG,
21
22
  AUTOMATION_PLUGIN: () => AUTOMATION_PLUGIN,
22
23
  meta: () => meta
23
24
  });
24
- module.exports = __toCommonJS(chunk_TQEDPRY5_exports);
25
+ module.exports = __toCommonJS(chunk_EQYHOTGG_exports);
25
26
  var AUTOMATION_PLUGIN = "dxos.org/plugin/automation";
27
+ var AMBIENT_CHAT_DIALOG = `${AUTOMATION_PLUGIN}/ambient-chat/dialog`;
26
28
  var meta = {
27
29
  id: AUTOMATION_PLUGIN,
28
30
  name: "Automation",
@@ -35,7 +37,8 @@ var meta = {
35
37
  };
36
38
  // Annotate the CommonJS export names for ESM import in node:
37
39
  0 && (module.exports = {
40
+ AMBIENT_CHAT_DIALOG,
38
41
  AUTOMATION_PLUGIN,
39
42
  meta
40
43
  });
41
- //# sourceMappingURL=chunk-TQEDPRY5.cjs.map
44
+ //# sourceMappingURL=chunk-EQYHOTGG.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const AUTOMATION_PLUGIN = 'dxos.org/plugin/automation';\n\nexport const AMBIENT_CHAT_DIALOG = `${AUTOMATION_PLUGIN}/ambient-chat/dialog`;\n\nexport const meta = {\n id: AUTOMATION_PLUGIN,\n name: 'Automation',\n description:\n 'The Automation tab allows you to trigger pre-defined workflows related to the element you are interacting with inside of Composer.',\n icon: 'ph--magic-wand--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-automation',\n tags: ['experimental'],\n} satisfies PluginMeta;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAMA,oBAAoB;AAE1B,IAAMC,sBAAsB,GAAGD,iBAAAA;AAE/B,IAAME,OAAO;EAClBC,IAAIH;EACJI,MAAM;EACNC,aACE;EACFC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;AACT;",
6
+ "names": ["AUTOMATION_PLUGIN", "AMBIENT_CHAT_DIALOG", "meta", "id", "name", "description", "icon", "source", "tags"]
7
+ }
@@ -16,8 +16,8 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_H3RSMGJG_exports = {};
20
- __export(chunk_H3RSMGJG_exports, {
19
+ var chunk_GB7245FH_exports = {};
20
+ __export(chunk_GB7245FH_exports, {
21
21
  AIChatType: () => AIChatType,
22
22
  ApiAuthorization: () => ApiAuthorization,
23
23
  AutomationAction: () => AutomationAction,
@@ -28,8 +28,8 @@ __export(chunk_H3RSMGJG_exports, {
28
28
  ServiceType: () => ServiceType,
29
29
  categoryIcons: () => categoryIcons
30
30
  });
31
- module.exports = __toCommonJS(chunk_H3RSMGJG_exports);
32
- var import_chunk_TQEDPRY5 = require("./chunk-TQEDPRY5.cjs");
31
+ module.exports = __toCommonJS(chunk_GB7245FH_exports);
32
+ var import_chunk_EQYHOTGG = require("./chunk-EQYHOTGG.cjs");
33
33
  var import_conductor = require("@dxos/conductor");
34
34
  var import_echo_schema = require("@dxos/echo-schema");
35
35
  var import_functions = require("@dxos/functions");
@@ -146,7 +146,7 @@ var ServiceType = class extends (0, import_echo_schema.TypedObject)({
146
146
  };
147
147
  var AutomationAction;
148
148
  (function(AutomationAction2) {
149
- const AUTOMATION_ACTION = `${import_chunk_TQEDPRY5.AUTOMATION_PLUGIN}/action`;
149
+ const AUTOMATION_ACTION = `${import_chunk_EQYHOTGG.AUTOMATION_PLUGIN}/action`;
150
150
  class Create extends import_echo_schema2.S.TaggedClass()(`${AUTOMATION_ACTION}/create`, {
151
151
  input: import_echo_schema2.S.Struct({
152
152
  name: import_echo_schema2.S.optional(import_echo_schema2.S.String)
@@ -170,4 +170,4 @@ var AutomationAction;
170
170
  ServiceType,
171
171
  categoryIcons
172
172
  });
173
- //# sourceMappingURL=chunk-H3RSMGJG.cjs.map
173
+ //# sourceMappingURL=chunk-GB7245FH.cjs.map
@@ -26,31 +26,52 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_D2QQXWOY_exports = {};
30
- __export(chunk_D2QQXWOY_exports, {
29
+ var chunk_HMBKP6VG_exports = {};
30
+ __export(chunk_HMBKP6VG_exports, {
31
+ AmbientChatDialog: () => AmbientChatDialog,
31
32
  AutomationPanel: () => AutomationPanel,
32
33
  ChatContainer: () => ChatContainer,
33
34
  PromptEditor: () => PromptEditor,
34
35
  ServiceRegistry: () => ServiceRegistry
35
36
  });
36
- module.exports = __toCommonJS(chunk_D2QQXWOY_exports);
37
- var import_chunk_NH7STAX6 = require("./chunk-NH7STAX6.cjs");
38
- var import_chunk_H3RSMGJG = require("./chunk-H3RSMGJG.cjs");
39
- var import_chunk_TQEDPRY5 = require("./chunk-TQEDPRY5.cjs");
37
+ module.exports = __toCommonJS(chunk_HMBKP6VG_exports);
38
+ var import_chunk_CJGJXNY3 = require("./chunk-CJGJXNY3.cjs");
39
+ var import_chunk_GB7245FH = require("./chunk-GB7245FH.cjs");
40
+ var import_chunk_EQYHOTGG = require("./chunk-EQYHOTGG.cjs");
40
41
  var import_react = __toESM(require("react"));
41
- var import_echo = require("@dxos/react-client/echo");
42
42
  var import_react_ui = require("@dxos/react-ui");
43
+ var import_react2 = __toESM(require("react"));
44
+ var import_echo = require("@dxos/react-client/echo");
45
+ var import_react_ui2 = require("@dxos/react-ui");
43
46
  var import_react_ui_editor = require("@dxos/react-ui-editor");
44
47
  var import_react_ui_theme = require("@dxos/react-ui-theme");
45
48
  var import_util = require("@dxos/util");
46
49
  var import_language = require("@codemirror/language");
47
50
  var import_react_ui_editor2 = require("@dxos/react-ui-editor");
48
51
  var import_react_ui_theme2 = require("@dxos/react-ui-theme");
49
- var import_react2 = __toESM(require("react"));
52
+ var import_react3 = __toESM(require("react"));
50
53
  var import_echo2 = require("@dxos/client/echo");
51
54
  var import_echo3 = require("@dxos/react-client/echo");
52
- var import_react_ui2 = require("@dxos/react-ui");
53
- var import_react3 = require("react");
55
+ var import_react_ui3 = require("@dxos/react-ui");
56
+ var import_react4 = require("react");
57
+ var preventDefault = (event) => event.preventDefault();
58
+ var AmbientChatDialog = () => {
59
+ const { t } = (0, import_react_ui.useTranslation)(import_chunk_EQYHOTGG.AUTOMATION_PLUGIN);
60
+ return /* @__PURE__ */ import_react.default.createElement("div", {
61
+ role: "none",
62
+ className: "dx-dialog__overlay bg-transparent pointer-events-none",
63
+ "data-block-align": "end"
64
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Dialog.Content, {
65
+ onInteractOutside: preventDefault,
66
+ classNames: "pointer-events-auto",
67
+ inOverlayLayout: true
68
+ }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Dialog.Title, {
69
+ classNames: "sr-only"
70
+ }, t("ambient chat dialog title")), /* @__PURE__ */ import_react.default.createElement(import_react_ui.Dialog.Close, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Icon, {
71
+ icon: "ph--x--regular",
72
+ size: 4
73
+ })), /* @__PURE__ */ import_react.default.createElement("h1", null, "Hello")));
74
+ };
54
75
  var nameRegex = /\{([\w-]+)}/;
55
76
  var parser = import_language.StreamLanguage.define({
56
77
  token: (stream) => {
@@ -82,15 +103,15 @@ var promptExtension = [
82
103
  ];
83
104
  var inputTypes = [
84
105
  {
85
- value: import_chunk_H3RSMGJG.ChainInputType.VALUE,
106
+ value: import_chunk_GB7245FH.ChainInputType.VALUE,
86
107
  label: "Value"
87
108
  },
88
109
  {
89
- value: import_chunk_H3RSMGJG.ChainInputType.PASS_THROUGH,
110
+ value: import_chunk_GB7245FH.ChainInputType.PASS_THROUGH,
90
111
  label: "Pass through"
91
112
  },
92
113
  {
93
- value: import_chunk_H3RSMGJG.ChainInputType.RETRIEVER,
114
+ value: import_chunk_GB7245FH.ChainInputType.RETRIEVER,
94
115
  label: "Retriever"
95
116
  },
96
117
  // {
@@ -102,21 +123,21 @@ var inputTypes = [
102
123
  // label: 'Query',
103
124
  // },
104
125
  {
105
- value: import_chunk_H3RSMGJG.ChainInputType.RESOLVER,
126
+ value: import_chunk_GB7245FH.ChainInputType.RESOLVER,
106
127
  label: "Resolver"
107
128
  },
108
129
  {
109
- value: import_chunk_H3RSMGJG.ChainInputType.CONTEXT,
130
+ value: import_chunk_GB7245FH.ChainInputType.CONTEXT,
110
131
  label: "Context"
111
132
  },
112
133
  {
113
- value: import_chunk_H3RSMGJG.ChainInputType.SCHEMA,
134
+ value: import_chunk_GB7245FH.ChainInputType.SCHEMA,
114
135
  label: "Schema"
115
136
  }
116
137
  ];
117
138
  var getInputType = (type) => inputTypes.find(({ value }) => String(value) === type)?.value;
118
139
  var usePromptInputs = (prompt) => {
119
- (0, import_react.useEffect)(() => {
140
+ (0, import_react2.useEffect)(() => {
120
141
  const text = prompt.template ?? "";
121
142
  if (!prompt.inputs) {
122
143
  prompt.inputs = [];
@@ -156,8 +177,8 @@ var usePromptInputs = (prompt) => {
156
177
  ]);
157
178
  };
158
179
  var PromptEditor = ({ prompt, commandEditable = true }) => {
159
- const { t } = (0, import_react_ui.useTranslation)(import_chunk_TQEDPRY5.AUTOMATION_PLUGIN);
160
- const { themeMode } = (0, import_react_ui.useThemeContext)();
180
+ const { t } = (0, import_react_ui2.useTranslation)(import_chunk_EQYHOTGG.AUTOMATION_PLUGIN);
181
+ const { themeMode } = (0, import_react_ui2.useThemeContext)();
161
182
  const { parentRef } = (0, import_react_ui_editor.useTextEditor)(() => ({
162
183
  initialValue: prompt.template,
163
184
  extensions: [
@@ -187,53 +208,53 @@ var PromptEditor = ({ prompt, commandEditable = true }) => {
187
208
  prompt
188
209
  ]);
189
210
  usePromptInputs(prompt);
190
- return /* @__PURE__ */ import_react.default.createElement("div", {
211
+ return /* @__PURE__ */ import_react2.default.createElement("div", {
191
212
  className: (0, import_react_ui_theme.mx)("flex flex-col w-full overflow-hidden gap-4", import_react_ui_theme.groupBorder)
192
- }, commandEditable && /* @__PURE__ */ import_react.default.createElement("div", {
213
+ }, commandEditable && /* @__PURE__ */ import_react2.default.createElement("div", {
193
214
  className: "flex items-center pl-4"
194
- }, /* @__PURE__ */ import_react.default.createElement("span", {
215
+ }, /* @__PURE__ */ import_react2.default.createElement("span", {
195
216
  className: "text-neutral-500"
196
- }, "/"), /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.Root, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.TextInput, {
217
+ }, "/"), /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.TextInput, {
197
218
  placeholder: t("command placeholder"),
198
219
  classNames: (0, import_react_ui_theme.mx)("is-full bg-transparent m-2"),
199
220
  value: prompt.command ?? "",
200
221
  onChange: (event) => {
201
222
  prompt.command = event.target.value.replace(/\w/g, "");
202
223
  }
203
- }))), /* @__PURE__ */ import_react.default.createElement("div", {
224
+ }))), /* @__PURE__ */ import_react2.default.createElement("div", {
204
225
  ref: parentRef,
205
226
  className: (0, import_react_ui_theme.mx)(import_react_ui_theme.attentionSurface, "rounded", "min-h-[120px]")
206
- }), (prompt.inputs?.length ?? 0) > 0 && /* @__PURE__ */ import_react.default.createElement("div", {
227
+ }), (prompt.inputs?.length ?? 0) > 0 && /* @__PURE__ */ import_react2.default.createElement("div", {
207
228
  className: "flex flex-col"
208
- }, /* @__PURE__ */ import_react.default.createElement("table", {
229
+ }, /* @__PURE__ */ import_react2.default.createElement("table", {
209
230
  className: "w-full table-fixed border-collapse my-2"
210
- }, /* @__PURE__ */ import_react.default.createElement("tbody", null, prompt.inputs?.filter(import_util.nonNullable).map((input) => /* @__PURE__ */ import_react.default.createElement("tr", {
231
+ }, /* @__PURE__ */ import_react2.default.createElement("tbody", null, prompt.inputs?.filter(import_util.nonNullable).map((input) => /* @__PURE__ */ import_react2.default.createElement("tr", {
211
232
  key: input.name
212
- }, /* @__PURE__ */ import_react.default.createElement("td", {
233
+ }, /* @__PURE__ */ import_react2.default.createElement("td", {
213
234
  className: "w-[160px] p-1 font-mono text-sm whitespace-nowrap truncate"
214
- }, /* @__PURE__ */ import_react.default.createElement("code", {
235
+ }, /* @__PURE__ */ import_react2.default.createElement("code", {
215
236
  className: "px-2"
216
- }, input.name)), /* @__PURE__ */ import_react.default.createElement("td", {
237
+ }, input.name)), /* @__PURE__ */ import_react2.default.createElement("td", {
217
238
  className: "w-[120px] p-1"
218
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.Root, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Select.Root, {
239
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Select.Root, {
219
240
  value: String(input.type),
220
241
  onValueChange: (type) => {
221
- input.type = getInputType(type) ?? import_chunk_H3RSMGJG.ChainInputType.VALUE;
242
+ input.type = getInputType(type) ?? import_chunk_GB7245FH.ChainInputType.VALUE;
222
243
  }
223
- }, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Select.TriggerButton, {
244
+ }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Select.TriggerButton, {
224
245
  placeholder: "Type",
225
246
  classNames: "is-full"
226
- }), /* @__PURE__ */ import_react.default.createElement(import_react_ui.Select.Portal, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Select.Content, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Select.Viewport, null, inputTypes.map(({ value, label }) => /* @__PURE__ */ import_react.default.createElement(import_react_ui.Select.Option, {
247
+ }), /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Select.Portal, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Select.Content, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Select.Viewport, null, inputTypes.map(({ value, label }) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Select.Option, {
227
248
  key: value,
228
249
  value: String(value)
229
- }, label)))))))), /* @__PURE__ */ import_react.default.createElement("td", {
250
+ }, label)))))))), /* @__PURE__ */ import_react2.default.createElement("td", {
230
251
  className: "p-1 pr-2"
231
252
  }, input.type !== void 0 && [
232
- import_chunk_H3RSMGJG.ChainInputType.VALUE,
233
- import_chunk_H3RSMGJG.ChainInputType.CONTEXT,
234
- import_chunk_H3RSMGJG.ChainInputType.RESOLVER,
235
- import_chunk_H3RSMGJG.ChainInputType.SCHEMA
236
- ].includes(input.type) && /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.Root, null, /* @__PURE__ */ import_react.default.createElement(import_react_ui.Input.TextInput, {
253
+ import_chunk_GB7245FH.ChainInputType.VALUE,
254
+ import_chunk_GB7245FH.ChainInputType.CONTEXT,
255
+ import_chunk_GB7245FH.ChainInputType.RESOLVER,
256
+ import_chunk_GB7245FH.ChainInputType.SCHEMA
257
+ ].includes(input.type) && /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.TextInput, {
237
258
  placeholder: t("command placeholder"),
238
259
  classNames: (0, import_react_ui_theme.mx)("is-full bg-transparent"),
239
260
  value: input.value ?? "",
@@ -243,9 +264,9 @@ var PromptEditor = ({ prompt, commandEditable = true }) => {
243
264
  }))))))))));
244
265
  };
245
266
  var ServiceRegistry = ({ space }) => {
246
- const matchingServices = (0, import_chunk_NH7STAX6.useServices)(space);
247
- const enabledServices = (0, import_echo3.useQuery)(space, import_echo2.Filter.schema(import_chunk_H3RSMGJG.ServiceType));
248
- const services = (0, import_react2.useMemo)(() => {
267
+ const matchingServices = (0, import_chunk_CJGJXNY3.useServices)(space);
268
+ const enabledServices = (0, import_echo3.useQuery)(space, import_echo2.Filter.schema(import_chunk_GB7245FH.ServiceType));
269
+ const services = (0, import_react3.useMemo)(() => {
249
270
  return matchingServices.map((service) => enabledServices.find((s) => s.serviceId === service.serviceId) ?? service);
250
271
  }, [
251
272
  matchingServices,
@@ -258,9 +279,9 @@ var ServiceRegistry = ({ space }) => {
258
279
  space.db.remove(service);
259
280
  }
260
281
  };
261
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.List, {
282
+ return /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.List, {
262
283
  classNames: "h-full grid auto-rows-[5rem] gap-2 p-2 pis-2 pie-2 overflow-y-auto scrollbar-thin"
263
- }, services.map((service) => /* @__PURE__ */ import_react2.default.createElement(ServiceItem, {
284
+ }, services.map((service) => /* @__PURE__ */ import_react3.default.createElement(ServiceItem, {
264
285
  key: service.serviceId,
265
286
  service,
266
287
  enabled: service.enabled,
@@ -268,35 +289,36 @@ var ServiceRegistry = ({ space }) => {
268
289
  })));
269
290
  };
270
291
  var ServiceItem = ({ service, enabled, setEnabled }) => {
271
- return /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.ListItem.Root, {
292
+ return /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.ListItem.Root, {
272
293
  classNames: "flex flex-col gap-1 p-1 overflow-hidden rounded-md border border-separator"
273
- }, /* @__PURE__ */ import_react2.default.createElement("div", {
294
+ }, /* @__PURE__ */ import_react3.default.createElement("div", {
274
295
  className: "grid grid-cols-[40px_1fr_40px]"
275
- }, /* @__PURE__ */ import_react2.default.createElement("div", {
296
+ }, /* @__PURE__ */ import_react3.default.createElement("div", {
276
297
  className: "flex gow justify-center items-center"
277
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Icon, {
278
- icon: import_chunk_H3RSMGJG.categoryIcons[service.category ?? "default"] ?? "ph--placeholder--regular",
298
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
299
+ icon: import_chunk_GB7245FH.categoryIcons[service.category ?? "default"] ?? "ph--placeholder--regular",
279
300
  size: 6
280
- })), /* @__PURE__ */ import_react2.default.createElement("div", {
301
+ })), /* @__PURE__ */ import_react3.default.createElement("div", {
281
302
  className: "grow items-center truncate mie-2"
282
- }, service.name), /* @__PURE__ */ import_react2.default.createElement("div", {
303
+ }, service.name), /* @__PURE__ */ import_react3.default.createElement("div", {
283
304
  className: "flex gow justify-center items-center"
284
- }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.Switch, {
305
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Input.Root, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Input.Switch, {
285
306
  checked: enabled,
286
307
  onClick: () => setEnabled?.(!enabled)
287
- })))), /* @__PURE__ */ import_react2.default.createElement("div", {
308
+ })))), /* @__PURE__ */ import_react3.default.createElement("div", {
288
309
  className: "grid grid-cols-[40px_1fr]"
289
- }, /* @__PURE__ */ import_react2.default.createElement("div", null), /* @__PURE__ */ import_react2.default.createElement("div", {
310
+ }, /* @__PURE__ */ import_react3.default.createElement("div", null), /* @__PURE__ */ import_react3.default.createElement("div", {
290
311
  className: "text-sm text-subdued line-clamp-2 mie-1"
291
312
  }, service.description)));
292
313
  };
293
- var AutomationPanel = (0, import_react3.lazy)(() => import("./AutomationPanel-CO26O75P.cjs"));
294
- var ChatContainer = (0, import_react3.lazy)(() => import("./ChatContainer-5URBEXQD.cjs"));
314
+ var AutomationPanel = (0, import_react4.lazy)(() => import("./AutomationPanel-G6EDDYWW.cjs"));
315
+ var ChatContainer = (0, import_react4.lazy)(() => import("./ChatContainer-EN24W3K4.cjs"));
295
316
  // Annotate the CommonJS export names for ESM import in node:
296
317
  0 && (module.exports = {
318
+ AmbientChatDialog,
297
319
  AutomationPanel,
298
320
  ChatContainer,
299
321
  PromptEditor,
300
322
  ServiceRegistry
301
323
  });
302
- //# sourceMappingURL=chunk-D2QQXWOY.cjs.map
324
+ //# sourceMappingURL=chunk-HMBKP6VG.cjs.map