@dxos/plugin-assistant 0.8.4-main.2e9d522 → 0.8.4-main.5acf9ea

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/lib/browser/{TemplateContainer-RPJ2LBOB.mjs → BlueprintContainer-IZ4AK5EO.mjs} +9 -8
  2. package/dist/lib/browser/BlueprintContainer-IZ4AK5EO.mjs.map +7 -0
  3. package/dist/lib/browser/{ChatContainer-M3IHQLRS.mjs → ChatContainer-RP3QEXYX.mjs} +3 -3
  4. package/dist/lib/browser/{ChatDialog-X6VN6QZI.mjs → ChatDialog-ZVLXFHEY.mjs} +3 -3
  5. package/dist/lib/browser/{app-graph-builder-JTXBKE7O.mjs → app-graph-builder-XSEOKJLG.mjs} +5 -64
  6. package/dist/lib/browser/app-graph-builder-XSEOKJLG.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-OWY4CUQY.mjs → chunk-63GG6U6D.mjs} +18 -37
  8. package/dist/lib/browser/chunk-63GG6U6D.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-JQBVLTM5.mjs → chunk-7W7LHTRH.mjs} +14 -1
  10. package/dist/lib/browser/chunk-7W7LHTRH.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-AEAEKWOC.mjs → chunk-KFXSBNZR.mjs} +10 -19
  12. package/dist/lib/browser/chunk-KFXSBNZR.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-EQDW6BYQ.mjs → chunk-LERGF5YG.mjs} +7 -7
  14. package/dist/lib/browser/{chunk-EQDW6BYQ.mjs.map → chunk-LERGF5YG.mjs.map} +3 -3
  15. package/dist/lib/browser/index.mjs +42 -30
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-5RMMCMXG.mjs → intent-resolver-MV3VSZLS.mjs} +19 -4
  18. package/dist/lib/browser/intent-resolver-MV3VSZLS.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-66VY37YQ.mjs → react-surface-3GYEHQRP.mjs} +14 -14
  21. package/dist/lib/browser/react-surface-3GYEHQRP.mjs.map +7 -0
  22. package/dist/lib/browser/{settings-2DGP3UTS.mjs → settings-5GTTCVGD.mjs} +2 -2
  23. package/dist/lib/browser/types/index.mjs +1 -1
  24. package/dist/lib/node-esm/{TemplateContainer-A3NAQCZE.mjs → BlueprintContainer-RGTMNLNX.mjs} +9 -8
  25. package/dist/lib/node-esm/BlueprintContainer-RGTMNLNX.mjs.map +7 -0
  26. package/dist/lib/node-esm/{ChatContainer-VZT74PO2.mjs → ChatContainer-W3W6FWV3.mjs} +3 -3
  27. package/dist/lib/node-esm/{ChatDialog-RJ6FDX4Q.mjs → ChatDialog-QW4JRKVO.mjs} +3 -3
  28. package/dist/lib/node-esm/{app-graph-builder-OWSOXFTD.mjs → app-graph-builder-PANCJUHV.mjs} +5 -64
  29. package/dist/lib/node-esm/app-graph-builder-PANCJUHV.mjs.map +7 -0
  30. package/dist/lib/node-esm/{chunk-SENTQAEO.mjs → chunk-BFO3KHYL.mjs} +18 -37
  31. package/dist/lib/node-esm/chunk-BFO3KHYL.mjs.map +7 -0
  32. package/dist/lib/node-esm/{chunk-E33DNNDW.mjs → chunk-MS3PJARN.mjs} +7 -7
  33. package/dist/lib/node-esm/{chunk-E33DNNDW.mjs.map → chunk-MS3PJARN.mjs.map} +3 -3
  34. package/dist/lib/node-esm/{chunk-2XL6MNPE.mjs → chunk-VIIMA3XQ.mjs} +10 -19
  35. package/dist/lib/node-esm/chunk-VIIMA3XQ.mjs.map +7 -0
  36. package/dist/lib/node-esm/{chunk-BISJDTBK.mjs → chunk-Z7PUODRT.mjs} +14 -1
  37. package/dist/lib/node-esm/chunk-Z7PUODRT.mjs.map +7 -0
  38. package/dist/lib/node-esm/index.mjs +42 -30
  39. package/dist/lib/node-esm/index.mjs.map +3 -3
  40. package/dist/lib/node-esm/{intent-resolver-YPPYELY3.mjs → intent-resolver-3FMC3GHC.mjs} +19 -4
  41. package/dist/lib/node-esm/intent-resolver-3FMC3GHC.mjs.map +7 -0
  42. package/dist/lib/node-esm/meta.json +1 -1
  43. package/dist/lib/node-esm/{react-surface-RJMRBR2M.mjs → react-surface-QDQWJ7FZ.mjs} +14 -14
  44. package/dist/lib/node-esm/react-surface-QDQWJ7FZ.mjs.map +7 -0
  45. package/dist/lib/node-esm/{settings-47RYZOU4.mjs → settings-J2EXEM5H.mjs} +2 -2
  46. package/dist/lib/node-esm/types/index.mjs +1 -1
  47. package/dist/types/src/AssistantPlugin.d.ts.map +1 -1
  48. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  49. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  50. package/dist/types/src/capability-definitions.d.ts +7 -0
  51. package/dist/types/src/capability-definitions.d.ts.map +1 -0
  52. package/dist/types/src/components/BlueprintContainer.d.ts +8 -0
  53. package/dist/types/src/components/BlueprintContainer.d.ts.map +1 -0
  54. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts +0 -42
  55. package/dist/types/src/components/ChatThread/ChatThread.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts +2 -1
  57. package/dist/types/src/components/TemplateEditor/TemplateEditor.d.ts.map +1 -1
  58. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts +2 -1
  59. package/dist/types/src/components/TemplateEditor/TemplateForm.d.ts.map +1 -1
  60. package/dist/types/src/components/index.d.ts +1 -1
  61. package/dist/types/src/components/index.d.ts.map +1 -1
  62. package/dist/types/src/hooks/useChatServices.d.ts +2 -2
  63. package/dist/types/src/hooks/useChatServices.d.ts.map +1 -1
  64. package/dist/types/src/stories/Chat.stories.d.ts +2 -44
  65. package/dist/types/src/stories/Chat.stories.d.ts.map +1 -1
  66. package/dist/types/src/translations.d.ts +1 -10
  67. package/dist/types/src/translations.d.ts.map +1 -1
  68. package/dist/types/src/types/schema.d.ts +32 -0
  69. package/dist/types/src/types/schema.d.ts.map +1 -1
  70. package/dist/types/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +75 -73
  72. package/src/AssistantPlugin.tsx +32 -6
  73. package/src/capabilities/app-graph-builder.ts +2 -86
  74. package/src/capabilities/intent-resolver.ts +16 -2
  75. package/src/capabilities/react-surface.tsx +7 -7
  76. package/src/capability-definitions.ts +15 -0
  77. package/src/components/BlueprintContainer.tsx +24 -0
  78. package/src/components/TemplateEditor/TemplateEditor.stories.tsx +4 -4
  79. package/src/components/TemplateEditor/TemplateEditor.tsx +12 -10
  80. package/src/components/TemplateEditor/TemplateForm.stories.tsx +4 -4
  81. package/src/components/TemplateEditor/TemplateForm.tsx +3 -2
  82. package/src/components/index.ts +1 -1
  83. package/src/hooks/useChatServices.ts +24 -48
  84. package/src/stories/Chat.stories.tsx +17 -24
  85. package/src/translations.ts +1 -10
  86. package/src/types/schema.ts +13 -0
  87. package/dist/lib/browser/TemplateContainer-RPJ2LBOB.mjs.map +0 -7
  88. package/dist/lib/browser/app-graph-builder-JTXBKE7O.mjs.map +0 -7
  89. package/dist/lib/browser/chunk-AEAEKWOC.mjs.map +0 -7
  90. package/dist/lib/browser/chunk-JQBVLTM5.mjs.map +0 -7
  91. package/dist/lib/browser/chunk-OWY4CUQY.mjs.map +0 -7
  92. package/dist/lib/browser/intent-resolver-5RMMCMXG.mjs.map +0 -7
  93. package/dist/lib/browser/react-surface-66VY37YQ.mjs.map +0 -7
  94. package/dist/lib/node-esm/TemplateContainer-A3NAQCZE.mjs.map +0 -7
  95. package/dist/lib/node-esm/app-graph-builder-OWSOXFTD.mjs.map +0 -7
  96. package/dist/lib/node-esm/chunk-2XL6MNPE.mjs.map +0 -7
  97. package/dist/lib/node-esm/chunk-BISJDTBK.mjs.map +0 -7
  98. package/dist/lib/node-esm/chunk-SENTQAEO.mjs.map +0 -7
  99. package/dist/lib/node-esm/intent-resolver-YPPYELY3.mjs.map +0 -7
  100. package/dist/lib/node-esm/react-surface-RJMRBR2M.mjs.map +0 -7
  101. package/dist/types/src/components/TemplateContainer.d.ts +0 -8
  102. package/dist/types/src/components/TemplateContainer.d.ts.map +0 -1
  103. package/src/components/TemplateContainer.tsx +0 -24
  104. /package/dist/lib/browser/{ChatContainer-M3IHQLRS.mjs.map → ChatContainer-RP3QEXYX.mjs.map} +0 -0
  105. /package/dist/lib/browser/{ChatDialog-X6VN6QZI.mjs.map → ChatDialog-ZVLXFHEY.mjs.map} +0 -0
  106. /package/dist/lib/browser/{settings-2DGP3UTS.mjs.map → settings-5GTTCVGD.mjs.map} +0 -0
  107. /package/dist/lib/node-esm/{ChatContainer-VZT74PO2.mjs.map → ChatContainer-W3W6FWV3.mjs.map} +0 -0
  108. /package/dist/lib/node-esm/{ChatDialog-RJ6FDX4Q.mjs.map → ChatDialog-QW4JRKVO.mjs.map} +0 -0
  109. /package/dist/lib/node-esm/{settings-47RYZOU4.mjs.map → settings-J2EXEM5H.mjs.map} +0 -0
@@ -6,21 +6,22 @@ import { Layer } from 'effect';
6
6
  import { useMemo } from 'react';
7
7
  import { useDeepCompareMemoize } from 'use-deep-compare-effect';
8
8
 
9
- import { type AiService, type ToolExecutionService, ToolRegistry, type ToolResolverService } from '@dxos/ai';
10
- import { AiServiceTestingPreset } from '@dxos/ai/testing';
9
+ import { type AiService, type ToolExecutionService, type ToolResolverService } from '@dxos/ai';
11
10
  import { Capabilities, useCapabilities } from '@dxos/app-framework';
12
11
  import { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';
13
12
  import { type Space } from '@dxos/client/echo';
14
13
  import {
15
- ConfiguredCredentialsService,
14
+ ComputeEventLogger,
16
15
  CredentialsService,
17
16
  DatabaseService,
18
- EventLogger,
19
- FunctionCallService,
17
+ LocalFunctionExecutionService,
20
18
  QueueService,
19
+ RemoteFunctionExecutionService,
21
20
  TracingService,
22
21
  } from '@dxos/functions';
23
22
 
23
+ import { AssistantCapabilities } from '../capability-definitions';
24
+
24
25
  export * from '@dxos/assistant';
25
26
 
26
27
  // TODO(burdon): Deconstruct into separate layers?
@@ -29,11 +30,10 @@ export type ChatServices =
29
30
  | CredentialsService
30
31
  | DatabaseService
31
32
  | QueueService
32
- | FunctionCallService
33
+ | RemoteFunctionExecutionService
33
34
  | ToolResolverService
34
35
  | ToolExecutionService
35
- | TracingService
36
- | EventLogger;
36
+ | TracingService;
37
37
 
38
38
  export type UseChatServicesProps = {
39
39
  space?: Space;
@@ -43,49 +43,25 @@ export type UseChatServicesProps = {
43
43
  * Construct service layer.
44
44
  */
45
45
  export const useChatServices = ({ space }: UseChatServicesProps): Layer.Layer<ChatServices> | undefined => {
46
- const toolRegistry = useToolRegistry();
47
- // TODO(dmaretskyi): We can provide the plugin registry as a layer and then build the entire layer stack from there. We need to think how plugin reactivity affect our layer structure.
48
- const toolResolver = useToolResolver();
49
- const toolExecutionService = useToolExecutionService();
46
+ const aiServiceLayer =
47
+ useCapabilities(AssistantCapabilities.AiServiceLayer).at(0) ?? Layer.die('AiService not found');
48
+ const functions = useCapabilities(Capabilities.Functions).flat();
50
49
 
51
50
  return useMemo(() => {
52
51
  return Layer.mergeAll(
53
- AiServiceTestingPreset('edge-remote').pipe(Layer.orDie), // TODO(burdon): Error management?
54
- Layer.succeed(CredentialsService, new ConfiguredCredentialsService()),
55
- space ? Layer.succeed(DatabaseService, DatabaseService.make(space.db)) : DatabaseService.notAvailable,
56
- space ? Layer.succeed(QueueService, QueueService.make(space.queues)) : QueueService.notAvailable,
57
- Layer.succeed(FunctionCallService, FunctionCallService.mock()),
58
- Layer.succeed(TracingService, TracingService.noop),
59
- Layer.succeed(EventLogger, EventLogger.noop),
60
- toolResolver,
61
- toolExecutionService,
62
- );
63
- }, [space, toolRegistry, toolResolver]);
64
- };
52
+ aiServiceLayer,
53
+ makeToolResolverFromFunctions(functions),
54
+ makeToolExecutionServiceFromFunctions(functions),
65
55
 
66
- const useToolResolver = (): Layer.Layer<ToolResolverService> => {
67
- const functions = useCapabilities(Capabilities.Functions).flat();
68
- return useMemo(() => makeToolResolverFromFunctions(functions), [useDeepCompareMemoize(functions.map((f) => f.name))]);
69
- };
56
+ CredentialsService.configuredLayer([]),
57
+ space ? DatabaseService.makeLayer(space.db) : DatabaseService.notAvailable,
58
+ space ? QueueService.makeLayer(space.queues) : QueueService.notAvailable,
70
59
 
71
- const useToolExecutionService = (): Layer.Layer<ToolExecutionService> => {
72
- const functions = useCapabilities(Capabilities.Functions).flat();
73
- return useMemo(
74
- () => makeToolExecutionServiceFromFunctions(functions),
75
- [useDeepCompareMemoize(functions.map((f) => f.name))],
76
- );
77
- };
78
-
79
- // TODO(burdon): Factor out.
80
- const useToolRegistry = (): ToolRegistry => {
81
- const tools = useCapabilities(Capabilities.Tools).flat();
82
- return useMemo(() => {
83
- const toolRegistry = new ToolRegistry([]);
84
- for (const tool of tools) {
85
- if (!toolRegistry.has(tool)) {
86
- toolRegistry.register(tool);
87
- }
88
- }
89
- return toolRegistry;
90
- }, [useDeepCompareMemoize(tools)]);
60
+ ComputeEventLogger.layerFromTracing,
61
+ ).pipe(
62
+ Layer.provideMerge(TracingService.layerNoop),
63
+ Layer.provideMerge(LocalFunctionExecutionService.layer),
64
+ Layer.provideMerge(RemoteFunctionExecutionService.mockLayer),
65
+ );
66
+ }, [space, useDeepCompareMemoize(functions.map((f) => f.name))]);
91
67
  };
@@ -12,10 +12,10 @@ import { withPluginManager } from '@dxos/app-framework/testing';
12
12
  import { ContextBinder } from '@dxos/assistant';
13
13
  import {
14
14
  DESIGN_BLUEPRINT,
15
- TASK_BLUEPRINT,
15
+ PLANNING_BLUEPRINT,
16
16
  readDocument,
17
17
  remoteServiceEndpoints,
18
- writeDocument,
18
+ updateDocument,
19
19
  } from '@dxos/assistant-testing';
20
20
  import { Blueprint } from '@dxos/blueprints';
21
21
  import { Filter, Obj, Ref } from '@dxos/echo';
@@ -26,7 +26,7 @@ import { ClientPlugin } from '@dxos/plugin-client';
26
26
  import { InboxPlugin } from '@dxos/plugin-inbox';
27
27
  import { MapPlugin } from '@dxos/plugin-map';
28
28
  import { MarkdownPlugin } from '@dxos/plugin-markdown';
29
- import { DocumentType } from '@dxos/plugin-markdown/types';
29
+ import { Markdown } from '@dxos/plugin-markdown/types';
30
30
  import { SpacePlugin } from '@dxos/plugin-space';
31
31
  import { TablePlugin } from '@dxos/plugin-table';
32
32
  import { TranscriptionPlugin } from '@dxos/plugin-transcription';
@@ -42,14 +42,13 @@ import {
42
42
  outliner,
43
43
  } from '@dxos/react-ui-editor';
44
44
  import { mx } from '@dxos/react-ui-theme';
45
- import { DataType } from '@dxos/schema';
46
45
  import { render, withLayout, withTheme } from '@dxos/storybook-utils';
47
46
 
48
47
  import { AssistantPlugin } from '../AssistantPlugin';
49
48
  import { Chat, TemplateEditor, type ChatPromptProps } from '../components';
50
49
  import { type AiServicePreset, AiServicePresets } from '../hooks';
51
50
  import { useChatProcessor, useChatServices } from '../hooks';
52
- import { meta as AssistantMeta } from '../meta';
51
+ import { meta } from '../meta';
53
52
  import { translations } from '../translations';
54
53
  import { Assistant } from '../types';
55
54
 
@@ -91,7 +90,7 @@ const DefaultStory = ({ components }: { components: (FC | FC[])[] }) => {
91
90
  //
92
91
 
93
92
  const ChatContainer = () => {
94
- const { t } = useTranslation(AssistantMeta.id);
93
+ const { t } = useTranslation(meta.id);
95
94
  const space = useSpace();
96
95
 
97
96
  const [chat, setChat] = useState<Assistant.Chat>();
@@ -114,7 +113,7 @@ const ChatContainer = () => {
114
113
  }, [presets]);
115
114
 
116
115
  const services = useChatServices({ space });
117
- const blueprintRegistry = useMemo(() => new Blueprint.Registry([DESIGN_BLUEPRINT, TASK_BLUEPRINT]), []);
116
+ const blueprintRegistry = useMemo(() => new Blueprint.Registry([DESIGN_BLUEPRINT, PLANNING_BLUEPRINT]), []);
118
117
  const processor = useChatProcessor({
119
118
  preset,
120
119
  chat,
@@ -181,7 +180,7 @@ const ChatContainer = () => {
181
180
  const DocumentContainer = () => {
182
181
  const { themeMode } = useThemeContext();
183
182
  const space = useSpace();
184
- const [document] = useQuery(space, Filter.type(DocumentType));
183
+ const [document] = useQuery(space, Filter.type(Markdown.Document));
185
184
  if (!document?.content.target) {
186
185
  return null;
187
186
  }
@@ -212,7 +211,7 @@ const DocumentContainer = () => {
212
211
  const BlueprintContainer = () => {
213
212
  const space = useSpace();
214
213
  const [blueprint] = useQuery(space, Filter.type(Blueprint.Blueprint));
215
- if (!blueprint?.instructions.target) {
214
+ if (!blueprint?.instructions) {
216
215
  return null;
217
216
  }
218
217
 
@@ -221,7 +220,7 @@ const BlueprintContainer = () => {
221
220
  <Toolbar.Root classNames='border-b border-subduedSeparator'>
222
221
  <h2>{Obj.getLabel(blueprint)}</h2>
223
222
  </Toolbar.Root>
224
- <TemplateEditor template={blueprint.instructions.target} />
223
+ <TemplateEditor id={blueprint.id} template={blueprint.instructions} />
225
224
  </div>
226
225
  );
227
226
  };
@@ -230,7 +229,7 @@ const BlueprintContainer = () => {
230
229
  // Configuration
231
230
  //
232
231
 
233
- const meta = {
232
+ const storybook = {
234
233
  title: 'plugins/plugin-assistant/Chat',
235
234
  render: render(DefaultStory),
236
235
  decorators: [],
@@ -240,9 +239,9 @@ const meta = {
240
239
  },
241
240
  } satisfies Meta<typeof DefaultStory>;
242
241
 
243
- export default meta;
242
+ export default storybook;
244
243
 
245
- type Story = StoryObj<typeof meta>;
244
+ type Story = StoryObj<typeof storybook>;
246
245
 
247
246
  //
248
247
  // Decorators
@@ -278,7 +277,7 @@ const getDecorators = ({
278
277
  plugins: [
279
278
  ClientPlugin({
280
279
  config,
281
- types: [Assistant.Chat, DocumentType, Blueprint.Blueprint],
280
+ types: [Markdown.Document, Assistant.Chat, Blueprint.Blueprint],
282
281
  onClientInitialized: async (_, client) => {
283
282
  await client.halo.createIdentity();
284
283
  await client.spaces.waitUntilReady();
@@ -287,20 +286,14 @@ const getDecorators = ({
287
286
  // ERROR: invariant violation: Database was not initialized with root object.
288
287
  await space.waitUntilReady();
289
288
 
290
- // TODO(burdon): Remove need for this boilerplate. Namespace for types?
291
289
  const chat = space.db.add(
290
+ // TODO(burdon): Assistant.makeChat()
292
291
  Obj.make(Assistant.Chat, {
293
292
  queue: Ref.fromDXN(space.queues.create().dxn),
294
293
  }),
295
294
  );
296
295
  const binder = new ContextBinder(await chat.queue.load());
297
-
298
- const doc = space.db.add(
299
- Obj.make(DocumentType, {
300
- name: 'Tasks',
301
- content: Ref.make(Obj.make(DataType.Text, { content: '' })),
302
- }),
303
- );
296
+ const doc = space.db.add(Markdown.makeDocument({ name: 'Tasks' }));
304
297
  if (context) {
305
298
  await binder.bind({ objects: [Ref.make(doc)] });
306
299
  }
@@ -323,7 +316,7 @@ const getDecorators = ({
323
316
 
324
317
  ...plugins,
325
318
  ],
326
- capabilities: [contributes(Capabilities.Functions, [readDocument, writeDocument])],
319
+ capabilities: [contributes(Capabilities.Functions, [readDocument, updateDocument])],
327
320
  }),
328
321
  withTheme,
329
322
  withLayout({
@@ -359,7 +352,7 @@ export const WithBlueprints = {
359
352
  decorators: getDecorators({
360
353
  config: remoteConfig,
361
354
  plugins: [ChessPlugin(), InboxPlugin(), MapPlugin(), MarkdownPlugin(), TablePlugin()],
362
- blueprints: [TASK_BLUEPRINT],
355
+ blueprints: [PLANNING_BLUEPRINT],
363
356
  context: true,
364
357
  }),
365
358
  args: {
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Blueprint, Template } from '@dxos/blueprints';
5
+ import { Blueprint } from '@dxos/blueprints';
6
6
  import { Sequence } from '@dxos/conductor';
7
7
  import { type Resource } from '@dxos/react-ui';
8
8
 
@@ -22,15 +22,6 @@ export const translations = [
22
22
  'rename object label': 'Rename blueprint',
23
23
  'delete object label': 'Delete blueprint',
24
24
  },
25
- [Template.Template.typename]: {
26
- 'typename label': 'Template',
27
- 'typename label_zero': 'Templates',
28
- 'typename label_one': 'Template',
29
- 'typename label_other': 'Templates',
30
- 'object name placeholder': 'New template',
31
- 'rename object label': 'Rename template',
32
- 'delete object label': 'Delete template',
33
- },
34
25
  // TODO(burdon): From conductor.
35
26
  [Sequence.typename]: {
36
27
  'typename label': 'Sequence',
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { Schema } from 'effect';
6
6
 
7
+ import { Blueprint } from '@dxos/blueprints';
7
8
  import { SpaceSchema, Queue } from '@dxos/client/echo';
8
9
  import { Sequence } from '@dxos/conductor';
9
10
  import { Type } from '@dxos/echo';
@@ -84,6 +85,18 @@ export namespace Assistant {
84
85
  }),
85
86
  }) {}
86
87
 
88
+ export const BlueprintForm = Schema.Struct({
89
+ name: Schema.String,
90
+ description: Schema.optional(Schema.String),
91
+ });
92
+
93
+ export class CreateBlueprint extends Schema.TaggedClass<CreateBlueprint>()(`${meta.id}/action/create-blueprint`, {
94
+ input: BlueprintForm,
95
+ output: Schema.Struct({
96
+ object: Blueprint.Blueprint,
97
+ }),
98
+ }) {}
99
+
87
100
  export class CreateSequence extends Schema.TaggedClass<CreateSequence>()(`${meta.id}/action/create-sequence`, {
88
101
  input: Schema.Struct({
89
102
  name: Schema.optional(Schema.String),
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/TemplateContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Template } from '@dxos/blueprints';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { TemplateEditor } from './TemplateEditor';\n\nexport type TemplateContainerProps = {\n template: Template.Template;\n};\n\nexport const TemplateContainer = ({ template }: TemplateContainerProps) => {\n return (\n <StackItem.Content classNames='container-max-width'>\n <TemplateEditor template={template} />\n </StackItem.Content>\n );\n};\n\nexport default TemplateContainer;\n"],
5
- "mappings": ";;;;;;;AAIA,OAAOA,WAAW;AAGlB,SAASC,iBAAiB;AAQnB,IAAMC,oBAAoB,CAAC,EAAEC,SAAQ,MAA0B;;;AACpE,WACE,sBAAA,cAACC,UAAUC,SAAO;MAACC,YAAW;OAC5B,sBAAA,cAACC,gBAAAA;MAAeJ;;;;;AAGtB;AAEA,IAAA,4BAAeD;",
6
- "names": ["React", "StackItem", "TemplateContainer", "template", "StackItem", "Content", "classNames", "TemplateEditor"]
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 { Template } from '@dxos/blueprints';\nimport { Sequence } from '@dxos/conductor';\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 { getActiveSpace, 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, meta } from '../meta';\nimport { Assistant } from '../types';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${meta.id}/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 space = getActiveSpace(context) ?? client.spaces.default;\n const chat = await getOrCreateChat(dispatch, space);\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: meta.id }],\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: `${meta.id}/object-chat-companion`,\n connector: (node) => {\n let query: QueryResult<Assistant.Chat> | 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(Assistant.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: meta.id }],\n icon: 'ph--sparkle--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ];\n });\n },\n }),\n\n createExtension({\n id: `${meta.id}/sequence-logs`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (Obj.instanceOf(Sequence, node.data) ? Option.some(node) : Option.none())),\n Option.map((node) => [\n {\n id: [node.id, 'logs'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'logs',\n properties: {\n label: ['sequence logs label', { ns: meta.id }],\n icon: 'ph--clock-countdown--regular',\n disposition: 'hidden',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n\n createExtension({\n id: `${meta.id}/root`,\n connector: (node) => {\n let query: QueryResult<Template.Template> | 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(Template.Template));\n }\n\n const templates = get(rxFromQuery(query));\n return templates.length > 0\n ? [\n {\n id: `${meta.id}/templates`,\n type: `${meta.id}/templates`,\n data: null,\n properties: {\n label: ['templates label', { ns: meta.id }],\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: `${meta.id}/templates`,\n connector: (node) => {\n let query: QueryResult<Template.Template> | undefined;\n return Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) =>\n node.id === `${meta.id}/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(Template.Template));\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: `${meta.id}/template`,\n data: template,\n properties: {\n label: template.name ?? ['object placeholder', { ns: meta.id }],\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 (\n dispatch: PromiseIntentDispatcher,\n space: Space,\n): Promise<Assistant.Chat | undefined> => {\n // TODO(wittjosiah): This should be possible with a single query.\n const { objects: allChats } = await space.db.query(Query.type(Assistant.Chat)).run();\n const { objects: relatedChats } = await space.db\n .query(Query.type(Assistant.Chat).sourceOf(Assistant.CompanionTo).source())\n .run();\n const chats = allChats.filter((chat) => !relatedChats.includes(chat));\n // console.log('objects', JSON.stringify(objects, null, 2));\n if (chats.length > 0) {\n // TODO(burdon): Is this the most recent?\n return chats[chats.length - 1];\n }\n\n const { data } = await dispatch(createIntent(Assistant.CreateChat, { space }));\n invariant(Obj.instanceOf(Assistant.Chat, 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", "Template", "Sequence", "Obj", "invariant", "ClientCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "createExtension", "ROOT_ID", "getActiveSpace", "rxFromQuery", "SPACE_TYPE", "SpaceAction", "Filter", "Query", "fullyQualifiedId", "getSpace", "isSpace", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "meta", "actions", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "LayoutAction", "UpdateDialog", "_tag", "data", "dispatchPromise", "dispatch", "getCapability", "IntentDispatcher", "client", "ClientCapabilities", "Client", "space", "getActiveSpace", "spaces", "default", "chat", "getOrCreateChat", "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", "getSpace", "db", "Query", "select", "Filter", "ids", "targetOf", "Assistant", "CompanionTo", "source", "rxFromQuery", "fullyQualifiedId", "join", "ATTENDABLE_PATH_SEPARATOR", "type", "PLANK_COMPANION_TYPE", "instanceOf", "Sequence", "SPACE_TYPE", "isSpace", "Template", "templates", "length", "toSorted", "a", "b", "nameA", "name", "nameB", "localeCompare", "template", "objects", "allChats", "Chat", "run", "relatedChats", "sourceOf", "chats", "filter", "includes", "CreateChat", "invariant", "SpaceAction", "AddObject", "target"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/TemplateEditor/TemplateEditor.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { HighlightStyle, LanguageSupport, syntaxHighlighting } from '@codemirror/language';\nimport { styleTags, tags } from '@lezer/highlight';\nimport { handlebarsLanguage } from '@xiechao/codemirror-lang-handlebars';\nimport React from 'react';\n\nimport { type Template } from '@dxos/blueprints';\nimport { invariant } from '@dxos/invariant';\nimport { createDocAccessor } from '@dxos/react-client/echo';\nimport { useThemeContext, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport {\n createBasicExtensions,\n createDataExtensions,\n createThemeExtensions,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { meta } from '../../meta';\n\nhandlebarsLanguage.configure({\n props: [\n styleTags({\n '---': tags.lineComment,\n }),\n ],\n});\n\nexport type TemplateEditorProps = ThemedClassName<{\n template: Template.Template;\n}>;\n\nexport const TemplateEditor = ({ classNames, template }: TemplateEditorProps) => {\n const { t } = useTranslation(meta.id);\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor(() => {\n invariant(template.source.target);\n return {\n initialValue: template.source.target.content,\n extensions: [\n createDataExtensions({\n id: template.id,\n text: createDocAccessor(template.source.target, ['content']),\n }),\n createBasicExtensions({\n bracketMatching: false,\n lineNumbers: true,\n lineWrapping: true,\n monospace: true,\n placeholder: t('template placeholder'),\n }),\n createThemeExtensions({\n themeMode,\n }),\n\n // https://github.com/xiechao/lang-handlebars\n new LanguageSupport(handlebarsLanguage, syntaxHighlighting(handlebarsHighlightStyle)),\n ],\n };\n }, [themeMode, template]);\n\n return <div ref={parentRef} className={mx('h-full', classNames)} />;\n};\n\n/**\n * https://github.com/xiechao/lang-handlebars/blob/direct/src/highlight.js\n */\nexport const handlebarsHighlightStyle = HighlightStyle.define([\n {\n // Braces.\n tag: tags.tagName,\n class: 'text-redText',\n },\n {\n tag: tags.variableName,\n class: 'text-blueText',\n },\n {\n tag: tags.keyword,\n class: 'text-greenText',\n },\n {\n tag: tags.comment,\n class: 'text-subdued',\n },\n]);\n"],
5
- "mappings": ";;;;;;AAIA,SAASA,gBAAgBC,iBAAiBC,0BAA0B;AACpE,SAASC,WAAWC,YAAY;AAChC,SAASC,0BAA0B;AACnC,OAAOC,WAAW;AAGlB,SAASC,iBAAiB;AAC1B,SAASC,yBAAyB;AAClC,SAASC,iBAAiBC,sBAA4C;AACtE,SACEC,uBACAC,sBACAC,uBACAC,qBACK;AACP,SAASC,UAAU;;AAInBC,mBAAmBC,UAAU;EAC3BC,OAAO;IACLC,UAAU;MACR,OAAOC,KAAKC;IACd,CAAA;;AAEJ,CAAA;AAMO,IAAMC,iBAAiB,CAAC,EAAEC,YAAYC,SAAQ,MAAuB;;;AAC1E,UAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKC,EAAE;AACpC,UAAM,EAAEC,UAAS,IAAKC,gBAAAA;AACtB,UAAM,EAAEC,UAAS,IAAKC,cAAc,MAAA;AAClCC,gBAAUT,SAASU,OAAOC,QAAM,QAAA;;;;;;;;;AAChC,aAAO;QACLC,cAAcZ,SAASU,OAAOC,OAAOE;QACrCC,YAAY;UACVC,qBAAqB;YACnBX,IAAIJ,SAASI;YACbY,MAAMC,kBAAkBjB,SAASU,OAAOC,QAAQ;cAAC;aAAU;UAC7D,CAAA;UACAO,sBAAsB;YACpBC,iBAAiB;YACjBC,aAAa;YACbC,cAAc;YACdC,WAAW;YACXC,aAAatB,EAAE,sBAAA;UACjB,CAAA;UACAuB,sBAAsB;YACpBnB;UACF,CAAA;;UAGA,IAAIoB,gBAAgBjC,oBAAoBkC,mBAAmBC,wBAAAA,CAAAA;;MAE/D;IACF,GAAG;MAACtB;MAAWL;KAAS;AAExB,WAAO,sBAAA,cAAC4B,OAAAA;MAAIC,KAAKtB;MAAWuB,WAAWC,GAAG,UAAUhC,UAAAA;;;;;AACtD;AAKO,IAAM4B,2BAA2BK,eAAeC,OAAO;EAC5D;;IAEEC,KAAKtC,KAAKuC;IACVC,OAAO;EACT;EACA;IACEF,KAAKtC,KAAKyC;IACVD,OAAO;EACT;EACA;IACEF,KAAKtC,KAAK0C;IACVF,OAAO;EACT;EACA;IACEF,KAAKtC,KAAK2C;IACVH,OAAO;EACT;CACD;",
6
- "names": ["HighlightStyle", "LanguageSupport", "syntaxHighlighting", "styleTags", "tags", "handlebarsLanguage", "React", "invariant", "createDocAccessor", "useThemeContext", "useTranslation", "createBasicExtensions", "createDataExtensions", "createThemeExtensions", "useTextEditor", "mx", "handlebarsLanguage", "configure", "props", "styleTags", "tags", "lineComment", "TemplateEditor", "classNames", "template", "t", "useTranslation", "meta", "id", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "invariant", "source", "target", "initialValue", "content", "extensions", "createDataExtensions", "text", "createDocAccessor", "createBasicExtensions", "bracketMatching", "lineNumbers", "lineWrapping", "monospace", "placeholder", "createThemeExtensions", "LanguageSupport", "syntaxHighlighting", "handlebarsHighlightStyle", "div", "ref", "className", "mx", "HighlightStyle", "define", "tag", "tagName", "class", "variableName", "keyword", "comment"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/schema.ts", "../../../src/types/service.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { SpaceSchema, Queue } from '@dxos/client/echo';\nimport { Sequence } from '@dxos/conductor';\nimport { Type } from '@dxos/echo';\nimport { LabelAnnotation } from '@dxos/echo-schema';\nimport { DataType } from '@dxos/schema';\n\nimport { meta } from '../meta';\n\nexport const LLM_PROVIDERS = ['edge', 'ollama', 'lmstudio'] as const;\n\nexport namespace Assistant {\n //\n // Types\n //\n\n export const Chat = Schema.Struct({\n id: Type.ObjectId,\n name: Schema.optional(Schema.String),\n queue: Type.Ref(Queue),\n }).pipe(\n Type.Obj({\n typename: 'dxos.org/type/assistant/Chat',\n version: '0.2.0',\n }),\n LabelAnnotation.set(['name']),\n );\n\n export interface Chat extends Schema.Schema.Type<typeof Chat> {}\n\n export const CompanionTo = Schema.Struct({\n id: Type.ObjectId,\n }).pipe(\n Type.Relation({\n typename: 'dxos.org/relation/assistant/CompanionTo',\n version: '0.1.0',\n source: Chat,\n target: Type.Expando,\n }),\n );\n\n export interface CompanionTo extends Schema.Schema.Type<typeof CompanionTo> {}\n\n //\n // Settings\n //\n\n export const Settings = Schema.mutable(\n Schema.Struct({\n llmProvider: Schema.optional(Schema.Literal(...LLM_PROVIDERS)),\n edgeModel: Schema.optional(Schema.String),\n ollamaModel: Schema.optional(Schema.String),\n lmstudioModel: Schema.optional(Schema.String),\n customPrompts: Schema.optional(Schema.Boolean),\n }),\n );\n\n export type Settings = Schema.Schema.Type<typeof Settings>;\n\n //\n // Actions\n //\n\n export class OnSpaceCreated extends Schema.TaggedClass<OnSpaceCreated>()(`${meta.id}/on-space-created`, {\n input: Schema.Struct({\n space: SpaceSchema,\n rootCollection: DataType.Collection,\n }),\n output: Schema.Void,\n }) {}\n\n export class CreateChat extends Schema.TaggedClass<CreateChat>()(`${meta.id}/action/create-chat`, {\n input: Schema.Struct({\n space: SpaceSchema,\n name: Schema.optional(Schema.String),\n }),\n output: Schema.Struct({\n object: Assistant.Chat,\n }),\n }) {}\n\n export class CreateSequence extends Schema.TaggedClass<CreateSequence>()(`${meta.id}/action/create-sequence`, {\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n }),\n output: Schema.Struct({\n object: Sequence,\n }),\n }) {}\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { ComputeGraph } from '@dxos/conductor';\nimport { Type } from '@dxos/echo';\nimport { TypedObject } from '@dxos/echo-schema';\nimport { FunctionType } from '@dxos/functions';\n\nconst ApiAuthorizationKey = Schema.Struct({\n type: Schema.Literal('api-key'),\n key: Schema.String,\n placement: Schema.Union(\n Schema.Struct({\n type: Schema.Literal('authorization-header'),\n }),\n Schema.Struct({\n type: Schema.Literal('query'),\n name: Schema.String,\n }),\n ),\n});\n\nconst ApiAuthorizationOauth = Schema.Struct({\n type: Schema.Literal('oauth'),\n clientId: Schema.String,\n clientSecret: Schema.String,\n tokenUrl: Schema.String,\n grantType: Schema.String,\n});\n\nexport const ApiAuthorization = Schema.Union(ApiAuthorizationKey, ApiAuthorizationOauth);\nexport type ApiAuthorization = Schema.Schema.Type<typeof ApiAuthorization>;\n\nconst ServiceInterfaceFunction = Schema.Struct({\n kind: Schema.Literal('function'),\n fn: Type.Ref(FunctionType),\n});\n\nconst ServiceInterfaceWorkflow = Schema.Struct({\n kind: Schema.Literal('workflow'),\n workflow: Type.Ref(ComputeGraph),\n});\n\nconst ServiceInterfaceApi = Schema.Struct({\n kind: Schema.Literal('api'),\n\n /**\n * URL to fetch the openapi schema.\n */\n schemaUrl: Schema.optional(Schema.String),\n\n /**\n * Inlined openapi schema.\n */\n schema: Schema.optional(Schema.Any),\n\n /**\n * Authorization configuration if required.\n */\n authorization: Schema.optional(ApiAuthorization),\n});\n\nconst ServiceInterface = Schema.Union(ServiceInterfaceFunction, ServiceInterfaceWorkflow, ServiceInterfaceApi);\nexport type ServiceInterface = Schema.Schema.Type<typeof ServiceInterface>;\n\nexport class ServiceType extends TypedObject({\n typename: 'dxos.org/type/ServiceType',\n version: '0.1.0',\n})({\n serviceId: Schema.String,\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n category: Schema.optional(Schema.String),\n enabled: Schema.optional(Schema.Boolean),\n\n /**\n * Entries exposed: functions, workflows, and APIs.\n */\n interfaces: Schema.optional(Schema.Array(ServiceInterface)),\n}) {}\n\n//\n// Service Registry\n//\n\nexport type ServiceQuery = {\n name?: string;\n category?: string;\n};\n\nexport interface BaseServiceRegistry {\n queryServices(query?: ServiceQuery): Promise<ServiceType[]>;\n}\n\nexport const categoryIcons: Record<string, string> = {\n finance: 'ph--bank--regular',\n health: 'ph--heart--regular',\n geolocation: 'ph--globe-simple--regular',\n education: 'ph--books--regular',\n entertainment: 'ph--music-notes--regular',\n shopping: 'ph--shopping-cart--regular',\n travel: 'ph--airplane-takeoff--regular',\n utilities: 'ph--lightning--regular',\n weather: 'ph--cloud-rain--regular',\n} as const;\n"],
5
- "mappings": "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",
6
- "names": ["Schema", "SpaceSchema", "Queue", "Sequence", "Type", "LabelAnnotation", "DataType", "LLM_PROVIDERS", "Assistant", "Chat", "Schema", "Struct", "id", "Type", "ObjectId", "name", "optional", "String", "queue", "Ref", "Queue", "pipe", "Obj", "typename", "version", "LabelAnnotation", "set", "CompanionTo", "Relation", "source", "target", "Expando", "Settings", "mutable", "llmProvider", "Literal", "edgeModel", "ollamaModel", "lmstudioModel", "customPrompts", "Boolean", "OnSpaceCreated", "TaggedClass", "meta", "input", "space", "SpaceSchema", "rootCollection", "DataType", "Collection", "output", "Void", "CreateChat", "object", "CreateSequence", "Sequence", "Schema", "ComputeGraph", "Type", "TypedObject", "FunctionType", "ApiAuthorizationKey", "Schema", "Struct", "type", "Literal", "key", "String", "placement", "Union", "name", "ApiAuthorizationOauth", "clientId", "clientSecret", "tokenUrl", "grantType", "ApiAuthorization", "ServiceInterfaceFunction", "kind", "fn", "Type", "Ref", "FunctionType", "ServiceInterfaceWorkflow", "workflow", "ComputeGraph", "ServiceInterfaceApi", "schemaUrl", "optional", "schema", "Any", "authorization", "ServiceInterface", "ServiceType", "TypedObject", "typename", "version", "serviceId", "description", "category", "enabled", "Boolean", "interfaces", "Array", "categoryIcons", "finance", "health", "geolocation", "education", "entertainment", "shopping", "travel", "utilities", "weather"]
7
- }