@finalai/final-agent-provider 0.11.0 → 0.13.0

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 (71) hide show
  1. package/README.md +1 -14
  2. package/dist/modules/integrations.d.mts +0 -1
  3. package/dist/modules/integrations.mjs +0 -2
  4. package/dist/modules/integrations.mjs.map +2 -2
  5. package/dist/modules/sandboxes/computer.d.mts +2 -4
  6. package/dist/modules/sandboxes/computer.mjs +110 -480
  7. package/dist/modules/sandboxes/computer.mjs.map +2 -2
  8. package/dist/modules/sandboxes/computers-api.d.mts +6 -1
  9. package/dist/modules/sandboxes/computers-api.mjs.map +2 -2
  10. package/dist/modules/sandboxes/device-api.d.mts +8 -48
  11. package/dist/modules/sandboxes/device-api.mjs +2 -92
  12. package/dist/modules/sandboxes/device-api.mjs.map +2 -2
  13. package/dist/modules/sandboxes/device.d.mts +1 -1
  14. package/dist/modules/sandboxes/device.mjs.map +2 -2
  15. package/dist/modules/sandboxes/environment.d.mts +4 -0
  16. package/dist/modules/sandboxes/environment.mjs.map +2 -2
  17. package/dist/modules/sandboxes/local.d.mts +2 -1
  18. package/dist/modules/sandboxes/local.mjs +64 -8
  19. package/dist/modules/sandboxes/local.mjs.map +2 -2
  20. package/dist/modules/sandboxes/session.mjs +0 -1
  21. package/dist/modules/sandboxes/session.mjs.map +2 -2
  22. package/package.json +5 -57
  23. package/WORKSPACE-EGRESS.md +0 -184
  24. package/dist/modules/authoring-final-channel.d.mts +0 -3
  25. package/dist/modules/authoring-final-channel.mjs +0 -10
  26. package/dist/modules/authoring-final-channel.mjs.map +0 -7
  27. package/dist/modules/channel-factories.d.mts +0 -40
  28. package/dist/modules/channel-factories.mjs +0 -212
  29. package/dist/modules/channel-factories.mjs.map +0 -7
  30. package/dist/modules/channels/content.d.mts +0 -6
  31. package/dist/modules/channels/content.mjs +0 -31
  32. package/dist/modules/channels/content.mjs.map +0 -7
  33. package/dist/modules/channels/delivery.d.mts +0 -54
  34. package/dist/modules/channels/delivery.mjs +0 -243
  35. package/dist/modules/channels/delivery.mjs.map +0 -7
  36. package/dist/modules/channels/direct-messaging.d.mts +0 -5
  37. package/dist/modules/channels/direct-messaging.mjs +0 -8
  38. package/dist/modules/channels/direct-messaging.mjs.map +0 -7
  39. package/dist/modules/channels/fake-platform.d.mts +0 -36
  40. package/dist/modules/channels/fake-platform.mjs +0 -168
  41. package/dist/modules/channels/fake-platform.mjs.map +0 -7
  42. package/dist/modules/channels/group-messaging.d.mts +0 -5
  43. package/dist/modules/channels/group-messaging.mjs +0 -8
  44. package/dist/modules/channels/group-messaging.mjs.map +0 -7
  45. package/dist/modules/channels/inbound.d.mts +0 -52
  46. package/dist/modules/channels/inbound.mjs +0 -42
  47. package/dist/modules/channels/inbound.mjs.map +0 -7
  48. package/dist/modules/channels/index.d.mts +0 -9
  49. package/dist/modules/channels/index.mjs +0 -10
  50. package/dist/modules/channels/index.mjs.map +0 -7
  51. package/dist/modules/channels/messaging-channel.d.mts +0 -7
  52. package/dist/modules/channels/messaging-channel.mjs +0 -99
  53. package/dist/modules/channels/messaging-channel.mjs.map +0 -7
  54. package/dist/modules/channels/projection.d.mts +0 -36
  55. package/dist/modules/channels/projection.mjs +0 -233
  56. package/dist/modules/channels/projection.mjs.map +0 -7
  57. package/dist/modules/channels/prompt.d.mts +0 -72
  58. package/dist/modules/channels/prompt.mjs +0 -208
  59. package/dist/modules/channels/prompt.mjs.map +0 -7
  60. package/dist/modules/channels/routing.d.mts +0 -5
  61. package/dist/modules/channels/routing.mjs +0 -53
  62. package/dist/modules/channels/routing.mjs.map +0 -7
  63. package/dist/modules/sandboxes/access.d.mts +0 -34
  64. package/dist/modules/sandboxes/access.mjs +0 -15
  65. package/dist/modules/sandboxes/access.mjs.map +0 -7
  66. package/dist/modules/sandboxes/egress-bootstrap.d.mts +0 -3
  67. package/dist/modules/sandboxes/egress-bootstrap.mjs +0 -929
  68. package/dist/modules/sandboxes/egress-bootstrap.mjs.map +0 -7
  69. package/dist/modules/sandboxes/egress.d.mts +0 -94
  70. package/dist/modules/sandboxes/egress.mjs +0 -1561
  71. package/dist/modules/sandboxes/egress.mjs.map +0 -7
@@ -1,54 +0,0 @@
1
- import { Delivery, TurnPolicy, type RoomPlatformIface, type ConversationIface, type ConversationMessageIface, type ParticipantIface, type RouteArgsIface, type RouteDecisionIface } from '@finalai/agent-provider';
2
- export declare const CONTEXT_WINDOW_MESSAGES = 50;
3
- export interface DeliveryOutcomeIface {
4
- participantId: string;
5
- delivery: Delivery;
6
- sent: 'prompt' | 'observe' | 'silent-prompt' | 'skipped' | 'failed';
7
- messageId: string | null;
8
- error: string | null;
9
- }
10
- export interface DeliverMessageArgsIface {
11
- platform: RoomPlatformIface;
12
- route: (args: RouteArgsIface) => RouteDecisionIface[] | Promise<RouteDecisionIface[]>;
13
- conversation: ConversationIface;
14
- message: ConversationMessageIface;
15
- participants?: ParticipantIface[];
16
- turnPolicy: TurnPolicy;
17
- }
18
- export declare const effectiveTurnPolicy: (args: {
19
- channel: TurnPolicy;
20
- conversation: TurnPolicy;
21
- }) => TurnPolicy;
22
- export declare const humanAudience: (participants: ParticipantIface[]) => string[];
23
- export declare const audienceFor: (author: ParticipantIface | null, participants: ParticipantIface[]) => string[];
24
- export declare const deliveryIdempotencyKey: (messageId: string, participantId: string) => string;
25
- export declare const deliverMessage: (args: DeliverMessageArgsIface) => Promise<DeliveryOutcomeIface[]>;
26
- export interface ObserveNoticeArgsIface {
27
- platform: RoomPlatformIface;
28
- recipients: ParticipantIface[];
29
- text: string;
30
- idempotencyKey: string;
31
- }
32
- export declare const observeNotice: (args: ObserveNoticeArgsIface) => Promise<string[]>;
33
- export interface ReactionNoticeArgsIface {
34
- platform: RoomPlatformIface;
35
- participants: ParticipantIface[];
36
- message: ConversationMessageIface;
37
- isLatestOfAuthor: boolean;
38
- reactorParticipantId: string;
39
- emoji: string;
40
- eventId?: string;
41
- }
42
- export declare const reactionNotice: (args: ReactionNoticeArgsIface) => Promise<string[]>;
43
- export declare enum MembershipChange {
44
- Joined = "joined",
45
- Left = "left"
46
- }
47
- export interface MembershipNoticeArgsIface {
48
- platform: RoomPlatformIface;
49
- participants: ParticipantIface[];
50
- subject: ParticipantIface;
51
- change: MembershipChange;
52
- idempotencyKey: string;
53
- }
54
- export declare const membershipNotice: (args: MembershipNoticeArgsIface) => Promise<string[]>;
@@ -1,243 +0,0 @@
1
- import {
2
- Delivery,
3
- ParticipantKind,
4
- RoutingMode,
5
- TurnPolicy
6
- } from "@finalai/agent-provider";
7
- import * as z from "zod";
8
- import {
9
- authorPrefixedContent,
10
- buildPromptContent,
11
- catchUpFor,
12
- excerpt,
13
- finalAuthorOf,
14
- finalContextOf,
15
- messageRefOf,
16
- messageSummary,
17
- renderReplyContext,
18
- systemNoticeBlock
19
- } from "./prompt.mjs";
20
- import { MAX_AGENT_HOP_DEPTH } from "./routing.mjs";
21
- const thrownMessageSchema = z.object({ message: z.string() });
22
- const CONTEXT_WINDOW_MESSAGES = 50;
23
- const effectiveTurnPolicy = (args) => args.conversation === TurnPolicy.Queue ? TurnPolicy.Queue : args.channel;
24
- const humanAudience = (participants) => participants.filter((participant) => !participant.left && participant.kind === ParticipantKind.User).map((participant) => participant.id);
25
- const audienceFor = (author, participants) => author?.kind === ParticipantKind.User ? [author.id] : humanAudience(participants);
26
- const replyContextFor = async (args) => {
27
- const byId = new Map(args.earlier.map((message) => [message.messageId, message]));
28
- const referenced = [
29
- args.message.replyToMessageId,
30
- args.message.threadRootId,
31
- ...args.message.quotedMessageIds
32
- ].flatMap((id) => id == null || byId.has(id) ? [] : [id]);
33
- if (referenced.length > 0) {
34
- const found = await args.platform.conversations.getMessages({
35
- conversationId: args.message.conversationId,
36
- messageIds: [...new Set(referenced)]
37
- });
38
- for (const message of found) byId.set(message.messageId, message);
39
- }
40
- const replyTo = args.message.replyToMessageId == null ? null : byId.get(args.message.replyToMessageId) ?? null;
41
- const root = args.message.threadRootId == null ? null : byId.get(args.message.threadRootId) ?? null;
42
- const rootAuthor = root == null ? null : args.participants.find((participant) => participant.id === root.authorParticipantId);
43
- return {
44
- replyTo: replyTo == null || replyTo.messageId === root?.messageId ? null : messageRefOf(replyTo, args.participants),
45
- thread: args.message.threadRootId == null ? null : {
46
- rootMessageId: args.message.threadRootId,
47
- rootExcerpt: root == null ? "" : excerpt(messageSummary(root.content)),
48
- rootAuthor: rootAuthor == null ? null : finalAuthorOf(rootAuthor)
49
- },
50
- quotes: args.message.quotedMessageIds.flatMap((id) => {
51
- const quoted = byId.get(id);
52
- return quoted == null ? [] : [messageRefOf(quoted, args.participants)];
53
- })
54
- };
55
- };
56
- const deliveryIdempotencyKey = (messageId, participantId) => `${messageId}:${participantId}`;
57
- const deliverMessage = async (args) => {
58
- const { platform, conversation, message } = args;
59
- const participants = args.participants ?? await platform.conversations.participants(conversation.conversationId);
60
- const decisions = await args.route({ conversation, message, participants });
61
- const author = participants.find((participant) => participant.id === message.authorParticipantId) ?? null;
62
- for (const participant of participants) {
63
- if (participant.kind !== ParticipantKind.Agent) continue;
64
- const decision = decisions.find((candidate) => candidate.participantId === participant.id);
65
- platform.log("channel route decision", {
66
- observed_at: (/* @__PURE__ */ new Date()).toISOString(),
67
- organization_id: conversation.organizationId,
68
- conversation_id: conversation.conversationId,
69
- conversation_kind: conversation.kind,
70
- message_id: message.messageId,
71
- author_kind: author?.kind ?? "",
72
- participant_id: participant.id,
73
- routing_mode: participant.routingMode ?? "",
74
- delivery: decision?.delivery ?? "skipped",
75
- reason: participant.left ? "left conversation" : participant.id === message.authorParticipantId ? "author" : decision == null ? "not selected by route" : "selected by route",
76
- hop_depth: message.hopDepth
77
- });
78
- }
79
- if (decisions.length === 0) return [];
80
- const earlier = await platform.conversations.recentMessages({
81
- conversationId: conversation.conversationId,
82
- limit: CONTEXT_WINDOW_MESSAGES,
83
- beforeSeq: message.seq
84
- });
85
- const replyContext = await replyContextFor({ platform, message, earlier, participants });
86
- const turnPolicy = effectiveTurnPolicy({
87
- channel: args.turnPolicy,
88
- conversation: conversation.turnPolicy
89
- });
90
- const audience = audienceFor(author, participants);
91
- const authorParticipant = author ?? {
92
- id: message.authorParticipantId,
93
- kind: ParticipantKind.User,
94
- displayName: "Someone",
95
- userId: null,
96
- definitionId: null,
97
- routingMode: null,
98
- sessionId: null,
99
- supportsObserve: null,
100
- rendersAuthorMeta: null,
101
- left: true
102
- };
103
- const deliverOne = async (decision) => {
104
- const recipient = participants.find((participant) => participant.id === decision.participantId);
105
- const base = { participantId: decision.participantId, delivery: decision.delivery };
106
- if (recipient == null) {
107
- return { ...base, sent: "skipped", messageId: null, error: null };
108
- }
109
- const idempotencyKey = deliveryIdempotencyKey(message.messageId, recipient.id);
110
- const prompt = async (content, replyExpected) => {
111
- const result = await platform.sessions.prompt({
112
- participantId: recipient.id,
113
- content,
114
- turnPolicy,
115
- replyExpected,
116
- idempotencyKey,
117
- authorParticipantId: message.authorParticipantId,
118
- audienceParticipantIds: audience,
119
- sourceMessageId: message.messageId
120
- });
121
- return result.messageId;
122
- };
123
- try {
124
- if (decision.delivery === Delivery.Prompt) {
125
- const content2 = buildPromptContent({
126
- message,
127
- author: authorParticipant,
128
- recipient,
129
- replyContext,
130
- catchUp: catchUpFor({ recipient, earlier, participants })
131
- });
132
- return { ...base, sent: "prompt", messageId: await prompt(content2, true), error: null };
133
- }
134
- if (recipient.sessionId == null) {
135
- return { ...base, sent: "skipped", messageId: null, error: null };
136
- }
137
- const contextBlock = renderReplyContext(replyContext);
138
- const content = [
139
- ...contextBlock == null ? [] : [contextBlock],
140
- ...authorPrefixedContent({
141
- content: message.content,
142
- author: finalAuthorOf(authorParticipant),
143
- rendersAuthorMeta: recipient.rendersAuthorMeta ?? false,
144
- context: finalContextOf(replyContext)
145
- })
146
- ];
147
- if (recipient.supportsObserve === false) {
148
- if (message.hopDepth >= MAX_AGENT_HOP_DEPTH) {
149
- return { ...base, sent: "skipped", messageId: null, error: null };
150
- }
151
- return {
152
- ...base,
153
- sent: "silent-prompt",
154
- messageId: await prompt(content, false),
155
- error: null
156
- };
157
- }
158
- await platform.sessions.observe({ participantId: recipient.id, content, idempotencyKey });
159
- return { ...base, sent: "observe", messageId: null, error: null };
160
- } catch (error) {
161
- const reason = error instanceof Error ? error.message : thrownMessageSchema.safeParse(error).data?.message ?? String(error);
162
- platform.log("channel delivery failed", {
163
- conversationId: conversation.conversationId,
164
- messageId: message.messageId,
165
- participantId: recipient.id,
166
- delivery: decision.delivery,
167
- error: reason
168
- });
169
- return { ...base, sent: "failed", messageId: null, error: reason };
170
- }
171
- };
172
- return Promise.all(decisions.map(deliverOne));
173
- };
174
- const observeNotice = async (args) => {
175
- const delivered = [];
176
- for (const recipient of args.recipients) {
177
- if (recipient.sessionId == null || recipient.supportsObserve === false || recipient.left)
178
- continue;
179
- try {
180
- await args.platform.sessions.observe({
181
- participantId: recipient.id,
182
- content: [systemNoticeBlock({ text: args.text })],
183
- idempotencyKey: `${args.idempotencyKey}:${recipient.id}`
184
- });
185
- delivered.push(recipient.id);
186
- } catch (error) {
187
- args.platform.log("channel notice failed", {
188
- participantId: recipient.id,
189
- error: error instanceof Error ? error.message : String(error)
190
- });
191
- }
192
- }
193
- return delivered;
194
- };
195
- const reactionNotice = async (args) => {
196
- const author = args.participants.find(
197
- (participant) => participant.id === args.message.authorParticipantId
198
- );
199
- const reactor = args.participants.find(
200
- (participant) => participant.id === args.reactorParticipantId
201
- );
202
- if (author == null || author.kind !== ParticipantKind.Agent || reactor == null || reactor.id === author.id) {
203
- return [];
204
- }
205
- const target = args.isLatestOfAuthor ? "your last message" : `your message "${excerpt(messageSummary(args.message.content), 120)}"`;
206
- const reactionId = `reaction:${args.message.messageId}:${reactor.id}:${args.emoji}`;
207
- return observeNotice({
208
- platform: args.platform,
209
- recipients: [author],
210
- text: `${reactor.displayName} reacted ${args.emoji} to ${target}`,
211
- idempotencyKey: args.eventId == null ? reactionId : `${reactionId}:${args.eventId}`
212
- });
213
- };
214
- var MembershipChange = /* @__PURE__ */ ((MembershipChange2) => {
215
- MembershipChange2["Joined"] = "joined";
216
- MembershipChange2["Left"] = "left";
217
- return MembershipChange2;
218
- })(MembershipChange || {});
219
- const membershipNotice = async (args) => {
220
- const recipients = args.participants.filter(
221
- (participant) => participant.kind === ParticipantKind.Agent && participant.id !== args.subject.id && (participant.routingMode === RoutingMode.All || participant.routingMode === RoutingMode.Default)
222
- );
223
- const verb = args.change === "joined" /* Joined */ ? "joined" : "left";
224
- return observeNotice({
225
- platform: args.platform,
226
- recipients,
227
- text: `${args.subject.displayName} ${verb} the conversation`,
228
- idempotencyKey: args.idempotencyKey
229
- });
230
- };
231
- export {
232
- CONTEXT_WINDOW_MESSAGES,
233
- MembershipChange,
234
- audienceFor,
235
- deliverMessage,
236
- deliveryIdempotencyKey,
237
- effectiveTurnPolicy,
238
- humanAudience,
239
- membershipNotice,
240
- observeNotice,
241
- reactionNotice
242
- };
243
- //# sourceMappingURL=delivery.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/channels/delivery.ts"],
4
- "sourcesContent": ["import type { ContentBlock } from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n Delivery,\n ParticipantKind,\n RoutingMode,\n TurnPolicy,\n type RoomPlatformIface,\n type ConversationIface,\n type ConversationMessageIface,\n type ParticipantIface,\n type RouteArgsIface,\n type RouteDecisionIface,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport {\n authorPrefixedContent,\n buildPromptContent,\n catchUpFor,\n excerpt,\n finalAuthorOf,\n finalContextOf,\n messageRefOf,\n messageSummary,\n renderReplyContext,\n systemNoticeBlock,\n type ReplyContextArgsIface,\n} from \"./prompt.mjs\";\nimport { MAX_AGENT_HOP_DEPTH } from \"./routing.mjs\";\n\n// How a channel hands a conversation message to its agents: route, then build\n// each recipient's ACP content and call prompt or observe. Prompt construction,\n// not orchestration.\n\nconst thrownMessageSchema = z.object({ message: z.string() });\n\nexport const CONTEXT_WINDOW_MESSAGES = 50;\n\nexport interface DeliveryOutcomeIface {\n participantId: string;\n delivery: Delivery;\n // What actually happened: an observe can fall back to a silent prompt, or be\n // skipped for an agent with no session yet (its first prompt catches up).\n sent: 'prompt' | 'observe' | 'silent-prompt' | 'skipped' | 'failed';\n messageId: string | null;\n error: string | null;\n}\n\nexport interface DeliverMessageArgsIface {\n platform: RoomPlatformIface;\n // A channel's pure route(), or a bundle channel's run in its isolate.\n route: (args: RouteArgsIface) => RouteDecisionIface[] | Promise<RouteDecisionIface[]>;\n conversation: ConversationIface;\n message: ConversationMessageIface;\n participants?: ParticipantIface[];\n // The delivering channel's turnPolicy.\n turnPolicy: TurnPolicy;\n}\n\n// A channel's policy applies unless the conversation is set to\n// queue, the per-conversation override.\nexport const effectiveTurnPolicy = (args: {\n channel: TurnPolicy;\n conversation: TurnPolicy;\n}): TurnPolicy => (args.conversation === TurnPolicy.Queue ? TurnPolicy.Queue : args.channel);\n\n// Every person in the room: who may answer what a turn no person prompted asks.\nexport const humanAudience = (participants: ParticipantIface[]): string[] =>\n participants\n .filter((participant) => !participant.left && participant.kind === ParticipantKind.User)\n .map((participant) => participant.id);\n\n// A person answers their own prompt; an agent's prompt is answered by the room's people.\nexport const audienceFor = (\n author: ParticipantIface | null,\n participants: ParticipantIface[],\n): string[] => (author?.kind === ParticipantKind.User ? [author.id] : humanAudience(participants));\n\n// Reply, thread and quote context. A referenced message outside the\n// recent window is read by id, however old.\nconst replyContextFor = async (args: {\n platform: RoomPlatformIface;\n message: ConversationMessageIface;\n earlier: ConversationMessageIface[];\n participants: ParticipantIface[];\n}): Promise<ReplyContextArgsIface> => {\n const byId = new Map(args.earlier.map((message) => [message.messageId, message]));\n const referenced = [\n args.message.replyToMessageId,\n args.message.threadRootId,\n ...args.message.quotedMessageIds,\n ].flatMap((id) => (id == null || byId.has(id) ? [] : [id]));\n if (referenced.length > 0) {\n const found = await args.platform.conversations.getMessages({\n conversationId: args.message.conversationId,\n messageIds: [...new Set(referenced)],\n });\n for (const message of found) byId.set(message.messageId, message);\n }\n const replyTo =\n args.message.replyToMessageId == null\n ? null\n : (byId.get(args.message.replyToMessageId) ?? null);\n const root =\n args.message.threadRootId == null ? null : (byId.get(args.message.threadRootId) ?? null);\n const rootAuthor =\n root == null\n ? null\n : args.participants.find((participant) => participant.id === root.authorParticipantId);\n return {\n replyTo:\n replyTo == null || replyTo.messageId === root?.messageId\n ? null\n : messageRefOf(replyTo, args.participants),\n thread:\n args.message.threadRootId == null\n ? null\n : {\n rootMessageId: args.message.threadRootId,\n rootExcerpt: root == null ? '' : excerpt(messageSummary(root.content)),\n rootAuthor: rootAuthor == null ? null : finalAuthorOf(rootAuthor),\n },\n quotes: args.message.quotedMessageIds.flatMap((id) => {\n const quoted = byId.get(id);\n return quoted == null ? [] : [messageRefOf(quoted, args.participants)];\n }),\n };\n};\n\nexport const deliveryIdempotencyKey = (messageId: string, participantId: string): string =>\n `${messageId}:${participantId}`;\n\nexport const deliverMessage = async (\n args: DeliverMessageArgsIface,\n): Promise<DeliveryOutcomeIface[]> => {\n const { platform, conversation, message } = args;\n const participants =\n args.participants ?? (await platform.conversations.participants(conversation.conversationId));\n const decisions = await args.route({ conversation, message, participants });\n const author =\n participants.find((participant) => participant.id === message.authorParticipantId) ?? null;\n for (const participant of participants) {\n if (participant.kind !== ParticipantKind.Agent) continue;\n const decision = decisions.find((candidate) => candidate.participantId === participant.id);\n platform.log('channel route decision', {\n observed_at: new Date().toISOString(),\n organization_id: conversation.organizationId,\n conversation_id: conversation.conversationId,\n conversation_kind: conversation.kind,\n message_id: message.messageId,\n author_kind: author?.kind ?? '',\n participant_id: participant.id,\n routing_mode: participant.routingMode ?? '',\n delivery: decision?.delivery ?? 'skipped',\n reason: participant.left\n ? 'left conversation'\n : participant.id === message.authorParticipantId\n ? 'author'\n : decision == null\n ? 'not selected by route'\n : 'selected by route',\n hop_depth: message.hopDepth,\n });\n }\n if (decisions.length === 0) return [];\n const earlier = await platform.conversations.recentMessages({\n conversationId: conversation.conversationId,\n limit: CONTEXT_WINDOW_MESSAGES,\n beforeSeq: message.seq,\n });\n const replyContext = await replyContextFor({ platform, message, earlier, participants });\n const turnPolicy = effectiveTurnPolicy({\n channel: args.turnPolicy,\n conversation: conversation.turnPolicy,\n });\n const audience = audienceFor(author, participants);\n const authorParticipant: ParticipantIface = author ?? {\n id: message.authorParticipantId,\n kind: ParticipantKind.User,\n displayName: 'Someone',\n userId: null,\n definitionId: null,\n routingMode: null,\n sessionId: null,\n supportsObserve: null,\n rendersAuthorMeta: null,\n left: true,\n };\n\n const deliverOne = async (decision: RouteDecisionIface): Promise<DeliveryOutcomeIface> => {\n const recipient = participants.find((participant) => participant.id === decision.participantId);\n const base = { participantId: decision.participantId, delivery: decision.delivery };\n if (recipient == null) {\n return { ...base, sent: 'skipped', messageId: null, error: null };\n }\n const idempotencyKey = deliveryIdempotencyKey(message.messageId, recipient.id);\n const prompt = async (content: ContentBlock[], replyExpected: boolean): Promise<string> => {\n const result = await platform.sessions.prompt({\n participantId: recipient.id,\n content,\n turnPolicy,\n replyExpected,\n idempotencyKey,\n authorParticipantId: message.authorParticipantId,\n audienceParticipantIds: audience,\n sourceMessageId: message.messageId,\n });\n return result.messageId;\n };\n try {\n if (decision.delivery === Delivery.Prompt) {\n const content = buildPromptContent({\n message,\n author: authorParticipant,\n recipient,\n replyContext,\n catchUp: catchUpFor({ recipient, earlier, participants }),\n });\n return { ...base, sent: 'prompt', messageId: await prompt(content, true), error: null };\n }\n if (recipient.sessionId == null) {\n return { ...base, sent: 'skipped', messageId: null, error: null };\n }\n const contextBlock = renderReplyContext(replyContext);\n const content = [\n ...(contextBlock == null ? [] : [contextBlock]),\n ...authorPrefixedContent({\n content: message.content,\n author: finalAuthorOf(authorParticipant),\n rendersAuthorMeta: recipient.rendersAuthorMeta ?? false,\n context: finalContextOf(replyContext),\n }),\n ];\n if (recipient.supportsObserve === false) {\n if (message.hopDepth >= MAX_AGENT_HOP_DEPTH) {\n return { ...base, sent: 'skipped', messageId: null, error: null };\n }\n return {\n ...base,\n sent: 'silent-prompt',\n messageId: await prompt(content, false),\n error: null,\n };\n }\n await platform.sessions.observe({ participantId: recipient.id, content, idempotencyKey });\n return { ...base, sent: 'observe', messageId: null, error: null };\n } catch (error) {\n // JSON-RPC failures arrive as plain `{ code, message }` objects.\n const reason =\n error instanceof Error\n ? error.message\n : (thrownMessageSchema.safeParse(error).data?.message ?? String(error));\n platform.log('channel delivery failed', {\n conversationId: conversation.conversationId,\n messageId: message.messageId,\n participantId: recipient.id,\n delivery: decision.delivery,\n error: reason,\n });\n return { ...base, sent: 'failed', messageId: null, error: reason };\n }\n };\n\n return Promise.all(decisions.map(deliverOne));\n};\n\nexport interface ObserveNoticeArgsIface {\n platform: RoomPlatformIface;\n recipients: ParticipantIface[];\n text: string;\n idempotencyKey: string;\n}\n\n// System blocks with no model call. Agents without a session skip them (their\n// first prompt catches up); agents without observe support skip them too, since\n// a silent prompt per reaction is not worth a model call.\nexport const observeNotice = async (args: ObserveNoticeArgsIface): Promise<string[]> => {\n const delivered: string[] = [];\n for (const recipient of args.recipients) {\n if (recipient.sessionId == null || recipient.supportsObserve === false || recipient.left)\n continue;\n try {\n await args.platform.sessions.observe({\n participantId: recipient.id,\n content: [systemNoticeBlock({ text: args.text })],\n idempotencyKey: `${args.idempotencyKey}:${recipient.id}`,\n });\n delivered.push(recipient.id);\n } catch (error) {\n args.platform.log('channel notice failed', {\n participantId: recipient.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return delivered;\n};\n\nexport interface ReactionNoticeArgsIface {\n platform: RoomPlatformIface;\n participants: ParticipantIface[];\n message: ConversationMessageIface;\n // Whether the reacted message is the agent's latest one.\n isLatestOfAuthor: boolean;\n reactorParticipantId: string;\n emoji: string;\n eventId?: string;\n}\n\n// Only the agent whose message was reacted to hears about it.\nexport const reactionNotice = async (args: ReactionNoticeArgsIface): Promise<string[]> => {\n const author = args.participants.find(\n (participant) => participant.id === args.message.authorParticipantId,\n );\n const reactor = args.participants.find(\n (participant) => participant.id === args.reactorParticipantId,\n );\n if (\n author == null ||\n author.kind !== ParticipantKind.Agent ||\n reactor == null ||\n reactor.id === author.id\n ) {\n return [];\n }\n const target = args.isLatestOfAuthor\n ? 'your last message'\n : `your message \"${excerpt(messageSummary(args.message.content), 120)}\"`;\n const reactionId = `reaction:${args.message.messageId}:${reactor.id}:${args.emoji}`;\n return observeNotice({\n platform: args.platform,\n recipients: [author],\n text: `${reactor.displayName} reacted ${args.emoji} to ${target}`,\n idempotencyKey: args.eventId == null ? reactionId : `${reactionId}:${args.eventId}`,\n });\n};\n\nexport enum MembershipChange {\n Joined = 'joined',\n Left = 'left',\n}\n\nexport interface MembershipNoticeArgsIface {\n platform: RoomPlatformIface;\n participants: ParticipantIface[];\n subject: ParticipantIface;\n change: MembershipChange;\n idempotencyKey: string;\n}\n\n// Membership changes reach agents that follow the whole conversation.\nexport const membershipNotice = async (args: MembershipNoticeArgsIface): Promise<string[]> => {\n const recipients = args.participants.filter(\n (participant) =>\n participant.kind === ParticipantKind.Agent &&\n participant.id !== args.subject.id &&\n (participant.routingMode === RoutingMode.All ||\n participant.routingMode === RoutingMode.Default),\n );\n const verb = args.change === MembershipChange.Joined ? 'joined' : 'left';\n return observeNotice({\n platform: args.platform,\n recipients,\n text: `${args.subject.displayName} ${verb} the conversation`,\n idempotencyKey: args.idempotencyKey,\n });\n};\n"],
5
- "mappings": "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",
6
- "names": ["content", "MembershipChange"]
7
- }
@@ -1,5 +0,0 @@
1
- import type { RoomSurfaceDefinitionIface, JsonValue } from '@finalai/agent-provider';
2
- import { type MessagingChannelConfigIface } from "./messaging-channel.mjs";
3
- export type DirectMessagingChannelConfigIface = MessagingChannelConfigIface;
4
- export declare const DIRECT_MESSAGING_SPECIFIER = "@finalai/final-agent-provider/channels/direct-messaging";
5
- export declare const createDirectMessagingChannel: (config?: DirectMessagingChannelConfigIface) => RoomSurfaceDefinitionIface<JsonValue, JsonValue>;
@@ -1,8 +0,0 @@
1
- import { createMessagingChannel } from "./messaging-channel.mjs";
2
- const DIRECT_MESSAGING_SPECIFIER = "@finalai/final-agent-provider/channels/direct-messaging";
3
- const createDirectMessagingChannel = (config = {}) => createMessagingChannel(config);
4
- export {
5
- DIRECT_MESSAGING_SPECIFIER,
6
- createDirectMessagingChannel
7
- };
8
- //# sourceMappingURL=direct-messaging.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/channels/direct-messaging.ts"],
4
- "sourcesContent": ["import type { RoomSurfaceDefinitionIface, JsonValue } from '@finalai/agent-provider';\nimport { createMessagingChannel, type MessagingChannelConfigIface } from \"./messaging-channel.mjs\";\n\nexport type DirectMessagingChannelConfigIface = MessagingChannelConfigIface;\n\nexport const DIRECT_MESSAGING_SPECIFIER = '@finalai/final-agent-provider/channels/direct-messaging';\n\n// One user and one agent; every human message prompts the agent.\nexport const createDirectMessagingChannel = (\n config: DirectMessagingChannelConfigIface = {},\n): RoomSurfaceDefinitionIface<JsonValue, JsonValue> => createMessagingChannel(config);\n"],
5
- "mappings": "AACA,SAAS,8BAAgE;AAIlE,MAAM,6BAA6B;AAGnC,MAAM,+BAA+B,CAC1C,SAA4C,CAAC,MACQ,uBAAuB,MAAM;",
6
- "names": []
7
- }
@@ -1,36 +0,0 @@
1
- import { ConversationKind, ParticipantKind, TurnPolicy, type RoomPlatformIface, type ConversationIface, type ConversationMessageIface, type JsonObject, type ObserveArgsIface, type ParticipantIface, type PromptArgsIface } from '@finalai/agent-provider';
2
- export interface FakeMessageIface extends ConversationMessageIface {
3
- final: boolean;
4
- updates: number;
5
- source: {
6
- turnId: string;
7
- fromSeq: number;
8
- toSeq: number;
9
- } | null;
10
- }
11
- export interface FakeCardIface {
12
- messageId: string;
13
- decisionId: string | null;
14
- state: JsonObject;
15
- }
16
- export interface FakePlatformIface {
17
- platform: RoomPlatformIface;
18
- conversations: Map<string, ConversationIface>;
19
- participants: Map<string, ParticipantIface[]>;
20
- messages: FakeMessageIface[];
21
- cards: FakeCardIface[];
22
- prompts: PromptArgsIface[];
23
- observes: ObserveArgsIface[];
24
- logs: string[];
25
- getMessagesCalls: string[][];
26
- addConversation(args: {
27
- conversationId: string;
28
- kind: ConversationKind;
29
- turnPolicy?: TurnPolicy;
30
- }): ConversationIface;
31
- addParticipant(conversationId: string, participant: Partial<ParticipantIface> & {
32
- id: string;
33
- kind: ParticipantKind;
34
- }): ParticipantIface;
35
- }
36
- export declare const createFakePlatform: () => FakePlatformIface;
@@ -1,168 +0,0 @@
1
- import {
2
- ConversationKind,
3
- MessageKind,
4
- ParticipantKind,
5
- TurnPolicy
6
- } from "@finalai/agent-provider";
7
- import { routeToParticipant } from "./routing.mjs";
8
- import { deliverMessage } from "./delivery.mjs";
9
- import { messageSummary } from "./prompt.mjs";
10
- import { routeMessage } from "./routing.mjs";
11
- const createFakePlatform = () => {
12
- const conversations = /* @__PURE__ */ new Map();
13
- const participants = /* @__PURE__ */ new Map();
14
- const messages = [];
15
- const cards = [];
16
- const prompts = [];
17
- const observes = [];
18
- const logs = [];
19
- const getMessagesCalls = [];
20
- let nextId = 1;
21
- const addConversation = (args) => {
22
- const conversation = {
23
- conversationId: args.conversationId,
24
- organizationId: "org",
25
- kind: args.kind,
26
- title: null,
27
- isHome: false,
28
- turnPolicy: args.turnPolicy ?? TurnPolicy.Steer
29
- };
30
- conversations.set(args.conversationId, conversation);
31
- participants.set(args.conversationId, []);
32
- return conversation;
33
- };
34
- const addParticipant = (conversationId, partial) => {
35
- const participant = {
36
- displayName: partial.id,
37
- userId: null,
38
- definitionId: null,
39
- routingMode: null,
40
- sessionId: partial.kind === ParticipantKind.Agent ? `session-${partial.id}` : null,
41
- supportsObserve: partial.kind === ParticipantKind.Agent ? true : null,
42
- rendersAuthorMeta: partial.kind === ParticipantKind.Agent ? true : null,
43
- left: false,
44
- ...partial
45
- };
46
- participants.get(conversationId)?.push(participant);
47
- return participant;
48
- };
49
- const nextSeq = (conversationId) => messages.filter((message) => message.conversationId === conversationId).length + 1;
50
- const insert = (args) => {
51
- const message = {
52
- messageId: `m${nextId++}`,
53
- seq: nextSeq(args.conversationId),
54
- conversationId: args.conversationId,
55
- authorParticipantId: args.authorParticipantId,
56
- kind: args.kind,
57
- body: messageSummary(args.content),
58
- content: args.content,
59
- replyToMessageId: args.replyToMessageId ?? null,
60
- threadRootId: args.threadRootId ?? null,
61
- quotedMessageIds: args.quotedMessageIds ?? [],
62
- mentionedParticipantIds: args.mentionedParticipantIds ?? [],
63
- hopDepth: args.hopDepth ?? 0,
64
- createdAt: (/* @__PURE__ */ new Date(0)).toISOString(),
65
- final: args.source == null,
66
- updates: 0,
67
- source: args.source ?? null
68
- };
69
- messages.push(message);
70
- return message;
71
- };
72
- const platform = {
73
- conversations: {
74
- dispatchMessage: async (input) => {
75
- const room = conversations.get(input.conversationId);
76
- const message = messages.find((entry) => entry.messageId === input.messageId);
77
- if (room == null || message == null) throw new Error("dispatch source missing");
78
- await deliverMessage({
79
- platform,
80
- conversation: room,
81
- message,
82
- turnPolicy: room.turnPolicy,
83
- route: input.participantId == null ? routeMessage : routeToParticipant(input.participantId)
84
- });
85
- },
86
- get: async (conversationId) => conversations.get(conversationId) ?? null,
87
- participants: async (conversationId) => participants.get(conversationId) ?? [],
88
- postMessage: async (args) => {
89
- if (args.clientMessageId != null) {
90
- const existing = messages.find(
91
- (message) => message.conversationId === args.conversationId && message.messageId === args.clientMessageId
92
- );
93
- if (existing != null) return existing;
94
- }
95
- return insert({ ...args, kind: args.kind ?? MessageKind.Message });
96
- },
97
- updateMessage: async (args) => {
98
- const message = messages.find((candidate) => candidate.messageId === args.messageId);
99
- if (message == null) throw new Error(`no message ${args.messageId}`);
100
- message.content = args.content;
101
- message.body = messageSummary(args.content);
102
- message.final = args.final;
103
- message.updates += 1;
104
- },
105
- postCard: async (args) => {
106
- const message = insert({
107
- conversationId: args.conversationId,
108
- authorParticipantId: args.authorParticipantId,
109
- kind: MessageKind.Card,
110
- content: []
111
- });
112
- cards.push({
113
- messageId: message.messageId,
114
- decisionId: args.decisionId,
115
- state: args.state
116
- });
117
- return message;
118
- },
119
- updateCard: async (args) => {
120
- const card = cards.find(
121
- (candidate) => candidate.messageId === args.messageId || candidate.decisionId === args.messageId
122
- );
123
- if (card == null) throw new Error(`no card ${args.messageId}`);
124
- card.state = { ...card.state, ...args.state };
125
- },
126
- recentMessages: async (args) => messages.filter(
127
- (message) => message.conversationId === args.conversationId && (args.beforeSeq == null || message.seq < args.beforeSeq) && (args.afterSeq == null || message.seq > args.afterSeq)
128
- ).slice(-args.limit),
129
- getMessages: async (args) => {
130
- getMessagesCalls.push(args.messageIds);
131
- return messages.filter(
132
- (message) => message.conversationId === args.conversationId && args.messageIds.includes(message.messageId)
133
- );
134
- }
135
- },
136
- sessions: {
137
- prompt: async (args) => {
138
- prompts.push(args);
139
- return { messageId: `acp-${prompts.length}` };
140
- },
141
- observe: async (args) => {
142
- observes.push(args);
143
- },
144
- cancel: async () => {
145
- }
146
- },
147
- log: (message) => {
148
- logs.push(message);
149
- }
150
- };
151
- return {
152
- platform,
153
- conversations,
154
- participants,
155
- messages,
156
- cards,
157
- prompts,
158
- observes,
159
- logs,
160
- getMessagesCalls,
161
- addConversation,
162
- addParticipant
163
- };
164
- };
165
- export {
166
- createFakePlatform
167
- };
168
- //# sourceMappingURL=fake-platform.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/channels/fake-platform.ts"],
4
- "sourcesContent": ["import type { ContentBlock } from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n ConversationKind,\n MessageKind,\n ParticipantKind,\n TurnPolicy,\n type CardArgsIface,\n type RoomPlatformIface,\n type ConversationIface,\n type ConversationMessageIface,\n type JsonObject,\n type ObserveArgsIface,\n type ParticipantIface,\n type PromptArgsIface,\n} from '@finalai/agent-provider';\nimport { routeToParticipant } from \"./routing.mjs\";\nimport { deliverMessage } from \"./delivery.mjs\";\nimport { messageSummary } from \"./prompt.mjs\";\nimport { routeMessage } from \"./routing.mjs\";\n\n// An in-memory RoomPlatformIface for channel tests (not exported from the\n// package index). Records every prompt, observe, channel input and\n// visible-message write.\n\nexport interface FakeMessageIface extends ConversationMessageIface {\n final: boolean;\n updates: number;\n source: { turnId: string; fromSeq: number; toSeq: number } | null;\n}\n\nexport interface FakeCardIface {\n messageId: string;\n decisionId: string | null;\n state: JsonObject;\n}\n\nexport interface FakePlatformIface {\n platform: RoomPlatformIface;\n conversations: Map<string, ConversationIface>;\n participants: Map<string, ParticipantIface[]>;\n messages: FakeMessageIface[];\n cards: FakeCardIface[];\n prompts: PromptArgsIface[];\n observes: ObserveArgsIface[];\n logs: string[];\n // The message ids of each getMessages call.\n getMessagesCalls: string[][];\n addConversation(args: {\n conversationId: string;\n kind: ConversationKind;\n turnPolicy?: TurnPolicy;\n }): ConversationIface;\n addParticipant(\n conversationId: string,\n participant: Partial<ParticipantIface> & { id: string; kind: ParticipantKind },\n ): ParticipantIface;\n}\n\nexport const createFakePlatform = (): FakePlatformIface => {\n const conversations = new Map<string, ConversationIface>();\n const participants = new Map<string, ParticipantIface[]>();\n const messages: FakeMessageIface[] = [];\n const cards: FakeCardIface[] = [];\n const prompts: PromptArgsIface[] = [];\n const observes: ObserveArgsIface[] = [];\n const logs: string[] = [];\n const getMessagesCalls: string[][] = [];\n let nextId = 1;\n\n const addConversation: FakePlatformIface['addConversation'] = (args) => {\n const conversation: ConversationIface = {\n conversationId: args.conversationId,\n organizationId: 'org',\n kind: args.kind,\n title: null,\n isHome: false,\n turnPolicy: args.turnPolicy ?? TurnPolicy.Steer,\n };\n conversations.set(args.conversationId, conversation);\n participants.set(args.conversationId, []);\n return conversation;\n };\n\n const addParticipant: FakePlatformIface['addParticipant'] = (conversationId, partial) => {\n const participant: ParticipantIface = {\n displayName: partial.id,\n userId: null,\n definitionId: null,\n routingMode: null,\n sessionId: partial.kind === ParticipantKind.Agent ? `session-${partial.id}` : null,\n supportsObserve: partial.kind === ParticipantKind.Agent ? true : null,\n rendersAuthorMeta: partial.kind === ParticipantKind.Agent ? true : null,\n left: false,\n ...partial,\n };\n participants.get(conversationId)?.push(participant);\n return participant;\n };\n\n const nextSeq = (conversationId: string): number =>\n messages.filter((message) => message.conversationId === conversationId).length + 1;\n\n const insert = (args: {\n conversationId: string;\n authorParticipantId: string;\n kind: MessageKind;\n content: ContentBlock[];\n replyToMessageId?: string | null;\n threadRootId?: string | null;\n quotedMessageIds?: string[];\n mentionedParticipantIds?: string[];\n hopDepth?: number;\n source?: FakeMessageIface['source'];\n }): FakeMessageIface => {\n const message: FakeMessageIface = {\n messageId: `m${nextId++}`,\n seq: nextSeq(args.conversationId),\n conversationId: args.conversationId,\n authorParticipantId: args.authorParticipantId,\n kind: args.kind,\n body: messageSummary(args.content),\n content: args.content,\n replyToMessageId: args.replyToMessageId ?? null,\n threadRootId: args.threadRootId ?? null,\n quotedMessageIds: args.quotedMessageIds ?? [],\n mentionedParticipantIds: args.mentionedParticipantIds ?? [],\n hopDepth: args.hopDepth ?? 0,\n createdAt: new Date(0).toISOString(),\n final: args.source == null,\n updates: 0,\n source: args.source ?? null,\n };\n messages.push(message);\n return message;\n };\n\n const platform: RoomPlatformIface = {\n conversations: {\n dispatchMessage: async (input) => {\n const room = conversations.get(input.conversationId);\n const message = messages.find((entry) => entry.messageId === input.messageId);\n if (room == null || message == null) throw new Error('dispatch source missing');\n await deliverMessage({\n platform,\n conversation: room,\n message,\n turnPolicy: room.turnPolicy,\n route:\n input.participantId == null ? routeMessage : routeToParticipant(input.participantId),\n });\n },\n get: async (conversationId) => conversations.get(conversationId) ?? null,\n participants: async (conversationId) => participants.get(conversationId) ?? [],\n postMessage: async (args) => {\n if (args.clientMessageId != null) {\n const existing = messages.find(\n (message) =>\n message.conversationId === args.conversationId &&\n message.messageId === args.clientMessageId,\n );\n if (existing != null) return existing;\n }\n return insert({ ...args, kind: args.kind ?? MessageKind.Message });\n },\n updateMessage: async (args) => {\n const message = messages.find((candidate) => candidate.messageId === args.messageId);\n if (message == null) throw new Error(`no message ${args.messageId}`);\n message.content = args.content;\n message.body = messageSummary(args.content);\n message.final = args.final;\n message.updates += 1;\n },\n postCard: async (args: CardArgsIface) => {\n const message = insert({\n conversationId: args.conversationId,\n authorParticipantId: args.authorParticipantId,\n kind: MessageKind.Card,\n content: [],\n });\n cards.push({\n messageId: message.messageId,\n decisionId: args.decisionId,\n state: args.state,\n });\n return message;\n },\n updateCard: async (args) => {\n const card = cards.find(\n (candidate) =>\n candidate.messageId === args.messageId || candidate.decisionId === args.messageId,\n );\n if (card == null) throw new Error(`no card ${args.messageId}`);\n card.state = { ...card.state, ...args.state };\n },\n recentMessages: async (args) =>\n messages\n .filter(\n (message) =>\n message.conversationId === args.conversationId &&\n (args.beforeSeq == null || message.seq < args.beforeSeq) &&\n (args.afterSeq == null || message.seq > args.afterSeq),\n )\n .slice(-args.limit),\n getMessages: async (args) => {\n getMessagesCalls.push(args.messageIds);\n return messages.filter(\n (message) =>\n message.conversationId === args.conversationId &&\n args.messageIds.includes(message.messageId),\n );\n },\n },\n sessions: {\n prompt: async (args) => {\n prompts.push(args);\n return { messageId: `acp-${prompts.length}` };\n },\n observe: async (args) => {\n observes.push(args);\n },\n cancel: async () => {},\n },\n log: (message) => {\n logs.push(message);\n },\n };\n\n return {\n platform,\n conversations,\n participants,\n messages,\n cards,\n prompts,\n observes,\n logs,\n getMessagesCalls,\n addConversation,\n addParticipant,\n };\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,5 +0,0 @@
1
- import type { RoomSurfaceDefinitionIface, JsonValue } from '@finalai/agent-provider';
2
- import { type MessagingChannelConfigIface } from "./messaging-channel.mjs";
3
- export type GroupMessagingChannelConfigIface = MessagingChannelConfigIface;
4
- export declare const GROUP_MESSAGING_SPECIFIER = "@finalai/final-agent-provider/channels/group-messaging";
5
- export declare const createGroupMessagingChannel: (config?: GroupMessagingChannelConfigIface) => RoomSurfaceDefinitionIface<JsonValue, JsonValue>;
@@ -1,8 +0,0 @@
1
- import { createMessagingChannel } from "./messaging-channel.mjs";
2
- const GROUP_MESSAGING_SPECIFIER = "@finalai/final-agent-provider/channels/group-messaging";
3
- const createGroupMessagingChannel = (config = {}) => createMessagingChannel(config);
4
- export {
5
- GROUP_MESSAGING_SPECIFIER,
6
- createGroupMessagingChannel
7
- };
8
- //# sourceMappingURL=group-messaging.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/channels/group-messaging.ts"],
4
- "sourcesContent": ["import type { RoomSurfaceDefinitionIface, JsonValue } from '@finalai/agent-provider';\nimport { createMessagingChannel, type MessagingChannelConfigIface } from \"./messaging-channel.mjs\";\n\nexport type GroupMessagingChannelConfigIface = MessagingChannelConfigIface;\n\nexport const GROUP_MESSAGING_SPECIFIER = '@finalai/final-agent-provider/channels/group-messaging';\n\n// N users and M agents; routing modes and mentions decide prompt or observe.\nexport const createGroupMessagingChannel = (\n config: GroupMessagingChannelConfigIface = {},\n): RoomSurfaceDefinitionIface<JsonValue, JsonValue> => createMessagingChannel(config);\n"],
5
- "mappings": "AACA,SAAS,8BAAgE;AAIlE,MAAM,4BAA4B;AAGlC,MAAM,8BAA8B,CACzC,SAA2C,CAAC,MACS,uBAAuB,MAAM;",
6
- "names": []
7
- }