@finalai/final-agent-provider 0.7.0 → 0.9.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 (76) hide show
  1. package/HOSTING.md +3 -3
  2. package/README.md +26 -91
  3. package/dist/modules/channel-factories.d.mts +5 -6
  4. package/dist/modules/channel-factories.mjs +7 -11
  5. package/dist/modules/channel-factories.mjs.map +3 -3
  6. package/dist/modules/channels/inbound.mjs +2 -2
  7. package/dist/modules/channels/inbound.mjs.map +2 -2
  8. package/dist/modules/channels/index.d.mts +0 -7
  9. package/dist/modules/channels/index.mjs +0 -7
  10. package/dist/modules/channels/index.mjs.map +2 -2
  11. package/dist/modules/channels/prompt.d.mts +2 -2
  12. package/dist/modules/channels/prompt.mjs +3 -3
  13. package/dist/modules/channels/prompt.mjs.map +2 -2
  14. package/dist/modules/channels/routing.d.mts +1 -1
  15. package/dist/modules/channels/routing.mjs +1 -1
  16. package/dist/modules/channels/routing.mjs.map +1 -1
  17. package/dist/modules/sandboxes/bytes.d.mts +1 -0
  18. package/dist/modules/sandboxes/bytes.mjs +7 -1
  19. package/dist/modules/sandboxes/bytes.mjs.map +2 -2
  20. package/dist/modules/sandboxes/computer-processes.mjs +5 -3
  21. package/dist/modules/sandboxes/computer-processes.mjs.map +2 -2
  22. package/dist/modules/sandboxes/computer.mjs +5 -1
  23. package/dist/modules/sandboxes/computer.mjs.map +2 -2
  24. package/dist/modules/sandboxes/computers-api-transport.d.mts +1 -1
  25. package/dist/modules/sandboxes/computers-api-transport.mjs +8 -0
  26. package/dist/modules/sandboxes/computers-api-transport.mjs.map +2 -2
  27. package/dist/modules/sandboxes/device-api.mjs +8 -0
  28. package/dist/modules/sandboxes/device-api.mjs.map +2 -2
  29. package/dist/modules/sandboxes/device.mjs +6 -0
  30. package/dist/modules/sandboxes/device.mjs.map +2 -2
  31. package/dist/modules/sandboxes/session.d.mts +1 -0
  32. package/dist/modules/sandboxes/session.mjs +106 -36
  33. package/dist/modules/sandboxes/session.mjs.map +3 -3
  34. package/dist/modules/sandboxes/testing/conformance.mjs +3 -0
  35. package/dist/modules/sandboxes/testing/conformance.mjs.map +2 -2
  36. package/dist/modules/sandboxes/testing/fake-machine.mjs +11 -0
  37. package/dist/modules/sandboxes/testing/fake-machine.mjs.map +2 -2
  38. package/dist/modules/sandboxes/transport.d.mts +1 -0
  39. package/dist/modules/sandboxes/transport.mjs.map +2 -2
  40. package/package.json +4 -40
  41. package/dist/modules/channels/channel-utils.d.mts +0 -132
  42. package/dist/modules/channels/channel-utils.mjs +0 -445
  43. package/dist/modules/channels/channel-utils.mjs.map +0 -7
  44. package/dist/modules/channels/discord-dispatch.d.mts +0 -17
  45. package/dist/modules/channels/discord-dispatch.mjs +0 -139
  46. package/dist/modules/channels/discord-dispatch.mjs.map +0 -7
  47. package/dist/modules/channels/discord-gateway.d.mts +0 -19
  48. package/dist/modules/channels/discord-gateway.mjs +0 -233
  49. package/dist/modules/channels/discord-gateway.mjs.map +0 -7
  50. package/dist/modules/channels/discord.d.mts +0 -9
  51. package/dist/modules/channels/discord.mjs +0 -904
  52. package/dist/modules/channels/discord.mjs.map +0 -7
  53. package/dist/modules/channels/github.d.mts +0 -5
  54. package/dist/modules/channels/github.mjs +0 -720
  55. package/dist/modules/channels/github.mjs.map +0 -7
  56. package/dist/modules/channels/linear.d.mts +0 -4
  57. package/dist/modules/channels/linear.mjs +0 -621
  58. package/dist/modules/channels/linear.mjs.map +0 -7
  59. package/dist/modules/channels/phone.d.mts +0 -8
  60. package/dist/modules/channels/phone.mjs +0 -382
  61. package/dist/modules/channels/phone.mjs.map +0 -7
  62. package/dist/modules/channels/reply-receipts.d.mts +0 -31
  63. package/dist/modules/channels/reply-receipts.mjs +0 -63
  64. package/dist/modules/channels/reply-receipts.mjs.map +0 -7
  65. package/dist/modules/channels/slack.d.mts +0 -7
  66. package/dist/modules/channels/slack.mjs +0 -1134
  67. package/dist/modules/channels/slack.mjs.map +0 -7
  68. package/dist/modules/channels/voice-recording.d.mts +0 -7
  69. package/dist/modules/channels/voice-recording.mjs +0 -49
  70. package/dist/modules/channels/voice-recording.mjs.map +0 -7
  71. package/dist/modules/channels/voice.d.mts +0 -33
  72. package/dist/modules/channels/voice.mjs +0 -851
  73. package/dist/modules/channels/voice.mjs.map +0 -7
  74. package/dist/modules/channels/webhook.d.mts +0 -5
  75. package/dist/modules/channels/webhook.mjs +0 -76
  76. package/dist/modules/channels/webhook.mjs.map +0 -7
@@ -1,139 +0,0 @@
1
- import {
2
- channelReceiveResultSchema,
3
- jsonValueSchema
4
- } from "@finalai/agent-provider";
5
- import * as z from "zod";
6
- import { abortable, stateKey } from "./channel-utils.mjs";
7
- const interactionSchema = z.object({
8
- id: z.string(),
9
- application_id: z.string(),
10
- token: z.string()
11
- });
12
- const createDiscordDispatch = (options) => {
13
- const { store, botId } = options;
14
- const tracked = /* @__PURE__ */ new Set();
15
- const knownOrigins = async (keys) => {
16
- for (const key of keys) if (tracked.has(key) || await store.get(key) != null) return true;
17
- const pending = z.array(z.object({ type: z.string(), data: jsonValueSchema })).max(100).safeParse(await store.get("discord-gateway-pending"));
18
- if (!pending.success) return false;
19
- const wanted = new Set(keys);
20
- return pending.data.some((entry) => {
21
- if (entry.type !== "MESSAGE_CREATE") return false;
22
- const message = z.object({ channel_id: z.string(), id: z.string() }).safeParse(entry.data);
23
- return message.success && wanted.has(stateKey("discord-origin", message.data.channel_id, message.data.id));
24
- });
25
- };
26
- const acknowledge = async (data, signal) => {
27
- const key = stateKey("discord-interaction-ack", data.id);
28
- const prior = await store.get(key);
29
- if (prior === "expired") return false;
30
- if (prior != null) return true;
31
- try {
32
- const bounded = AbortSignal.any([
33
- ...signal == null ? [] : [signal],
34
- AbortSignal.timeout(2500)
35
- ]);
36
- const request = async function* () {
37
- await options.request({
38
- path: `/interactions/${data.id}/${data.token}/callback`,
39
- body: { type: 5, data: { flags: 64 } },
40
- signal: bounded
41
- });
42
- yield true;
43
- };
44
- let acknowledged = false;
45
- for await (const result of abortable(request(), bounded)) acknowledged = result;
46
- if (!acknowledged) throw new Error("Discord acknowledgement was cancelled or timed out.");
47
- } catch (cause) {
48
- if (cause instanceof Error && /\b10062\b/.test(cause.message)) {
49
- await store.set(key, "expired", { ttlSeconds: 900 });
50
- return false;
51
- }
52
- if (!(cause instanceof Error) || !/\b40060\b/.test(cause.message)) throw cause;
53
- }
54
- await store.set(key, true, { ttlSeconds: 900 });
55
- return true;
56
- };
57
- return {
58
- accepts: async (type, data, signal) => {
59
- if (type === "GUILD_DELETE") {
60
- const guild = z.object({ id: z.string(), unavailable: z.boolean().optional() }).safeParse(data);
61
- return guild.success && guild.data.unavailable !== true;
62
- }
63
- if (type === "INTERACTION_CREATE") {
64
- const interaction = interactionSchema.safeParse(data);
65
- if (!interaction.success) return false;
66
- try {
67
- return await acknowledge(interaction.data, signal);
68
- } catch {
69
- return true;
70
- }
71
- }
72
- if (type === "MESSAGE_DELETE_BULK") {
73
- const bulk = z.object({ channel_id: z.string(), ids: z.array(z.string()).max(100) }).safeParse(data);
74
- if (!bulk.success) return false;
75
- return knownOrigins(
76
- bulk.data.ids.map((id2) => stateKey("discord-origin", bulk.data.channel_id, id2))
77
- );
78
- }
79
- if (type === "MESSAGE_CREATE") {
80
- const message = z.object({
81
- id: z.string(),
82
- channel_id: z.string(),
83
- guild_id: z.string().optional(),
84
- author: z.object({ bot: z.boolean().optional() }),
85
- mentions: z.array(z.object({ id: z.string() })).default([])
86
- }).safeParse(data);
87
- if (!message.success || message.data.author.bot === true || message.data.guild_id != null && !message.data.mentions.some((mention) => mention.id === botId))
88
- return false;
89
- tracked.add(stateKey("discord-origin", message.data.channel_id, message.data.id));
90
- if (tracked.size > 1e3) {
91
- const oldest = tracked.values().next().value;
92
- if (oldest != null) tracked.delete(oldest);
93
- }
94
- return true;
95
- }
96
- const change = z.object({
97
- id: z.string().optional(),
98
- message_id: z.string().optional(),
99
- channel_id: z.string(),
100
- user_id: z.string().optional(),
101
- author: z.object({ id: z.string() }).optional()
102
- }).safeParse(data);
103
- if (!change.success || change.data.user_id === botId || change.data.author?.id === botId)
104
- return false;
105
- const id = change.data.message_id ?? change.data.id;
106
- if (id == null) return false;
107
- const key = stateKey("discord-origin", change.data.channel_id, id);
108
- return knownOrigins([key]);
109
- },
110
- receive: async (input, signal) => {
111
- const interaction = z.object({ event: z.literal("INTERACTION_CREATE"), data: interactionSchema }).safeParse(input);
112
- if (interaction.success && !await acknowledge(interaction.data.data, signal))
113
- return { ignored: true, reason: "expired-interaction" };
114
- const resultKey = interaction.success ? stateKey("discord-interaction-result", interaction.data.data.id) : null;
115
- const prior = resultKey == null ? null : channelReceiveResultSchema.safeParse(await store.get(resultKey));
116
- const result = prior?.success === true ? prior.data : await options.receive(input, signal);
117
- if (resultKey != null && prior?.success !== true)
118
- await store.set(resultKey, jsonValueSchema.parse(result), { ttlSeconds: 900 });
119
- if (interaction.success) {
120
- const { id, application_id, token } = interaction.data.data;
121
- const message = await store.get(stateKey("discord-command-response", id));
122
- await options.request({
123
- path: `/webhooks/${application_id}/${token}/messages/@original`,
124
- body: {
125
- content: typeof message === "string" ? message : "accepted" in result && !result.accepted ? `${result.refusal.message} ${result.refusal.linkUrl ?? result.refusal.connectUrl ?? ""}` : "Accepted in Final",
126
- allowed_mentions: { parse: [] }
127
- },
128
- method: "PATCH",
129
- signal
130
- });
131
- }
132
- return result;
133
- }
134
- };
135
- };
136
- export {
137
- createDiscordDispatch
138
- };
139
- //# sourceMappingURL=discord-dispatch.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/channels/discord-dispatch.ts"],
4
- "sourcesContent": ["import {\n channelReceiveResultSchema,\n jsonValueSchema,\n type ChannelReceiveContextIface,\n type ChannelReceiveResult,\n type JsonObject,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport { abortable, stateKey } from \"./channel-utils.mjs\";\ninterface DiscordDispatchOptionsIface {\n store: ChannelReceiveContextIface['store'];\n botId: string;\n receive(input: JsonValue, signal: AbortSignal): Promise<ChannelReceiveResult>;\n request(args: {\n path: string;\n body: JsonObject;\n method?: string;\n signal?: AbortSignal;\n }): Promise<unknown>;\n}\nconst interactionSchema = z.object({\n id: z.string(),\n application_id: z.string(),\n token: z.string(),\n});\nexport const createDiscordDispatch = (options: DiscordDispatchOptionsIface) => {\n const { store, botId } = options;\n const tracked = new Set<string>();\n const knownOrigins = async (keys: string[]): Promise<boolean> => {\n for (const key of keys) if (tracked.has(key) || (await store.get(key)) != null) return true;\n const pending = z\n .array(z.object({ type: z.string(), data: jsonValueSchema }))\n .max(100)\n .safeParse(await store.get('discord-gateway-pending'));\n if (!pending.success) return false;\n const wanted = new Set(keys);\n return pending.data.some((entry) => {\n if (entry.type !== 'MESSAGE_CREATE') return false;\n const message = z.object({ channel_id: z.string(), id: z.string() }).safeParse(entry.data);\n return (\n message.success &&\n wanted.has(stateKey('discord-origin', message.data.channel_id, message.data.id))\n );\n });\n };\n\n const acknowledge = async (\n data: z.infer<typeof interactionSchema>,\n signal?: AbortSignal,\n ): Promise<boolean> => {\n const key = stateKey('discord-interaction-ack', data.id);\n const prior = await store.get(key);\n if (prior === 'expired') return false;\n if (prior != null) return true;\n try {\n const bounded = AbortSignal.any([\n ...(signal == null ? [] : [signal]),\n AbortSignal.timeout(2_500),\n ]);\n const request = async function* () {\n await options.request({\n path: `/interactions/${data.id}/${data.token}/callback`,\n body: { type: 5, data: { flags: 64 } },\n signal: bounded,\n });\n yield true;\n };\n let acknowledged = false;\n for await (const result of abortable(request(), bounded)) acknowledged = result;\n if (!acknowledged) throw new Error('Discord acknowledgement was cancelled or timed out.');\n } catch (cause) {\n // A replay after a lost acknowledgement receipt is safe to continue.\n if (cause instanceof Error && /\\b10062\\b/.test(cause.message)) {\n await store.set(key, 'expired', { ttlSeconds: 900 });\n return false;\n }\n if (!(cause instanceof Error) || !/\\b40060\\b/.test(cause.message)) throw cause;\n }\n await store.set(key, true, { ttlSeconds: 900 });\n return true;\n };\n return {\n accepts: async (type: string, data: JsonValue, signal?: AbortSignal): Promise<boolean> => {\n if (type === 'GUILD_DELETE') {\n const guild = z\n .object({ id: z.string(), unavailable: z.boolean().optional() })\n .safeParse(data);\n return guild.success && guild.data.unavailable !== true;\n }\n if (type === 'INTERACTION_CREATE') {\n const interaction = interactionSchema.safeParse(data);\n if (!interaction.success) return false;\n // Acknowledge before journaling or waiting behind older message deliveries.\n try {\n return await acknowledge(interaction.data, signal);\n } catch {\n // Journal transient failures so retries run independently of the Gateway cursor.\n return true;\n }\n }\n if (type === 'MESSAGE_DELETE_BULK') {\n const bulk = z\n .object({ channel_id: z.string(), ids: z.array(z.string()).max(100) })\n .safeParse(data);\n if (!bulk.success) return false;\n return knownOrigins(\n bulk.data.ids.map((id) => stateKey('discord-origin', bulk.data.channel_id, id)),\n );\n }\n if (type === 'MESSAGE_CREATE') {\n const message = z\n .object({\n id: z.string(),\n channel_id: z.string(),\n guild_id: z.string().optional(),\n author: z.object({ bot: z.boolean().optional() }),\n mentions: z.array(z.object({ id: z.string() })).default([]),\n })\n .safeParse(data);\n if (\n !message.success ||\n message.data.author.bot === true ||\n (message.data.guild_id != null &&\n !message.data.mentions.some((mention) => mention.id === botId))\n )\n return false;\n tracked.add(stateKey('discord-origin', message.data.channel_id, message.data.id));\n if (tracked.size > 1000) {\n const oldest = tracked.values().next().value;\n if (oldest != null) tracked.delete(oldest);\n }\n return true;\n }\n const change = z\n .object({\n id: z.string().optional(),\n message_id: z.string().optional(),\n channel_id: z.string(),\n user_id: z.string().optional(),\n author: z.object({ id: z.string() }).optional(),\n })\n .safeParse(data);\n if (!change.success || change.data.user_id === botId || change.data.author?.id === botId)\n return false;\n const id = change.data.message_id ?? change.data.id;\n if (id == null) return false;\n const key = stateKey('discord-origin', change.data.channel_id, id);\n return knownOrigins([key]);\n },\n receive: async (input: JsonValue, signal: AbortSignal): Promise<ChannelReceiveResult> => {\n const interaction = z\n .object({ event: z.literal('INTERACTION_CREATE'), data: interactionSchema })\n .safeParse(input);\n if (interaction.success && !(await acknowledge(interaction.data.data, signal)))\n return { ignored: true, reason: 'expired-interaction' };\n const resultKey = interaction.success\n ? stateKey('discord-interaction-result', interaction.data.data.id)\n : null;\n const prior =\n resultKey == null ? null : channelReceiveResultSchema.safeParse(await store.get(resultKey));\n const result = prior?.success === true ? prior.data : await options.receive(input, signal);\n if (resultKey != null && prior?.success !== true)\n await store.set(resultKey, jsonValueSchema.parse(result), { ttlSeconds: 900 });\n if (interaction.success) {\n const { id, application_id, token } = interaction.data.data;\n const message = await store.get(stateKey('discord-command-response', id));\n await options.request({\n path: `/webhooks/${application_id}/${token}/messages/@original`,\n body: {\n content:\n typeof message === 'string'\n ? message\n : 'accepted' in result && !result.accepted\n ? `${result.refusal.message} ${result.refusal.linkUrl ?? result.refusal.connectUrl ?? ''}`\n : 'Accepted in Final',\n allowed_mentions: { parse: [] },\n },\n method: 'PATCH',\n signal,\n });\n }\n return result;\n },\n };\n};\n"],
5
- "mappings": "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",
6
- "names": ["id"]
7
- }
@@ -1,19 +0,0 @@
1
- import { type ChannelReceiveContextIface, type JsonValue } from '@finalai/agent-provider';
2
- interface GatewayTransportIface {
3
- messages: AsyncIterable<string>;
4
- send(data: string): void;
5
- close(): void;
6
- closeCode(): number | null;
7
- }
8
- interface GatewayOptionsIface<Config> {
9
- ctx: ChannelReceiveContextIface<Config> & {
10
- signal: AbortSignal;
11
- };
12
- url: string;
13
- token: string;
14
- connect(url: string): GatewayTransportIface;
15
- receive(input: JsonValue, signal: AbortSignal): Promise<unknown>;
16
- accepts?(type: string, data: JsonValue, signal: AbortSignal): boolean | Promise<boolean>;
17
- }
18
- export declare const runDiscordGateway: <Config>(options: GatewayOptionsIface<Config>) => Promise<void>;
19
- export {};
@@ -1,233 +0,0 @@
1
- import {
2
- jsonValueSchema
3
- } from "@finalai/agent-provider";
4
- import * as z from "zod";
5
- import { abortable, parseJson } from "./channel-utils.mjs";
6
- const deliveredEvents = /* @__PURE__ */ new Set([
7
- "MESSAGE_CREATE",
8
- "MESSAGE_UPDATE",
9
- "MESSAGE_DELETE",
10
- "MESSAGE_DELETE_BULK",
11
- "MESSAGE_REACTION_ADD",
12
- "MESSAGE_REACTION_REMOVE",
13
- "INTERACTION_CREATE",
14
- "GUILD_DELETE"
15
- ]);
16
- const pendingSchema = z.array(
17
- z.object({
18
- id: z.string(),
19
- type: z.string(),
20
- data: jsonValueSchema,
21
- attempts: z.number(),
22
- nextAttemptAt: z.number()
23
- })
24
- ).max(100);
25
- const resumeSchema = z.object({
26
- sessionId: z.string(),
27
- url: z.string().url(),
28
- sequence: z.number()
29
- });
30
- const messageKeySchema = z.object({
31
- channel_id: z.string(),
32
- id: z.string().optional(),
33
- message_id: z.string().optional(),
34
- ids: z.array(z.string()).max(100).optional()
35
- });
36
- const messageKeys = (data) => {
37
- const parsed = messageKeySchema.safeParse(data);
38
- if (!parsed.success) return [];
39
- const id = parsed.data.message_id ?? parsed.data.id;
40
- return (parsed.data.ids ?? (id == null ? [] : [id])).map(
41
- (value) => JSON.stringify([parsed.data.channel_id, value])
42
- );
43
- };
44
- const runDiscordGateway = async (options) => {
45
- const { ctx } = options;
46
- ctx.signal.throwIfAborted();
47
- const stopped = new AbortController();
48
- const signal = AbortSignal.any([ctx.signal, stopped.signal]);
49
- const saved = resumeSchema.safeParse(await ctx.store.get("discord-gateway-resume"));
50
- let sessionId = saved.success ? saved.data.sessionId : null;
51
- let resumeUrl = saved.success ? saved.data.url : options.url;
52
- let sequence = saved.success ? saved.data.sequence : null;
53
- let cursorPersistedAt = 0;
54
- const pending = pendingSchema.parse(await ctx.store.get("discord-gateway-pending") ?? []);
55
- ctx.signal.throwIfAborted();
56
- let transport = null;
57
- let progress = Promise.withResolvers();
58
- let heartbeat = null;
59
- let acknowledged = true;
60
- let failure = null;
61
- const wake = {};
62
- let writes = Promise.resolve();
63
- const persist = () => {
64
- const next = writes.then(
65
- () => ctx.store.set("discord-gateway-pending", jsonValueSchema.parse(pending), {
66
- ttlSeconds: 90 * 24 * 60 * 60
67
- })
68
- ).then(() => {
69
- progress.resolve();
70
- progress = Promise.withResolvers();
71
- });
72
- writes = next.catch(() => void 0);
73
- return next;
74
- };
75
- const stop = () => {
76
- stopped.abort();
77
- if (heartbeat != null) clearInterval(heartbeat);
78
- wake.notify?.();
79
- progress.resolve();
80
- transport?.close();
81
- };
82
- ctx.signal.addEventListener("abort", stop, { once: true });
83
- const deliveries = (async () => {
84
- while (!signal.aborted) {
85
- const earlierKeys = /* @__PURE__ */ new Set();
86
- const eligible = pending.filter((entry) => {
87
- const keys = messageKeys(entry.data);
88
- const blocked = keys.some((key) => earlierKeys.has(key));
89
- for (const key of keys) earlierKeys.add(key);
90
- return !blocked;
91
- });
92
- const item = eligible.find((entry) => entry.nextAttemptAt <= Date.now());
93
- if (item == null) {
94
- const wait = Promise.withResolvers();
95
- wake.notify = () => wait.resolve();
96
- const delay = pending.length === 0 ? null : Math.max(1, Math.min(...eligible.map((entry) => entry.nextAttemptAt)) - Date.now());
97
- const timer = delay == null ? null : setTimeout(() => wait.resolve(), delay);
98
- try {
99
- if (!signal.aborted) await wait.promise;
100
- } finally {
101
- if (timer != null) clearTimeout(timer);
102
- delete wake.notify;
103
- }
104
- continue;
105
- }
106
- try {
107
- await options.receive({ event: item.type, data: item.data }, signal);
108
- pending.splice(pending.indexOf(item), 1);
109
- } catch {
110
- if (signal.aborted) break;
111
- item.attempts += 1;
112
- if (item.attempts >= 12) {
113
- const failed = pendingSchema.parse(await ctx.store.get("discord-gateway-failed") ?? []).filter((entry) => entry.id !== item.id);
114
- failed.push(item);
115
- while (failed.length > 50 || new TextEncoder().encode(JSON.stringify(failed)).byteLength > 512 * 1024)
116
- failed.shift();
117
- await ctx.store.set("discord-gateway-failed", jsonValueSchema.parse(failed), {
118
- ttlSeconds: 7 * 24 * 60 * 60
119
- });
120
- pending.splice(pending.indexOf(item), 1);
121
- ctx.log("Discord delivery exhausted retries; retained in failed deliveries.", {
122
- event: item.type,
123
- attempts: item.attempts
124
- });
125
- } else {
126
- item.nextAttemptAt = Date.now() + Math.min(6e4, 1e3 * 2 ** Math.min(item.attempts - 1, 6));
127
- ctx.log("Discord delivery deferred.", { event: item.type, attempts: item.attempts });
128
- }
129
- }
130
- await persist();
131
- }
132
- })().catch((error) => {
133
- failure = error instanceof Error ? error : new Error("Discord delivery failed.");
134
- stop();
135
- });
136
- try {
137
- while (!signal.aborted && (pending.length >= 50 || new TextEncoder().encode(JSON.stringify(pending)).byteLength >= 256 * 1024))
138
- await progress.promise;
139
- if (signal.aborted) {
140
- if (failure != null) throw failure;
141
- return;
142
- }
143
- const active = options.connect(`${resumeUrl}/?v=10&encoding=json`);
144
- transport = active;
145
- for await (const raw of abortable(active.messages, signal)) {
146
- const event = z.object({
147
- op: z.number(),
148
- d: jsonValueSchema.nullish().default(null),
149
- s: z.number().nullish(),
150
- t: z.string().nullish()
151
- }).safeParse(parseJson(raw));
152
- if (!event.success) continue;
153
- if (event.data.op === 10) {
154
- const hello = z.object({ heartbeat_interval: z.number().positive() }).parse(event.data.d);
155
- heartbeat = setInterval(() => {
156
- if (!acknowledged) {
157
- stop();
158
- return;
159
- }
160
- acknowledged = false;
161
- active.send(JSON.stringify({ op: 1, d: sequence }));
162
- }, hello.heartbeat_interval);
163
- active.send(
164
- JSON.stringify(
165
- sessionId != null && sequence != null ? { op: 6, d: { token: options.token, session_id: sessionId, seq: sequence } } : {
166
- op: 2,
167
- d: {
168
- token: options.token,
169
- intents: 1 | 512 | 1024 | 4096 | 8192,
170
- properties: { os: "linux", browser: "final-channel", device: "final-channel" }
171
- }
172
- }
173
- )
174
- );
175
- } else if (event.data.op === 11) acknowledged = true;
176
- else if (event.data.op === 1) active.send(JSON.stringify({ op: 1, d: sequence }));
177
- else if (event.data.op === 7 || event.data.op === 9) {
178
- if (event.data.op === 9 && event.data.d !== true)
179
- await ctx.store.set("discord-gateway-resume", null);
180
- throw new Error("Discord Gateway requested reconnect");
181
- } else if (event.data.op === 0 && event.data.t != null) {
182
- if (event.data.s == null) continue;
183
- let relevant = false;
184
- if (event.data.t === "READY") {
185
- relevant = true;
186
- const ready = z.object({ session_id: z.string(), resume_gateway_url: z.string().url() }).parse(event.data.d);
187
- sessionId = ready.session_id;
188
- resumeUrl = ready.resume_gateway_url;
189
- } else if (deliveredEvents.has(event.data.t) && (await options.accepts?.(event.data.t, event.data.d, signal) ?? true)) {
190
- relevant = true;
191
- const id = JSON.stringify([sessionId, event.data.s]);
192
- if (!pending.some((entry) => entry.id === id)) {
193
- if (pending.length >= 100) throw new Error("Discord delivery queue is full");
194
- const item = {
195
- id,
196
- type: event.data.t,
197
- data: event.data.d,
198
- attempts: 0,
199
- nextAttemptAt: Date.now()
200
- };
201
- if (new TextEncoder().encode(JSON.stringify([...pending, item])).byteLength > 512 * 1024)
202
- throw new Error("Discord delivery queue is full");
203
- pending.push(item);
204
- await persist();
205
- wake.notify?.();
206
- }
207
- }
208
- if (event.data.s != null) sequence = event.data.s;
209
- if (sessionId != null && sequence != null && (relevant || Date.now() - cursorPersistedAt >= 1e3)) {
210
- await ctx.store.set(
211
- "discord-gateway-resume",
212
- { sessionId, url: resumeUrl, sequence },
213
- { ttlSeconds: 3600 }
214
- );
215
- cursorPersistedAt = Date.now();
216
- }
217
- }
218
- }
219
- if (failure != null) throw failure;
220
- if (!ctx.signal.aborted) throw new Error("Discord Gateway disconnected");
221
- } finally {
222
- ctx.signal.removeEventListener("abort", stop);
223
- stop();
224
- await deliveries;
225
- await writes;
226
- if (transport?.closeCode() === 4007 || transport?.closeCode() === 4009)
227
- await ctx.store.set("discord-gateway-resume", null);
228
- }
229
- };
230
- export {
231
- runDiscordGateway
232
- };
233
- //# sourceMappingURL=discord-gateway.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/channels/discord-gateway.ts"],
4
- "sourcesContent": ["import {\n jsonValueSchema,\n type ChannelReceiveContextIface,\n type JsonValue,\n} from '@finalai/agent-provider';\nimport * as z from 'zod';\nimport { abortable, parseJson } from \"./channel-utils.mjs\";\n\ninterface GatewayTransportIface {\n messages: AsyncIterable<string>;\n send(data: string): void;\n close(): void;\n closeCode(): number | null;\n}\ninterface GatewayOptionsIface<Config> {\n ctx: ChannelReceiveContextIface<Config> & { signal: AbortSignal };\n url: string;\n token: string;\n connect(url: string): GatewayTransportIface;\n receive(input: JsonValue, signal: AbortSignal): Promise<unknown>;\n accepts?(type: string, data: JsonValue, signal: AbortSignal): boolean | Promise<boolean>;\n}\nconst deliveredEvents = new Set([\n 'MESSAGE_CREATE',\n 'MESSAGE_UPDATE',\n 'MESSAGE_DELETE',\n 'MESSAGE_DELETE_BULK',\n 'MESSAGE_REACTION_ADD',\n 'MESSAGE_REACTION_REMOVE',\n 'INTERACTION_CREATE',\n 'GUILD_DELETE',\n]);\nconst pendingSchema = z\n .array(\n z.object({\n id: z.string(),\n type: z.string(),\n data: jsonValueSchema,\n attempts: z.number(),\n nextAttemptAt: z.number(),\n }),\n )\n .max(100);\nconst resumeSchema = z.object({\n sessionId: z.string(),\n url: z.string().url(),\n sequence: z.number(),\n});\n\nconst messageKeySchema = z.object({\n channel_id: z.string(),\n id: z.string().optional(),\n message_id: z.string().optional(),\n ids: z.array(z.string()).max(100).optional(),\n});\nconst messageKeys = (data: JsonValue): string[] => {\n const parsed = messageKeySchema.safeParse(data);\n if (!parsed.success) return [];\n const id = parsed.data.message_id ?? parsed.data.id;\n return (parsed.data.ids ?? (id == null ? [] : [id])).map((value) =>\n JSON.stringify([parsed.data.channel_id, value]),\n );\n};\n\n// Dispatches are journaled before advancing the provider resume cursor.\n// Different messages retry independently; mutations retain their per-message order.\nexport const runDiscordGateway = async <Config>(\n options: GatewayOptionsIface<Config>,\n): Promise<void> => {\n const { ctx } = options;\n ctx.signal.throwIfAborted();\n const stopped = new AbortController();\n const signal = AbortSignal.any([ctx.signal, stopped.signal]);\n const saved = resumeSchema.safeParse(await ctx.store.get('discord-gateway-resume'));\n let sessionId = saved.success ? saved.data.sessionId : null;\n let resumeUrl = saved.success ? saved.data.url : options.url;\n let sequence: number | null = saved.success ? saved.data.sequence : null;\n let cursorPersistedAt = 0;\n const pending = pendingSchema.parse((await ctx.store.get('discord-gateway-pending')) ?? []);\n ctx.signal.throwIfAborted();\n let transport: GatewayTransportIface | null = null;\n let progress = Promise.withResolvers<void>();\n let heartbeat: ReturnType<typeof setInterval> | null = null;\n let acknowledged = true;\n let failure: Error | null = null;\n const wake: { notify?: () => void } = {};\n let writes = Promise.resolve();\n const persist = (): Promise<void> => {\n const next = writes\n .then(() =>\n ctx.store.set('discord-gateway-pending', jsonValueSchema.parse(pending), {\n ttlSeconds: 90 * 24 * 60 * 60,\n }),\n )\n .then(() => {\n progress.resolve();\n progress = Promise.withResolvers<void>();\n });\n writes = next.catch(() => undefined);\n return next;\n };\n const stop = (): void => {\n stopped.abort();\n if (heartbeat != null) clearInterval(heartbeat);\n wake.notify?.();\n progress.resolve();\n transport?.close();\n };\n ctx.signal.addEventListener('abort', stop, { once: true });\n const deliveries = (async () => {\n while (!signal.aborted) {\n const earlierKeys = new Set<string>();\n const eligible = pending.filter((entry) => {\n const keys = messageKeys(entry.data);\n const blocked = keys.some((key) => earlierKeys.has(key));\n // Blocked bulk mutations still reserve all affected messages' order.\n for (const key of keys) earlierKeys.add(key);\n return !blocked;\n });\n const item = eligible.find((entry) => entry.nextAttemptAt <= Date.now());\n if (item == null) {\n const wait = Promise.withResolvers<void>();\n wake.notify = () => wait.resolve();\n const delay =\n pending.length === 0\n ? null\n : Math.max(1, Math.min(...eligible.map((entry) => entry.nextAttemptAt)) - Date.now());\n const timer = delay == null ? null : setTimeout(() => wait.resolve(), delay);\n try {\n if (!signal.aborted) await wait.promise;\n } finally {\n if (timer != null) clearTimeout(timer);\n delete wake.notify;\n }\n continue;\n }\n try {\n await options.receive({ event: item.type, data: item.data }, signal);\n pending.splice(pending.indexOf(item), 1);\n } catch {\n if (signal.aborted) break;\n item.attempts += 1;\n if (item.attempts >= 12) {\n const failed = pendingSchema\n .parse((await ctx.store.get('discord-gateway-failed')) ?? [])\n .filter((entry) => entry.id !== item.id);\n failed.push(item);\n while (\n failed.length > 50 ||\n new TextEncoder().encode(JSON.stringify(failed)).byteLength > 512 * 1024\n )\n failed.shift();\n await ctx.store.set('discord-gateway-failed', jsonValueSchema.parse(failed), {\n ttlSeconds: 7 * 24 * 60 * 60,\n });\n pending.splice(pending.indexOf(item), 1);\n ctx.log('Discord delivery exhausted retries; retained in failed deliveries.', {\n event: item.type,\n attempts: item.attempts,\n });\n } else {\n item.nextAttemptAt =\n Date.now() + Math.min(60_000, 1_000 * 2 ** Math.min(item.attempts - 1, 6));\n ctx.log('Discord delivery deferred.', { event: item.type, attempts: item.attempts });\n }\n }\n await persist();\n }\n })().catch((error: unknown) => {\n failure = error instanceof Error ? error : new Error('Discord delivery failed.');\n stop();\n });\n try {\n while (\n !signal.aborted &&\n (pending.length >= 50 ||\n new TextEncoder().encode(JSON.stringify(pending)).byteLength >= 256 * 1024)\n )\n await progress.promise;\n if (signal.aborted) {\n if (failure != null) throw failure;\n return;\n }\n const active = options.connect(`${resumeUrl}/?v=10&encoding=json`);\n transport = active;\n for await (const raw of abortable(active.messages, signal)) {\n const event = z\n .object({\n op: z.number(),\n d: jsonValueSchema.nullish().default(null),\n s: z.number().nullish(),\n t: z.string().nullish(),\n })\n .safeParse(parseJson(raw));\n if (!event.success) continue;\n if (event.data.op === 10) {\n const hello = z.object({ heartbeat_interval: z.number().positive() }).parse(event.data.d);\n heartbeat = setInterval(() => {\n if (!acknowledged) {\n stop();\n return;\n }\n acknowledged = false;\n active.send(JSON.stringify({ op: 1, d: sequence }));\n }, hello.heartbeat_interval);\n active.send(\n JSON.stringify(\n sessionId != null && sequence != null\n ? { op: 6, d: { token: options.token, session_id: sessionId, seq: sequence } }\n : {\n op: 2,\n d: {\n token: options.token,\n intents: 1 | 512 | 1024 | 4096 | 8192,\n properties: { os: 'linux', browser: 'final-channel', device: 'final-channel' },\n },\n },\n ),\n );\n } else if (event.data.op === 11) acknowledged = true;\n else if (event.data.op === 1) active.send(JSON.stringify({ op: 1, d: sequence }));\n else if (event.data.op === 7 || event.data.op === 9) {\n if (event.data.op === 9 && event.data.d !== true)\n await ctx.store.set('discord-gateway-resume', null);\n throw new Error('Discord Gateway requested reconnect');\n } else if (event.data.op === 0 && event.data.t != null) {\n if (event.data.s == null) continue;\n let relevant = false;\n if (event.data.t === 'READY') {\n relevant = true;\n const ready = z\n .object({ session_id: z.string(), resume_gateway_url: z.string().url() })\n .parse(event.data.d);\n sessionId = ready.session_id;\n resumeUrl = ready.resume_gateway_url;\n } else if (\n deliveredEvents.has(event.data.t) &&\n ((await options.accepts?.(event.data.t, event.data.d, signal)) ?? true)\n ) {\n relevant = true;\n const id = JSON.stringify([sessionId, event.data.s]);\n if (!pending.some((entry) => entry.id === id)) {\n if (pending.length >= 100) throw new Error('Discord delivery queue is full');\n const item = {\n id,\n type: event.data.t,\n data: event.data.d,\n attempts: 0,\n nextAttemptAt: Date.now(),\n };\n if (\n new TextEncoder().encode(JSON.stringify([...pending, item])).byteLength >\n 512 * 1024\n )\n throw new Error('Discord delivery queue is full');\n pending.push(item);\n await persist();\n wake.notify?.();\n }\n }\n if (event.data.s != null) sequence = event.data.s;\n if (\n sessionId != null &&\n sequence != null &&\n (relevant || Date.now() - cursorPersistedAt >= 1000)\n ) {\n await ctx.store.set(\n 'discord-gateway-resume',\n { sessionId, url: resumeUrl, sequence },\n { ttlSeconds: 3600 },\n );\n cursorPersistedAt = Date.now();\n }\n }\n }\n if (failure != null) throw failure;\n if (!ctx.signal.aborted) throw new Error('Discord Gateway disconnected');\n } finally {\n ctx.signal.removeEventListener('abort', stop);\n stop();\n await deliveries;\n await writes;\n if (transport?.closeCode() === 4007 || transport?.closeCode() === 4009)\n await ctx.store.set('discord-gateway-resume', null);\n }\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,9 +0,0 @@
1
- import { type JsonObject, type JsonValue } from '@finalai/agent-provider';
2
- export declare const discordChannel: (options?: JsonObject) => import("@finalai/agent-provider").ChannelDefinitionIface<{
3
- history: "none" | "linked-members";
4
- baseUrl?: string | undefined;
5
- publicKey?: string | undefined;
6
- botId?: string | undefined;
7
- }, JsonValue, {
8
- text: string;
9
- }>;