@feeble/blay-openclaw-plugin 0.1.17

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 (79) hide show
  1. package/README.md +24 -0
  2. package/dist/channel/abort.d.ts +11 -0
  3. package/dist/channel/abort.js +20 -0
  4. package/dist/channel/abort.js.map +1 -0
  5. package/dist/channel/inbound.d.ts +53 -0
  6. package/dist/channel/inbound.js +384 -0
  7. package/dist/channel/inbound.js.map +1 -0
  8. package/dist/channel/plugin.d.ts +25 -0
  9. package/dist/channel/plugin.js +291 -0
  10. package/dist/channel/plugin.js.map +1 -0
  11. package/dist/channel/run-tracker.d.ts +54 -0
  12. package/dist/channel/run-tracker.js +137 -0
  13. package/dist/channel/run-tracker.js.map +1 -0
  14. package/dist/channel/runtime.d.ts +8 -0
  15. package/dist/channel/runtime.js +16 -0
  16. package/dist/channel/runtime.js.map +1 -0
  17. package/dist/channel/sse-client.d.ts +54 -0
  18. package/dist/channel/sse-client.js +154 -0
  19. package/dist/channel/sse-client.js.map +1 -0
  20. package/dist/channel/state.d.ts +6 -0
  21. package/dist/channel/state.js +11 -0
  22. package/dist/channel/state.js.map +1 -0
  23. package/dist/client.d.ts +23 -0
  24. package/dist/client.js +98 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/index.d.ts +16 -0
  27. package/dist/index.js +228 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/telemetry/pusher.d.ts +71 -0
  30. package/dist/telemetry/pusher.js +461 -0
  31. package/dist/telemetry/pusher.js.map +1 -0
  32. package/dist/telemetry/usage-collector.d.ts +39 -0
  33. package/dist/telemetry/usage-collector.js +60 -0
  34. package/dist/telemetry/usage-collector.js.map +1 -0
  35. package/dist/tools/action-items.d.ts +60 -0
  36. package/dist/tools/action-items.js +101 -0
  37. package/dist/tools/action-items.js.map +1 -0
  38. package/dist/tools/briefing.d.ts +15 -0
  39. package/dist/tools/briefing.js +138 -0
  40. package/dist/tools/briefing.js.map +1 -0
  41. package/dist/tools/comments.d.ts +43 -0
  42. package/dist/tools/comments.js +79 -0
  43. package/dist/tools/comments.js.map +1 -0
  44. package/dist/tools/context.d.ts +20 -0
  45. package/dist/tools/context.js +31 -0
  46. package/dist/tools/context.js.map +1 -0
  47. package/dist/tools/instrumentation.d.ts +19 -0
  48. package/dist/tools/instrumentation.js +84 -0
  49. package/dist/tools/instrumentation.js.map +1 -0
  50. package/dist/tools/notifications.d.ts +29 -0
  51. package/dist/tools/notifications.js +57 -0
  52. package/dist/tools/notifications.js.map +1 -0
  53. package/dist/tools/org.d.ts +12 -0
  54. package/dist/tools/org.js +31 -0
  55. package/dist/tools/org.js.map +1 -0
  56. package/dist/tools/projects.d.ts +73 -0
  57. package/dist/tools/projects.js +121 -0
  58. package/dist/tools/projects.js.map +1 -0
  59. package/dist/tools/search.d.ts +20 -0
  60. package/dist/tools/search.js +50 -0
  61. package/dist/tools/search.js.map +1 -0
  62. package/dist/tools/tasks.d.ts +110 -0
  63. package/dist/tools/tasks.js +168 -0
  64. package/dist/tools/tasks.js.map +1 -0
  65. package/dist/tools/users.d.ts +12 -0
  66. package/dist/tools/users.js +31 -0
  67. package/dist/tools/users.js.map +1 -0
  68. package/dist/types.d.ts +20 -0
  69. package/dist/types.js +5 -0
  70. package/dist/types.js.map +1 -0
  71. package/dist/utils/formatting.d.ts +16 -0
  72. package/dist/utils/formatting.js +196 -0
  73. package/dist/utils/formatting.js.map +1 -0
  74. package/dist/webhook/handler.d.ts +10 -0
  75. package/dist/webhook/handler.js +70 -0
  76. package/dist/webhook/handler.js.map +1 -0
  77. package/openclaw.plugin.json +21 -0
  78. package/package.json +36 -0
  79. package/skills/blay/SKILL.md +25 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # blay-openclaw-plugin
2
+
3
+ OpenClaw plugin for [Blay](https://blay.io) — gives your agent project management tools, real-time event streaming, and the ability to collaborate on tasks, comments, and projects.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ openclaw plugins install blay-openclaw-plugin
9
+ ```
10
+
11
+ ## Configure
12
+
13
+ When prompted, provide your Blay API key. You can generate one by creating an agent in your Blay workspace.
14
+
15
+ | Field | Required | Description |
16
+ |-------|----------|-------------|
17
+ | `apiKey` | Yes | Your Blay API key (`blay_...`) |
18
+ | `apiUrl` | No | API base URL (defaults to `https://api.blay.io`) |
19
+
20
+ ## What it does
21
+
22
+ - **Real-time events** — Agent receives comments, task assignments, and mentions via SSE
23
+ - **Project management tools** — Read/write tasks, projects, comments, resources, and action items
24
+ - **Agent collaboration** — Responds in context on task and project feeds
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Abort State — module-level kill switch for in-flight agent runs.
3
+ *
4
+ * When a user sends "stop" (or similar abort trigger), signalAbort() is called
5
+ * to set a flag. The deliver callback and tool hooks check this flag to
6
+ * suppress all output and block tool execution. resetAbort() clears the flag
7
+ * at the start of each new dispatch so normal processing resumes.
8
+ */
9
+ export declare function signalAbort(): void;
10
+ export declare function isAborted(): boolean;
11
+ export declare function resetAbort(): void;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Abort State — module-level kill switch for in-flight agent runs.
3
+ *
4
+ * When a user sends "stop" (or similar abort trigger), signalAbort() is called
5
+ * to set a flag. The deliver callback and tool hooks check this flag to
6
+ * suppress all output and block tool execution. resetAbort() clears the flag
7
+ * at the start of each new dispatch so normal processing resumes.
8
+ */
9
+ let _aborted = false;
10
+ export function signalAbort() {
11
+ _aborted = true;
12
+ console.log("[blay] abort signal set");
13
+ }
14
+ export function isAborted() {
15
+ return _aborted;
16
+ }
17
+ export function resetAbort() {
18
+ _aborted = false;
19
+ }
20
+ //# sourceMappingURL=abort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../src/channel/abort.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,MAAM,UAAU,WAAW;IACzB,QAAQ,GAAG,IAAI,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Inbound Handler — converts Blay events into MsgContext
3
+ * and dispatches them through OpenClaw's native auto-reply pipeline.
4
+ *
5
+ * Follows the same 4-step pattern every OpenClaw channel uses
6
+ * (Telegram, Discord, Signal, Line, IRC, etc.):
7
+ *
8
+ * 1. resolveAgentRoute — determines agent ID, session key, tool/skill config
9
+ * 2. recordInboundSession — registers the session for history and state
10
+ * 3. createReplyPrefixOptions — sets up response prefix template context
11
+ * 4. dispatchReplyWithBufferedBlockDispatcher — runs the agent with tools and delivers reply
12
+ */
13
+ export declare function isAbortTrigger(text?: string): boolean;
14
+ export interface WebhookPayload {
15
+ event: string;
16
+ timestamp: number;
17
+ organization_id?: string;
18
+ actor?: {
19
+ id: string;
20
+ name: string;
21
+ };
22
+ target?: {
23
+ type: string;
24
+ id: string;
25
+ name: string;
26
+ };
27
+ project?: {
28
+ name: string;
29
+ };
30
+ data?: Record<string, unknown>;
31
+ }
32
+ /**
33
+ * Post a comment to Blay via the API client.
34
+ * Returns the comment ID if successful, null otherwise.
35
+ */
36
+ export declare function postComment(to: string, text: string): Promise<string | null>;
37
+ /**
38
+ * Handle an abort trigger directly at the plugin level.
39
+ * Called from the SSE handler before dispatchBlayEvent — never enters
40
+ * OpenClaw's command lane. Sets the module-level abort flag, posts a
41
+ * "stopped" comment, and marks the current run as failed.
42
+ */
43
+ export declare function handleAbortTrigger(payload: WebhookPayload): Promise<void>;
44
+ /**
45
+ * Dispatch a Blay event through OpenClaw's native auto-reply pipeline.
46
+ *
47
+ * Uses the same 4-step pattern as every built-in channel:
48
+ * 1. resolveAgentRoute → agent ID, session key, tool/skill config
49
+ * 2. recordInboundSession → register session for history/state
50
+ * 3. createReplyPrefixOptions → response prefix template context
51
+ * 4. dispatchReplyWithBufferedBlockDispatcher → agent run + delivery
52
+ */
53
+ export declare function dispatchBlayEvent(payload: WebhookPayload): Promise<boolean>;
@@ -0,0 +1,384 @@
1
+ /**
2
+ * Inbound Handler — converts Blay events into MsgContext
3
+ * and dispatches them through OpenClaw's native auto-reply pipeline.
4
+ *
5
+ * Follows the same 4-step pattern every OpenClaw channel uses
6
+ * (Telegram, Discord, Signal, Line, IRC, etc.):
7
+ *
8
+ * 1. resolveAgentRoute — determines agent ID, session key, tool/skill config
9
+ * 2. recordInboundSession — registers the session for history and state
10
+ * 3. createReplyPrefixOptions — sets up response prefix template context
11
+ * 4. dispatchReplyWithBufferedBlockDispatcher — runs the agent with tools and delivers reply
12
+ */
13
+ import { createReplyPrefixOptions } from "openclaw/plugin-sdk";
14
+ import { getBlayRuntime } from "./runtime.js";
15
+ import { getBlayClient } from "./state.js";
16
+ import { getAgentUserId, getAgentAllowedUserIds } from "./plugin.js";
17
+ import { RunTracker, getCurrentRunTracker, setCurrentRunTracker } from "./run-tracker.js";
18
+ import { signalAbort, isAborted, resetAbort } from "./abort.js";
19
+ /**
20
+ * Abort trigger detection — matches OpenClaw's internal ABORT_TRIGGERS set.
21
+ * Used to fast-path abort messages so they bypass the command lane.
22
+ */
23
+ const ABORT_TRIGGERS = new Set(["stop", "esc", "abort", "wait", "exit", "interrupt"]);
24
+ export function isAbortTrigger(text) {
25
+ if (!text)
26
+ return false;
27
+ const normalized = text.trim().toLowerCase();
28
+ return ABORT_TRIGGERS.has(normalized) || normalized === "/stop";
29
+ }
30
+ /**
31
+ * Determine if this event should trigger the agent and build the message context.
32
+ * Returns null if the agent should ignore the event.
33
+ */
34
+ function buildInboundContext(payload) {
35
+ const agentUserId = getAgentUserId();
36
+ if (!agentUserId) {
37
+ console.warn("[blay] agentUserId not resolved — dropping event (agent identity not yet available)");
38
+ return null;
39
+ }
40
+ // Never trigger on the agent's own actions
41
+ if (payload.actor?.id === agentUserId)
42
+ return null;
43
+ // Whitelist filter (defense-in-depth — server already filters)
44
+ // null = no whitelist (respond to everyone)
45
+ // [] = explicitly empty (respond to no one)
46
+ // [...ids] = respond only to these users
47
+ // System events (no actor) pass through
48
+ const allowedUserIds = getAgentAllowedUserIds();
49
+ if (Array.isArray(allowedUserIds) && payload.actor?.id) {
50
+ if (!allowedUserIds.includes(payload.actor.id))
51
+ return null;
52
+ }
53
+ const actorName = payload.actor?.name ?? "Someone";
54
+ const actorId = payload.actor?.id ?? "unknown";
55
+ const targetName = payload.target?.name ?? "an item";
56
+ const targetType = payload.target?.type ?? "item";
57
+ const targetId = payload.target?.id;
58
+ const projectName = payload.project?.name;
59
+ const content = payload.data?.content;
60
+ const commentId = payload.data?.commentId;
61
+ const mentions = payload.data?.mentions;
62
+ const isMentioned = mentions?.includes(agentUserId) ?? false;
63
+ const location = projectName
64
+ ? `on ${targetType} "${targetName}" in project "${projectName}"`
65
+ : `on ${targetType} "${targetName}"`;
66
+ // Delivery routing context — passed as UntrustedContext so OpenClaw renders
67
+ // it in a distinct metadata section. The agent needs these values to configure
68
+ // cron jobs and other scheduled actions that deliver back to Blay.
69
+ const deliveryTo = targetId ? `${targetType}:${targetId}` : undefined;
70
+ const untrustedContext = [];
71
+ if (deliveryTo) {
72
+ untrustedContext.push(`delivery_channel: blay-openclaw-plugin`);
73
+ untrustedContext.push(`delivery_to: ${deliveryTo}`);
74
+ }
75
+ // ── Comments ──────────────────────────────────────────────────────
76
+ if (payload.event === "comment_created") {
77
+ // Relevance filter: only trigger when agent is mentioned, is the
78
+ // entity owner, or is subscribed (watching). Applies to all entity
79
+ // types that carry _relevance metadata from the backend.
80
+ const relevance = payload.data?._relevance;
81
+ if (relevance) {
82
+ const isRelevant = isMentioned ||
83
+ relevance.isEntityOwner === true ||
84
+ relevance.isSubscribed === true;
85
+ if (!isRelevant)
86
+ return null;
87
+ }
88
+ let bodyForAgent;
89
+ if (isMentioned) {
90
+ bodyForAgent = content
91
+ ? `${actorName} @mentioned you ${location}: "${content}"`
92
+ : `${actorName} @mentioned you ${location}.`;
93
+ }
94
+ else {
95
+ bodyForAgent = content
96
+ ? `${actorName} said ${location}: "${content}"`
97
+ : `${actorName} posted a message ${location}`;
98
+ }
99
+ return {
100
+ Body: content ?? "",
101
+ BodyForAgent: bodyForAgent,
102
+ CommandBody: content ?? "",
103
+ BodyForCommands: content ?? "",
104
+ From: actorId,
105
+ To: targetId ? `${targetType}:${targetId}` : undefined,
106
+ SenderName: actorName,
107
+ SenderId: actorId,
108
+ MessageSid: commentId ?? `blay-${payload.timestamp}`,
109
+ SessionKey: targetId ? `blay-${targetId}` : "blay-general",
110
+ Provider: "blay-openclaw-plugin",
111
+ Surface: "blay-openclaw-plugin",
112
+ ChatType: "group",
113
+ GroupChannel: "blay-openclaw-plugin",
114
+ ConversationLabel: projectName ? `${projectName} / ${targetName}` : targetName,
115
+ // Always true: the plugin already filters for relevance (mention,
116
+ // task owner, or subscribed). Setting WasMentioned=false causes
117
+ // OpenClaw's group-chat logic to emit NO_REPLY / silent token.
118
+ WasMentioned: true,
119
+ UntrustedContext: untrustedContext,
120
+ CommandAuthorized: true,
121
+ Timestamp: payload.timestamp,
122
+ OriginatingChannel: "blay-openclaw-plugin",
123
+ OriginatingTo: targetId ? `${targetType}:${targetId}` : undefined,
124
+ AccountId: "default",
125
+ };
126
+ }
127
+ // ── Task assignments ──────────────────────────────────────────────
128
+ if (payload.event === "task_assignee_changed") {
129
+ const newAssignee = payload.data?.newValue;
130
+ if (newAssignee === agentUserId) {
131
+ const bodyForAgent = [
132
+ `${actorName} assigned you to ${targetType} "${targetName}"`,
133
+ projectName ? `in project "${projectName}".` : ".",
134
+ targetId ? `\nTask ID: ${targetId}` : "",
135
+ ].filter(Boolean).join(" ");
136
+ return {
137
+ Body: `Assigned to: ${targetName}`,
138
+ BodyForAgent: bodyForAgent,
139
+ CommandBody: `Assigned to: ${targetName}`,
140
+ BodyForCommands: `Assigned to: ${targetName}`,
141
+ From: actorId,
142
+ To: targetId ? `task:${targetId}` : undefined,
143
+ SenderName: actorName,
144
+ SenderId: actorId,
145
+ MessageSid: `blay-assign-${payload.timestamp}`,
146
+ SessionKey: targetId ? `blay-${targetId}` : "blay-general",
147
+ Provider: "blay-openclaw-plugin",
148
+ Surface: "blay-openclaw-plugin",
149
+ ChatType: "group",
150
+ GroupChannel: "blay-openclaw-plugin",
151
+ ConversationLabel: projectName ? `${projectName} / ${targetName}` : targetName,
152
+ WasMentioned: true,
153
+ UntrustedContext: untrustedContext,
154
+ CommandAuthorized: true,
155
+ Timestamp: payload.timestamp,
156
+ OriginatingChannel: "blay-openclaw-plugin",
157
+ OriginatingTo: targetId ? `task:${targetId}` : undefined,
158
+ AccountId: "default",
159
+ };
160
+ }
161
+ }
162
+ // ── Action item assignments ───────────────────────────────────────
163
+ if (payload.event === "action_item_assigned") {
164
+ const assignee = payload.data?.assigneeId;
165
+ if (assignee === agentUserId) {
166
+ const bodyForAgent = [
167
+ `${actorName} assigned you an action item: "${targetName}"`,
168
+ projectName ? `in project "${projectName}".` : ".",
169
+ ].filter(Boolean).join(" ");
170
+ return {
171
+ Body: `Action item assigned: ${targetName}`,
172
+ BodyForAgent: bodyForAgent,
173
+ CommandBody: `Action item assigned: ${targetName}`,
174
+ BodyForCommands: `Action item assigned: ${targetName}`,
175
+ From: actorId,
176
+ To: targetId ? `actionItem:${targetId}` : undefined,
177
+ SenderName: actorName,
178
+ SenderId: actorId,
179
+ MessageSid: `blay-action-${payload.timestamp}`,
180
+ SessionKey: targetId ? `blay-${targetId}` : "blay-general",
181
+ Provider: "blay-openclaw-plugin",
182
+ Surface: "blay-openclaw-plugin",
183
+ ChatType: "group",
184
+ GroupChannel: "blay-openclaw-plugin",
185
+ ConversationLabel: projectName ? `${projectName} / ${targetName}` : targetName,
186
+ WasMentioned: true,
187
+ UntrustedContext: untrustedContext,
188
+ CommandAuthorized: true,
189
+ Timestamp: payload.timestamp,
190
+ OriginatingChannel: "blay-openclaw-plugin",
191
+ OriginatingTo: targetId ? `actionItem:${targetId}` : undefined,
192
+ AccountId: "default",
193
+ };
194
+ }
195
+ }
196
+ return null;
197
+ }
198
+ /**
199
+ * Post a comment to Blay via the API client.
200
+ * Returns the comment ID if successful, null otherwise.
201
+ */
202
+ export async function postComment(to, text) {
203
+ const client = getBlayClient();
204
+ if (!client) {
205
+ console.error("[blay] No client available for outbound delivery");
206
+ return null;
207
+ }
208
+ const [entityType, entityId] = to.split(":", 2);
209
+ if (!entityType || !entityId) {
210
+ console.error(`[blay] Invalid target "${to}"`);
211
+ return null;
212
+ }
213
+ const body = { content: text };
214
+ if (entityType === "task")
215
+ body.taskId = entityId;
216
+ else if (entityType === "project")
217
+ body.projectId = entityId;
218
+ else if (entityType === "resource")
219
+ body.resourceId = entityId;
220
+ else if (entityType === "actionItem")
221
+ body.actionItemId = entityId;
222
+ else
223
+ body.taskId = entityId;
224
+ const res = await client.post("/api/v1/comments", body);
225
+ if (!res.ok) {
226
+ console.error(`[blay] Failed to post comment: HTTP ${res.status}`);
227
+ return null;
228
+ }
229
+ return res.data?.id ?? null;
230
+ }
231
+ /**
232
+ * Handle an abort trigger directly at the plugin level.
233
+ * Called from the SSE handler before dispatchBlayEvent — never enters
234
+ * OpenClaw's command lane. Sets the module-level abort flag, posts a
235
+ * "stopped" comment, and marks the current run as failed.
236
+ */
237
+ export async function handleAbortTrigger(payload) {
238
+ signalAbort();
239
+ // Post "stopped" comment directly
240
+ const targetId = payload.target?.id;
241
+ const targetType = payload.target?.type ?? "task";
242
+ if (targetId) {
243
+ await postComment(`${targetType}:${targetId}`, "\u23f9\ufe0f Agent run stopped.");
244
+ }
245
+ // Mark current run as failed
246
+ const tracker = getCurrentRunTracker();
247
+ if (tracker) {
248
+ await tracker.fail(new Error("Aborted by user"));
249
+ setCurrentRunTracker(null);
250
+ }
251
+ }
252
+ /**
253
+ * Dispatch a Blay event through OpenClaw's native auto-reply pipeline.
254
+ *
255
+ * Uses the same 4-step pattern as every built-in channel:
256
+ * 1. resolveAgentRoute → agent ID, session key, tool/skill config
257
+ * 2. recordInboundSession → register session for history/state
258
+ * 3. createReplyPrefixOptions → response prefix template context
259
+ * 4. dispatchReplyWithBufferedBlockDispatcher → agent run + delivery
260
+ */
261
+ export async function dispatchBlayEvent(payload) {
262
+ // Clear any previous abort flag so each new dispatch starts clean
263
+ resetAbort();
264
+ const ctx = buildInboundContext(payload);
265
+ if (!ctx)
266
+ return false;
267
+ console.log(`[blay] dispatching event: ${payload.event} from ${payload.actor?.name ?? "unknown"}`);
268
+ const runtime = getBlayRuntime();
269
+ const cfg = await runtime.config.loadConfig();
270
+ // RunTracker is only used for the normal (non-abort) path, but declared
271
+ // here so the catch block can access it for cleanup.
272
+ let tracker = null;
273
+ try {
274
+ // ── 1. Resolve agent route ──────────────────────────────────────
275
+ const peerId = ctx.To?.split(":")[1] ?? ctx.SessionKey;
276
+ const route = runtime.channel.routing.resolveAgentRoute({
277
+ cfg,
278
+ channel: "blay-openclaw-plugin",
279
+ accountId: "default",
280
+ peer: { kind: "group", id: peerId },
281
+ });
282
+ ctx.SessionKey = route.sessionKey;
283
+ // ── 2. Record inbound session ───────────────────────────────────
284
+ const storePath = runtime.channel.session.resolveStorePath(undefined, {
285
+ agentId: route.agentId,
286
+ });
287
+ await runtime.channel.session.recordInboundSession({
288
+ storePath,
289
+ sessionKey: route.sessionKey,
290
+ ctx,
291
+ createIfMissing: true,
292
+ updateLastRoute: {
293
+ sessionKey: route.sessionKey,
294
+ channel: "blay-openclaw-plugin",
295
+ to: ctx.To ?? "",
296
+ accountId: "default",
297
+ },
298
+ onRecordError: (err) => {
299
+ console.error("[blay] recordInboundSession error:", err);
300
+ },
301
+ });
302
+ // ── Create RunTracker and dispatch via command lane ─────────────
303
+ const client = getBlayClient();
304
+ if (!client) {
305
+ console.warn("[blay] getBlayClient() returned null — run tracking disabled");
306
+ }
307
+ if (client) {
308
+ const targetType = payload.target?.type;
309
+ const targetId = payload.target?.id;
310
+ tracker = new RunTracker(client, {
311
+ triggerEvent: payload.event,
312
+ triggerActorId: payload.actor?.id,
313
+ triggerActorName: payload.actor?.name,
314
+ entityType: targetType,
315
+ entityId: targetId,
316
+ });
317
+ await tracker.start();
318
+ setCurrentRunTracker(tracker);
319
+ }
320
+ // 3. Create reply prefix options (same as Telegram, Signal, Line, etc.)
321
+ const { onModelSelected, ...prefixOptions } = createReplyPrefixOptions({
322
+ cfg,
323
+ agentId: route.agentId,
324
+ channel: "blay-openclaw-plugin",
325
+ accountId: route.accountId,
326
+ });
327
+ // 4. Dispatch through the buffered block dispatcher (enters command lane)
328
+ const outboundTo = (ctx.To ?? ctx.OriginatingTo);
329
+ let blocksSent = 0;
330
+ await runtime.channel.reply.dispatchReplyWithBufferedBlockDispatcher({
331
+ ctx,
332
+ cfg,
333
+ dispatcherOptions: {
334
+ ...prefixOptions,
335
+ deliver: async (replyPayload, info) => {
336
+ if (isAborted()) {
337
+ console.log("[blay] delivery suppressed (aborted)");
338
+ return;
339
+ }
340
+ if (!replyPayload.text && !replyPayload.mediaUrl)
341
+ return;
342
+ // Skip the final roll-up if blocks were already delivered
343
+ if (info.kind === "final" && blocksSent > 0)
344
+ return;
345
+ if (info.kind === "block")
346
+ blocksSent++;
347
+ if (!outboundTo) {
348
+ console.error("[blay] No outbound target for reply");
349
+ return;
350
+ }
351
+ if (replyPayload.text) {
352
+ const commentId = await postComment(outboundTo, replyPayload.text);
353
+ if (commentId && tracker) {
354
+ tracker.recordComment(commentId);
355
+ }
356
+ }
357
+ },
358
+ onError: (err, info) => {
359
+ console.error(`[blay] dispatch error (${info.kind}):`, err);
360
+ },
361
+ },
362
+ replyOptions: {
363
+ onModelSelected,
364
+ disableBlockStreaming: false,
365
+ },
366
+ });
367
+ // ── Run completed successfully ────────────────────────────────
368
+ if (tracker) {
369
+ await tracker.complete();
370
+ setCurrentRunTracker(null);
371
+ }
372
+ return true;
373
+ }
374
+ catch (err) {
375
+ console.error("[blay] dispatch failed:", err);
376
+ // ── Run failed ────────────────────────────────────────────────
377
+ if (tracker) {
378
+ await tracker.fail(err);
379
+ setCurrentRunTracker(null);
380
+ }
381
+ return false;
382
+ }
383
+ }
384
+ //# sourceMappingURL=inbound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../src/channel/inbound.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Blay Channel Plugin — registers Blay as a native OpenClaw channel.
3
+ *
4
+ * This allows the agent to participate in Blay conversations using
5
+ * OpenClaw's native auto-reply pipeline. Inbound events arrive via
6
+ * a persistent SSE connection to the Blay API, and are dispatched
7
+ * through the same pipeline as Telegram/Discord/Slack messages.
8
+ * Agent responses are automatically delivered as Blay comments.
9
+ */
10
+ import type { ChannelPlugin } from "openclaw/plugin-sdk";
11
+ import type { BlayClient } from "../client.js";
12
+ import type { BlayPluginConfig } from "../types.js";
13
+ export declare function getGatewayPort(): number;
14
+ export declare function getGatewayBind(): string;
15
+ export declare function getGatewayToken(): string | null;
16
+ /** Resolved account — minimal since Blay uses a single API key */
17
+ export interface BlayResolvedAccount {
18
+ accountId: string;
19
+ enabled: boolean;
20
+ apiKey: string;
21
+ apiUrl: string;
22
+ }
23
+ export declare function getAgentUserId(): string | null;
24
+ export declare function getAgentAllowedUserIds(): string[] | null;
25
+ export declare function createBlayChannelPlugin(client: BlayClient, pluginConfig: BlayPluginConfig): ChannelPlugin<BlayResolvedAccount>;