@dxos/plugin-assistant 0.8.2-main.f081794 → 0.8.2-main.f11618f

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 (120) hide show
  1. package/dist/lib/browser/{AssistantDialog-77B4BSXR.mjs → AssistantDialog-I47GUXWR.mjs} +3 -3
  2. package/dist/lib/browser/{ChatContainer-4AMJKO3T.mjs → ChatContainer-GAYN3FEF.mjs} +3 -3
  3. package/dist/lib/browser/{ai-client-CDZLSNXE.mjs → ai-client-OK5SMYJC.mjs} +1 -1
  4. package/dist/lib/browser/{ai-client-CDZLSNXE.mjs.map → ai-client-OK5SMYJC.mjs.map} +2 -2
  5. package/dist/lib/browser/{app-graph-builder-GU6ZWSP4.mjs → app-graph-builder-ZXKGE3H5.mjs} +5 -35
  6. package/dist/lib/browser/app-graph-builder-ZXKGE3H5.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-FQ4L5NYW.mjs → chunk-7CAHKTZQ.mjs} +56 -45
  8. package/dist/lib/browser/chunk-7CAHKTZQ.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-SBFJKCVU.mjs → chunk-BGMQ2YYP.mjs} +24 -69
  10. package/dist/lib/browser/chunk-BGMQ2YYP.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-IAMR2FAE.mjs → chunk-E7BN4QKP.mjs} +9 -2
  12. package/dist/lib/browser/{chunk-IAMR2FAE.mjs.map → chunk-E7BN4QKP.mjs.map} +3 -3
  13. package/dist/lib/browser/index.mjs +8 -8
  14. package/dist/lib/browser/index.mjs.map +2 -2
  15. package/dist/lib/browser/{intent-resolver-YAQELTFQ.mjs → intent-resolver-W6XREK5F.mjs} +2 -2
  16. package/dist/lib/browser/meta.json +1 -1
  17. package/dist/lib/browser/{react-surface-JOATHBJ4.mjs → react-surface-QMI5KG4H.mjs} +5 -14
  18. package/dist/lib/browser/react-surface-QMI5KG4H.mjs.map +7 -0
  19. package/dist/lib/browser/{settings-PAJLJEVW.mjs → settings-LAJZQI4H.mjs} +2 -2
  20. package/dist/lib/browser/types/index.mjs +3 -1
  21. package/dist/lib/node/{AssistantDialog-7V7RRSIL.cjs → AssistantDialog-SDS2TE5L.cjs} +7 -7
  22. package/dist/lib/node/{ChatContainer-UWYNOALW.cjs → ChatContainer-U6AVMAHY.cjs} +7 -7
  23. package/dist/lib/node/{ai-client-URCCYU6B.cjs → ai-client-3EVTLXTT.cjs} +4 -4
  24. package/dist/lib/node/{ai-client-URCCYU6B.cjs.map → ai-client-3EVTLXTT.cjs.map} +2 -2
  25. package/dist/lib/node/{app-graph-builder-CEMLCKAF.cjs → app-graph-builder-TXHPXIIC.cjs} +12 -42
  26. package/dist/lib/node/app-graph-builder-TXHPXIIC.cjs.map +7 -0
  27. package/dist/lib/node/{chunk-APRU3QWK.cjs → chunk-5UELRDHQ.cjs} +13 -5
  28. package/dist/lib/node/{chunk-APRU3QWK.cjs.map → chunk-5UELRDHQ.cjs.map} +3 -3
  29. package/dist/lib/node/{chunk-ENBPNIJZ.cjs → chunk-CWHFK36A.cjs} +76 -64
  30. package/dist/lib/node/chunk-CWHFK36A.cjs.map +7 -0
  31. package/dist/lib/node/{chunk-KWBQ5P7D.cjs → chunk-XBJO453B.cjs} +28 -69
  32. package/dist/lib/node/chunk-XBJO453B.cjs.map +7 -0
  33. package/dist/lib/node/index.cjs +41 -41
  34. package/dist/lib/node/index.cjs.map +3 -3
  35. package/dist/lib/node/{intent-resolver-RNMYSJ3E.cjs → intent-resolver-MUJMV7II.cjs} +9 -9
  36. package/dist/lib/node/meta.json +1 -1
  37. package/dist/lib/node/{react-surface-7RIXMLMN.cjs → react-surface-SAJF4XBB.cjs} +16 -24
  38. package/dist/lib/node/react-surface-SAJF4XBB.cjs.map +7 -0
  39. package/dist/lib/node/{settings-JBEYMZ4S.cjs → settings-NPXTE6ND.cjs} +6 -6
  40. package/dist/lib/node/types/index.cjs +14 -12
  41. package/dist/lib/node/types/index.cjs.map +2 -2
  42. package/dist/lib/node-esm/{AssistantDialog-N24M73FW.mjs → AssistantDialog-KGA5HBFO.mjs} +3 -3
  43. package/dist/lib/node-esm/{ChatContainer-KPWY5UK4.mjs → ChatContainer-XPNXNPSW.mjs} +3 -3
  44. package/dist/lib/node-esm/{ai-client-WMHS5EGV.mjs → ai-client-LYCBXZI7.mjs} +1 -1
  45. package/dist/lib/node-esm/{ai-client-WMHS5EGV.mjs.map → ai-client-LYCBXZI7.mjs.map} +2 -2
  46. package/dist/lib/node-esm/{app-graph-builder-Y45WYAWL.mjs → app-graph-builder-SV4WC2E2.mjs} +5 -35
  47. package/dist/lib/node-esm/app-graph-builder-SV4WC2E2.mjs.map +7 -0
  48. package/dist/lib/node-esm/{chunk-MXK2EANZ.mjs → chunk-ECYNZYEG.mjs} +9 -2
  49. package/dist/lib/node-esm/{chunk-MXK2EANZ.mjs.map → chunk-ECYNZYEG.mjs.map} +3 -3
  50. package/dist/lib/node-esm/{chunk-PFWTW22U.mjs → chunk-R7Q3OHWG.mjs} +24 -69
  51. package/dist/lib/node-esm/chunk-R7Q3OHWG.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-JE47GNTB.mjs → chunk-XFUXN5QU.mjs} +56 -45
  53. package/dist/lib/node-esm/chunk-XFUXN5QU.mjs.map +7 -0
  54. package/dist/lib/node-esm/index.mjs +8 -8
  55. package/dist/lib/node-esm/index.mjs.map +2 -2
  56. package/dist/lib/node-esm/{intent-resolver-V2ZFI5C4.mjs → intent-resolver-DZY2O2DG.mjs} +2 -2
  57. package/dist/lib/node-esm/meta.json +1 -1
  58. package/dist/lib/node-esm/{react-surface-UUHNOYST.mjs → react-surface-R43NHNMC.mjs} +5 -14
  59. package/dist/lib/node-esm/react-surface-R43NHNMC.mjs.map +7 -0
  60. package/dist/lib/node-esm/{settings-KAMA6RIY.mjs → settings-K3JDH2I5.mjs} +2 -2
  61. package/dist/lib/node-esm/types/index.mjs +3 -1
  62. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/index.d.ts +1 -1
  65. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  67. package/dist/types/src/components/AssistantSettings/AssistantSettings.d.ts.map +1 -1
  68. package/dist/types/src/components/index.d.ts +0 -1
  69. package/dist/types/src/components/index.d.ts.map +1 -1
  70. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  71. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -1
  72. package/dist/types/src/types/types.d.ts +3 -1
  73. package/dist/types/src/types/types.d.ts.map +1 -1
  74. package/package.json +57 -57
  75. package/src/AssistantPlugin.tsx +2 -2
  76. package/src/capabilities/ai-client.ts +0 -1
  77. package/src/capabilities/app-graph-builder.ts +2 -26
  78. package/src/capabilities/index.ts +1 -1
  79. package/src/capabilities/react-surface.tsx +2 -15
  80. package/src/components/AssistantSettings/AssistantSettings.tsx +28 -6
  81. package/src/components/Thread/ThreadContainer.stories.tsx +3 -3
  82. package/src/components/Thread/ThreadMessage.tsx +5 -2
  83. package/src/components/index.ts +0 -1
  84. package/src/hooks/processor.ts +25 -2
  85. package/src/hooks/useChatProcessor.tsx +2 -1
  86. package/src/translations.ts +1 -1
  87. package/src/types/types.ts +4 -1
  88. package/dist/lib/browser/app-graph-builder-GU6ZWSP4.mjs.map +0 -7
  89. package/dist/lib/browser/chunk-FQ4L5NYW.mjs.map +0 -7
  90. package/dist/lib/browser/chunk-SBFJKCVU.mjs.map +0 -7
  91. package/dist/lib/browser/react-surface-JOATHBJ4.mjs.map +0 -7
  92. package/dist/lib/node/app-graph-builder-CEMLCKAF.cjs.map +0 -7
  93. package/dist/lib/node/chunk-ENBPNIJZ.cjs.map +0 -7
  94. package/dist/lib/node/chunk-KWBQ5P7D.cjs.map +0 -7
  95. package/dist/lib/node/react-surface-7RIXMLMN.cjs.map +0 -7
  96. package/dist/lib/node-esm/app-graph-builder-Y45WYAWL.mjs.map +0 -7
  97. package/dist/lib/node-esm/chunk-JE47GNTB.mjs.map +0 -7
  98. package/dist/lib/node-esm/chunk-PFWTW22U.mjs.map +0 -7
  99. package/dist/lib/node-esm/react-surface-UUHNOYST.mjs.map +0 -7
  100. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +0 -6
  101. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +0 -1
  102. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts +0 -8
  103. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts.map +0 -1
  104. package/dist/types/src/components/ServiceRegistry/index.d.ts +0 -2
  105. package/dist/types/src/components/ServiceRegistry/index.d.ts.map +0 -1
  106. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +0 -49
  107. package/src/components/ServiceRegistry/ServiceRegistry.tsx +0 -76
  108. package/src/components/ServiceRegistry/index.ts +0 -5
  109. /package/dist/lib/browser/{AssistantDialog-77B4BSXR.mjs.map → AssistantDialog-I47GUXWR.mjs.map} +0 -0
  110. /package/dist/lib/browser/{ChatContainer-4AMJKO3T.mjs.map → ChatContainer-GAYN3FEF.mjs.map} +0 -0
  111. /package/dist/lib/browser/{intent-resolver-YAQELTFQ.mjs.map → intent-resolver-W6XREK5F.mjs.map} +0 -0
  112. /package/dist/lib/browser/{settings-PAJLJEVW.mjs.map → settings-LAJZQI4H.mjs.map} +0 -0
  113. /package/dist/lib/node/{AssistantDialog-7V7RRSIL.cjs.map → AssistantDialog-SDS2TE5L.cjs.map} +0 -0
  114. /package/dist/lib/node/{ChatContainer-UWYNOALW.cjs.map → ChatContainer-U6AVMAHY.cjs.map} +0 -0
  115. /package/dist/lib/node/{intent-resolver-RNMYSJ3E.cjs.map → intent-resolver-MUJMV7II.cjs.map} +0 -0
  116. /package/dist/lib/node/{settings-JBEYMZ4S.cjs.map → settings-NPXTE6ND.cjs.map} +0 -0
  117. /package/dist/lib/node-esm/{AssistantDialog-N24M73FW.mjs.map → AssistantDialog-KGA5HBFO.mjs.map} +0 -0
  118. /package/dist/lib/node-esm/{ChatContainer-KPWY5UK4.mjs.map → ChatContainer-XPNXNPSW.mjs.map} +0 -0
  119. /package/dist/lib/node-esm/{intent-resolver-V2ZFI5C4.mjs.map → intent-resolver-DZY2O2DG.mjs.map} +0 -0
  120. /package/dist/lib/node-esm/{settings-KAMA6RIY.mjs.map → settings-K3JDH2I5.mjs.map} +0 -0
@@ -9,7 +9,7 @@ import { type ArtifactDefinition, type Message, type MessageContentBlock, type T
9
9
  import { type AIServiceClient, AISession, DEFAULT_EDGE_MODEL, type GenerateRequest } from '@dxos/assistant';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { log } from '@dxos/log';
12
- import { type Space } from '@dxos/react-client/echo';
12
+ import { getVersion, type Space } from '@dxos/react-client/echo';
13
13
 
14
14
  // TODO(burdon): Factor out.
15
15
  declare global {
@@ -99,7 +99,7 @@ export class ChatProcessor {
99
99
  * Make GPT request.
100
100
  */
101
101
  async request(message: string, options: RequestOptions = {}): Promise<Message[]> {
102
- this._session = new AISession({ operationModel: 'immediate' });
102
+ this._session = new AISession({ operationModel: 'configured' });
103
103
 
104
104
  // Message complete.
105
105
  this._session.message.on((message) => {
@@ -125,10 +125,33 @@ export class ChatProcessor {
125
125
  client: this._ai,
126
126
  history: options.history ?? [],
127
127
  artifacts: this._artifacts ?? [],
128
+ requiredArtifactIds: this._artifacts?.map((artifact) => artifact.id) ?? [],
128
129
  tools: this._tools ?? [],
129
130
  prompt: message,
130
131
  systemPrompt: this._options.systemPrompt,
131
132
  extensions: this._extensions,
133
+ artifactDiffResolver: async (artifacts) => {
134
+ const space = this._extensions?.space;
135
+ if (!space) {
136
+ return new Map();
137
+ }
138
+ const versions = new Map();
139
+ await Promise.all(
140
+ artifacts.map(async (artifact) => {
141
+ const {
142
+ objects: [object],
143
+ } = await space.db.query({ id: artifact.id }).run();
144
+ if (!object) {
145
+ return;
146
+ }
147
+ versions.set(artifact.id, {
148
+ version: getVersion(object),
149
+ diff: `Current state: ${JSON.stringify(object)}`,
150
+ });
151
+ }),
152
+ );
153
+ return versions;
154
+ },
132
155
  generationOptions: {
133
156
  model: this._options.model,
134
157
  },
@@ -33,7 +33,8 @@ export const useChatProcessor = ({
33
33
  chat,
34
34
  space,
35
35
  settings,
36
- part = 'deck',
36
+ // part = 'deck',
37
+ part,
37
38
  associatedArtifact,
38
39
  }: UseChatProcessorProps): ChatProcessor => {
39
40
  const aiClient = useCapability(AssistantCapabilities.AiClient);
@@ -47,7 +47,7 @@ export default [
47
47
 
48
48
  'settings default label': 'Default',
49
49
  'settings custom prompts label': 'Use custom prompts',
50
- 'settings llm provider label': 'Enable Ollama integration',
50
+ 'settings llm provider label': 'LLM provider',
51
51
  'settings edge llm model label': 'Remote language model',
52
52
  'settings ollama llm model label': 'Ollama language model',
53
53
  },
@@ -31,11 +31,14 @@ export namespace AssistantAction {
31
31
  }) {}
32
32
  }
33
33
 
34
+ export const LLM_PROVIDERS = ['edge', 'ollama', 'lmstudio'] as const;
35
+
34
36
  export const AssistantSettingsSchema = S.mutable(
35
37
  S.Struct({
36
- llmProvider: S.optional(S.Literal('edge', 'ollama')),
38
+ llmProvider: S.optional(S.Literal(...LLM_PROVIDERS)),
37
39
  edgeModel: S.optional(S.String),
38
40
  ollamaModel: S.optional(S.String),
41
+ lmstudioModel: S.optional(S.String),
39
42
  customPrompts: S.optional(S.Boolean),
40
43
  }),
41
44
  );
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n Capabilities,\n contributes,\n createIntent,\n LayoutAction,\n type PromiseIntentDispatcher,\n type PluginsContext,\n} from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { createExtension, type Node, ROOT_ID } from '@dxos/plugin-graph';\nimport { memoizeQuery } from '@dxos/plugin-space';\nimport { SPACE_TYPE, SpaceAction } from '@dxos/plugin-space/types';\nimport { type Space, Filter, fullyQualifiedId, getSpace, isLiveObject, parseId } from '@dxos/react-client/echo';\n\nimport { ASSISTANT_DIALOG, ASSISTANT_PLUGIN } from '../meta';\nimport { AIChatType, AssistantAction, TemplateType } from '../types';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${ASSISTANT_PLUGIN}/assistant`,\n filter: (node): node is Node<null> => node.id === ROOT_ID,\n actions: () => [\n {\n id: `${LayoutAction.UpdateDialog._tag}/assistant/open`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const client = context.requestCapability(ClientCapabilities.Client);\n const layout = context.requestCapability(Capabilities.Layout);\n const { graph } = context.requestCapability(Capabilities.AppGraph);\n\n // TODO(burdon): Get space from workspace.\n // TODO(burdon): If need to create chat, then add to dispatch stack below.\n let chat: AIChatType | undefined;\n if (layout.active.length > 0) {\n const node = graph.findNode(layout.active[0]);\n if (node) {\n const space = getSpace(node.data);\n if (space) {\n chat = await getOrCreateChat(dispatch, space);\n }\n }\n } else {\n const space = client.spaces.default;\n chat = await getOrCreateChat(dispatch, space);\n }\n\n if (!chat) {\n return;\n }\n\n await dispatch(\n createIntent(LayoutAction.UpdateDialog, {\n part: 'dialog',\n subject: ASSISTANT_DIALOG,\n options: {\n state: true,\n blockAlign: 'end',\n props: {\n chat,\n },\n },\n }),\n );\n },\n properties: {\n label: ['open assistant label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--star-four--regular',\n disposition: 'pin-end',\n position: 'hoist',\n keyBinding: {\n macos: 'shift+meta+k',\n windows: 'shift+ctrl+k',\n },\n },\n },\n ],\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/service-registry`,\n filter: (node): node is Node<null> => node.id === 'root',\n connector: ({ node }) => {\n const layout = context.requestCapability(Capabilities.Layout);\n const client = context.requestCapability(ClientCapabilities.Client);\n const { spaceId } = parseId(layout.workspace);\n const space = spaceId ? client.spaces.get(spaceId) : null;\n\n return [\n {\n id: [node.id, 'service-registry'].join(ATTENDABLE_PATH_SEPARATOR),\n type: DECK_COMPANION_TYPE,\n data: space,\n properties: {\n label: ['service registry label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--plugs--regular',\n disposition: 'hidden',\n },\n },\n ];\n },\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/object-chat-companion`,\n filter: (node): node is Node<AIChatType> =>\n isLiveObject(node.data) && node.data.assistantChatQueue && node.data.type !== AIChatType.typename,\n connector: ({ node }) => [\n {\n id: [node.id, 'assistant-chat'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'assistant-chat',\n properties: {\n label: ['assistant chat label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--star-four--regular',\n position: 'hoist',\n },\n },\n ],\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/root`,\n filter: (node): node is Node<Space> => node.type === SPACE_TYPE,\n connector: ({ node }) => {\n const templates = memoizeQuery(node.data, Filter.schema(TemplateType));\n return templates.length > 0\n ? [\n {\n id: `${ASSISTANT_PLUGIN}/templates`,\n type: `${ASSISTANT_PLUGIN}/templates`,\n data: null,\n properties: {\n label: ['templates label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--file-code--regular',\n space: node.data,\n },\n },\n ]\n : [];\n },\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/templates`,\n filter: (node): node is Node<null, { space: Space }> => node.id === `${ASSISTANT_PLUGIN}/templates`,\n connector: ({ node }) => {\n const templates = memoizeQuery(node.properties.space, Filter.schema(TemplateType));\n return templates\n .toSorted((a, b) => {\n const nameA = a.name ?? '';\n const nameB = b.name ?? '';\n return nameA.localeCompare(nameB);\n })\n .map((template) => ({\n id: fullyQualifiedId(template),\n type: `${ASSISTANT_PLUGIN}/template`,\n data: template,\n properties: {\n label: template.name ?? ['object placeholder', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--file-code--regular',\n },\n }));\n },\n }),\n ]);\n\n// TODO(burdon): Factor out.\nconst getOrCreateChat = async (dispatch: PromiseIntentDispatcher, space: Space): Promise<AIChatType | undefined> => {\n const { objects } = await space.db.query(Filter.schema(AIChatType)).run();\n // console.log('objects', JSON.stringify(objects, null, 2));\n if (objects.length > 0) {\n // TODO(burdon): Is this the most recent?\n return objects[objects.length - 1];\n }\n\n const { data } = await dispatch(createIntent(AssistantAction.CreateChat, { spaceId: space.id }));\n invariant(data?.object instanceof AIChatType);\n await dispatch(createIntent(SpaceAction.AddObject, { target: space, object: data.object }));\n return data.object;\n};\n"],
5
- "mappings": "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",
6
- "names": ["Capabilities", "contributes", "createIntent", "LayoutAction", "invariant", "ClientCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "DECK_COMPANION_TYPE", "createExtension", "ROOT_ID", "memoizeQuery", "SPACE_TYPE", "SpaceAction", "Filter", "fullyQualifiedId", "getSpace", "isLiveObject", "parseId", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "ASSISTANT_PLUGIN", "filter", "node", "ROOT_ID", "actions", "LayoutAction", "UpdateDialog", "_tag", "data", "dispatchPromise", "dispatch", "requestCapability", "IntentDispatcher", "client", "ClientCapabilities", "Client", "layout", "Layout", "graph", "AppGraph", "chat", "active", "length", "findNode", "space", "getSpace", "getOrCreateChat", "spaces", "default", "createIntent", "part", "subject", "ASSISTANT_DIALOG", "options", "state", "blockAlign", "props", "properties", "label", "ns", "icon", "disposition", "position", "keyBinding", "macos", "windows", "connector", "spaceId", "parseId", "workspace", "get", "join", "ATTENDABLE_PATH_SEPARATOR", "type", "DECK_COMPANION_TYPE", "isLiveObject", "assistantChatQueue", "AIChatType", "typename", "PLANK_COMPANION_TYPE", "SPACE_TYPE", "templates", "memoizeQuery", "Filter", "schema", "TemplateType", "toSorted", "a", "b", "nameA", "name", "nameB", "localeCompare", "map", "template", "fullyQualifiedId", "objects", "db", "query", "run", "AssistantAction", "CreateChat", "invariant", "object", "SpaceAction", "AddObject", "target"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/Toolbox/Toolbox.tsx", "../../../src/tools/function.ts", "../../../src/tools/openapi.ts", "../../../src/components/Thread/Thread.tsx", "../../../src/components/Thread/ThreadMessage.tsx", "../../../src/components/Thread/ToolInvocations.tsx", "../../../src/components/Thread/reducer.ts", "../../../src/components/Prompt/Prompt.tsx", "../../../src/components/Prompt/autocomplete.ts", "../../../src/components/Prompt/references.ts", "../../../src/components/Prompt/PromptBar.tsx", "../../../src/components/Thread/ThreadContainer.tsx", "../../../src/hooks/processor.ts", "../../../src/hooks/useChatProcessor.tsx", "../../../src/capabilities/index.ts", "../../../src/hooks/useLocalTriggerManager.ts", "../../../src/hooks/invocation-handler.ts", "../../../src/hooks/useMessageQueue.ts", "../../../src/hooks/useServices.ts", "../../../src/testing/test-functions.ts", "../../../src/testing/test-services.ts", "../../../src/hooks/useTextInputEvents.ts", "../../../src/hooks/useContextProvider.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useState, useEffect, Fragment, type FC } from 'react';\n\nimport { Capabilities, useCapabilities } from '@dxos/app-framework';\nimport { parseToolName, type ArtifactDefinition, type Tool } from '@dxos/artifact';\nimport { FunctionType } from '@dxos/functions/types';\nimport { log } from '@dxos/log';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { createToolsFromService } from '../../tools';\nimport { ServiceType } from '../../types';\n\nexport type ToolboxProps = ThemedClassName<{\n artifacts?: ArtifactDefinition[];\n services?: { service: ServiceType; tools: Tool[] }[];\n functions?: FunctionType[];\n striped?: boolean;\n}>;\n\nexport const Toolbox = ({ classNames, artifacts, functions, services, striped }: ToolboxProps) => {\n return (\n <div className={mx('flex flex-col overflow-y-auto box-content', classNames)}>\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 </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 const ToolboxContainer = ({ classNames, space }: ThemedClassName<{ space?: Space }>) => {\n // Plugin artifacts.\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n\n // Registered services.\n const services = useQuery(space, Filter.schema(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.schema(FunctionType));\n\n return (\n <Toolbox classNames={classNames} artifacts={artifactDefinitions} services={serviceTools} functions={functions} />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { defineTool, ToolResult } from '@dxos/artifact';\nimport type { Tool } from '@dxos/artifact';\nimport { toEffectSchema } from '@dxos/echo-schema';\nimport { getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions/types';\nimport type { FunctionType } from '@dxos/functions/types';\nimport { log } from '@dxos/log';\nimport type { SpaceId } from '@dxos/react-client/echo';\nimport { getMeta } from '@dxos/react-client/echo';\n\nexport const covertFunctionToTool = (\n fn: FunctionType,\n edgeUrl: string,\n spaceId?: SpaceId | undefined,\n): Tool | undefined => {\n if (!fn.description || !fn.inputSchema) {\n return undefined;\n }\n\n const existingFunctionUrl = getUserFunctionUrlInMetadata(getMeta(fn));\n if (!existingFunctionUrl) {\n return undefined;\n }\n const url = getInvocationUrl(existingFunctionUrl, edgeUrl, {\n spaceId,\n });\n\n return defineTool('user-function', {\n name: fn.name,\n description: fn.description,\n schema: toEffectSchema(fn.inputSchema),\n execute: async (input) => {\n log.info('execute function tool', { name: fn.name, url, input });\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(input),\n });\n return ToolResult.Success(await response.text());\n },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport jsonpointer from 'jsonpointer';\nimport { type OpenAPIV2, type OpenAPIV3_1 } from 'openapi-types';\n\nimport { ToolResult, type Tool } from '@dxos/artifact';\nimport { JsonSchemaType, normalizeSchema, S, toEffectSchema } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { deepMapValues } from '@dxos/util';\n\nimport type { ApiAuthorization, ServiceType } from '../types';\n\nexport type CreateToolsFromApiOptions = {\n authorization?: ApiAuthorization;\n instructions?: string;\n};\n\nexport const createToolsFromService = async (service: ServiceType): Promise<Tool[]> => {\n invariant(service.interfaces?.length === 1 && service.interfaces[0].kind === 'api');\n const iface = service.interfaces[0];\n invariant(iface.schemaUrl);\n invariant(iface.schemaUrl);\n return createToolsFromApi(iface.schemaUrl, { authorization: iface.authorization });\n};\n\nexport const createToolsFromApi = async (url: string, options?: CreateToolsFromApiOptions): Promise<Tool[]> => {\n const res = await fetch(url);\n const spec = (await res.json()) as OpenAPIV2.Document;\n log('spec', { spec });\n\n const tools: Tool[] = [];\n for (const [path, pathItem] of Object.entries(spec.paths)) {\n if (typeof pathItem !== 'object') {\n continue;\n }\n\n // TODO(burdon): ???\n const { ...methods } = pathItem;\n for (const [method, m] of Object.entries(methods)) {\n const methodItem: OpenAPIV2.OperationObject = m as OpenAPIV2.OperationObject;\n log('methodItem', { path, method, methodItem });\n\n const parametersResolved: OpenAPIV2.ParameterObject[] =\n methodItem.parameters?.map((parameter: any) => {\n const resolved = resolveJsonSchema(parameter, spec);\n return resolved;\n }) ?? [];\n\n const inputSchema: JsonSchemaType = {\n type: 'object',\n properties: {},\n };\n\n const endpointParameters: OpenAPIV2.ParameterObject[] = [];\n for (const parameter of parametersResolved) {\n log('parameter', { parameter });\n\n if (\n options?.authorization?.type === 'api-key' &&\n options.authorization.placement.type === 'query' &&\n parameter.in === 'query' &&\n parameter.name === options.authorization.placement.name\n ) {\n continue;\n }\n\n endpointParameters.push(parameter);\n\n if (parameter.schema) {\n inputSchema.properties![parameter.name] = normalizeSchema(parameter.schema);\n } else if (typeof parameter.type === 'string') {\n const { name, in: _in, required, ...schema } = parameter;\n inputSchema.properties![name] = normalizeSchema(schema);\n if (required) {\n inputSchema.required ??= [];\n inputSchema.required!.push(name);\n }\n }\n }\n\n log('inputSchema', { inputSchema });\n S.validateSync(JsonSchemaType)(inputSchema);\n\n const description = methodItem.description ?? methodItem.summary;\n if (!description) {\n log.warn('no description', { path, method });\n continue;\n }\n\n const endpoint: EndpointDescriptor = {\n document: spec,\n path,\n method,\n parameters: endpointParameters,\n authorization: options?.authorization,\n };\n\n tools.push({\n name: getToolName(path, method, methodItem),\n description: options?.instructions ? `${options.instructions}\\n\\n${description}` : description,\n parameters: inputSchema,\n execute: async (input) => {\n const response = await callApiEndpoint(endpoint, input);\n return ToolResult.Success(response);\n },\n });\n }\n }\n\n return tools;\n};\n\nconst getToolName = (path: string, method: string, methodItem: OpenAPIV2.OperationObject) => {\n if (methodItem.operationId) {\n return methodItem.operationId;\n }\n\n // Generate a name from the path and method.\n let name = `${method.toLowerCase()}_${path.replaceAll(/[{}/]/g, '_')}`;\n while (name.length > MAX_TOOL_NAME_LENGTH) {\n const lengthBefore = name.length;\n\n for (const word of GENERIC_WORDS) {\n if (name.includes(word)) {\n name = name.replace(word, '');\n break;\n }\n }\n name = name.replaceAll('__', '_').replace(/_$/, '');\n\n const lengthAfter = name.length;\n if (lengthBefore === lengthAfter) {\n break;\n }\n }\n name = name.replaceAll('__', '_').replace(/_$/, '').replace(/^_/, '');\n\n return name.slice(0, MAX_TOOL_NAME_LENGTH);\n};\n\nconst MAX_TOOL_NAME_LENGTH = 64;\nconst GENERIC_WORDS = [\n 'services',\n 'service',\n 'api',\n 'rest',\n 'endpoint',\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n 'head',\n 'options',\n 'trace',\n 'service',\n 'api',\n 'endpoint',\n];\n\ntype EndpointDescriptor = {\n document: OpenAPIV3_1.Document | OpenAPIV2.Document;\n path: string;\n method: string;\n parameters: OpenAPIV2.ParameterObject[];\n authorization?: ApiAuthorization;\n};\n\nconst callApiEndpoint = async (endpoint: EndpointDescriptor, input: any) => {\n log.info('endpoint', { method: endpoint.method, name: endpoint.path, input });\n\n let url = getEndpointUrl(endpoint);\n const request: RequestInit = {\n method: endpoint.method,\n headers: {},\n };\n const query = new URLSearchParams();\n let body: any;\n for (const parameter of endpoint.parameters) {\n if (input[parameter.name] === undefined) {\n continue;\n }\n\n switch (parameter.in) {\n case 'header': {\n if (parameter.example) {\n (request.headers as any)[parameter.name] = parameter.default;\n }\n break;\n }\n case 'path': {\n url = url.replace(`{${parameter.name}}`, encodeURIComponent(input[parameter.name]));\n break;\n }\n case 'body': {\n const value = input[parameter.name];\n\n // Client-side validation\n const effectSchema = toEffectSchema(parameter.schema);\n S.validateSync(effectSchema)(value);\n\n if (body) {\n throw new Error(`Duplicate body parameter: ${parameter.name}`);\n }\n body = value;\n break;\n }\n case 'query': {\n query.set(parameter.name, input[parameter.name]);\n break;\n }\n }\n }\n\n if (\n (endpoint.authorization?.type === 'api-key' && endpoint.authorization.placement.type === 'authorization-header') ||\n endpoint.authorization?.type === 'oauth'\n ) {\n (request.headers as any).Authorization = await resolveAuthorization(endpoint.authorization);\n } else if (endpoint.authorization?.type === 'api-key' && endpoint.authorization.placement.type === 'query') {\n query.set(endpoint.authorization.placement.name, endpoint.authorization.key);\n }\n\n if (query.size > 0) {\n url += `?${query.toString()}`;\n }\n\n if (body) {\n request.body = JSON.stringify(body);\n (request.headers as any)['Content-Type'] = 'application/json';\n }\n\n log.info('request', { url, request });\n const response = await fetch(url, request);\n\n log.info('response', { ok: response.ok, status: response.status, statusText: response.statusText });\n\n if (response.ok) {\n const contentType = response.headers.get('Content-Type');\n if (contentType?.includes('application/json')) {\n return await response.json();\n } else {\n return await response.text();\n }\n } else {\n if (response.headers.get('Content-Type')?.includes('application/json')) {\n const responseBody = await response.text();\n let error: any;\n try {\n error = JSON.parse(responseBody);\n } catch {\n error = responseBody;\n }\n log.error('error', { error });\n throw new Error(error.message);\n } else {\n const error = await response.text();\n log.error('error', { error });\n throw new Error(error);\n }\n }\n};\n\nconst getEndpointUrl = (endpoint: EndpointDescriptor) => {\n let url = '';\n if (isV3_1(endpoint.document) && endpoint.document.servers && endpoint.document.servers.length > 0) {\n url = endpoint.document.servers[0].url;\n } else {\n invariant(!isV3_1(endpoint.document));\n url = `${endpoint.document.schemes?.[0] ?? 'https'}://${endpoint.document.host}`;\n }\n\n if (!isV3_1(endpoint.document) && endpoint.document.basePath) {\n url += endpoint.document.basePath;\n }\n\n url += endpoint.path;\n\n return url;\n};\n\nexport const resolveAuthorization = async (authorization: ApiAuthorization): Promise<string> => {\n switch (authorization.type) {\n case 'api-key': {\n invariant(authorization.placement.type === 'authorization-header');\n return `Bearer ${authorization.key}`;\n }\n case 'oauth': {\n const response = await fetch(authorization.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: `grant_type=${authorization.grantType}&client_id=${authorization.clientId}&client_secret=${authorization.clientSecret}`,\n });\n const data = await response.json();\n return `Bearer ${data.access_token}`;\n }\n default: {\n throw new Error(`Unknown authorization type: ${(authorization as any).type}`);\n }\n }\n};\n\n/**\n * Resolves all $ref properties in a JSON schema.\n * Doesn't assume the structure of the schema.\n * The function looks from $ref properties in the schema and resolves them to their values in the base object.\n */\nconst resolveJsonSchema = (schema: any, base: any) => {\n return deepMapValues(schema, (value, recurse) => {\n if (typeof value === 'object' && value !== null && '$ref' in value && typeof value.$ref === 'string') {\n if (value.$ref.startsWith('#')) {\n const resolved = jsonpointer.get(base, value.$ref.slice(1));\n if (resolved) {\n return recurse(resolved);\n } else {\n log.warn('unresolved', { ref: value.$ref, base });\n }\n }\n }\n return recurse(value);\n });\n};\n\nconst isV3_1 = (document: OpenAPIV3_1.Document | OpenAPIV2.Document): document is OpenAPIV3_1.Document => {\n return (document as any).openapi === '3.0.1';\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type CSSProperties, useCallback, useMemo, useRef } from 'react';\n\nimport { type Message } from '@dxos/artifact';\nimport { type Space } from '@dxos/react-client/echo';\nimport { useIdentity } 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 { keyToFallback } from '@dxos/util';\n\nimport { ThreadMessage, type ThreadMessageProps } from './ThreadMessage';\nimport { messageReducer } from './reducer';\nimport { PromptBar, type PromptBarProps } from '../Prompt';\nimport type { ReferenceData, ReferencesProvider } from '../Prompt/references';\n\nexport interface ContextProvider {\n query({ query }: { query: string }): Promise<ReferenceData[]>;\n\n resolveMetadata({ uri }: { uri: string }): Promise<ReferenceData | null>;\n}\n\nexport type ThreadProps = ThemedClassName<{\n space?: Space;\n messages?: Message[];\n collapse?: boolean;\n transcription?: boolean;\n onOpenChange?: (open: boolean) => void;\n contextProvider?: ContextProvider;\n}> &\n Pick<PromptBarProps, 'processing' | 'error' | 'onSubmit' | 'onSuggest' | 'onCancel'> &\n Pick<ThreadMessageProps, 'debug' | 'tools' | 'onPrompt' | 'onDelete'>;\n\n/**\n * Chat thread component.\n */\nexport const Thread = ({\n classNames,\n space,\n messages,\n collapse = true,\n transcription,\n processing,\n error,\n onSubmit,\n onCancel,\n onOpenChange,\n contextProvider,\n ...props\n}: ThreadProps) => {\n const scroller = useRef<ScrollController>(null);\n\n const identity = useIdentity();\n const fallbackValue = keyToFallback(identity!.identityKey);\n const userHue = identity!.profile?.data?.hue || fallbackValue.hue;\n\n const handleSubmit = useCallback<NonNullable<PromptBarProps['onSubmit']>>(\n (value: string) => {\n onSubmit?.(value);\n scroller.current?.scrollToBottom();\n return true;\n },\n [onSubmit],\n );\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: Message[]; current?: Message }>(messageReducer, {\n messages: [],\n });\n } else {\n return { messages: messages ?? [] };\n }\n }, [messages, collapse]);\n\n const references = useMemo<ReferencesProvider | undefined>(() => {\n if (!contextProvider) {\n return undefined;\n }\n\n return {\n getReferences: async ({ query }: { query: string }) => contextProvider.query({ query }),\n resolveReference: async ({ uri }: { uri: string }) => contextProvider.resolveMetadata({ uri }),\n };\n }, [contextProvider]);\n\n return (\n <div role='none' className={mx('flex flex-col grow overflow-hidden', classNames)}>\n <ScrollContainer ref={scroller} fade>\n <div\n role='none'\n className={mx(filteredMessages.length > 0 && 'pbs-6 pbe-6')}\n style={{ '--user-fill': `var(--dx-${userHue}Fill)` } as CSSProperties}\n >\n {filteredMessages.map((message) => (\n <ThreadMessage key={message.id} classNames='px-4 pbe-4' space={space} message={message} {...props} />\n ))}\n </div>\n </ScrollContainer>\n\n {onSubmit && (\n <PromptBar\n microphone={transcription}\n processing={processing}\n error={error}\n onSubmit={handleSubmit}\n onCancel={onCancel}\n onOpenChange={onOpenChange}\n references={references}\n />\n )}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, type FC } from 'react';\n\nimport { type MessageContentBlock, type Message, type ToolType } from '@dxos/artifact';\nimport { invariant } from '@dxos/invariant';\nimport { type Space } from '@dxos/react-client/echo';\nimport { Button, Icon, IconButton, type ThemedClassName } from '@dxos/react-ui';\nimport {\n MarkdownViewer,\n ToggleContainer as NativeToggleContainer,\n type ToggleContainerProps,\n} from '@dxos/react-ui-components';\nimport { Json } from '@dxos/react-ui-syntax-highlighter';\nimport { mx } from '@dxos/react-ui-theme';\nimport { safeParseJson } from '@dxos/util';\n\nimport { ToolBlock, isToolMessage } from './ToolInvocations';\nimport { ToolboxContainer } from '../Toolbox';\n\nconst panelClassNames = 'flex flex-col w-full px-2 bg-groupSurface rounded-md';\nconst userClassNames = 'bg-[--user-fill] text-inverse';\n\nconst ToggleContainer = (props: ToggleContainerProps) => {\n return <NativeToggleContainer {...props} classNames={mx(panelClassNames, props.classNames)} />;\n};\n\nconst MessageContainer = ({ children, classNames, user }: ThemedClassName<PropsWithChildren<{ user?: boolean }>>) => {\n if (!children) {\n return null;\n }\n\n return (\n <div role='list-item' className={mx('flex w-full', user && 'justify-end', classNames)}>\n <div className={mx(user ? ['px-2 py-1 rounded-md', userClassNames] : 'w-full')}>{children}</div>\n </div>\n );\n};\n\nexport type ThreadMessageProps = ThemedClassName<{\n space?: Space;\n message: Message;\n debug?: boolean;\n tools?: ToolType[];\n onPrompt?: (text: string) => void;\n onDelete?: (id: string) => void;\n}>;\n\nexport const ThreadMessage: FC<ThreadMessageProps> = ({ classNames, space, message, tools, onPrompt }) => {\n const { role, content = [] } = 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 space={space} classNames={panelClassNames} message={message} tools={tools} />\n </MessageContainer>\n );\n }\n\n return content.map((block, idx) => {\n // TODO(burdon): Filter empty messages.\n if (block.type === 'text' && block.text.replaceAll(/\\s+/g, '').length === 0) {\n return null;\n }\n\n const Component = components[block.type] ?? components.default;\n\n return (\n <MessageContainer\n key={idx}\n classNames={mx(classNames, 'animate-[fadeIn_0.5s]')}\n user={block.type === 'text' && role === 'user'}\n >\n <Component space={space} block={block} onPrompt={onPrompt} />\n </MessageContainer>\n );\n });\n};\n\ntype BlockComponent = FC<{ space?: Space; block: MessageContentBlock; onPrompt?: (text: string) => void }>;\n\nconst components: Record<string, BlockComponent> = {\n //\n // Text\n //\n ['text' as const]: ({ block }) => {\n invariant(block.type === '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 classNames='[&>p]:animate-[fadeIn_0.5s]' 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={block.disposition === 'cot' && block.pending}\n title={title}\n icon={\n block.pending ? (\n <Icon icon={'ph--circle-notch--regular'} classNames='text-subdued ml-2 animate-spin' size={4} />\n ) : undefined\n }\n >\n <MarkdownViewer\n content={block.text}\n classNames={['pbe-2', block.disposition === 'cot' && 'text-sm text-subdued']}\n />\n </ToggleContainer>\n );\n },\n\n //\n // JSON\n //\n ['json' as const]: ({ space, block, onPrompt }) => {\n invariant(block.type === 'json');\n\n switch (block.disposition) {\n case 'tool_list': {\n return (\n <ToggleContainer title={titles[block.disposition]} defaultOpen={true}>\n <ToolboxContainer space={space} classNames='pbe-2' />\n </ToggleContainer>\n );\n }\n\n case 'suggest': {\n const { text = '' }: { text: string } = safeParseJson(block.json ?? '{}') ?? ({} as any);\n return <IconButton icon='ph--lightning--regular' label={text} onClick={() => onPrompt?.(text)} />;\n }\n\n case 'select': {\n const { options = [] }: { options: string[] } = safeParseJson(block.json ?? '{}') ?? ({} as any);\n return (\n <div className='flex flex-wrap gap-1'>\n {options.map((option, idx) => (\n <Button\n classNames={'animate-[fadeIn_0.5s] rounded-2xl text-sm'}\n key={option}\n onClick={() => onPrompt?.(option)}\n >\n {option}\n </Button>\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.json ?? block)} classNames='!p-1 text-xs' />\n </ToggleContainer>\n );\n }\n }\n },\n\n //\n // Default\n //\n default: ({ block }) => {\n let title = titles[block.type];\n if (block.type === 'tool_use') {\n title = `Tool [${block.name}]`; // TODO(burdon): Get label from tool.\n }\n\n return (\n <ToggleContainer title={title ?? 'JSON'}>\n <Json data={block} classNames='!p-1 text-xs' />\n </ToggleContainer>\n );\n },\n};\n\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};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type Message, type ToolType } from '@dxos/artifact';\nimport { log } from '@dxos/log';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { NumericTabs, StatusRoll, ToggleContainer } from '@dxos/react-ui-components';\nimport { Json } from '@dxos/react-ui-syntax-highlighter';\nimport { isNonNullable, isNotFalsy } from '@dxos/util';\n\nimport { type ThreadMessageProps } from './ThreadMessage';\n\nexport const isToolMessage = (message: Message) => {\n return message.content.some((block) => block.type === 'tool_use' || block.type === 'tool_result');\n};\n\nconst getToolName = (tool: ToolType) => {\n return tool.namespace && tool.function ? `${tool.namespace}:${tool.function}` : tool.name.split('_').pop();\n};\n\nconst getToolCaption = (tool: ToolType | undefined) => {\n if (!tool) {\n return 'Calling tool...';\n }\n\n return tool.caption ?? `Calling ${getToolName(tool)}...`;\n};\n\nexport const ToolBlock: FC<ThemedClassName<ThreadMessageProps>> = ({ classNames, message, tools }) => {\n const { content = [] } = message;\n\n let request: { tool: ToolType | undefined; block: any } | undefined;\n const blocks = content.filter((block) => block.type === 'tool_use' || block.type === 'tool_result');\n const items = blocks\n .map((block) => {\n switch (block.type) {\n case 'tool_use': {\n // TODO(burdon): Skip these updates?\n if (block.pending && request?.block.id === block.id) {\n return null;\n }\n\n request = { tool: tools?.find((tool) => tool.name === block.name), block };\n return { title: getToolCaption(request.tool), block };\n }\n\n case 'tool_result': {\n if (!request) {\n log.warn('unexpected message', { block });\n return { title: 'Error', block };\n }\n\n return { title: `${getToolCaption(request.tool)} (Success)`, block };\n }\n\n default: {\n request = undefined;\n return { title: 'Error', block };\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='grid grid-cols-[32px_1fr]'>\n <NumericTabs ref={tabsRef} length={items.length} selected={selected} onSelect={handleSelect} />\n <Json data={items[selected].block} classNames='!p-1 text-xs' />\n </div>\n </ToggleContainer>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Message } from '@dxos/artifact';\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: Message[]; current?: Message }, Message> = (\n { current, messages },\n message,\n) => {\n let i = 0;\n for (const block of message.content) {\n switch (block.type) {\n case 'tool_use':\n case 'tool_result': {\n if (current) {\n current.content.push(block);\n } else {\n current = {\n id: [message.id, i].join('_'),\n role: message.role,\n content: [block],\n };\n messages.push(current);\n }\n break;\n }\n\n case 'text':\n default: {\n current = undefined;\n messages.push({\n id: [message.id, i].join('_'),\n role: message.role,\n content: [block],\n });\n break;\n }\n }\n\n i++;\n }\n\n return { current, messages };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Prec } from '@codemirror/state';\nimport React, { forwardRef, useImperativeHandle } from 'react';\n\nimport { type ThemedClassName, useThemeContext } from '@dxos/react-ui';\nimport {\n type BasicExtensionsOptions,\n createBasicExtensions,\n createThemeExtensions,\n keymap,\n useTextEditor,\n type UseTextEditorProps,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { createAutocompleteExtension, type AutocompleteOptions } from './autocomplete';\nimport { promptReferences, type ReferencesProvider } from './references';\n\n// TODO(burdon): Handle object references.\n\nexport interface PromptController {\n focus(): void;\n setText(text: string): void;\n}\n\nexport type PromptProps = ThemedClassName<\n {\n onOpenChange?: (open: boolean) => void;\n references?: ReferencesProvider;\n } & AutocompleteOptions &\n Pick<UseTextEditorProps, 'autoFocus'> &\n Pick<BasicExtensionsOptions, 'lineWrapping' | 'placeholder'>\n>;\n\nexport const Prompt = forwardRef<PromptController, PromptProps>(\n (\n { classNames, autoFocus, lineWrapping = false, placeholder, onSubmit, onSuggest, onOpenChange, references },\n forwardRef,\n ) => {\n const { themeMode } = useThemeContext();\n const { parentRef, view } = useTextEditor(\n {\n debug: true,\n autoFocus,\n extensions: [\n createBasicExtensions({\n bracketMatching: false,\n lineWrapping,\n placeholder,\n }),\n createThemeExtensions({ themeMode }),\n references ? promptReferences({ provider: references }) : [],\n createAutocompleteExtension({ onSubmit, onSuggest }),\n Prec.highest(\n keymap.of([\n {\n key: 'cmd-ArrowUp',\n preventDefault: true,\n run: (view) => {\n onOpenChange?.(true);\n return true;\n },\n },\n {\n key: 'cmd-ArrowDown',\n preventDefault: true,\n run: (view) => {\n onOpenChange?.(false);\n return true;\n },\n },\n ]),\n ),\n ],\n },\n [themeMode, onSubmit, onSuggest],\n );\n\n // Expose editor view.\n useImperativeHandle(\n forwardRef,\n () => {\n return {\n focus: () => {\n view?.focus();\n },\n setText: (text: string) => {\n view?.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: text,\n },\n selection: {\n anchor: text.length,\n head: text.length,\n },\n });\n },\n };\n },\n [view, onSubmit],\n );\n\n return <div ref={parentRef} className={mx('w-full', classNames)} />;\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Prec, type Extension } from '@codemirror/state';\nimport {\n EditorView,\n Decoration,\n ViewPlugin,\n keymap,\n type DecorationSet,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nexport type AutocompleteOptions = {\n /**\n * Callback triggered when Enter is pressed.\n * @param text The current text in the editor\n * @returns true if the editor should reset the document.\n */\n onSubmit?: (text: string) => boolean | void;\n\n /**\n * Function that returns a list of suggestions based on the current text.\n * @param text The current text before the cursor\n * @returns Array of suggestion strings\n */\n onSuggest?: (text: string) => string[];\n};\n\n/**\n * Creates an autocomplete extension that shows inline suggestions.\n * Pressing Tab will complete the suggestion.\n */\nexport const createAutocompleteExtension = ({ onSubmit, onSuggest }: AutocompleteOptions): Extension => {\n const suggestionPlugin = ViewPlugin.fromClass(\n class {\n _decorations: DecorationSet;\n _currentSuggestion: string | null = null;\n\n constructor(view: EditorView) {\n this._decorations = this.computeDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.selectionSet) {\n this._decorations = this.computeDecorations(update.view);\n }\n }\n\n private computeDecorations(view: EditorView): DecorationSet {\n const text = view.state.doc.toString();\n const suggestions = onSuggest?.(text) ?? [];\n if (!suggestions.length) {\n this._currentSuggestion = null;\n return Decoration.none;\n }\n\n // Get the first suggestion.\n this._currentSuggestion = suggestions[0];\n const suffix = this._currentSuggestion.slice(text.length);\n if (!suffix) {\n return Decoration.none;\n }\n\n // Always show ghost text at the end of the document.\n return Decoration.set([\n Decoration.widget({\n widget: new InlineSuggestionWidget(suffix),\n side: 1,\n }).range(view.state.doc.length),\n ]);\n }\n\n completeSuggestion(view: EditorView): boolean {\n if (!this._currentSuggestion) {\n return false;\n }\n\n const text = view.state.doc.toString();\n const suffix = this._currentSuggestion.slice(text.length);\n if (!suffix) {\n return false;\n }\n\n view.dispatch({\n changes: {\n from: view.state.doc.length,\n insert: suffix,\n },\n selection: {\n anchor: view.state.doc.length + suffix.length,\n },\n });\n\n return true;\n }\n },\n {\n decorations: (v) => v._decorations,\n },\n );\n\n return [\n suggestionPlugin,\n EditorView.theme({\n '.cm-inline-suggestion': {\n opacity: 0.4,\n },\n }),\n\n // Accept the current suggestion.\n Prec.highest(\n keymap.of([\n {\n key: 'Tab',\n preventDefault: true,\n run: (view) => {\n const plugin = view.plugin(suggestionPlugin);\n return plugin?.completeSuggestion(view) ?? false;\n },\n },\n {\n key: 'ArrowRight',\n preventDefault: true,\n run: (view) => {\n // Only complete if cursor is at the end\n if (view.state.selection.main.head !== view.state.doc.length) {\n return false;\n }\n\n const plugin = view.plugin(suggestionPlugin);\n return plugin?.completeSuggestion(view) ?? false;\n },\n },\n {\n key: 'Enter',\n preventDefault: true,\n run: (view) => {\n const text = view.state.doc.toString().trim();\n if (text.length > 0 && onSubmit) {\n const reset = onSubmit(text);\n\n // Clear the document after calling onEnter.\n if (reset) {\n view.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: '',\n },\n });\n }\n }\n\n return true;\n },\n },\n {\n key: 'Shift-Enter',\n preventDefault: true,\n run: (view) => {\n view.dispatch({\n changes: {\n from: view.state.selection.main.head,\n insert: '\\n',\n },\n selection: {\n anchor: view.state.selection.main.head + 1,\n head: view.state.selection.main.head + 1,\n },\n });\n return true;\n },\n },\n {\n key: 'Escape',\n preventDefault: true,\n run: (view) => {\n // Clear the entire document.\n view.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: '',\n },\n });\n return true;\n },\n },\n ]),\n ),\n ];\n};\n\nclass InlineSuggestionWidget extends WidgetType {\n constructor(private suffix: string) {\n super();\n }\n\n override toDOM() {\n const span = document.createElement('span');\n span.textContent = this.suffix;\n span.className = 'cm-inline-suggestion';\n return span;\n }\n\n override eq(other: InlineSuggestionWidget) {\n return other.suffix === this.suffix;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { autocompletion, completionKeymap, type CompletionResult } from '@codemirror/autocomplete';\nimport { type Extension, RangeSet } from '@codemirror/state';\nimport {\n Decoration,\n EditorView,\n keymap,\n ViewPlugin,\n WidgetType,\n type DecorationSet,\n type ViewUpdate,\n} from '@codemirror/view';\n\nimport { Mutex } from '@dxos/async';\n\nexport type ReferenceData = {\n uri: string;\n label: string;\n // TODO(dmaretskyi): Consider adding details renderer for when you hover over the reference.\n};\n\nexport interface ReferencesProvider {\n getReferences({ query }: { query: string }): Promise<ReferenceData[]>;\n\n resolveReference({ uri }: { uri: string }): Promise<ReferenceData | null>;\n}\n\nexport type PromptReferencesOptions = {\n provider: ReferencesProvider;\n /**\n * Will prevent the autocomplete from closing when the user blurs the editor.\n * @default false\n */\n debug?: boolean;\n /**\n * @default '@'\n */\n triggerCharacter?: string;\n};\n\n/**\n * Include references into text.\n */\nexport const promptReferences = ({\n provider,\n debug = false,\n triggerCharacter = '@',\n}: PromptReferencesOptions): Extension => {\n if (triggerCharacter.length !== 1) {\n throw new Error('triggerCharacter must be a single character');\n }\n\n const decorationField = ViewPlugin.fromClass(\n class ReferenceView {\n private _mutex = new Mutex();\n\n decorations: DecorationSet = Decoration.set([]);\n\n constructor(view: EditorView) {\n queueMicrotask(async () => {\n const guard = await this._mutex.acquire();\n try {\n this.decorations = await this._computeDecorations(view);\n } finally {\n guard.release();\n }\n });\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n queueMicrotask(async () => {\n const guard = await this._mutex.acquire();\n try {\n this.decorations = await this._computeDecorations(update.view);\n } finally {\n guard.release();\n }\n });\n }\n }\n\n private async _computeDecorations(view: EditorView): Promise<DecorationSet> {\n const text = view.state.doc.toString();\n const references = text.matchAll(new RegExp(`${triggerCharacter}[a-zA-Z0-9@:]+\\\\s`, 'g'));\n\n const decorations = [];\n for (const match of references) {\n const reference = match[0];\n const uri = reference.slice(1, -1);\n const data = await provider.resolveReference({ uri });\n if (data) {\n decorations.push(\n Decoration.replace({\n widget: new ReferenceWidget(data),\n }).range(match.index!, match.index! + reference.length),\n );\n }\n }\n\n return Decoration.set(decorations);\n }\n },\n {\n decorations: (v) => v.decorations,\n provide: (plugin) => [\n EditorView.atomicRanges.of(\n (view): DecorationSet => view.plugin(decorationField)?.decorations ?? RangeSet.empty,\n ),\n ],\n },\n );\n\n return [\n decorationField,\n\n EditorView.theme({\n '.cm-reference-pill': {\n borderRadius: '0.25rem',\n borderWidth: '1px',\n marginRight: '0.25rem',\n marginLeft: '0.25rem',\n },\n }),\n\n autocompletion({\n activateOnTyping: true,\n override: [\n async (context): Promise<CompletionResult | null> => {\n const match = context.matchBefore(new RegExp(`${triggerCharacter}[a-zA-Z0-9]+`));\n\n if (!match || match?.to === match?.from) {\n return null;\n }\n\n const query = match.text.slice(1);\n const references = await provider.getReferences({ query });\n\n return {\n from: match.from,\n filter: false,\n options: references.map((reference) => ({\n label: reference.label,\n apply: `${triggerCharacter}${reference.uri} `,\n })),\n };\n },\n ],\n closeOnBlur: !debug,\n tooltipClass: () => 'shadow rounded',\n aboveCursor: true,\n }),\n\n keymap.of(completionKeymap),\n ];\n};\n\nclass ReferenceWidget extends WidgetType {\n constructor(private data: ReferenceData) {\n super();\n }\n\n override toDOM() {\n const span = document.createElement('span');\n span.textContent = `@ ${this.data.label}`;\n span.className = 'cm-reference-pill';\n return span;\n }\n\n override eq(other: ReferenceWidget) {\n return other.data.uri === this.data.uri;\n }\n\n override ignoreEvent() {\n return true;\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useRef, useState } from 'react';\n\nimport { useVoiceInput } from '@dxos/plugin-transcription';\nimport { Icon, IconButton, type ThemedClassName, Tooltip, useTranslation } from '@dxos/react-ui';\nimport { Spinner } from '@dxos/react-ui-sfx';\nimport { errorMessageColors, errorText, mx } from '@dxos/react-ui-theme';\n\nimport { Prompt, type PromptController, type PromptProps } from './Prompt';\nimport { ASSISTANT_PLUGIN } from '../../meta';\n\nexport type PromptBarProps = ThemedClassName<\n Pick<PromptProps, 'placeholder' | 'lineWrapping' | 'onSubmit' | 'onSuggest' | 'onOpenChange' | 'references'> & {\n processing?: boolean;\n error?: Error;\n microphone?: boolean;\n onCancel?: () => void;\n }\n>;\n\nexport const PromptBar = ({\n classNames,\n placeholder,\n processing,\n error,\n microphone,\n onCancel,\n references,\n ...props\n}: PromptBarProps) => {\n const { t } = useTranslation(ASSISTANT_PLUGIN);\n\n const promptRef = useRef<PromptController>(null);\n\n // TODO(burdon): Configure capability in TranscriptionPlugin.\n const [active, setActive] = useState(false);\n const { recording } = useVoiceInput({\n active,\n onUpdate: (text) => {\n promptRef.current?.setText(text);\n promptRef.current?.focus();\n },\n });\n\n return (\n <div\n className={mx(\n 'shrink-0 w-full grid grid-cols-[var(--rail-action)_1fr_var(--rail-action)] overflow-hidden',\n classNames,\n )}\n >\n <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>\n {(error && (\n <Tooltip.Root delayDuration={0}>\n <Tooltip.Trigger>\n <Icon icon='ph--warning-circle--regular' classNames={errorText} size={5} />\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <div className={mx('text-sm', errorMessageColors)}>{error.message}</div>\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )) || <Spinner active={processing} />}\n </div>\n <Prompt\n ref={promptRef}\n autoFocus\n classNames='pbs-2'\n lineWrapping={true}\n placeholder={placeholder ?? t('prompt placeholder')}\n references={references}\n {...props}\n />\n {(onCancel || microphone) && (\n <div className='flex w-[--rail-action] h-[--rail-action] items-center justify-center'>\n {processing && onCancel && (\n <IconButton\n classNames='px-1.5'\n variant='ghost'\n size={5}\n icon='ph--x--regular'\n iconOnly\n label={t('cancel processing button')}\n onClick={onCancel}\n />\n )}\n {!processing && microphone && (\n <IconButton\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('microphone button')}\n onMouseDown={() => setActive(true)}\n onMouseUp={() => setActive(false)}\n onTouchStart={() => setActive(true)}\n onTouchEnd={() => setActive(false)}\n />\n )}\n </div>\n )}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, type FC, useEffect } from 'react';\n\nimport { CollaborationActions, createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { type AssociatedArtifact } from '@dxos/artifact';\nimport { invariant } from '@dxos/invariant';\nimport { DXN } from '@dxos/keys';\nimport { makeRef, refFromDXN } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { Thread, type ThreadProps } from './Thread';\nimport { useChatProcessor, useContextProvider, useMessageQueue } from '../../hooks';\nimport { type AIChatType, type AssistantSettingsProps } from '../../types';\n\nexport type ThreadContainerProps = {\n chat?: AIChatType;\n settings?: AssistantSettingsProps;\n part?: 'deck' | 'dialog';\n associatedArtifact?: AssociatedArtifact;\n} & Pick<ThreadProps, 'debug' | 'transcription' | 'onOpenChange'>;\n\n// TODO(burdon): Since this only wraps Thread, just separate out hook?\nexport const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({\n classNames,\n chat,\n settings,\n part,\n associatedArtifact,\n onOpenChange,\n ...props\n}) => {\n const space = getSpace(chat);\n const contextProvider = useContextProvider(space);\n const processor = useChatProcessor({ chat, space, settings, part, associatedArtifact });\n const messageQueue = useMessageQueue(chat);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n // TODO(thure): This will be referentially new on every render, is it causing overreactivity?\n const messages = [...(messageQueue?.items ?? []), ...processor.messages.value];\n\n // Post last message to document.\n useEffect(() => {\n if (!processor.streaming.value && messageQueue?.items) {\n const message = messageQueue.items[messageQueue.items.length - 1];\n if (space && chat && message && dispatch && associatedArtifact) {\n void dispatch(\n createIntent(CollaborationActions.InsertContent, {\n spaceId: space.id,\n target: makeRef(associatedArtifact),\n object: refFromDXN(new DXN(DXN.kind.QUEUE, [...chat.assistantChatQueue.dxn.parts, message.id])),\n label: 'View proposal',\n }),\n );\n }\n }\n }, [messageQueue, associatedArtifact, processor.streaming.value]);\n\n const handleSubmit = useCallback(\n (text: string) => {\n // Don't accept input if still processing.\n if (processor.streaming.value) {\n log.warn('ignoring submit; still processing.');\n return false;\n }\n\n onOpenChange?.(true);\n\n invariant(messageQueue);\n void processor.request(text, {\n history: messageQueue.items,\n onComplete: (messages) => {\n messageQueue.append(messages);\n },\n });\n\n return true;\n },\n [processor, messageQueue, onOpenChange],\n );\n\n const handleCancel = useCallback(() => {\n if (processor.streaming.value) {\n void processor.cancel();\n }\n }, [processor]);\n\n return (\n <Thread\n classNames={classNames}\n space={space}\n messages={messages}\n processing={processor.streaming.value}\n error={processor.error.value}\n tools={processor.tools}\n contextProvider={contextProvider}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n onPrompt={handleSubmit}\n onOpenChange={onOpenChange}\n {...props}\n />\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Signal, batch, computed, signal } from '@preact/signals-core';\n\nimport { type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { type ArtifactDefinition, type Message, type MessageContentBlock, type Tool } from '@dxos/artifact';\nimport { type AIServiceClient, AISession, DEFAULT_EDGE_MODEL, type GenerateRequest } from '@dxos/assistant';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type Space } from '@dxos/react-client/echo';\n\n// TODO(burdon): Factor out.\ndeclare global {\n interface ToolContextExtensions {\n space?: Space;\n dispatch?: PromiseIntentDispatcher;\n }\n}\n\ntype RequestOptions = {\n history?: Message[];\n onComplete?: (messages: Message[]) => void;\n};\n\nexport type ChatProcessorOptions = Pick<GenerateRequest, 'model' | 'systemPrompt'>;\n\nconst defaultOptions: ChatProcessorOptions = {\n model: 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 */\nexport class ChatProcessor {\n /** Pending messages (incl. the current user request). */\n private readonly _pending: Signal<Message[]> = signal([]);\n\n /** Current streaming block (from the AI service). */\n private readonly _block: Signal<MessageContentBlock | undefined> = signal(undefined);\n\n /** Current streaming response. */\n private _session: AISession | undefined;\n\n /**\n * Streaming state.\n * @reactive\n */\n public readonly streaming: Signal<boolean> = computed(() => this._block.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<Message[]> = computed(() => {\n const messages = [...this._pending.value];\n if (this._block.value) {\n const current = messages.pop();\n invariant(current);\n const { content, ...rest } = current;\n const message = { ...rest, content: [...content, this._block.value] };\n messages.push(message);\n }\n\n return messages;\n });\n\n constructor(\n private readonly _ai: AIServiceClient,\n private _tools?: Tool[],\n private _artifacts?: ArtifactDefinition[],\n private readonly _extensions?: ToolContextExtensions,\n private readonly _options: ChatProcessorOptions = defaultOptions,\n ) {}\n\n get tools() {\n return this._tools;\n }\n\n /**\n * Update tools.\n */\n setTools(tools: Tool[]) {\n this._tools = tools;\n }\n\n /**\n * Make GPT request.\n */\n async request(message: string, options: RequestOptions = {}): Promise<Message[]> {\n this._session = new AISession({ operationModel: 'immediate' });\n\n // Message complete.\n this._session.message.on((message) => {\n batch(() => {\n this._pending.value = [...this._pending.value, message];\n this._block.value = undefined;\n });\n });\n\n // Streaming update (happens before message complete).\n this._session.update.on((block) => {\n batch(() => {\n this._block.value = block;\n });\n });\n\n this._session.userMessage.on((message) => {\n this._pending.value = [...this._pending.value, message];\n });\n\n try {\n const messages = await this._session.run({\n client: this._ai,\n history: options.history ?? [],\n artifacts: this._artifacts ?? [],\n tools: this._tools ?? [],\n prompt: message,\n systemPrompt: this._options.systemPrompt,\n extensions: this._extensions,\n generationOptions: {\n model: this._options.model,\n },\n });\n\n log('completed', { messages });\n options.onComplete?.(this._pending.value);\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 } finally {\n this._session = undefined;\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<Message[]> {\n log.info('cancelling...');\n this._session?.abort();\n return this._reset();\n }\n\n private async _reset(): Promise<Message[]> {\n const messages = this._pending.value;\n batch(() => {\n this._pending.value = [];\n this._block.value = undefined;\n });\n\n return messages;\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 { useEffect, useMemo, useState } from 'react';\n\nimport { Capabilities, useCapabilities, useCapability, useIntentDispatcher } from '@dxos/app-framework';\nimport { type AssociatedArtifact, createSystemPrompt, type Tool } from '@dxos/artifact';\nimport { DEFAULT_EDGE_MODEL, DEFAULT_OLLAMA_MODEL } from '@dxos/assistant';\nimport { FunctionType } from '@dxos/functions/types';\nimport { log } from '@dxos/log';\nimport { useConfig } from '@dxos/react-client';\nimport { Filter, fullyQualifiedId, type Space, useQuery } from '@dxos/react-client/echo';\nimport { isNonNullable } from '@dxos/util';\n\nimport { AssistantCapabilities } from '../capabilities';\nimport { ChatProcessor, type ChatProcessorOptions } from '../hooks';\nimport { covertFunctionToTool, createToolsFromService } from '../tools';\nimport { type AIChatType, type AssistantSettingsProps, ServiceType } from '../types';\n\ntype UseChatProcessorProps = {\n chat?: AIChatType;\n space?: Space;\n settings?: AssistantSettingsProps;\n part?: 'deck' | 'dialog';\n associatedArtifact?: AssociatedArtifact;\n};\n\n/**\n * Configure and create ChatProcessor.\n */\nexport const useChatProcessor = ({\n chat,\n space,\n settings,\n part = 'deck',\n associatedArtifact,\n}: UseChatProcessorProps): ChatProcessor => {\n const aiClient = useCapability(AssistantCapabilities.AiClient);\n const globalTools = useCapabilities(Capabilities.Tools);\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n // Services.\n const services = useQuery(space, Filter.schema(ServiceType));\n const [serviceTools, setServiceTools] = useState<Tool[]>([]);\n useEffect(() => {\n log('creating service tools...');\n queueMicrotask(async () => {\n const tools = await Promise.all(services.map((service) => createToolsFromService(service)));\n setServiceTools(tools.flat());\n });\n }, [services]);\n\n // Tools and context.\n const config = useConfig();\n const functions = useQuery(space, Filter.schema(FunctionType));\n const chatId = useMemo(() => (chat ? fullyQualifiedId(chat) : undefined), [chat]);\n const [tools, extensions] = useMemo(() => {\n log('creating tools...');\n const tools = [\n ...globalTools.flat(),\n ...serviceTools,\n ...functions\n .map((fn) => covertFunctionToTool(fn, config.values.runtime?.services?.edge?.url ?? '', space?.id))\n .filter(isNonNullable),\n ];\n const extensions = { space, dispatch, pivotId: chatId, part };\n return [tools, extensions];\n }, [dispatch, globalTools, space, chatId, serviceTools, functions]);\n\n // Prompt.\n const systemPrompt = useMemo(\n () =>\n createSystemPrompt({\n artifacts: artifactDefinitions.map((definition) => `${definition.name}\\n${definition.instructions}`),\n associatedArtifact,\n }),\n [artifactDefinitions, associatedArtifact],\n );\n\n // TODO(burdon): Remove default (let backend decide if not specified).\n const model: ChatProcessorOptions['model'] =\n settings?.llmProvider === 'ollama'\n ? ((settings?.ollamaModel ?? DEFAULT_OLLAMA_MODEL) as ChatProcessorOptions['model'])\n : ((settings?.edgeModel ?? DEFAULT_EDGE_MODEL) as ChatProcessorOptions['model']);\n\n // Create processor.\n // TODO(burdon): Updated on each query update above; should just update current processor.\n const processor = useMemo(() => {\n log('creating processor...', { settings });\n return new ChatProcessor(aiClient.value, tools, artifactDefinitions, extensions, { model, systemPrompt });\n }, [aiClient.value, tools, artifactDefinitions, extensions, model, systemPrompt]);\n\n return processor;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { lazy } from '@dxos/app-framework';\n\nexport const AiClient = lazy(() => import('./ai-client'));\nexport const AppGraphBuilder = lazy(() => import('./app-graph-builder'));\nexport const IntentResolver = lazy(() => import('./intent-resolver'));\nexport const ReactSurface = lazy(() => import('./react-surface'));\nexport const AssistantSettings = lazy(() => import('./settings'));\n\nexport * from './capabilities';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { Mutex } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { createSubscriptionTrigger, type TriggerFactory } from '@dxos/functions';\nimport { FunctionTrigger } from '@dxos/functions/types';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, type Space, useQuery } from '@dxos/react-client/echo';\n\nimport { invokeFunction } from './invocation-handler';\n\nconst registerTriggersMutex = new Mutex();\n\nexport const useLocalTriggerManager = (space: Space) => {\n const client = useClient();\n\n // TODO(burdon): Factor out, creating context for plugin (runs outside of component).\n const [registry] = useState(new Map<string, Context>());\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n useEffect(() => {\n setTimeout(async () => {\n // Mark-and-sweep removing disabled triggers.\n await registerTriggersMutex.executeSynchronized(async () => {\n const deprecated = new Set(Array.from(registry.keys()));\n log('triggers', {\n deprecated,\n all: triggers.map((t) => t.id),\n enabled: triggers.filter((t) => t.enabled).map((t) => t.id),\n });\n\n for (const trigger of triggers) {\n if (trigger.enabled) {\n if (registry.has(trigger.id)) {\n deprecated.delete(trigger.id);\n continue;\n }\n log.info('activating trigger', trigger.id);\n\n const ctx = new Context();\n registry.set(trigger.id, ctx);\n const triggerSpec = trigger.spec;\n invariant(triggerSpec);\n\n let triggerFactory: TriggerFactory<any>;\n if (triggerSpec.type === 'subscription') {\n triggerFactory = createSubscriptionTrigger;\n } else {\n log.info('unsupported trigger', { type: triggerSpec.type });\n continue;\n }\n\n await triggerFactory(ctx, space, trigger.spec, (data: any) => {\n return invokeFunction(client, space, trigger, data);\n });\n }\n }\n\n for (const id of deprecated) {\n const ctx = registry.get(id);\n if (ctx) {\n await ctx.dispose();\n registry.delete(id);\n }\n }\n });\n });\n }, [JSON.stringify(triggers)]);\n\n useEffect(() => {\n return () => {\n for (const ctx of registry.values()) {\n void ctx.dispose();\n }\n };\n }, []);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { sleep } from '@dxos/async';\nimport { getObjectCore, ResultFormat } from '@dxos/echo-db';\nimport { type AnyObjectData } from '@dxos/echo-schema';\nimport { FunctionType, getUserFunctionUrlInMetadata } from '@dxos/functions/types';\nimport { type FunctionTrigger } from '@dxos/functions/types';\nimport { invariant } from '@dxos/invariant';\nimport { DXN, LOCAL_SPACE_TAG } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Client, type Config } from '@dxos/react-client';\nimport { type Space } from '@dxos/react-client/echo';\n\nconst MAX_RETRIES = 3;\nconst RETRY_DELAY = 1_000;\n\nconst callFunction = async (funcUrl: string, trigger: any, data: any) => {\n const body = { event: 'trigger', trigger, data };\n\n let retryCount = 0;\n while (retryCount < MAX_RETRIES) {\n log.info('exec', { funcUrl, body, retryCount });\n const response = await fetch(funcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.text();\n log.info('response', { status: response.status, body: data });\n if (response.status === 409) {\n retryCount++;\n await sleep(RETRY_DELAY * Math.min(retryCount, 2));\n continue;\n }\n\n return { status: response.status, data };\n }\n return { status: 500 };\n};\n\nexport const invokeFunction = async (client: Client, space: Space, trigger: FunctionTrigger, data: any) => {\n try {\n invariant(trigger.spec);\n invariant(trigger.function);\n\n const script = await space.db.query({ id: trigger.function }, { format: ResultFormat.Plain }).first();\n const { objects: functions } = await space.db\n .query({ __typename: FunctionType.typename }, { format: ResultFormat.Plain })\n .run();\n const func = functions.find((fn) => referenceEquals(fn.source, trigger.function!)) as AnyObjectData | undefined;\n const funcSlug = func && getUserFunctionUrlInMetadata(func.__meta);\n if (!funcSlug) {\n log.warn('function not deployed', { scriptId: script.id, name: script.name });\n return 404;\n }\n\n const funcUrl = getFunctionUrl(client.config, funcSlug, space.id);\n const triggerData: AnyObjectData = {\n ...getObjectCore(trigger).toPlainObject(),\n // TODO: Remove when functions can query by DXN.\n promptId: trigger.meta?.prompt?.id,\n };\n // TODO: Remove when functions can add objects and easily modify collections (push, splice).\n return (await callFunction(funcUrl, triggerData, data)).status;\n } catch (err) {\n return 400;\n }\n};\n\nconst getFunctionUrl = (config: Config, slug: string, spaceId?: string) => {\n const baseUrl = new URL('functions/', config.values.runtime?.services?.edge?.url);\n\n // Leading slashes cause the URL to be treated as an absolute path.\n const relativeUrl = slug.replace(/^\\//, '');\n const url = new URL(`./${relativeUrl}`, baseUrl.toString());\n spaceId && url.searchParams.set('spaceId', spaceId);\n url.protocol = 'https';\n return url.toString();\n};\n\n// TODO(dmaretskyi): Factor out.\n\ntype ReferenceLike = { '/': string } | string;\n\nconst referenceEquals = (a: ReferenceLike, b: ReferenceLike): boolean => {\n const aDXN = toDXN(a);\n const bDXN = toDXN(b);\n return aDXN.toString() === bDXN.toString();\n};\n\nconst toDXN = (ref: ReferenceLike): DXN => {\n if (typeof ref === 'string') {\n if (ref.startsWith('dxn:')) {\n return DXN.parse(ref);\n } else {\n return new DXN(DXN.kind.ECHO, [LOCAL_SPACE_TAG, ref]);\n }\n }\n\n invariant(typeof ref['/'] === 'string');\n return DXN.parse(ref['/']);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { type Message } from '@dxos/artifact';\nimport { DXN, QueueSubspaceTags } from '@dxos/keys';\nimport { getSpace, useQueue } from '@dxos/react-client/echo';\n\nimport { type AIChatType } from '../types';\n\nexport const useMessageQueue = (chat?: AIChatType) => {\n const space = getSpace(chat);\n const queueDxn = useMemo(() => {\n const dxn = space && chat?.assistantChatQueue.dxn;\n return dxn ? new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, space.id, dxn.parts.at(-1)!]) : undefined;\n }, [space, chat?.assistantChatQueue.dxn]);\n\n return useQueue<Message>(queueDxn);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { type Space } from '@dxos/client/echo';\n\nimport { MockServiceRegistry } from '../testing';\nimport { type ServiceType, type ServiceQuery } from '../types';\n\n/**\n * Retrieves matching services from the registry.\n */\nexport const useServices = (space: Space, query?: ServiceQuery): ServiceType[] => {\n const registry = useMemo(() => new MockServiceRegistry(), []);\n const [services, setServices] = useState<ServiceType[]>([]);\n useEffect(() => {\n const t = setTimeout(async () => {\n const services = await registry.queryServices(query);\n setServices(services);\n });\n\n return () => clearTimeout(t);\n }, [query, registry]);\n\n return services;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createSystemPrompt } from '@dxos/artifact';\nimport { DEFAULT_EDGE_MODEL, type GenerateRequest } from '@dxos/assistant';\n\nexport const createProcessorOptions = (artifacts: string[]): Pick<GenerateRequest, 'model' | 'systemPrompt'> => ({\n model: DEFAULT_EDGE_MODEL,\n systemPrompt: createSystemPrompt({ artifacts }),\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { create } from '@dxos/echo-schema';\n\nimport {\n type ApiAuthorization,\n type BaseServiceRegistry,\n type ServiceQuery,\n ServiceType,\n categoryIcons,\n} from '../types';\n\nexport class MockServiceRegistry implements BaseServiceRegistry {\n async queryServices(query?: ServiceQuery): Promise<ServiceType[]> {\n return TEST_SERVICES;\n }\n}\n\n// TODO(burdon): Can we generalize credentials?\n\nconst AMADEUS_AUTH: ApiAuthorization = {\n type: 'oauth',\n clientId: 'BOEnpLd1sMyKjAPGKYeAPFFy60u53QEG',\n clientSecret: 'n4qldSN7usvD57gm',\n tokenUrl: 'https://test.api.amadeus.com/v1/security/oauth2/token',\n grantType: 'client_credentials',\n};\n\nconst VISUAL_CROSSING_CREDENTIALS: ApiAuthorization = {\n type: 'api-key',\n key: 'FDPRVS953KB4GQQLD25GRT975',\n placement: {\n type: 'query',\n name: 'key',\n },\n};\n\n// Registries:\n// - https://apis.guru\n// - https://rapidapi.com\n// - https://github.com/konfig-sdks/openapi-examples\n// - https://publicapis.io/?utm_source=chatgpt.com\n\n// Examples:\n// - https://petstore.swagger.io/v2/swagger.json (testing)\n// - https://lichess.org/api\n// - https://github.com/konfig-sdks/openapi-examples/tree/main/xkcd\n// - https://api.coindesk.com/v1/bpi/currentprice.json\n// - https://www.coingecko.com/en/api/documentation\n\n// TODO(burdon): Support yaml endpoints.\n// - e.g., https://github.com/konfig-sdks/openapi-examples/blob/main/xkcd/openapi.yaml\n\nconst TEST_SERVICES: ServiceType[] = [\n create(ServiceType, {\n serviceId: 'amadeus.com/service/FlightSearch',\n name: 'Amadeus Flight Search',\n description: 'Search for local and international flights.',\n category: 'travel',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/amadeus.com/amadeus-flight-availabilities-search/1.0.2/swagger.json',\n authorization: AMADEUS_AUTH,\n },\n ],\n }),\n\n create(ServiceType, {\n serviceId: 'amadeus.com/service/HotelSearch',\n name: 'Amadeus Hotel Search',\n description: 'Search for local and international hotels.',\n category: 'travel',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/amadeus.com/amadeus-hotel-search/3.0.8/swagger.json',\n authorization: AMADEUS_AUTH,\n },\n ],\n }),\n\n create(ServiceType, {\n serviceId: 'visualcrossing.com/service/Weather',\n name: 'Visual Crossing Weather',\n description: 'Search for global weather forecasts.',\n category: 'weather',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/visualcrossing.com/weather/4.6/openapi.json',\n authorization: VISUAL_CROSSING_CREDENTIALS,\n },\n ],\n }),\n\n // TODO(burdon): Needs auth.\n create(ServiceType, {\n serviceId: 'abstractapi.com/service/GeoLocation',\n name: 'Abstract GeoLocation',\n description: 'Get the location of any IP address.',\n category: 'geolocation',\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://api.apis.guru/v2/specs/abstractapi.com/geolocation/1.0.0/openapi.json',\n },\n ],\n }),\n\n //\n // Testing\n //\n\n ...Array.from({ length: 20 }, (_, i) =>\n create(ServiceType, {\n serviceId: `example.com/service/test-${i}`,\n name: `Test ${i}`,\n description: `Test ${i}`,\n category: Object.keys(categoryIcons)[Math.floor(Math.random() * Object.keys(categoryIcons).length)],\n interfaces: [\n {\n kind: 'api',\n schemaUrl: 'https://petstore.swagger.io/v2/swagger.json',\n },\n ],\n }),\n ),\n] as const;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useState, useCallback, type KeyboardEventHandler, type ChangeEventHandler } from 'react';\n\n/**\n * Hook that handles text input events.\n */\n// TODO(burdon): Factor out.\nexport const useTextInputEvents = ({\n onEnter,\n onEscape,\n}: {\n onEnter?: (text: string) => boolean | void;\n onEscape?: () => void;\n}) => {\n const [value, setValue] = useState('');\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLInputElement>>(\n (ev) => {\n switch (ev.key) {\n case 'Escape': {\n onEscape?.();\n setValue('');\n break;\n }\n\n case 'Enter': {\n const value = (ev.target as HTMLInputElement).value.trim();\n if (value.length > 0) {\n const reset = onEnter?.(value);\n if (reset) {\n setValue('');\n }\n }\n break;\n }\n }\n },\n [onEnter, onEscape],\n );\n\n const onChange = useCallback<ChangeEventHandler<HTMLInputElement>>((ev) => {\n setValue(ev.target.value);\n }, []);\n\n return [{ value, onKeyDown, onChange }, setValue];\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 { getDXN, getLabel, getSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { Filter } from '@dxos/react-client/echo';\n\nexport type ContextProvider = {\n query: (params: { query: string }) => Promise<Array<{ uri: string; label: string }>>;\n resolveMetadata: (params: { uri: string }) => Promise<{ uri: string; label: string }>;\n};\n\nconst stringMatch = (query: string, label: string) => label.toLowerCase().startsWith(query.toLowerCase());\n\nexport const useContextProvider = (space?: Space): ContextProvider | undefined => {\n const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);\n\n return useMemo<ContextProvider | undefined>((): ContextProvider | undefined => {\n if (!space) {\n return undefined;\n }\n\n return {\n query: async ({ query }) => {\n const artifactSchemas = artifactDefinitions.map((artifact) => artifact.schema);\n const { objects } = await space.db\n .query(Filter.or(...artifactSchemas.map((schema) => Filter.schema(schema))))\n .run();\n return objects\n .map((object) => {\n log.info('object', { object, label: getLabel(getSchema(object)!, object) });\n return object;\n })\n .filter((object) => stringMatch(query, getLabel(getSchema(object)!, object) ?? ''))\n .filter((object) => !!getDXN(object))\n .map((object) => ({\n uri: getDXN(object)!.toString(),\n label: getLabel(getSchema(object)!, object) ?? '',\n }));\n },\n resolveMetadata: async ({ uri }) => {\n const object = await space.db.query({ id: uri }).first();\n return {\n uri,\n label: getLabel(getSchema(object)!, object) ?? '',\n };\n },\n };\n }, [space, artifactDefinitions]);\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "useState", "useEffect", "Fragment", "Capabilities", "useCapabilities", "parseToolName", "FunctionType", "log", "Filter", "useQuery", "mx", "defineTool", "ToolResult", "toEffectSchema", "getInvocationUrl", "getUserFunctionUrlInMetadata", "log", "getMeta", "covertFunctionToTool", "fn", "edgeUrl", "spaceId", "description", "inputSchema", "undefined", "existingFunctionUrl", "url", "name", "schema", "execute", "input", "info", "response", "fetch", "method", "headers", "body", "JSON", "stringify", "Success", "text", "jsonpointer", "ToolResult", "JsonSchemaType", "normalizeSchema", "S", "toEffectSchema", "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", "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", "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", "Toolbox", "classNames", "artifacts", "functions", "services", "striped", "div", "className", "mx", "length", "Section", "title", "items", "map", "name", "description", "tools", "subitems", "parseToolName", "service", "serviceId", "stripeClassNames", "gridClassNames", "subGridClassNames", "h1", "i", "Fragment", "key", "ToolboxContainer", "space", "artifactDefinitions", "useCapabilities", "Capabilities", "ArtifactDefinition", "useQuery", "Filter", "schema", "ServiceType", "serviceTools", "setServiceTools", "useState", "useEffect", "log", "queueMicrotask", "Promise", "all", "createToolsFromService", "FunctionType", "React", "useCallback", "useMemo", "useRef", "useIdentity", "ScrollContainer", "mx", "keyToFallback", "React", "invariant", "Button", "Icon", "IconButton", "MarkdownViewer", "ToggleContainer", "NativeToggleContainer", "Json", "mx", "safeParseJson", "React", "useEffect", "useMemo", "useRef", "useState", "log", "NumericTabs", "StatusRoll", "ToggleContainer", "Json", "isNonNullable", "isNotFalsy", "isToolMessage", "message", "content", "some", "block", "type", "getToolName", "tool", "namespace", "function", "name", "split", "pop", "getToolCaption", "caption", "ToolBlock", "classNames", "tools", "request", "blocks", "filter", "items", "map", "pending", "id", "find", "title", "warn", "undefined", "ToolContainer", "tabsRef", "selected", "setSelected", "open", "setOpen", "current", "focus", "handleSelect", "index", "lines", "item", "key", "duration", "autoAdvance", "onChangeOpen", "div", "className", "ref", "length", "onSelect", "data", "panelClassNames", "userClassNames", "ToggleContainer", "props", "React", "NativeToggleContainer", "classNames", "mx", "MessageContainer", "children", "user", "div", "role", "className", "ThreadMessage", "space", "message", "tools", "onPrompt", "content", "isToolMessage", "ToolBlock", "map", "block", "idx", "type", "text", "replaceAll", "length", "Component", "components", "default", "key", "invariant", "title", "disposition", "titles", "undefined", "MarkdownViewer", "defaultOpen", "pending", "icon", "Icon", "size", "ToolboxContainer", "safeParseJson", "json", "IconButton", "label", "onClick", "options", "option", "Button", "Json", "data", "name", "messageReducer", "current", "messages", "message", "i", "block", "content", "type", "push", "id", "join", "role", "undefined", "Prec", "React", "forwardRef", "useImperativeHandle", "useThemeContext", "createBasicExtensions", "createThemeExtensions", "keymap", "useTextEditor", "mx", "Prec", "EditorView", "Decoration", "ViewPlugin", "keymap", "WidgetType", "createAutocompleteExtension", "onSubmit", "onSuggest", "suggestionPlugin", "ViewPlugin", "fromClass", "constructor", "view", "_currentSuggestion", "_decorations", "computeDecorations", "update", "docChanged", "selectionSet", "text", "state", "doc", "toString", "suggestions", "length", "Decoration", "none", "suffix", "slice", "set", "widget", "InlineSuggestionWidget", "side", "range", "completeSuggestion", "dispatch", "changes", "from", "insert", "selection", "anchor", "decorations", "v", "EditorView", "theme", "opacity", "Prec", "highest", "keymap", "of", "key", "preventDefault", "run", "plugin", "main", "head", "trim", "reset", "to", "WidgetType", "toDOM", "span", "document", "createElement", "textContent", "className", "eq", "other", "autocompletion", "completionKeymap", "RangeSet", "Decoration", "EditorView", "keymap", "ViewPlugin", "WidgetType", "Mutex", "promptReferences", "provider", "debug", "triggerCharacter", "length", "Error", "decorationField", "ViewPlugin", "fromClass", "ReferenceView", "constructor", "view", "_mutex", "Mutex", "decorations", "Decoration", "set", "queueMicrotask", "guard", "acquire", "_computeDecorations", "release", "update", "docChanged", "text", "state", "doc", "toString", "references", "matchAll", "RegExp", "match", "reference", "uri", "slice", "data", "resolveReference", "push", "replace", "widget", "ReferenceWidget", "range", "index", "v", "provide", "plugin", "EditorView", "atomicRanges", "of", "RangeSet", "empty", "theme", "borderRadius", "borderWidth", "marginRight", "marginLeft", "autocompletion", "activateOnTyping", "override", "context", "matchBefore", "to", "from", "query", "getReferences", "filter", "options", "map", "label", "apply", "closeOnBlur", "tooltipClass", "aboveCursor", "keymap", "completionKeymap", "WidgetType", "toDOM", "span", "document", "createElement", "textContent", "className", "eq", "other", "ignoreEvent", "Prompt", "forwardRef", "classNames", "autoFocus", "lineWrapping", "placeholder", "onSubmit", "onSuggest", "onOpenChange", "references", "themeMode", "useThemeContext", "parentRef", "view", "useTextEditor", "debug", "extensions", "createBasicExtensions", "bracketMatching", "createThemeExtensions", "promptReferences", "provider", "createAutocompleteExtension", "Prec", "highest", "keymap", "of", "key", "preventDefault", "run", "useImperativeHandle", "focus", "setText", "text", "dispatch", "changes", "from", "to", "state", "doc", "length", "insert", "selection", "anchor", "head", "React", "div", "ref", "className", "mx", "React", "useRef", "useState", "useVoiceInput", "Icon", "IconButton", "Tooltip", "useTranslation", "Spinner", "errorMessageColors", "errorText", "mx", "PromptBar", "classNames", "placeholder", "processing", "error", "microphone", "onCancel", "references", "props", "t", "useTranslation", "ASSISTANT_PLUGIN", "promptRef", "useRef", "active", "setActive", "useState", "recording", "useVoiceInput", "onUpdate", "text", "current", "setText", "focus", "React", "div", "className", "mx", "Tooltip", "Root", "delayDuration", "Trigger", "Icon", "icon", "errorText", "size", "Portal", "Content", "errorMessageColors", "message", "Arrow", "Spinner", "Prompt", "ref", "autoFocus", "lineWrapping", "IconButton", "variant", "iconOnly", "label", "onClick", "noTooltip", "onMouseDown", "onMouseUp", "onTouchStart", "onTouchEnd", "Thread", "classNames", "space", "messages", "collapse", "transcription", "processing", "error", "onSubmit", "onCancel", "onOpenChange", "contextProvider", "props", "scroller", "useRef", "identity", "useIdentity", "fallbackValue", "keyToFallback", "identityKey", "userHue", "profile", "data", "hue", "handleSubmit", "useCallback", "value", "current", "scrollToBottom", "filteredMessages", "useMemo", "reduce", "messageReducer", "references", "undefined", "getReferences", "query", "resolveReference", "uri", "resolveMetadata", "React", "div", "role", "className", "mx", "ScrollContainer", "ref", "fade", "length", "style", "map", "message", "ThreadMessage", "key", "id", "PromptBar", "microphone", "React", "useCallback", "useEffect", "CollaborationActions", "createIntent", "useIntentDispatcher", "invariant", "DXN", "makeRef", "refFromDXN", "log", "getSpace", "batch", "computed", "signal", "AISession", "DEFAULT_EDGE_MODEL", "invariant", "log", "defaultOptions", "model", "systemPrompt", "ChatProcessor", "constructor", "_ai", "_tools", "_artifacts", "_extensions", "_options", "_pending", "_block", "undefined", "streaming", "value", "error", "messages", "current", "pop", "content", "rest", "message", "push", "tools", "setTools", "request", "options", "_session", "operationModel", "on", "update", "block", "userMessage", "run", "client", "history", "artifacts", "prompt", "extensions", "generationOptions", "onComplete", "err", "catch", "Error", "includes", "AIServiceOverloadedError", "cause", "_reset", "cancel", "info", "abort", "code", "useEffect", "useMemo", "useState", "Capabilities", "useCapabilities", "useCapability", "useIntentDispatcher", "createSystemPrompt", "DEFAULT_EDGE_MODEL", "DEFAULT_OLLAMA_MODEL", "FunctionType", "log", "useConfig", "Filter", "fullyQualifiedId", "useQuery", "isNonNullable", "lazy", "AiClient", "lazy", "AppGraphBuilder", "IntentResolver", "ReactSurface", "AssistantSettings", "useChatProcessor", "chat", "space", "settings", "part", "associatedArtifact", "aiClient", "useCapability", "AssistantCapabilities", "AiClient", "globalTools", "useCapabilities", "Capabilities", "Tools", "artifactDefinitions", "ArtifactDefinition", "dispatchPromise", "dispatch", "useIntentDispatcher", "services", "useQuery", "Filter", "schema", "ServiceType", "serviceTools", "setServiceTools", "useState", "useEffect", "log", "queueMicrotask", "tools", "Promise", "all", "map", "service", "createToolsFromService", "flat", "config", "useConfig", "functions", "FunctionType", "chatId", "useMemo", "fullyQualifiedId", "undefined", "extensions", "fn", "covertFunctionToTool", "values", "runtime", "edge", "url", "id", "filter", "isNonNullable", "pivotId", "systemPrompt", "createSystemPrompt", "artifacts", "definition", "name", "instructions", "model", "llmProvider", "ollamaModel", "DEFAULT_OLLAMA_MODEL", "edgeModel", "DEFAULT_EDGE_MODEL", "processor", "ChatProcessor", "value", "useEffect", "useState", "Mutex", "Context", "createSubscriptionTrigger", "FunctionTrigger", "invariant", "log", "useClient", "Filter", "useQuery", "sleep", "getObjectCore", "ResultFormat", "FunctionType", "getUserFunctionUrlInMetadata", "invariant", "DXN", "LOCAL_SPACE_TAG", "log", "registerTriggersMutex", "Mutex", "useMemo", "DXN", "QueueSubspaceTags", "getSpace", "useQueue", "useMessageQueue", "chat", "space", "getSpace", "queueDxn", "useMemo", "dxn", "assistantChatQueue", "DXN", "kind", "QUEUE", "QueueSubspaceTags", "DATA", "id", "parts", "at", "undefined", "useQueue", "useEffect", "useMemo", "useState", "createSystemPrompt", "DEFAULT_EDGE_MODEL", "create", "MockServiceRegistry", "queryServices", "query", "TEST_SERVICES", "AMADEUS_AUTH", "type", "clientId", "clientSecret", "tokenUrl", "grantType", "VISUAL_CROSSING_CREDENTIALS", "key", "placement", "name", "create", "ServiceType", "serviceId", "description", "category", "interfaces", "kind", "schemaUrl", "authorization", "Array", "from", "length", "_", "i", "Object", "keys", "categoryIcons", "Math", "floor", "random", "useServices", "space", "query", "registry", "useMemo", "MockServiceRegistry", "services", "setServices", "useState", "useEffect", "t", "setTimeout", "queryServices", "clearTimeout", "useState", "useCallback", "useMemo", "Capabilities", "useCapabilities", "getDXN", "getLabel", "getSchema", "log", "Filter", "stringMatch", "query", "label", "toLowerCase", "startsWith", "useContextProvider", "space", "artifactDefinitions", "ArtifactDefinition", "undefined", "artifactSchemas", "map", "artifact", "schema", "objects", "db", "or", "run", "object", "info", "filter", "uri", "toString", "resolveMetadata", "id", "first", "ThreadContainer", "classNames", "chat", "settings", "part", "associatedArtifact", "onOpenChange", "props", "space", "getSpace", "contextProvider", "useContextProvider", "processor", "useChatProcessor", "messageQueue", "useMessageQueue", "dispatchPromise", "dispatch", "useIntentDispatcher", "messages", "items", "value", "useEffect", "streaming", "message", "length", "createIntent", "CollaborationActions", "InsertContent", "spaceId", "id", "target", "makeRef", "object", "refFromDXN", "DXN", "kind", "QUEUE", "assistantChatQueue", "dxn", "parts", "label", "handleSubmit", "useCallback", "text", "log", "warn", "invariant", "request", "history", "onComplete", "append", "handleCancel", "cancel", "React", "Thread", "processing", "error", "tools", "onSubmit", "onCancel", "onPrompt"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/AssistantSettings/AssistantSettings.tsx", "../../../src/components/PromptSettings.tsx", "../../../src/components/ServiceRegistry/ServiceRegistry.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/assistant';\nimport { Input, Select, useTranslation } from '@dxos/react-ui';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { ASSISTANT_PLUGIN } from '../../meta';\nimport { type AssistantSettingsProps } from '../../types';\n\n// TODO(burdon): Factor out.\nconst DEFAULT_VALUE = '__default';\n\nexport const AssistantSettings = ({ settings }: { settings: AssistantSettingsProps }) => {\n const { t } = useTranslation(ASSISTANT_PLUGIN);\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 <Input.Switch\n checked={settings.llmProvider === 'ollama'}\n onCheckedChange={(checked) => (settings.llmProvider = checked ? 'ollama' : 'edge')}\n />\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 { Match, type Schema as S } from 'effect';\nimport React, { type ChangeEvent, useCallback } from 'react';\n\nimport { debounce } from '@dxos/async';\nimport { Input, Select, Toolbar, useTranslation } from '@dxos/react-ui';\n\nimport { ASSISTANT_PLUGIN } from '../meta';\nimport { TemplateKinds, type TemplateType, type TemplateKindSchema } from '../types';\n\nexport const PromptSettings = ({ template }: { template: TemplateType }) => {\n const { t } = useTranslation(ASSISTANT_PLUGIN);\n\n const handleKindChange = useCallback(\n (value: string) => {\n const kind = Match.type<string>().pipe(\n Match.withReturnType<S.Schema.Type<typeof TemplateKindSchema>>(),\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='p-2 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 {TemplateKinds.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 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Filter, type Space } from '@dxos/client/echo';\nimport { useQuery } from '@dxos/react-client/echo';\nimport { Icon, Input, List, ListItem } from '@dxos/react-ui';\n\nimport { useServices } from '../../hooks';\nimport { categoryIcons, ServiceType } from '../../types';\n\n// TODO(burdon): Option to show all/enabled/filter.\nexport const ServiceRegistry = ({ space }: { space: Space }) => {\n const matchingServices = useServices(space);\n const enabledServices = useQuery(space, Filter.schema(ServiceType));\n\n // Join matching services with enabled services.\n const services = useMemo(() => {\n return matchingServices.map((service) => enabledServices.find((s) => s.serviceId === service.serviceId) ?? service);\n }, [matchingServices, enabledServices]);\n\n // TODO(burdon): Reaplce with SpacePlugin intent.\n const handleSetEnabled = (service: ServiceType, enabled: boolean) => {\n if (enabled) {\n space.db.add(service);\n } else {\n // TODO(burdon): Remove or disable?\n space.db.remove(service);\n }\n };\n\n return (\n <List classNames='h-full grid auto-rows-[5rem] gap-2 p-2 pis-2 pie-2 overflow-y-auto scrollbar-thin'>\n {services.map((service) => (\n <ServiceItem\n key={service.serviceId}\n service={service}\n enabled={service.enabled}\n setEnabled={(enabled) => handleSetEnabled(service, enabled)}\n />\n ))}\n </List>\n );\n};\n\nconst ServiceItem = ({\n service,\n enabled,\n setEnabled,\n}: {\n service: ServiceType;\n enabled?: boolean;\n setEnabled?: (enabled: boolean) => void;\n}) => {\n return (\n <ListItem.Root classNames='flex flex-col gap-1 p-1 overflow-hidden rounded-md border border-separator'>\n <div className='grid grid-cols-[40px_1fr_40px]'>\n <div className='flex gow justify-center items-center'>\n <Icon icon={categoryIcons[service.category ?? 'default'] ?? 'ph--placeholder--regular'} size={6} />\n </div>\n <div className='grow items-center truncate mie-2'>{service.name}</div>\n <div className='flex gow justify-center items-center'>\n <Input.Root>\n <Input.Switch checked={enabled} onClick={() => setEnabled?.(!enabled)} />\n </Input.Root>\n </div>\n </div>\n <div className='grid grid-cols-[40px_1fr]'>\n <div />\n <div className='text-sm text-subdued line-clamp-2 mie-1'>{service.description}</div>\n </div>\n </ListItem.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './AssistantSettings';\nexport * from './PromptSettings';\nexport * from './ServiceRegistry';\nexport * from './TemplateEditor';\nexport * from './Thread';\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\nexport const AssistantDialog = lazy(() => import('./AssistantDialog'));\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\nexport const TemplateContainer = lazy(() => import('./TemplateContainer'));\n"],
5
- "mappings": "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",
6
- "names": ["React", "DEFAULT_EDGE_MODELS", "DEFAULT_OLLAMA_MODELS", "Input", "Select", "useTranslation", "DeprecatedFormContainer", "DeprecatedFormInput", "DEFAULT_VALUE", "AssistantSettings", "settings", "t", "useTranslation", "ASSISTANT_PLUGIN", "DeprecatedFormContainer", "DeprecatedFormInput", "label", "Input", "Switch", "checked", "customPrompts", "onCheckedChange", "llmProvider", "Select", "Root", "value", "edgeModel", "onValueChange", "undefined", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "Option", "DEFAULT_EDGE_MODELS", "map", "model", "key", "ollamaModel", "DEFAULT_OLLAMA_MODELS", "Match", "React", "useCallback", "debounce", "Input", "Select", "Toolbar", "useTranslation", "PromptSettings", "template", "t", "useTranslation", "ASSISTANT_PLUGIN", "handleKindChange", "useCallback", "value", "kind", "Match", "type", "pipe", "withReturnType", "when", "include", "typename", "description", "orElse", "handleTypenameChange", "debounce", "event", "target", "handleDescriptionChange", "React", "div", "className", "h2", "Toolbar", "Root", "Select", "onValueChange", "Button", "asChild", "TriggerButton", "Portal", "Content", "Viewport", "TemplateKinds", "map", "Option", "key", "Input", "TextInput", "placeholder", "defaultValue", "onChange", "React", "useMemo", "Filter", "useQuery", "Icon", "Input", "List", "ListItem", "ServiceRegistry", "space", "matchingServices", "useServices", "enabledServices", "useQuery", "Filter", "schema", "ServiceType", "services", "useMemo", "map", "service", "find", "s", "serviceId", "handleSetEnabled", "enabled", "db", "add", "remove", "React", "List", "classNames", "ServiceItem", "key", "setEnabled", "ListItem", "Root", "div", "className", "Icon", "icon", "categoryIcons", "category", "size", "name", "Input", "Switch", "checked", "onClick", "description", "lazy", "AssistantDialog", "lazy", "ChatContainer", "TemplateContainer"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\nimport { isInstanceOf, getTypename } from '@dxos/echo-schema';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { fullyQualifiedId, getSpace, isLiveObject, isSpace, type Space, type SpaceId } from '@dxos/react-client/echo';\n\nimport {\n AssistantDialog,\n AssistantSettings,\n ChatContainer,\n PromptSettings,\n ServiceRegistry,\n TemplateContainer,\n} from '../components';\nimport { ASSISTANT_PLUGIN, ASSISTANT_DIALOG } from '../meta';\nimport { AIChatType, type AssistantSettingsProps, TemplateType } from '../types';\n\nexport default () =>\n contributes(Capabilities.ReactSurface, [\n createSurface({\n id: `${ASSISTANT_PLUGIN}/plugin-settings`,\n role: 'article',\n filter: (data): data is { subject: SettingsStore<AssistantSettingsProps> } =>\n data.subject instanceof SettingsStore && data.subject.prefix === ASSISTANT_PLUGIN,\n component: ({ data: { subject } }) => <AssistantSettings settings={subject.value} />,\n }),\n createSurface({\n id: ASSISTANT_DIALOG,\n role: 'dialog',\n filter: (data): data is { props: { chat: AIChatType } } => data.component === ASSISTANT_DIALOG,\n component: ({ data }) => <AssistantDialog {...data.props} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/chat`,\n role: 'article',\n filter: (data): data is { subject: AIChatType; variant: undefined } =>\n isInstanceOf(AIChatType, data.subject) && data.variant !== 'assistant-chat',\n component: ({ data, role }) => <ChatContainer role={role} chat={data.subject} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/object-chat`,\n role: 'article',\n filter: (data): data is { companionTo: AIChatType; subject: 'assistant-chat' } =>\n isLiveObject(data.companionTo) &&\n (data as any).companionTo.assistantChatQueue &&\n data.subject === 'assistant-chat',\n component: ({ data, role }) => {\n const associatedArtifact = useMemo(\n () => ({\n id: fullyQualifiedId(data.companionTo),\n typename: getTypename(data.companionTo) ?? 'unknown',\n spaceId: (getSpace(data.companionTo)?.id ?? 'unknown') as SpaceId,\n }),\n [data.companionTo],\n );\n return <ChatContainer role={role} chat={data.companionTo} associatedArtifact={associatedArtifact} />;\n },\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/template`,\n role: 'article',\n filter: (data): data is { subject: TemplateType } => isInstanceOf(TemplateType, data.subject),\n component: ({ data, role }) => <TemplateContainer role={role} template={data.subject} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/service-registry`,\n role: 'deck-companion--service-registry',\n filter: (data): data is { subject: Space } => isSpace(data.subject),\n component: ({ data }) => <ServiceRegistry space={data.subject} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/prompt-settings`,\n role: 'object-settings',\n filter: (data): data is { subject: TemplateType } => isInstanceOf(TemplateType, data.subject),\n component: ({ data }) => <PromptSettings template={data.subject} />,\n }),\n ]);\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;AAIA,OAAOA,SAASC,eAAe;AAE/B,SAASC,cAAcC,aAAaC,qBAAqB;AACzD,SAASC,cAAcC,mBAAmB;AAC1C,SAASC,qBAAqB;AAC9B,SAASC,kBAAkBC,UAAUC,cAAcC,eAAyC;AAa5F,IAAA,wBAAe,MACbC,YAAYC,aAAaC,cAAc;EACrCC,cAAc;IACZC,IAAI,GAAGC,gBAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SACPA,KAAKC,mBAAmBC,iBAAiBF,KAAKC,QAAQE,WAAWN;IACnEO,WAAW,CAAC,EAAEJ,MAAM,EAAEC,QAAO,EAAE,MAAO,sBAAA,cAACI,mBAAAA;MAAkBC,UAAUL,QAAQM;;EAC7E,CAAA;EACAZ,cAAc;IACZC,IAAIY;IACJV,MAAM;IACNC,QAAQ,CAACC,SAAkDA,KAAKI,cAAcI;IAC9EJ,WAAW,CAAC,EAAEJ,KAAI,MAAO,sBAAA,cAACS,iBAAoBT,KAAKU,KAAK;EAC1D,CAAA;EACAf,cAAc;IACZC,IAAI,GAAGC,gBAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SACPW,aAAaC,YAAYZ,KAAKC,OAAO,KAAKD,KAAKa,YAAY;IAC7DT,WAAW,CAAC,EAAEJ,MAAMF,KAAI,MAAO,sBAAA,cAACgB,eAAAA;MAAchB;MAAYiB,MAAMf,KAAKC;;EACvE,CAAA;EACAN,cAAc;IACZC,IAAI,GAAGC,gBAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SACPgB,aAAahB,KAAKiB,WAAW,KAC5BjB,KAAaiB,YAAYC,sBAC1BlB,KAAKC,YAAY;IACnBG,WAAW,CAAC,EAAEJ,MAAMF,KAAI,MAAE;AACxB,YAAMqB,qBAAqBC,QACzB,OAAO;QACLxB,IAAIyB,iBAAiBrB,KAAKiB,WAAW;QACrCK,UAAUC,YAAYvB,KAAKiB,WAAW,KAAK;QAC3CO,SAAUC,SAASzB,KAAKiB,WAAW,GAAGrB,MAAM;MAC9C,IACA;QAACI,KAAKiB;OAAY;AAEpB,aAAO,sBAAA,cAACH,eAAAA;QAAchB;QAAYiB,MAAMf,KAAKiB;QAAaE;;IAC5D;EACF,CAAA;EACAxB,cAAc;IACZC,IAAI,GAAGC,gBAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SAA4CW,aAAae,cAAc1B,KAAKC,OAAO;IAC5FG,WAAW,CAAC,EAAEJ,MAAMF,KAAI,MAAO,sBAAA,cAAC6B,mBAAAA;MAAkB7B;MAAY8B,UAAU5B,KAAKC;;EAC/E,CAAA;EACAN,cAAc;IACZC,IAAI,GAAGC,gBAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SAAqC6B,QAAQ7B,KAAKC,OAAO;IAClEG,WAAW,CAAC,EAAEJ,KAAI,MAAO,sBAAA,cAAC8B,iBAAAA;MAAgBC,OAAO/B,KAAKC;;EACxD,CAAA;EACAN,cAAc;IACZC,IAAI,GAAGC,gBAAAA;IACPC,MAAM;IACNC,QAAQ,CAACC,SAA4CW,aAAae,cAAc1B,KAAKC,OAAO;IAC5FG,WAAW,CAAC,EAAEJ,KAAI,MAAO,sBAAA,cAACgC,gBAAAA;MAAeJ,UAAU5B,KAAKC;;EAC1D,CAAA;CACD;",
6
- "names": ["React", "useMemo", "Capabilities", "contributes", "createSurface", "isInstanceOf", "getTypename", "SettingsStore", "fullyQualifiedId", "getSpace", "isLiveObject", "isSpace", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "ASSISTANT_PLUGIN", "role", "filter", "data", "subject", "SettingsStore", "prefix", "component", "AssistantSettings", "settings", "value", "ASSISTANT_DIALOG", "AssistantDialog", "props", "isInstanceOf", "AIChatType", "variant", "ChatContainer", "chat", "isLiveObject", "companionTo", "assistantChatQueue", "associatedArtifact", "useMemo", "fullyQualifiedId", "typename", "getTypename", "spaceId", "getSpace", "TemplateType", "TemplateContainer", "template", "isSpace", "ServiceRegistry", "space", "PromptSettings"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport {\n Capabilities,\n contributes,\n createIntent,\n LayoutAction,\n type PromiseIntentDispatcher,\n type PluginsContext,\n} from '@dxos/app-framework';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { createExtension, type Node, ROOT_ID } from '@dxos/plugin-graph';\nimport { memoizeQuery } from '@dxos/plugin-space';\nimport { SPACE_TYPE, SpaceAction } from '@dxos/plugin-space/types';\nimport { type Space, Filter, fullyQualifiedId, getSpace, isLiveObject, parseId } from '@dxos/react-client/echo';\n\nimport { ASSISTANT_DIALOG, ASSISTANT_PLUGIN } from '../meta';\nimport { AIChatType, AssistantAction, TemplateType } from '../types';\n\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${ASSISTANT_PLUGIN}/assistant`,\n filter: (node): node is Node<null> => node.id === ROOT_ID,\n actions: () => [\n {\n id: `${LayoutAction.UpdateDialog._tag}/assistant/open`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n const client = context.requestCapability(ClientCapabilities.Client);\n const layout = context.requestCapability(Capabilities.Layout);\n const { graph } = context.requestCapability(Capabilities.AppGraph);\n\n // TODO(burdon): Get space from workspace.\n // TODO(burdon): If need to create chat, then add to dispatch stack below.\n let chat: AIChatType | undefined;\n if (layout.active.length > 0) {\n const node = graph.findNode(layout.active[0]);\n if (node) {\n const space = getSpace(node.data);\n if (space) {\n chat = await getOrCreateChat(dispatch, space);\n }\n }\n } else {\n const space = client.spaces.default;\n chat = await getOrCreateChat(dispatch, space);\n }\n\n if (!chat) {\n return;\n }\n\n await dispatch(\n createIntent(LayoutAction.UpdateDialog, {\n part: 'dialog',\n subject: ASSISTANT_DIALOG,\n options: {\n state: true,\n blockAlign: 'end',\n props: {\n chat,\n },\n },\n }),\n );\n },\n properties: {\n label: ['open assistant label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--star-four--regular',\n disposition: 'pin-end',\n position: 'hoist',\n keyBinding: {\n macos: 'shift+meta+k',\n windows: 'shift+ctrl+k',\n },\n },\n },\n ],\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/service-registry`,\n filter: (node): node is Node<null> => node.id === 'root',\n connector: ({ node }) => {\n const layout = context.requestCapability(Capabilities.Layout);\n const client = context.requestCapability(ClientCapabilities.Client);\n const { spaceId } = parseId(layout.workspace);\n const space = spaceId ? client.spaces.get(spaceId) : null;\n\n return [\n {\n id: [node.id, 'service-registry'].join(ATTENDABLE_PATH_SEPARATOR),\n type: DECK_COMPANION_TYPE,\n data: space,\n properties: {\n label: ['service registry label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--plugs--regular',\n disposition: 'hidden',\n },\n },\n ];\n },\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/object-chat-companion`,\n filter: (node): node is Node<AIChatType> =>\n isLiveObject(node.data) && node.data.assistantChatQueue && node.data.type !== AIChatType.typename,\n connector: ({ node }) => [\n {\n id: [node.id, 'assistant-chat'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'assistant-chat',\n properties: {\n label: ['assistant chat label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--star-four--regular',\n position: 'hoist',\n },\n },\n ],\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/root`,\n filter: (node): node is Node<Space> => node.type === SPACE_TYPE,\n connector: ({ node }) => {\n const templates = memoizeQuery(node.data, Filter.schema(TemplateType));\n return templates.length > 0\n ? [\n {\n id: `${ASSISTANT_PLUGIN}/templates`,\n type: `${ASSISTANT_PLUGIN}/templates`,\n data: null,\n properties: {\n label: ['templates label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--file-code--regular',\n space: node.data,\n },\n },\n ]\n : [];\n },\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/templates`,\n filter: (node): node is Node<null, { space: Space }> => node.id === `${ASSISTANT_PLUGIN}/templates`,\n connector: ({ node }) => {\n const templates = memoizeQuery(node.properties.space, Filter.schema(TemplateType));\n return templates\n .toSorted((a, b) => {\n const nameA = a.name ?? '';\n const nameB = b.name ?? '';\n return nameA.localeCompare(nameB);\n })\n .map((template) => ({\n id: fullyQualifiedId(template),\n type: `${ASSISTANT_PLUGIN}/template`,\n data: template,\n properties: {\n label: template.name ?? ['object placeholder', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--file-code--regular',\n },\n }));\n },\n }),\n ]);\n\n// TODO(burdon): Factor out.\nconst getOrCreateChat = async (dispatch: PromiseIntentDispatcher, space: Space): Promise<AIChatType | undefined> => {\n const { objects } = await space.db.query(Filter.schema(AIChatType)).run();\n // console.log('objects', JSON.stringify(objects, null, 2));\n if (objects.length > 0) {\n // TODO(burdon): Is this the most recent?\n return objects[objects.length - 1];\n }\n\n const { data } = await dispatch(createIntent(AssistantAction.CreateChat, { spaceId: space.id }));\n invariant(data?.object instanceof AIChatType);\n await dispatch(createIntent(SpaceAction.AddObject, { target: space, object: data.object }));\n return data.object;\n};\n"],
5
- "mappings": "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",
6
- "names": ["import_types", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "ASSISTANT_PLUGIN", "filter", "node", "ROOT_ID", "actions", "LayoutAction", "UpdateDialog", "_tag", "data", "dispatchPromise", "dispatch", "requestCapability", "IntentDispatcher", "client", "ClientCapabilities", "Client", "layout", "Layout", "graph", "AppGraph", "chat", "active", "length", "findNode", "space", "getSpace", "getOrCreateChat", "spaces", "default", "createIntent", "part", "subject", "ASSISTANT_DIALOG", "options", "state", "blockAlign", "props", "properties", "label", "ns", "icon", "disposition", "position", "keyBinding", "macos", "windows", "connector", "spaceId", "parseId", "workspace", "get", "join", "ATTENDABLE_PATH_SEPARATOR", "type", "DECK_COMPANION_TYPE", "isLiveObject", "assistantChatQueue", "AIChatType", "typename", "PLANK_COMPANION_TYPE", "SPACE_TYPE", "templates", "memoizeQuery", "Filter", "schema", "TemplateType", "toSorted", "a", "b", "nameA", "name", "nameB", "localeCompare", "map", "template", "fullyQualifiedId", "objects", "db", "query", "run", "AssistantAction", "CreateChat", "invariant", "object", "SpaceAction", "AddObject", "target"]
7
- }