@dxos/assistant 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6

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 (121) hide show
  1. package/README.md +1 -0
  2. package/dist/lib/neutral/chunk-KVYJFFLF.mjs +1805 -0
  3. package/dist/lib/neutral/chunk-KVYJFFLF.mjs.map +7 -0
  4. package/dist/lib/{browser → neutral}/extraction/index.mjs +26 -32
  5. package/dist/lib/neutral/extraction/index.mjs.map +7 -0
  6. package/dist/lib/{browser → neutral}/index.mjs +72 -371
  7. package/dist/lib/neutral/index.mjs.map +7 -0
  8. package/dist/lib/neutral/meta.json +1 -0
  9. package/dist/lib/neutral/testing/index.mjs +112 -0
  10. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  11. package/dist/types/src/conversation/context.d.ts +24 -5
  12. package/dist/types/src/conversation/context.d.ts.map +1 -1
  13. package/dist/types/src/conversation/conversation.d.ts +29 -4
  14. package/dist/types/src/conversation/conversation.d.ts.map +1 -1
  15. package/dist/types/src/diff.d.ts +3 -1
  16. package/dist/types/src/diff.d.ts.map +1 -1
  17. package/dist/types/src/extraction/extraction-ner-function/index.d.ts +0 -1
  18. package/dist/types/src/extraction/extraction-ner-function/index.d.ts.map +1 -1
  19. package/dist/types/src/extraction/extraction.d.ts +729 -17
  20. package/dist/types/src/extraction/extraction.d.ts.map +1 -1
  21. package/dist/types/src/extraction/index.d.ts +0 -1
  22. package/dist/types/src/extraction/index.d.ts.map +1 -1
  23. package/dist/types/src/functions/services.d.ts +27 -8
  24. package/dist/types/src/functions/services.d.ts.map +1 -1
  25. package/dist/types/src/index.d.ts +2 -0
  26. package/dist/types/src/index.d.ts.map +1 -1
  27. package/dist/types/src/service/AgentService.d.ts +62 -0
  28. package/dist/types/src/service/AgentService.d.ts.map +1 -0
  29. package/dist/types/src/service/AgentService.test.d.ts +2 -0
  30. package/dist/types/src/service/AgentService.test.d.ts.map +1 -0
  31. package/dist/types/src/service/agent-process.d.ts +17 -0
  32. package/dist/types/src/service/agent-process.d.ts.map +1 -0
  33. package/dist/types/src/service/index.d.ts +3 -0
  34. package/dist/types/src/service/index.d.ts.map +1 -0
  35. package/dist/types/src/session/index.d.ts +1 -1
  36. package/dist/types/src/session/index.d.ts.map +1 -1
  37. package/dist/types/src/session/observer.d.ts.map +1 -1
  38. package/dist/types/src/session/session.d.ts +64 -8
  39. package/dist/types/src/session/session.d.ts.map +1 -1
  40. package/dist/types/src/session/toolkit.d.ts +6 -2
  41. package/dist/types/src/session/toolkit.d.ts.map +1 -1
  42. package/dist/types/src/templates/system.d.ts +0 -1
  43. package/dist/types/src/templates/system.d.ts.map +1 -1
  44. package/dist/types/src/testing/layer.d.ts +23 -9
  45. package/dist/types/src/testing/layer.d.ts.map +1 -1
  46. package/dist/types/src/tracing.d.ts +264 -0
  47. package/dist/types/src/tracing.d.ts.map +1 -0
  48. package/dist/types/src/types/artifact.d.ts +5 -5
  49. package/dist/types/src/types/artifact.d.ts.map +1 -1
  50. package/dist/types/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +33 -33
  52. package/src/conversation/context.test.ts +1 -1
  53. package/src/conversation/context.ts +84 -18
  54. package/src/conversation/conversation.ts +173 -32
  55. package/src/diff.test.ts +36 -5
  56. package/src/diff.ts +13 -4
  57. package/src/execution-graph.test.ts +2 -2
  58. package/src/execution-graph.ts +2 -2
  59. package/src/extraction/extraction-ner-function/index.ts +0 -1
  60. package/src/extraction/extraction.ts +38 -10
  61. package/src/extraction/index.ts +0 -1
  62. package/src/functions/services.ts +199 -50
  63. package/src/functions.conversations.json +1 -1
  64. package/src/functions.test.ts +28 -20
  65. package/src/index.ts +2 -0
  66. package/src/service/AgentService.conversations.json +1 -0
  67. package/src/service/AgentService.test.ts +169 -0
  68. package/src/service/AgentService.ts +171 -0
  69. package/src/service/agent-process.ts +360 -0
  70. package/src/service/index.ts +6 -0
  71. package/src/session/format.test.ts +23 -14
  72. package/src/session/index.ts +1 -2
  73. package/src/session/observer.ts +3 -2
  74. package/src/session/session.conversations.json +1 -1
  75. package/src/session/session.test.ts +52 -4
  76. package/src/session/session.ts +231 -117
  77. package/src/session/toolkit.ts +12 -7
  78. package/src/templates/instructions/format.tpl +0 -4
  79. package/src/templates/instructions/system.tpl +11 -2
  80. package/src/templates/system.ts +6 -5
  81. package/src/testing/layer.ts +209 -24
  82. package/src/tracing.ts +112 -0
  83. package/src/types/artifact.ts +17 -10
  84. package/dist/lib/browser/chunk-7CDDG6LL.mjs +0 -578
  85. package/dist/lib/browser/chunk-7CDDG6LL.mjs.map +0 -7
  86. package/dist/lib/browser/extraction/index.mjs.map +0 -7
  87. package/dist/lib/browser/index.mjs.map +0 -7
  88. package/dist/lib/browser/meta.json +0 -1
  89. package/dist/lib/browser/testing/index.mjs +0 -32
  90. package/dist/lib/browser/testing/index.mjs.map +0 -7
  91. package/dist/lib/node-esm/chunk-CC7ER6Q3.mjs +0 -579
  92. package/dist/lib/node-esm/chunk-CC7ER6Q3.mjs.map +0 -7
  93. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  94. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
  95. package/dist/lib/node-esm/extraction/index.mjs +0 -226
  96. package/dist/lib/node-esm/extraction/index.mjs.map +0 -7
  97. package/dist/lib/node-esm/index.mjs +0 -851
  98. package/dist/lib/node-esm/index.mjs.map +0 -7
  99. package/dist/lib/node-esm/meta.json +0 -1
  100. package/dist/lib/node-esm/testing/index.mjs +0 -33
  101. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  102. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts +0 -4
  103. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.d.ts.map +0 -1
  104. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.test.d.ts +0 -2
  105. package/dist/types/src/extraction/extraction-llm-function/extraction-llm-function.test.d.ts.map +0 -1
  106. package/dist/types/src/extraction/extraction-llm-function/index.d.ts +0 -2
  107. package/dist/types/src/extraction/extraction-llm-function/index.d.ts.map +0 -1
  108. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts +0 -347
  109. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.d.ts.map +0 -1
  110. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.test.d.ts +0 -2
  111. package/dist/types/src/extraction/extraction-ner-function/extraction-ner-function.test.d.ts.map +0 -1
  112. package/dist/types/src/session/GenericToolkit.d.ts +0 -85
  113. package/dist/types/src/session/GenericToolkit.d.ts.map +0 -1
  114. package/src/extraction/extraction-llm-function/extraction-llm-function.test.ts +0 -84
  115. package/src/extraction/extraction-llm-function/extraction-llm-function.ts +0 -62
  116. package/src/extraction/extraction-llm-function/index.ts +0 -5
  117. package/src/extraction/extraction-ner-function/extraction-ner-function.test.ts +0 -116
  118. package/src/extraction/extraction-ner-function/extraction-ner-function.ts +0 -56
  119. package/src/session/GenericToolkit.ts +0 -131
  120. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  121. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
@@ -2,77 +2,262 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
+ import { Registry } from '@effect-atom/atom';
5
6
  import * as Layer from 'effect/Layer';
6
7
  import * as Match from 'effect/Match';
7
8
 
8
- import { AiService, type ModelName } from '@dxos/ai';
9
+ import {
10
+ AiService,
11
+ ConsolePrinter,
12
+ GenericToolkit,
13
+ type ModelName,
14
+ type ToolExecutionService,
15
+ type ToolResolverService,
16
+ } from '@dxos/ai';
9
17
  import { TestAiService } from '@dxos/ai/testing';
10
- import type { Type } from '@dxos/echo';
11
- import { CredentialsService, type FunctionDefinition, type ServiceCredential, TracingService } from '@dxos/functions';
12
- import { TracingServiceExt, TriggerDispatcher, TriggerStateStore } from '@dxos/functions-runtime';
18
+ import { Database, DXN, Feed, Type } from '@dxos/echo';
19
+ import { acquireReleaseResource } from '@dxos/effect';
20
+ import {
21
+ CredentialsService,
22
+ FunctionInvocationService,
23
+ QueueService,
24
+ type ServiceCredential,
25
+ ServiceNotAvailableError,
26
+ Trace,
27
+ TracingService,
28
+ } from '@dxos/functions';
29
+ import {
30
+ Process,
31
+ ProcessManager,
32
+ ServiceResolver,
33
+ TracingServiceExt,
34
+ TriggerDispatcher,
35
+ TriggerStateStore,
36
+ } from '@dxos/functions-runtime';
13
37
  import { FunctionInvocationServiceLayerTest, TestDatabaseLayer } from '@dxos/functions-runtime/testing';
38
+ import { Message } from '@dxos/types';
14
39
 
15
- import { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '../functions';
16
- import { GenericToolkit } from '../session';
40
+ import { Blueprint, Prompt } from '@dxos/blueprints';
41
+ import { Operation, OperationHandlerSet, OperationRegistry } from '@dxos/operation';
42
+ import * as LanguageModel from '@effect/ai/LanguageModel';
43
+ import * as KeyValueStore from '@effect/platform/KeyValueStore';
44
+ import { ToolExecutionServices } from '../functions';
45
+ import { AgentService } from '../service';
46
+
47
+ import type { TestContextService } from '@dxos/effect/testing';
48
+ import * as Context from 'effect/Context';
49
+ import * as Effect from 'effect/Effect';
50
+ import {
51
+ AiContextBinder,
52
+ AiContextService,
53
+ AiConversation,
54
+ AiConversationService,
55
+ type ContextBinding,
56
+ } from '../conversation';
57
+ import * as Array from 'effect/Array';
58
+ import { CompleteBlock } from '../tracing';
17
59
 
18
60
  interface TestLayerOptions {
19
61
  aiServicePreset?: 'direct' | 'edge-local' | 'edge-remote';
20
62
  model?: ModelName;
21
- functions?: FunctionDefinition.Any[];
63
+ operationHandlers?: OperationHandlerSet.OperationHandlerSet | OperationHandlerSet.OperationHandlerSet[];
22
64
  toolkits?: GenericToolkit.GenericToolkit[];
23
- types?: Type.Entity.Any[];
65
+ types?: Type.AnyEntity[];
66
+ blueprints?: Blueprint.Blueprint[];
24
67
  credentials?: ServiceCredential[];
25
68
  /*
26
69
  * Tracing configuration.
27
70
  * @default 'noop'
28
71
  */
29
72
  tracing?: 'noop' | 'console' | 'pretty';
73
+
74
+ disableLlmMemoization?: boolean;
75
+
76
+ /**
77
+ * Core system prompt for the agent.
78
+ */
79
+ systemPrompt?: string;
30
80
  }
31
81
 
82
+ export type AssistantTestServices =
83
+ // Convinience
84
+ | LanguageModel.LanguageModel
85
+ | Feed.Service
86
+ | CredentialsService
87
+ | AgentService.AgentService
88
+ | AiService.AiService
89
+ | Database.Service
90
+ | QueueService
91
+ // Registries
92
+ | Blueprint.RegistryService
93
+ | OperationRegistry.Service
94
+ | GenericToolkit.GenericToolkitProvider
95
+ // Core
96
+ | ProcessManager.ProcessManagerService
97
+ | Process.ProcessMonitorService
98
+ | Registry.AtomRegistry
99
+ // Should those be here?
100
+ | OperationHandlerSet.OperationHandlerProvider
101
+ | KeyValueStore.KeyValueStore
102
+ | ServiceResolver.ServiceResolver
103
+ | TracingService
104
+ | Trace.TraceService
105
+ | Trace.TraceSink
106
+ // Deperacted
107
+ | ToolExecutionService
108
+ | ToolResolverService
109
+ | FunctionInvocationService;
110
+
32
111
  export const AssistantTestLayer = ({
33
112
  aiServicePreset = 'direct',
34
- model = '@anthropic/claude-opus-4-0',
35
- functions = [],
113
+ model = '@anthropic/claude-opus-4-6',
114
+ operationHandlers = [],
36
115
  toolkits = [],
37
116
  types = [],
38
117
  credentials = [],
39
118
  tracing = 'noop',
40
- }: TestLayerOptions) =>
41
- Layer.mergeAll(
42
- AiService.model(model),
43
- makeToolResolverFromFunctions(functions, GenericToolkit.merge(...toolkits).toolkit as any),
44
- makeToolExecutionServiceFromFunctions(
45
- GenericToolkit.merge(...toolkits).toolkit as any,
46
- GenericToolkit.merge(...toolkits).layer as any,
119
+ disableLlmMemoization = false,
120
+ blueprints = [],
121
+ systemPrompt,
122
+ }: TestLayerOptions = {}): Layer.Layer<AssistantTestServices, never, TestContextService> => {
123
+ const toolkit = GenericToolkit.merge(...toolkits);
124
+ const operationHandlersSet = Array.isArray(operationHandlers)
125
+ ? OperationHandlerSet.merge(...operationHandlers)
126
+ : operationHandlers;
127
+ types.push(Blueprint.Blueprint, Prompt.Prompt, Operation.PersistentOperation, Feed.Feed);
128
+ types = Array.dedupeWith(types, (a, b) => Type.getTypename(a) === Type.getTypename(b));
129
+
130
+ return Layer.empty.pipe(
131
+ Layer.provideMerge(Trace.testTraceService({ meta: { processName: 'test' } })),
132
+ Layer.provideMerge(AgentService.layer({ systemPrompt })),
133
+ Layer.provideMerge(ProcessManager.layer({ idGenerator: ProcessManager.SequentialProcessIdGenerator })),
134
+ Layer.provideMerge(
135
+ // TODO(dmaretskyi): Refactor to be able to merge resovler layers, also consider service mesh achitecture.
136
+ Layer.effect(
137
+ ServiceResolver.ServiceResolver,
138
+ Effect.gen(function* () {
139
+ const services = yield* Effect.context<Database.Service | QueueService>().pipe(
140
+ Effect.map(Context.pick(Database.Service, QueueService)),
141
+ Effect.map(Layer.succeedContext),
142
+ );
143
+ // AiContextBinder.
144
+ return ServiceResolver.compose(
145
+ ServiceResolver.succeed(AiContextService, (context) =>
146
+ Effect.gen(function* () {
147
+ if (!context.conversation) {
148
+ return yield* Effect.fail(new ServiceNotAvailableError(AiContextService.key));
149
+ }
150
+ const feed = yield* Database.resolve(DXN.parse(context.conversation), Feed.Feed).pipe(Effect.orDie);
151
+ const queue = yield* QueueService.getQueue(Feed.getQueueDxn(feed)!);
152
+ const binder = yield* acquireReleaseResource(
153
+ () =>
154
+ new AiContextBinder({
155
+ queue,
156
+ }),
157
+ );
158
+ return { binder };
159
+ }).pipe(Effect.provide(services)),
160
+ ),
161
+ // AiConversationService.
162
+ ServiceResolver.succeed(AiConversationService, (context) =>
163
+ Effect.gen(function* () {
164
+ if (!context.conversation) {
165
+ return yield* Effect.fail(new ServiceNotAvailableError(AiContextService.key));
166
+ }
167
+ const feed = yield* Database.resolve(DXN.parse(context.conversation), Feed.Feed).pipe(Effect.orDie);
168
+ const queue = yield* QueueService.getQueue<ContextBinding | Message.Message>(Feed.getQueueDxn(feed)!);
169
+ const conversation = yield* acquireReleaseResource(
170
+ () =>
171
+ new AiConversation({
172
+ queue,
173
+ }),
174
+ );
175
+ return conversation;
176
+ }).pipe(Effect.provide(services)),
177
+ ),
178
+ yield* ServiceResolver.fromRequirements(
179
+ Database.Service,
180
+ GenericToolkit.GenericToolkitProvider,
181
+ QueueService,
182
+ AiService.AiService,
183
+ OperationRegistry.Service,
184
+ Blueprint.RegistryService,
185
+ FunctionInvocationService,
186
+ ),
187
+ );
188
+ }),
189
+ ),
47
190
  ),
48
- ).pipe(
191
+ Layer.provideMerge(Layer.mergeAll(OperationRegistry.layer, AiService.model(model), ToolExecutionServices)),
49
192
  Layer.provideMerge(
50
193
  FunctionInvocationServiceLayerTest({
51
- functions,
194
+ functions: operationHandlersSet,
52
195
  }),
53
196
  ),
54
197
  Layer.provideMerge(
55
198
  Layer.mergeAll(
56
- TestAiService({ preset: aiServicePreset }),
199
+ TestAiService({ preset: aiServicePreset, disableMemoization: disableLlmMemoization }),
57
200
  TestDatabaseLayer({
58
201
  spaceKey: 'fixed',
59
202
  types,
60
203
  }),
61
204
  CredentialsService.configuredLayer(credentials),
205
+ Feed.notAvailable,
62
206
  Match.value(tracing).pipe(
63
207
  Match.when('noop', () => TracingService.layerNoop),
64
208
  Match.when('console', () => TracingServiceExt.layerLogInfo()),
65
- Match.when('pretty', () => TracingServiceExt.layerConsolePrettyPrint()),
209
+ Match.when('pretty', () =>
210
+ TracingServiceExt.layerConsolePrettyPrint({
211
+ toolkit: (toolkits.length > 0 ? GenericToolkit.merge(...toolkits) : GenericToolkit.empty).toolkit as any,
212
+ }),
213
+ ),
214
+ Match.exhaustive,
215
+ ),
216
+ Match.value(tracing).pipe(
217
+ Match.when('noop', () => Trace.layerNoop),
218
+ Match.when('console', () => Trace.layerConsole),
219
+ Match.when('pretty', () => TraceSinkPretty()),
66
220
  Match.exhaustive,
67
221
  ),
68
222
  ),
69
223
  ),
224
+ Layer.provideMerge(Layer.succeed(Blueprint.RegistryService, new Blueprint.Registry(blueprints))),
225
+ Layer.provideMerge(GenericToolkit.providerLayer(toolkit)),
226
+ Layer.provideMerge(OperationHandlerSet.provide(operationHandlersSet)),
227
+ Layer.provideMerge(KeyValueStore.layerMemory),
228
+ Layer.provideMerge(Registry.layer),
229
+ Layer.orDie,
70
230
  );
231
+ };
71
232
 
72
233
  interface TestLayerWithTriggersOptions extends TestLayerOptions {}
73
234
 
74
- export const AssistantTestLayerWithTriggers = (options: TestLayerWithTriggersOptions) =>
235
+ export type AssistantTestServicesWithTriggers = AssistantTestServices | TriggerDispatcher | TriggerStateStore;
236
+
237
+ export const AssistantTestLayerWithTriggers = (
238
+ options: TestLayerWithTriggersOptions,
239
+ ): Layer.Layer<AssistantTestServicesWithTriggers, never, TestContextService> =>
75
240
  Layer.mergeAll(
76
241
  AssistantTestLayer(options),
77
- TriggerDispatcher.layer({ timeControl: 'manual', startingTime: new Date('2025-09-05T15:01:00.000Z') }),
78
- ).pipe(Layer.provideMerge(TriggerStateStore.layerMemory));
242
+ TriggerDispatcher.layer({ timeControl: 'manual', startingTime: new Date('2025-09-05T15:01:00.000Z') }).pipe(
243
+ Layer.provide(Registry.layer),
244
+ ),
245
+ TriggerStateStore.layerMemory,
246
+ ) as any;
247
+
248
+ const TraceSinkPretty = () =>
249
+ Layer.succeed(Trace.TraceSink, {
250
+ write: (message) => {
251
+ for (const event of message.events) {
252
+ if (Trace.isOfType(CompleteBlock, event)) {
253
+ const tag = message.meta.processName ?? `[${message.meta.pid ?? 'unknown'}]`;
254
+ console.log(`[${tag}] ${event.data.role.toUpperCase()}`);
255
+ new ConsolePrinter({ tag }).printContentBlock(event.data.block);
256
+ } else if (Trace.isOfType(Process.SpawnedEvent, event)) {
257
+ console.log(`[${message.meta.pid}] Process spawned: ${message.meta.processName}`);
258
+ } else if (Trace.isOfType(Process.ExitedEvent, event)) {
259
+ console.log(`[${message.meta.pid}] Process exited: ${event.data.outcome}`);
260
+ }
261
+ }
262
+ },
263
+ });
package/src/tracing.ts ADDED
@@ -0,0 +1,112 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { Trace } from '@dxos/functions';
6
+ import { Obj } from '@dxos/echo';
7
+ import { ContentBlock, Actor } from '@dxos/types';
8
+ import * as Schema from 'effect/Schema';
9
+
10
+ /**
11
+ * Partial content block emitted.
12
+ */
13
+ export const PartialBlock = Trace.EventType('assistant.partialBlock', {
14
+ schema: Schema.Struct({
15
+ messageId: Obj.ID,
16
+ role: Actor.Role,
17
+ block: ContentBlock.Any,
18
+ }),
19
+ isEphemeral: true,
20
+ });
21
+
22
+ /**
23
+ * Complete content block emitted.
24
+ */
25
+ export const CompleteBlock = Trace.EventType('assistant.completeBlock', {
26
+ schema: Schema.Struct({
27
+ messageId: Obj.ID,
28
+ role: Actor.Role,
29
+ block: ContentBlock.Any,
30
+ }),
31
+ isEphemeral: false,
32
+ });
33
+
34
+ /**
35
+ * Agent turn started (one LLM generation cycle).
36
+ */
37
+ export const AgentTurnStarted = Trace.EventType('assistant.agentTurnStarted', {
38
+ schema: Schema.Struct({
39
+ /** Number of history messages. */
40
+ historyLength: Schema.Number,
41
+ /** Number of pending messages. */
42
+ pendingLength: Schema.Number,
43
+ /** System prompt length in characters. */
44
+ systemPromptLength: Schema.Number,
45
+ }),
46
+ isEphemeral: false,
47
+ });
48
+
49
+ /**
50
+ * Agent turn completed (LLM response received).
51
+ */
52
+ export const AgentTurnCompleted = Trace.EventType('assistant.agentTurnCompleted', {
53
+ schema: Schema.Struct({
54
+ /** Number of messages produced in this turn. */
55
+ messageCount: Schema.Number,
56
+ /** Whether the agent is done (no more tool calls). */
57
+ done: Schema.Boolean,
58
+ }),
59
+ isEphemeral: false,
60
+ });
61
+
62
+ /**
63
+ * Tool execution started.
64
+ */
65
+ export const ToolCallStarted = Trace.EventType('assistant.toolCallStarted', {
66
+ schema: Schema.Struct({
67
+ /** Tool name. */
68
+ name: Schema.String,
69
+ /** Tool call ID. */
70
+ toolCallId: Schema.String,
71
+ }),
72
+ isEphemeral: false,
73
+ });
74
+
75
+ /**
76
+ * Tool execution completed.
77
+ */
78
+ export const ToolCallCompleted = Trace.EventType('assistant.toolCallCompleted', {
79
+ schema: Schema.Struct({
80
+ /** Tool name. */
81
+ name: Schema.String,
82
+ /** Tool call ID. */
83
+ toolCallId: Schema.String,
84
+ /** Whether the tool call resulted in an error. */
85
+ isError: Schema.Boolean,
86
+ }),
87
+ isEphemeral: false,
88
+ });
89
+
90
+ /**
91
+ * Agent process received input (prompt or tool result).
92
+ */
93
+ export const AgentInputReceived = Trace.EventType('assistant.agentInputReceived', {
94
+ schema: Schema.Struct({
95
+ /** Type of input: 'prompt' or 'tool_result'. */
96
+ inputType: Schema.String,
97
+ /** Length of input content. */
98
+ contentLength: Schema.Number,
99
+ }),
100
+ isEphemeral: false,
101
+ });
102
+
103
+ /**
104
+ * Agent process request completed.
105
+ */
106
+ export const AgentRequestCompleted = Trace.EventType('assistant.agentRequestCompleted', {
107
+ schema: Schema.Struct({
108
+ /** Number of pending items remaining in queue. */
109
+ pendingItems: Schema.Number,
110
+ }),
111
+ isEphemeral: false,
112
+ });
@@ -5,7 +5,7 @@
5
5
  import type * as Effect from 'effect/Effect';
6
6
  import * as Schema from 'effect/Schema';
7
7
 
8
- import { type Err, Type } from '@dxos/echo';
8
+ import { type Err, Obj, Ref, type Type } from '@dxos/echo';
9
9
  import { Database } from '@dxos/echo';
10
10
  import { EncodedReference } from '@dxos/echo-protocol';
11
11
  import { DXN, LOCAL_SPACE_TAG, type ObjectId, type SpaceId } from '@dxos/keys';
@@ -16,16 +16,16 @@ import { trim } from '@dxos/util';
16
16
  */
17
17
  export const createArtifactElement = (id: ObjectId) => `<artifact id=${id} />`;
18
18
 
19
+ // TODO(burdon): Rename RefFromLLM? -- yes -dm
19
20
  /**
20
21
  * A model-friendly way to reference an object.
21
22
  * Supports vairous formats that will be normalized to a DXN.
22
23
  *
23
- * @deprecated Use `RefFromLLM` instead.
24
+ * @deprecated Use `Ref.Ref(XXX)` instead.
24
25
  */
25
- // TODO(burdon): Rename RefFromLLM? -- yes -dm
26
26
  export const ArtifactId: Schema.Schema<string> & {
27
27
  toDXN: (reference: ArtifactId, owningSpaceId?: SpaceId) => DXN;
28
- resolve: <S extends Type.Entity.Any>(
28
+ resolve: <S extends Type.AnyEntity>(
29
29
  schema: S,
30
30
  ref: ArtifactId,
31
31
  ) => Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Database.Service>;
@@ -33,11 +33,16 @@ export const ArtifactId: Schema.Schema<string> & {
33
33
  // TODO(dmaretskyi): This section gets overriden.
34
34
  description: trim`
35
35
  The ID of the referenced object. Formats accepted:
36
- - DXN (dxn:echo:@:XXXXX). DXNs can be prepended with an @ symbol for compatibility with in-text references.
36
+ - DXN (dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4). DXNs can be prepended with an @ symbol for compatibility with in-text references.
37
37
  - space ID, object ID tuple (spaceID:objectID)
38
- - Only object ID that is assumed to be in the current space (XXXXX)
38
+ - Only object ID that is assumed to be in the current space (01KG7R1ZXWFMWQ4DA1Q6TN1DG4)
39
39
  `,
40
- examples: ['dxn:echo:@:XXXXX', '@dxn:echo:@:XXXXX', 'spaceID:objectID', 'XXXXX'],
40
+ examples: [
41
+ 'dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4',
42
+ '@dxn:echo:@:01KG7R1ZXWFMWQ4DA1Q6TN1DG4',
43
+ 'BM3FSHFOMJCHCG5QW7JTVKGYABD2GAA7G:01KG7R1ZXWFMWQ4DA1Q6TN1DG4',
44
+ '01KG7R1ZXWFMWQ4DA1Q6TN1DG4',
45
+ ],
41
46
  }) {
42
47
  static toDXN(reference: ArtifactId, owningSpaceId?: SpaceId): DXN {
43
48
  // Allow @dxn: prefix for compatibility with in-text references.
@@ -61,12 +66,12 @@ export const ArtifactId: Schema.Schema<string> & {
61
66
  /**
62
67
  * Resolves an artifact ID to an object.
63
68
  */
64
- static resolve<S extends Type.Entity.Any>(
69
+ static resolve<S extends Type.AnyEntity>(
65
70
  schema: S,
66
71
  ref: ArtifactId,
67
72
  ): Effect.Effect<Schema.Schema.Type<S>, Err.ObjectNotFoundError, Database.Service> {
68
73
  const dxn = ArtifactId.toDXN(ref);
69
- return Database.Service.resolve(dxn, schema);
74
+ return Database.resolve(dxn, schema);
70
75
  }
71
76
  };
72
77
 
@@ -75,8 +80,10 @@ export type ArtifactId = Schema.Schema.Type<typeof ArtifactId>;
75
80
  /**
76
81
  * Schema that decodes ECHO reference object from an LLM-friendly input.
77
82
  */
78
- export const RefFromLLM = Schema.transform(ArtifactId, Type.Ref(Type.Obj), {
83
+ export const RefFromLLM = Schema.transform(ArtifactId, Ref.Ref(Obj.Unknown), {
79
84
  decode: (fromA, fromI) => EncodedReference.fromDXN(ArtifactId.toDXN(fromA)),
80
85
  encode: (toI, toA) => EncodedReference.toDXN(toI).toString(),
81
86
  strict: false,
87
+ }).annotations({
88
+ description: ArtifactId.ast.annotations.description as string,
82
89
  });