@dxos/plugin-assistant 0.8.3-main.7f5a14c → 0.8.3

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 (155) hide show
  1. package/dist/lib/browser/{AssistantDialog-YCPMFK7Y.mjs → AssistantDialog-MQOOR364.mjs} +5 -5
  2. package/dist/lib/browser/{BlueprintContainer-4MEK52NT.mjs → BlueprintContainer-AT5Y7EXG.mjs} +145 -28
  3. package/dist/lib/browser/BlueprintContainer-AT5Y7EXG.mjs.map +7 -0
  4. package/dist/lib/browser/{ChatContainer-RYFYYEWI.mjs → ChatContainer-C2NEAS3A.mjs} +5 -5
  5. package/dist/lib/browser/{ai-client-MTCTMJ5N.mjs → ai-client-MK2ZZII2.mjs} +6 -6
  6. package/dist/lib/browser/ai-client-MK2ZZII2.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-builder-DBCVARVI.mjs → app-graph-builder-E4H5DCOJ.mjs} +35 -22
  8. package/dist/lib/browser/app-graph-builder-E4H5DCOJ.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-ZVHA24BL.mjs → chunk-AAOKC2JN.mjs} +10 -8
  10. package/dist/lib/browser/{chunk-ZVHA24BL.mjs.map → chunk-AAOKC2JN.mjs.map} +3 -3
  11. package/dist/lib/browser/{chunk-WFZ4EPPI.mjs → chunk-BI6AHRNJ.mjs} +6 -6
  12. package/dist/lib/browser/{chunk-WFZ4EPPI.mjs.map → chunk-BI6AHRNJ.mjs.map} +1 -1
  13. package/dist/lib/browser/{chunk-DLWFPGZE.mjs → chunk-JO4W3MF7.mjs} +6 -6
  14. package/dist/lib/browser/{chunk-DLWFPGZE.mjs.map → chunk-JO4W3MF7.mjs.map} +3 -3
  15. package/dist/lib/browser/chunk-MEGMOFJB.mjs +16 -0
  16. package/dist/lib/browser/{chunk-3TIEETB2.mjs → chunk-UE3IZ4PN.mjs} +1 -1
  17. package/dist/lib/browser/{chunk-3TIEETB2.mjs.map → chunk-UE3IZ4PN.mjs.map} +1 -1
  18. package/dist/lib/browser/index.mjs +66 -23
  19. package/dist/lib/browser/index.mjs.map +4 -4
  20. package/dist/lib/browser/{intent-resolver-ID5NOIIJ.mjs → intent-resolver-3UICTGPM.mjs} +2 -2
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/{react-surface-OD23FVUD.mjs → react-surface-LXCNUSZN.mjs} +23 -6
  23. package/dist/lib/browser/react-surface-LXCNUSZN.mjs.map +7 -0
  24. package/dist/lib/browser/{settings-FUYUBGSQ.mjs → settings-XRHXVWGB.mjs} +2 -2
  25. package/dist/lib/browser/types/index.mjs +1 -1
  26. package/dist/lib/node/{AssistantDialog-B5YKJOAF.cjs → AssistantDialog-AN4Z6YUV.cjs} +9 -9
  27. package/dist/lib/node/{BlueprintContainer-VD6EIWH7.cjs → BlueprintContainer-NOWLDYCZ.cjs} +141 -26
  28. package/dist/lib/node/BlueprintContainer-NOWLDYCZ.cjs.map +7 -0
  29. package/dist/lib/node/{ChatContainer-WFLTSAFA.cjs → ChatContainer-VKYBQHUB.cjs} +9 -9
  30. package/dist/lib/node/{ai-client-3XNIFMJX.cjs → ai-client-7HNSMUMT.cjs} +9 -9
  31. package/dist/lib/node/ai-client-7HNSMUMT.cjs.map +7 -0
  32. package/dist/lib/node/{app-graph-builder-VEPLBTML.cjs → app-graph-builder-PPR5B5KU.cjs} +42 -29
  33. package/dist/lib/node/app-graph-builder-PPR5B5KU.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-BGRQNE3L.cjs → chunk-FUAGEO7Q.cjs} +9 -9
  35. package/dist/lib/node/{chunk-DXBAFX6M.cjs → chunk-IKZBMHSW.cjs} +11 -11
  36. package/dist/lib/node/{chunk-DXBAFX6M.cjs.map → chunk-IKZBMHSW.cjs.map} +1 -1
  37. package/dist/lib/node/{chunk-7TQAIKE2.cjs → chunk-LMDJEGZ2.cjs} +14 -12
  38. package/dist/lib/node/chunk-LMDJEGZ2.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-WR5L3TVB.cjs → chunk-NIDICM57.cjs} +18 -18
  40. package/dist/lib/node/{chunk-WR5L3TVB.cjs.map → chunk-NIDICM57.cjs.map} +3 -3
  41. package/dist/lib/node/{chunk-ZP732NHS.cjs → chunk-QGPWY6GW.cjs} +4 -4
  42. package/dist/lib/node/{chunk-ZP732NHS.cjs.map → chunk-QGPWY6GW.cjs.map} +1 -1
  43. package/dist/lib/node/index.cjs +118 -76
  44. package/dist/lib/node/index.cjs.map +4 -4
  45. package/dist/lib/node/{intent-resolver-SDO4YKJK.cjs → intent-resolver-QSWGTKON.cjs} +8 -8
  46. package/dist/lib/node/meta.json +1 -1
  47. package/dist/lib/node/{react-surface-FANQXIRI.cjs → react-surface-D3NBYRZ6.cjs} +40 -23
  48. package/dist/lib/node/react-surface-D3NBYRZ6.cjs.map +7 -0
  49. package/dist/lib/node/{settings-PXPIPYJN.cjs → settings-2JXLKYGE.cjs} +6 -6
  50. package/dist/lib/node/types/index.cjs +14 -14
  51. package/dist/lib/node/types/index.cjs.map +1 -1
  52. package/dist/lib/node-esm/{AssistantDialog-KPZZD7XC.mjs → AssistantDialog-6WEMLUPU.mjs} +5 -5
  53. package/dist/lib/node-esm/{BlueprintContainer-SVOKCRCP.mjs → BlueprintContainer-STOJAVML.mjs} +145 -28
  54. package/dist/lib/node-esm/BlueprintContainer-STOJAVML.mjs.map +7 -0
  55. package/dist/lib/node-esm/{ChatContainer-WSMKUGS6.mjs → ChatContainer-3MVBTUJN.mjs} +5 -5
  56. package/dist/lib/node-esm/{ai-client-YIP44I4D.mjs → ai-client-XGZBJ6BE.mjs} +6 -6
  57. package/dist/lib/node-esm/ai-client-XGZBJ6BE.mjs.map +7 -0
  58. package/dist/lib/node-esm/{app-graph-builder-WJXDXLBQ.mjs → app-graph-builder-3SY5MBIK.mjs} +35 -22
  59. package/dist/lib/node-esm/app-graph-builder-3SY5MBIK.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-34EX6E5Q.mjs +18 -0
  61. package/dist/lib/node-esm/{chunk-VXGO6Q2L.mjs → chunk-3UEZLJ2V.mjs} +1 -1
  62. package/dist/lib/node-esm/{chunk-VXGO6Q2L.mjs.map → chunk-3UEZLJ2V.mjs.map} +1 -1
  63. package/dist/lib/node-esm/{chunk-24LIHQST.mjs → chunk-J6UXXZGJ.mjs} +10 -8
  64. package/dist/lib/node-esm/{chunk-24LIHQST.mjs.map → chunk-J6UXXZGJ.mjs.map} +3 -3
  65. package/dist/lib/node-esm/{chunk-TTSMEWR6.mjs → chunk-OD574YIU.mjs} +6 -6
  66. package/dist/lib/node-esm/{chunk-TTSMEWR6.mjs.map → chunk-OD574YIU.mjs.map} +3 -3
  67. package/dist/lib/node-esm/{chunk-QFX6SFFZ.mjs → chunk-UCOFKNKN.mjs} +6 -6
  68. package/dist/lib/node-esm/{chunk-QFX6SFFZ.mjs.map → chunk-UCOFKNKN.mjs.map} +1 -1
  69. package/dist/lib/node-esm/index.mjs +66 -23
  70. package/dist/lib/node-esm/index.mjs.map +4 -4
  71. package/dist/lib/node-esm/{intent-resolver-75REJDDQ.mjs → intent-resolver-E6MXTYAU.mjs} +2 -2
  72. package/dist/lib/node-esm/meta.json +1 -1
  73. package/dist/lib/node-esm/{react-surface-NAN4SDCE.mjs → react-surface-7HA5EDWY.mjs} +23 -6
  74. package/dist/lib/node-esm/react-surface-7HA5EDWY.mjs.map +7 -0
  75. package/dist/lib/node-esm/{settings-JHMKX3UV.mjs → settings-5IAY6BT4.mjs} +2 -2
  76. package/dist/lib/node-esm/types/index.mjs +1 -1
  77. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/ai-client.d.ts +2 -2
  79. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  82. package/dist/types/src/capabilities/index.d.ts +1 -1
  83. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  84. package/dist/types/src/components/BlueprintContainer.d.ts.map +1 -1
  85. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -1
  86. package/dist/types/src/events.d.ts +4 -0
  87. package/dist/types/src/events.d.ts.map +1 -0
  88. package/dist/types/src/hooks/processor.d.ts +3 -3
  89. package/dist/types/src/hooks/useMessageQueue.d.ts +2 -2
  90. package/dist/types/src/index.d.ts +1 -0
  91. package/dist/types/src/index.d.ts.map +1 -1
  92. package/dist/types/src/queue-logger.d.ts +11 -0
  93. package/dist/types/src/queue-logger.d.ts.map +1 -0
  94. package/dist/types/src/translations.d.ts +75 -11
  95. package/dist/types/src/translations.d.ts.map +1 -1
  96. package/dist/types/src/types/chat.d.ts +12 -9
  97. package/dist/types/src/types/chat.d.ts.map +1 -1
  98. package/dist/types/src/types/service.d.ts +51 -102
  99. package/dist/types/src/types/service.d.ts.map +1 -1
  100. package/dist/types/src/types/template.d.ts +3 -23
  101. package/dist/types/src/types/template.d.ts.map +1 -1
  102. package/dist/types/src/types/types.d.ts +5 -5
  103. package/package.json +70 -69
  104. package/src/AssistantPlugin.tsx +26 -3
  105. package/src/capabilities/ai-client.ts +4 -4
  106. package/src/capabilities/app-graph-builder.ts +34 -22
  107. package/src/capabilities/capabilities.ts +2 -2
  108. package/src/capabilities/react-surface.tsx +16 -0
  109. package/src/components/BlueprintContainer.tsx +10 -22
  110. package/src/components/PromptSettings.tsx +1 -1
  111. package/src/components/Thread/Thread.stories.tsx +19 -27
  112. package/src/components/Thread/ThreadContainer.stories.tsx +5 -5
  113. package/src/components/Thread/ThreadContainer.tsx +1 -1
  114. package/src/components/Thread/reducer.ts +3 -3
  115. package/src/events.ts +11 -0
  116. package/src/hooks/processor.ts +4 -4
  117. package/src/index.ts +1 -0
  118. package/src/queue-logger.ts +125 -0
  119. package/src/stories/Query.stories.tsx +4 -4
  120. package/src/stories/Research.stories.tsx +11 -11
  121. package/src/stories/test-data.ts +4 -4
  122. package/src/testing/test-blueprint.ts +1 -1
  123. package/src/tools/openapi.test.ts +4 -4
  124. package/src/translations.ts +16 -4
  125. package/src/types/template.ts +11 -6
  126. package/dist/lib/browser/BlueprintContainer-4MEK52NT.mjs.map +0 -7
  127. package/dist/lib/browser/ai-client-MTCTMJ5N.mjs.map +0 -7
  128. package/dist/lib/browser/app-graph-builder-DBCVARVI.mjs.map +0 -7
  129. package/dist/lib/browser/chunk-AKYSTUBJ.mjs +0 -16
  130. package/dist/lib/browser/react-surface-OD23FVUD.mjs.map +0 -7
  131. package/dist/lib/node/BlueprintContainer-VD6EIWH7.cjs.map +0 -7
  132. package/dist/lib/node/ai-client-3XNIFMJX.cjs.map +0 -7
  133. package/dist/lib/node/app-graph-builder-VEPLBTML.cjs.map +0 -7
  134. package/dist/lib/node/chunk-7TQAIKE2.cjs.map +0 -7
  135. package/dist/lib/node/react-surface-FANQXIRI.cjs.map +0 -7
  136. package/dist/lib/node-esm/BlueprintContainer-SVOKCRCP.mjs.map +0 -7
  137. package/dist/lib/node-esm/ai-client-YIP44I4D.mjs.map +0 -7
  138. package/dist/lib/node-esm/app-graph-builder-WJXDXLBQ.mjs.map +0 -7
  139. package/dist/lib/node-esm/chunk-ZKTIHNT7.mjs +0 -18
  140. package/dist/lib/node-esm/react-surface-NAN4SDCE.mjs.map +0 -7
  141. /package/dist/lib/browser/{AssistantDialog-YCPMFK7Y.mjs.map → AssistantDialog-MQOOR364.mjs.map} +0 -0
  142. /package/dist/lib/browser/{ChatContainer-RYFYYEWI.mjs.map → ChatContainer-C2NEAS3A.mjs.map} +0 -0
  143. /package/dist/lib/browser/{chunk-AKYSTUBJ.mjs.map → chunk-MEGMOFJB.mjs.map} +0 -0
  144. /package/dist/lib/browser/{intent-resolver-ID5NOIIJ.mjs.map → intent-resolver-3UICTGPM.mjs.map} +0 -0
  145. /package/dist/lib/browser/{settings-FUYUBGSQ.mjs.map → settings-XRHXVWGB.mjs.map} +0 -0
  146. /package/dist/lib/node/{AssistantDialog-B5YKJOAF.cjs.map → AssistantDialog-AN4Z6YUV.cjs.map} +0 -0
  147. /package/dist/lib/node/{ChatContainer-WFLTSAFA.cjs.map → ChatContainer-VKYBQHUB.cjs.map} +0 -0
  148. /package/dist/lib/node/{chunk-BGRQNE3L.cjs.map → chunk-FUAGEO7Q.cjs.map} +0 -0
  149. /package/dist/lib/node/{intent-resolver-SDO4YKJK.cjs.map → intent-resolver-QSWGTKON.cjs.map} +0 -0
  150. /package/dist/lib/node/{settings-PXPIPYJN.cjs.map → settings-2JXLKYGE.cjs.map} +0 -0
  151. /package/dist/lib/node-esm/{AssistantDialog-KPZZD7XC.mjs.map → AssistantDialog-6WEMLUPU.mjs.map} +0 -0
  152. /package/dist/lib/node-esm/{ChatContainer-WSMKUGS6.mjs.map → ChatContainer-3MVBTUJN.mjs.map} +0 -0
  153. /package/dist/lib/node-esm/{chunk-ZKTIHNT7.mjs.map → chunk-34EX6E5Q.mjs.map} +0 -0
  154. /package/dist/lib/node-esm/{intent-resolver-75REJDDQ.mjs.map → intent-resolver-E6MXTYAU.mjs.map} +0 -0
  155. /package/dist/lib/node-esm/{settings-JHMKX3UV.mjs.map → settings-5IAY6BT4.mjs.map} +0 -0
@@ -7,7 +7,7 @@ import '@dxos-theme';
7
7
  import { type StoryObj, type Meta } from '@storybook/react';
8
8
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
9
9
 
10
- import { AIServiceEdgeClient, Message } from '@dxos/ai';
10
+ import { EdgeAiServiceClient, Message } from '@dxos/ai';
11
11
  import {
12
12
  Capabilities,
13
13
  Events,
@@ -57,7 +57,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
57
57
  const artifactDefinitions = useCapabilities(Capabilities.ArtifactDefinition);
58
58
  const tools = useCapabilities(Capabilities.Tools);
59
59
 
60
- const aiClient = useMemo(() => new AIServiceEdgeClient({ endpoint: endpoints.ai }), []);
60
+ const aiClient = useMemo(() => new EdgeAiServiceClient({ endpoint: endpoints.ai }), []);
61
61
  const { dispatchPromise: dispatch } = useIntentDispatcher();
62
62
 
63
63
  // TODO(burdon): Replace with useChatProcessor.
@@ -91,7 +91,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
91
91
 
92
92
  useEffect(() => {
93
93
  if (queue?.objects.length === 0 && !queue.isLoading && prompts.length > 0) {
94
- queue.append([
94
+ void queue.append([
95
95
  Obj.make(Message, {
96
96
  role: 'assistant',
97
97
  content: prompts.map(
@@ -129,7 +129,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
129
129
  await processor.request(message, {
130
130
  history: queue.objects,
131
131
  onComplete: (messages) => {
132
- queue.append(messages);
132
+ void queue.append(messages);
133
133
  },
134
134
  });
135
135
  });
@@ -274,7 +274,7 @@ const Fallback = ({ error }: { error?: Error }) => {
274
274
  <div role='none' className='overflow-auto p-8 attention-surface grid place-items-center'>
275
275
  <p
276
276
  role='alert'
277
- className={mx(descriptionMessage, 'break-words rounded-lg p-8', errorString.length < 256 && 'text-lg')}
277
+ className={mx(descriptionMessage, 'break-words rounded-md p-8', errorString.length < 256 && 'text-lg')}
278
278
  >
279
279
  {error ? errorString : 'error'}
280
280
  </p>
@@ -71,7 +71,7 @@ export const ThreadContainer: FC<ThemedClassName<ThreadContainerProps>> = ({
71
71
  void processor.request(text, {
72
72
  history: messageQueue.objects,
73
73
  onComplete: (messages) => {
74
- messageQueue.append(messages);
74
+ void messageQueue.append(messages);
75
75
  },
76
76
  });
77
77
 
@@ -27,8 +27,8 @@ export const messageReducer: Reducer<{ messages: Message[]; current?: Message },
27
27
  id: [message.id, i].join('_'),
28
28
  role: message.role,
29
29
  content: [block],
30
- };
31
- messages.push(current);
30
+ } as any;
31
+ messages.push(current as any);
32
32
  }
33
33
  break;
34
34
  }
@@ -40,7 +40,7 @@ export const messageReducer: Reducer<{ messages: Message[]; current?: Message },
40
40
  id: [message.id, i].join('_'),
41
41
  role: message.role,
42
42
  content: [block],
43
- });
43
+ } as any);
44
44
  break;
45
45
  }
46
46
  }
package/src/events.ts ADDED
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Events } from '@dxos/app-framework';
6
+
7
+ import { ASSISTANT_PLUGIN } from './meta';
8
+
9
+ export namespace AssistantEvents {
10
+ export const AiClientReady = Events.createStateEvent(`${ASSISTANT_PLUGIN}/ai-client-ready`);
11
+ }
@@ -7,7 +7,7 @@ import { type Signal, batch, computed, signal } from '@preact/signals-core';
7
7
  import {
8
8
  DEFAULT_EDGE_MODEL,
9
9
  type ExecutableTool,
10
- type AIServiceClient,
10
+ type AiServiceClient,
11
11
  type GenerateRequest,
12
12
  type Message,
13
13
  type MessageContentBlock,
@@ -86,7 +86,7 @@ export class ChatProcessor {
86
86
  });
87
87
 
88
88
  constructor(
89
- private readonly _ai: AIServiceClient,
89
+ private readonly _ai: AiServiceClient,
90
90
  private _tools?: ExecutableTool[],
91
91
  private _artifacts?: ArtifactDefinition[],
92
92
  private readonly _extensions?: ToolContextExtensions,
@@ -177,7 +177,7 @@ export class ChatProcessor {
177
177
  } catch (err) {
178
178
  log.catch(err);
179
179
  if (err instanceof Error && err.message.includes('Overloaded')) {
180
- this.error.value = new AIServiceOverloadedError('AI service overloaded', { cause: err });
180
+ this.error.value = new AiServiceOverloadedError('AI service overloaded', { cause: err });
181
181
  } else {
182
182
  this.error.value = new Error('AI service error', { cause: err });
183
183
  }
@@ -233,6 +233,6 @@ export class ChatProcessor {
233
233
  }
234
234
 
235
235
  // TODO(wittjosiah): Move to ai-service-client.
236
- export class AIServiceOverloadedError extends Error {
236
+ export class AiServiceOverloadedError extends Error {
237
237
  code = 'AI_SERVICE_OVERLOADED';
238
238
  }
package/src/index.ts CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  export * from './capabilities';
6
6
  export * from './components';
7
+ export * from './events';
7
8
  export * from './meta';
8
9
  export * from './types';
9
10
 
@@ -0,0 +1,125 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Blueprint, type BlueprintEvent, type BlueprintLogger } from '@dxos/assistant';
6
+ import { getSpace, Ref, type Queue, type Space } from '@dxos/client/echo';
7
+ import { DXN, Key, Obj } from '@dxos/echo';
8
+ import {
9
+ InvocationOutcome,
10
+ InvocationTraceEndEvent,
11
+ InvocationTraceEventType,
12
+ InvocationTraceStartEvent,
13
+ TraceEvent,
14
+ type InvocationTraceEvent,
15
+ } from '@dxos/functions';
16
+ import { invariant } from '@dxos/invariant';
17
+ import { QueueSubspaceTags } from '@dxos/keys';
18
+
19
+ export class QueueLogger implements BlueprintLogger {
20
+ private _space: Space;
21
+ private _invocationTraceQueue: Queue<InvocationTraceEvent>;
22
+
23
+ constructor(private readonly blueprint: Blueprint) {
24
+ const space = getSpace(blueprint);
25
+ invariant(space, 'Space not found');
26
+ this._space = space;
27
+ let dxn = this._space.properties.invocationTraceQueue?.dxn;
28
+ if (!dxn) {
29
+ dxn = DXN.fromQueue(QueueSubspaceTags.TRACE, this._space.id, Key.ObjectId.random());
30
+ this._space.properties.invocationTraceQueue = Ref.fromDXN(dxn);
31
+ }
32
+ this._invocationTraceQueue = this._space.queues.get(dxn);
33
+ }
34
+
35
+ log(event: BlueprintEvent) {
36
+ switch (event.type) {
37
+ case 'begin':
38
+ void this._invocationTraceQueue.append([
39
+ Obj.make(InvocationTraceStartEvent, {
40
+ type: InvocationTraceEventType.START,
41
+ invocationId: event.invocationId,
42
+ timestampMs: Date.now(),
43
+ input: {},
44
+ invocationTraceQueue: Ref.fromDXN(this._getTraceQueueDxn(event.invocationId)),
45
+ invocationTarget: Ref.make(this.blueprint),
46
+ }),
47
+ ]);
48
+ break;
49
+ case 'end':
50
+ void this._invocationTraceQueue.append([
51
+ Obj.make(InvocationTraceEndEvent, {
52
+ type: InvocationTraceEventType.END,
53
+ invocationId: event.invocationId,
54
+ timestampMs: Date.now(),
55
+ outcome: InvocationOutcome.SUCCESS,
56
+ }),
57
+ ]);
58
+ break;
59
+ case 'step-start':
60
+ case 'step-complete':
61
+ void this._getTraceEventQueue(event.invocationId).append([
62
+ Obj.make(TraceEvent, {
63
+ outcome: event.type,
64
+ truncated: false,
65
+ ingestionTimestampMs: Date.now(),
66
+ logs: [
67
+ {
68
+ timestampMs: Date.now(),
69
+ level: 'info',
70
+ message: event.type,
71
+ context: { step: event.step },
72
+ },
73
+ ],
74
+ exceptions: [],
75
+ }),
76
+ ]);
77
+ break;
78
+ case 'message':
79
+ void this._getTraceEventQueue(event.invocationId).append([
80
+ Obj.make(TraceEvent, {
81
+ outcome: event.type,
82
+ truncated: false,
83
+ ingestionTimestampMs: Date.now(),
84
+ logs: [
85
+ {
86
+ timestampMs: Date.now(),
87
+ level: 'info',
88
+ message: event.type,
89
+ context: { message: event.message },
90
+ },
91
+ ],
92
+ exceptions: [],
93
+ }),
94
+ ]);
95
+ break;
96
+ case 'block':
97
+ void this._getTraceEventQueue(event.invocationId).append([
98
+ Obj.make(TraceEvent, {
99
+ outcome: event.type,
100
+ truncated: false,
101
+ ingestionTimestampMs: Date.now(),
102
+ logs: [
103
+ {
104
+ timestampMs: Date.now(),
105
+ level: 'info',
106
+ message: event.type,
107
+ context: { block: event.block },
108
+ },
109
+ ],
110
+ exceptions: [],
111
+ }),
112
+ ]);
113
+ break;
114
+ }
115
+ }
116
+
117
+ private _getTraceQueueDxn(invocationId: string): DXN {
118
+ return DXN.fromQueue(QueueSubspaceTags.TRACE, this._space.id, invocationId);
119
+ }
120
+
121
+ private _getTraceEventQueue(invocationId: string): Queue<TraceEvent> {
122
+ const dxn = this._getTraceQueueDxn(invocationId);
123
+ return this._space.queues.get(dxn);
124
+ }
125
+ }
@@ -8,8 +8,8 @@ import { type Meta, type StoryObj } from '@storybook/react';
8
8
  import { Match, Schema } from 'effect';
9
9
  import React, { useCallback, useEffect, useMemo, useRef, useState, type FC } from 'react';
10
10
 
11
- import { AIServiceEdgeClient, type AIServiceEdgeClientOptions } from '@dxos/ai';
12
- import { SpyAIService } from '@dxos/ai/testing';
11
+ import { EdgeAiServiceClient, type AiServiceEdgeClientOptions } from '@dxos/ai';
12
+ import { SpyAiService } from '@dxos/ai/testing';
13
13
  import { Events } from '@dxos/app-framework';
14
14
  import { withPluginManager } from '@dxos/app-framework/testing';
15
15
  import { localServiceEndpoints, remoteServiceEndpoints } from '@dxos/artifact-testing';
@@ -55,7 +55,7 @@ const LOCAL = false;
55
55
  const endpoints = LOCAL ? localServiceEndpoints : remoteServiceEndpoints;
56
56
 
57
57
  // TODO(burdon) Move to story args.
58
- const aiConfig: AIServiceEdgeClientOptions = {
58
+ const aiConfig: AiServiceEdgeClientOptions = {
59
59
  endpoint: endpoints.ai,
60
60
  defaultGenerationOptions: {
61
61
  model: '@anthropic/claude-3-5-sonnet-20241022',
@@ -168,7 +168,7 @@ const DefaultStory = ({ mode, spec, ...props }: StoryProps) => {
168
168
  // AI
169
169
  //
170
170
 
171
- const aiClient = useMemo(() => new SpyAIService(new AIServiceEdgeClient(aiConfig)), []);
171
+ const aiClient = useMemo(() => new SpyAiService(new EdgeAiServiceClient(aiConfig)), []);
172
172
  const tools = useMemo(
173
173
  () => space && researchGraph && createToolRegistry(space, researchGraph.queue.dxn),
174
174
  [space, researchGraph?.queue.dxn],
@@ -9,8 +9,8 @@ import { type Meta, type StoryObj } from '@storybook/react';
9
9
  import { Option, SchemaAST } from 'effect';
10
10
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
11
11
 
12
- import { AgentStatusReport, AIServiceEdgeClient, createTool, type ExecutableTool, Message, ToolResult } from '@dxos/ai';
13
- import { EXA_API_KEY, SpyAIService } from '@dxos/ai/testing';
12
+ import { AgentStatusReport, EdgeAiServiceClient, createTool, type ExecutableTool, Message, ToolResult } from '@dxos/ai';
13
+ import { EXA_API_KEY, SpyAiService } from '@dxos/ai/testing';
14
14
  import { Capabilities, contributes, createSurface, Events, Surface, useIntentDispatcher } from '@dxos/app-framework';
15
15
  import { withPluginManager } from '@dxos/app-framework/testing';
16
16
  import { localServiceEndpoints, remoteServiceEndpoints } from '@dxos/artifact-testing';
@@ -61,8 +61,8 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
61
61
  const client = useClient();
62
62
  const aiClient = useMemo(
63
63
  () =>
64
- new SpyAIService(
65
- new AIServiceEdgeClient({
64
+ new SpyAiService(
65
+ new EdgeAiServiceClient({
66
66
  endpoint: endpoints.ai,
67
67
  defaultGenerationOptions: {
68
68
  // model: '@anthropic/claude-sonnet-4-20250514',
@@ -133,7 +133,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
133
133
 
134
134
  useEffect(() => {
135
135
  if (queue?.objects.length === 0 && !queue.isLoading && prompts.length > 0) {
136
- queue.append([
136
+ void queue.append([
137
137
  Obj.make(Message, {
138
138
  role: 'assistant',
139
139
  content: prompts.map(
@@ -171,7 +171,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
171
171
  await processor.request(message, {
172
172
  history: queue.objects,
173
173
  onComplete: (messages) => {
174
- queue.append(messages);
174
+ void queue.append(messages);
175
175
  },
176
176
  });
177
177
  });
@@ -202,7 +202,7 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
202
202
  forceUpdate({});
203
203
  }, []);
204
204
 
205
- const handleResearchMore = useCallback((object: Obj.Any, relatedSchema: RelatedSchema) => {
205
+ const handleResearchMore = useCallback((object: Obj.Any | Relation.Any, relatedSchema: RelatedSchema) => {
206
206
  const prompt = `
207
207
  Research more about objects related to the object in terms of the by the specific relation schema:
208
208
  <object>${JSON.stringify(object, null, 2)}</object>
@@ -294,8 +294,8 @@ const DefaultStory = ({ items: _items, prompts = [], ...props }: RenderProps) =>
294
294
  };
295
295
 
296
296
  type ResearchPromptsProps = {
297
- object: Obj.Any;
298
- onResearch: (object: Obj.Any, relatedSchema: RelatedSchema) => void;
297
+ object: Obj.Any | Relation.Any;
298
+ onResearch: (object: Obj.Any | Relation.Any, relatedSchema: RelatedSchema) => void;
299
299
  };
300
300
 
301
301
  const ResearchPrompts = ({ object, onResearch }: ResearchPromptsProps) => {
@@ -381,13 +381,13 @@ const instantiate = (db: EchoDatabase, object: unknown): Live<any> => {
381
381
 
382
382
  return Relation.make(schema, {
383
383
  id,
384
- ...props,
385
384
  [Relation.Source]: source,
386
385
  [Relation.Target]: target,
386
+ ...props,
387
387
  });
388
388
  };
389
389
 
390
- const createToolbar = (aiClient: SpyAIService) =>
390
+ const createToolbar = (aiClient: SpyAiService) =>
391
391
  Rx.make((get) => {
392
392
  const result: ActionGraphProps = { nodes: [], edges: [] };
393
393
  const save = createMenuAction('save', () => aiClient.saveEvents(), {
@@ -7,7 +7,7 @@ import { Obj, Type, Relation } from '@dxos/echo';
7
7
  import { invariant } from '@dxos/invariant';
8
8
  import { DataType } from '@dxos/schema';
9
9
 
10
- const organizations: DataType.Organization[] = [
10
+ const organizations: (Type.Properties<DataType.Organization> & { id: string })[] = [
11
11
  { id: 'dxos', name: 'DXOS', website: 'https://dxos.org' },
12
12
  { id: 'socket_supply', name: 'Socket Supply', website: 'https://socketsupply.com' },
13
13
  { id: 'ink_and_switch', name: 'Ink & Switch', website: 'https://inkandswitch.com' },
@@ -24,7 +24,7 @@ const organizations: DataType.Organization[] = [
24
24
  { id: 'deshaw', name: 'D. E. Shaw & Co.', website: 'https://deshaw.com' },
25
25
  ];
26
26
 
27
- const people: DataType.Person[] = [
27
+ const people: (Type.Properties<DataType.Person> & { id: string })[] = [
28
28
  { id: 'rich_burdon', fullName: 'Rich Burdon' },
29
29
  { id: 'josiah_witt', fullName: 'Josiah Witt' },
30
30
  { id: 'dima_dmaretskyi', fullName: 'Dima Maretskyi' },
@@ -116,11 +116,11 @@ export const addTestData = async (space: Space): Promise<void> => {
116
116
  invariant(targetObject, `Target object not found: ${target}`);
117
117
 
118
118
  space.db.add(
119
- Obj.make(schema, {
120
- ...data,
119
+ Relation.make(schema, {
121
120
  // TODO(burdon): Test source/target types match.
122
121
  [Relation.Source]: sourceObject,
123
122
  [Relation.Target]: targetObject,
123
+ ...data,
124
124
  }),
125
125
  );
126
126
  }
@@ -30,7 +30,7 @@ export const createToolRegistry = (space: Space, queueDxn?: DXN): ToolRegistry =
30
30
  schema: DataTypes,
31
31
  onDone: async (objects) => {
32
32
  const queue = space.queues.get(queueDxn);
33
- queue.append(objects);
33
+ await queue.append(objects);
34
34
  },
35
35
  }),
36
36
  ].filter(isNonNullable),
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { describe, expect, test } from 'vitest';
6
6
 
7
- import { AIServiceEdgeClient } from '@dxos/ai';
7
+ import { EdgeAiServiceClient } from '@dxos/ai';
8
8
  import { AI_SERVICE_ENDPOINT } from '@dxos/ai/testing';
9
9
  import { log } from '@dxos/log';
10
10
 
@@ -73,7 +73,7 @@ describe.skip('openapi', () => {
73
73
  describe.skip('AI uses tools', () => {
74
74
  test('amadeus flight availabilities', { timeout: 60_000 }, async () => {
75
75
  const tools = await createToolsFromApi(FLIGHT_SEARCH_API, { authorization: AMADEUS_AUTH });
76
- const aiClient = new AIServiceEdgeClient({ endpoint: AI_SERVICE_ENDPOINT.LOCAL });
76
+ const aiClient = new EdgeAiServiceClient({ endpoint: AI_SERVICE_ENDPOINT.LOCAL });
77
77
  const processor = new ChatProcessor(aiClient, tools);
78
78
  const reply = await processor.request(
79
79
  `What is the cheapest flight from New York to Paris? going on ${new Date().toISOString()} and returning after a week. 1 adult traveler`,
@@ -85,7 +85,7 @@ describe.skip('openapi', () => {
85
85
  // TODO(dmaretskyi): Doesn't work.
86
86
  test('amadeus hotel name autocomplete', { timeout: 60_000 }, async () => {
87
87
  const tools = await createToolsFromApi(HOTEL_NAME_AUTOCOMPLETE_API, { authorization: AMADEUS_AUTH });
88
- const aiClient = new AIServiceEdgeClient({ endpoint: AI_SERVICE_ENDPOINT.LOCAL });
88
+ const aiClient = new EdgeAiServiceClient({ endpoint: AI_SERVICE_ENDPOINT.LOCAL });
89
89
  const processor = new ChatProcessor(aiClient, tools);
90
90
  const reply = await processor.request('Find me the William Wale in Brooklyn New York');
91
91
 
@@ -97,7 +97,7 @@ describe.skip('openapi', () => {
97
97
  authorization: VISUAL_CROSSING_CREDENTIALS,
98
98
  instructions: WEATHER_INSTRUCTIONS,
99
99
  });
100
- const aiClient = new AIServiceEdgeClient({ endpoint: AI_SERVICE_ENDPOINT.LOCAL });
100
+ const aiClient = new EdgeAiServiceClient({ endpoint: AI_SERVICE_ENDPOINT.LOCAL });
101
101
  const processor = new ChatProcessor(aiClient, tools);
102
102
  const reply = await processor.request(
103
103
  `Today's date is ${new Date().toISOString().split('T')[0]}. Give me weather forecast for Warsaw for next 5 days.`,
@@ -3,6 +3,7 @@
3
3
  //
4
4
 
5
5
  import { Blueprint } from '@dxos/assistant';
6
+ import { Type } from '@dxos/echo';
6
7
 
7
8
  import { ASSISTANT_PLUGIN } from './meta';
8
9
  import { AIChatType, TemplateType } from './types';
@@ -10,16 +11,25 @@ import { AIChatType, TemplateType } from './types';
10
11
  export default [
11
12
  {
12
13
  'en-US': {
13
- [AIChatType.typename]: {
14
+ [Type.getTypename(AIChatType)]: {
14
15
  'typename label': 'Assistant',
15
- 'object name placeholder': 'AI Chat',
16
+ 'typename label_zero': 'Assistants',
17
+ 'typename label_one': 'Assistant',
18
+ 'typename label_other': 'Assistants',
19
+ 'object name placeholder': 'New assistant',
16
20
  },
17
- [Blueprint.typename]: {
21
+ [Type.getTypename(Blueprint)]: {
18
22
  'typename label': 'Blueprint',
23
+ 'typename label_zero': 'Blueprints',
24
+ 'typename label_one': 'Blueprint',
25
+ 'typename label_other': 'Blueprints',
19
26
  'object name placeholder': 'New blueprint',
20
27
  },
21
- [TemplateType.typename]: {
28
+ [Type.getTypename(TemplateType)]: {
22
29
  'typename label': 'Template',
30
+ 'typename label_zero': 'Templates',
31
+ 'typename label_one': 'Template',
32
+ 'typename label_other': 'Templates',
23
33
  'object name placeholder': 'New template',
24
34
  },
25
35
  [ASSISTANT_PLUGIN]: {
@@ -40,6 +50,8 @@ export default [
40
50
  'select preset template placeholder': 'Select preset',
41
51
  'service registry label': 'Service Registry',
42
52
 
53
+ 'blueprint logs label': 'Logs',
54
+
43
55
  'assistant dialog title': 'Assistant',
44
56
  'open assistant label': 'Open assistant',
45
57
 
@@ -4,7 +4,8 @@
4
4
 
5
5
  import { Schema } from 'effect';
6
6
 
7
- import { TypedObject } from '@dxos/echo-schema';
7
+ import { Type } from '@dxos/echo';
8
+ import { LabelAnnotation } from '@dxos/echo-schema';
8
9
 
9
10
  // TODO(burdon): Change to Schema.Literal (and discriminated union).
10
11
  export enum TemplateInputType {
@@ -49,13 +50,17 @@ export const TemplateKindSchema = Schema.Union(
49
50
  );
50
51
 
51
52
  export type TemplateKindType = Schema.Schema.Type<typeof TemplateKindSchema>;
52
- export class TemplateType extends TypedObject({
53
- typename: 'dxos.org/type/Template',
54
- version: '0.1.0',
55
- })({
53
+ export const TemplateType = Schema.Struct({
56
54
  name: Schema.optional(Schema.String),
57
55
  kind: Schema.mutable(TemplateKindSchema),
58
56
  source: Schema.String,
59
57
  inputs: Schema.optional(Schema.mutable(Schema.Array(TemplateInputSchema))),
60
58
  command: Schema.optional(Schema.String),
61
- }) {}
59
+ }).pipe(
60
+ LabelAnnotation.set(['name']),
61
+ Type.Obj({
62
+ typename: 'dxos.org/type/Template',
63
+ version: '0.1.0',
64
+ }),
65
+ );
66
+ export interface TemplateType extends Schema.Schema.Type<typeof TemplateType> {}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/BlueprintContainer.tsx", "../../../src/components/BlueprintEditor/BlueprintEditor.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport JSON5 from 'json5';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { ToolRegistry } from '@dxos/ai';\nimport { useCapability } from '@dxos/app-framework';\nimport {\n type Blueprint,\n type BlueprintDefinition,\n BlueprintLoggerAdapter,\n BlueprintParser,\n BlueprintMachine,\n createLocalSearchTool,\n createExaTool,\n createGraphWriterTool,\n} from '@dxos/assistant';\nimport { getSpace } from '@dxos/client/echo';\nimport { DXN, Key } from '@dxos/echo';\nimport { Toolbar, useTranslation } from '@dxos/react-ui';\nimport { getSelectionSet, useSelectionManager } from '@dxos/react-ui-attention';\nimport { StackItem, type StackItemContentProps } from '@dxos/react-ui-stack';\n\nimport { BlueprintEditor } from './BlueprintEditor';\nimport { AssistantCapabilities } from '../capabilities';\nimport { meta } from '../meta';\n\n// TODO(burdon): Move to config.\nexport const EXA_API_KEY = '9c7e17ff-0c85-4cd5-827a-8b489f139e03';\n\n// TODO(burdon): Validate.\nconst parseBlueprint = (text: string): BlueprintDefinition | undefined => {\n try {\n const json = JSON5.parse(text);\n const { steps } = json;\n return { steps };\n } catch (error) {\n // Ignore.\n }\n};\n\nexport const BlueprintContainer = ({\n role,\n blueprint,\n}: Pick<StackItemContentProps, 'role'> & { blueprint: Blueprint }) => {\n const { t } = useTranslation(meta.id);\n const aiClient = useCapability(AssistantCapabilities.AiClient);\n const selectionManager = useSelectionManager();\n const [definition, setDefinition] = useState<BlueprintDefinition>();\n useEffect(() => {\n setDefinition({\n steps: blueprint.steps.map(({ instructions, tools }) => ({ instructions, tools })),\n });\n }, [blueprint]);\n\n const editorRef = useRef<EditorView | undefined>(undefined);\n\n // TODO(burdon): Factor out.\n const toolRegistry = useMemo(() => {\n const space = getSpace(blueprint);\n if (!space) {\n return;\n }\n\n // TODO(burdon): How should the queue be created?\n const queue = space.queues.create();\n\n return new ToolRegistry([\n createExaTool({ apiKey: EXA_API_KEY }),\n createLocalSearchTool(space.db, queue),\n createGraphWriterTool({\n db: space.db,\n queue,\n schema: [], // TODO(burdon): Get schema from client/blueprint?\n onDone: async (objects) => {\n queue.append(objects);\n },\n }),\n ]);\n }, [blueprint]);\n\n const formatAndSave = (): BlueprintDefinition | undefined => {\n if (!blueprint) {\n return;\n }\n\n const text = editorRef.current?.state.doc.toString();\n if (!text) {\n return;\n }\n\n const definition = parseBlueprint(text);\n if (!definition) {\n return;\n }\n\n setDefinition(definition);\n const formatted = JSON.stringify(definition, null, 2);\n editorRef.current?.dispatch({\n changes: { from: 0, to: text.length, insert: formatted },\n });\n\n blueprint.steps.length = 0;\n for (const step of definition.steps) {\n blueprint.steps.push({\n id: Key.ObjectId.random(),\n instructions: step.instructions,\n tools: step.tools,\n });\n }\n\n return definition;\n };\n\n // TODO(burdon): Save raw blueprint separately from parsed blueprint? (like Script).\n const handleSave = useCallback(() => {\n const definition = formatAndSave();\n if (!definition) {\n return;\n }\n\n setDefinition(definition);\n }, [blueprint]);\n\n const handleRun = useCallback(async () => {\n if (!aiClient?.value || !toolRegistry) {\n return;\n }\n\n const definition = formatAndSave();\n if (!definition) {\n return;\n }\n\n // Get input from selection.\n const input = Array.from(getSelectionSet(selectionManager)).map((id) => DXN.fromLocalObjectId(id));\n if (!input.length) {\n return;\n }\n\n const blueprint = BlueprintParser.create().parse(definition);\n const machine = new BlueprintMachine(toolRegistry, blueprint).setLogger(new BlueprintLoggerAdapter());\n await machine.runToCompletion({ aiClient: aiClient.value, input });\n }, [aiClient.value, toolRegistry]);\n\n return (\n <StackItem.Content role={role} toolbar>\n <Toolbar.Root classNames='border-be border-subduedSeparator'>\n <Toolbar.Button onClick={handleSave}>{t('button save')}</Toolbar.Button>\n <Toolbar.Button onClick={handleRun}>{t('button run')}</Toolbar.Button>\n </Toolbar.Root>\n {definition && <BlueprintEditor ref={editorRef} blueprint={definition} />}\n </StackItem.Content>\n );\n};\n\nexport default BlueprintContainer;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useImperativeHandle } from 'react';\n\nimport { BlueprintDefinition } from '@dxos/assistant';\nimport { Type } from '@dxos/echo';\nimport { useThemeContext, type ThemedClassName } from '@dxos/react-ui';\nimport {\n type EditorView,\n createBasicExtensions,\n createJsonExtensions,\n createThemeExtensions,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type BlueprintEditorProps = ThemedClassName<{\n blueprint: BlueprintDefinition;\n}>;\n\n// TODO(burdon): Factor out JsonEditor.\nexport const BlueprintEditor = forwardRef<EditorView | undefined, BlueprintEditorProps>(\n ({ classNames, blueprint }, forwardedRef) => {\n const { themeMode } = useThemeContext();\n const { parentRef, view } = useTextEditor({\n initialValue: JSON.stringify(blueprint, null, 2),\n extensions: [\n createBasicExtensions({\n lineNumbers: true,\n lineWrapping: false,\n monospace: true,\n scrollPastEnd: true,\n }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n }),\n createJsonExtensions({\n schema: Type.toJsonSchema(BlueprintDefinition, { strict: true }),\n }),\n ],\n });\n\n useImperativeHandle(forwardedRef, () => view, [view]);\n\n return <div ref={parentRef} className={mx('overflow-hidden', classNames)} />;\n },\n);\n"],
5
- "mappings": "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",
6
- "names": ["JSON5", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "ToolRegistry", "useCapability", "BlueprintLoggerAdapter", "BlueprintParser", "BlueprintMachine", "createLocalSearchTool", "createExaTool", "createGraphWriterTool", "getSpace", "DXN", "Key", "Toolbar", "useTranslation", "getSelectionSet", "useSelectionManager", "StackItem", "React", "forwardRef", "useImperativeHandle", "BlueprintDefinition", "Type", "useThemeContext", "createBasicExtensions", "createJsonExtensions", "createThemeExtensions", "useTextEditor", "mx", "BlueprintEditor", "forwardRef", "classNames", "blueprint", "forwardedRef", "themeMode", "useThemeContext", "parentRef", "view", "useTextEditor", "initialValue", "JSON", "stringify", "extensions", "createBasicExtensions", "lineNumbers", "lineWrapping", "monospace", "scrollPastEnd", "createThemeExtensions", "syntaxHighlighting", "createJsonExtensions", "schema", "Type", "toJsonSchema", "BlueprintDefinition", "strict", "useImperativeHandle", "div", "ref", "className", "mx", "EXA_API_KEY", "parseBlueprint", "text", "json", "JSON5", "parse", "steps", "error", "BlueprintContainer", "role", "blueprint", "t", "useTranslation", "meta", "id", "aiClient", "useCapability", "AssistantCapabilities", "AiClient", "selectionManager", "useSelectionManager", "definition", "setDefinition", "useState", "useEffect", "map", "instructions", "tools", "editorRef", "useRef", "undefined", "toolRegistry", "useMemo", "space", "getSpace", "queue", "queues", "create", "ToolRegistry", "createExaTool", "apiKey", "createLocalSearchTool", "db", "createGraphWriterTool", "schema", "onDone", "objects", "append", "formatAndSave", "current", "state", "doc", "toString", "formatted", "JSON", "stringify", "dispatch", "changes", "from", "to", "length", "insert", "step", "push", "Key", "ObjectId", "random", "handleSave", "useCallback", "handleRun", "value", "input", "Array", "getSelectionSet", "DXN", "fromLocalObjectId", "BlueprintParser", "machine", "BlueprintMachine", "setLogger", "BlueprintLoggerAdapter", "runToCompletion", "React", "StackItem", "Content", "toolbar", "Toolbar", "Root", "classNames", "Button", "onClick", "BlueprintEditor", "ref"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/ai-client.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { effect, signal } from '@preact/signals-core';\n\nimport { type AIServiceClient, AIServiceEdgeClient, OllamaClient } from '@dxos/ai';\nimport { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { AssistantCapabilities } from './capabilities';\nimport { ASSISTANT_PLUGIN } from '../meta';\nimport { type AssistantSettingsProps } from '../types';\n\n// TODO(wittjosiah): Factor out.\nconst DEFAULT_AI_SERVICE_URL = 'http://localhost:8788';\n\nexport default (context: PluginContext) => {\n const client = context.getCapability(ClientCapabilities.Client);\n const endpoint = client.config.values.runtime?.services?.ai?.server ?? DEFAULT_AI_SERVICE_URL;\n const aiClient = signal<AIServiceClient>(new AIServiceEdgeClient({ endpoint }));\n\n const unsubscribe = effect(() => {\n const settings = context\n .getCapability(Capabilities.SettingsStore)\n .getStore<AssistantSettingsProps>(ASSISTANT_PLUGIN)?.value;\n\n if (settings?.llmProvider === 'ollama') {\n aiClient.value = new OllamaClient();\n } else {\n aiClient.value = new AIServiceEdgeClient({\n endpoint,\n defaultGenerationOptions: {\n // model: '@anthropic/claude-sonnet-4-20250514',\n model: '@anthropic/claude-3-5-haiku-20241022',\n },\n });\n }\n });\n\n return contributes(AssistantCapabilities.AiClient, aiClient, () => unsubscribe());\n};\n"],
5
- "mappings": ";;;;;;;;AAIA,SAASA,QAAQC,cAAc;AAE/B,SAA+BC,qBAAqBC,oBAAoB;AACxE,SAASC,cAAcC,mBAAuC;AAC9D,SAASC,0BAA0B;AAOnC,IAAMC,yBAAyB;AAE/B,IAAA,oBAAe,CAACC,YAAAA;AACd,QAAMC,SAASD,QAAQE,cAAcC,mBAAmBC,MAAM;AAC9D,QAAMC,WAAWJ,OAAOK,OAAOC,OAAOC,SAASC,UAAUC,IAAIC,UAAUZ;AACvE,QAAMa,WAAWC,OAAwB,IAAIC,oBAAoB;IAAET;EAAS,CAAA,CAAA;AAE5E,QAAMU,cAAcC,OAAO,MAAA;AACzB,UAAMC,WAAWjB,QACdE,cAAcgB,aAAaC,aAAa,EACxCC,SAAiCC,gBAAAA,GAAmBC;AAEvD,QAAIL,UAAUM,gBAAgB,UAAU;AACtCX,eAASU,QAAQ,IAAIE,aAAAA;IACvB,OAAO;AACLZ,eAASU,QAAQ,IAAIR,oBAAoB;QACvCT;QACAoB,0BAA0B;;UAExBC,OAAO;QACT;MACF,CAAA;IACF;EACF,CAAA;AAEA,SAAOC,YAAYC,sBAAsBC,UAAUjB,UAAU,MAAMG,YAAAA,CAAAA;AACrE;",
6
- "names": ["effect", "signal", "AIServiceEdgeClient", "OllamaClient", "Capabilities", "contributes", "ClientCapabilities", "DEFAULT_AI_SERVICE_URL", "context", "client", "getCapability", "ClientCapabilities", "Client", "endpoint", "config", "values", "runtime", "services", "ai", "server", "aiClient", "signal", "AIServiceEdgeClient", "unsubscribe", "effect", "settings", "Capabilities", "SettingsStore", "getStore", "ASSISTANT_PLUGIN", "value", "llmProvider", "OllamaClient", "defaultGenerationOptions", "model", "contributes", "AssistantCapabilities", "AiClient"]
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 { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport {\n Capabilities,\n contributes,\n createIntent,\n LayoutAction,\n type PromiseIntentDispatcher,\n type PluginContext,\n} from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';\nimport { createExtension, ROOT_ID } from '@dxos/plugin-graph';\nimport { rxFromQuery } from '@dxos/plugin-space';\nimport { SPACE_TYPE, SpaceAction } from '@dxos/plugin-space/types';\nimport {\n type Space,\n Filter,\n Query,\n type QueryResult,\n fullyQualifiedId,\n getSpace,\n isSpace,\n} from '@dxos/react-client/echo';\n\nimport { ASSISTANT_DIALOG, ASSISTANT_PLUGIN } from '../meta';\nimport { AIChatType, AssistantAction, CompanionTo, TemplateType } from '../types';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${ASSISTANT_PLUGIN}/assistant`,\n actions: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map(() => [\n {\n id: `${LayoutAction.UpdateDialog._tag}/assistant/open`,\n data: async () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const client = context.getCapability(ClientCapabilities.Client);\n const layout = context.getCapability(Capabilities.Layout);\n const { graph } = context.getCapability(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.getNode(layout.active[0]).pipe(Option.getOrNull);\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--sparkle--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 Option.getOrElse(() => []),\n ),\n ),\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/object-chat-companion`,\n connector: (node) => {\n let query: QueryResult<AIChatType> | undefined;\n return Rx.make((get) => {\n const nodeOption = get(node);\n if (Option.isNone(nodeOption)) {\n return [];\n }\n\n const object = nodeOption.value.data;\n if (!Obj.isObject(object)) {\n return [];\n }\n\n const space = getSpace(object);\n if (!space) {\n return [];\n }\n\n if (!query) {\n query = space.db.query(Query.select(Filter.ids(object.id)).targetOf(CompanionTo).source());\n }\n\n const chat = get(rxFromQuery(query))[0];\n return [\n {\n id: [fullyQualifiedId(object), 'assistant-chat'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: chat ?? 'assistant-chat',\n properties: {\n label: ['assistant chat label', { ns: ASSISTANT_PLUGIN }],\n icon: 'ph--sparkle--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ];\n });\n },\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/root`,\n connector: (node) => {\n let query: QueryResult<TemplateType> | undefined;\n return Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) =>\n node.type === SPACE_TYPE && isSpace(node.data) ? Option.some(node.data) : Option.none(),\n ),\n Option.map((space) => {\n if (!query) {\n query = space.db.query(Query.type(TemplateType));\n }\n\n const templates = get(rxFromQuery(query));\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,\n },\n },\n ]\n : [];\n }),\n Option.getOrElse(() => []),\n ),\n );\n },\n }),\n\n createExtension({\n id: `${ASSISTANT_PLUGIN}/templates`,\n connector: (node) => {\n let query: QueryResult<TemplateType> | undefined;\n return Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) =>\n node.id === `${ASSISTANT_PLUGIN}/templates` && isSpace(node.properties.space)\n ? Option.some(node.properties.space)\n : Option.none(),\n ),\n Option.map((space) => {\n if (!query) {\n query = space.db.query(Query.type(TemplateType));\n }\n return get(rxFromQuery(query))\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 Option.getOrElse(() => []),\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.type(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, { space }));\n invariant(Obj.instanceOf(AIChatType, data?.object));\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": ["Rx", "Option", "pipe", "Capabilities", "contributes", "createIntent", "LayoutAction", "Obj", "invariant", "ClientCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "createExtension", "ROOT_ID", "rxFromQuery", "SPACE_TYPE", "SpaceAction", "Filter", "Query", "fullyQualifiedId", "getSpace", "isSpace", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "ASSISTANT_PLUGIN", "actions", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "LayoutAction", "UpdateDialog", "_tag", "data", "dispatchPromise", "dispatch", "getCapability", "IntentDispatcher", "client", "ClientCapabilities", "Client", "layout", "Layout", "graph", "AppGraph", "chat", "active", "length", "getNode", "getOrNull", "space", "getSpace", "getOrCreateChat", "spaces", "default", "createIntent", "part", "subject", "ASSISTANT_DIALOG", "options", "state", "blockAlign", "props", "properties", "label", "ns", "icon", "disposition", "position", "keyBinding", "macos", "windows", "getOrElse", "connector", "query", "nodeOption", "isNone", "object", "value", "Obj", "isObject", "db", "Query", "select", "Filter", "ids", "targetOf", "CompanionTo", "source", "rxFromQuery", "fullyQualifiedId", "join", "ATTENDABLE_PATH_SEPARATOR", "type", "PLANK_COMPANION_TYPE", "SPACE_TYPE", "isSpace", "TemplateType", "templates", "toSorted", "a", "b", "nameA", "name", "nameB", "localeCompare", "template", "objects", "AIChatType", "run", "AssistantAction", "CreateChat", "invariant", "instanceOf", "SpaceAction", "AddObject", "target"]
7
- }
@@ -1,16 +0,0 @@
1
- // packages/plugins/plugin-assistant/src/capabilities/index.ts
2
- import { lazy } from "@dxos/app-framework";
3
- var AiClient = lazy(() => import("./ai-client-MTCTMJ5N.mjs"));
4
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-DBCVARVI.mjs"));
5
- var IntentResolver = lazy(() => import("./intent-resolver-ID5NOIIJ.mjs"));
6
- var ReactSurface = lazy(() => import("./react-surface-OD23FVUD.mjs"));
7
- var Settings = lazy(() => import("./settings-FUYUBGSQ.mjs"));
8
-
9
- export {
10
- AiClient,
11
- AppGraphBuilder,
12
- IntentResolver,
13
- ReactSurface,
14
- Settings
15
- };
16
- //# sourceMappingURL=chunk-AKYSTUBJ.mjs.map