@dxos/plugin-assistant 0.8.4-main.2e9d522 → 0.8.4-main.67995b8

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 (109) hide show
  1. package/dist/lib/browser/{TemplateContainer-RPJ2LBOB.mjs → BlueprintContainer-IZ4AK5EO.mjs} +9 -8
  2. package/dist/lib/browser/BlueprintContainer-IZ4AK5EO.mjs.map +7 -0
  3. package/dist/lib/browser/{ChatContainer-M3IHQLRS.mjs → ChatContainer-RP3QEXYX.mjs} +3 -3
  4. package/dist/lib/browser/{ChatDialog-X6VN6QZI.mjs → ChatDialog-ZVLXFHEY.mjs} +3 -3
  5. package/dist/lib/browser/{app-graph-builder-JTXBKE7O.mjs → app-graph-builder-XSEOKJLG.mjs} +5 -64
  6. package/dist/lib/browser/app-graph-builder-XSEOKJLG.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-OWY4CUQY.mjs → chunk-63GG6U6D.mjs} +18 -37
  8. package/dist/lib/browser/chunk-63GG6U6D.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-JQBVLTM5.mjs → chunk-7W7LHTRH.mjs} +14 -1
  10. package/dist/lib/browser/chunk-7W7LHTRH.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-AEAEKWOC.mjs → chunk-KFXSBNZR.mjs} +10 -19
  12. package/dist/lib/browser/chunk-KFXSBNZR.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-EQDW6BYQ.mjs → chunk-LERGF5YG.mjs} +7 -7
  14. package/dist/lib/browser/{chunk-EQDW6BYQ.mjs.map → chunk-LERGF5YG.mjs.map} +3 -3
  15. package/dist/lib/browser/index.mjs +42 -30
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-5RMMCMXG.mjs → intent-resolver-MV3VSZLS.mjs} +19 -4
  18. package/dist/lib/browser/intent-resolver-MV3VSZLS.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-66VY37YQ.mjs → react-surface-3GYEHQRP.mjs} +14 -14
  21. package/dist/lib/browser/react-surface-3GYEHQRP.mjs.map +7 -0
  22. package/dist/lib/browser/{settings-2DGP3UTS.mjs → settings-5GTTCVGD.mjs} +2 -2
  23. package/dist/lib/browser/types/index.mjs +1 -1
  24. package/dist/lib/node-esm/{TemplateContainer-A3NAQCZE.mjs → BlueprintContainer-RGTMNLNX.mjs} +9 -8
  25. package/dist/lib/node-esm/BlueprintContainer-RGTMNLNX.mjs.map +7 -0
  26. package/dist/lib/node-esm/{ChatContainer-VZT74PO2.mjs → ChatContainer-W3W6FWV3.mjs} +3 -3
  27. package/dist/lib/node-esm/{ChatDialog-RJ6FDX4Q.mjs → ChatDialog-QW4JRKVO.mjs} +3 -3
  28. package/dist/lib/node-esm/{app-graph-builder-OWSOXFTD.mjs → app-graph-builder-PANCJUHV.mjs} +5 -64
  29. package/dist/lib/node-esm/app-graph-builder-PANCJUHV.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-SENTQAEO.mjs → chunk-BFO3KHYL.mjs} +18 -37
  31. package/dist/lib/node-esm/chunk-BFO3KHYL.mjs.map +7 -0
  32. package/dist/lib/node-esm/{chunk-E33DNNDW.mjs → chunk-MS3PJARN.mjs} +7 -7
  33. package/dist/lib/node-esm/{chunk-E33DNNDW.mjs.map → chunk-MS3PJARN.mjs.map} +3 -3
  34. package/dist/lib/node-esm/{chunk-2XL6MNPE.mjs → chunk-VIIMA3XQ.mjs} +10 -19
  35. package/dist/lib/node-esm/chunk-VIIMA3XQ.mjs.map +7 -0
  36. package/dist/lib/node-esm/{chunk-BISJDTBK.mjs → chunk-Z7PUODRT.mjs} +14 -1
  37. package/dist/lib/node-esm/chunk-Z7PUODRT.mjs.map +7 -0
  38. package/dist/lib/node-esm/index.mjs +42 -30
  39. package/dist/lib/node-esm/index.mjs.map +3 -3
  40. package/dist/lib/node-esm/{intent-resolver-YPPYELY3.mjs → intent-resolver-3FMC3GHC.mjs} +19 -4
  41. package/dist/lib/node-esm/intent-resolver-3FMC3GHC.mjs.map +7 -0
  42. package/dist/lib/node-esm/meta.json +1 -1
  43. package/dist/lib/node-esm/{react-surface-RJMRBR2M.mjs → react-surface-QDQWJ7FZ.mjs} +14 -14
  44. package/dist/lib/node-esm/react-surface-QDQWJ7FZ.mjs.map +7 -0
  45. package/dist/lib/node-esm/{settings-47RYZOU4.mjs → settings-J2EXEM5H.mjs} +2 -2
  46. package/dist/lib/node-esm/types/index.mjs +1 -1
  47. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  48. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  49. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  50. package/dist/types/src/capability-definitions.d.ts +7 -0
  51. package/dist/types/src/capability-definitions.d.ts.map +1 -0
  52. package/dist/types/src/components/BlueprintContainer.d.ts +8 -0
  53. package/dist/types/src/components/BlueprintContainer.d.ts.map +1 -0
  54. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +0 -42
  55. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -1
  57. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  58. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +2 -1
  59. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  60. package/dist/types/src/components/index.d.ts +1 -1
  61. package/dist/types/src/components/index.d.ts.map +1 -1
  62. package/dist/types/src/hooks/useChatServices.d.ts +2 -2
  63. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  64. package/dist/types/src/stories/Chat.stories.d.ts +2 -44
  65. package/dist/types/src/stories/Chat.stories.d.ts.map +1 -1
  66. package/dist/types/src/translations.d.ts +1 -10
  67. package/dist/types/src/translations.d.ts.map +1 -1
  68. package/dist/types/src/types/schema.d.ts +32 -0
  69. package/dist/types/src/types/schema.d.ts.map +1 -1
  70. package/dist/types/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +75 -73
  72. package/src/AssistantPlugin.tsx +32 -6
  73. package/src/capabilities/app-graph-builder.ts +2 -86
  74. package/src/capabilities/intent-resolver.ts +16 -2
  75. package/src/capabilities/react-surface.tsx +7 -7
  76. package/src/capability-definitions.ts +15 -0
  77. package/src/components/BlueprintContainer.tsx +24 -0
  78. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +4 -4
  79. package/src/components/TemplateEditor/TemplateEditor.tsx +12 -10
  80. package/src/components/TemplateEditor/TemplateForm.stories.tsx +4 -4
  81. package/src/components/TemplateEditor/TemplateForm.tsx +3 -2
  82. package/src/components/index.ts +1 -1
  83. package/src/hooks/useChatServices.ts +24 -48
  84. package/src/stories/Chat.stories.tsx +17 -24
  85. package/src/translations.ts +1 -10
  86. package/src/types/schema.ts +13 -0
  87. package/dist/lib/browser/TemplateContainer-RPJ2LBOB.mjs.map +0 -7
  88. package/dist/lib/browser/app-graph-builder-JTXBKE7O.mjs.map +0 -7
  89. package/dist/lib/browser/chunk-AEAEKWOC.mjs.map +0 -7
  90. package/dist/lib/browser/chunk-JQBVLTM5.mjs.map +0 -7
  91. package/dist/lib/browser/chunk-OWY4CUQY.mjs.map +0 -7
  92. package/dist/lib/browser/intent-resolver-5RMMCMXG.mjs.map +0 -7
  93. package/dist/lib/browser/react-surface-66VY37YQ.mjs.map +0 -7
  94. package/dist/lib/node-esm/TemplateContainer-A3NAQCZE.mjs.map +0 -7
  95. package/dist/lib/node-esm/app-graph-builder-OWSOXFTD.mjs.map +0 -7
  96. package/dist/lib/node-esm/chunk-2XL6MNPE.mjs.map +0 -7
  97. package/dist/lib/node-esm/chunk-BISJDTBK.mjs.map +0 -7
  98. package/dist/lib/node-esm/chunk-SENTQAEO.mjs.map +0 -7
  99. package/dist/lib/node-esm/intent-resolver-YPPYELY3.mjs.map +0 -7
  100. package/dist/lib/node-esm/react-surface-RJMRBR2M.mjs.map +0 -7
  101. package/dist/types/src/components/TemplateContainer.d.ts +0 -8
  102. package/dist/types/src/components/TemplateContainer.d.ts.map +0 -1
  103. package/src/components/TemplateContainer.tsx +0 -24
  104. /package/dist/lib/browser/{ChatContainer-M3IHQLRS.mjs.map → ChatContainer-RP3QEXYX.mjs.map} +0 -0
  105. /package/dist/lib/browser/{ChatDialog-X6VN6QZI.mjs.map → ChatDialog-ZVLXFHEY.mjs.map} +0 -0
  106. /package/dist/lib/browser/{settings-2DGP3UTS.mjs.map → settings-5GTTCVGD.mjs.map} +0 -0
  107. /package/dist/lib/node-esm/{ChatContainer-VZT74PO2.mjs.map → ChatContainer-W3W6FWV3.mjs.map} +0 -0
  108. /package/dist/lib/node-esm/{ChatDialog-RJ6FDX4Q.mjs.map → ChatDialog-QW4JRKVO.mjs.map} +0 -0
  109. /package/dist/lib/node-esm/{settings-47RYZOU4.mjs.map → settings-J2EXEM5H.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/useChatProcessor.ts", "../../../src/hooks/index.ts", "../../../src/hooks/chat-processor.ts", "../../../src/hooks/presets.ts", "../../../src/hooks/useBlueprints.ts", "../../../src/hooks/useChatServices.ts", "../../../src/capability-definitions.ts", "../../../src/hooks/useReferencesProvider.ts", "../../../src/tools/function.ts", "../../../src/tools/openapi.ts", "../../../src/components/Toolbox/Toolbox.tsx", "../../../src/components/Chat/Chat.tsx", "../../../src/components/ChatPrompt/ChatActions.tsx", "../../../src/components/ChatPrompt/ChatOptionsMenu.tsx", "../../../src/components/ChatPrompt/ChatPresets.tsx", "../../../src/components/ChatPrompt/ChatReferences.tsx", "../../../src/components/ChatPrompt/ChatStatusIndicator.tsx", "../../../src/components/ChatThread/ChatThread.tsx", "../../../src/components/ChatThread/ChatMessage.tsx", "../../../src/components/ChatThread/ToolBlock.tsx", "../../../src/components/ChatThread/reducer.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Layer } from 'effect';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { type ExecutableTool } from '@dxos/ai';\nimport { Capabilities, useCapabilities, useIntentDispatcher } from '@dxos/app-framework';\nimport { Conversation, createSystemPrompt } from '@dxos/assistant';\nimport { type ArtifactDefinition, type AssociatedArtifact, type Blueprint } from '@dxos/blueprints';\nimport { FunctionType } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { useConfig } from '@dxos/react-client';\nimport { Filter, fullyQualifiedId, type Queue, type Space, useQuery } from '@dxos/react-client/echo';\nimport { isNonNullable } from '@dxos/util';\n\nimport { type AiServicePreset, ChatProcessor, type ChatServices } from '../hooks';\nimport { convertFunctionToTool, createToolsFromService } from '../tools';\nimport { type Assistant, ServiceType } from '../types';\n\ntype UseChatProcessorProps = {\n preset?: AiServicePreset;\n space?: Space;\n chat?: Assistant.Chat;\n\n // TODO(burdon): Move into layer?\n services?: Layer.Layer<ChatServices>;\n blueprintRegistry?: Blueprint.Registry;\n // TODO(burdon): Not currently used.\n settings?: Assistant.Settings;\n\n /** @deprecated */\n instructions?: string;\n /** @deprecated */\n artifact?: AssociatedArtifact;\n /** @deprecated */\n noPluginArtifacts?: boolean;\n};\n\n/**\n * Configure and create ChatProcessor.\n */\nexport const useChatProcessor = ({\n preset,\n space,\n chat,\n services,\n blueprintRegistry,\n settings,\n instructions,\n artifact,\n noPluginArtifacts,\n}: UseChatProcessorProps): ChatProcessor | undefined => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const globalTools = useCapabilities(Capabilities.Tools);\n\n // TODO(burdon): Spec artifacts.\n let artifacts: readonly ArtifactDefinition[] = useCapabilities(Capabilities.ArtifactDefinition);\n if (noPluginArtifacts) {\n artifacts = Stable.array;\n }\n\n // Services.\n const remoteServices = useQuery(space, Filter.type(ServiceType));\n const [serviceTools, setServiceTools] = useState<ExecutableTool[]>([]);\n useEffect(() => {\n log('creating service tools...');\n queueMicrotask(async () => {\n const tools = await Promise.all(remoteServices.map((service) => createToolsFromService(service)));\n setServiceTools(tools.flat());\n });\n }, [remoteServices]);\n\n // Tools and context.\n const config = useConfig();\n const functions = useQuery(space, Filter.type(FunctionType));\n const chatId = useMemo(() => (chat ? fullyQualifiedId(chat) : undefined), [chat]);\n const [tools, extensions] = useMemo(() => {\n log('creating tools...');\n const tools: ExecutableTool[] = [\n ...globalTools.flat(),\n ...serviceTools,\n ...functions\n .map((fn) => convertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))\n .filter(isNonNullable),\n ];\n const extensions = { space, dispatch, pivotId: chatId };\n return [tools, extensions];\n }, [dispatch, globalTools, space, chatId, serviceTools, functions]);\n\n // TODO(burdon): Create from template.\n const systemPrompt = useMemo(\n () =>\n createSystemPrompt({\n artifacts: artifacts.map((definition) => `${definition.name}\\n${definition.instructions}`),\n artifact,\n instructions,\n }),\n [artifacts, artifact, instructions],\n );\n\n const conversation = useMemo(() => {\n if (!chat?.queue.target) {\n return;\n }\n\n return new Conversation({ queue: chat.queue.target as Queue<any> });\n }, [chat?.queue.target]);\n\n // Create processor.\n // TODO(burdon): Updated on each query update above; should just update current processor?\n const processor = useMemo(() => {\n if (!services || !conversation) {\n return undefined;\n }\n\n log.info('creating processor', {\n preset,\n artifacts: artifacts.length,\n systemPrompt: systemPrompt.length,\n model: preset?.model,\n settings,\n });\n\n return new ChatProcessor(services, conversation, {\n tools,\n extensions,\n blueprintRegistry,\n artifacts,\n systemPrompt,\n model: preset?.model,\n });\n }, [services, conversation, tools, blueprintRegistry, artifacts, extensions, systemPrompt, preset]);\n\n return processor;\n};\n\n// TODO(dmaretskyi): Extract.\nexport const Stable = Object.freeze({\n array: [] as readonly never[],\n object: {} as {},\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport * from './chat-processor';\nexport * from './presets';\n\nexport * from './useBlueprints';\nexport * from './useChatProcessor';\nexport * from './useChatServices';\nexport * from './useReferencesProvider';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Signal, batch, computed, signal } from '@preact/signals-core';\nimport { Effect, type Layer } from 'effect';\n\nimport { AiService, DEFAULT_EDGE_MODEL, type ExecutableTool, type GenerateRequest } from '@dxos/ai';\nimport { type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { type AiSession, ArtifactDiffResolver, type ContextBinder, type Conversation } from '@dxos/assistant';\nimport { type ArtifactDefinition, type Blueprint } from '@dxos/blueprints';\nimport { Context } from '@dxos/context';\nimport { Obj } from '@dxos/echo';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { log } from '@dxos/log';\nimport { Filter, type Space, getVersion } from '@dxos/react-client/echo';\nimport { DataType } from '@dxos/schema';\n\nimport type { ChatServices } from './useChatServices';\n\n// TODO(burdon): Factor out.\ndeclare global {\n interface ToolContextExtensions {\n space?: Space;\n dispatch?: PromiseIntentDispatcher;\n }\n}\n\ntype RequestOptions = {\n // Empty for now.\n};\n\nexport type ChatProcessorOptions = {\n // TODO(burdon): Change to AiToolkit.\n tools?: readonly ExecutableTool[];\n blueprintRegistry?: Blueprint.Registry;\n\n // TODO(dmaretskyi): Remove.\n artifacts?: readonly ArtifactDefinition[];\n extensions?: ToolContextExtensions;\n // TODO(burdon): Remove systemPrompt -- should come from blueprint.\n} & Pick<GenerateRequest, 'model' | 'systemPrompt'>;\n\nconst defaultOptions: Partial<ChatProcessorOptions> = {\n model: DEFAULT_EDGE_MODEL,\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 */\n// TODO(burdon): Rename ChatContext?\nexport class ChatProcessor {\n /**\n * Pending messages (incl. the current user request).\n * @reactive\n */\n private readonly _pending: Signal<DataType.Message[]> = signal([]);\n\n /**\n * Current streaming message (from the AI service).\n * @reactive\n */\n private readonly _streaming: Signal<DataType.Message | undefined> = signal(undefined);\n\n /**\n * Streaming state.\n * @reactive\n */\n public readonly streaming: Signal<boolean> = computed(() => this._streaming.value !== undefined);\n\n /**\n * Last error.\n * @reactive\n */\n public readonly error: Signal<Error | undefined> = signal(undefined);\n\n /**\n * Array of Messages (incl. the current message being streamed).\n * @reactive\n */\n public readonly messages: Signal<DataType.Message[]> = computed(() => {\n const messages = [...this._pending.value];\n if (this._streaming.value) {\n // TODO(dmaretskyi): Replace with Obj.clone.\n // NOTE: We have to clone the message here so that react will re-render.\n messages.push(Obj.make(DataType.Message, this._streaming.value));\n }\n\n return messages;\n });\n\n // TODO(burdon): Replace with Toolkit.\n private _tools?: ExecutableTool[];\n\n /** Current session. */\n private _session: AiSession | undefined = undefined;\n\n constructor(\n // TODO(dmaretskyi): Replace this with effect's ManagedRuntime wrapping this layer.\n private readonly _services: Layer.Layer<ChatServices>,\n private readonly _conversation: Conversation,\n private readonly _options: ChatProcessorOptions = defaultOptions,\n ) {\n this._tools = [...(_options.tools ?? [])];\n }\n\n get conversation() {\n return this._conversation;\n }\n\n get context(): ContextBinder {\n return this._conversation.context;\n }\n\n get blueprintRegistry() {\n return this._options.blueprintRegistry;\n }\n\n get tools() {\n return this._tools;\n }\n\n /**\n * @deprecated Replace with blueprints\n */\n setTools(tools: ExecutableTool[]): void {\n this._tools = tools;\n }\n\n /**\n * Make GPT request.\n */\n async request(message: string, options: RequestOptions = {}): Promise<DataType.Message[]> {\n await using ctx = Context.default(); // Auto-disposed at the end of this block.\n\n this._conversation.onBegin.on(ctx, (session) => {\n log.info('onBegin', { session, isDisposed: ctx.disposed });\n\n this._session = session;\n ctx.onDispose(() => {\n log.info('onDispose', { session, isDisposed: ctx.disposed });\n if (this._session === session) {\n this._session = undefined;\n }\n });\n\n // User message.\n session.userMessage.on((message) => {\n log.info('userMessage', { message });\n this._pending.value = [...this._pending.value, message];\n });\n\n // Message complete.\n session.message.on((message) => {\n batch(() => {\n this._pending.value = [...this._pending.value, message];\n this._streaming.value = undefined;\n });\n });\n\n // Streaming update (happens before message complete).\n session.update.on((block) => {\n batch(() => {\n if (!this._streaming.value) {\n // TODO(burdon): Hack to create temp message; better for session to send initial partial object?\n this._streaming.value = Obj.make(DataType.Message, {\n created: new Date().toISOString(),\n sender: { role: 'assistant' },\n blocks: [block],\n });\n } else if (this._streaming.value.blocks.at(-1)?.pending === true) {\n this._streaming.value.blocks[this._streaming.value.blocks.length - 1] = block;\n } else {\n this._streaming.value.blocks.push(block);\n }\n });\n });\n\n session.block.on((block) => {\n if (!this._streaming.value) {\n // TODO(burdon): Hack to create temp message; better for session to send initial partial object?\n this._streaming.value = Obj.make(DataType.Message, {\n created: new Date().toISOString(),\n sender: { role: 'assistant' },\n blocks: [block],\n });\n } else if (this._streaming.value.blocks.at(-1)?.pending === true) {\n this._streaming.value.blocks[this._streaming.value.blocks.length - 1] = block;\n } else {\n this._streaming.value.blocks.push(block);\n }\n });\n\n // TODO(dmaretskyi): Handle tool status reports.\n // session.toolStatusReport.on(({ message, status }) => {\n // const msg = this._pending.peek().find((m) => m.id === message.id);\n // const toolUse = msg?.content.find((block) => block.type === 'tool_use');\n // if (!toolUse) {\n // return;\n // }\n\n // const block = msg?.content.find(\n // (block): block is ToolUseContentBlock => block.type === 'tool_use' && block.id === toolUse.id,\n // );\n // if (block) {\n // this._pending.value = this._pending.value.map((m) => {\n // if (m.id === message.id) {\n // return {\n // ...m,\n // content: m.content.map((block) =>\n // block.type === 'tool_use' && block.id === toolUse.id ? { ...block, currentStatus: status } : block,\n // ),\n // };\n // }\n\n // return m;\n // });\n // } else {\n // log.warn('no block for status report');\n // }\n // });\n });\n\n try {\n const messages = await runAndForwardErrors(\n this._conversation\n .run({\n prompt: message,\n // TODO(burdon): Construct from blueprints?\n systemPrompt: this._options.systemPrompt,\n })\n .pipe(\n //\n Effect.provide(AiService.model(this._options.model ?? DEFAULT_EDGE_MODEL)),\n // TODO(dmaretskyi): Move ArtifactDiffResolver upstream.\n Effect.provideService(ArtifactDiffResolver, this._artifactDiffResolver),\n Effect.provide(this._services),\n Effect.tapErrorCause((cause) => {\n log.error('error', { cause });\n return Effect.void;\n }),\n ),\n );\n\n log('completed', { messages });\n } catch (err) {\n log.catch(err);\n if (err instanceof Error && err.message.includes('Overloaded')) {\n this.error.value = new AiServiceOverloadedError('AI service overloaded', { cause: err });\n } else {\n this.error.value = new Error('AI service error', { cause: err });\n }\n }\n\n return this._reset();\n }\n\n /**\n * Cancel pending requests.\n * @returns Pending requests (incl. the request message).\n */\n async cancel(): Promise<DataType.Message[]> {\n log.info('cancelling...');\n\n // TODO(dmaretskyi): Conversation should handle aborting.\n this._session?.abort();\n return this._reset();\n }\n\n private async _reset(): Promise<DataType.Message[]> {\n const messages = this._pending.value;\n batch(() => {\n this._pending.value = [];\n this._streaming.value = undefined;\n });\n\n return messages;\n }\n\n private _artifactDiffResolver: ArtifactDiffResolver.Service = {\n resolve: async (artifacts) => {\n const space = this._options.extensions?.space;\n if (!space) {\n return new Map();\n }\n\n const versions = new Map();\n await Promise.all(\n artifacts.map(async (artifact) => {\n const {\n objects: [object],\n } = await space.db.query(Filter.ids(artifact.id)).run();\n if (!object) {\n return;\n }\n versions.set(artifact.id, {\n version: getVersion(object),\n diff: `Current state: ${JSON.stringify(object)}`,\n });\n }),\n );\n return versions;\n },\n };\n}\n\n// TODO(wittjosiah): Move to ai-service-client.\nexport class AiServiceOverloadedError extends Error {\n code = 'AI_SERVICE_OVERLOADED';\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { type LLMModel } from '@dxos/ai';\n\nconst ModelProviders = ['dxos-local', 'dxos-remote', 'lm-studio'] as const;\n\nconst ModelProvider = Schema.Literal(...ModelProviders);\ntype ModelProvider = Schema.Schema.Type<typeof ModelProvider>;\n\nexport type AiServicePreset = {\n id: string;\n provider: ModelProvider;\n model: LLMModel;\n label?: string;\n};\n\nconst createModelLabel = (model: LLMModel) => {\n const parts = model.split('/');\n return parts[parts.length - 1];\n};\n\n// TODO(burdon): Users should be able to create and edit presets.\nexport const AiServicePresets: AiServicePreset[] = [\n {\n provider: 'dxos-remote' as const,\n model: '@anthropic/claude-3-5-haiku-20241022' as const,\n },\n {\n provider: 'dxos-remote' as const,\n model: '@anthropic/claude-opus-4-0' as const,\n },\n {\n provider: 'lm-studio' as const,\n model: '@google/gemma-3-12b' as const,\n },\n {\n provider: 'lm-studio' as const,\n model: '@mlx-community/llama-3.2-3b-instruct' as const,\n },\n].map(\n ({ model, provider }, i) =>\n ({\n id: `preset-${i}`,\n provider,\n model,\n label: createModelLabel(model),\n }) satisfies AiServicePreset,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { effect } from '@preact/signals-react';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { type ContextBinder } from '@dxos/assistant';\nimport { Blueprint } from '@dxos/blueprints';\nimport { type Space } from '@dxos/client/echo';\nimport { Obj, Ref } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { isNonNullable } from '@dxos/util';\n\nexport type UpdateCallback = (key: string, active: boolean) => void;\n\n/**\n * Get collection of active blueprints based on the context.\n */\nexport const useBlueprints = (\n space: Space,\n context: ContextBinder,\n blueprintRegistry?: Blueprint.Registry,\n): [Blueprint.Blueprint[], UpdateCallback] => {\n const [blueprints, setBlueprints] = useState<Blueprint.Blueprint[]>([]);\n useEffect(() => {\n let t: NodeJS.Timeout;\n effect(() => {\n const refs = [...(context.blueprints.value ?? [])];\n t = setTimeout(async () => {\n const blueprints = (await Ref.Array.loadAll(refs)).filter(isNonNullable);\n setBlueprints(blueprints);\n });\n });\n\n return () => clearTimeout(t);\n }, [context]);\n\n const handleUpdate = useCallback<UpdateCallback>(\n (key: string, active: boolean) => {\n log.info('update', { key, active });\n if (active) {\n // TODO(burdon): Check if already in space.\n const blueprint = blueprintRegistry?.getByKey(key);\n if (blueprint) {\n // TODO(dmaretskyi): This should be done by Obj.clone.\n const { id: _id, ...data } = blueprint;\n const obj = space.db.add(Obj.make(Blueprint.Blueprint, data));\n void context.bind({ blueprints: [Ref.make(obj)] });\n }\n }\n },\n [space, context],\n );\n\n return [blueprints, handleUpdate] as const;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Layer } from 'effect';\nimport { useMemo } from 'react';\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect';\n\nimport { type AiService, type ToolExecutionService, type ToolResolverService } from '@dxos/ai';\nimport { Capabilities, useCapabilities } from '@dxos/app-framework';\nimport { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';\nimport { type Space } from '@dxos/client/echo';\nimport {\n ComputeEventLogger,\n CredentialsService,\n DatabaseService,\n LocalFunctionExecutionService,\n QueueService,\n RemoteFunctionExecutionService,\n TracingService,\n} from '@dxos/functions';\n\nimport { AssistantCapabilities } from '../capability-definitions';\n\nexport * from '@dxos/assistant';\n\n// TODO(burdon): Deconstruct into separate layers?\nexport type ChatServices =\n | AiService\n | CredentialsService\n | DatabaseService\n | QueueService\n | RemoteFunctionExecutionService\n | ToolResolverService\n | ToolExecutionService\n | TracingService;\n\nexport type UseChatServicesProps = {\n space?: Space;\n};\n\n/**\n * Construct service layer.\n */\nexport const useChatServices = ({ space }: UseChatServicesProps): Layer.Layer<ChatServices> | undefined => {\n const aiServiceLayer =\n useCapabilities(AssistantCapabilities.AiServiceLayer).at(0) ?? Layer.die('AiService not found');\n const functions = useCapabilities(Capabilities.Functions).flat();\n\n return useMemo(() => {\n return Layer.mergeAll(\n aiServiceLayer,\n makeToolResolverFromFunctions(functions),\n makeToolExecutionServiceFromFunctions(functions),\n\n CredentialsService.configuredLayer([]),\n space ? DatabaseService.makeLayer(space.db) : DatabaseService.notAvailable,\n space ? QueueService.makeLayer(space.queues) : QueueService.notAvailable,\n\n ComputeEventLogger.layerFromTracing,\n ).pipe(\n Layer.provideMerge(TracingService.layerNoop),\n Layer.provideMerge(LocalFunctionExecutionService.layer),\n Layer.provideMerge(RemoteFunctionExecutionService.mockLayer),\n );\n }, [space, useDeepCompareMemoize(functions.map((f) => f.name))]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Layer } from 'effect';\n\nimport { type AiService } from '@dxos/ai';\nimport { defineCapability } from '@dxos/app-framework';\n\nimport { ASSISTANT_PLUGIN } from './meta';\n\nexport namespace AssistantCapabilities {\n export type AiServiceLayer = Layer.Layer<AiService>;\n export const AiServiceLayer = defineCapability<AiServiceLayer>(`${ASSISTANT_PLUGIN}/capability/ai-service-factory`);\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { Capabilities, useCapabilities } from '@dxos/app-framework';\nimport { type Space } from '@dxos/client/echo';\nimport { Filter, Obj, type Type } from '@dxos/echo';\nimport { type ReferencesProvider } from '@dxos/react-ui-chat';\n\n/**\n * Resolve references to objects in the space.\n */\nexport const useReferencesProvider = (space?: Space): ReferencesProvider | undefined => {\n // TODO(burdon): Pass in.\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n\n return useMemo<ReferencesProvider | undefined>((): ReferencesProvider | undefined => {\n if (!space) {\n return undefined;\n }\n\n return {\n getReferences: async ({ query }) => {\n const schemas = artifactDefinitions.map((artifact) => artifact.schema);\n const { objects } = await space.db\n .query(Filter.or(...schemas.map((schema) => Filter.type(schema as Type.Schema))))\n .run();\n\n return (\n objects\n // TODO(burdon): Remove cast ??? (+ two instances below).\n // .map((object) => {\n // log.info('object', { object, label: Obj.getLabel(object as any) });\n // return object;\n // })\n .filter((object) => stringMatch(query, Obj.getLabel(object as any) ?? ''))\n // TODO(dmaretskyi): `Type.getDXN` (at the point of writing) didn't work here as it was schema-only.\n .filter((object) => !!Obj.getDXN(object as Obj.Any))\n .map((object) => ({\n uri: Obj.getDXN(object as any)!.toString(),\n label: Obj.getLabel(object as any) ?? '',\n }))\n );\n },\n resolveReference: async ({ uri }) => {\n const object = await space.db.query(Filter.ids(uri)).first();\n return { uri, label: Obj.getLabel(object) ?? '' };\n },\n } satisfies ReferencesProvider;\n }, [space, artifactDefinitions]);\n};\n\nconst stringMatch = (query: string, label: string) => label.toLowerCase().startsWith(query.toLowerCase());\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createTool, type ExecutableTool, ToolResult } from '@dxos/ai';\nimport { Type } from '@dxos/echo';\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\n// TODO(burdon): Move to @dxos/ai.\nexport const convertFunctionToTool = (\n fn: FunctionType,\n edgeUrl: string,\n spaceId?: SpaceId | undefined,\n): ExecutableTool | undefined => {\n if (!fn.description || !fn.inputSchema) {\n return undefined;\n }\n const existingFunctionUrl = getUserFunctionUrlInMetadata(getMeta(fn));\n if (!existingFunctionUrl) {\n return undefined;\n }\n\n const url = getInvocationUrl(existingFunctionUrl, edgeUrl, { spaceId });\n\n return createTool('user-function', {\n name: fn.name,\n description: fn.description,\n schema: Type.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\n return ToolResult.Success(await response.text());\n },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema } from 'effect';\nimport jsonpointer from 'jsonpointer';\nimport { type OpenAPIV2, type OpenAPIV3_1 } from 'openapi-types';\n\nimport { type ExecutableTool, ToolResult, createRawTool } from '@dxos/ai';\nimport { Type } from '@dxos/echo';\nimport { normalizeSchema } 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<ExecutableTool[]> => {\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 (\n url: string,\n options?: CreateToolsFromApiOptions,\n): Promise<ExecutableTool[]> => {\n const res = await fetch(url);\n const spec = (await res.json()) as OpenAPIV2.Document;\n log('spec', { spec });\n\n const tools: ExecutableTool[] = [];\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n if (typeof pathItem !== 'object') {\n continue;\n }\n\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: Type.JsonSchema = {\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 Schema.validateSync(Type.JsonSchema)(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 // TODO(burdon): Namespace?\n createRawTool('openapi', {\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\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 = Type.toEffectSchema(parameter.schema);\n Schema.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 2025 DXOS.org\n//\n\nimport React, { useState, useEffect, Fragment, type FC } from 'react';\n\nimport { parseToolName, type Tool } from '@dxos/ai';\nimport { Capabilities, useCapabilities } from '@dxos/app-framework';\nimport { type ArtifactDefinition } from '@dxos/blueprints';\nimport { type Blueprint } from '@dxos/blueprints';\nimport { type Ref } from '@dxos/echo';\nimport { FunctionType } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { type ChatProcessor } from '../../hooks';\nimport { meta } from '../../meta';\nimport { createToolsFromService } from '../../tools';\nimport { ServiceType } from '../../types';\n\nexport type ToolboxProps = ThemedClassName<{\n blueprints?: readonly Ref.Ref<Blueprint.Blueprint>[];\n artifacts?: ArtifactDefinition[];\n services?: { service: ServiceType; tools: Tool[] }[];\n functions?: FunctionType[];\n activeBlueprints?: readonly Ref.Ref<Blueprint.Blueprint>[];\n striped?: boolean;\n}>;\n\nexport const Toolbox = ({\n classNames,\n artifacts,\n functions,\n services,\n blueprints,\n activeBlueprints,\n striped,\n}: ToolboxProps) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <div className={mx('flex flex-col overflow-y-auto box-content', classNames)}>\n {blueprints && blueprints.length > 0 && (\n <Section\n title='Blueprints'\n items={blueprints.map(({ target }) => ({\n name: target?.name ?? '',\n description: target?.description ?? '',\n subitems: target?.tools.map((toolId) => ({ name: `∙ ${parseToolName(toolId)}` })),\n }))}\n />\n )}\n\n {activeBlueprints && activeBlueprints.length > 0 && (\n <Section\n title='Blueprints'\n items={activeBlueprints.map(({ target }) => ({\n name: target?.name ?? '',\n description: target?.description ?? '',\n subitems: target?.tools.map((toolId) => ({ name: `∙ ${parseToolName(toolId)}` })),\n }))}\n />\n )}\n\n {artifacts && artifacts.length > 0 && (\n <Section\n title='Artifacts'\n items={artifacts.map(({ name, description, tools }) => ({\n name,\n description,\n subitems: tools.map(({ name, description }) => ({ name: `∙ ${parseToolName(name)}`, description })),\n }))}\n />\n )}\n\n {services && services.length > 0 && (\n <Section\n title='Services'\n items={services.map(({ service: { serviceId, name, description }, tools }) => ({\n name: name ?? serviceId,\n description,\n subitems: tools.map(({ name, description }) => ({ name: `∙ ${name}`, description })),\n }))}\n />\n )}\n\n {functions && functions.length > 0 && (\n <Section title='Functions' items={functions.map(({ name, description }) => ({ name, description }))} />\n )}\n\n {!blueprints?.length &&\n !activeBlueprints?.length &&\n !artifacts?.length &&\n !services?.length &&\n !functions?.length && <div>{t('no tools')}</div>}\n </div>\n );\n};\n\nconst Section: FC<{\n title: string;\n items: { name: string; description?: string; subitems?: { name: string; description?: string }[] }[];\n striped?: boolean;\n}> = ({ title, items, striped }) => {\n const stripeClassNames = 'odd:bg-neutral-50 dark:odd:bg-neutral-800';\n const gridClassNames = 'grid grid-cols-[8rem_1fr]';\n const subGridClassNames = mx('col-span-full grid grid-cols-subgrid text-xs px-2', striped && stripeClassNames);\n\n return (\n <div>\n <h1 className='px-2 text-sm'>{title}</h1>\n <div className={gridClassNames}>\n {items.map(({ name, description, subitems }, i) => (\n <Fragment key={i}>\n {name && (\n <div className={subGridClassNames}>\n <div className='truncate text-primary-500'>{name}</div>\n <div className='line-clamp-2'>{description}</div>\n </div>\n )}\n {subitems?.map(({ name, description }, i) => (\n <div key={i} className={mx(subGridClassNames, striped && stripeClassNames)}>\n <div className='truncate'>{name}</div>\n <div className='line-clamp-3 text-subdued'>{description}</div>\n </div>\n ))}\n </Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nexport type ToolboxContainerProps = ThemedClassName<{\n space?: Space;\n processor?: ChatProcessor;\n}>;\n\nexport const ToolboxContainer = ({ classNames, space, processor }: ToolboxContainerProps) => {\n // Plugin artifacts.\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n\n // Registered services.\n const services = useQuery(space, Filter.type(ServiceType));\n const [serviceTools, setServiceTools] = useState<{ service: ServiceType; tools: Tool[] }[]>([]);\n useEffect(() => {\n log('creating service tools...', { services: services.length });\n queueMicrotask(async () => {\n const tools = await Promise.all(\n services.map(async (service) => ({ service, tools: await createToolsFromService(service) })),\n );\n\n setServiceTools(tools);\n });\n }, [services]);\n\n // Deployed functions.\n const functions = useQuery(space, Filter.type(FunctionType));\n\n return (\n <Toolbox\n classNames={classNames}\n blueprints={processor?.context.blueprints.value}\n artifacts={artifactDefinitions}\n services={serviceTools}\n functions={functions}\n />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension, Prec } from '@codemirror/state';\nimport { keymap } from '@codemirror/view';\nimport { createContext } from '@radix-ui/react-context';\nimport { dedupeWith } from 'effect/Array';\nimport React, { type PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { CollaborationActions, createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { Event } from '@dxos/async';\nimport { DXN, Obj, Ref } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { useVoiceInput } from '@dxos/plugin-transcription';\nimport { type Expando, getSpace, useQueue, type Space } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Input, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { ChatEditor, type ChatEditorController, type ChatEditorProps, references } from '@dxos/react-ui-chat';\nimport { type ScrollController } from '@dxos/react-ui-components';\nimport { mx } from '@dxos/react-ui-theme';\nimport { DataType } from '@dxos/schema';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { type ChatEvent } from './events';\nimport { type ChatProcessor, useBlueprints, useReferencesProvider } from '../../hooks';\nimport { meta } from '../../meta';\nimport { type Assistant } from '../../types';\nimport {\n ChatActions,\n type ChatActionsProps,\n ChatOptionsMenu,\n ChatPresets,\n type ChatPresetsProps,\n ChatReferences,\n type ChatReferencesProps,\n ChatStatusIndicator,\n} from '../ChatPrompt';\nimport { ChatThread as NativeChatThread, type ChatThreadProps as NativeChatThreadProps } from '../ChatThread';\n\n// TODO(burdon): Factor out.\nconst Endcap = ({ children }: PropsWithChildren) => {\n return (\n <div className='grid w-[var(--rail-action)] h-[var(--rail-action)] items-center justify-center'>{children}</div>\n );\n};\n\n//\n// Context\n// NOTE: The context should not be exported. It is only used internally.\n// Components outside of this Radix-style group shuld define their own APIs.\n//\n\n// TODO(burdon): Inject via effect layer.\ntype ChatContextValue = {\n debug?: boolean;\n event: Event<ChatEvent>;\n space: Space;\n chat: Assistant.Chat;\n processor: ChatProcessor;\n messages: DataType.Message[];\n\n /** @deprecated Remove and replace with context. */\n artifact?: Expando;\n};\n\n// NOTE: Do not export.\nconst [ChatContextProvider, useChatContext] = createContext<ChatContextValue>('Chat');\n\n//\n// Root\n//\n\ntype ChatRootProps = ThemedClassName<\n PropsWithChildren<\n Pick<ChatContextValue, 'chat' | 'processor' | 'artifact'> & {\n onEvent?: (event: ChatEvent) => void;\n }\n >\n>;\n\nconst ChatRoot = ({ classNames, children, chat, processor, artifact, onEvent, ...props }: ChatRootProps) => {\n const [debug, setDebug] = useState(false);\n const space = getSpace(chat);\n\n // Messages.\n const queue = useQueue<DataType.Message>(chat?.queue.dxn);\n const messages = useMemo(\n () =>\n dedupeWith(\n [...(queue?.objects?.filter(Obj.instanceOf(DataType.Message)) ?? []), ...(processor?.messages.value ?? [])],\n (a, b) => a.id === b.id,\n ),\n [queue?.objects, processor?.messages.value],\n );\n\n // TODO(burdon): Replace with tool.\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n useEffect(() => {\n if (!processor?.streaming.value && queue?.objects && artifact) {\n const message = queue.objects[queue.objects.length - 1];\n if (dispatch && space && chat && message) {\n void dispatch(\n createIntent(CollaborationActions.InsertContent, {\n target: artifact,\n object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...chat.queue.dxn.parts, message.id])),\n label: 'View proposal',\n }),\n );\n }\n }\n }, [queue, processor?.streaming.value]);\n\n // Events.\n const event = useMemo(() => new Event<ChatEvent>(), []);\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'toggle-debug': {\n setDebug((debug) => !debug);\n break;\n }\n\n case 'submit': {\n if (!processor.streaming.value) {\n void processor.request(event.text);\n }\n break;\n }\n\n case 'cancel': {\n void processor.cancel();\n break;\n }\n\n default: {\n onEvent?.(event);\n }\n }\n });\n }, [event, onEvent]);\n\n if (!space) {\n return null;\n }\n\n return (\n <ChatContextProvider\n debug={debug}\n event={event}\n chat={chat}\n space={space}\n processor={processor}\n messages={messages}\n {...props}\n >\n <div role='none' className={mx('flex flex-col h-full overflow-hidden', classNames)}>\n {children}\n </div>\n </ChatContextProvider>\n );\n};\n\nChatRoot.displayName = 'Chat.Root';\n\n//\n// Thread\n//\n\ntype ChatThreadProps = Omit<NativeChatThreadProps, 'identity' | 'space' | 'messages' | 'tools' | 'onEvent'>;\n\nconst ChatThread = (props: ChatThreadProps) => {\n const { debug, event, space, processor, messages } = useChatContext(ChatThread.displayName);\n const identity = useIdentity();\n\n const scrollerRef = useRef<ScrollController>(null);\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'submit':\n case 'scroll-to-bottom':\n scrollerRef.current?.scrollToBottom('smooth');\n break;\n }\n });\n }, [event]);\n\n if (!identity) {\n return null;\n }\n\n return (\n <NativeChatThread\n {...props}\n ref={scrollerRef}\n debug={debug}\n identity={identity}\n space={space}\n messages={messages}\n tools={processor?.tools}\n onEvent={(ev) => event.emit(ev)}\n />\n );\n};\n\nChatThread.displayName = 'Chat.Thread';\n\n//\n// Prompt\n//\n\ntype ChatPromptProps = ThemedClassName<\n Pick<ChatEditorProps, 'placeholder'> &\n Omit<ChatPresetsProps, 'onChange'> & {\n expandable?: boolean;\n online?: boolean;\n onChangeOnline?: (online: boolean) => void;\n onChangePreset?: ChatPresetsProps['onChange'];\n }\n>;\n\nconst ChatPrompt = ({\n classNames,\n placeholder,\n expandable,\n online,\n presets,\n preset,\n onChangePreset,\n onChangeOnline,\n}: ChatPromptProps) => {\n const { t } = useTranslation(meta.id);\n const { space, event, processor } = useChatContext(ChatPrompt.displayName);\n\n const [active, setActive] = useState(false);\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'record-start':\n setActive(true);\n break;\n case 'record-stop':\n setActive(false);\n break;\n }\n });\n }, [event]);\n\n const editorRef = useRef<ChatEditorController>(null);\n\n // TODO(burdon): Configure capability in TranscriptionPlugin.\n const { recording } = useVoiceInput({\n active,\n onUpdate: (text) => {\n editorRef.current?.setText(text);\n editorRef.current?.focus();\n },\n });\n\n const [blueprints, handleUpdateBlueprints] = useBlueprints(space, processor.context, processor.blueprintRegistry);\n\n // TODO(burdon): Reconcile with object tags.\n const contextProvider = useReferencesProvider(space);\n const extensions = useMemo<Extension[]>(() => {\n return [\n contextProvider && references({ provider: contextProvider }),\n expandable &&\n Prec.highest(\n keymap.of([\n {\n key: 'cmd-d',\n preventDefault: true,\n run: () => {\n event.emit({ type: 'toggle-debug' });\n return true;\n },\n },\n {\n key: 'cmd-ArrowUp',\n preventDefault: true,\n run: () => {\n event.emit({ type: 'thread-open' });\n return true;\n },\n },\n {\n key: 'cmd-ArrowDown',\n preventDefault: true,\n run: () => {\n event.emit({ type: 'thread-close' });\n return true;\n },\n },\n ]),\n ),\n ].filter(isNotFalsy);\n }, [event, expandable, contextProvider]);\n\n const handleSubmit = useCallback<NonNullable<ChatEditorProps['onSubmit']>>(\n (text) => {\n if (!processor.streaming.value) {\n event.emit({ type: 'submit', text });\n return true;\n }\n },\n [processor, event],\n );\n\n const handleEvent = useCallback<NonNullable<ChatActionsProps['onEvent']>>(\n (ev) => {\n event.emit(ev);\n },\n [event],\n );\n\n // TODO(burdon): Update context.\n const handleUpdateReferences = useCallback<NonNullable<ChatReferencesProps['onUpdate']>>((ids) => {\n log.info('update', { ids });\n }, []);\n\n return (\n <div\n className={mx(\n 'is-full grid grid-cols-[var(--rail-action)_1fr_var(--rail-action)] grid-rows-[min-content_min-content_min-content]',\n classNames,\n )}\n >\n <Endcap>\n <ChatStatusIndicator preset={preset} error={processor.error.value} processing={processor.streaming.value} />\n </Endcap>\n\n <ChatEditor\n ref={editorRef}\n autoFocus\n lineWrapping\n classNames='col-span-2 pis-1 pbs-2'\n placeholder={placeholder ?? t('prompt placeholder')}\n extensions={extensions}\n onSubmit={handleSubmit}\n />\n\n <div />\n <ChatReferences\n classNames='col-span-2 flex pis-1 items-center'\n space={space}\n context={processor.context}\n onUpdate={handleUpdateReferences}\n />\n\n <ChatOptionsMenu\n blueprintRegistry={processor.blueprintRegistry}\n blueprints={blueprints}\n onChange={handleUpdateBlueprints}\n />\n <ChatActions\n classNames='col-span-2'\n microphone={true}\n recording={recording}\n processing={processor.streaming.value}\n onEvent={handleEvent}\n >\n <>\n <div className='grow' />\n {presets && <ChatPresets preset={preset} presets={presets} onChange={onChangePreset} />}\n {online !== undefined && (\n <Input.Root>\n <Input.Switch classNames='mis-2 mie-2' checked={online} onCheckedChange={onChangeOnline} />\n </Input.Root>\n )}\n </>\n </ChatActions>\n </div>\n );\n};\n\nChatPrompt.displayName = 'Chat.Prompt';\n\n//\n// Chat\n//\n\nexport const Chat = {\n Root: ChatRoot,\n Thread: ChatThread,\n Prompt: ChatPrompt,\n};\n\nexport type { ChatRootProps, ChatThreadProps, ChatPromptProps, ChatEvent };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren } from 'react';\n\nimport { IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { meta } from '../../meta';\nimport { type ChatEvent } from '../Chat';\n\nexport type ChatActionsProps = ThemedClassName<\n PropsWithChildren<{\n microphone?: boolean;\n recording?: boolean;\n processing?: boolean;\n onEvent?: (event: ChatEvent) => void;\n }>\n>;\n\nexport const ChatActions = ({ classNames, children, microphone, recording, processing, onEvent }: ChatActionsProps) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <div className={mx('flex items-center mie-1', classNames)}>\n {children}\n\n {(processing && (\n <IconButton\n disabled={!processing}\n classNames='px-1.5'\n variant='ghost'\n size={5}\n icon='ph--x--regular'\n iconOnly\n label={t('button cancel processing')}\n onClick={() => onEvent?.({ type: 'cancel' })}\n />\n )) || (\n <IconButton\n disabled\n classNames='px-1.5'\n variant='ghost'\n size={5}\n icon='ph--arrow-down--regular'\n iconOnly\n label={t('button scroll down')}\n onClick={() => onEvent?.({ type: 'scroll-to-bottom' })}\n />\n )}\n\n {microphone && (\n <IconButton\n disabled={!processing}\n classNames={mx('px-1.5', recording && 'bg-primary-500')}\n variant='ghost'\n size={5}\n icon='ph--microphone--regular'\n iconOnly\n noTooltip\n label={t('button microphone')}\n onMouseDown={() => onEvent?.({ type: 'record-start' })}\n onMouseUp={() => onEvent?.({ type: 'record-stop' })}\n onTouchStart={() => onEvent?.({ type: 'record-start' })}\n onTouchEnd={() => onEvent?.({ type: 'record-stop' })}\n />\n )}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { type Blueprint } from '@dxos/blueprints';\nimport { DropdownMenu, IconButton, Input, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '../../meta';\n\nexport type ChatOptionsMenuProps = {\n blueprintRegistry?: Blueprint.Registry;\n blueprints?: Blueprint.Blueprint[];\n onChange?: (key: string, active: boolean) => void;\n};\n\nexport const ChatOptionsMenu = ({ blueprintRegistry, blueprints, onChange }: ChatOptionsMenuProps) => {\n const { t } = useTranslation(meta.id);\n const blueprintOptions = useMemo(\n () => blueprintRegistry?.query().map((blueprint) => ({ key: blueprint.key, label: blueprint.name })),\n [blueprintRegistry],\n );\n\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild disabled={!blueprintOptions?.length}>\n <IconButton icon='ph--plus--regular' variant='ghost' size={5} iconOnly label={t('button add blueprint')} />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content side='left'>\n <DropdownMenu.Viewport>\n {blueprintOptions?.map((option) => (\n <DropdownMenu.Item key={option.key}>\n <Input.Root>\n <Input.Checkbox\n checked={!!blueprints?.find((blueprint) => blueprint.key === option.key)}\n onCheckedChange={(checked) => onChange?.(option.key, !!checked)}\n />\n {/* TODO(burdon): Remove need for custom margin. */}\n {/* TODO(burdon): Clicking on label doesn't toggle checkbox. */}\n <Input.Label classNames='m-0'>{option.label}</Input.Label>\n </Input.Root>\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Select } from '@dxos/react-ui';\n\nexport type ChatPresetsProps = {\n presets?: { id: string; label: string }[];\n preset?: string;\n onChange?: (id: string) => void;\n};\n\nexport const ChatPresets = ({ presets, preset, onChange }: ChatPresetsProps) => {\n return (\n <Select.Root value={preset} onValueChange={onChange}>\n <Select.TriggerButton classNames='text-sm' />\n <Select.Content>\n {presets?.map(({ id, label }) => (\n <Select.Option key={id} value={id} classNames='text-sm'>\n {label}\n </Select.Option>\n ))}\n </Select.Content>\n </Select.Root>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { type ContextBinder } from '@dxos/assistant';\nimport { type Space } from '@dxos/client/echo';\nimport { Filter, Obj, Ref } from '@dxos/echo';\nimport { type ThemedClassName, useAsyncState, useTranslation } from '@dxos/react-ui';\nimport { TagPicker, type TagPickerItemData, type TagPickerOptions } from '@dxos/react-ui-tag-picker';\nimport { mx } from '@dxos/react-ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '../../meta';\n\nexport type ChatReferencesProps = ThemedClassName<{\n space: Space;\n context: ContextBinder;\n onUpdate?: (ids: string[]) => void;\n}>;\n\nexport const ChatReferences = ({ classNames, space, context, onUpdate }: ChatReferencesProps) => {\n const { t: _t } = useTranslation(meta.id);\n\n const [items] = useAsyncState<TagPickerItemData[]>(async () => {\n const objects = await Ref.Array.loadAll(context.objects.value ?? []);\n return objects.filter(isNonNullable).map((obj) => ({ id: obj.id, label: Obj.getLabel(obj) ?? obj.id }));\n }, [context]);\n\n const handleSearch = useCallback<NonNullable<TagPickerOptions['onSearch']>>(\n (text, ids) => {\n // TODO(burdon): Filter by Item tag (e.g., exclude \"contacts\") and Query by object label.\n // TODO(burdon): Change to Filter.text().\n const objects = space.db.query(Filter.everything()).runSync();\n return objects\n .map(({ object }) => ({ id: object.id, label: Obj.getLabel(object) ?? '' }))\n .filter(({ id, label }) => !ids.includes(id) && label.toLocaleLowerCase().includes(text.toLocaleLowerCase()));\n },\n [space],\n );\n\n return (\n <TagPicker\n classNames={mx('h-[1.75rem] text-sm', classNames)}\n mode='multi-select'\n // placeholder={t('context objects placeholder')}\n items={items}\n onSearch={handleSearch}\n onUpdate={onUpdate}\n />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useState } from 'react';\n\nimport { Icon, Tooltip, useTimeout } from '@dxos/react-ui';\nimport { Spinner } from '@dxos/react-ui-sfx';\nimport { errorText } from '@dxos/react-ui-theme';\n\nexport type ChatStatusIndicatorProps = {\n preset?: string;\n error?: Error;\n processing?: boolean;\n};\n\nexport const ChatStatusIndicator = ({ preset, error, processing }: ChatStatusIndicatorProps) => {\n const [init, setInit] = useState(false);\n useEffect(() => {\n setInit(false);\n }, [preset]);\n useTimeout(\n async () => {\n setInit(true);\n },\n 1_500,\n [preset],\n );\n\n if (error) {\n return (\n <Tooltip.Trigger content={error.message} delayDuration={0}>\n <Icon icon='ph--warning-circle--regular' classNames={errorText} size={5} />\n </Tooltip.Trigger>\n );\n }\n\n return <Spinner state={!init ? 'flash' : processing ? 'spin' : 'pulse'} />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type CSSProperties, forwardRef, useMemo } from 'react';\n\nimport { PublicKey } from '@dxos/keys';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { ScrollContainer, type ScrollController } from '@dxos/react-ui-components';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type DataType } from '@dxos/schema';\nimport { keyToFallback } from '@dxos/util';\n\nimport { ChatMessage, type ChatMessageProps } from './ChatMessage';\nimport { messageReducer } from './reducer';\n\nexport type ChatThreadProps = ThemedClassName<\n {\n identity?: Identity;\n messages?: DataType.Message[];\n collapse?: boolean;\n } & Pick<ChatMessageProps, 'debug' | 'space' | 'processor' | 'tools' | 'onEvent'>\n>;\n\nexport const ChatThread = forwardRef<ScrollController, ChatThreadProps>(\n ({ classNames, identity, messages, collapse = true, ...props }, forwardedRef) => {\n const userHue = useMemo(() => {\n return identity?.profile?.data?.hue || keyToFallback(identity?.identityKey ?? PublicKey.random()).hue;\n }, [identity]);\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: filteredMessages = [] } = useMemo(() => {\n if (collapse) {\n return (messages ?? []).reduce<{ messages: DataType.Message[]; current?: DataType.Message }>(messageReducer, {\n messages: [],\n });\n } else {\n return { messages: messages ?? [] };\n }\n }, [messages, collapse]);\n\n return (\n <ScrollContainer ref={forwardedRef} classNames={classNames} fade>\n <div\n role='none'\n className={mx(filteredMessages.length > 0 && 'pbs-4 pbe-4')}\n style={{ '--user-fill': `var(--dx-${userHue}Fill)` } as CSSProperties}\n >\n {filteredMessages.map((message) => (\n <ChatMessage key={message.id} message={message} {...props} />\n ))}\n </div>\n </ScrollContainer>\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { Fragment, type FC, type PropsWithChildren } from 'react';\n\nimport { type Tool } from '@dxos/ai';\nimport { Surface } from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { type Space } from '@dxos/react-client/echo';\nimport { Button, Icon, IconButton, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport {\n MarkdownViewer,\n ToggleContainer as NativeToggleContainer,\n type ToggleContainerProps,\n} from '@dxos/react-ui-components';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type ContentBlock, type DataType } from '@dxos/schema';\nimport { safeParseJson } from '@dxos/util';\n\nimport { Json, ToolBlock, isToolMessage } from './ToolBlock';\nimport { type ChatProcessor } from '../../hooks';\nimport { meta } from '../../meta';\nimport { type ChatEvent } from '../Chat';\nimport { ToolboxContainer } from '../Toolbox';\n\nexport type ChatMessageProps = ThemedClassName<{\n debug?: boolean;\n space?: Space;\n message: DataType.Message;\n // TODO(burdon): Move to context.\n processor?: ChatProcessor;\n tools?: Tool[];\n onEvent?: (event: ChatEvent) => void;\n}>;\n\nexport const ChatMessage = ({ classNames, debug, space, message, processor, tools, onEvent }: ChatMessageProps) => {\n const { t } = useTranslation(meta.id);\n const {\n sender: { role },\n blocks,\n } = message;\n\n // TODO(burdon): Restructure types to make check unnecessary.\n if (isToolMessage(message)) {\n return (\n <MessageContainer classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}>\n <ToolBlock classNames={panelClasses} message={message} tools={tools} />\n </MessageContainer>\n );\n }\n\n return (\n <>\n {debug && (\n <div className={mx('flex justify-end text-subdued', marginClasses)}>\n <pre className='text-xs'>{JSON.stringify({ created: message.created })}</pre>\n </div>\n )}\n\n {blocks.map((block, idx) => {\n // TODO(burdon): Filter empty messages.\n if (block._tag === 'text' && block.text.replaceAll(/\\s+/g, '').length === 0) {\n return null;\n }\n\n const Component: BlockComponent = components[block._tag] ?? components.default!;\n if (!Component) {\n return null;\n }\n\n return (\n <Fragment key={idx}>\n <MessageContainer classNames={classNames} user={block._tag === 'text' && role === 'user'}>\n <Component space={space} processor={processor} block={block} onEvent={onEvent} />\n </MessageContainer>\n {debug && (\n <div className={mx('flex justify-end text-subdued', marginClasses)}>\n <pre className='text-xs'>{JSON.stringify({ block: block._tag })}</pre>\n </div>\n )}\n </Fragment>\n );\n })}\n <div className={mx('flex justify-end pbs-2 pbe-2 opacity-50 hover:opacity-100', marginClasses)}>\n <IconButton\n classNames='animate-[fadeIn_0.5s]'\n icon='ph--trash--regular'\n iconOnly\n label={t('button delete message')}\n onClick={() => onEvent?.({ type: 'delete', id: message.id })}\n />\n </div>\n </>\n );\n};\n\ntype BlockComponentProps = {\n space?: Space;\n block: ContentBlock.Any;\n /** @deprecated Replace with context */\n processor?: ChatProcessor;\n onEvent?: (event: ChatEvent) => void;\n};\n\ntype BlockComponent = FC<BlockComponentProps>;\n\nconst components: Partial<Record<ContentBlock.Any['_tag'] | 'default', BlockComponent>> = {\n //\n // Text\n //\n ['text' as const]: ({ block }) => {\n invariant(block._tag === 'text');\n // const [open, setOpen] = useState(block.disposition === 'cot' && block.pending);\n const title = block.disposition ? titles[block.disposition] : undefined;\n if (!title) {\n return <MarkdownViewer content={block.text} />;\n }\n\n // TOOD(burdon): Store last time user opened/closed COT.\n // Autoclose when streaming ends.\n // useEffect(() => {\n // if (block.disposition === 'cot' && !block.pending) {\n // setOpen(false);\n // }\n // }, [block.disposition, block.pending]);\n\n return (\n <ToggleContainer\n // open={open}\n defaultOpen={systemDispositions.includes(block.disposition ?? '') && block.pending}\n title={title}\n icon={\n block.pending ? (\n <Icon icon={'ph--circle-notch--regular'} classNames='text-subdued animate-spin' size={4} />\n ) : undefined\n }\n >\n <MarkdownViewer\n content={block.text}\n classNames={['pbe-2', systemDispositions.includes(block.disposition ?? '') && 'text-sm text-subdued']}\n />\n </ToggleContainer>\n );\n },\n\n //\n // JSON\n //\n ['json' as const]: ({ space, processor, block, onEvent }) => {\n invariant(block._tag === 'json');\n\n switch (block.disposition) {\n case 'tool_list': {\n return (\n <ToggleContainer title={titles[block.disposition]} defaultOpen={true}>\n <ToolboxContainer space={space} processor={processor} classNames='pbe-2' />\n </ToggleContainer>\n );\n }\n\n case 'suggest': {\n const { text = '' }: { text: string } = safeParseJson(block.data ?? '{}') ?? ({} as any);\n return (\n <IconButton icon='ph--lightning--regular' label={text} onClick={() => onEvent?.({ type: 'submit', text })} />\n );\n }\n\n case 'select': {\n const { options = [] }: { options: string[] } = safeParseJson(block.data ?? '{}') ?? ({} as any);\n return (\n <div className='flex flex-wrap gap-1'>\n {options.map((text, idx) => (\n <Button\n classNames={'animate-[fadeIn_0.5s] rounded-sm text-sm'}\n key={idx}\n onClick={() => onEvent?.({ type: 'submit', text })}\n >\n {text}\n </Button>\n ))}\n </div>\n );\n }\n\n case 'graph': {\n return (\n <div className='flex flex-wrap gap-1'>\n <Surface\n role='card'\n data={{ subject: JSON.parse(block.data ?? '{}') }}\n limit={1}\n fallback={<div className='font-mono text-xs text-pre'>{block.data}</div>}\n />\n {onEvent && (\n <IconButton\n icon='ph--plus--regular'\n label='Add to graph'\n onClick={() => onEvent?.({ type: 'add', object: JSON.parse(block.data ?? '{}') })}\n />\n )}\n </div>\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.data ?? block)} />\n </ToggleContainer>\n );\n }\n }\n },\n\n //\n // Default\n //\n default: ({ block }) => {\n let title = titles[block._tag];\n if (block._tag === 'toolCall') {\n title = `Tool [${block.name}]`; // TODO(burdon): Get label from tool.\n } else {\n title = block._tag;\n }\n\n return (\n <ToggleContainer title={title ?? 'JSON'}>\n <Json data={block} />\n </ToggleContainer>\n );\n },\n};\n\n// TODO(burdon): Translations.\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 ['tool_list' as const]: 'Tools',\n ['artifact-update' as const]: 'Artifact(s) changed',\n};\n\nconst systemDispositions: string[] = ['cot', 'artifact-update'];\n\nconst panelClasses = 'flex flex-col is-full bg-activeSurface rounded-sm';\nconst marginClasses = 'pie-4 pis-4';\nconst paddingClasses = 'pis-2 pie-2 pbs-0.5 pbe-0.5';\n\nconst MessageContainer = ({ classNames, children, user }: ThemedClassName<PropsWithChildren<{ user?: boolean }>>) => {\n if (!children) {\n return null;\n }\n\n return (\n <div role='list-item' className={mx('flex is-full', user && 'justify-end', marginClasses, classNames)}>\n <div className={mx(user ? ['rounded-sm', 'bg-[--user-fill] text-accentSurfaceText', paddingClasses] : 'is-full')}>\n {children}\n </div>\n </div>\n );\n};\n\nconst ToggleContainer = (props: ToggleContainerProps) => {\n return <NativeToggleContainer {...props} classNames={mx(panelClasses, props.classNames)} />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type AgentStatus, type Tool } from '@dxos/ai';\nimport { log } from '@dxos/log';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { NumericTabs, StatusRoll, ToggleContainer } from '@dxos/react-ui-components';\nimport { type JsonProps, Json as NativeJson } from '@dxos/react-ui-syntax-highlighter';\nimport { type DataType } from '@dxos/schema';\nimport { isNonNullable, isNotFalsy } from '@dxos/util';\n\nexport const isToolMessage = (message: DataType.Message) => {\n return message.blocks.some((block) => block._tag === 'toolCall' || block._tag === 'toolResult');\n};\n\nconst getToolName = (tool: Tool) => {\n return tool.namespace && tool.function ? `${tool.namespace}:${tool.function}` : tool.name.split('_').pop();\n};\n\nconst getToolCaption = (tool: Tool | undefined, status: AgentStatus | undefined) => {\n if (!tool) {\n return 'Calling tool...';\n }\n\n return status?.message ?? tool.caption ?? `Calling ${getToolName(tool)}...`;\n};\n\nexport type ToolBlockProps = ThemedClassName<{\n message: DataType.Message;\n tools?: Tool[];\n}>;\n\nexport const ToolBlock: FC<ToolBlockProps> = ({ classNames, message, tools }) => {\n const { blocks = [] } = message;\n\n let request: { tool: Tool | undefined; block: any } | undefined;\n const toolBlocks = blocks.filter((block) => block._tag === 'toolCall' || block._tag === 'toolResult');\n const items = toolBlocks\n .map((block) => {\n switch (block._tag) {\n case 'toolCall': {\n // TODO(burdon): Skip these updates?\n if (block.pending && request?.block.toolCallId === block.toolCallId) {\n return null;\n }\n\n request = { tool: tools?.find((tool) => tool.name === block.name), block };\n return {\n title: getToolCaption(request.tool, undefined), // block.status), // TODO(burdon): Get status?\n block,\n };\n }\n\n case 'toolResult': {\n if (!request) {\n log.warn('unexpected message', { block });\n return { title: 'Error', block };\n }\n\n return {\n title: `${getToolCaption(request.tool, undefined)} (Success)`,\n block,\n };\n }\n\n default: {\n request = undefined;\n return {\n title: 'Error',\n block,\n };\n }\n }\n })\n .filter(isNonNullable);\n\n return <ToolContainer classNames={classNames} items={items} />;\n};\n\nexport const ToolContainer: FC<ThemedClassName<{ items: { title: string; block: any }[] }>> = ({\n classNames,\n items,\n}) => {\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 const title = useMemo(() => {\n const lines = items.map((item) => item.title).filter(isNotFalsy);\n return <StatusRoll key='status-roll' lines={lines} duration={1_000} autoAdvance />;\n }, [items]);\n\n return (\n <ToggleContainer classNames={['flex flex-col', classNames]} title={title} open={open} onChangeOpen={setOpen}>\n <div className='w-full grid grid-cols-[32px_1fr]'>\n <NumericTabs ref={tabsRef} length={items.length} selected={selected} onSelect={handleSelect} />\n <Json data={items[selected].block} />\n </div>\n </ToggleContainer>\n );\n};\n\nexport const Json = ({ data }: Pick<JsonProps, 'data'>) => (\n <NativeJson data={data} classNames='!p-1 text-xs bg-transparent' />\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type DataType } from '@dxos/schema';\n\n// TODO(burdon): Move to util?\ntype Reducer<R, I> = (acc: R, value: I) => R;\n\n/**\n * Reducer that collapses related message blocks into single messages.\n * For example, combines tool request/response pairs into a single message.\n */\nexport const messageReducer: Reducer<{ messages: DataType.Message[]; current?: DataType.Message }, DataType.Message> = (\n { current, messages },\n message,\n) => {\n let i = 0;\n for (const block of message.blocks) {\n switch (block._tag) {\n case 'toolCall':\n case 'toolResult': {\n if (current) {\n current.blocks.push(block);\n } else {\n current = {\n ...message,\n id: [message.id, i].join('_'),\n blocks: [block],\n };\n messages.push(current);\n }\n break;\n }\n\n case 'text':\n default: {\n current = undefined;\n messages.push({\n ...message,\n id: [message.id, i].join('_'),\n blocks: [block],\n });\n break;\n }\n }\n\n i++;\n }\n\n return { current, messages };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["useEffect", "useMemo", "useState", "Capabilities", "useCapabilities", "useIntentDispatcher", "Conversation", "createSystemPrompt", "FunctionType", "log", "useConfig", "Filter", "fullyQualifiedId", "useQuery", "isNonNullable", "batch", "computed", "signal", "Effect", "AiService", "DEFAULT_EDGE_MODEL", "ArtifactDiffResolver", "Context", "Obj", "runAndForwardErrors", "log", "Filter", "getVersion", "DataType", "defaultOptions", "model", "systemPrompt", "ChatProcessor", "_services", "_conversation", "_options", "_pending", "_streaming", "undefined", "streaming", "value", "error", "messages", "push", "make", "Message", "_session", "_artifactDiffResolver", "resolve", "artifacts", "space", "extensions", "Map", "versions", "Promise", "all", "map", "artifact", "objects", "object", "db", "query", "ids", "id", "run", "set", "version", "diff", "JSON", "stringify", "_tools", "tools", "conversation", "context", "blueprintRegistry", "setTools", "request", "message", "options", "ctx", "default", "onBegin", "on", "session", "info", "isDisposed", "disposed", "onDispose", "userMessage", "update", "block", "created", "Date", "toISOString", "sender", "role", "blocks", "at", "pending", "length", "prompt", "pipe", "provide", "provideService", "tapErrorCause", "cause", "void", "err", "catch", "Error", "includes", "AiServiceOverloadedError", "_reset", "cancel", "abort", "code", "Schema", "ModelProviders", "ModelProvider", "Schema", "Literal", "createModelLabel", "model", "parts", "split", "length", "AiServicePresets", "provider", "map", "i", "id", "label", "effect", "useCallback", "useEffect", "useState", "Blueprint", "Obj", "Ref", "log", "isNonNullable", "useBlueprints", "space", "context", "blueprintRegistry", "blueprints", "setBlueprints", "t", "refs", "value", "setTimeout", "Array", "loadAll", "filter", "clearTimeout", "handleUpdate", "key", "active", "info", "blueprint", "getByKey", "id", "_id", "data", "obj", "db", "add", "make", "bind", "Layer", "useMemo", "useDeepCompareMemoize", "Capabilities", "useCapabilities", "makeToolExecutionServiceFromFunctions", "makeToolResolverFromFunctions", "ComputeEventLogger", "CredentialsService", "DatabaseService", "LocalFunctionExecutionService", "QueueService", "RemoteFunctionExecutionService", "TracingService", "defineCapability", "AssistantCapabilities", "AiServiceLayer", "defineCapability", "ASSISTANT_PLUGIN", "useChatServices", "space", "aiServiceLayer", "useCapabilities", "AssistantCapabilities", "AiServiceLayer", "at", "Layer", "die", "functions", "Capabilities", "Functions", "flat", "useMemo", "mergeAll", "makeToolResolverFromFunctions", "makeToolExecutionServiceFromFunctions", "CredentialsService", "configuredLayer", "DatabaseService", "makeLayer", "db", "notAvailable", "QueueService", "queues", "ComputeEventLogger", "layerFromTracing", "pipe", "provideMerge", "TracingService", "layerNoop", "LocalFunctionExecutionService", "layer", "RemoteFunctionExecutionService", "mockLayer", "useDeepCompareMemoize", "map", "f", "name", "useMemo", "Capabilities", "useCapabilities", "Filter", "Obj", "useReferencesProvider", "space", "artifactDefinitions", "useCapabilities", "Capabilities", "ArtifactDefinition", "useMemo", "undefined", "getReferences", "query", "schemas", "map", "artifact", "schema", "objects", "db", "Filter", "or", "type", "run", "filter", "object", "stringMatch", "Obj", "getLabel", "getDXN", "uri", "toString", "label", "resolveReference", "ids", "first", "toLowerCase", "startsWith", "createTool", "ToolResult", "Type", "getInvocationUrl", "getUserFunctionUrlInMetadata", "log", "getMeta", "convertFunctionToTool", "fn", "edgeUrl", "spaceId", "description", "inputSchema", "undefined", "existingFunctionUrl", "url", "name", "schema", "toEffectSchema", "execute", "input", "info", "response", "fetch", "method", "headers", "body", "JSON", "stringify", "Success", "text", "Schema", "jsonpointer", "ToolResult", "createRawTool", "Type", "normalizeSchema", "invariant", "log", "deepMapValues", "createToolsFromService", "service", "interfaces", "length", "kind", "iface", "schemaUrl", "createToolsFromApi", "authorization", "url", "options", "res", "fetch", "spec", "json", "tools", "path", "pathItem", "Object", "entries", "paths", "methods", "method", "m", "methodItem", "parametersResolved", "parameters", "map", "parameter", "resolved", "resolveJsonSchema", "inputSchema", "type", "properties", "endpointParameters", "placement", "in", "name", "push", "schema", "_in", "required", "validateSync", "JsonSchema", "description", "summary", "warn", "endpoint", "document", "getToolName", "instructions", "execute", "input", "response", "callApiEndpoint", "Success", "operationId", "toLowerCase", "replaceAll", "MAX_TOOL_NAME_LENGTH", "lengthBefore", "word", "GENERIC_WORDS", "includes", "replace", "lengthAfter", "slice", "info", "getEndpointUrl", "request", "headers", "query", "URLSearchParams", "body", "undefined", "example", "default", "encodeURIComponent", "value", "effectSchema", "toEffectSchema", "Error", "set", "Authorization", "resolveAuthorization", "key", "size", "toString", "JSON", "stringify", "ok", "status", "statusText", "contentType", "get", "text", "responseBody", "error", "parse", "message", "isV3_1", "servers", "schemes", "host", "basePath", "tokenUrl", "grantType", "clientId", "clientSecret", "data", "access_token", "base", "recurse", "$ref", "startsWith", "ref", "openapi", "useChatProcessor", "preset", "space", "chat", "services", "blueprintRegistry", "settings", "instructions", "artifact", "noPluginArtifacts", "dispatchPromise", "dispatch", "useIntentDispatcher", "globalTools", "useCapabilities", "Capabilities", "Tools", "artifacts", "ArtifactDefinition", "Stable", "array", "remoteServices", "useQuery", "Filter", "type", "ServiceType", "serviceTools", "setServiceTools", "useState", "useEffect", "log", "queueMicrotask", "tools", "Promise", "all", "map", "service", "createToolsFromService", "flat", "config", "useConfig", "functions", "FunctionType", "chatId", "useMemo", "fullyQualifiedId", "undefined", "extensions", "fn", "convertFunctionToTool", "values", "runtime", "edge", "url", "id", "filter", "isNonNullable", "pivotId", "systemPrompt", "createSystemPrompt", "definition", "name", "conversation", "queue", "target", "Conversation", "processor", "info", "length", "model", "ChatProcessor", "Object", "freeze", "object", "React", "useState", "useEffect", "Fragment", "parseToolName", "Capabilities", "useCapabilities", "FunctionType", "log", "Filter", "useQuery", "useTranslation", "mx", "Toolbox", "classNames", "artifacts", "functions", "services", "blueprints", "activeBlueprints", "striped", "t", "useTranslation", "meta", "id", "div", "className", "mx", "length", "Section", "title", "items", "map", "target", "name", "description", "subitems", "tools", "toolId", "parseToolName", "service", "serviceId", "stripeClassNames", "gridClassNames", "subGridClassNames", "h1", "i", "Fragment", "key", "ToolboxContainer", "space", "processor", "artifactDefinitions", "useCapabilities", "Capabilities", "ArtifactDefinition", "useQuery", "Filter", "type", "ServiceType", "serviceTools", "setServiceTools", "useState", "useEffect", "log", "queueMicrotask", "Promise", "all", "createToolsFromService", "FunctionType", "context", "value", "Prec", "keymap", "createContext", "dedupeWith", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "CollaborationActions", "createIntent", "useIntentDispatcher", "Event", "DXN", "Obj", "Ref", "log", "useVoiceInput", "getSpace", "useQueue", "useIdentity", "Input", "useTranslation", "ChatEditor", "references", "mx", "DataType", "isNotFalsy", "React", "IconButton", "useTranslation", "mx", "ChatActions", "classNames", "children", "microphone", "recording", "processing", "onEvent", "t", "useTranslation", "meta", "id", "React", "div", "className", "mx", "IconButton", "disabled", "variant", "size", "icon", "iconOnly", "label", "onClick", "type", "noTooltip", "onMouseDown", "onMouseUp", "onTouchStart", "onTouchEnd", "React", "useMemo", "DropdownMenu", "IconButton", "Input", "useTranslation", "ChatOptionsMenu", "blueprintRegistry", "blueprints", "onChange", "t", "useTranslation", "meta", "id", "blueprintOptions", "useMemo", "query", "map", "blueprint", "key", "label", "name", "React", "DropdownMenu", "Root", "Trigger", "asChild", "disabled", "length", "IconButton", "icon", "variant", "size", "iconOnly", "Portal", "Content", "side", "Viewport", "option", "Item", "Input", "Checkbox", "checked", "find", "onCheckedChange", "Label", "classNames", "Arrow", "React", "Select", "ChatPresets", "presets", "preset", "onChange", "React", "Select", "Root", "value", "onValueChange", "TriggerButton", "classNames", "Content", "map", "id", "label", "Option", "key", "React", "useCallback", "Filter", "Obj", "Ref", "useAsyncState", "useTranslation", "TagPicker", "mx", "isNonNullable", "ChatReferences", "classNames", "space", "context", "onUpdate", "t", "_t", "useTranslation", "meta", "id", "items", "useAsyncState", "objects", "Ref", "Array", "loadAll", "value", "filter", "isNonNullable", "map", "obj", "label", "Obj", "getLabel", "handleSearch", "useCallback", "text", "ids", "db", "query", "Filter", "everything", "runSync", "object", "includes", "toLocaleLowerCase", "React", "TagPicker", "mx", "mode", "onSearch", "React", "useEffect", "useState", "Icon", "Tooltip", "useTimeout", "Spinner", "errorText", "ChatStatusIndicator", "preset", "error", "processing", "init", "setInit", "useState", "useEffect", "useTimeout", "React", "Tooltip", "Trigger", "content", "message", "delayDuration", "Icon", "icon", "classNames", "errorText", "size", "Spinner", "state", "React", "forwardRef", "useMemo", "PublicKey", "ScrollContainer", "mx", "keyToFallback", "React", "Fragment", "Surface", "invariant", "Button", "Icon", "IconButton", "useTranslation", "MarkdownViewer", "ToggleContainer", "NativeToggleContainer", "mx", "safeParseJson", "React", "useEffect", "useMemo", "useRef", "useState", "log", "NumericTabs", "StatusRoll", "ToggleContainer", "Json", "NativeJson", "isNonNullable", "isNotFalsy", "isToolMessage", "message", "blocks", "some", "block", "_tag", "getToolName", "tool", "namespace", "function", "name", "split", "pop", "getToolCaption", "status", "caption", "ToolBlock", "classNames", "tools", "request", "toolBlocks", "filter", "items", "map", "pending", "toolCallId", "find", "title", "undefined", "warn", "ToolContainer", "tabsRef", "selected", "setSelected", "open", "setOpen", "current", "focus", "handleSelect", "index", "lines", "item", "key", "duration", "autoAdvance", "onChangeOpen", "div", "className", "ref", "length", "onSelect", "data", "ChatMessage", "classNames", "debug", "space", "message", "processor", "tools", "onEvent", "t", "useTranslation", "meta", "id", "sender", "role", "blocks", "isToolMessage", "React", "MessageContainer", "mx", "ToolBlock", "panelClasses", "div", "className", "marginClasses", "pre", "JSON", "stringify", "created", "map", "block", "idx", "_tag", "text", "replaceAll", "length", "Component", "components", "default", "Fragment", "key", "user", "IconButton", "icon", "iconOnly", "label", "onClick", "type", "invariant", "title", "disposition", "titles", "undefined", "MarkdownViewer", "content", "ToggleContainer", "defaultOpen", "systemDispositions", "includes", "pending", "Icon", "size", "ToolboxContainer", "safeParseJson", "data", "options", "Button", "Surface", "subject", "parse", "limit", "fallback", "object", "Json", "name", "paddingClasses", "children", "props", "NativeToggleContainer", "messageReducer", "current", "messages", "message", "i", "block", "blocks", "_tag", "push", "id", "join", "undefined", "ChatThread", "forwardRef", "classNames", "identity", "messages", "collapse", "props", "forwardedRef", "userHue", "useMemo", "profile", "data", "hue", "keyToFallback", "identityKey", "PublicKey", "random", "filteredMessages", "reduce", "messageReducer", "React", "ScrollContainer", "ref", "fade", "div", "role", "className", "mx", "length", "style", "map", "message", "ChatMessage", "key", "id", "Endcap", "children", "React", "div", "className", "ChatContextProvider", "useChatContext", "createContext", "ChatRoot", "classNames", "chat", "processor", "artifact", "onEvent", "props", "debug", "setDebug", "useState", "space", "getSpace", "queue", "useQueue", "dxn", "messages", "useMemo", "dedupeWith", "objects", "filter", "Obj", "instanceOf", "DataType", "Message", "value", "a", "b", "id", "dispatchPromise", "dispatch", "useIntentDispatcher", "useEffect", "streaming", "message", "length", "createIntent", "CollaborationActions", "InsertContent", "target", "object", "Ref", "fromDXN", "DXN", "kind", "QUEUE", "parts", "label", "event", "Event", "on", "type", "request", "text", "cancel", "role", "mx", "displayName", "ChatThread", "identity", "useIdentity", "scrollerRef", "useRef", "current", "scrollToBottom", "NativeChatThread", "ref", "tools", "ev", "emit", "ChatPrompt", "placeholder", "expandable", "online", "presets", "preset", "onChangePreset", "onChangeOnline", "t", "useTranslation", "meta", "active", "setActive", "editorRef", "recording", "useVoiceInput", "onUpdate", "setText", "focus", "blueprints", "handleUpdateBlueprints", "useBlueprints", "context", "blueprintRegistry", "contextProvider", "useReferencesProvider", "extensions", "references", "provider", "Prec", "highest", "keymap", "of", "key", "preventDefault", "run", "isNotFalsy", "handleSubmit", "useCallback", "handleEvent", "handleUpdateReferences", "ids", "log", "info", "ChatStatusIndicator", "error", "processing", "ChatEditor", "autoFocus", "lineWrapping", "onSubmit", "ChatReferences", "ChatOptionsMenu", "onChange", "ChatActions", "microphone", "ChatPresets", "undefined", "Input", "Root", "Switch", "checked", "onCheckedChange", "Chat", "Thread", "Prompt"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
3
  LLM_PROVIDERS
4
- } from "./chunk-BISJDTBK.mjs";
4
+ } from "./chunk-Z7PUODRT.mjs";
5
5
  import {
6
6
  meta
7
7
  } from "./chunk-QN2H2EHV.mjs";
@@ -93,17 +93,17 @@ var PromptSettings = ({ template }) => {
93
93
 
94
94
  // src/components/index.ts
95
95
  import { lazy } from "react";
96
- var ChatContainer = lazy(() => import("./ChatContainer-VZT74PO2.mjs"));
97
- var ChatDialog = lazy(() => import("./ChatDialog-RJ6FDX4Q.mjs"));
96
+ var BlueprintContainer = lazy(() => import("./BlueprintContainer-RGTMNLNX.mjs"));
97
+ var ChatContainer = lazy(() => import("./ChatContainer-W3W6FWV3.mjs"));
98
+ var ChatDialog = lazy(() => import("./ChatDialog-QW4JRKVO.mjs"));
98
99
  var SequenceContainer = lazy(() => import("./SequenceContainer-RQQH5XOC.mjs"));
99
- var TemplateContainer = lazy(() => import("./TemplateContainer-A3NAQCZE.mjs"));
100
100
 
101
101
  export {
102
102
  AssistantSettings,
103
103
  PromptSettings,
104
+ BlueprintContainer,
104
105
  ChatContainer,
105
106
  ChatDialog,
106
- SequenceContainer,
107
- TemplateContainer
107
+ SequenceContainer
108
108
  };
109
- //# sourceMappingURL=chunk-E33DNNDW.mjs.map
109
+ //# sourceMappingURL=chunk-MS3PJARN.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/AssistantSettings/AssistantSettings.tsx", "../../../src/components/PromptSettings.tsx", "../../../src/components/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { DEFAULT_EDGE_MODELS, DEFAULT_OLLAMA_MODELS } from '@dxos/ai';\nimport { Input, Select, useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\nimport { LLM_PROVIDERS, type Assistant } from '../../types';\n\n// TODO(burdon): Factor out default Selector.\nconst DEFAULT_VALUE = '__default';\n\nconst LLM_PROVIDER_LABELS = {\n edge: 'DXOS',\n ollama: 'Ollama',\n lmstudio: 'LM Studio',\n} as const;\n\nexport const AssistantSettings = ({ settings }: { settings: Assistant.Settings }) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <DeprecatedFormContainer>\n <DeprecatedFormInput label={t('settings custom prompts label')}>\n <Input.Switch\n checked={!!settings.customPrompts}\n onCheckedChange={(checked) => (settings.customPrompts = checked)}\n />\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('settings llm provider label')}>\n <Select.Root\n value={settings.llmProvider ?? 'edge'}\n onValueChange={(value) => {\n settings.llmProvider = value === DEFAULT_VALUE ? undefined : (value as any);\n }}\n >\n <Select.TriggerButton placeholder={t('settings llm provider label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>\n {LLM_PROVIDERS.map((model) => (\n <Select.Option key={model} value={model}>\n {LLM_PROVIDER_LABELS[model]}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('settings edge llm model label')}>\n <Select.Root\n value={settings.edgeModel ?? DEFAULT_VALUE}\n onValueChange={(value) => {\n settings.edgeModel = value === DEFAULT_VALUE ? undefined : value;\n }}\n >\n <Select.TriggerButton placeholder={t('settings default llm model label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>\n {DEFAULT_EDGE_MODELS.map((model) => (\n <Select.Option key={model} value={model}>\n {model}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('settings ollama llm model label')}>\n <Select.Root\n value={settings.ollamaModel ?? DEFAULT_VALUE}\n onValueChange={(value) => {\n settings.ollamaModel = value === DEFAULT_VALUE ? undefined : value;\n }}\n >\n <Select.TriggerButton placeholder={t('settings default llm model label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>\n {DEFAULT_OLLAMA_MODELS.map((model) => (\n <Select.Option key={model} value={model}>\n {model}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n </DeprecatedFormContainer>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Template } from '@dxos/blueprints';\nimport { Toolbar, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '../meta';\n\nexport const PromptSettings = ({ template }: { template: Template.Template }) => {\n const { t } = useTranslation(meta.id);\n\n // const handleKindChange = useCallback(\n // (value: string) => {\n // const kind = Match.type<string>().pipe(\n // Match.withReturnType<Schema.Schema.Type<typeof Template.Template>>(),\n // Match.when('always', () => ({ include: 'always' })),\n // Match.when('schema-matching', () => ({ include: 'schema-matching', typename: '' })),\n // Match.when('automatically', () => ({ include: 'automatically', description: '' })),\n // Match.orElse(() => ({ include: 'manual' })),\n // )(value);\n //\n // template.kind = kind;\n // },\n // [template],\n // );\n\n // const handleTypenameChange = useCallback(\n // debounce((event: ChangeEvent<HTMLInputElement>) => {\n // if (template.kind.include === 'schema-matching') {\n // template.kind.typename = event.target.value;\n // }\n // }, 300),\n // [template.kind.include],\n // );\n\n // const handleDescriptionChange = useCallback(\n // debounce((event: ChangeEvent<HTMLInputElement>) => {\n // if (template.kind.include === 'automatically') {\n // template.kind.description = event.target.value;\n // }\n // }, 300),\n // [template.kind.include],\n // );\n\n return (\n <div className='flex flex-col gap-4'>\n <h2>{t('prompt rules label')}</h2>\n <Toolbar.Root>\n {/* <Select.Root value={template.kind.include} onValueChange={handleKindChange}>\n <Toolbar.Button asChild>\n <Select.TriggerButton />\n </Toolbar.Button>\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {Template.Kinds.map((kind) => (\n <Select.Option key={kind} value={kind}>\n {kind}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root> */}\n {/* {template.kind.include === 'schema-matching' && (\n <Input.Root>\n <Input.TextInput\n placeholder={t('typename placeholder')}\n defaultValue={template.kind.typename}\n onChange={handleTypenameChange}\n />\n </Input.Root>\n )} */}\n {/* {template.kind.include === 'automatically' && (\n <Input.Root>\n <Input.TextInput\n placeholder={t('description placeholder')}\n defaultValue={template.kind.description}\n onChange={handleDescriptionChange}\n />\n </Input.Root>\n )} */}\n </Toolbar.Root>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './AssistantSettings';\nexport * from './Chat';\nexport * from './PromptSettings';\nexport * from './TemplateEditor';\nexport * from './Toolbox';\n\n// TODO(burdon): Lazy loading causes issues with Tabster.\n// Repro: open assistant dialog then close.\n// https://github.com/microsoft/fluentui/issues/34020\n\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\nexport const ChatDialog = lazy(() => import('./ChatDialog'));\nexport const SequenceContainer = lazy(() => import('./SequenceContainer'));\nexport const TemplateContainer = lazy(() => import('./TemplateContainer'));\n"],
5
- "mappings": ";;;;;;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,qBAAqBC,6BAA6B;AAC3D,SAASC,OAAOC,QAAQC,sBAAsB;AAC9C,SAASC,yBAAyBC,2BAA2B;AAM7D,IAAMC,gBAAgB;AAEtB,IAAMC,sBAAsB;EAC1BC,MAAM;EACNC,QAAQ;EACRC,UAAU;AACZ;AAEO,IAAMC,oBAAoB,CAAC,EAAEC,SAAQ,MAAoC;;;AAC9E,UAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKC,EAAE;AAEpC,WACE,sBAAA,cAACC,yBAAAA,MACC,sBAAA,cAACC,qBAAAA;MAAoBC,OAAON,EAAE,+BAAA;OAC5B,sBAAA,cAACO,MAAMC,QAAM;MACXC,SAAS,CAAC,CAACV,SAASW;MACpBC,iBAAiB,CAACF,YAAaV,SAASW,gBAAgBD;SAI5D,sBAAA,cAACJ,qBAAAA;MAAoBC,OAAON,EAAE,6BAAA;OAC5B,sBAAA,cAACY,OAAOC,MAAI;MACVC,OAAOf,SAASgB,eAAe;MAC/BC,eAAe,CAACF,UAAAA;AACdf,iBAASgB,cAAcD,UAAUrB,gBAAgBwB,SAAaH;MAChE;OAEA,sBAAA,cAACF,OAAOM,eAAa;MAACC,aAAanB,EAAE,6BAAA;QACrC,sBAAA,cAACY,OAAOQ,QAAM,MACZ,sBAAA,cAACR,OAAOS,SAAO,MACb,sBAAA,cAACT,OAAOU,UAAQ,MACd,sBAAA,cAACV,OAAOW,QAAM;MAACT,OAAOrB;OAAgBO,EAAE,wBAAA,CAAA,GACvCwB,cAAcC,IAAI,CAACC,UAClB,sBAAA,cAACd,OAAOW,QAAM;MAACI,KAAKD;MAAOZ,OAAOY;OAC/BhC,oBAAoBgC,KAAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GASzC,sBAAA,cAACrB,qBAAAA;MAAoBC,OAAON,EAAE,+BAAA;OAC5B,sBAAA,cAACY,OAAOC,MAAI;MACVC,OAAOf,SAAS6B,aAAanC;MAC7BuB,eAAe,CAACF,UAAAA;AACdf,iBAAS6B,YAAYd,UAAUrB,gBAAgBwB,SAAYH;MAC7D;OAEA,sBAAA,cAACF,OAAOM,eAAa;MAACC,aAAanB,EAAE,kCAAA;QACrC,sBAAA,cAACY,OAAOQ,QAAM,MACZ,sBAAA,cAACR,OAAOS,SAAO,MACb,sBAAA,cAACT,OAAOU,UAAQ,MACd,sBAAA,cAACV,OAAOW,QAAM;MAACT,OAAOrB;OAAgBO,EAAE,wBAAA,CAAA,GACvC6B,oBAAoBJ,IAAI,CAACC,UACxB,sBAAA,cAACd,OAAOW,QAAM;MAACI,KAAKD;MAAOZ,OAAOY;OAC/BA,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,GASf,sBAAA,cAACrB,qBAAAA;MAAoBC,OAAON,EAAE,iCAAA;OAC5B,sBAAA,cAACY,OAAOC,MAAI;MACVC,OAAOf,SAAS+B,eAAerC;MAC/BuB,eAAe,CAACF,UAAAA;AACdf,iBAAS+B,cAAchB,UAAUrB,gBAAgBwB,SAAYH;MAC/D;OAEA,sBAAA,cAACF,OAAOM,eAAa;MAACC,aAAanB,EAAE,kCAAA;QACrC,sBAAA,cAACY,OAAOQ,QAAM,MACZ,sBAAA,cAACR,OAAOS,SAAO,MACb,sBAAA,cAACT,OAAOU,UAAQ,MACd,sBAAA,cAACV,OAAOW,QAAM;MAACT,OAAOrB;OAAgBO,EAAE,wBAAA,CAAA,GACvC+B,sBAAsBN,IAAI,CAACC,UAC1B,sBAAA,cAACd,OAAOW,QAAM;MAACI,KAAKD;MAAOZ,OAAOY;OAC/BA,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;;;;AAUrB;;;;ACpGA,OAAOM,YAAW;AAGlB,SAASC,SAASC,kBAAAA,uBAAsB;AAIjC,IAAMC,iBAAiB,CAAC,EAAEC,SAAQ,MAAmC;;;AAC1E,UAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AAmCpC,WACE,gBAAAC,OAAA,cAACC,OAAAA;MAAIC,WAAU;OACb,gBAAAF,OAAA,cAACG,MAAAA,MAAIP,EAAE,oBAAA,CAAA,GACP,gBAAAI,OAAA,cAACI,QAAQC,MAAI,IAAA,CAAA;;;;AAsCnB;;;ACpFA,SAASC,YAAY;AAYd,IAAMC,gBAAgBC,KAAK,MAAM,OAAO,8BAAA,CAAA;AACxC,IAAMC,aAAaD,KAAK,MAAM,OAAO,2BAAA,CAAA;AACrC,IAAME,oBAAoBF,KAAK,MAAM,OAAO,kCAAA,CAAA;AAC5C,IAAMG,oBAAoBH,KAAK,MAAM,OAAO,kCAAA,CAAA;",
6
- "names": ["React", "DEFAULT_EDGE_MODELS", "DEFAULT_OLLAMA_MODELS", "Input", "Select", "useTranslation", "DeprecatedFormContainer", "DeprecatedFormInput", "DEFAULT_VALUE", "LLM_PROVIDER_LABELS", "edge", "ollama", "lmstudio", "AssistantSettings", "settings", "t", "useTranslation", "meta", "id", "DeprecatedFormContainer", "DeprecatedFormInput", "label", "Input", "Switch", "checked", "customPrompts", "onCheckedChange", "Select", "Root", "value", "llmProvider", "onValueChange", "undefined", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "Option", "LLM_PROVIDERS", "map", "model", "key", "edgeModel", "DEFAULT_EDGE_MODELS", "ollamaModel", "DEFAULT_OLLAMA_MODELS", "React", "Toolbar", "useTranslation", "PromptSettings", "template", "t", "useTranslation", "meta", "id", "React", "div", "className", "h2", "Toolbar", "Root", "lazy", "ChatContainer", "lazy", "ChatDialog", "SequenceContainer", "TemplateContainer"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { DEFAULT_EDGE_MODELS, DEFAULT_OLLAMA_MODELS } from '@dxos/ai';\nimport { Input, Select, useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\nimport { LLM_PROVIDERS, type Assistant } from '../../types';\n\n// TODO(burdon): Factor out default Selector.\nconst DEFAULT_VALUE = '__default';\n\nconst LLM_PROVIDER_LABELS = {\n edge: 'DXOS',\n ollama: 'Ollama',\n lmstudio: 'LM Studio',\n} as const;\n\nexport const AssistantSettings = ({ settings }: { settings: Assistant.Settings }) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <DeprecatedFormContainer>\n <DeprecatedFormInput label={t('settings custom prompts label')}>\n <Input.Switch\n checked={!!settings.customPrompts}\n onCheckedChange={(checked) => (settings.customPrompts = checked)}\n />\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('settings llm provider label')}>\n <Select.Root\n value={settings.llmProvider ?? 'edge'}\n onValueChange={(value) => {\n settings.llmProvider = value === DEFAULT_VALUE ? undefined : (value as any);\n }}\n >\n <Select.TriggerButton placeholder={t('settings llm provider label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>\n {LLM_PROVIDERS.map((model) => (\n <Select.Option key={model} value={model}>\n {LLM_PROVIDER_LABELS[model]}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('settings edge llm model label')}>\n <Select.Root\n value={settings.edgeModel ?? DEFAULT_VALUE}\n onValueChange={(value) => {\n settings.edgeModel = value === DEFAULT_VALUE ? undefined : value;\n }}\n >\n <Select.TriggerButton placeholder={t('settings default llm model label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>\n {DEFAULT_EDGE_MODELS.map((model) => (\n <Select.Option key={model} value={model}>\n {model}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('settings ollama llm model label')}>\n <Select.Root\n value={settings.ollamaModel ?? DEFAULT_VALUE}\n onValueChange={(value) => {\n settings.ollamaModel = value === DEFAULT_VALUE ? undefined : value;\n }}\n >\n <Select.TriggerButton placeholder={t('settings default llm model label')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={DEFAULT_VALUE}>{t('settings default label')}</Select.Option>\n {DEFAULT_OLLAMA_MODELS.map((model) => (\n <Select.Option key={model} value={model}>\n {model}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n </DeprecatedFormContainer>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Template } from '@dxos/blueprints';\nimport { Toolbar, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '../meta';\n\nexport const PromptSettings = ({ template }: { template: Template.Template }) => {\n const { t } = useTranslation(meta.id);\n\n // const handleKindChange = useCallback(\n // (value: string) => {\n // const kind = Match.type<string>().pipe(\n // Match.withReturnType<Schema.Schema.Type<typeof Template.Template>>(),\n // Match.when('always', () => ({ include: 'always' })),\n // Match.when('schema-matching', () => ({ include: 'schema-matching', typename: '' })),\n // Match.when('automatically', () => ({ include: 'automatically', description: '' })),\n // Match.orElse(() => ({ include: 'manual' })),\n // )(value);\n //\n // template.kind = kind;\n // },\n // [template],\n // );\n\n // const handleTypenameChange = useCallback(\n // debounce((event: ChangeEvent<HTMLInputElement>) => {\n // if (template.kind.include === 'schema-matching') {\n // template.kind.typename = event.target.value;\n // }\n // }, 300),\n // [template.kind.include],\n // );\n\n // const handleDescriptionChange = useCallback(\n // debounce((event: ChangeEvent<HTMLInputElement>) => {\n // if (template.kind.include === 'automatically') {\n // template.kind.description = event.target.value;\n // }\n // }, 300),\n // [template.kind.include],\n // );\n\n return (\n <div className='flex flex-col gap-4'>\n <h2>{t('prompt rules label')}</h2>\n <Toolbar.Root>\n {/* <Select.Root value={template.kind.include} onValueChange={handleKindChange}>\n <Toolbar.Button asChild>\n <Select.TriggerButton />\n </Toolbar.Button>\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {Template.Kinds.map((kind) => (\n <Select.Option key={kind} value={kind}>\n {kind}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root> */}\n {/* {template.kind.include === 'schema-matching' && (\n <Input.Root>\n <Input.TextInput\n placeholder={t('typename placeholder')}\n defaultValue={template.kind.typename}\n onChange={handleTypenameChange}\n />\n </Input.Root>\n )} */}\n {/* {template.kind.include === 'automatically' && (\n <Input.Root>\n <Input.TextInput\n placeholder={t('description placeholder')}\n defaultValue={template.kind.description}\n onChange={handleDescriptionChange}\n />\n </Input.Root>\n )} */}\n </Toolbar.Root>\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './AssistantSettings';\nexport * from './Chat';\nexport * from './PromptSettings';\nexport * from './TemplateEditor';\nexport * from './Toolbox';\n\n// TODO(burdon): Lazy loading causes issues with Tabster.\n// Repro: open assistant dialog then close.\n// https://github.com/microsoft/fluentui/issues/34020\n\nexport const BlueprintContainer = lazy(() => import('./BlueprintContainer'));\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\nexport const ChatDialog = lazy(() => import('./ChatDialog'));\nexport const SequenceContainer = lazy(() => import('./SequenceContainer'));\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "DEFAULT_EDGE_MODELS", "DEFAULT_OLLAMA_MODELS", "Input", "Select", "useTranslation", "DeprecatedFormContainer", "DeprecatedFormInput", "DEFAULT_VALUE", "LLM_PROVIDER_LABELS", "edge", "ollama", "lmstudio", "AssistantSettings", "settings", "t", "useTranslation", "meta", "id", "DeprecatedFormContainer", "DeprecatedFormInput", "label", "Input", "Switch", "checked", "customPrompts", "onCheckedChange", "Select", "Root", "value", "llmProvider", "onValueChange", "undefined", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "Option", "LLM_PROVIDERS", "map", "model", "key", "edgeModel", "DEFAULT_EDGE_MODELS", "ollamaModel", "DEFAULT_OLLAMA_MODELS", "React", "Toolbar", "useTranslation", "PromptSettings", "template", "t", "useTranslation", "meta", "id", "React", "div", "className", "h2", "Toolbar", "Root", "lazy", "BlueprintContainer", "lazy", "ChatContainer", "ChatDialog", "SequenceContainer"]
7
7
  }
@@ -9,12 +9,11 @@ import { HighlightStyle, LanguageSupport, syntaxHighlighting } from "@codemirror
9
9
  import { styleTags, tags } from "@lezer/highlight";
10
10
  import { handlebarsLanguage } from "@xiechao/codemirror-lang-handlebars";
11
11
  import React from "react";
12
- import { invariant } from "@dxos/invariant";
13
12
  import { createDocAccessor } from "@dxos/react-client/echo";
14
13
  import { useThemeContext, useTranslation } from "@dxos/react-ui";
15
14
  import { createBasicExtensions, createDataExtensions, createThemeExtensions, useTextEditor } from "@dxos/react-ui-editor";
16
15
  import { mx } from "@dxos/react-ui-theme";
17
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-assistant/src/components/TemplateEditor/TemplateEditor.tsx";
16
+ import { isNotFalsy } from "@dxos/util";
18
17
  handlebarsLanguage.configure({
19
18
  props: [
20
19
  styleTags({
@@ -22,27 +21,19 @@ handlebarsLanguage.configure({
22
21
  })
23
22
  ]
24
23
  });
25
- var TemplateEditor = ({ classNames, template }) => {
24
+ var TemplateEditor = ({ id, classNames, template }) => {
26
25
  var _effect = _useSignals();
27
26
  try {
28
27
  const { t } = useTranslation(meta.id);
29
28
  const { themeMode } = useThemeContext();
30
29
  const { parentRef } = useTextEditor(() => {
31
- invariant(template.source.target, void 0, {
32
- F: __dxlog_file,
33
- L: 40,
34
- S: void 0,
35
- A: [
36
- "template.source.target",
37
- ""
38
- ]
39
- });
30
+ const text = template.source?.target;
40
31
  return {
41
- initialValue: template.source.target.content,
32
+ initialValue: text?.content ?? "",
42
33
  extensions: [
43
- createDataExtensions({
44
- id: template.id,
45
- text: createDocAccessor(template.source.target, [
34
+ text && createDataExtensions({
35
+ id,
36
+ text: createDocAccessor(text, [
46
37
  "content"
47
38
  ])
48
39
  }),
@@ -58,11 +49,11 @@ var TemplateEditor = ({ classNames, template }) => {
58
49
  }),
59
50
  // https://github.com/xiechao/lang-handlebars
60
51
  new LanguageSupport(handlebarsLanguage, syntaxHighlighting(handlebarsHighlightStyle))
61
- ]
52
+ ].filter(isNotFalsy)
62
53
  };
63
54
  }, [
64
55
  themeMode,
65
- template
56
+ template.source?.target
66
57
  ]);
67
58
  return /* @__PURE__ */ React.createElement("div", {
68
59
  ref: parentRef,
@@ -96,4 +87,4 @@ export {
96
87
  TemplateEditor,
97
88
  handlebarsHighlightStyle
98
89
  };
99
- //# sourceMappingURL=chunk-2XL6MNPE.mjs.map
90
+ //# sourceMappingURL=chunk-VIIMA3XQ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/TemplateEditor/TemplateEditor.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { HighlightStyle, LanguageSupport, syntaxHighlighting } from '@codemirror/language';\nimport { styleTags, tags } from '@lezer/highlight';\nimport { handlebarsLanguage } from '@xiechao/codemirror-lang-handlebars';\nimport React from 'react';\n\nimport { type Template } from '@dxos/blueprints';\nimport { createDocAccessor } from '@dxos/react-client/echo';\nimport { useThemeContext, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport {\n createBasicExtensions,\n createDataExtensions,\n createThemeExtensions,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { meta } from '../../meta';\n\nhandlebarsLanguage.configure({\n props: [\n styleTags({\n '---': tags.lineComment,\n }),\n ],\n});\n\nexport type TemplateEditorProps = ThemedClassName<{\n id: string;\n template: Template.Template;\n}>;\n\nexport const TemplateEditor = ({ id, classNames, template }: TemplateEditorProps) => {\n const { t } = useTranslation(meta.id);\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n const text = template.source?.target;\n return {\n initialValue: text?.content ?? '',\n extensions: [\n text &&\n createDataExtensions({\n id,\n text: createDocAccessor(text, ['content']),\n }),\n createBasicExtensions({\n bracketMatching: false,\n lineNumbers: true,\n lineWrapping: true,\n monospace: true,\n placeholder: t('template placeholder'),\n }),\n createThemeExtensions({\n themeMode,\n }),\n\n // https://github.com/xiechao/lang-handlebars\n new LanguageSupport(handlebarsLanguage, syntaxHighlighting(handlebarsHighlightStyle)),\n ].filter(isNotFalsy),\n };\n }, [themeMode, template.source?.target]);\n\n return <div ref={parentRef} className={mx('h-full', classNames)} />;\n};\n\n/**\n * https://github.com/xiechao/lang-handlebars/blob/direct/src/highlight.js\n */\nexport const handlebarsHighlightStyle = HighlightStyle.define([\n {\n // Braces.\n tag: tags.tagName,\n class: 'text-redText',\n },\n {\n tag: tags.variableName,\n class: 'text-blueText',\n },\n {\n tag: tags.keyword,\n class: 'text-greenText',\n },\n {\n tag: tags.comment,\n class: 'text-subdued',\n },\n]);\n"],
5
+ "mappings": ";;;;;;;AAIA,SAASA,gBAAgBC,iBAAiBC,0BAA0B;AACpE,SAASC,WAAWC,YAAY;AAChC,SAASC,0BAA0B;AACnC,OAAOC,WAAW;AAGlB,SAASC,yBAAyB;AAClC,SAASC,iBAAiBC,sBAA4C;AACtE,SACEC,uBACAC,sBACAC,uBACAC,qBACK;AACP,SAASC,UAAU;AACnB,SAASC,kBAAkB;AAI3BC,mBAAmBC,UAAU;EAC3BC,OAAO;IACLC,UAAU;MACR,OAAOC,KAAKC;IACd,CAAA;;AAEJ,CAAA;AAOO,IAAMC,iBAAiB,CAAC,EAAEC,IAAIC,YAAYC,SAAQ,MAAuB;;;AAC9E,UAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKL,EAAE;AACpC,UAAM,EAAEM,UAAS,IAAKC,gBAAAA;AACtB,UAAM,EAAEC,UAAS,IAAKC,cAAc,MAAA;AAClC,YAAMC,OAAOR,SAASS,QAAQC;AAC9B,aAAO;QACLC,cAAcH,MAAMI,WAAW;QAC/BC,YAAY;UACVL,QACEM,qBAAqB;YACnBhB;YACAU,MAAMO,kBAAkBP,MAAM;cAAC;aAAU;UAC3C,CAAA;UACFQ,sBAAsB;YACpBC,iBAAiB;YACjBC,aAAa;YACbC,cAAc;YACdC,WAAW;YACXC,aAAapB,EAAE,sBAAA;UACjB,CAAA;UACAqB,sBAAsB;YACpBlB;UACF,CAAA;;UAGA,IAAImB,gBAAgBhC,oBAAoBiC,mBAAmBC,wBAAAA,CAAAA;UAC3DC,OAAOC,UAAAA;MACX;IACF,GAAG;MAACvB;MAAWJ,SAASS,QAAQC;KAAO;AAEvC,WAAO,sBAAA,cAACkB,OAAAA;MAAIC,KAAKvB;MAAWwB,WAAWC,GAAG,UAAUhC,UAAAA;;;;;AACtD;AAKO,IAAM0B,2BAA2BO,eAAeC,OAAO;EAC5D;;IAEEC,KAAKvC,KAAKwC;IACVC,OAAO;EACT;EACA;IACEF,KAAKvC,KAAK0C;IACVD,OAAO;EACT;EACA;IACEF,KAAKvC,KAAK2C;IACVF,OAAO;EACT;EACA;IACEF,KAAKvC,KAAK4C;IACVH,OAAO;EACT;CACD;",
6
+ "names": ["HighlightStyle", "LanguageSupport", "syntaxHighlighting", "styleTags", "tags", "handlebarsLanguage", "React", "createDocAccessor", "useThemeContext", "useTranslation", "createBasicExtensions", "createDataExtensions", "createThemeExtensions", "useTextEditor", "mx", "isNotFalsy", "handlebarsLanguage", "configure", "props", "styleTags", "tags", "lineComment", "TemplateEditor", "id", "classNames", "template", "t", "useTranslation", "meta", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "text", "source", "target", "initialValue", "content", "extensions", "createDataExtensions", "createDocAccessor", "createBasicExtensions", "bracketMatching", "lineNumbers", "lineWrapping", "monospace", "placeholder", "createThemeExtensions", "LanguageSupport", "syntaxHighlighting", "handlebarsHighlightStyle", "filter", "isNotFalsy", "div", "ref", "className", "mx", "HighlightStyle", "define", "tag", "tagName", "class", "variableName", "keyword", "comment"]
7
+ }
@@ -5,6 +5,7 @@ import {
5
5
 
6
6
  // src/types/schema.ts
7
7
  import { Schema } from "effect";
8
+ import { Blueprint } from "@dxos/blueprints";
8
9
  import { SpaceSchema, Queue } from "@dxos/client/echo";
9
10
  import { Sequence } from "@dxos/conductor";
10
11
  import { Type } from "@dxos/echo";
@@ -61,6 +62,18 @@ var LLM_PROVIDERS = [
61
62
  }) {
62
63
  }
63
64
  Assistant2.CreateChat = CreateChat;
65
+ Assistant2.BlueprintForm = Schema.Struct({
66
+ name: Schema.String,
67
+ description: Schema.optional(Schema.String)
68
+ });
69
+ class CreateBlueprint extends Schema.TaggedClass()(`${meta.id}/action/create-blueprint`, {
70
+ input: Assistant2.BlueprintForm,
71
+ output: Schema.Struct({
72
+ object: Blueprint.Blueprint
73
+ })
74
+ }) {
75
+ }
76
+ Assistant2.CreateBlueprint = CreateBlueprint;
64
77
  class CreateSequence extends Schema.TaggedClass()(`${meta.id}/action/create-sequence`, {
65
78
  input: Schema.Struct({
66
79
  name: Schema.optional(Schema.String)
@@ -156,4 +169,4 @@ export {
156
169
  ServiceType,
157
170
  categoryIcons
158
171
  };
159
- //# sourceMappingURL=chunk-BISJDTBK.mjs.map
172
+ //# sourceMappingURL=chunk-Z7PUODRT.mjs.map