@dxos/assistant-toolkit 0.8.4-main.72ec0f3 → 0.8.4-main.937b3ca

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 (165) hide show
  1. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  2. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +388 -285
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +43 -0
  7. package/dist/lib/browser/testing/index.mjs.map +7 -0
  8. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  9. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +388 -285
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +44 -0
  14. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  15. package/dist/types/src/blueprints/design/design-blueprint.d.ts +17 -3
  16. package/dist/types/src/blueprints/design/design-blueprint.d.ts.map +1 -1
  17. package/dist/types/src/blueprints/design/index.d.ts +1 -1
  18. package/dist/types/src/blueprints/design/index.d.ts.map +1 -1
  19. package/dist/types/src/blueprints/discord/discord-blueprint.d.ts +10 -10
  20. package/dist/types/src/blueprints/discord/discord-blueprint.d.ts.map +1 -1
  21. package/dist/types/src/blueprints/discord/index.d.ts +1 -1
  22. package/dist/types/src/blueprints/discord/index.d.ts.map +1 -1
  23. package/dist/types/src/blueprints/linear/index.d.ts +1 -1
  24. package/dist/types/src/blueprints/linear/index.d.ts.map +1 -1
  25. package/dist/types/src/blueprints/linear/linear-blueprint.d.ts +10 -10
  26. package/dist/types/src/blueprints/linear/linear-blueprint.d.ts.map +1 -1
  27. package/dist/types/src/blueprints/planning/index.d.ts +1 -1
  28. package/dist/types/src/blueprints/planning/index.d.ts.map +1 -1
  29. package/dist/types/src/blueprints/planning/planning-blueprint.d.ts +17 -3
  30. package/dist/types/src/blueprints/planning/planning-blueprint.d.ts.map +1 -1
  31. package/dist/types/src/blueprints/research/index.d.ts +1 -1
  32. package/dist/types/src/blueprints/research/index.d.ts.map +1 -1
  33. package/dist/types/src/blueprints/research/research-blueprint.d.ts +17 -3
  34. package/dist/types/src/blueprints/research/research-blueprint.d.ts.map +1 -1
  35. package/dist/types/src/blueprints/testing.d.ts +2 -2
  36. package/dist/types/src/blueprints/testing.d.ts.map +1 -1
  37. package/dist/types/src/blueprints/websearch/index.d.ts +1 -1
  38. package/dist/types/src/blueprints/websearch/index.d.ts.map +1 -1
  39. package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts +17 -3
  40. package/dist/types/src/blueprints/websearch/websearch-blueprint.d.ts.map +1 -1
  41. package/dist/types/src/crud/graph.d.ts +14 -11
  42. package/dist/types/src/crud/graph.d.ts.map +1 -1
  43. package/dist/types/src/functions/agent/prompt.d.ts +71 -4
  44. package/dist/types/src/functions/agent/prompt.d.ts.map +1 -1
  45. package/dist/types/src/functions/document/read.d.ts.map +1 -1
  46. package/dist/types/src/functions/document/update.d.ts.map +1 -1
  47. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts +100 -99
  48. package/dist/types/src/functions/entity-extraction/entity-extraction.d.ts.map +1 -1
  49. package/dist/types/src/functions/entity-extraction/index.d.ts +100 -99
  50. package/dist/types/src/functions/entity-extraction/index.d.ts.map +1 -1
  51. package/dist/types/src/functions/exa/data/exa-search-1748337321991.d.ts.map +1 -0
  52. package/dist/types/src/functions/exa/data/exa-search-1748337331526.d.ts.map +1 -0
  53. package/dist/types/src/functions/exa/data/exa-search-1748337344119.d.ts.map +1 -0
  54. package/dist/types/src/functions/exa/data/index.d.ts.map +1 -0
  55. package/dist/types/src/functions/github/fetch-prs.d.ts.map +1 -1
  56. package/dist/types/src/functions/linear/index.d.ts +1 -1
  57. package/dist/types/src/functions/linear/sync-issues.d.ts +1 -1
  58. package/dist/types/src/functions/linear/sync-issues.d.ts.map +1 -1
  59. package/dist/types/src/functions/research/document-create.d.ts.map +1 -1
  60. package/dist/types/src/functions/research/research-graph.d.ts +9 -8
  61. package/dist/types/src/functions/research/research-graph.d.ts.map +1 -1
  62. package/dist/types/src/functions/research/research.d.ts.map +1 -1
  63. package/dist/types/src/functions/research/types.d.ts +1 -1
  64. package/dist/types/src/functions/research/types.d.ts.map +1 -1
  65. package/dist/types/src/functions/tasks/read.d.ts.map +1 -1
  66. package/dist/types/src/functions/tasks/update.d.ts.map +1 -1
  67. package/dist/types/src/index.d.ts +0 -1
  68. package/dist/types/src/index.d.ts.map +1 -1
  69. package/dist/types/src/initiative/Initiative.d.ts +84 -0
  70. package/dist/types/src/initiative/Initiative.d.ts.map +1 -0
  71. package/dist/types/src/initiative/InitiativeSchema.d.ts +19 -0
  72. package/dist/types/src/initiative/InitiativeSchema.d.ts.map +1 -0
  73. package/dist/types/src/initiative/functions/agent.d.ts +37 -0
  74. package/dist/types/src/initiative/functions/agent.d.ts.map +1 -0
  75. package/dist/types/src/initiative/functions/getContext.d.ts +17 -0
  76. package/dist/types/src/initiative/functions/getContext.d.ts.map +1 -0
  77. package/dist/types/src/initiative/functions/index.d.ts +4 -0
  78. package/dist/types/src/initiative/functions/index.d.ts.map +1 -0
  79. package/dist/types/src/initiative/functions/update.d.ts +7 -0
  80. package/dist/types/src/initiative/functions/update.d.ts.map +1 -0
  81. package/dist/types/src/initiative/index.d.ts +1 -0
  82. package/dist/types/src/initiative/index.d.ts.map +1 -0
  83. package/dist/types/src/initiative/initiative.test.d.ts +2 -0
  84. package/dist/types/src/initiative/initiative.test.d.ts.map +1 -0
  85. package/dist/types/src/sync/sync.d.ts +3 -3
  86. package/dist/types/src/sync/sync.d.ts.map +1 -1
  87. package/dist/types/src/testing/index.d.ts +1 -1
  88. package/dist/types/src/testing/index.d.ts.map +1 -1
  89. package/dist/types/src/testing/plugins.d.ts +19 -0
  90. package/dist/types/src/testing/plugins.d.ts.map +1 -0
  91. package/dist/types/src/toolkits/AssistantToolkit.d.ts +31 -5
  92. package/dist/types/src/toolkits/AssistantToolkit.d.ts.map +1 -1
  93. package/dist/types/src/toolkits/SystemToolkit.d.ts +42 -10
  94. package/dist/types/src/toolkits/SystemToolkit.d.ts.map +1 -1
  95. package/dist/types/tsconfig.tsbuildinfo +1 -1
  96. package/package.json +49 -35
  97. package/src/blueprints/design/design-blueprint.test.ts +10 -8
  98. package/src/blueprints/design/design-blueprint.ts +2 -4
  99. package/src/blueprints/design/index.ts +1 -1
  100. package/src/blueprints/discord/discord-blueprint.ts +2 -4
  101. package/src/blueprints/discord/index.ts +1 -1
  102. package/src/blueprints/linear/index.ts +1 -1
  103. package/src/blueprints/linear/linear-blueprint.ts +2 -4
  104. package/src/blueprints/planning/index.ts +1 -1
  105. package/src/blueprints/planning/planning-blueprint.test.ts +8 -6
  106. package/src/blueprints/planning/planning-blueprint.ts +2 -4
  107. package/src/blueprints/research/index.ts +1 -1
  108. package/src/blueprints/research/research-blueprint.ts +2 -4
  109. package/src/blueprints/testing.ts +2 -2
  110. package/src/blueprints/websearch/index.ts +2 -1
  111. package/src/blueprints/websearch/websearch-blueprint.ts +2 -4
  112. package/src/crud/graph.test.ts +4 -27
  113. package/src/crud/graph.ts +32 -40
  114. package/src/experimental/feed.test.ts +1 -1
  115. package/src/functions/agent/prompt.ts +17 -13
  116. package/src/functions/discord/fetch-messages.test.ts +1 -1
  117. package/src/functions/discord/fetch-messages.ts +1 -1
  118. package/src/functions/document/read.ts +4 -3
  119. package/src/functions/document/update.ts +7 -4
  120. package/src/functions/entity-extraction/entity-extraction.conversations.json +6597 -1
  121. package/src/functions/entity-extraction/entity-extraction.test.ts +7 -6
  122. package/src/functions/entity-extraction/entity-extraction.ts +46 -28
  123. package/src/functions/exa/mock.ts +1 -1
  124. package/src/functions/github/fetch-prs.ts +3 -2
  125. package/src/functions/linear/linear.test.ts +11 -10
  126. package/src/functions/linear/sync-issues.ts +7 -5
  127. package/src/functions/research/document-create.ts +7 -6
  128. package/src/functions/research/research-graph.ts +13 -11
  129. package/src/functions/research/research.conversations.json +1 -1
  130. package/src/functions/research/research.test.ts +24 -32
  131. package/src/functions/research/research.ts +8 -9
  132. package/src/functions/research/types.ts +1 -1
  133. package/src/functions/tasks/read.ts +4 -3
  134. package/src/functions/tasks/update.ts +4 -3
  135. package/src/index.ts +0 -1
  136. package/src/initiative/Initiative.ts +99 -0
  137. package/src/initiative/InitiativeSchema.ts +37 -0
  138. package/src/initiative/functions/agent.ts +57 -0
  139. package/src/initiative/functions/getContext.ts +74 -0
  140. package/src/initiative/functions/index.ts +7 -0
  141. package/src/initiative/functions/update.ts +63 -0
  142. package/src/initiative/index.ts +3 -0
  143. package/src/initiative/initiative.conversations.json +1 -0
  144. package/src/initiative/initiative.test.ts +485 -0
  145. package/src/sync/sync.ts +38 -30
  146. package/src/testing/index.ts +1 -1
  147. package/src/{plugins.tsx → testing/plugins.tsx} +15 -15
  148. package/src/toolkits/AssistantToolkit.conversations.json +1 -1
  149. package/src/toolkits/AssistantToolkit.test.ts +17 -11
  150. package/src/toolkits/AssistantToolkit.ts +31 -8
  151. package/src/toolkits/SystemToolkit.ts +100 -32
  152. package/dist/types/src/plugins.d.ts +0 -19
  153. package/dist/types/src/plugins.d.ts.map +0 -1
  154. package/dist/types/src/testing/data/exa-search-1748337321991.d.ts.map +0 -1
  155. package/dist/types/src/testing/data/exa-search-1748337331526.d.ts.map +0 -1
  156. package/dist/types/src/testing/data/exa-search-1748337344119.d.ts.map +0 -1
  157. package/dist/types/src/testing/data/index.d.ts.map +0 -1
  158. /package/dist/types/src/{testing → functions/exa}/data/exa-search-1748337321991.d.ts +0 -0
  159. /package/dist/types/src/{testing → functions/exa}/data/exa-search-1748337331526.d.ts +0 -0
  160. /package/dist/types/src/{testing → functions/exa}/data/exa-search-1748337344119.d.ts +0 -0
  161. /package/dist/types/src/{testing → functions/exa}/data/index.d.ts +0 -0
  162. /package/src/{testing → functions/exa}/data/exa-search-1748337321991.ts +0 -0
  163. /package/src/{testing → functions/exa}/data/exa-search-1748337331526.ts +0 -0
  164. /package/src/{testing → functions/exa}/data/exa-search-1748337344119.ts +0 -0
  165. /package/src/{testing → functions/exa}/data/index.ts +0 -0
@@ -6,13 +6,14 @@ import { describe, expect, it } from '@effect/vitest';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import * as Layer from 'effect/Layer';
8
8
 
9
- import { AiService, MemoizedAiService } from '@dxos/ai';
10
- import { TestAiService } from '@dxos/ai/testing';
9
+ import { AiService } from '@dxos/ai';
10
+ import { MemoizedAiService, TestAiService } from '@dxos/ai/testing';
11
11
  import { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';
12
12
  import { Blueprint } from '@dxos/blueprints';
13
13
  import { Obj } from '@dxos/echo';
14
- import { TestHelpers } from '@dxos/effect';
15
- import { CredentialsService, DatabaseService, FunctionInvocationService, TracingService } from '@dxos/functions';
14
+ import { Database } from '@dxos/echo';
15
+ import { TestHelpers } from '@dxos/effect/testing';
16
+ import { CredentialsService, FunctionInvocationService, TracingService } from '@dxos/functions';
16
17
  import { FunctionInvocationServiceLayerTest, TestDatabaseLayer } from '@dxos/functions-runtime/testing';
17
18
  import { ObjectId } from '@dxos/keys';
18
19
  import { Message, Organization, Person } from '@dxos/types';
@@ -49,7 +50,7 @@ describe('Entity extraction', () => {
49
50
  'call a function to generate a research report',
50
51
  Effect.fnUntraced(
51
52
  function* (_) {
52
- const email = yield* DatabaseService.add(
53
+ const email = yield* Database.Service.add(
53
54
  Obj.make(Message.Message, {
54
55
  [Obj.Meta]: {
55
56
  tags: ['important'],
@@ -75,7 +76,7 @@ describe('Entity extraction', () => {
75
76
  ],
76
77
  }),
77
78
  );
78
- yield* DatabaseService.flush({ indexes: true });
79
+ yield* Database.Service.flush({ indexes: true });
79
80
  const result = yield* FunctionInvocationService.invokeFunction(entityExtraction, {
80
81
  source: email,
81
82
  });
@@ -10,12 +10,13 @@ import * as Schema from 'effect/Schema';
10
10
 
11
11
  import { AiService } from '@dxos/ai';
12
12
  import { AiSession, makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';
13
- import { Filter, Obj, Ref } from '@dxos/echo';
14
- import { DatabaseService, defineFunction } from '@dxos/functions';
13
+ import { Filter, Obj, Ref, Type } from '@dxos/echo';
14
+ import { Database } from '@dxos/echo';
15
+ import { defineFunction } from '@dxos/functions';
15
16
  import { FunctionInvocationServiceLayerTest } from '@dxos/functions-runtime/testing';
16
17
  import { type DXN } from '@dxos/keys';
17
18
  import { log } from '@dxos/log';
18
- import { LegacyOrganization, Message, Organization, Person } from '@dxos/types';
19
+ import { type Actor, LegacyOrganization, Message, Organization, Person } from '@dxos/types';
19
20
  import { trim } from '@dxos/util';
20
21
 
21
22
  import { makeGraphWriterHandler, makeGraphWriterToolkit } from '../../crud';
@@ -26,26 +27,33 @@ export default defineFunction({
26
27
  name: 'Entity Extraction',
27
28
  description: 'Extracts entities from emails and transcripts.',
28
29
  inputSchema: Schema.Struct({
29
- source: Message.Message.annotations({ description: 'Email or transcript to extract entities from.' }),
30
+ source: Message.Message.annotations({
31
+ description: 'Email or transcript to extract entities from.',
32
+ }),
30
33
 
31
34
  // TODO(dmaretskyi): Consider making this an array of blueprints instead.
32
- instructions: Schema.optional(Schema.String).annotations({ description: 'Instructions extraction process.' }),
35
+ instructions: Schema.optional(Schema.String).annotations({
36
+ description: 'Instructions extraction process.',
37
+ }),
33
38
  }),
34
39
  outputSchema: Schema.Struct({
35
40
  entities: Schema.optional(
36
- Schema.Array(Obj.Any).annotations({
41
+ Schema.Array(Type.Obj).annotations({
37
42
  description: 'Extracted entities.',
38
43
  }),
39
44
  ),
40
45
  }),
41
46
  handler: Effect.fnUntraced(
42
- function* ({ data: { source, instructions } }) {
43
- const contact = yield* extractContact(source);
47
+ function* ({ data: { source: message, instructions } }) {
48
+ const tags = Obj.getMeta(message)?.tags;
49
+ const contact = yield* extractContact(message.sender, tags);
44
50
  let organization: Organization.Organization | null = null;
45
51
 
46
52
  if (contact && !contact.organization) {
47
53
  const created: DXN[] = [];
48
- const GraphWriterToolkit = makeGraphWriterToolkit({ schema: [LegacyOrganization] }).pipe();
54
+ const GraphWriterToolkit = makeGraphWriterToolkit({
55
+ schema: [LegacyOrganization],
56
+ }).pipe();
49
57
  const GraphWriterHandler = makeGraphWriterHandler(GraphWriterToolkit, {
50
58
  onAppend: (dxns) => created.push(...dxns),
51
59
  });
@@ -59,17 +67,22 @@ export default defineFunction({
59
67
  The extracted organization URL must match the sender's email domain.
60
68
  ${instructions ? '<user_intructions>' + instructions + '</user_intructions>' : ''},
61
69
  `,
62
- prompt: JSON.stringify({ source, contact }),
70
+ prompt: JSON.stringify({ source: message, contact }),
63
71
  toolkit,
64
72
  });
65
73
 
66
74
  if (created.length > 1) {
67
75
  throw new Error('Multiple organizations created');
68
76
  } else if (created.length === 1) {
69
- organization = yield* DatabaseService.resolve(created[0], Organization.Organization);
70
- Obj.getMeta(organization).tags ??= [];
71
- Obj.getMeta(organization).tags!.push(...(Obj.getMeta(source)?.tags ?? []));
72
- contact.organization = Ref.make(organization);
77
+ organization = yield* Database.Service.resolve(created[0], Organization.Organization);
78
+ Obj.change(organization, (org) => {
79
+ const meta = Obj.getMeta(org);
80
+ meta.tags ??= [];
81
+ meta.tags.push(...(tags ?? []));
82
+ });
83
+ Obj.change(contact, (c) => {
84
+ c.organization = Ref.make(organization!);
85
+ });
73
86
  }
74
87
  }
75
88
 
@@ -92,20 +105,20 @@ export default defineFunction({
92
105
  ),
93
106
  });
94
107
 
95
- const extractContact = Effect.fn('extractContact')(function* (message: Message.Message) {
96
- const name = message.sender.name;
97
- const email = message.sender.email;
108
+ const extractContact = Effect.fn('extractContact')(function* (actor: Actor.Actor, tags?: readonly string[]) {
109
+ const name = actor.name;
110
+ const email = actor.email;
98
111
  if (!email) {
99
- log.warn('email is required for contact extraction', { sender: message.sender });
112
+ log.warn('email is required for contact extraction', { actor });
100
113
  return undefined;
101
114
  }
102
115
 
103
- const { objects: existingContacts } = yield* DatabaseService.runQuery(Filter.type(Person.Person));
116
+ const existingContacts = yield* Database.Service.runQuery(Filter.type(Person.Person));
104
117
 
105
118
  // Check for existing contact
106
119
  // TODO(dmaretskyi): Query filter DSL - https://linear.app/dxos/issue/DX-541/filtercontains-should-work-with-partial-objects
107
120
  const existingContact = existingContacts.find((contact) =>
108
- contact.emails?.some((contactEmail: any) => contactEmail.value === email),
121
+ contact.emails?.some((contactEmail) => contactEmail.value === email),
109
122
  );
110
123
 
111
124
  if (existingContact) {
@@ -114,15 +127,15 @@ const extractContact = Effect.fn('extractContact')(function* (message: Message.M
114
127
  }
115
128
 
116
129
  const newContact = Obj.make(Person.Person, {
117
- [Obj.Meta]: {
118
- tags: Obj.getMeta(message)?.tags,
119
- },
130
+ ...(tags ? { [Obj.Meta]: { tags: [...tags] } } : {}),
120
131
  emails: [{ value: email }],
121
132
  });
122
- yield* DatabaseService.add(newContact);
133
+ yield* Database.Service.add(newContact);
123
134
 
124
135
  if (name) {
125
- newContact.fullName = name;
136
+ Obj.change(newContact, (c) => {
137
+ c.fullName = name;
138
+ });
126
139
  }
127
140
 
128
141
  const emailDomain = email.split('@')[1]?.toLowerCase();
@@ -133,7 +146,7 @@ const extractContact = Effect.fn('extractContact')(function* (message: Message.M
133
146
 
134
147
  log.info('extracted email domain', { emailDomain });
135
148
 
136
- const { objects: existingOrganisations } = yield* DatabaseService.runQuery(Filter.type(Organization.Organization));
149
+ const existingOrganisations = yield* Database.Service.runQuery(Filter.type(Organization.Organization));
137
150
  const matchingOrg = existingOrganisations.find((org) => {
138
151
  if (org.website) {
139
152
  try {
@@ -149,7 +162,10 @@ const extractContact = Effect.fn('extractContact')(function* (message: Message.M
149
162
  emailDomain.endsWith(`.${websiteDomain}`)
150
163
  );
151
164
  } catch (e) {
152
- log.warn('Error parsing website URL', { website: org.website, error: e });
165
+ log.warn('Error parsing website URL', {
166
+ website: org.website,
167
+ error: e,
168
+ });
153
169
  return false;
154
170
  }
155
171
  }
@@ -158,7 +174,9 @@ const extractContact = Effect.fn('extractContact')(function* (message: Message.M
158
174
 
159
175
  if (matchingOrg) {
160
176
  log.info('found matching organization', { organization: matchingOrg });
161
- newContact.organization = Ref.make(matchingOrg);
177
+ Obj.change(newContact, (c) => {
178
+ c.organization = Ref.make(matchingOrg);
179
+ });
162
180
  }
163
181
 
164
182
  return newContact;
@@ -7,7 +7,7 @@ import * as Schema from 'effect/Schema';
7
7
 
8
8
  import { defineFunction } from '@dxos/functions';
9
9
 
10
- import { SEARCH_RESULTS } from '../../testing';
10
+ import { SEARCH_RESULTS } from './data';
11
11
 
12
12
  export default defineFunction({
13
13
  key: 'dxos.org/function/exa-mock',
@@ -6,7 +6,7 @@ import * as HttpClient from '@effect/platform/HttpClient';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import * as Schema from 'effect/Schema';
8
8
 
9
- import { defineFunction, withAuthorization } from '@dxos/functions';
9
+ import { CredentialsService, defineFunction, withAuthorization } from '@dxos/functions';
10
10
 
11
11
  export default defineFunction({
12
12
  key: 'dxos.org/function/github/fetch-prs',
@@ -21,7 +21,8 @@ export default defineFunction({
21
21
  }),
22
22
  }),
23
23
  handler: Effect.fnUntraced(function* ({ data }) {
24
- const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization({ service: 'github.com' })));
24
+ const credential = yield* CredentialsService.getCredential({ service: 'github.com' });
25
+ const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization(credential.apiKey!)));
25
26
 
26
27
  const response = yield* client.get(`https://api.github.com/repos/${data.owner}/${data.repo}/pulls`);
27
28
  const json: any = yield* response.json;
@@ -13,8 +13,9 @@ import { AiService } from '@dxos/ai';
13
13
  import { AiServiceTestingPreset } from '@dxos/ai/testing';
14
14
  import { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';
15
15
  import { Obj, Query } from '@dxos/echo';
16
- import { TestHelpers } from '@dxos/effect';
17
- import { CredentialsService, DatabaseService, FunctionInvocationService } from '@dxos/functions';
16
+ import { Database } from '@dxos/echo';
17
+ import { TestHelpers } from '@dxos/effect/testing';
18
+ import { CredentialsService, FunctionInvocationService } from '@dxos/functions';
18
19
  import { TracingServiceExt } from '@dxos/functions-runtime';
19
20
  import {
20
21
  FunctionInvocationServiceLayerTestMocked,
@@ -39,9 +40,9 @@ const TestLayer = Layer.mergeAll(
39
40
  storagePath: testStoragePath({ name: 'feed-test-13' }),
40
41
  }),
41
42
  CredentialsService.layerConfig([{ service: 'linear.app', apiKey: Config.redacted('LINEAR_API_KEY') }]),
42
- FunctionInvocationServiceLayerTestMocked({ functions: [fetchLinearIssues] }).pipe(
43
- Layer.provideMerge(TracingServiceExt.layerLogInfo()),
44
- ),
43
+ FunctionInvocationServiceLayerTestMocked({
44
+ functions: [fetchLinearIssues],
45
+ }).pipe(Layer.provideMerge(TracingServiceExt.layerLogInfo())),
45
46
  FetchHttpClient.layer,
46
47
  ),
47
48
  ),
@@ -52,29 +53,29 @@ describe('Linear', { timeout: 600_000 }, () => {
52
53
  'sync',
53
54
  Effect.fnUntraced(
54
55
  function* (_) {
55
- yield* DatabaseService.flush({ indexes: true });
56
+ yield* Database.Service.flush({ indexes: true });
56
57
 
57
58
  yield* FunctionInvocationService.invokeFunction(fetchLinearIssues, {
58
59
  team: '1127c63a-6f77-4725-9229-50f6cd47321c',
59
60
  });
60
61
 
61
- const { objects: persons } = yield* DatabaseService.runQuery(Query.type(Person.Person));
62
+ const persons = yield* Database.Service.runQuery(Query.type(Person.Person));
62
63
  console.log('people', {
63
64
  count: persons.length,
64
65
  people: persons.map((_) => `(${_.id}) ${Obj.getLabel(_)} [${Obj.getKeys(_, LINEAR_ID_KEY)[0]?.id}]`),
65
66
  });
66
- const { objects: projects } = yield* DatabaseService.runQuery(Query.type(Project.Project));
67
+ const projects = yield* Database.Service.runQuery(Query.type(Project.Project));
67
68
  console.log('projects', {
68
69
  count: projects.length,
69
70
  projects: projects.map((_) => `(${_.id}) ${Obj.getLabel(_)} [${Obj.getKeys(_, LINEAR_ID_KEY)[0]?.id}]`),
70
71
  });
71
- const { objects: tasks } = yield* DatabaseService.runQuery(Query.type(Task.Task));
72
+ const tasks = yield* Database.Service.runQuery(Query.type(Task.Task));
72
73
  console.log('tasks', {
73
74
  count: tasks.length,
74
75
  tasks: tasks.map((_) => `(${_.id}) ${Obj.getLabel(_)} [${Obj.getKeys(_, LINEAR_ID_KEY)[0]?.id}]`),
75
76
  });
76
77
 
77
- yield* DatabaseService.flush({ indexes: true });
78
+ yield* Database.Service.flush({ indexes: true });
78
79
  },
79
80
  Effect.provide(TestLayer),
80
81
  TestHelpers.taggedTest('sync'),
@@ -10,7 +10,8 @@ import * as Function from 'effect/Function';
10
10
  import * as Schema from 'effect/Schema';
11
11
 
12
12
  import { Filter, Obj, Query, Ref, type Type } from '@dxos/echo';
13
- import { DatabaseService, defineFunction, withAuthorization } from '@dxos/functions';
13
+ import { Database } from '@dxos/echo';
14
+ import { CredentialsService, defineFunction, withAuthorization } from '@dxos/functions';
14
15
  import { log } from '@dxos/log';
15
16
  import { Person, Project, Task } from '@dxos/types';
16
17
 
@@ -35,7 +36,7 @@ query Issues($teamId: String!, $after: DateTimeOrDuration!) {
35
36
  updatedAt
36
37
  description
37
38
  assignee { id, name }
38
- state {
39
+ state {
39
40
  name
40
41
  }
41
42
  project {
@@ -84,7 +85,8 @@ export default defineFunction({
84
85
  }),
85
86
  }),
86
87
  handler: Effect.fnUntraced(function* ({ data }) {
87
- const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization({ service: 'linear.app' })));
88
+ const credential = yield* CredentialsService.getCredential({ service: 'linear.app' });
89
+ const client = yield* HttpClient.HttpClient.pipe(Effect.map(withAuthorization(credential.apiKey!)));
88
90
 
89
91
  // Get the timestamp that was previosly synced.
90
92
  const after = yield* getLatestUpdateTimestamp(data.team, Task.Task);
@@ -114,8 +116,8 @@ export default defineFunction({
114
116
  const getLatestUpdateTimestamp: (
115
117
  teamId: string,
116
118
  dataType: Type.Obj.Any,
117
- ) => Effect.Effect<string, never, DatabaseService> = Effect.fnUntraced(function* (teamId, dataType) {
118
- const { objects: existingTasks } = yield* DatabaseService.runQuery(
119
+ ) => Effect.Effect<string, never, Database.Service> = Effect.fnUntraced(function* (teamId, dataType) {
120
+ const existingTasks = yield* Database.Service.runQuery(
119
121
  Query.type(dataType).select(Filter.foreignKeys(dataType, [{ source: LINEAR_TEAM_ID_KEY, id: teamId }])),
120
122
  );
121
123
  return Function.pipe(
@@ -7,7 +7,8 @@ import * as Schema from 'effect/Schema';
7
7
 
8
8
  import { ArtifactId } from '@dxos/assistant';
9
9
  import { Obj, Relation } from '@dxos/echo';
10
- import { DatabaseService, TracingService, defineFunction } from '@dxos/functions';
10
+ import { Database } from '@dxos/echo';
11
+ import { TracingService, defineFunction } from '@dxos/functions';
11
12
  import { log } from '@dxos/log';
12
13
  import { Markdown } from '@dxos/plugin-markdown/types';
13
14
  import { HasSubject } from '@dxos/types';
@@ -42,14 +43,14 @@ export default defineFunction({
42
43
  log.info('Creating research document', { subject, name, content });
43
44
 
44
45
  // TODO(burdon): Auto flush before and after calling function?
45
- yield* DatabaseService.flush({ indexes: true });
46
+ yield* Database.Service.flush({ indexes: true });
46
47
  yield* TracingService.emitStatus({ message: 'Creating research document...' });
47
48
 
48
49
  // TODO(burdon): Type check.
49
- const target = (yield* DatabaseService.resolve(ArtifactId.toDXN(subject))) as Obj.Any;
50
+ const target = (yield* Database.Service.resolve(ArtifactId.toDXN(subject))) as Obj.Unknown;
50
51
 
51
52
  // Create document.
52
- const object = yield* DatabaseService.add(
53
+ const object = yield* Database.Service.add(
53
54
  Markdown.make({
54
55
  name,
55
56
  content,
@@ -57,7 +58,7 @@ export default defineFunction({
57
58
  );
58
59
 
59
60
  // Create relation.
60
- yield* DatabaseService.add(
61
+ yield* Database.Service.add(
61
62
  Relation.make(HasSubject.HasSubject, {
62
63
  [Relation.Source]: object,
63
64
  [Relation.Target]: target,
@@ -65,7 +66,7 @@ export default defineFunction({
65
66
  }),
66
67
  );
67
68
 
68
- yield* DatabaseService.flush({ indexes: true });
69
+ yield* Database.Service.flush({ indexes: true });
69
70
  log.info('Created research document', { subject, object });
70
71
 
71
72
  return {
@@ -7,8 +7,10 @@ import * as Layer from 'effect/Layer';
7
7
  import * as Schema from 'effect/Schema';
8
8
 
9
9
  import { Obj, Query, Ref, Type } from '@dxos/echo';
10
+ import { Database } from '@dxos/echo';
11
+ import { SystemTypeAnnotation } from '@dxos/echo/internal';
10
12
  import { Queue } from '@dxos/echo-db';
11
- import { ContextQueueService, DatabaseService, QueueService } from '@dxos/functions';
13
+ import { ContextQueueService, QueueService } from '@dxos/functions';
12
14
 
13
15
  /**
14
16
  * Container for a set of ephemeral research results.
@@ -16,32 +18,32 @@ import { ContextQueueService, DatabaseService, QueueService } from '@dxos/functi
16
18
  export const ResearchGraph = Schema.Struct({
17
19
  queue: Type.Ref(Queue),
18
20
  }).pipe(
19
- Type.Obj({
21
+ Type.object({
20
22
  typename: 'dxos.org/type/ResearchGraph',
21
23
  version: '0.1.0',
22
24
  }),
25
+ SystemTypeAnnotation.set(true),
23
26
  );
24
27
 
25
28
  export interface ResearchGraph extends Schema.Schema.Type<typeof ResearchGraph> {}
26
29
 
27
- export const queryResearchGraph: () => Effect.Effect<ResearchGraph | undefined, never, DatabaseService> = Effect.fn(
30
+ export const queryResearchGraph: () => Effect.Effect<ResearchGraph | undefined, never, Database.Service> = Effect.fn(
28
31
  'queryResearchGraph',
29
32
  )(function* () {
30
- const { objects } = yield* DatabaseService.runQuery(Query.type(ResearchGraph));
33
+ const objects = yield* Database.Service.runQuery(Query.type(ResearchGraph));
31
34
  return objects.at(0);
32
35
  });
33
36
 
34
- export const createResearchGraph: () => Effect.Effect<ResearchGraph, never, DatabaseService | QueueService> = Effect.fn(
35
- 'createResearchGraph',
36
- )(function* () {
37
- const queue = yield* QueueService.createQueue();
38
- return yield* DatabaseService.add(Obj.make(ResearchGraph, { queue: Ref.fromDXN(queue.dxn) }));
39
- });
37
+ export const createResearchGraph: () => Effect.Effect<ResearchGraph, never, Database.Service | QueueService> =
38
+ Effect.fn('createResearchGraph')(function* () {
39
+ const queue = yield* QueueService.createQueue();
40
+ return yield* Database.Service.add(Obj.make(ResearchGraph, { queue: Ref.fromDXN(queue.dxn) }));
41
+ });
40
42
 
41
43
  export const contextQueueLayerFromResearchGraph = Layer.unwrapEffect(
42
44
  Effect.gen(function* () {
43
45
  const researchGraph = (yield* queryResearchGraph()) ?? (yield* createResearchGraph());
44
- const researchQueue = yield* DatabaseService.load(researchGraph.queue);
46
+ const researchQueue = yield* Database.Service.load(researchGraph.queue);
45
47
  return ContextQueueService.layer(researchQueue);
46
48
  }),
47
49
  );