@finalai/final-agent-provider 0.2.2 → 0.3.2

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 (29) hide show
  1. package/dist/modules/channel-factories.d.mts +3 -1
  2. package/dist/modules/channel-factories.mjs +32 -18
  3. package/dist/modules/channel-factories.mjs.map +2 -2
  4. package/dist/modules/channels/address-context.mjs +16 -53
  5. package/dist/modules/channels/address-context.mjs.map +3 -3
  6. package/dist/modules/channels/agent-events.d.mts +3 -29
  7. package/dist/modules/channels/agent-events.mjs +67 -146
  8. package/dist/modules/channels/agent-events.mjs.map +3 -3
  9. package/dist/modules/channels/agent-schedules.d.mts +1 -0
  10. package/dist/modules/channels/agent-schedules.mjs +18 -19
  11. package/dist/modules/channels/agent-schedules.mjs.map +2 -2
  12. package/dist/modules/channels/delivery.d.mts +1 -1
  13. package/dist/modules/channels/delivery.mjs +5 -23
  14. package/dist/modules/channels/delivery.mjs.map +2 -2
  15. package/dist/modules/channels/fake-platform.d.mts +6 -1
  16. package/dist/modules/channels/fake-platform.mjs +31 -12
  17. package/dist/modules/channels/fake-platform.mjs.map +2 -2
  18. package/dist/modules/channels/index.d.mts +1 -0
  19. package/dist/modules/channels/index.mjs +1 -0
  20. package/dist/modules/channels/index.mjs.map +2 -2
  21. package/dist/modules/channels/prompt.d.mts +19 -2
  22. package/dist/modules/channels/prompt.mjs +44 -17
  23. package/dist/modules/channels/prompt.mjs.map +2 -2
  24. package/dist/modules/channels/routing.mjs +1 -15
  25. package/dist/modules/channels/routing.mjs.map +2 -2
  26. package/dist/modules/channels/service-input.d.mts +22 -0
  27. package/dist/modules/channels/service-input.mjs +32 -0
  28. package/dist/modules/channels/service-input.mjs.map +7 -0
  29. package/package.json +5 -5
@@ -1,5 +1,6 @@
1
1
  import type { SessionUpdate } from '@agentclientprotocol/sdk/experimental/v2';
2
- import { TurnPolicy, type ChannelAddressContextIface, type ChannelAuthIface, type ChannelDefinitionIface, type ChannelInputResponseIface, type ChannelMessageCompletedDataIface, type ChannelMessageDeltaDataIface, type ChannelReceiveContextIface, type ChannelTurnEventDataIface, type ChannelTurnStateIface, type ConversationMessageIface, type JsonValue, type PendingCreatedDataIface, type PendingResolvedDataIface } from '@finalai/agent-provider';
2
+ import { TurnPolicy, type ChannelAddressContextIface, type ChannelAuthIface, type ChannelDefinitionIface, type ChannelInputReceiptIface, type ChannelInputResponseIface, type ChannelMessageCompletedDataIface, type ChannelMessageDeltaDataIface, type ChannelReceiveContextIface, type ChannelTurnEventDataIface, type ChannelTurnStateIface, type ConversationMessageIface, type JsonValue, type PendingCreatedDataIface, type PendingResolvedDataIface } from '@finalai/agent-provider';
3
+ import { type ServiceInputArgsIface } from "./channels/service-input.mjs";
3
4
  export declare const FINAL_CHANNEL_SPECIFIER = "@finalai/final-agent-provider/channels/final";
4
5
  export { ChannelPrincipalType, type ChannelAuthIface } from '@finalai/agent-provider';
5
6
  export interface ChannelAdmissionIface {
@@ -13,6 +14,7 @@ export interface FinalMessageContextIface extends ChannelReceiveContextIface, Ch
13
14
  export interface FinalChannelContextIface extends ChannelAddressContextIface {
14
15
  final: {
15
16
  post(message: ChannelMessageCompletedDataIface['message']): Promise<ConversationMessageIface>;
17
+ sendServiceInput(args: ServiceInputArgsIface): Promise<ChannelInputReceiptIface>;
16
18
  };
17
19
  }
18
20
  export interface FinalSessionContextIface {
@@ -16,6 +16,7 @@ import { finalAddressContext } from "./channels/address-context.mjs";
16
16
  import { contentBlocksOf } from "./channels/content.mjs";
17
17
  import { conversationEventInboundSchema, messageInboundSchema } from "./channels/inbound.mjs";
18
18
  import { createMessagingChannel } from "./channels/messaging-channel.mjs";
19
+ import { sendServiceInput } from "./channels/service-input.mjs";
19
20
  const FINAL_CHANNEL_SPECIFIER = "@finalai/final-agent-provider/channels/final";
20
21
  import { ChannelPrincipalType as ChannelPrincipalType2 } from "@finalai/agent-provider";
21
22
  const admissionSchema = z.object({
@@ -29,14 +30,29 @@ const optionsSchema = z.object({
29
30
  });
30
31
  const defaultAuthOf = (author) => {
31
32
  if (author == null) return null;
32
- const principalId = author.userId ?? author.servicePrincipalId ?? author.definitionId ?? author.id;
33
33
  return {
34
- principalId,
34
+ principalId: author.userId ?? author.definitionId ?? author.id,
35
35
  principalType: author.userId == null ? ChannelPrincipalType.Service : ChannelPrincipalType.User,
36
36
  authenticator: "final",
37
+ displayName: author.displayName,
37
38
  attributes: { participant_id: author.id }
38
39
  };
39
40
  };
41
+ const handoffSchema = z.object({
42
+ target: z.object({
43
+ conversationId: z.string().min(1),
44
+ participantId: z.string().min(1).optional()
45
+ }),
46
+ content: z.array(jsonObjectSchema).min(1),
47
+ idempotencyKey: z.string().min(1),
48
+ auth: channelAuthSchema,
49
+ context: z.array(z.string()).optional(),
50
+ title: z.string().optional(),
51
+ actingUserId: z.string().min(1).optional(),
52
+ originTurnId: z.string().min(1).optional(),
53
+ source: z.object({ label: z.string().min(1) }).optional(),
54
+ turnPolicy: z.nativeEnum(TurnPolicy).optional()
55
+ });
40
56
  const finalChannel = (inputOptions = {}) => {
41
57
  const options = {
42
58
  ...inputOptions,
@@ -66,22 +82,19 @@ const finalChannel = (inputOptions = {}) => {
66
82
  const base = createMessagingChannel({ ...config, route: options.route });
67
83
  const receive = async (input, ctx) => {
68
84
  if (conversationEventInboundSchema.safeParse(input).success) return base.receive(input, ctx);
69
- const handoff = z.object({
70
- target: z.string(),
71
- content: z.array(jsonObjectSchema),
72
- idempotencyKey: z.string(),
73
- auth: channelAuthSchema.nullable(),
74
- context: z.array(z.string()).optional(),
75
- title: z.string().optional()
76
- }).safeParse(input);
85
+ const handoff = handoffSchema.safeParse(input);
77
86
  if (handoff.success) {
78
- if (ctx.definitionId == null) throw new Error("Final channel has no agent definition");
79
- await finalAddressContext({
80
- platform: ctx.platform,
81
- definitionId: ctx.definitionId,
82
- turnPolicy: config.turnPolicy
83
- }).from(handoff.data.target).send({ ...handoff.data, content: contentBlocksOf(handoff.data.content) });
84
- return { conversationId: handoff.data.target };
87
+ if (ctx.platform.channelSessions == null)
88
+ throw new Error("channel session operations are unavailable");
89
+ const { target, ...rest } = handoff.data;
90
+ await ctx.platform.channelSessions.send(target, {
91
+ ...rest,
92
+ content: contentBlocksOf(rest.content),
93
+ source: rest.source,
94
+ // The sender's policy, else the receiving channel's.
95
+ turnPolicy: rest.turnPolicy ?? config.turnPolicy
96
+ });
97
+ return { conversationId: target.conversationId };
85
98
  }
86
99
  const parsed = messageInboundSchema.parse(input);
87
100
  const participants = ctx.participants ?? await ctx.platform.conversations.participants(parsed.conversationId);
@@ -155,7 +168,8 @@ const finalChannel = (inputOptions = {}) => {
155
168
  messageId: posted.messageId
156
169
  });
157
170
  return posted;
158
- }
171
+ },
172
+ sendServiceInput: (input) => sendServiceInput(ctx.platform, input)
159
173
  }
160
174
  };
161
175
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/channel-factories.ts"],
4
- "sourcesContent": ["import type { ContentBlock, SessionUpdate } from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n ChannelPrincipalType,\n SemanticChannelEventKind,\n TurnPolicy,\n channelAccessors,\n channelAuthSchema,\n channelMessageCompletedSchema,\n defineChannel,\n jsonObjectSchema,\n packageRef,\n pendingCreatedDataSchema,\n pendingResolvedDataSchema,\n type ChannelAddressContextIface,\n type ChannelAuthIface,\n type ChannelDefinitionIface,\n type ChannelEventHandler,\n type ChannelInputResponseIface,\n type ChannelMessageCompletedDataIface,\n type ChannelMessageDeltaDataIface,\n type ChannelReceiveContextIface,\n type ChannelTurnEventDataIface,\n type ChannelTurnStateIface,\n type ConversationMessageIface,\n type JsonValue,\n type PendingCreatedDataIface,\n type PendingResolvedDataIface,\n type ProjectionContextIface,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport { finalAddressContext } from \"./channels/address-context.mjs\";\nimport { contentBlocksOf } from \"./channels/content.mjs\";\nimport { conversationEventInboundSchema, messageInboundSchema } from \"./channels/inbound.mjs\";\nimport { createMessagingChannel } from \"./channels/messaging-channel.mjs\";\n\nexport const FINAL_CHANNEL_SPECIFIER = '@finalai/final-agent-provider/channels/final';\n\nexport { ChannelPrincipalType, type ChannelAuthIface } from '@finalai/agent-provider';\n\nexport interface ChannelAdmissionIface {\n auth: ChannelAuthIface | null;\n context?: string[];\n title?: string;\n}\n\nexport interface FinalMessageContextIface\n extends ChannelReceiveContextIface, ChannelAddressContextIface {\n defaultAuth: ChannelAuthIface | null;\n}\n\nexport interface FinalChannelContextIface extends ChannelAddressContextIface {\n final: {\n post(message: ChannelMessageCompletedDataIface['message']): Promise<ConversationMessageIface>;\n };\n}\nexport interface FinalSessionContextIface {\n sessionId: string | null;\n turnId: string;\n state: ChannelTurnStateIface<JsonValue>;\n}\nexport type FinalChannelEventHandler<Data> = (\n data: Data,\n channel: FinalChannelContextIface,\n ctx: FinalSessionContextIface,\n) => void | Promise<void>;\nexport interface FinalChannelEventHandlersIface {\n 'message.delta'?: FinalChannelEventHandler<ChannelMessageDeltaDataIface>;\n 'message.completed'?: FinalChannelEventHandler<ChannelMessageCompletedDataIface>;\n 'turn.started'?: FinalChannelEventHandler<ChannelTurnEventDataIface>;\n 'turn.completed'?: FinalChannelEventHandler<ChannelTurnEventDataIface>;\n 'pending.created'?: FinalChannelEventHandler<PendingCreatedDataIface>;\n 'pending.resolved'?: FinalChannelEventHandler<PendingResolvedDataIface>;\n}\n\nexport interface FinalChannelOptionsIface {\n turnPolicy?: TurnPolicy | `${TurnPolicy}`;\n updateIntervalMs?: number;\n route?: ChannelDefinitionIface<JsonValue, JsonValue>['route'];\n onMessage?: (\n ctx: FinalMessageContextIface,\n message: ConversationMessageIface,\n ) => ChannelAdmissionIface | null | Promise<ChannelAdmissionIface | null>;\n onInputResponse?: (\n ctx: FinalMessageContextIface,\n response: ChannelInputResponseIface,\n ) => ChannelAdmissionIface | null | Promise<ChannelAdmissionIface | null>;\n events?: FinalChannelEventHandlersIface;\n renderer?: (\n update: SessionUpdate,\n channel: FinalChannelContextIface,\n ctx: FinalSessionContextIface,\n next: () => Promise<void>,\n ) => void | Promise<void>;\n}\n\nconst admissionSchema = z.object({\n auth: channelAuthSchema.nullable(),\n context: z.array(z.string()).optional(),\n title: z.string().optional(),\n});\n\nconst optionsSchema = z.object({\n turnPolicy: z.nativeEnum(TurnPolicy).default(TurnPolicy.Steer),\n updateIntervalMs: z.number().finite().nonnegative().optional(),\n});\n\nconst defaultAuthOf = (\n author: import('@finalai/agent-provider').ParticipantIface | undefined,\n): ChannelAuthIface | null => {\n if (author == null) return null;\n const principalId =\n author.userId ?? author.servicePrincipalId ?? author.definitionId ?? author.id;\n return {\n principalId,\n principalType: author.userId == null ? ChannelPrincipalType.Service : ChannelPrincipalType.User,\n authenticator: 'final',\n attributes: { participant_id: author.id },\n };\n};\n\nexport const finalChannel = (\n inputOptions: FinalChannelOptionsIface = {},\n): ChannelDefinitionIface<JsonValue, JsonValue> => {\n const options = {\n ...inputOptions,\n events: inputOptions.events == null ? undefined : { ...inputOptions.events },\n };\n const callbacks = {\n onMessage: options.onMessage,\n onInputResponse: options.onInputResponse,\n renderer: options.renderer,\n route: options.route,\n ...options.events,\n };\n for (const [name, callback] of Object.entries(callbacks))\n if (callback != null && !z.function().safeParse(callback).success)\n throw new Error(`Final channel ${name} must be a function`);\n const supportedEvents = new Set([\n 'message.delta',\n 'message.completed',\n 'turn.started',\n 'turn.completed',\n 'pending.created',\n 'pending.resolved',\n ]);\n for (const kind of Object.keys(options.events ?? {}))\n if (!supportedEvents.has(kind)) throw new Error(`unsupported Final channel event: ${kind}`);\n const config = optionsSchema.parse(options);\n const base = createMessagingChannel({ ...config, route: options.route });\n const receive: typeof base.receive = async (input, ctx) => {\n if (conversationEventInboundSchema.safeParse(input).success) return base.receive(input, ctx);\n const handoff = z\n .object({\n target: z.string(),\n content: z.array(jsonObjectSchema),\n idempotencyKey: z.string(),\n auth: channelAuthSchema.nullable(),\n context: z.array(z.string()).optional(),\n title: z.string().optional(),\n })\n .safeParse(input);\n if (handoff.success) {\n if (ctx.definitionId == null) throw new Error('Final channel has no agent definition');\n await finalAddressContext({\n platform: ctx.platform,\n definitionId: ctx.definitionId,\n turnPolicy: config.turnPolicy,\n })\n .from(handoff.data.target)\n .send({ ...handoff.data, content: contentBlocksOf(handoff.data.content) });\n return { conversationId: handoff.data.target };\n }\n const parsed = messageInboundSchema.parse(input);\n const participants =\n ctx.participants ?? (await ctx.platform.conversations.participants(parsed.conversationId));\n const author = participants.find(\n (participant) => participant.id === parsed.authorParticipantId,\n );\n const message =\n ctx.message ??\n (await ctx.platform.conversations.postMessage({\n ...parsed,\n content: contentBlocksOf(parsed.content),\n }));\n if (ctx.definitionId == null) throw new Error('Final channel has no agent definition');\n const messageContext: FinalMessageContextIface = {\n ...ctx,\n ...finalAddressContext({\n platform: ctx.platform,\n definitionId: ctx.definitionId,\n turnPolicy: config.turnPolicy,\n }),\n defaultAuth: defaultAuthOf(author),\n };\n const accepted =\n options.onMessage == null\n ? { auth: messageContext.defaultAuth }\n : await options.onMessage(messageContext, message);\n const admission = accepted == null ? null : admissionSchema.parse(accepted);\n if (admission == null) return { conversationId: parsed.conversationId };\n const context = admission.context ?? [];\n const injected: ContentBlock[] = context.map((text) => ({ type: 'text', text }));\n return base.receive(\n {\n ...parsed,\n content: [...context.map((text) => ({ type: 'text', text })), ...parsed.content],\n },\n {\n ...ctx,\n platform: {\n ...ctx.platform,\n sessions: {\n ...ctx.platform.sessions,\n prompt: (args) =>\n ctx.platform.sessions.prompt({\n ...args,\n auth: admission.auth,\n title: admission.title,\n }),\n },\n },\n message: { ...message, content: [...injected, ...message.content] },\n },\n );\n };\n const channelContext = (ctx: ProjectionContextIface): FinalChannelContextIface => {\n const { conversation, agentParticipant } = ctx;\n if (conversation == null || agentParticipant == null || agentParticipant.definitionId == null)\n throw new Error('Final platform context requires a Final conversation');\n return {\n ...finalAddressContext({\n platform: ctx.platform,\n definitionId: agentParticipant.definitionId,\n turnPolicy: config.turnPolicy,\n }),\n final: {\n post: async (message) => {\n if (ctx.platform.conversations.dispatchMessage == null)\n throw new Error('channel dispatch is unavailable');\n const posted = await ctx.platform.conversations.postMessage({\n conversationId: conversation.conversationId,\n authorParticipantId: agentParticipant.id,\n content: contentBlocksOf(message.content),\n clientMessageId: `channel:${ctx.turn.id}:${message.id}`,\n originTurnId: ctx.turn.id,\n });\n await ctx.platform.conversations.dispatchMessage({\n conversationId: posted.conversationId,\n messageId: posted.messageId,\n });\n return posted;\n },\n },\n };\n };\n const sessionContext = (ctx: ProjectionContextIface): FinalSessionContextIface => ({\n sessionId: ctx.sessionId ?? null,\n turnId: ctx.turn.id,\n state: ctx.state,\n });\n const wrap = <Data>(\n schema: z.ZodType<Data>,\n handler: FinalChannelEventHandler<Data> | undefined,\n ): ChannelEventHandler | undefined =>\n handler == null\n ? undefined\n : async (event, ctx) =>\n handler(schema.parse(event.data), channelContext(ctx), sessionContext(ctx));\n const authoredEvents = {\n [SemanticChannelEventKind.MessageCompleted]: wrap(\n channelMessageCompletedSchema,\n options.events?.['message.completed'],\n ),\n [SemanticChannelEventKind.MessageDelta]: wrap(\n z.object({ messageId: z.string(), delta: jsonObjectSchema }),\n options.events?.['message.delta'],\n ),\n [SemanticChannelEventKind.TurnStarted]: wrap(\n z.object({ turnId: z.string() }),\n options.events?.['turn.started'],\n ),\n [SemanticChannelEventKind.TurnCompleted]: wrap(\n z.object({ turnId: z.string(), stopReason: z.string().nullable() }),\n options.events?.['turn.completed'],\n ),\n 'pending.created': wrap(pendingCreatedDataSchema, options.events?.['pending.created']),\n 'pending.resolved': wrap(pendingResolvedDataSchema, options.events?.['pending.resolved']),\n };\n const events = { ...base.events };\n for (const [kind, handler] of Object.entries(authoredEvents))\n if (handler != null) events[kind] = handler;\n return Object.freeze(\n defineChannel({\n ...base,\n config: jsonObjectSchema.parse(config),\n installed:\n options.onMessage == null &&\n options.onInputResponse == null &&\n options.events == null &&\n options.renderer == null &&\n options.route == null\n ? packageRef(FINAL_CHANNEL_SPECIFIER)\n : undefined,\n configure: (next) =>\n finalChannel({ ...options, ...optionsSchema.parse({ ...config, ...next }) }),\n receive,\n respond: async (input, ctx) => {\n const conversation = z.string().min(1).parse(ctx.conversationId);\n const participants = await ctx.platform.conversations.participants(conversation);\n const author = participants.find(\n (participant) => participant.id === input.actorParticipantId,\n );\n const defaultAuth = defaultAuthOf(author);\n let admission: ChannelAdmissionIface = { auth: defaultAuth };\n if (options.onInputResponse != null) {\n const accepted = await options.onInputResponse(\n { ...ctx, ...channelAccessors(ctx.platform), defaultAuth },\n input,\n );\n if (accepted == null) return { resolved: false };\n admission = admissionSchema.parse(accepted);\n }\n if (ctx.platform.sessions.respond == null)\n throw new Error('response submission is unavailable');\n return ctx.platform.sessions.respond({ ...input, auth: admission.auth });\n },\n cancel: async (ctx) => {\n if (ctx.agentParticipantId == null) return { accepted: false };\n const conversation = z.string().min(1).parse(ctx.conversationId);\n const participants = await ctx.platform.conversations.participants(conversation);\n const agent = participants.find((participant) => participant.id === ctx.agentParticipantId);\n if (agent?.sessionId == null) return { accepted: false };\n await ctx.platform.sessions.cancel({\n participantId: agent.id,\n reason: ctx.cancelReason,\n throughMessageSeq: ctx.cancelThroughMessageSeq,\n });\n return { accepted: true };\n },\n project: async (update, ctx) => {\n const next = () =>\n options.events?.['message.completed'] == null\n ? base.project(update, ctx)\n : Promise.resolve();\n if (options.renderer != null) {\n await options.renderer(update, channelContext(ctx), sessionContext(ctx), next);\n return;\n }\n await next();\n },\n events: Object.freeze(events),\n }),\n );\n};\n"],
5
- "mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAgBK;AACP,YAAY,OAAO;AACnB,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,gCAAgC,4BAA4B;AACrE,SAAS,8BAA8B;AAEhC,MAAM,0BAA0B;AAEvC,SAAS,wBAAAA,6BAAmD;AA0D5D,MAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,MAAM,kBAAkB,SAAS;AAAA,EACjC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,MAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,YAAY,EAAE,WAAW,UAAU,EAAE,QAAQ,WAAW,KAAK;AAAA,EAC7D,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS;AAC/D,CAAC;AAED,MAAM,gBAAgB,CACpB,WAC4B;AAC5B,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,cACJ,OAAO,UAAU,OAAO,sBAAsB,OAAO,gBAAgB,OAAO;AAC9E,SAAO;AAAA,IACL;AAAA,IACA,eAAe,OAAO,UAAU,OAAO,qBAAqB,UAAU,qBAAqB;AAAA,IAC3F,eAAe;AAAA,IACf,YAAY,EAAE,gBAAgB,OAAO,GAAG;AAAA,EAC1C;AACF;AAEO,MAAM,eAAe,CAC1B,eAAyC,CAAC,MACO;AACjD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,QAAQ,aAAa,UAAU,OAAO,SAAY,EAAE,GAAG,aAAa,OAAO;AAAA,EAC7E;AACA,QAAM,YAAY;AAAA,IAChB,WAAW,QAAQ;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,GAAG,QAAQ;AAAA,EACb;AACA,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,SAAS;AACrD,QAAI,YAAY,QAAQ,CAAC,EAAE,SAAS,EAAE,UAAU,QAAQ,EAAE;AACxD,YAAM,IAAI,MAAM,iBAAiB,IAAI,qBAAqB;AAC9D,QAAM,kBAAkB,oBAAI,IAAI;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,aAAW,QAAQ,OAAO,KAAK,QAAQ,UAAU,CAAC,CAAC;AACjD,QAAI,CAAC,gBAAgB,IAAI,IAAI,EAAG,OAAM,IAAI,MAAM,oCAAoC,IAAI,EAAE;AAC5F,QAAM,SAAS,cAAc,MAAM,OAAO;AAC1C,QAAM,OAAO,uBAAuB,EAAE,GAAG,QAAQ,OAAO,QAAQ,MAAM,CAAC;AACvE,QAAM,UAA+B,OAAO,OAAO,QAAQ;AACzD,QAAI,+BAA+B,UAAU,KAAK,EAAE,QAAS,QAAO,KAAK,QAAQ,OAAO,GAAG;AAC3F,UAAM,UAAU,EACb,OAAO;AAAA,MACN,QAAQ,EAAE,OAAO;AAAA,MACjB,SAAS,EAAE,MAAM,gBAAgB;AAAA,MACjC,gBAAgB,EAAE,OAAO;AAAA,MACzB,MAAM,kBAAkB,SAAS;AAAA,MACjC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACtC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC,EACA,UAAU,KAAK;AAClB,QAAI,QAAQ,SAAS;AACnB,UAAI,IAAI,gBAAgB,KAAM,OAAM,IAAI,MAAM,uCAAuC;AACrF,YAAM,oBAAoB;AAAA,QACxB,UAAU,IAAI;AAAA,QACd,cAAc,IAAI;AAAA,QAClB,YAAY,OAAO;AAAA,MACrB,CAAC,EACE,KAAK,QAAQ,KAAK,MAAM,EACxB,KAAK,EAAE,GAAG,QAAQ,MAAM,SAAS,gBAAgB,QAAQ,KAAK,OAAO,EAAE,CAAC;AAC3E,aAAO,EAAE,gBAAgB,QAAQ,KAAK,OAAO;AAAA,IAC/C;AACA,UAAM,SAAS,qBAAqB,MAAM,KAAK;AAC/C,UAAM,eACJ,IAAI,gBAAiB,MAAM,IAAI,SAAS,cAAc,aAAa,OAAO,cAAc;AAC1F,UAAM,SAAS,aAAa;AAAA,MAC1B,CAAC,gBAAgB,YAAY,OAAO,OAAO;AAAA,IAC7C;AACA,UAAM,UACJ,IAAI,WACH,MAAM,IAAI,SAAS,cAAc,YAAY;AAAA,MAC5C,GAAG;AAAA,MACH,SAAS,gBAAgB,OAAO,OAAO;AAAA,IACzC,CAAC;AACH,QAAI,IAAI,gBAAgB,KAAM,OAAM,IAAI,MAAM,uCAAuC;AACrF,UAAM,iBAA2C;AAAA,MAC/C,GAAG;AAAA,MACH,GAAG,oBAAoB;AAAA,QACrB,UAAU,IAAI;AAAA,QACd,cAAc,IAAI;AAAA,QAClB,YAAY,OAAO;AAAA,MACrB,CAAC;AAAA,MACD,aAAa,cAAc,MAAM;AAAA,IACnC;AACA,UAAM,WACJ,QAAQ,aAAa,OACjB,EAAE,MAAM,eAAe,YAAY,IACnC,MAAM,QAAQ,UAAU,gBAAgB,OAAO;AACrD,UAAM,YAAY,YAAY,OAAO,OAAO,gBAAgB,MAAM,QAAQ;AAC1E,QAAI,aAAa,KAAM,QAAO,EAAE,gBAAgB,OAAO,eAAe;AACtE,UAAM,UAAU,UAAU,WAAW,CAAC;AACtC,UAAM,WAA2B,QAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,KAAK,EAAE;AAC/E,WAAO,KAAK;AAAA,MACV;AAAA,QACE,GAAG;AAAA,QACH,SAAS,CAAC,GAAG,QAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,KAAK,EAAE,GAAG,GAAG,OAAO,OAAO;AAAA,MACjF;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,IAAI;AAAA,UACP,UAAU;AAAA,YACR,GAAG,IAAI,SAAS;AAAA,YAChB,QAAQ,CAAC,SACP,IAAI,SAAS,SAAS,OAAO;AAAA,cAC3B,GAAG;AAAA,cACH,MAAM,UAAU;AAAA,cAChB,OAAO,UAAU;AAAA,YACnB,CAAC;AAAA,UACL;AAAA,QACF;AAAA,QACA,SAAS,EAAE,GAAG,SAAS,SAAS,CAAC,GAAG,UAAU,GAAG,QAAQ,OAAO,EAAE;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACA,QAAM,iBAAiB,CAAC,QAA0D;AAChF,UAAM,EAAE,cAAc,iBAAiB,IAAI;AAC3C,QAAI,gBAAgB,QAAQ,oBAAoB,QAAQ,iBAAiB,gBAAgB;AACvF,YAAM,IAAI,MAAM,sDAAsD;AACxE,WAAO;AAAA,MACL,GAAG,oBAAoB;AAAA,QACrB,UAAU,IAAI;AAAA,QACd,cAAc,iBAAiB;AAAA,QAC/B,YAAY,OAAO;AAAA,MACrB,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM,OAAO,YAAY;AACvB,cAAI,IAAI,SAAS,cAAc,mBAAmB;AAChD,kBAAM,IAAI,MAAM,iCAAiC;AACnD,gBAAM,SAAS,MAAM,IAAI,SAAS,cAAc,YAAY;AAAA,YAC1D,gBAAgB,aAAa;AAAA,YAC7B,qBAAqB,iBAAiB;AAAA,YACtC,SAAS,gBAAgB,QAAQ,OAAO;AAAA,YACxC,iBAAiB,WAAW,IAAI,KAAK,EAAE,IAAI,QAAQ,EAAE;AAAA,YACrD,cAAc,IAAI,KAAK;AAAA,UACzB,CAAC;AACD,gBAAM,IAAI,SAAS,cAAc,gBAAgB;AAAA,YAC/C,gBAAgB,OAAO;AAAA,YACvB,WAAW,OAAO;AAAA,UACpB,CAAC;AACD,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,iBAAiB,CAAC,SAA2D;AAAA,IACjF,WAAW,IAAI,aAAa;AAAA,IAC5B,QAAQ,IAAI,KAAK;AAAA,IACjB,OAAO,IAAI;AAAA,EACb;AACA,QAAM,OAAO,CACX,QACA,YAEA,WAAW,OACP,SACA,OAAO,OAAO,QACZ,QAAQ,OAAO,MAAM,MAAM,IAAI,GAAG,eAAe,GAAG,GAAG,eAAe,GAAG,CAAC;AAClF,QAAM,iBAAiB;AAAA,IACrB,CAAC,yBAAyB,gBAAgB,GAAG;AAAA,MAC3C;AAAA,MACA,QAAQ,SAAS,mBAAmB;AAAA,IACtC;AAAA,IACA,CAAC,yBAAyB,YAAY,GAAG;AAAA,MACvC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,iBAAiB,CAAC;AAAA,MAC3D,QAAQ,SAAS,eAAe;AAAA,IAClC;AAAA,IACA,CAAC,yBAAyB,WAAW,GAAG;AAAA,MACtC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAAA,MAC/B,QAAQ,SAAS,cAAc;AAAA,IACjC;AAAA,IACA,CAAC,yBAAyB,aAAa,GAAG;AAAA,MACxC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,MAClE,QAAQ,SAAS,gBAAgB;AAAA,IACnC;AAAA,IACA,mBAAmB,KAAK,0BAA0B,QAAQ,SAAS,iBAAiB,CAAC;AAAA,IACrF,oBAAoB,KAAK,2BAA2B,QAAQ,SAAS,kBAAkB,CAAC;AAAA,EAC1F;AACA,QAAM,SAAS,EAAE,GAAG,KAAK,OAAO;AAChC,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,cAAc;AACzD,QAAI,WAAW,KAAM,QAAO,IAAI,IAAI;AACtC,SAAO,OAAO;AAAA,IACZ,cAAc;AAAA,MACZ,GAAG;AAAA,MACH,QAAQ,iBAAiB,MAAM,MAAM;AAAA,MACrC,WACE,QAAQ,aAAa,QACrB,QAAQ,mBAAmB,QAC3B,QAAQ,UAAU,QAClB,QAAQ,YAAY,QACpB,QAAQ,SAAS,OACb,WAAW,uBAAuB,IAClC;AAAA,MACN,WAAW,CAAC,SACV,aAAa,EAAE,GAAG,SAAS,GAAG,cAAc,MAAM,EAAE,GAAG,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;AAAA,MAC7E;AAAA,MACA,SAAS,OAAO,OAAO,QAAQ;AAC7B,cAAM,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,IAAI,cAAc;AAC/D,cAAM,eAAe,MAAM,IAAI,SAAS,cAAc,aAAa,YAAY;AAC/E,cAAM,SAAS,aAAa;AAAA,UAC1B,CAAC,gBAAgB,YAAY,OAAO,MAAM;AAAA,QAC5C;AACA,cAAM,cAAc,cAAc,MAAM;AACxC,YAAI,YAAmC,EAAE,MAAM,YAAY;AAC3D,YAAI,QAAQ,mBAAmB,MAAM;AACnC,gBAAM,WAAW,MAAM,QAAQ;AAAA,YAC7B,EAAE,GAAG,KAAK,GAAG,iBAAiB,IAAI,QAAQ,GAAG,YAAY;AAAA,YACzD;AAAA,UACF;AACA,cAAI,YAAY,KAAM,QAAO,EAAE,UAAU,MAAM;AAC/C,sBAAY,gBAAgB,MAAM,QAAQ;AAAA,QAC5C;AACA,YAAI,IAAI,SAAS,SAAS,WAAW;AACnC,gBAAM,IAAI,MAAM,oCAAoC;AACtD,eAAO,IAAI,SAAS,SAAS,QAAQ,EAAE,GAAG,OAAO,MAAM,UAAU,KAAK,CAAC;AAAA,MACzE;AAAA,MACA,QAAQ,OAAO,QAAQ;AACrB,YAAI,IAAI,sBAAsB,KAAM,QAAO,EAAE,UAAU,MAAM;AAC7D,cAAM,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,IAAI,cAAc;AAC/D,cAAM,eAAe,MAAM,IAAI,SAAS,cAAc,aAAa,YAAY;AAC/E,cAAM,QAAQ,aAAa,KAAK,CAAC,gBAAgB,YAAY,OAAO,IAAI,kBAAkB;AAC1F,YAAI,OAAO,aAAa,KAAM,QAAO,EAAE,UAAU,MAAM;AACvD,cAAM,IAAI,SAAS,SAAS,OAAO;AAAA,UACjC,eAAe,MAAM;AAAA,UACrB,QAAQ,IAAI;AAAA,UACZ,mBAAmB,IAAI;AAAA,QACzB,CAAC;AACD,eAAO,EAAE,UAAU,KAAK;AAAA,MAC1B;AAAA,MACA,SAAS,OAAO,QAAQ,QAAQ;AAC9B,cAAM,OAAO,MACX,QAAQ,SAAS,mBAAmB,KAAK,OACrC,KAAK,QAAQ,QAAQ,GAAG,IACxB,QAAQ,QAAQ;AACtB,YAAI,QAAQ,YAAY,MAAM;AAC5B,gBAAM,QAAQ,SAAS,QAAQ,eAAe,GAAG,GAAG,eAAe,GAAG,GAAG,IAAI;AAC7E;AAAA,QACF;AACA,cAAM,KAAK;AAAA,MACb;AAAA,MACA,QAAQ,OAAO,OAAO,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import type { ContentBlock, SessionUpdate } from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n ChannelPrincipalType,\n SemanticChannelEventKind,\n TurnPolicy,\n channelAccessors,\n channelAuthSchema,\n channelMessageCompletedSchema,\n defineChannel,\n jsonObjectSchema,\n packageRef,\n pendingCreatedDataSchema,\n pendingResolvedDataSchema,\n type ChannelAddressContextIface,\n type ChannelAuthIface,\n type ChannelDefinitionIface,\n type ChannelEventHandler,\n type ChannelInputReceiptIface,\n type ChannelInputResponseIface,\n type ChannelMessageCompletedDataIface,\n type ChannelMessageDeltaDataIface,\n type ChannelReceiveContextIface,\n type ChannelTurnEventDataIface,\n type ChannelTurnStateIface,\n type ConversationMessageIface,\n type JsonValue,\n type PendingCreatedDataIface,\n type PendingResolvedDataIface,\n type ProjectionContextIface,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport { finalAddressContext } from \"./channels/address-context.mjs\";\nimport { contentBlocksOf } from \"./channels/content.mjs\";\nimport { conversationEventInboundSchema, messageInboundSchema } from \"./channels/inbound.mjs\";\nimport { createMessagingChannel } from \"./channels/messaging-channel.mjs\";\nimport { sendServiceInput, type ServiceInputArgsIface } from \"./channels/service-input.mjs\";\n\nexport const FINAL_CHANNEL_SPECIFIER = '@finalai/final-agent-provider/channels/final';\n\nexport { ChannelPrincipalType, type ChannelAuthIface } from '@finalai/agent-provider';\n\nexport interface ChannelAdmissionIface {\n auth: ChannelAuthIface | null;\n context?: string[];\n title?: string;\n}\n\nexport interface FinalMessageContextIface\n extends ChannelReceiveContextIface, ChannelAddressContextIface {\n defaultAuth: ChannelAuthIface | null;\n}\n\nexport interface FinalChannelContextIface extends ChannelAddressContextIface {\n final: {\n post(message: ChannelMessageCompletedDataIface['message']): Promise<ConversationMessageIface>;\n // Input to a room's agent from a principal that is no member of the room.\n sendServiceInput(args: ServiceInputArgsIface): Promise<ChannelInputReceiptIface>;\n };\n}\nexport interface FinalSessionContextIface {\n sessionId: string | null;\n turnId: string;\n state: ChannelTurnStateIface<JsonValue>;\n}\nexport type FinalChannelEventHandler<Data> = (\n data: Data,\n channel: FinalChannelContextIface,\n ctx: FinalSessionContextIface,\n) => void | Promise<void>;\nexport interface FinalChannelEventHandlersIface {\n 'message.delta'?: FinalChannelEventHandler<ChannelMessageDeltaDataIface>;\n 'message.completed'?: FinalChannelEventHandler<ChannelMessageCompletedDataIface>;\n 'turn.started'?: FinalChannelEventHandler<ChannelTurnEventDataIface>;\n 'turn.completed'?: FinalChannelEventHandler<ChannelTurnEventDataIface>;\n 'pending.created'?: FinalChannelEventHandler<PendingCreatedDataIface>;\n 'pending.resolved'?: FinalChannelEventHandler<PendingResolvedDataIface>;\n}\n\nexport interface FinalChannelOptionsIface {\n turnPolicy?: TurnPolicy | `${TurnPolicy}`;\n updateIntervalMs?: number;\n route?: ChannelDefinitionIface<JsonValue, JsonValue>['route'];\n onMessage?: (\n ctx: FinalMessageContextIface,\n message: ConversationMessageIface,\n ) => ChannelAdmissionIface | null | Promise<ChannelAdmissionIface | null>;\n onInputResponse?: (\n ctx: FinalMessageContextIface,\n response: ChannelInputResponseIface,\n ) => ChannelAdmissionIface | null | Promise<ChannelAdmissionIface | null>;\n events?: FinalChannelEventHandlersIface;\n renderer?: (\n update: SessionUpdate,\n channel: FinalChannelContextIface,\n ctx: FinalSessionContextIface,\n next: () => Promise<void>,\n ) => void | Promise<void>;\n}\n\nconst admissionSchema = z.object({\n auth: channelAuthSchema.nullable(),\n context: z.array(z.string()).optional(),\n title: z.string().optional(),\n});\n\nconst optionsSchema = z.object({\n turnPolicy: z.nativeEnum(TurnPolicy).default(TurnPolicy.Steer),\n updateIntervalMs: z.number().finite().nonnegative().optional(),\n});\n\n// A room member as a principal: a person by user id, an agent by definition id.\nconst defaultAuthOf = (\n author: import('@finalai/agent-provider').ParticipantIface | undefined,\n): ChannelAuthIface | null => {\n if (author == null) return null;\n return {\n principalId: author.userId ?? author.definitionId ?? author.id,\n principalType: author.userId == null ? ChannelPrincipalType.Service : ChannelPrincipalType.User,\n authenticator: 'final',\n displayName: author.displayName,\n attributes: { participant_id: author.id },\n };\n};\n\n// A handoff from another of the agent's channels (`ctx.to('final', target)`).\nconst handoffSchema = z.object({\n target: z.object({\n conversationId: z.string().min(1),\n participantId: z.string().min(1).optional(),\n }),\n content: z.array(jsonObjectSchema).min(1),\n idempotencyKey: z.string().min(1),\n auth: channelAuthSchema,\n context: z.array(z.string()).optional(),\n title: z.string().optional(),\n actingUserId: z.string().min(1).optional(),\n originTurnId: z.string().min(1).optional(),\n source: z.object({ label: z.string().min(1) }).optional(),\n turnPolicy: z.nativeEnum(TurnPolicy).optional(),\n});\n\nexport const finalChannel = (\n inputOptions: FinalChannelOptionsIface = {},\n): ChannelDefinitionIface<JsonValue, JsonValue> => {\n const options = {\n ...inputOptions,\n events: inputOptions.events == null ? undefined : { ...inputOptions.events },\n };\n const callbacks = {\n onMessage: options.onMessage,\n onInputResponse: options.onInputResponse,\n renderer: options.renderer,\n route: options.route,\n ...options.events,\n };\n for (const [name, callback] of Object.entries(callbacks))\n if (callback != null && !z.function().safeParse(callback).success)\n throw new Error(`Final channel ${name} must be a function`);\n const supportedEvents = new Set([\n 'message.delta',\n 'message.completed',\n 'turn.started',\n 'turn.completed',\n 'pending.created',\n 'pending.resolved',\n ]);\n for (const kind of Object.keys(options.events ?? {}))\n if (!supportedEvents.has(kind)) throw new Error(`unsupported Final channel event: ${kind}`);\n const config = optionsSchema.parse(options);\n const base = createMessagingChannel({ ...config, route: options.route });\n const receive: typeof base.receive = async (input, ctx) => {\n if (conversationEventInboundSchema.safeParse(input).success) return base.receive(input, ctx);\n const handoff = handoffSchema.safeParse(input);\n if (handoff.success) {\n if (ctx.platform.channelSessions == null)\n throw new Error('channel session operations are unavailable');\n const { target, ...rest } = handoff.data;\n await ctx.platform.channelSessions.send(target, {\n ...rest,\n content: contentBlocksOf(rest.content),\n source: rest.source,\n // The sender's policy, else the receiving channel's.\n turnPolicy: rest.turnPolicy ?? config.turnPolicy,\n });\n return { conversationId: target.conversationId };\n }\n const parsed = messageInboundSchema.parse(input);\n const participants =\n ctx.participants ?? (await ctx.platform.conversations.participants(parsed.conversationId));\n const author = participants.find(\n (participant) => participant.id === parsed.authorParticipantId,\n );\n const message =\n ctx.message ??\n (await ctx.platform.conversations.postMessage({\n ...parsed,\n content: contentBlocksOf(parsed.content),\n }));\n if (ctx.definitionId == null) throw new Error('Final channel has no agent definition');\n const messageContext: FinalMessageContextIface = {\n ...ctx,\n ...finalAddressContext({\n platform: ctx.platform,\n definitionId: ctx.definitionId,\n turnPolicy: config.turnPolicy,\n }),\n defaultAuth: defaultAuthOf(author),\n };\n const accepted =\n options.onMessage == null\n ? { auth: messageContext.defaultAuth }\n : await options.onMessage(messageContext, message);\n const admission = accepted == null ? null : admissionSchema.parse(accepted);\n if (admission == null) return { conversationId: parsed.conversationId };\n const context = admission.context ?? [];\n const injected: ContentBlock[] = context.map((text) => ({ type: 'text', text }));\n return base.receive(\n {\n ...parsed,\n content: [...context.map((text) => ({ type: 'text', text })), ...parsed.content],\n },\n {\n ...ctx,\n platform: {\n ...ctx.platform,\n sessions: {\n ...ctx.platform.sessions,\n prompt: (args) =>\n ctx.platform.sessions.prompt({\n ...args,\n auth: admission.auth,\n title: admission.title,\n }),\n },\n },\n message: { ...message, content: [...injected, ...message.content] },\n },\n );\n };\n const channelContext = (ctx: ProjectionContextIface): FinalChannelContextIface => {\n const { conversation, agentParticipant } = ctx;\n if (conversation == null || agentParticipant == null || agentParticipant.definitionId == null)\n throw new Error('Final platform context requires a Final conversation');\n return {\n ...finalAddressContext({\n platform: ctx.platform,\n definitionId: agentParticipant.definitionId,\n turnPolicy: config.turnPolicy,\n }),\n final: {\n post: async (message) => {\n if (ctx.platform.conversations.dispatchMessage == null)\n throw new Error('channel dispatch is unavailable');\n const posted = await ctx.platform.conversations.postMessage({\n conversationId: conversation.conversationId,\n authorParticipantId: agentParticipant.id,\n content: contentBlocksOf(message.content),\n clientMessageId: `channel:${ctx.turn.id}:${message.id}`,\n originTurnId: ctx.turn.id,\n });\n await ctx.platform.conversations.dispatchMessage({\n conversationId: posted.conversationId,\n messageId: posted.messageId,\n });\n return posted;\n },\n sendServiceInput: (input) => sendServiceInput(ctx.platform, input),\n },\n };\n };\n const sessionContext = (ctx: ProjectionContextIface): FinalSessionContextIface => ({\n sessionId: ctx.sessionId ?? null,\n turnId: ctx.turn.id,\n state: ctx.state,\n });\n const wrap = <Data>(\n schema: z.ZodType<Data>,\n handler: FinalChannelEventHandler<Data> | undefined,\n ): ChannelEventHandler | undefined =>\n handler == null\n ? undefined\n : async (event, ctx) =>\n handler(schema.parse(event.data), channelContext(ctx), sessionContext(ctx));\n const authoredEvents = {\n [SemanticChannelEventKind.MessageCompleted]: wrap(\n channelMessageCompletedSchema,\n options.events?.['message.completed'],\n ),\n [SemanticChannelEventKind.MessageDelta]: wrap(\n z.object({ messageId: z.string(), delta: jsonObjectSchema }),\n options.events?.['message.delta'],\n ),\n [SemanticChannelEventKind.TurnStarted]: wrap(\n z.object({ turnId: z.string() }),\n options.events?.['turn.started'],\n ),\n [SemanticChannelEventKind.TurnCompleted]: wrap(\n z.object({ turnId: z.string(), stopReason: z.string().nullable() }),\n options.events?.['turn.completed'],\n ),\n 'pending.created': wrap(pendingCreatedDataSchema, options.events?.['pending.created']),\n 'pending.resolved': wrap(pendingResolvedDataSchema, options.events?.['pending.resolved']),\n };\n const events = { ...base.events };\n for (const [kind, handler] of Object.entries(authoredEvents))\n if (handler != null) events[kind] = handler;\n return Object.freeze(\n defineChannel({\n ...base,\n config: jsonObjectSchema.parse(config),\n installed:\n options.onMessage == null &&\n options.onInputResponse == null &&\n options.events == null &&\n options.renderer == null &&\n options.route == null\n ? packageRef(FINAL_CHANNEL_SPECIFIER)\n : undefined,\n configure: (next) =>\n finalChannel({ ...options, ...optionsSchema.parse({ ...config, ...next }) }),\n receive,\n respond: async (input, ctx) => {\n const conversation = z.string().min(1).parse(ctx.conversationId);\n const participants = await ctx.platform.conversations.participants(conversation);\n const author = participants.find(\n (participant) => participant.id === input.actorParticipantId,\n );\n const defaultAuth = defaultAuthOf(author);\n let admission: ChannelAdmissionIface = { auth: defaultAuth };\n if (options.onInputResponse != null) {\n const accepted = await options.onInputResponse(\n { ...ctx, ...channelAccessors(ctx.platform), defaultAuth },\n input,\n );\n if (accepted == null) return { resolved: false };\n admission = admissionSchema.parse(accepted);\n }\n if (ctx.platform.sessions.respond == null)\n throw new Error('response submission is unavailable');\n return ctx.platform.sessions.respond({ ...input, auth: admission.auth });\n },\n cancel: async (ctx) => {\n if (ctx.agentParticipantId == null) return { accepted: false };\n const conversation = z.string().min(1).parse(ctx.conversationId);\n const participants = await ctx.platform.conversations.participants(conversation);\n const agent = participants.find((participant) => participant.id === ctx.agentParticipantId);\n if (agent?.sessionId == null) return { accepted: false };\n await ctx.platform.sessions.cancel({\n participantId: agent.id,\n reason: ctx.cancelReason,\n throughMessageSeq: ctx.cancelThroughMessageSeq,\n });\n return { accepted: true };\n },\n project: async (update, ctx) => {\n const next = () =>\n options.events?.['message.completed'] == null\n ? base.project(update, ctx)\n : Promise.resolve();\n if (options.renderer != null) {\n await options.renderer(update, channelContext(ctx), sessionContext(ctx), next);\n return;\n }\n await next();\n },\n events: Object.freeze(events),\n }),\n );\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["ChannelPrincipalType"]
7
7
  }
@@ -1,12 +1,15 @@
1
1
  import {
2
2
  channelAccessors,
3
- Delivery,
4
3
  ParticipantKind,
5
4
  TurnPolicy
6
5
  } from "@finalai/agent-provider";
7
- import { deliverMessage } from "./delivery.mjs";
8
6
  const finalAddressContext = (args) => {
9
7
  const generic = channelAccessors(args.platform);
8
+ const operations = () => {
9
+ if (args.platform.channelSessions == null)
10
+ throw new Error("channel session operations are unavailable");
11
+ return args.platform.channelSessions;
12
+ };
10
13
  const agentIn = async (address) => {
11
14
  const participants = await args.platform.conversations.participants(address);
12
15
  return participants.find(
@@ -30,59 +33,23 @@ const finalAddressContext = (args) => {
30
33
  return sessionId == null ? null : generic.attachSession(sessionId).inspect();
31
34
  },
32
35
  resolveSession: resolve,
36
+ // Input to the room's agent from the sender's principal, never a message:
37
+ // accepted at once, delivered by the platform, the reply captioned in the room.
33
38
  send: async (input) => {
34
39
  const room = await address();
35
40
  if (room == null) throw new Error("Final channel session has no room");
36
- const conversation = await args.platform.conversations.get(room);
37
41
  const agent = await agentIn(room);
38
- if (conversation == null || agent == null)
39
- throw new Error("Final channel address is unavailable");
42
+ if (agent == null) throw new Error("Final channel address is unavailable");
40
43
  if (pinnedId != null && agent.sessionId !== pinnedId)
41
44
  throw new Error("pinned Final session no longer owns this room");
42
- const message = await args.platform.conversations.postMessage({
43
- conversationId: room,
44
- authorParticipantId: agent.id,
45
- content: input.content,
46
- clientMessageId: `channel-input:${input.idempotencyKey}`
47
- });
48
- let receipt = null;
49
- const context = (input.context ?? []).map((text) => ({
50
- type: "text",
51
- text
52
- }));
53
- const result = await deliverMessage({
54
- platform: {
55
- ...args.platform,
56
- sessions: {
57
- ...args.platform.sessions,
58
- prompt: async (prompt) => {
59
- const accepted2 = await args.platform.sessions.prompt({
60
- ...prompt,
61
- auth: input.auth,
62
- title: input.title,
63
- waitForAcceptance: true,
64
- content: [...context, ...prompt.content]
65
- });
66
- receipt = accepted2;
67
- return accepted2;
68
- }
69
- }
70
- },
71
- conversation,
72
- message,
73
- turnPolicy: input.turnPolicy == null ? args.turnPolicy : input.turnPolicy === TurnPolicy.Queue ? TurnPolicy.Queue : TurnPolicy.Steer,
74
- route: () => [{ participantId: agent.id, delivery: Delivery.Prompt }]
75
- });
76
- const failure = result.find((entry) => entry.error != null);
77
- if (failure != null) throw new Error(failure.error ?? "Final channel delivery failed");
78
- const accepted = receiptOf(receipt);
79
- if (accepted.sessionId == null || accepted.turnId == null)
80
- throw new Error("Final channel send has no acceptance receipt");
81
- return {
82
- sessionId: accepted.sessionId,
83
- turnId: accepted.turnId,
84
- messageId: accepted.messageId
85
- };
45
+ return operations().send(
46
+ { conversationId: room, participantId: agent.id },
47
+ {
48
+ ...input,
49
+ turnPolicy: input.turnPolicy ?? args.turnPolicy,
50
+ source: input.source
51
+ }
52
+ );
86
53
  },
87
54
  respond: async (input) => (await existing()).respond(input),
88
55
  cancel: async () => {
@@ -107,10 +74,6 @@ const finalAddressContext = (args) => {
107
74
  to: generic.to
108
75
  };
109
76
  };
110
- const receiptOf = (receipt) => {
111
- if (receipt == null) throw new Error("Final channel send was not accepted");
112
- return receipt;
113
- };
114
77
  export {
115
78
  finalAddressContext
116
79
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/channels/address-context.ts"],
4
- "sourcesContent": ["import type { ContentBlock } from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n channelAccessors,\n Delivery,\n ParticipantKind,\n TurnPolicy,\n type ChannelAddressContextIface,\n type ChannelPlatformIface,\n type ChannelSessionHandleIface,\n} from '@finalai/agent-provider';\nimport { deliverMessage } from \"./delivery.mjs\";\n\nexport interface FinalAddressContextArgsIface {\n platform: ChannelPlatformIface;\n definitionId: string;\n turnPolicy: TurnPolicy;\n}\n\n// Final addresses are room IDs. The existing participant/session association\n// owns the room's session; a pinned handle never follows a replacement.\nexport const finalAddressContext = (\n args: FinalAddressContextArgsIface,\n): ChannelAddressContextIface => {\n const generic = channelAccessors(args.platform);\n const agentIn = async (address: string) => {\n const participants = await args.platform.conversations.participants(address);\n return (\n participants.find(\n (participant) =>\n !participant.left &&\n participant.kind === ParticipantKind.Agent &&\n participant.definitionId === args.definitionId,\n ) ?? null\n );\n };\n const handle = (\n address: () => Promise<string | null>,\n pinnedId?: string,\n ): ChannelSessionHandleIface => {\n const resolve = async () => {\n if (pinnedId != null) return generic.attachSession(pinnedId).resolveSession();\n const room = await address();\n return room == null ? null : ((await agentIn(room))?.sessionId ?? null);\n };\n const existing = async () => {\n const sessionId = await resolve();\n if (sessionId == null) throw new Error('Final channel address has no session');\n return generic.attachSession(sessionId);\n };\n return {\n inspect: async () => {\n const sessionId = await resolve();\n return sessionId == null ? null : generic.attachSession(sessionId).inspect();\n },\n resolveSession: resolve,\n send: async (input) => {\n const room = await address();\n if (room == null) throw new Error('Final channel session has no room');\n const conversation = await args.platform.conversations.get(room);\n const agent = await agentIn(room);\n if (conversation == null || agent == null)\n throw new Error('Final channel address is unavailable');\n if (pinnedId != null && agent.sessionId !== pinnedId)\n throw new Error('pinned Final session no longer owns this room');\n const message = await args.platform.conversations.postMessage({\n conversationId: room,\n authorParticipantId: agent.id,\n content: input.content,\n clientMessageId: `channel-input:${input.idempotencyKey}`,\n });\n let receipt: { messageId: string; sessionId?: string; turnId?: string } | null = null;\n const context: ContentBlock[] = (input.context ?? []).map((text) => ({\n type: 'text',\n text,\n }));\n const result = await deliverMessage({\n platform: {\n ...args.platform,\n sessions: {\n ...args.platform.sessions,\n prompt: async (prompt) => {\n const accepted = await args.platform.sessions.prompt({\n ...prompt,\n auth: input.auth,\n title: input.title,\n waitForAcceptance: true,\n content: [...context, ...prompt.content],\n });\n receipt = accepted;\n return accepted;\n },\n },\n },\n conversation,\n message,\n turnPolicy:\n input.turnPolicy == null\n ? args.turnPolicy\n : input.turnPolicy === TurnPolicy.Queue\n ? TurnPolicy.Queue\n : TurnPolicy.Steer,\n route: () => [{ participantId: agent.id, delivery: Delivery.Prompt }],\n });\n // A failed delivery remains retryable through the existing message receipt.\n const failure = result.find((entry) => entry.error != null);\n if (failure != null) throw new Error(failure.error ?? 'Final channel delivery failed');\n const accepted = receiptOf(receipt);\n if (accepted.sessionId == null || accepted.turnId == null)\n throw new Error('Final channel send has no acceptance receipt');\n return {\n sessionId: accepted.sessionId,\n turnId: accepted.turnId,\n messageId: accepted.messageId,\n };\n },\n respond: async (input) => (await existing()).respond(input),\n cancel: async () => {\n const sessionId = await resolve();\n return sessionId == null ? { accepted: false } : generic.attachSession(sessionId).cancel();\n },\n close: async () => {\n const sessionId = await resolve();\n if (sessionId != null) await generic.attachSession(sessionId).close();\n },\n observe: async (input) => (await existing()).observe(input),\n setConfigOption: async (input) => (await existing()).setConfigOption(input),\n park: async () => (await existing()).park(),\n getState: async () => (await existing()).getState(),\n setState: async (state) => (await existing()).setState(state),\n };\n };\n return {\n from: (address) => handle(async () => address),\n resolveSession: async (address) => (await agentIn(address))?.sessionId ?? null,\n attachSession: (id) =>\n handle(async () => (await generic.attachSession(id).inspect())?.conversationId ?? null, id),\n to: generic.to,\n };\n};\n\nconst receiptOf = (receipt: { messageId: string; sessionId?: string; turnId?: string } | null) => {\n if (receipt == null) throw new Error('Final channel send was not accepted');\n return receipt;\n};\n"],
5
- "mappings": "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",
6
- "names": ["accepted"]
4
+ "sourcesContent": ["import {\n channelAccessors,\n ParticipantKind,\n TurnPolicy,\n type ChannelAddressContextIface,\n type ChannelPlatformIface,\n type ChannelSessionHandleIface,\n} from '@finalai/agent-provider';\n\nexport interface FinalAddressContextArgsIface {\n platform: ChannelPlatformIface;\n definitionId: string;\n turnPolicy: TurnPolicy;\n}\n\n// Final addresses are room IDs. The existing participant/session association\n// owns the room's session; a pinned handle never follows a replacement.\nexport const finalAddressContext = (\n args: FinalAddressContextArgsIface,\n): ChannelAddressContextIface => {\n const generic = channelAccessors(args.platform);\n const operations = () => {\n if (args.platform.channelSessions == null)\n throw new Error('channel session operations are unavailable');\n return args.platform.channelSessions;\n };\n const agentIn = async (address: string) => {\n const participants = await args.platform.conversations.participants(address);\n return (\n participants.find(\n (participant) =>\n !participant.left &&\n participant.kind === ParticipantKind.Agent &&\n participant.definitionId === args.definitionId,\n ) ?? null\n );\n };\n const handle = (\n address: () => Promise<string | null>,\n pinnedId?: string,\n ): ChannelSessionHandleIface => {\n const resolve = async () => {\n if (pinnedId != null) return generic.attachSession(pinnedId).resolveSession();\n const room = await address();\n return room == null ? null : ((await agentIn(room))?.sessionId ?? null);\n };\n const existing = async () => {\n const sessionId = await resolve();\n if (sessionId == null) throw new Error('Final channel address has no session');\n return generic.attachSession(sessionId);\n };\n return {\n inspect: async () => {\n const sessionId = await resolve();\n return sessionId == null ? null : generic.attachSession(sessionId).inspect();\n },\n resolveSession: resolve,\n // Input to the room's agent from the sender's principal, never a message:\n // accepted at once, delivered by the platform, the reply captioned in the room.\n send: async (input) => {\n const room = await address();\n if (room == null) throw new Error('Final channel session has no room');\n const agent = await agentIn(room);\n if (agent == null) throw new Error('Final channel address is unavailable');\n if (pinnedId != null && agent.sessionId !== pinnedId)\n throw new Error('pinned Final session no longer owns this room');\n return operations().send(\n { conversationId: room, participantId: agent.id },\n {\n ...input,\n turnPolicy: input.turnPolicy ?? args.turnPolicy,\n source: input.source,\n },\n );\n },\n respond: async (input) => (await existing()).respond(input),\n cancel: async () => {\n const sessionId = await resolve();\n return sessionId == null ? { accepted: false } : generic.attachSession(sessionId).cancel();\n },\n close: async () => {\n const sessionId = await resolve();\n if (sessionId != null) await generic.attachSession(sessionId).close();\n },\n observe: async (input) => (await existing()).observe(input),\n setConfigOption: async (input) => (await existing()).setConfigOption(input),\n park: async () => (await existing()).park(),\n getState: async () => (await existing()).getState(),\n setState: async (state) => (await existing()).setState(state),\n };\n };\n return {\n from: (address) => handle(async () => address),\n resolveSession: async (address) => (await agentIn(address))?.sessionId ?? null,\n attachSession: (id) =>\n handle(async () => (await generic.attachSession(id).inspect())?.conversationId ?? null, id),\n to: generic.to,\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }
@@ -1,6 +1,5 @@
1
1
  import { SandboxEventKind, TurnPolicy, type ChannelDefinitionIface, type ChannelReceiveContextIface, type ConversationRefIface, type JsonValue, type RouteArgsIface, type RouteDecisionIface } from '@finalai/agent-provider';
2
2
  import * as z from 'zod';
3
- import { type DeliverMessageArgsIface } from "./delivery.mjs";
4
3
  export declare const AGENT_EVENTS_SPECIFIER = "@finalai/final-agent-provider/channels/agent-events";
5
4
  export declare const AGENT_EVENTS_TURN_POLICY = TurnPolicy.Steer;
6
5
  export declare const WEBHOOK_SECRET_NAME = "webhook";
@@ -8,14 +7,8 @@ export declare const WEBHOOK_BODY_MAX_CHARS = 8000;
8
7
  export declare enum AgentEventKind {
9
8
  Webhook = "webhook",
10
9
  LinkedConversation = "linked-conversation",
11
- Tool = "tool",
12
10
  Sandbox = "sandbox"
13
11
  }
14
- export declare enum ToolEventStatus {
15
- Completed = "completed",
16
- Failed = "failed",
17
- Cancelled = "cancelled"
18
- }
19
12
  export { SandboxEventKind } from '@finalai/agent-provider';
20
13
  export declare const SYSTEM_EVENT_TEXT_MAX_CHARS = 4000;
21
14
  export declare enum LinkedConversationEvent {
@@ -27,6 +20,7 @@ export declare const LINKED_CONVERSATION_TEXT_MAX_CHARS = 4000;
27
20
  declare const linkedConversationEventSchema: z.ZodObject<{
28
21
  kind: z.ZodLiteral<AgentEventKind.LinkedConversation>;
29
22
  conversationId: z.ZodString;
23
+ participantId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
24
  linkId: z.ZodString;
31
25
  linkedConversationId: z.ZodString;
32
26
  linkedTitle: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -35,16 +29,6 @@ declare const linkedConversationEventSchema: z.ZodObject<{
35
29
  eventId: z.ZodString;
36
30
  originTurnId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
37
31
  }, z.core.$strip>;
38
- declare const toolEventSchema: z.ZodObject<{
39
- kind: z.ZodLiteral<AgentEventKind.Tool>;
40
- conversationId: z.ZodString;
41
- participantId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
42
- toolName: z.ZodString;
43
- title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
44
- status: z.ZodEnum<typeof ToolEventStatus>;
45
- text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
46
- eventId: z.ZodString;
47
- }, z.core.$strip>;
48
32
  declare const sandboxEventSchema: z.ZodObject<{
49
33
  kind: z.ZodLiteral<AgentEventKind.Sandbox>;
50
34
  conversationId: z.ZodString;
@@ -68,6 +52,7 @@ export declare const agentEventInboundSchema: z.ZodDiscriminatedUnion<[z.ZodObje
68
52
  }, z.core.$strip>, z.ZodObject<{
69
53
  kind: z.ZodLiteral<AgentEventKind.LinkedConversation>;
70
54
  conversationId: z.ZodString;
55
+ participantId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
71
56
  linkId: z.ZodString;
72
57
  linkedConversationId: z.ZodString;
73
58
  linkedTitle: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -75,15 +60,6 @@ export declare const agentEventInboundSchema: z.ZodDiscriminatedUnion<[z.ZodObje
75
60
  text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
76
61
  eventId: z.ZodString;
77
62
  originTurnId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
78
- }, z.core.$strip>, z.ZodObject<{
79
- kind: z.ZodLiteral<AgentEventKind.Tool>;
80
- conversationId: z.ZodString;
81
- participantId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
82
- toolName: z.ZodString;
83
- title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
84
- status: z.ZodEnum<typeof ToolEventStatus>;
85
- text: z.ZodOptional<z.ZodNullable<z.ZodString>>;
86
- eventId: z.ZodString;
87
63
  }, z.core.$strip>, z.ZodObject<{
88
64
  kind: z.ZodLiteral<AgentEventKind.Sandbox>;
89
65
  conversationId: z.ZodString;
@@ -98,7 +74,6 @@ export declare const agentEventInboundSchema: z.ZodDiscriminatedUnion<[z.ZodObje
98
74
  stderr: z.ZodOptional<z.ZodNullable<z.ZodString>>;
99
75
  eventId: z.ZodString;
100
76
  }, z.core.$strip>], "kind">;
101
- export type ToolEventInboundIface = z.infer<typeof toolEventSchema>;
102
77
  export type SandboxEventInboundIface = z.infer<typeof sandboxEventSchema>;
103
78
  export type AgentEventInboundIface = z.infer<typeof agentEventInboundSchema>;
104
79
  export declare enum ReceiveTargetKind {
@@ -114,9 +89,8 @@ export declare const targetedInboundSchema: z.ZodObject<{
114
89
  }, z.core.$strip>;
115
90
  export type TargetedInboundIface = z.infer<typeof targetedInboundSchema>;
116
91
  export type ChannelReceiveIface = (input: JsonValue, ctx: ChannelReceiveContextIface) => Promise<ConversationRefIface>;
117
- export declare const createTargetedReceive: (route?: DeliverMessageArgsIface["route"], turnPolicy?: TurnPolicy) => ChannelReceiveIface;
92
+ export declare const createTargetedInputReceive: (turnPolicy?: TurnPolicy) => ChannelReceiveIface;
118
93
  export declare const renderLinkedConversationEvent: (event: Pick<z.infer<typeof linkedConversationEventSchema>, "linkedTitle" | "event" | "text">) => string;
119
- export declare const renderToolEvent: (event: Pick<ToolEventInboundIface, "toolName" | "title" | "status" | "text">) => string;
120
94
  export declare const renderSandboxEvent: (event: Pick<SandboxEventInboundIface, "processId" | "command" | "exitCode" | "stdout" | "stderr">) => string;
121
95
  export declare const routeToOwner: (participantId: string) => (args: RouteArgsIface) => RouteDecisionIface[];
122
96
  export declare const receiveAgentEvent: ChannelReceiveIface;