@dxos/plugin-assistant 0.8.2 → 0.8.3-main.672df60

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 (126) hide show
  1. package/dist/lib/browser/{AssistantDialog-K6POM23O.mjs → AssistantDialog-UAZSN6GT.mjs} +3 -3
  2. package/dist/lib/browser/BlueprintEditor-DGV4KJDM.mjs +45 -0
  3. package/dist/lib/browser/BlueprintEditor-DGV4KJDM.mjs.map +7 -0
  4. package/dist/lib/browser/{ChatContainer-QTO4LE2C.mjs → ChatContainer-UTN3AO5U.mjs} +3 -3
  5. package/dist/lib/browser/{app-graph-builder-YH4EGNBC.mjs → app-graph-builder-56OZ5RW4.mjs} +2 -2
  6. package/dist/lib/browser/{chunk-USJBRB3H.mjs → chunk-6SD7S7W5.mjs} +6 -4
  7. package/dist/lib/browser/{chunk-USJBRB3H.mjs.map → chunk-6SD7S7W5.mjs.map} +3 -3
  8. package/dist/lib/browser/{chunk-IHEBFO5O.mjs → chunk-NBSPGIHL.mjs} +5 -4
  9. package/dist/lib/browser/{chunk-IHEBFO5O.mjs.map → chunk-NBSPGIHL.mjs.map} +3 -3
  10. package/dist/lib/browser/{chunk-QTW7KVDO.mjs → chunk-Q6XE3O3E.mjs} +36 -12
  11. package/dist/lib/browser/{chunk-QTW7KVDO.mjs.map → chunk-Q6XE3O3E.mjs.map} +4 -4
  12. package/dist/lib/browser/index.mjs +15 -8
  13. package/dist/lib/browser/index.mjs.map +3 -3
  14. package/dist/lib/browser/{intent-resolver-63EAHENI.mjs → intent-resolver-GWELYIX2.mjs} +7 -10
  15. package/dist/lib/browser/intent-resolver-GWELYIX2.mjs.map +7 -0
  16. package/dist/lib/browser/meta.json +1 -1
  17. package/dist/lib/browser/{react-surface-XCV6NR75.mjs → react-surface-DGS34EON.mjs} +23 -10
  18. package/dist/lib/browser/react-surface-DGS34EON.mjs.map +7 -0
  19. package/dist/lib/browser/{settings-SHNQ4XXP.mjs → settings-BTFB7IQ6.mjs} +2 -2
  20. package/dist/lib/browser/types/index.mjs +1 -1
  21. package/dist/lib/node/{AssistantDialog-FDATKYE5.cjs → AssistantDialog-RTB5Q7FP.cjs} +7 -7
  22. package/dist/lib/node/BlueprintEditor-43VM3XPO.cjs +72 -0
  23. package/dist/lib/node/BlueprintEditor-43VM3XPO.cjs.map +7 -0
  24. package/dist/lib/node/{ChatContainer-5CLHJOIQ.cjs → ChatContainer-P3JL4VZ7.cjs} +7 -7
  25. package/dist/lib/node/{app-graph-builder-PSHIOW3Q.cjs → app-graph-builder-QLF353LH.cjs} +11 -11
  26. package/dist/lib/node/{chunk-FLJWJ35M.cjs → chunk-BWL5A3O5.cjs} +12 -9
  27. package/dist/lib/node/{chunk-FLJWJ35M.cjs.map → chunk-BWL5A3O5.cjs.map} +3 -3
  28. package/dist/lib/node/{chunk-H4A42LNR.cjs → chunk-PG7YNQ4R.cjs} +45 -21
  29. package/dist/lib/node/chunk-PG7YNQ4R.cjs.map +7 -0
  30. package/dist/lib/node/{chunk-RXPA2C2A.cjs → chunk-UNVDZOLA.cjs} +8 -7
  31. package/dist/lib/node/{chunk-RXPA2C2A.cjs.map → chunk-UNVDZOLA.cjs.map} +3 -3
  32. package/dist/lib/node/index.cjs +52 -45
  33. package/dist/lib/node/index.cjs.map +3 -3
  34. package/dist/lib/node/{intent-resolver-66F7WLW6.cjs → intent-resolver-U7663JU7.cjs} +11 -13
  35. package/dist/lib/node/intent-resolver-U7663JU7.cjs.map +7 -0
  36. package/dist/lib/node/meta.json +1 -1
  37. package/dist/lib/node/{react-surface-TASAPRPQ.cjs → react-surface-QXZTILW6.cjs} +37 -25
  38. package/dist/lib/node/react-surface-QXZTILW6.cjs.map +7 -0
  39. package/dist/lib/node/{settings-ERKLO6IO.cjs → settings-LBJMT6YB.cjs} +6 -6
  40. package/dist/lib/node/types/index.cjs +14 -14
  41. package/dist/lib/node/types/index.cjs.map +1 -1
  42. package/dist/lib/node-esm/{AssistantDialog-PIMYK774.mjs → AssistantDialog-DONAO6SA.mjs} +3 -3
  43. package/dist/lib/node-esm/BlueprintEditor-CTARB2FO.mjs +47 -0
  44. package/dist/lib/node-esm/BlueprintEditor-CTARB2FO.mjs.map +7 -0
  45. package/dist/lib/node-esm/{ChatContainer-QTC5NYE2.mjs → ChatContainer-FVIGCDIG.mjs} +3 -3
  46. package/dist/lib/node-esm/{app-graph-builder-Z3GMMJMD.mjs → app-graph-builder-5YX5TKKT.mjs} +2 -2
  47. package/dist/lib/node-esm/{chunk-QU626JMR.mjs → chunk-GJE4WCUJ.mjs} +6 -4
  48. package/dist/lib/node-esm/{chunk-QU626JMR.mjs.map → chunk-GJE4WCUJ.mjs.map} +3 -3
  49. package/dist/lib/node-esm/{chunk-SI5LOQEO.mjs → chunk-MNH6E6EB.mjs} +36 -12
  50. package/dist/lib/node-esm/{chunk-SI5LOQEO.mjs.map → chunk-MNH6E6EB.mjs.map} +4 -4
  51. package/dist/lib/node-esm/{chunk-ZKBACPIW.mjs → chunk-TQYSF2GS.mjs} +5 -4
  52. package/dist/lib/node-esm/{chunk-ZKBACPIW.mjs.map → chunk-TQYSF2GS.mjs.map} +3 -3
  53. package/dist/lib/node-esm/index.mjs +15 -8
  54. package/dist/lib/node-esm/index.mjs.map +3 -3
  55. package/dist/lib/node-esm/{intent-resolver-X3PWH7KM.mjs → intent-resolver-N5TM3RTL.mjs} +7 -10
  56. package/dist/lib/node-esm/intent-resolver-N5TM3RTL.mjs.map +7 -0
  57. package/dist/lib/node-esm/meta.json +1 -1
  58. package/dist/lib/node-esm/{react-surface-QMIQCXUM.mjs → react-surface-FTKGQQD2.mjs} +23 -10
  59. package/dist/lib/node-esm/react-surface-FTKGQQD2.mjs.map +7 -0
  60. package/dist/lib/node-esm/{settings-IVQRZUCU.mjs → settings-TGCCAH5D.mjs} +2 -2
  61. package/dist/lib/node-esm/types/index.mjs +1 -1
  62. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  65. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts +2 -2
  66. package/dist/types/src/components/BlueprintEditor/BlueprintEditor.d.ts.map +1 -1
  67. package/dist/types/src/components/BlueprintEditor/index.d.ts +2 -1
  68. package/dist/types/src/components/BlueprintEditor/index.d.ts.map +1 -1
  69. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -1
  70. package/dist/types/src/components/Prompt/PromptBar.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/Thread/ThreadMessage.d.ts +2 -2
  72. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -1
  73. package/dist/types/src/components/index.d.ts +1 -0
  74. package/dist/types/src/components/index.d.ts.map +1 -1
  75. package/dist/types/src/hooks/useContextProvider.d.ts.map +1 -1
  76. package/dist/types/src/stories/Prompt.stories.d.ts.map +1 -1
  77. package/dist/types/src/stories/Query.stories.d.ts.map +1 -1
  78. package/dist/types/src/stories/Research.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/testing.d.ts.map +1 -1
  80. package/dist/types/src/testing/index.d.ts +1 -1
  81. package/dist/types/src/testing/index.d.ts.map +1 -1
  82. package/dist/types/src/testing/test-blueprint.d.ts +14 -0
  83. package/dist/types/src/testing/test-blueprint.d.ts.map +1 -0
  84. package/dist/types/src/translations.d.ts.map +1 -1
  85. package/dist/types/src/types/types.d.ts +11 -5
  86. package/dist/types/src/types/types.d.ts.map +1 -1
  87. package/package.json +68 -68
  88. package/src/AssistantPlugin.tsx +5 -5
  89. package/src/capabilities/intent-resolver.ts +4 -3
  90. package/src/capabilities/react-surface.tsx +26 -7
  91. package/src/components/BlueprintEditor/BlueprintEditor.tsx +3 -4
  92. package/src/components/BlueprintEditor/index.ts +3 -1
  93. package/src/components/Prompt/Prompt.stories.tsx +1 -0
  94. package/src/components/Prompt/PromptBar.stories.tsx +1 -0
  95. package/src/components/Thread/ThreadMessage.tsx +3 -3
  96. package/src/components/index.ts +1 -0
  97. package/src/hooks/useContextProvider.ts +5 -6
  98. package/src/stories/Prompt.stories.tsx +1 -0
  99. package/src/stories/Query.stories.tsx +107 -40
  100. package/src/stories/Research.stories.tsx +1 -0
  101. package/src/stories/testing.ts +1 -5
  102. package/src/testing/index.ts +1 -1
  103. package/src/testing/{blueprint.ts → test-blueprint.ts} +21 -18
  104. package/src/translations.ts +5 -0
  105. package/src/types/types.ts +3 -3
  106. package/dist/lib/browser/intent-resolver-63EAHENI.mjs.map +0 -7
  107. package/dist/lib/browser/react-surface-XCV6NR75.mjs.map +0 -7
  108. package/dist/lib/node/chunk-H4A42LNR.cjs.map +0 -7
  109. package/dist/lib/node/intent-resolver-66F7WLW6.cjs.map +0 -7
  110. package/dist/lib/node/react-surface-TASAPRPQ.cjs.map +0 -7
  111. package/dist/lib/node-esm/intent-resolver-X3PWH7KM.mjs.map +0 -7
  112. package/dist/lib/node-esm/react-surface-QMIQCXUM.mjs.map +0 -7
  113. package/dist/types/src/testing/blueprint.d.ts +0 -7
  114. package/dist/types/src/testing/blueprint.d.ts.map +0 -1
  115. /package/dist/lib/browser/{AssistantDialog-K6POM23O.mjs.map → AssistantDialog-UAZSN6GT.mjs.map} +0 -0
  116. /package/dist/lib/browser/{ChatContainer-QTO4LE2C.mjs.map → ChatContainer-UTN3AO5U.mjs.map} +0 -0
  117. /package/dist/lib/browser/{app-graph-builder-YH4EGNBC.mjs.map → app-graph-builder-56OZ5RW4.mjs.map} +0 -0
  118. /package/dist/lib/browser/{settings-SHNQ4XXP.mjs.map → settings-BTFB7IQ6.mjs.map} +0 -0
  119. /package/dist/lib/node/{AssistantDialog-FDATKYE5.cjs.map → AssistantDialog-RTB5Q7FP.cjs.map} +0 -0
  120. /package/dist/lib/node/{ChatContainer-5CLHJOIQ.cjs.map → ChatContainer-P3JL4VZ7.cjs.map} +0 -0
  121. /package/dist/lib/node/{app-graph-builder-PSHIOW3Q.cjs.map → app-graph-builder-QLF353LH.cjs.map} +0 -0
  122. /package/dist/lib/node/{settings-ERKLO6IO.cjs.map → settings-LBJMT6YB.cjs.map} +0 -0
  123. /package/dist/lib/node-esm/{AssistantDialog-PIMYK774.mjs.map → AssistantDialog-DONAO6SA.mjs.map} +0 -0
  124. /package/dist/lib/node-esm/{ChatContainer-QTC5NYE2.mjs.map → ChatContainer-FVIGCDIG.mjs.map} +0 -0
  125. /package/dist/lib/node-esm/{app-graph-builder-Z3GMMJMD.mjs.map → app-graph-builder-5YX5TKKT.mjs.map} +0 -0
  126. /package/dist/lib/node-esm/{settings-IVQRZUCU.mjs.map → settings-TGCCAH5D.mjs.map} +0 -0
@@ -29,6 +29,7 @@ const meta: Meta<typeof PromptBar> = {
29
29
  parameters: {
30
30
  layout: 'centered',
31
31
  translations,
32
+ controls: { disable: true },
32
33
  },
33
34
  };
34
35
 
@@ -6,7 +6,7 @@ import React, { type FC, type PropsWithChildren } from 'react';
6
6
 
7
7
  import { type MessageContentBlock, type Message, type Tool } from '@dxos/ai';
8
8
  import { Surface } from '@dxos/app-framework';
9
- import type { BaseEchoObject } from '@dxos/echo-schema';
9
+ import { type Obj } from '@dxos/echo';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { type Space } from '@dxos/react-client/echo';
12
12
  import { Button, Icon, IconButton, type ThemedClassName } from '@dxos/react-ui';
@@ -48,7 +48,7 @@ export type ThreadMessageProps = ThemedClassName<{
48
48
  tools?: Tool[];
49
49
  onPrompt?: (text: string) => void;
50
50
  onDelete?: (id: string) => void;
51
- onAddToGraph?: (object: BaseEchoObject) => void;
51
+ onAddToGraph?: (object: Obj.Any) => void;
52
52
  }>;
53
53
 
54
54
  export const ThreadMessage: FC<ThreadMessageProps> = ({
@@ -94,7 +94,7 @@ type BlockComponent = FC<{
94
94
  space?: Space;
95
95
  block: MessageContentBlock;
96
96
  onPrompt?: (text: string) => void;
97
- onAddToGraph?: (object: BaseEchoObject) => void;
97
+ onAddToGraph?: (object: Obj.Any) => void;
98
98
  }>;
99
99
 
100
100
  const components: Record<string, BlockComponent> = {
@@ -16,5 +16,6 @@ export * from './Toolbox';
16
16
  // Repro: open assistant dialog then close.
17
17
  // https://github.com/microsoft/fluentui/issues/34020
18
18
  export const AssistantDialog = lazy(() => import('./AssistantDialog'));
19
+ export const BlueprintEditor = lazy(() => import('./BlueprintEditor'));
19
20
  export const ChatContainer = lazy(() => import('./ChatContainer'));
20
21
  export const TemplateContainer = lazy(() => import('./TemplateContainer'));
@@ -2,13 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import type { Schema } from 'effect';
6
5
  import { useMemo } from 'react';
7
6
 
8
7
  import { Capabilities, useCapabilities } from '@dxos/app-framework';
9
8
  import { Filter, type Space } from '@dxos/client/echo';
10
- import { Obj } from '@dxos/echo';
11
- import { type BaseEchoObject, getDXN, getLabel } from '@dxos/echo-schema';
9
+ import { Obj, type Type } from '@dxos/echo';
10
+ import { getObjectDXN, getLabel } from '@dxos/echo-schema';
12
11
  import { log } from '@dxos/log';
13
12
 
14
13
  export type ContextProvider = {
@@ -30,7 +29,7 @@ export const useContextProvider = (space?: Space): ContextProvider | undefined =
30
29
  query: async ({ query }) => {
31
30
  const artifactSchemas = artifactDefinitions.map((artifact) => artifact.schema);
32
31
  const { objects } = await space.db
33
- .query(Filter.or(...artifactSchemas.map((schema) => Filter.type(schema as Schema.Schema<BaseEchoObject>))))
32
+ .query(Filter.or(...artifactSchemas.map((schema) => Filter.type(schema as Type.Schema))))
34
33
  .run();
35
34
  return (
36
35
  objects
@@ -40,9 +39,9 @@ export const useContextProvider = (space?: Space): ContextProvider | undefined =
40
39
  })
41
40
  .filter((object) => stringMatch(query, getLabel(Obj.getSchema(object)!, object) ?? ''))
42
41
  // TODO(dmaretskyi): `Type.getDXN` (at the point of writing) didn't work here as it was schema-only.
43
- .filter((object) => !!getDXN(object))
42
+ .filter((object) => !!getObjectDXN(object))
44
43
  .map((object) => ({
45
- uri: getDXN(object as any)!.toString(),
44
+ uri: getObjectDXN(object as any)!.toString(),
46
45
  label: getLabel(Obj.getSchema(object)!, object) ?? '',
47
46
  }))
48
47
  );
@@ -47,6 +47,7 @@ const meta: Meta<typeof PromptBar> = {
47
47
  parameters: {
48
48
  translations,
49
49
  layout: 'centered',
50
+ controls: { disable: true },
50
51
  },
51
52
  };
52
53
 
@@ -5,19 +5,21 @@
5
5
  import '@dxos-theme';
6
6
 
7
7
  import { type Meta, type StoryObj } from '@storybook/react';
8
- import { Schema } from 'effect';
9
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
+ import { Match, Schema } from 'effect';
9
+ import React, { useCallback, useEffect, useMemo, useRef, useState, type FC } from 'react';
10
10
 
11
11
  import { AIServiceEdgeClient, type AIServiceEdgeClientOptions } from '@dxos/ai';
12
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';
16
- import { BlueprintParser, BlueprintMachine, setConsolePrinter } from '@dxos/assistant';
16
+ import { BlueprintMachine, BlueprintParser, Logger, setConsolePrinter, setLogger } from '@dxos/assistant';
17
+ import { combine } from '@dxos/async';
17
18
  import { Filter, Queue, type Space } from '@dxos/client/echo';
18
- import { Type } from '@dxos/echo';
19
- import { type AnyEchoObject, create, getLabelForObject, getTypename, Ref } from '@dxos/echo-schema';
19
+ import { type Obj, Type } from '@dxos/echo';
20
+ import { Ref, create, getLabelForObject, getTypename, type AnyEchoObject } from '@dxos/echo-schema';
20
21
  import { SelectionModel } from '@dxos/graph';
22
+ import { DXN } from '@dxos/keys';
21
23
  import { log } from '@dxos/log';
22
24
  import { D3ForceGraph, type D3ForceGraphProps } from '@dxos/plugin-explorer';
23
25
  import { faker } from '@dxos/random';
@@ -34,16 +36,16 @@ import {
34
36
  import { List } from '@dxos/react-ui-list';
35
37
  import { JsonFilter } from '@dxos/react-ui-syntax-highlighter';
36
38
  import { getHashColor, mx } from '@dxos/react-ui-theme';
37
- import { DataType, SpaceGraphModel } from '@dxos/schema';
39
+ import { DataType, DataTypes, SpaceGraphModel } from '@dxos/schema';
38
40
  import { createObjectFactory, type TypeSpec, type ValueGenerator } from '@dxos/schema/testing';
39
41
  import { withLayout, withTheme } from '@dxos/storybook-utils';
40
42
 
41
43
  import { addTestData } from './test-data';
42
44
  import { testPlugins } from './testing';
43
- import { AmbientDialog, PromptBar, type PromptController, type PromptBarProps } from '../components';
45
+ import { AmbientDialog, PromptBar, type PromptBarProps, type PromptController } from '../components';
44
46
  import { ASSISTANT_PLUGIN } from '../meta';
45
- import { createFilter, type Expression, QueryParser } from '../parser';
46
- import { RESEARCH_BLUEPRINT, createTools } from '../testing';
47
+ import { QueryParser, createFilter, type Expression } from '../parser';
48
+ import { RESEARCH_BLUEPRINT, createRegistry } from '../testing';
47
49
  import translations from '../translations';
48
50
 
49
51
  faker.seed(1);
@@ -63,6 +65,18 @@ const aiConfig: AIServiceEdgeClientOptions = {
63
65
  },
64
66
  };
65
67
 
68
+ /**
69
+ * Container for a set of ephemeral research results.
70
+ */
71
+ const ResearchGraph = Schema.Struct({
72
+ queue: Ref(Queue),
73
+ }).pipe(
74
+ Type.Obj({
75
+ typename: 'dxos.org/type/ResearchGraph',
76
+ version: '0.1.0',
77
+ }),
78
+ );
79
+
66
80
  type Mode = 'graph' | 'list';
67
81
 
68
82
  type StoryProps = { mode?: Mode; spec?: TypeSpec[] } & D3ForceGraphProps;
@@ -158,17 +172,16 @@ const DefaultStory = ({ mode, spec, ...props }: StoryProps) => {
158
172
  //
159
173
 
160
174
  const aiClient = useMemo(() => new SpyAIService(new AIServiceEdgeClient(aiConfig)), []);
175
+ const registry = useMemo(
176
+ () => space && researchGraph && createRegistry(space, researchGraph.queue.dxn),
177
+ [space, researchGraph?.queue.dxn],
178
+ );
161
179
 
162
180
  const researchQueue = useQueue(researchGraph?.queue.dxn, { pollInterval: 1_000 });
163
181
 
164
- const researchBlueprint = useMemo(() => {
165
- if (!space || !researchGraph) {
166
- return undefined;
167
- }
182
+ const researchBlueprint = useMemo(() => BlueprintParser.create().parse(RESEARCH_BLUEPRINT), []);
168
183
 
169
- const tools = createTools(space, researchGraph?.queue.dxn);
170
- return BlueprintParser.create(tools).parse(RESEARCH_BLUEPRINT);
171
- }, [space, researchGraph?.queue.dxn]);
184
+ const logger = useMemo(() => new Logger(), []);
172
185
 
173
186
  //
174
187
  // Handlers
@@ -179,17 +192,27 @@ const DefaultStory = ({ mode, spec, ...props }: StoryProps) => {
179
192
  }, [model]);
180
193
 
181
194
  const handleResearch = useCallback(async () => {
182
- if (!space || !researchBlueprint) {
195
+ if (!space || !registry || !researchBlueprint) {
183
196
  return;
184
197
  }
185
198
 
186
199
  const selected = selection.selected.value;
187
200
  log.info('starting research...', { selected });
188
- const { objects } = await space.db.query(Filter.ids(...selected)).run();
189
- const machine = new BlueprintMachine(researchBlueprint);
190
- setConsolePrinter(machine, true);
201
+ const resolver = space.db.graph.createRefResolver({
202
+ context: {
203
+ space: space.db.spaceId,
204
+ queue: researchGraph?.queue.dxn,
205
+ },
206
+ });
207
+ const objects = await Promise.all(selected.map((id) => resolver.resolve(DXN.fromLocalObjectId(id))));
208
+ const machine = new BlueprintMachine(registry, researchBlueprint);
209
+ const cleanup = combine(setConsolePrinter(machine, true), setLogger(machine, logger));
210
+
211
+ log.info('starting research...', { selected });
191
212
  await machine.runToCompletion({ aiService: aiClient, input: objects });
192
- }, [space, aiClient, researchBlueprint, selection]);
213
+
214
+ cleanup();
215
+ }, [space, aiClient, registry, researchBlueprint, selection]);
193
216
 
194
217
  const handleGenerate = useCallback(async () => {
195
218
  if (!space) {
@@ -202,9 +225,6 @@ const DefaultStory = ({ mode, spec, ...props }: StoryProps) => {
202
225
  } else {
203
226
  await addTestData(space);
204
227
  }
205
-
206
- // TODO(burdon): BUG: objects are not persisted unless this is called.
207
- await space.db.flush({ indexes: true });
208
228
  }, [space, generator, spec]);
209
229
 
210
230
  const handleReset = useCallback(
@@ -262,6 +282,8 @@ const DefaultStory = ({ mode, spec, ...props }: StoryProps) => {
262
282
 
263
283
  const extensions = useMemo(() => [typeahead({ onComplete: handleMatch })], [handleMatch]);
264
284
 
285
+ const { state: flushState, handleFlush } = useFlush(space);
286
+
265
287
  return (
266
288
  <div className='grow grid overflow-hidden'>
267
289
  <div className={mx('grow grid overflow-hidden', !mode && 'grid-cols-[1fr_30rem]')}>
@@ -270,7 +292,7 @@ const DefaultStory = ({ mode, spec, ...props }: StoryProps) => {
270
292
  )}
271
293
 
272
294
  {showList && (
273
- <div className='grow grid grid-rows-[min-content_1fr_1fr] overflow-hidden divide-y divide-separator'>
295
+ <div className='grow grid grid-rows-[min-content_1fr_1fr_1fr] overflow-hidden divide-y divide-separator'>
274
296
  <Toolbar.Root>
275
297
  <IconButton icon='ph--arrow-clockwise--regular' iconOnly label='refresh' onClick={handleRefresh} />
276
298
  <IconButton icon='ph--sparkle--regular' iconOnly label='research' onClick={handleResearch} />
@@ -281,13 +303,29 @@ const DefaultStory = ({ mode, spec, ...props }: StoryProps) => {
281
303
  label='reset'
282
304
  onClick={(event) => handleReset(event.shiftKey)}
283
305
  />
306
+ <IconButton
307
+ disabled={flushState === 'flushing'}
308
+ icon={Match.value(flushState).pipe(
309
+ Match.when('idle', () => 'ph--floppy-disk--regular'),
310
+ Match.when('flushing', () => 'ph--spinner--regular'),
311
+ Match.when('flushed', () => 'ph--check--regular'),
312
+ Match.exhaustive,
313
+ )}
314
+ iconOnly
315
+ label='flush'
316
+ onClick={handleFlush}
317
+ />
284
318
  </Toolbar.Root>
285
319
  <ItemList items={objects} />
320
+ <Log logger={logger} />
286
321
  <JsonFilter
287
322
  data={{
288
323
  space: client.spaces.get().length,
289
324
  db: space?.db.toJSON(),
290
- queue: researchQueue?.toJSON(),
325
+ queue: {
326
+ dxn: researchQueue?.dxn.toString(),
327
+ objects: researchQueue?.objects.length,
328
+ },
291
329
  model: model?.toJSON(),
292
330
  selection: selection.toJSON(),
293
331
  ast,
@@ -340,20 +378,8 @@ const createMatcher =
340
378
  }
341
379
  };
342
380
 
343
- /**
344
- * Container for a set of ephemeral research results.
345
- */
346
- const ResearchGraph = Schema.Struct({
347
- queue: Ref(Queue),
348
- }).pipe(
349
- Type.Obj({
350
- typename: 'dxos.org/type/ResearchGraph',
351
- version: '0.1.0',
352
- }),
353
- );
354
-
355
381
  // TODO(burdon): Replace with card list.
356
- const ItemList = <T extends AnyEchoObject>({ items = [] }: { items?: T[] }) => {
382
+ const ItemList = <T extends Obj.Any>({ items = [] }: { items?: T[] }) => {
357
383
  return (
358
384
  <List.Root<T> items={items}>
359
385
  {({ items }) => (
@@ -378,6 +404,46 @@ const ItemList = <T extends AnyEchoObject>({ items = [] }: { items?: T[] }) => {
378
404
  );
379
405
  };
380
406
 
407
+ const useFlush = (space?: Space) => {
408
+ const [state, setState] = useState<'idle' | 'flushing' | 'flushed'>('idle');
409
+ const resetTimer = useRef<NodeJS.Timeout | null>(null);
410
+
411
+ const handleFlush = useCallback(() => {
412
+ if (!space) {
413
+ return;
414
+ }
415
+
416
+ queueMicrotask(async () => {
417
+ if (resetTimer.current) {
418
+ clearTimeout(resetTimer.current);
419
+ }
420
+
421
+ setState('flushing');
422
+ await space.db.flush();
423
+ setState('flushed');
424
+
425
+ resetTimer.current = setTimeout(() => {
426
+ setState('idle');
427
+ resetTimer.current = null;
428
+ }, 1_000);
429
+ });
430
+ }, [space]);
431
+
432
+ return { state, handleFlush };
433
+ };
434
+
435
+ const Log: FC<{ logger: Logger }> = ({ logger }) => {
436
+ return (
437
+ <div className='grow flex flex-col p-1 overflow-y-auto text-sm'>
438
+ {logger.messages.value.map((message, index) => (
439
+ <div key={index} className='text-subdued'>
440
+ {message}
441
+ </div>
442
+ ))}
443
+ </div>
444
+ );
445
+ };
446
+
381
447
  const meta: Meta<typeof DefaultStory> = {
382
448
  title: 'plugins/plugin-assistant/Query',
383
449
  render: DefaultStory,
@@ -385,7 +451,7 @@ const meta: Meta<typeof DefaultStory> = {
385
451
  withPluginManager({
386
452
  fireEvents: [Events.SetupArtifactDefinition],
387
453
  plugins: testPlugins({
388
- types: [ResearchGraph],
454
+ types: [...DataTypes, ResearchGraph],
389
455
  config: {
390
456
  runtime: {
391
457
  client: {
@@ -403,6 +469,7 @@ const meta: Meta<typeof DefaultStory> = {
403
469
  ],
404
470
  parameters: {
405
471
  translations,
472
+ controls: { disable: true },
406
473
  },
407
474
  };
408
475
 
@@ -476,6 +476,7 @@ const meta: Meta<typeof DefaultStory> = {
476
476
  ],
477
477
  parameters: {
478
478
  translations,
479
+ controls: { disable: true },
479
480
  },
480
481
  };
481
482
 
@@ -20,11 +20,7 @@ import { type IndexConfig } from '@dxos/protocols/proto/dxos/echo/indexing';
20
20
  import { Config } from '@dxos/react-client';
21
21
  import { DataTypes } from '@dxos/schema';
22
22
 
23
- type TestPluginsOptions = {
24
- config?: ConfigProto;
25
- types?: Schema.Schema.AnyNoContext[];
26
- indexConfig?: IndexConfig;
27
- };
23
+ type TestPluginsOptions = { config?: ConfigProto; types?: Schema.Schema.AnyNoContext[]; indexConfig?: IndexConfig };
28
24
 
29
25
  export const testPlugins = ({ config, types = DataTypes, indexConfig }: TestPluginsOptions = {}) => [
30
26
  ClientPlugin({
@@ -2,6 +2,6 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './blueprint';
5
+ export * from './test-blueprint';
6
6
  export * from './test-functions';
7
7
  export * from './test-services';
@@ -2,9 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type ExecutableTool } from '@dxos/ai';
5
+ import { ToolRegistry } from '@dxos/ai';
6
6
  import { EXA_API_KEY } from '@dxos/ai/testing';
7
- import { type BlueprintParser, createExaTool, createGraphWriterTool, createLocalSearchTool } from '@dxos/assistant';
7
+ import { BlueprintParser, createExaTool, createGraphWriterTool, createLocalSearchTool } from '@dxos/assistant';
8
8
  import { type Space } from '@dxos/client/echo';
9
9
  import { type DXN } from '@dxos/keys';
10
10
  import { DataTypes } from '@dxos/schema';
@@ -12,23 +12,26 @@ import { isNonNullable } from '@dxos/util';
12
12
 
13
13
  // TODO(dmaretskyi): make db available through services (same as function executor).
14
14
  // TODO(burdon): Can tools implement "aspects" so that variants can be used rather than an explicit reference?
15
- export const createTools = (space: Space, queueDxn?: DXN): ExecutableTool[] => {
16
- return [
17
- createExaTool({ apiKey: EXA_API_KEY }),
18
- createLocalSearchTool(space.db),
19
- queueDxn &&
20
- createGraphWriterTool({
21
- db: space.db,
22
- schemaTypes: DataTypes,
23
- onDone: async (objects) => {
24
- const queue = space.queues.get(queueDxn);
25
- queue.append(objects);
26
- },
27
- }),
28
- ].filter(isNonNullable);
15
+ export const createRegistry = (space: Space, queueDxn?: DXN): ToolRegistry => {
16
+ return new ToolRegistry(
17
+ [
18
+ createExaTool({ apiKey: EXA_API_KEY }),
19
+ createLocalSearchTool(space.db, queueDxn && space.queues.get(queueDxn)),
20
+ queueDxn &&
21
+ createGraphWriterTool({
22
+ db: space.db,
23
+ queue: space.queues.get(queueDxn),
24
+ schemaTypes: DataTypes,
25
+ onDone: async (objects) => {
26
+ const queue = space.queues.get(queueDxn);
27
+ queue.append(objects);
28
+ },
29
+ }),
30
+ ].filter(isNonNullable),
31
+ );
29
32
  };
30
33
 
31
- export const RESEARCH_BLUEPRINT: BlueprintParser.DSL = {
34
+ export const RESEARCH_BLUEPRINT = BlueprintParser.create().parse({
32
35
  steps: [
33
36
  {
34
37
  instructions: 'Research information and entities related to the selected objects.',
@@ -44,4 +47,4 @@ export const RESEARCH_BLUEPRINT: BlueprintParser.DSL = {
44
47
  tools: ['search/local_search', 'graph/writer'],
45
48
  },
46
49
  ],
47
- };
50
+ });
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Blueprint } from '@dxos/assistant';
5
6
  import { getSchemaTypename } from '@dxos/echo-schema';
6
7
 
7
8
  import { ASSISTANT_PLUGIN } from './meta';
@@ -14,6 +15,10 @@ export default [
14
15
  'typename label': 'Assistant',
15
16
  'object name placeholder': 'AI Chat',
16
17
  },
18
+ [getSchemaTypename(Blueprint)!]: {
19
+ 'typename label': 'Blueprint',
20
+ 'object name placeholder': 'New blueprint',
21
+ },
17
22
  [TemplateType.typename]: {
18
23
  'typename label': 'Template',
19
24
  'object name placeholder': 'New template',
@@ -4,10 +4,10 @@
4
4
 
5
5
  import { Schema } from 'effect';
6
6
 
7
+ import { Blueprint } from '@dxos/assistant';
7
8
  import { SpaceSchema } from '@dxos/react-client/echo';
8
9
 
9
10
  import { AIChatType } from './chat';
10
- import { TemplateType } from './template';
11
11
  import { ASSISTANT_PLUGIN } from '../meta';
12
12
 
13
13
  export namespace AssistantAction {
@@ -23,12 +23,12 @@ export namespace AssistantAction {
23
23
  }),
24
24
  }) {}
25
25
 
26
- export class CreateTemplate extends Schema.TaggedClass<CreateTemplate>()(`${ASSISTANT_ACTION}/create-template`, {
26
+ export class CreateBlueprint extends Schema.TaggedClass<CreateBlueprint>()(`${ASSISTANT_ACTION}/create-blueprint`, {
27
27
  input: Schema.Struct({
28
28
  name: Schema.optional(Schema.String),
29
29
  }),
30
30
  output: Schema.Struct({
31
- object: TemplateType,
31
+ object: Blueprint,
32
32
  }),
33
33
  }) {}
34
34
  }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/intent-resolver.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createResolver } from '@dxos/app-framework';\nimport { createQueueDxn } from '@dxos/echo-schema';\nimport { live, refFromDXN } from '@dxos/live-object';\n\nimport { AssistantAction, AIChatType, TemplateType } from '../types';\n\nexport default () => [\n contributes(\n Capabilities.IntentResolver,\n createResolver({\n intent: AssistantAction.CreateChat,\n resolve: ({ space, name }) => ({\n data: {\n object: live(AIChatType, {\n name,\n queue: refFromDXN(createQueueDxn(space.id)),\n }),\n },\n }),\n }),\n ),\n contributes(\n Capabilities.IntentResolver,\n createResolver({\n intent: AssistantAction.CreateTemplate,\n resolve: ({ name }) => ({\n data: {\n object: live(TemplateType, { name, kind: { include: 'manual' }, source: '{{! Template }}' }),\n },\n }),\n }),\n ),\n];\n"],
5
- "mappings": ";;;;;;;;AAIA,SAASA,cAAcC,aAAaC,sBAAsB;AAC1D,SAASC,sBAAsB;AAC/B,SAASC,MAAMC,kBAAkB;AAIjC,IAAA,0BAAe,MAAM;EACnBC,YACEC,aAAaC,gBACbC,eAAe;IACbC,QAAQC,gBAAgBC;IACxBC,SAAS,CAAC,EAAEC,OAAOC,KAAI,OAAQ;MAC7BC,MAAM;QACJC,QAAQC,KAAKC,YAAY;UACvBJ;UACAK,OAAOC,WAAWC,eAAeR,MAAMS,EAAE,CAAA;QAC3C,CAAA;MACF;IACF;EACF,CAAA,CAAA;EAEFjB,YACEC,aAAaC,gBACbC,eAAe;IACbC,QAAQC,gBAAgBa;IACxBX,SAAS,CAAC,EAAEE,KAAI,OAAQ;MACtBC,MAAM;QACJC,QAAQC,KAAKO,cAAc;UAAEV;UAAMW,MAAM;YAAEC,SAAS;UAAS;UAAGC,QAAQ;QAAkB,CAAA;MAC5F;IACF;EACF,CAAA,CAAA;;",
6
- "names": ["Capabilities", "contributes", "createResolver", "createQueueDxn", "live", "refFromDXN", "contributes", "Capabilities", "IntentResolver", "createResolver", "intent", "AssistantAction", "CreateChat", "resolve", "space", "name", "data", "object", "live", "AIChatType", "queue", "refFromDXN", "createQueueDxn", "id", "CreateTemplate", "TemplateType", "kind", "include", "source"]
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 { Effect } from 'effect';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { Capabilities, contributes, createIntent, createSurface, useIntentDispatcher } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { Filter, isInstanceOf, Query } from '@dxos/echo-schema';\nimport { SettingsStore } from '@dxos/local-storage';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport {\n type AnyLiveObject,\n fullyQualifiedId,\n getSpace,\n getTypename,\n isEchoObject,\n type SpaceId,\n} from '@dxos/react-client/echo';\n\nimport { AssistantDialog, AssistantSettings, ChatContainer, PromptSettings, TemplateContainer } from '../components';\nimport { ASSISTANT_PLUGIN, ASSISTANT_DIALOG } from '../meta';\nimport { AIChatType, AssistantAction, type AssistantSettingsProps, CompanionTo, 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 Obj.instanceOf(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: AnyLiveObject<any>; subject: AIChatType | 'assistant-chat' } =>\n isEchoObject(data.companionTo) && (isInstanceOf(AIChatType, data.subject) || data.subject === 'assistant-chat'),\n component: ({ data, role }) => {\n const { dispatch } = useIntentDispatcher();\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\n // TODO(wittjosiah): Factor out to container.\n useEffect(() => {\n const timeout = setTimeout(async () => {\n const space = getSpace(data.companionTo);\n if (space && data.subject === 'assistant-chat') {\n const result = await space.db\n .query(Query.select(Filter.ids(data.companionTo.id)).targetOf(CompanionTo).source())\n .run();\n if (result.objects.length > 0) {\n return;\n }\n\n const program = Effect.gen(function* () {\n const { object } = yield* dispatch(createIntent(AssistantAction.CreateChat, { space }));\n yield* dispatch(createIntent(SpaceAction.AddObject, { object, target: space, hidden: true }));\n yield* dispatch(\n createIntent(SpaceAction.AddRelation, {\n space,\n schema: CompanionTo,\n source: object,\n target: data.companionTo,\n }),\n );\n });\n void Effect.runPromise(program);\n }\n });\n\n return () => clearTimeout(timeout);\n }, [data.subject]);\n\n if (data.subject === 'assistant-chat') {\n return null;\n }\n\n return <ChatContainer role={role} chat={data.subject} associatedArtifact={associatedArtifact} />;\n },\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/template`,\n role: 'article',\n filter: (data): data is { subject: TemplateType } => Obj.instanceOf(TemplateType, data.subject),\n component: ({ data, role }) => <TemplateContainer role={role} template={data.subject} />,\n }),\n createSurface({\n id: `${ASSISTANT_PLUGIN}/prompt-settings`,\n role: 'object-settings',\n filter: (data): data is { subject: TemplateType } => Obj.instanceOf(TemplateType, data.subject),\n component: ({ data }) => <PromptSettings template={data.subject} />,\n }),\n ]);\n"],
5
- "mappings": "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",
6
- "names": ["Effect", "React", "useEffect", "useMemo", "Capabilities", "contributes", "createIntent", "createSurface", "useIntentDispatcher", "Obj", "Filter", "isInstanceOf", "Query", "SettingsStore", "SpaceAction", "fullyQualifiedId", "getSpace", "getTypename", "isEchoObject", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "ASSISTANT_PLUGIN", "role", "filter", "data", "subject", "SettingsStore", "prefix", "component", "AssistantSettings", "settings", "value", "ASSISTANT_DIALOG", "AssistantDialog", "props", "Obj", "instanceOf", "AIChatType", "variant", "ChatContainer", "chat", "isEchoObject", "companionTo", "isInstanceOf", "dispatch", "useIntentDispatcher", "associatedArtifact", "useMemo", "fullyQualifiedId", "typename", "getTypename", "spaceId", "getSpace", "useEffect", "timeout", "setTimeout", "space", "result", "db", "query", "Query", "select", "Filter", "ids", "targetOf", "CompanionTo", "source", "run", "objects", "length", "program", "Effect", "gen", "object", "createIntent", "AssistantAction", "CreateChat", "SpaceAction", "AddObject", "target", "hidden", "AddRelation", "schema", "runPromise", "clearTimeout", "TemplateType", "TemplateContainer", "template", "PromptSettings"]
7
- }