@dxos/assistant 0.8.4-main.9be5663bfe → 0.8.4-main.abd8ff62ef
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.
- package/dist/lib/neutral/extraction/index.mjs +4 -21
- package/dist/lib/neutral/extraction/index.mjs.map +3 -3
- package/dist/lib/neutral/index.mjs +1259 -79
- package/dist/lib/neutral/index.mjs.map +4 -4
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/types/src/conversation/context.d.ts +9 -12
- package/dist/types/src/conversation/context.d.ts.map +1 -1
- package/dist/types/src/conversation/index.d.ts +1 -1
- package/dist/types/src/conversation/index.d.ts.map +1 -1
- package/dist/types/src/conversation/session.d.ts +78 -0
- package/dist/types/src/conversation/session.d.ts.map +1 -0
- package/dist/types/src/diff.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +12 -12
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/execution-graph.d.ts.map +1 -1
- package/dist/types/src/extraction/extraction-ner-function/named-entity-recognition.d.ts.map +1 -1
- package/dist/types/src/extraction/extraction.d.ts +461 -455
- package/dist/types/src/extraction/extraction.d.ts.map +1 -1
- package/dist/types/src/extraction/quotes.d.ts.map +1 -1
- package/dist/types/src/functions/services.d.ts +7 -29
- package/dist/types/src/functions/services.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/session/artifact-diff.d.ts.map +1 -1
- package/dist/types/src/session/error-handling.d.ts.map +1 -1
- package/dist/types/src/session/format.d.ts +6 -3
- package/dist/types/src/session/format.d.ts.map +1 -1
- package/dist/types/src/session/index.d.ts +1 -1
- package/dist/types/src/session/{session.d.ts → request.d.ts} +25 -33
- package/dist/types/src/session/request.d.ts.map +1 -0
- package/dist/types/src/session/toolkit.d.ts +5 -7
- package/dist/types/src/session/toolkit.d.ts.map +1 -1
- package/dist/types/src/templates/system.d.ts +1 -1
- package/dist/types/src/templates/system.d.ts.map +1 -1
- package/dist/types/src/tracing.d.ts +64 -95
- package/dist/types/src/tracing.d.ts.map +1 -1
- package/dist/types/src/types/artifact.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +21 -38
- package/src/conversation/context.ts +1 -1
- package/src/conversation/index.ts +1 -1
- package/src/conversation/session.ts +334 -0
- package/src/execution-graph.ts +15 -5
- package/src/extraction/extraction.ts +1 -1
- package/src/functions/services.ts +12 -127
- package/src/functions.conversations.json +1 -1
- package/src/index.ts +0 -1
- package/src/session/format.ts +14 -9
- package/src/session/index.ts +1 -1
- package/src/session/request.conversations.json +1 -0
- package/src/session/{session.ts → request.ts} +44 -51
- package/src/session/toolkit.ts +18 -15
- package/src/templates/instructions/system.tpl +11 -0
- package/src/templates/system.ts +1 -1
- package/src/tracing.ts +13 -69
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UAWIXKF6.mjs +0 -1875
- package/dist/lib/neutral/chunk-UAWIXKF6.mjs.map +0 -7
- package/dist/lib/neutral/testing/index.mjs +0 -114
- package/dist/lib/neutral/testing/index.mjs.map +0 -7
- package/dist/types/src/conversation/conversation.d.ts +0 -68
- package/dist/types/src/conversation/conversation.d.ts.map +0 -1
- package/dist/types/src/conversation/conversation.test.d.ts +0 -2
- package/dist/types/src/conversation/conversation.test.d.ts.map +0 -1
- package/dist/types/src/functions.test.d.ts +0 -2
- package/dist/types/src/functions.test.d.ts.map +0 -1
- package/dist/types/src/service/AgentService.d.ts +0 -61
- package/dist/types/src/service/AgentService.d.ts.map +0 -1
- package/dist/types/src/service/AgentService.test.d.ts +0 -2
- package/dist/types/src/service/AgentService.test.d.ts.map +0 -1
- package/dist/types/src/service/agent-process.d.ts +0 -17
- package/dist/types/src/service/agent-process.d.ts.map +0 -1
- package/dist/types/src/service/index.d.ts +0 -3
- package/dist/types/src/service/index.d.ts.map +0 -1
- package/dist/types/src/session/format.test.d.ts +0 -2
- package/dist/types/src/session/format.test.d.ts.map +0 -1
- package/dist/types/src/session/session.d.ts.map +0 -1
- package/dist/types/src/session/session.test.d.ts +0 -2
- package/dist/types/src/session/session.test.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -2
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/layer.d.ts +0 -35
- package/dist/types/src/testing/layer.d.ts.map +0 -1
- package/src/conversation/conversation.test.ts +0 -58
- package/src/conversation/conversation.ts +0 -275
- package/src/functions.test.ts +0 -82
- package/src/service/AgentService.conversations.json +0 -1
- package/src/service/AgentService.test.ts +0 -169
- package/src/service/AgentService.ts +0 -165
- package/src/service/agent-process.ts +0 -359
- package/src/service/index.ts +0 -6
- package/src/session/format.test.ts +0 -132
- package/src/session/session.conversations.json +0 -1
- package/src/session/session.test.ts +0 -190
- package/src/testing/index.ts +0 -5
- package/src/testing/layer.ts +0 -259
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"functions.test.d.ts","sourceRoot":"","sources":["../../../src/functions.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import * as Context from 'effect/Context';
|
|
2
|
-
import * as Effect from 'effect/Effect';
|
|
3
|
-
import * as Layer from 'effect/Layer';
|
|
4
|
-
import * as Stream from 'effect/Stream';
|
|
5
|
-
import { Blueprint } from '@dxos/blueprints';
|
|
6
|
-
import { Database, Feed, Obj, Ref } from '@dxos/echo';
|
|
7
|
-
import { type Trace } from '@dxos/functions';
|
|
8
|
-
import { ProcessManager } from '@dxos/functions-runtime';
|
|
9
|
-
export interface Service {
|
|
10
|
-
/**
|
|
11
|
-
* Gets or creates a session for a feed.
|
|
12
|
-
*/
|
|
13
|
-
getSession: (feed: Feed.Feed) => Effect.Effect<Session>;
|
|
14
|
-
}
|
|
15
|
-
declare const AgentService_base: Context.TagClass<AgentService, "@dxos/assistant/AgentService", Service>;
|
|
16
|
-
export declare class AgentService extends AgentService_base {
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Handle to an agent session.
|
|
20
|
-
*/
|
|
21
|
-
export interface Session {
|
|
22
|
-
/**
|
|
23
|
-
* The feed that the session is associated with.
|
|
24
|
-
*/
|
|
25
|
-
readonly feed: Feed.Feed;
|
|
26
|
-
/**
|
|
27
|
-
* Submits a prompt to the agent.
|
|
28
|
-
*/
|
|
29
|
-
submitPrompt: (prompt: string) => Effect.Effect<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Wait until agent has completed its work.
|
|
32
|
-
*/
|
|
33
|
-
waitForCompletion: () => Effect.Effect<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Subscribe to ephemeral trace events (e.g., streaming partial messages).
|
|
36
|
-
* Replays buffered events, then streams new ones until the process ends.
|
|
37
|
-
*/
|
|
38
|
-
subscribeEphemeral: () => Stream.Stream<Trace.Message>;
|
|
39
|
-
/**
|
|
40
|
-
* Adds context objects to the agent.
|
|
41
|
-
*/
|
|
42
|
-
addContext: (context: Ref.Ref<Obj.Unknown>[]) => Effect.Effect<void, never, Feed.FeedService>;
|
|
43
|
-
/**
|
|
44
|
-
* Gets the context objects from the agent.
|
|
45
|
-
*/
|
|
46
|
-
getContext: () => Effect.Effect<Ref.Ref<Obj.Unknown>[], never, Feed.FeedService>;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Gets or creates a session for a feed.
|
|
50
|
-
*/
|
|
51
|
-
export declare const getSession: (feed: Feed.Feed) => Effect.Effect<Session, never, AgentService>;
|
|
52
|
-
export interface CreateSessionOptions {
|
|
53
|
-
readonly blueprints?: Blueprint.Blueprint[];
|
|
54
|
-
readonly context?: Ref.Ref<Obj.Unknown>[];
|
|
55
|
-
}
|
|
56
|
-
export declare const createSession: (opts?: CreateSessionOptions) => Effect.Effect<Session, Blueprint.NotFoundError, Database.Service | Feed.FeedService | Blueprint.RegistryService | AgentService>;
|
|
57
|
-
export declare const layer: (opts?: {
|
|
58
|
-
systemPrompt?: string;
|
|
59
|
-
}) => Layer.Layer<AgentService, never, ProcessManager.ProcessManagerService>;
|
|
60
|
-
export {};
|
|
61
|
-
//# sourceMappingURL=AgentService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentService.d.ts","sourceRoot":"","sources":["../../../../src/service/AgentService.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAKzD,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CACzD;;AAED,qBAAa,YAAa,SAAQ,iBAAoE;CAAG;AAEzG;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAEzB;;OAEG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtD;;OAEG;IACH,iBAAiB,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,kBAAkB,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEvD;;OAEG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAE9F;;OAEG;IACH,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;CAClF;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,kEAA8E,CAAC;AAEtG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;CAC3C;AAED,eAAO,MAAM,aAAa,EAAE,CAC1B,IAAI,CAAC,EAAE,oBAAoB,KACxB,MAAM,CAAC,MAAM,CAChB,OAAO,EACP,SAAS,CAAC,aAAa,EACvB,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,eAAe,GAAG,YAAY,CAkB/D,CAAC;AAElB,eAAO,MAAM,KAAK,GAAI,OAAO;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,KAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE,cAAc,CAAC,qBAAqB,CAsCtE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AgentService.test.d.ts","sourceRoot":"","sources":["../../../../src/service/AgentService.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { AiService, GenericToolkit, type ModelName } from '@dxos/ai';
|
|
2
|
-
import { Database, Feed } from '@dxos/echo';
|
|
3
|
-
import { TracingService } from '@dxos/functions';
|
|
4
|
-
import { Process, ProcessManager, StorageService } from '@dxos/functions-runtime';
|
|
5
|
-
import { Operation, OperationRegistry } from '@dxos/operation';
|
|
6
|
-
interface AgentProcessOptions {
|
|
7
|
-
systemPrompt?: string;
|
|
8
|
-
model?: ModelName;
|
|
9
|
-
}
|
|
10
|
-
export declare const AGENT_PROCESS_KEY = "org.dxos.testing.process.agent";
|
|
11
|
-
/**
|
|
12
|
-
* Hosts a persistent, suspendible AiAgent that can process a number of prompts.
|
|
13
|
-
* The process target is a queue DXN string.
|
|
14
|
-
*/
|
|
15
|
-
export declare const AgentProcess: (options: AgentProcessOptions) => Process.Process<string, void, Feed.FeedService | TracingService | Database.Service | GenericToolkit.GenericToolkitProvider | OperationRegistry.Service | Operation.Service | StorageService.StorageService | ProcessManager.ProcessOperationInvoker.Service | AiService.AiService>;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=agent-process.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-process.d.ts","sourceRoot":"","sources":["../../../../src/service/agent-process.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAO,IAAI,EAAO,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAW/D,UAAU,mBAAmB;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,mCAAmC,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,mBAAmB,uRAsItD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/service/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format.test.d.ts","sourceRoot":"","sources":["../../../../src/session/format.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/session/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,OAAO,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,KAAK,IAAI,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAKxC,OAAO,EAIL,KAAK,mBAAmB,EAExB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EAEzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAExF,OAAO,EAAgB,OAAO,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,GAAG,wBAAwB,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAEpH,MAAM,MAAM,wBAAwB,GAChC,aAAa,CAAC,aAAa,GAC3B,oBAAoB,GACpB,mBAAmB,GACnB,yBAAyB,GACzB,KAAK,CAAC,YAAY;AACpB;;;GAGG;GACD,cAAc,CAAC;AAEnB,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAGhC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;IACtE,MAAM,EAAE,MAAM,CAAC;IAEf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,SAAS,SAAS,CAAC,SAAS,EAAE,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,SAAS,SAAS,CAAC,SAAS,EAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF;;;;;;;;;GASG;AAEH,qBAAa,SAAS;IAkBR,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAjBrC,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2C;IAEtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkE;IAE5F,kCAAkC;IAElC,OAAO,CAAC,QAAQ,CAAyB;IAEzC,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAyB;IAEzC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAK;gBAEM,QAAQ,GAAE,gBAAqB;IAK5D,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,OAAO,IAAI,SAAS,OAAO,CAAC,OAAO,EAAE,CAExC;IAED,OAAO,CAAC,cAAc,CAajB;IAEL,YAAY;;;;;;;;;;QAOR;IAEJ;;;OAGG;IACH,KAAK,GAAI,mDAMN,mBAAmB,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,wBAAwB,CAAC,CAqBpF;IAEL;;;OAGG;IACH,YAAY,GAAI,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,sBAGrD,kBAAkB,CAAC,KAAK,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,wBAAwB,CAAC,CAwEzG;IAEL,QAAQ,GAAI,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,aAAa;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;KAAE,+EA8BpG;IACL;;OAEG;IACH,GAAG,GAAI,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,4EAO5C,iBAAiB,CAAC,KAAK,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,wBAAwB,CAAC,CAgB/B;CAC7E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../../../../src/session/session.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,SAAS,CAAC"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Registry } from '@effect-atom/atom';
|
|
2
|
-
import * as LanguageModel from '@effect/ai/LanguageModel';
|
|
3
|
-
import * as KeyValueStore from '@effect/platform/KeyValueStore';
|
|
4
|
-
import * as Layer from 'effect/Layer';
|
|
5
|
-
import { AiService, GenericToolkit, type ModelName, type ToolExecutionService, type ToolResolverService } from '@dxos/ai';
|
|
6
|
-
import { Blueprint } from '@dxos/blueprints';
|
|
7
|
-
import { Database, Feed, Type } from '@dxos/echo';
|
|
8
|
-
import type { TestContextService } from '@dxos/effect/testing';
|
|
9
|
-
import { CredentialsService, FunctionInvocationService, QueueService, type ServiceCredential, Trace, TracingService } from '@dxos/functions';
|
|
10
|
-
import { Process, ProcessManager, ServiceResolver, TriggerDispatcher, TriggerStateStore } from '@dxos/functions-runtime';
|
|
11
|
-
import { Operation, OperationHandlerSet, OperationRegistry } from '@dxos/operation';
|
|
12
|
-
import { AgentService } from '../service';
|
|
13
|
-
interface TestLayerOptions {
|
|
14
|
-
aiServicePreset?: 'direct' | 'edge-local' | 'edge-remote';
|
|
15
|
-
model?: ModelName;
|
|
16
|
-
operationHandlers?: OperationHandlerSet.OperationHandlerSet | OperationHandlerSet.OperationHandlerSet[];
|
|
17
|
-
toolkits?: GenericToolkit.GenericToolkit[];
|
|
18
|
-
types?: Type.AnyEntity[];
|
|
19
|
-
blueprints?: Blueprint.Blueprint[];
|
|
20
|
-
credentials?: ServiceCredential[];
|
|
21
|
-
tracing?: 'noop' | 'console' | 'pretty';
|
|
22
|
-
disableLlmMemoization?: boolean;
|
|
23
|
-
/**
|
|
24
|
-
* Core system prompt for the agent.
|
|
25
|
-
*/
|
|
26
|
-
systemPrompt?: string;
|
|
27
|
-
}
|
|
28
|
-
export type AssistantTestServices = LanguageModel.LanguageModel | Feed.FeedService | CredentialsService | AgentService.AgentService | AiService.AiService | Database.Service | QueueService | Blueprint.RegistryService | OperationRegistry.Service | GenericToolkit.GenericToolkitProvider | Operation.Service | ProcessManager.ProcessManagerService | Process.ProcessMonitorService | Registry.AtomRegistry | OperationHandlerSet.OperationHandlerProvider | KeyValueStore.KeyValueStore | ServiceResolver.ServiceResolver | TracingService | Trace.TraceService | Trace.TraceSink | ToolExecutionService | ToolResolverService | FunctionInvocationService;
|
|
29
|
-
export declare const AssistantTestLayer: ({ aiServicePreset, model, operationHandlers, toolkits, types, credentials, tracing, disableLlmMemoization, blueprints, systemPrompt, }?: TestLayerOptions) => Layer.Layer<AssistantTestServices, never, TestContextService>;
|
|
30
|
-
interface TestLayerWithTriggersOptions extends TestLayerOptions {
|
|
31
|
-
}
|
|
32
|
-
export type AssistantTestServicesWithTriggers = AssistantTestServices | TriggerDispatcher | TriggerStateStore;
|
|
33
|
-
export declare const AssistantTestLayerWithTriggers: (options: TestLayerWithTriggersOptions) => Layer.Layer<AssistantTestServicesWithTriggers, never, TestContextService>;
|
|
34
|
-
export {};
|
|
35
|
-
//# sourceMappingURL=layer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layer.d.ts","sourceRoot":"","sources":["../../../../src/testing/layer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,aAAa,MAAM,gCAAgC,CAAC;AAIhE,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EACL,SAAS,EAET,cAAc,EACd,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,SAAS,EAAU,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAO,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,YAAY,EACZ,KAAK,iBAAiB,EAEtB,KAAK,EACL,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EAEf,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIpF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,UAAU,gBAAgB;IACxB,eAAe,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;IAC1D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iBAAiB,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC,mBAAmB,EAAE,CAAC;IACxG,QAAQ,CAAC,EAAE,cAAc,CAAC,cAAc,EAAE,CAAC;IAC3C,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAKlC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAExC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAE7B,aAAa,CAAC,aAAa,GAC3B,IAAI,CAAC,WAAW,GAChB,kBAAkB,GAClB,YAAY,CAAC,YAAY,GACzB,SAAS,CAAC,SAAS,GACnB,QAAQ,CAAC,OAAO,GAChB,YAAY,GAEZ,SAAS,CAAC,eAAe,GACzB,iBAAiB,CAAC,OAAO,GACzB,cAAc,CAAC,sBAAsB,GACrC,SAAS,CAAC,OAAO,GAEjB,cAAc,CAAC,qBAAqB,GACpC,OAAO,CAAC,qBAAqB,GAC7B,QAAQ,CAAC,YAAY,GAErB,mBAAmB,CAAC,wBAAwB,GAC5C,aAAa,CAAC,aAAa,GAC3B,eAAe,CAAC,eAAe,GAC/B,cAAc,GACd,KAAK,CAAC,YAAY,GAClB,KAAK,CAAC,SAAS,GAEf,oBAAoB,GACpB,mBAAmB,GACnB,yBAAyB,CAAC;AAE9B,eAAO,MAAM,kBAAkB,GAAI,yIAWhC,gBAAqB,KAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,EAAE,kBAAkB,CAgHtF,CAAC;AAEF,UAAU,4BAA6B,SAAQ,gBAAgB;CAAG;AAElE,MAAM,MAAM,iCAAiC,GAAG,qBAAqB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAE9G,eAAO,MAAM,8BAA8B,GACzC,SAAS,4BAA4B,KACpC,KAAK,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,EAAE,kBAAkB,CAOjE,CAAC"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { it } from '@effect/vitest';
|
|
6
|
-
import * as Effect from 'effect/Effect';
|
|
7
|
-
import { describe, expect } from 'vitest';
|
|
8
|
-
|
|
9
|
-
import { Blueprint } from '@dxos/blueprints';
|
|
10
|
-
import { Database, Feed, Obj, Ref } from '@dxos/echo';
|
|
11
|
-
import { TestDatabaseLayer } from '@dxos/functions-runtime/testing';
|
|
12
|
-
|
|
13
|
-
import { ContextBinding } from './context';
|
|
14
|
-
import { AiConversation } from './conversation';
|
|
15
|
-
|
|
16
|
-
describe('AiConversation', () => {
|
|
17
|
-
const TestLayer = TestDatabaseLayer({
|
|
18
|
-
types: [Blueprint.Blueprint, ContextBinding],
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it.effect('loads blueprints on open', () =>
|
|
22
|
-
Effect.gen(function* () {
|
|
23
|
-
const { db } = yield* Database.Service;
|
|
24
|
-
|
|
25
|
-
// Create feed.
|
|
26
|
-
const feed = db.add(Feed.make());
|
|
27
|
-
|
|
28
|
-
// Create blueprint.
|
|
29
|
-
const blueprint = db.add(
|
|
30
|
-
Blueprint.make({
|
|
31
|
-
key: 'example.com/blueprint/Test',
|
|
32
|
-
name: 'Test Blueprint',
|
|
33
|
-
}),
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
// Add blueprint to feed via binding.
|
|
37
|
-
yield* Feed.append(feed, [
|
|
38
|
-
Obj.make(ContextBinding, {
|
|
39
|
-
blueprints: {
|
|
40
|
-
added: [Ref.make(blueprint)],
|
|
41
|
-
removed: [],
|
|
42
|
-
},
|
|
43
|
-
objects: {
|
|
44
|
-
added: [],
|
|
45
|
-
removed: [],
|
|
46
|
-
},
|
|
47
|
-
}),
|
|
48
|
-
]);
|
|
49
|
-
|
|
50
|
-
const runtime = yield* Effect.runtime<Feed.FeedService>();
|
|
51
|
-
const conversation = new AiConversation({ feed, runtime });
|
|
52
|
-
yield* Effect.promise(() => conversation.open());
|
|
53
|
-
|
|
54
|
-
expect(conversation.context.getBlueprints()).toHaveLength(1);
|
|
55
|
-
expect(conversation.context.getObjects()).toHaveLength(0);
|
|
56
|
-
}).pipe(Effect.provide(TestLayer)),
|
|
57
|
-
);
|
|
58
|
-
});
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import type { Registry } from '@effect-atom/atom-react';
|
|
6
|
-
import type * as Tool from '@effect/ai/Tool';
|
|
7
|
-
import type * as Toolkit from '@effect/ai/Toolkit';
|
|
8
|
-
import * as Array from 'effect/Array';
|
|
9
|
-
import * as Context from 'effect/Context';
|
|
10
|
-
import * as Effect from 'effect/Effect';
|
|
11
|
-
import * as Either from 'effect/Either';
|
|
12
|
-
import { pipe } from 'effect/Function';
|
|
13
|
-
import * as Layer from 'effect/Layer';
|
|
14
|
-
import * as Record from 'effect/Record';
|
|
15
|
-
import * as Runtime from 'effect/Runtime';
|
|
16
|
-
|
|
17
|
-
import { type ToolExecutionService, type ToolResolverService } from '@dxos/ai';
|
|
18
|
-
import { type GenericToolkit } from '@dxos/ai';
|
|
19
|
-
import { type Blueprint } from '@dxos/blueprints';
|
|
20
|
-
import { Resource } from '@dxos/context';
|
|
21
|
-
import { Database, Feed, Filter, Obj } from '@dxos/echo';
|
|
22
|
-
import { acquireReleaseResource } from '@dxos/effect';
|
|
23
|
-
import { invariant } from '@dxos/invariant';
|
|
24
|
-
import { log } from '@dxos/log';
|
|
25
|
-
import { McpToolkit } from '@dxos/mcp-client';
|
|
26
|
-
import { Message } from '@dxos/types';
|
|
27
|
-
|
|
28
|
-
import {
|
|
29
|
-
AiSession,
|
|
30
|
-
type AiSessionRunError,
|
|
31
|
-
type AiSessionRunRequirements,
|
|
32
|
-
type GenerationObserver,
|
|
33
|
-
createToolkit,
|
|
34
|
-
formatSystemPrompt,
|
|
35
|
-
} from '../session';
|
|
36
|
-
import { AiContextBinder, AiContextService } from './context';
|
|
37
|
-
|
|
38
|
-
export interface AiConversationRunProps<Tools extends Record<string, Tool.Any>> {
|
|
39
|
-
prompt: string;
|
|
40
|
-
system?: string;
|
|
41
|
-
observer?: GenerationObserver;
|
|
42
|
-
toolkit?: Toolkit.Toolkit<Tools>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export type AiConversationOptions = {
|
|
46
|
-
feed: Feed.Feed;
|
|
47
|
-
runtime: Runtime.Runtime<Feed.FeedService>;
|
|
48
|
-
registry?: Registry.Registry;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
// TODO(dmaretskyi): Take from model characteristics. opus has 200k max tokens.
|
|
52
|
-
/**
|
|
53
|
-
* Summarization threshold in tokens.
|
|
54
|
-
*/
|
|
55
|
-
const SUMMARY_THRESHOLD = 80_000;
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Durable conversation state (initiated by users and agents) backed by a Feed.
|
|
59
|
-
* Executes tools based on AI responses and supports cancellation of in-progress requests.
|
|
60
|
-
*/
|
|
61
|
-
export class AiConversation extends Resource {
|
|
62
|
-
/**
|
|
63
|
-
* Blueprints and objects bound to the conversation.
|
|
64
|
-
*/
|
|
65
|
-
private readonly _binder: AiContextBinder;
|
|
66
|
-
private readonly _feed: Feed.Feed;
|
|
67
|
-
private readonly _runtime: Runtime.Runtime<Feed.FeedService>;
|
|
68
|
-
private readonly _toolkit?: Toolkit.Any;
|
|
69
|
-
|
|
70
|
-
public constructor(options: AiConversationOptions) {
|
|
71
|
-
super();
|
|
72
|
-
this._feed = options.feed;
|
|
73
|
-
this._runtime = options.runtime;
|
|
74
|
-
invariant(this._feed);
|
|
75
|
-
invariant(this._runtime);
|
|
76
|
-
this._binder = new AiContextBinder({ feed: this._feed, runtime: this._runtime, registry: options.registry });
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
protected override async _open(): Promise<void> {
|
|
80
|
-
await this._binder.open(this._ctx);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
public get feed() {
|
|
84
|
-
return this._feed;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
public get context() {
|
|
88
|
-
return this._binder;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
public get toolkit() {
|
|
92
|
-
return this._toolkit;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
public async getHistory(): Promise<Message.Message[]> {
|
|
96
|
-
const queryResult = await Runtime.runPromise(this._runtime)(Feed.query(this._feed, Filter.type(Message.Message)));
|
|
97
|
-
const items = await queryResult.run();
|
|
98
|
-
return items.filter(Obj.instanceOf(Message.Message));
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
getTools(): Effect.Effect<Record<string, Tool.Any>, never, ToolExecutionService | ToolResolverService> {
|
|
102
|
-
return Effect.gen(this, function* () {
|
|
103
|
-
const blueprints = this.context.getBlueprints();
|
|
104
|
-
const tookit = yield* createToolkit({ toolkit: this._toolkit, blueprints });
|
|
105
|
-
return tookit.tools;
|
|
106
|
-
}).pipe(Effect.orDie);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Creates a new cancelable request effect.
|
|
111
|
-
*/
|
|
112
|
-
public createRequest<Tools extends Record<string, Tool.Any> = {}>(
|
|
113
|
-
params: AiConversationRunProps<Tools>,
|
|
114
|
-
): Effect.Effect<Message.Message[], AiSessionRunError, AiSessionRunRequirements | Tool.HandlersFor<Tools>> {
|
|
115
|
-
return Effect.gen(this, function* () {
|
|
116
|
-
const history = yield* Effect.promise(() => this.getHistory());
|
|
117
|
-
const blueprints = this.context.getBlueprints();
|
|
118
|
-
const objects = this.context.getObjects();
|
|
119
|
-
|
|
120
|
-
log('run', {
|
|
121
|
-
history: history.length,
|
|
122
|
-
blueprints: blueprints.length,
|
|
123
|
-
objects: objects.length,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
const session = new AiSession({
|
|
127
|
-
summarizationThreshold: SUMMARY_THRESHOLD,
|
|
128
|
-
observer: params.observer,
|
|
129
|
-
onOutput: (message) =>
|
|
130
|
-
Effect.promise(() => Runtime.runPromise(this._runtime)(Feed.append(this._feed, [message]))),
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
yield* session.begin({
|
|
134
|
-
history,
|
|
135
|
-
blueprints,
|
|
136
|
-
objects,
|
|
137
|
-
prompt: params.prompt,
|
|
138
|
-
system: params.system,
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// Turn loop: recompute toolkit and system prompt between turns to pick up dynamically enabled blueprints.
|
|
142
|
-
do {
|
|
143
|
-
yield* Effect.promise(() => this.context.sync());
|
|
144
|
-
const currentBlueprints = this.context.getBlueprints();
|
|
145
|
-
const mcps = yield* connectMcpServers(currentBlueprints);
|
|
146
|
-
const toolkit = yield* createToolkit({
|
|
147
|
-
toolkit: params.toolkit,
|
|
148
|
-
blueprints: currentBlueprints,
|
|
149
|
-
genericToolkits: mcps,
|
|
150
|
-
});
|
|
151
|
-
log('toolkit', { tools: Record.keys(toolkit.tools) });
|
|
152
|
-
const system = yield* formatSystemPrompt({
|
|
153
|
-
system: params.system,
|
|
154
|
-
blueprints: currentBlueprints,
|
|
155
|
-
objects: this.context.getObjects(),
|
|
156
|
-
}).pipe(Effect.orDie);
|
|
157
|
-
|
|
158
|
-
const { done } = yield* session.runAgentTurn({
|
|
159
|
-
system,
|
|
160
|
-
toolkit,
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
if (done) {
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
yield* session.runTools({ toolkit });
|
|
168
|
-
} while (true);
|
|
169
|
-
|
|
170
|
-
log('result', {
|
|
171
|
-
messages: session.pending.length,
|
|
172
|
-
duration: session.duration,
|
|
173
|
-
toolCalls: session.toolCalls,
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
return [...session.pending];
|
|
177
|
-
}).pipe(
|
|
178
|
-
Effect.provide(
|
|
179
|
-
Layer.mergeAll(
|
|
180
|
-
Layer.succeed(AiContextService, {
|
|
181
|
-
binder: this.context,
|
|
182
|
-
}),
|
|
183
|
-
Layer.succeed(AiConversationService, this),
|
|
184
|
-
),
|
|
185
|
-
),
|
|
186
|
-
);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Gives access to the ai conversation.
|
|
192
|
-
*/
|
|
193
|
-
export class AiConversationService extends Context.Tag('@dxos/assistant/AiConversationService')<
|
|
194
|
-
AiConversationService,
|
|
195
|
-
AiConversation
|
|
196
|
-
>() {
|
|
197
|
-
/**
|
|
198
|
-
* Create a new conversation layer from options.
|
|
199
|
-
*/
|
|
200
|
-
static layer = (options: AiConversationOptions): Layer.Layer<AiConversationService | AiContextService> =>
|
|
201
|
-
aiContextFromConversation.pipe(
|
|
202
|
-
Layer.provideMerge(
|
|
203
|
-
Layer.scoped(
|
|
204
|
-
AiConversationService,
|
|
205
|
-
Effect.gen(function* () {
|
|
206
|
-
const conversation = yield* acquireReleaseResource(() => new AiConversation(options));
|
|
207
|
-
return conversation;
|
|
208
|
-
}),
|
|
209
|
-
),
|
|
210
|
-
),
|
|
211
|
-
);
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Create a new conversation with a new feed.
|
|
215
|
-
*/
|
|
216
|
-
static layerNewFeed = (
|
|
217
|
-
options?: Omit<AiConversationOptions, 'feed' | 'runtime'>,
|
|
218
|
-
): Layer.Layer<AiConversationService | AiContextService, never, Database.Service | Feed.FeedService> =>
|
|
219
|
-
Layer.unwrapScoped(
|
|
220
|
-
Effect.gen(function* () {
|
|
221
|
-
const feed = Feed.make();
|
|
222
|
-
yield* Database.add(feed);
|
|
223
|
-
const runtime = yield* Effect.runtime<Feed.FeedService>();
|
|
224
|
-
return AiConversationService.layer({
|
|
225
|
-
...options,
|
|
226
|
-
feed,
|
|
227
|
-
runtime,
|
|
228
|
-
});
|
|
229
|
-
}),
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Run a prompt in the current conversation.
|
|
234
|
-
*/
|
|
235
|
-
static run = <Tools extends Record<string, Tool.Any> = {}>(
|
|
236
|
-
params: AiConversationRunProps<Tools>,
|
|
237
|
-
): Effect.Effect<
|
|
238
|
-
Message.Message[],
|
|
239
|
-
AiSessionRunError,
|
|
240
|
-
AiSessionRunRequirements | Tool.HandlersFor<Tools> | AiConversationService
|
|
241
|
-
> =>
|
|
242
|
-
Effect.gen(function* () {
|
|
243
|
-
const conversation = yield* AiConversationService;
|
|
244
|
-
return yield* conversation.createRequest(params);
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
const aiContextFromConversation = Layer.effect(
|
|
249
|
-
AiContextService,
|
|
250
|
-
Effect.gen(function* () {
|
|
251
|
-
const conversation = yield* AiConversationService;
|
|
252
|
-
return {
|
|
253
|
-
binder: conversation.context,
|
|
254
|
-
};
|
|
255
|
-
}),
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
const connectMcpServers = (
|
|
259
|
-
blueprints: readonly Blueprint.Blueprint[],
|
|
260
|
-
): Effect.Effect<GenericToolkit.GenericToolkit[]> =>
|
|
261
|
-
pipe(
|
|
262
|
-
blueprints,
|
|
263
|
-
Array.flatMap((_) => _.mcpServers ?? []),
|
|
264
|
-
Effect.forEach(({ url, protocol }) =>
|
|
265
|
-
McpToolkit.make({ url, kind: protocol }).pipe(
|
|
266
|
-
// NOTE: Type-inference fails here without explicit void return.
|
|
267
|
-
Effect.tap((toolkit): void =>
|
|
268
|
-
log.info('Connected to MCP server', { url, tools: Object.keys(toolkit.toolkit.tools).length }),
|
|
269
|
-
),
|
|
270
|
-
Effect.tapDefect((error) => Effect.sync(() => log.warn('Failed to connect to MCP server', { error }))),
|
|
271
|
-
Effect.either,
|
|
272
|
-
),
|
|
273
|
-
),
|
|
274
|
-
Effect.map(Array.filterMap((_) => Either.getRight(_))),
|
|
275
|
-
);
|
package/src/functions.test.ts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2025 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { describe, it } from '@effect/vitest';
|
|
6
|
-
import * as Effect from 'effect/Effect';
|
|
7
|
-
import * as Schema from 'effect/Schema';
|
|
8
|
-
|
|
9
|
-
import { ConsolePrinter } from '@dxos/ai';
|
|
10
|
-
import { MemoizedAiService } from '@dxos/ai/testing';
|
|
11
|
-
import { AiSession, GenerationObserver, createToolkit } from '@dxos/assistant';
|
|
12
|
-
import { Blueprint } from '@dxos/blueprints';
|
|
13
|
-
import { Database, Obj, Ref } from '@dxos/echo';
|
|
14
|
-
import { TestHelpers } from '@dxos/effect/testing';
|
|
15
|
-
import { ObjectId } from '@dxos/keys';
|
|
16
|
-
import { Operation, OperationHandlerSet } from '@dxos/operation';
|
|
17
|
-
import { Organization } from '@dxos/types';
|
|
18
|
-
|
|
19
|
-
import { AssistantTestLayer } from './testing';
|
|
20
|
-
|
|
21
|
-
ObjectId.dangerouslyDisableRandomness();
|
|
22
|
-
|
|
23
|
-
const ReadName = Operation.make({
|
|
24
|
-
meta: {
|
|
25
|
-
key: 'org.dxos.function.read-name',
|
|
26
|
-
name: 'Read Name',
|
|
27
|
-
description: 'Reads the name of an organization.',
|
|
28
|
-
},
|
|
29
|
-
input: Schema.Struct({
|
|
30
|
-
org: Ref.Ref(Organization.Organization),
|
|
31
|
-
}),
|
|
32
|
-
output: Schema.String,
|
|
33
|
-
services: [Database.Service],
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const Handlers = OperationHandlerSet.make(
|
|
37
|
-
Operation.withHandler(
|
|
38
|
-
ReadName,
|
|
39
|
-
Effect.fnUntraced(function* ({ org }) {
|
|
40
|
-
const resolved = yield* Database.load(org);
|
|
41
|
-
return resolved.name ?? '<no org>';
|
|
42
|
-
}),
|
|
43
|
-
),
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
const blueprint = Blueprint.make({
|
|
47
|
-
key: 'org.dxos.blueprint.test',
|
|
48
|
-
name: 'Test blueprint',
|
|
49
|
-
tools: Blueprint.toolDefinitions({ operations: [ReadName] }),
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const TestLayer = AssistantTestLayer({
|
|
53
|
-
aiServicePreset: 'edge-remote',
|
|
54
|
-
operationHandlers: Handlers,
|
|
55
|
-
types: [Organization.Organization],
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('Research', () => {
|
|
59
|
-
it.effect(
|
|
60
|
-
'call a function with a ref input',
|
|
61
|
-
Effect.fnUntraced(
|
|
62
|
-
function* (_) {
|
|
63
|
-
const org = yield* Database.add(
|
|
64
|
-
Obj.make(Organization.Organization, {
|
|
65
|
-
name: 'BlueYard',
|
|
66
|
-
website: 'https://blueyard.com',
|
|
67
|
-
}),
|
|
68
|
-
);
|
|
69
|
-
yield* Database.flush();
|
|
70
|
-
yield* new AiSession({ observer: GenerationObserver.fromPrinter(new ConsolePrinter()) }).run({
|
|
71
|
-
prompt: `What is the name of the organization? ${org.id}`,
|
|
72
|
-
toolkit: yield* createToolkit({
|
|
73
|
-
blueprints: [blueprint],
|
|
74
|
-
}),
|
|
75
|
-
});
|
|
76
|
-
},
|
|
77
|
-
Effect.provide(TestLayer),
|
|
78
|
-
TestHelpers.provideTestContext,
|
|
79
|
-
),
|
|
80
|
-
MemoizedAiService.isGenerationEnabled() ? 240_000 : 30_000,
|
|
81
|
-
);
|
|
82
|
-
});
|