@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
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Task Tools — blay_list_tasks, blay_get_task, blay_create_task, blay_update_task, blay_delete_task
3
+ */
4
+ import { Type } from "@sinclair/typebox";
5
+ import { formatError } from "../client.js";
6
+ import { formatTask, formatTaskDetail, formatConfirmation } from "../utils/formatting.js";
7
+ export function createListTasksTool(client) {
8
+ return {
9
+ name: "blay_list_tasks",
10
+ label: "Blay List Tasks",
11
+ description: "List tasks with filtering. Use this to explore tasks across projects or for a specific person. For a quick overview of your own work, use blay_briefing instead. Supports filtering by project, assignee, status, priority, overdue, blocked, stale, and date ranges.",
12
+ parameters: Type.Object({
13
+ projectId: Type.Optional(Type.String({ description: "Filter by project ID" })),
14
+ assigneeId: Type.Optional(Type.String({ description: "Filter by assignee user ID" })),
15
+ status: Type.Optional(Type.String({ description: "Filter by status (not_started, in_progress, completed, blocked)" })),
16
+ priority: Type.Optional(Type.String({ description: "Filter by priority (low, medium, high, urgent)" })),
17
+ overdue: Type.Optional(Type.Boolean({ description: "Only return overdue tasks" })),
18
+ blocked: Type.Optional(Type.Boolean({ description: "Only return blocked tasks" })),
19
+ stale: Type.Optional(Type.Boolean({ description: "Only return stale tasks (no updates recently)" })),
20
+ staleDays: Type.Optional(Type.Number({ description: "Days without update to consider stale (default 7)" })),
21
+ limit: Type.Optional(Type.Number({ description: "Max results (default 50, max 100)" })),
22
+ }),
23
+ async execute(_toolCallId, params) {
24
+ const queryParams = {
25
+ projectId: params.projectId,
26
+ assigneeId: params.assigneeId,
27
+ status: params.status,
28
+ priority: params.priority,
29
+ overdue: params.overdue ? "true" : undefined,
30
+ blocked: params.blocked ? "true" : undefined,
31
+ stale: params.stale ? "true" : undefined,
32
+ staleDays: params.staleDays?.toString(),
33
+ limit: params.limit?.toString(),
34
+ };
35
+ const res = await client.get("/api/v1/tasks", queryParams);
36
+ if (!res.ok) {
37
+ return { content: [{ type: "text", text: formatError(res) }], details: {} };
38
+ }
39
+ const tasks = res.data.data ?? [];
40
+ if (tasks.length === 0) {
41
+ return { content: [{ type: "text", text: "No tasks found matching your filters." }], details: {} };
42
+ }
43
+ return {
44
+ content: [
45
+ { type: "text", text: `# Tasks (${tasks.length})\n\n${tasks.map(formatTask).join("\n")}` },
46
+ ],
47
+ details: {},
48
+ };
49
+ },
50
+ };
51
+ }
52
+ export function createGetTaskTool(client) {
53
+ return {
54
+ name: "blay_get_task",
55
+ label: "Blay Get Task",
56
+ description: "Get full detail on a single task including description, subtasks, comments, and resources. Use this after finding a task via blay_list_tasks, blay_search, or blay_briefing. For comprehensive context including project info in one call, prefer blay_get_context.",
57
+ parameters: Type.Object({
58
+ taskId: Type.String({ description: "The task ID" }),
59
+ includeSubtasks: Type.Optional(Type.Boolean({ description: "Include subtasks" })),
60
+ includeComments: Type.Optional(Type.Boolean({ description: "Include comments" })),
61
+ includeResources: Type.Optional(Type.Boolean({ description: "Include attached resources" })),
62
+ includeLinks: Type.Optional(Type.Boolean({ description: "Include task links" })),
63
+ }),
64
+ async execute(_toolCallId, params) {
65
+ const res = await client.get(`/api/v1/tasks/${params.taskId}`, {
66
+ includeSubtasks: params.includeSubtasks ? "true" : undefined,
67
+ includeComments: params.includeComments ? "true" : undefined,
68
+ includeResources: params.includeResources ? "true" : undefined,
69
+ includeLinks: params.includeLinks ? "true" : undefined,
70
+ });
71
+ if (!res.ok) {
72
+ return { content: [{ type: "text", text: formatError(res) }], details: {} };
73
+ }
74
+ return {
75
+ content: [{ type: "text", text: formatTaskDetail(res.data) }],
76
+ details: {},
77
+ };
78
+ },
79
+ };
80
+ }
81
+ export function createCreateTaskTool(client) {
82
+ return {
83
+ name: "blay_create_task",
84
+ label: "Blay Create Task",
85
+ description: "Create a new task in a project. You need a project ID — use blay_list_projects to find one if the user hasn't specified it.",
86
+ parameters: Type.Object({
87
+ name: Type.String({ description: "Task name" }),
88
+ projectId: Type.String({ description: "Project ID to create the task in" }),
89
+ status: Type.Optional(Type.String({ description: "Task status (not_started, in_progress, completed, blocked)" })),
90
+ priority: Type.Optional(Type.String({ description: "Priority (low, medium, high, urgent)" })),
91
+ ownerId: Type.Optional(Type.String({ description: "Assignee user ID" })),
92
+ dueDate: Type.Optional(Type.Number({ description: "Due date as Unix timestamp in milliseconds" })),
93
+ parentTaskId: Type.Optional(Type.String({ description: "Parent task ID (creates a subtask)" })),
94
+ }),
95
+ async execute(_toolCallId, params) {
96
+ const res = await client.post("/api/v1/tasks", {
97
+ name: params.name,
98
+ projectId: params.projectId,
99
+ status: params.status,
100
+ priority: params.priority,
101
+ ownerId: params.ownerId,
102
+ dueDate: params.dueDate,
103
+ parentTaskId: params.parentTaskId,
104
+ });
105
+ if (!res.ok) {
106
+ return { content: [{ type: "text", text: formatError(res) }], details: {} };
107
+ }
108
+ return {
109
+ content: [{ type: "text", text: formatConfirmation("Task created", res.data) }],
110
+ details: {},
111
+ };
112
+ },
113
+ };
114
+ }
115
+ export function createUpdateTaskTool(client) {
116
+ return {
117
+ name: "blay_update_task",
118
+ label: "Blay Update Task",
119
+ description: "Update an existing task's fields. Use blay_get_task or blay_list_tasks first to confirm the current state before making changes.",
120
+ parameters: Type.Object({
121
+ taskId: Type.String({ description: "The task ID to update" }),
122
+ name: Type.Optional(Type.String({ description: "New task name" })),
123
+ status: Type.Optional(Type.String({ description: "New status (not_started, in_progress, completed, blocked)" })),
124
+ priority: Type.Optional(Type.String({ description: "New priority (low, medium, high, urgent)" })),
125
+ ownerId: Type.Optional(Type.String({ description: "New assignee user ID" })),
126
+ dueDate: Type.Optional(Type.Number({ description: "New due date as Unix timestamp in milliseconds" })),
127
+ isBlocked: Type.Optional(Type.Boolean({ description: "Whether the task is blocked" })),
128
+ blockedReason: Type.Optional(Type.String({ description: "Reason the task is blocked" })),
129
+ }),
130
+ async execute(_toolCallId, params) {
131
+ const { taskId, ...updates } = params;
132
+ const body = {};
133
+ for (const [key, value] of Object.entries(updates)) {
134
+ if (value !== undefined)
135
+ body[key] = value;
136
+ }
137
+ const res = await client.patch(`/api/v1/tasks/${taskId}`, body);
138
+ if (!res.ok) {
139
+ return { content: [{ type: "text", text: formatError(res) }], details: {} };
140
+ }
141
+ return {
142
+ content: [{ type: "text", text: formatConfirmation("Task updated", res.data) }],
143
+ details: {},
144
+ };
145
+ },
146
+ };
147
+ }
148
+ export function createDeleteTaskTool(client) {
149
+ return {
150
+ name: "blay_delete_task",
151
+ label: "Blay Delete Task",
152
+ description: "Permanently delete a task. This cannot be undone. Use blay_get_task first to confirm you have the right task.",
153
+ parameters: Type.Object({
154
+ taskId: Type.String({ description: "The task ID to delete" }),
155
+ }),
156
+ async execute(_toolCallId, params) {
157
+ const res = await client.del(`/api/v1/tasks/${params.taskId}`);
158
+ if (!res.ok) {
159
+ return { content: [{ type: "text", text: formatError(res) }], details: {} };
160
+ }
161
+ return {
162
+ content: [{ type: "text", text: `Task deleted (id: ${params.taskId}).` }],
163
+ details: {},
164
+ };
165
+ },
166
+ };
167
+ }
168
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * User Tool — blay_list_users
3
+ */
4
+ import type { BlayClient } from "../client.js";
5
+ import type { ToolResult } from "../types.js";
6
+ export declare function createListUsersTool(client: BlayClient): {
7
+ name: string;
8
+ label: string;
9
+ description: string;
10
+ parameters: import("@sinclair/typebox").TObject<{}>;
11
+ execute(): Promise<ToolResult>;
12
+ };
@@ -0,0 +1,31 @@
1
+ /**
2
+ * User Tool — blay_list_users
3
+ */
4
+ import { Type } from "@sinclair/typebox";
5
+ import { formatError } from "../client.js";
6
+ import { formatUser } from "../utils/formatting.js";
7
+ export function createListUsersTool(client) {
8
+ return {
9
+ name: "blay_list_users",
10
+ label: "Blay List Users",
11
+ description: "List all members of the organization. Use this to find user IDs for assigning tasks or action items, or to see who's on the team.",
12
+ parameters: Type.Object({}),
13
+ async execute() {
14
+ const res = await client.get("/api/v1/users");
15
+ if (!res.ok) {
16
+ return { content: [{ type: "text", text: formatError(res) }], details: {} };
17
+ }
18
+ const users = res.data.data ?? [];
19
+ if (users.length === 0) {
20
+ return { content: [{ type: "text", text: "No users found." }], details: {} };
21
+ }
22
+ return {
23
+ content: [
24
+ { type: "text", text: `# Organization Members (${users.length})\n\n${users.map(formatUser).join("\n")}` },
25
+ ],
26
+ details: {},
27
+ };
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,mIAAmI;QACrI,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,OAAO;YACX,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAsC,eAAe,CAAC,CAAC;YAEnF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC9E,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC/E,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;iBAC1G;gBACD,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shared types for the Blay OpenClaw plugin.
3
+ */
4
+ export interface BlayPluginConfig {
5
+ apiKey: string;
6
+ apiUrl?: string;
7
+ webhookSecret?: string;
8
+ }
9
+ export interface ApiResponse<T = unknown> {
10
+ ok: boolean;
11
+ status: number;
12
+ data: T;
13
+ }
14
+ export interface ToolResult {
15
+ content: {
16
+ type: "text";
17
+ text: string;
18
+ }[];
19
+ details: Record<string, never>;
20
+ }
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared types for the Blay OpenClaw plugin.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Formatting utilities
3
+ *
4
+ * Converts API responses into concise, AI-friendly text.
5
+ */
6
+ export declare function formatDate(ts: number | null | undefined): string;
7
+ export declare function formatRelativeDate(ts: number | null | undefined): string;
8
+ export declare function formatTask(task: Record<string, unknown>): string;
9
+ export declare function formatActionItem(item: Record<string, unknown>): string;
10
+ export declare function formatNotification(n: Record<string, unknown>): string;
11
+ export declare function formatUser(user: Record<string, unknown>): string;
12
+ export declare function formatProject(project: Record<string, unknown>): string;
13
+ export declare function formatTaskDetail(task: Record<string, unknown>): string;
14
+ export declare function formatProjectDetail(project: Record<string, unknown>): string;
15
+ export declare function formatContextEntity(ctx: Record<string, unknown>): string;
16
+ export declare function formatConfirmation(action: string, entity: Record<string, unknown>): string;
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Formatting utilities
3
+ *
4
+ * Converts API responses into concise, AI-friendly text.
5
+ */
6
+ export function formatDate(ts) {
7
+ if (!ts)
8
+ return "none";
9
+ const d = new Date(ts);
10
+ return d.toLocaleDateString("en-US", {
11
+ month: "short",
12
+ day: "numeric",
13
+ year: "numeric",
14
+ });
15
+ }
16
+ export function formatRelativeDate(ts) {
17
+ if (!ts)
18
+ return "none";
19
+ const now = Date.now();
20
+ const diff = now - ts;
21
+ const days = Math.floor(diff / (1000 * 60 * 60 * 24));
22
+ if (days < 0)
23
+ return `in ${Math.abs(days)} day${Math.abs(days) === 1 ? "" : "s"}`;
24
+ if (days === 0)
25
+ return "today";
26
+ if (days === 1)
27
+ return "yesterday";
28
+ if (days < 7)
29
+ return `${days} days ago`;
30
+ if (days < 30)
31
+ return `${Math.floor(days / 7)} week${Math.floor(days / 7) === 1 ? "" : "s"} ago`;
32
+ return formatDate(ts);
33
+ }
34
+ export function formatTask(task) {
35
+ const parts = [`- **${task.name}** [${task.status}]`];
36
+ if (task.priority)
37
+ parts.push(`priority:${task.priority}`);
38
+ if (task.projectName)
39
+ parts.push(`in "${task.projectName}"`);
40
+ if (task.ownerName)
41
+ parts.push(`assigned to ${task.ownerName}`);
42
+ if (task.dueDate) {
43
+ const due = formatRelativeDate(task.dueDate);
44
+ parts.push(`due ${due}`);
45
+ }
46
+ if (task.isBlocked)
47
+ parts.push(`BLOCKED${task.blockedReason ? `: ${task.blockedReason}` : ""}`);
48
+ parts.push(`(id: ${task.id})`);
49
+ return parts.join(" | ");
50
+ }
51
+ export function formatActionItem(item) {
52
+ const parts = [`- **${item.title}** [${item.status}]`];
53
+ if (item.assigneeName)
54
+ parts.push(`for ${item.assigneeName}`);
55
+ if (item.dueDate)
56
+ parts.push(`due ${formatRelativeDate(item.dueDate)}`);
57
+ parts.push(`(id: ${item.id})`);
58
+ return parts.join(" | ");
59
+ }
60
+ export function formatNotification(n) {
61
+ const read = n.isRead ? "" : " [UNREAD]";
62
+ return `- ${n.title}${read} — ${formatRelativeDate(n.createdAt)} (id: ${n.id})`;
63
+ }
64
+ export function formatUser(user) {
65
+ const role = user.role ? ` (${user.role})` : "";
66
+ const agent = user.isAgent ? " [agent]" : "";
67
+ return `- ${user.name}${role}${agent} — ${user.email} (id: ${user.id})`;
68
+ }
69
+ export function formatProject(project) {
70
+ const parts = [`- **${project.name}** [${project.status}]`];
71
+ if (project.ownerName)
72
+ parts.push(`owned by ${project.ownerName}`);
73
+ if (project.taskCount !== undefined) {
74
+ parts.push(`${project.completedTaskCount}/${project.taskCount} tasks done`);
75
+ }
76
+ if (project.dueDate)
77
+ parts.push(`due ${formatRelativeDate(project.dueDate)}`);
78
+ parts.push(`(id: ${project.id})`);
79
+ return parts.join(" | ");
80
+ }
81
+ export function formatTaskDetail(task) {
82
+ const sections = [];
83
+ sections.push(`# Task: ${task.name}`);
84
+ const meta = [];
85
+ meta.push(`- **Status:** ${task.status}`);
86
+ if (task.priority)
87
+ meta.push(`- **Priority:** ${task.priority}`);
88
+ if (task.ownerName)
89
+ meta.push(`- **Assigned to:** ${task.ownerName}`);
90
+ if (task.projectName)
91
+ meta.push(`- **Project:** ${task.projectName}`);
92
+ if (task.dueDate)
93
+ meta.push(`- **Due:** ${formatDate(task.dueDate)} (${formatRelativeDate(task.dueDate)})`);
94
+ if (task.createdAt)
95
+ meta.push(`- **Created:** ${formatRelativeDate(task.createdAt)}`);
96
+ if (task.updatedAt)
97
+ meta.push(`- **Last updated:** ${formatRelativeDate(task.updatedAt)}`);
98
+ if (task.isBlocked)
99
+ meta.push(`- **BLOCKED:** ${task.blockedReason ?? "no reason given"}`);
100
+ meta.push(`- **ID:** ${task.id}`);
101
+ sections.push(meta.join("\n"));
102
+ if (task.description) {
103
+ sections.push(`## Description\n${task.description}`);
104
+ }
105
+ const subtasks = task.subtasks;
106
+ if (subtasks && subtasks.length > 0) {
107
+ sections.push(`## Subtasks (${subtasks.length})\n${subtasks.map(formatTask).join("\n")}`);
108
+ }
109
+ const comments = task.comments;
110
+ if (comments && comments.length > 0) {
111
+ const formatted = comments
112
+ .map((c) => `**${c.authorName ?? "Unknown"}** (${formatRelativeDate(c.createdAt)}):\n${c.content}`)
113
+ .join("\n\n---\n\n");
114
+ sections.push(`## Comments (${comments.length})\n${formatted}`);
115
+ }
116
+ const resources = task.resources;
117
+ if (resources && resources.length > 0) {
118
+ const formatted = resources.map((r) => `- ${r.name}${r.url ? ` — ${r.url}` : ""} (id: ${r.id})`).join("\n");
119
+ sections.push(`## Resources (${resources.length})\n${formatted}`);
120
+ }
121
+ const links = task.links;
122
+ if (links && links.length > 0) {
123
+ const formatted = links.map((l) => `- ${l.type}: **${l.targetName}** (id: ${l.targetId})`).join("\n");
124
+ sections.push(`## Links (${links.length})\n${formatted}`);
125
+ }
126
+ return sections.join("\n\n");
127
+ }
128
+ export function formatProjectDetail(project) {
129
+ const sections = [];
130
+ sections.push(`# Project: ${project.name}`);
131
+ const meta = [];
132
+ meta.push(`- **Status:** ${project.status}`);
133
+ if (project.ownerName)
134
+ meta.push(`- **Owner:** ${project.ownerName}`);
135
+ if (project.areaName)
136
+ meta.push(`- **Area:** ${project.areaName}`);
137
+ if (project.dueDate)
138
+ meta.push(`- **Due:** ${formatDate(project.dueDate)} (${formatRelativeDate(project.dueDate)})`);
139
+ if (project.createdAt)
140
+ meta.push(`- **Created:** ${formatRelativeDate(project.createdAt)}`);
141
+ if (project.taskCount !== undefined) {
142
+ meta.push(`- **Tasks:** ${project.completedTaskCount ?? 0}/${project.taskCount} completed`);
143
+ }
144
+ meta.push(`- **ID:** ${project.id}`);
145
+ sections.push(meta.join("\n"));
146
+ if (project.description) {
147
+ sections.push(`## Description\n${project.description}`);
148
+ }
149
+ const collaborators = project.collaborators;
150
+ if (collaborators && collaborators.length > 0) {
151
+ const formatted = collaborators.map((c) => `- ${c.name} (${c.role ?? "member"})`).join("\n");
152
+ sections.push(`## Collaborators (${collaborators.length})\n${formatted}`);
153
+ }
154
+ return sections.join("\n\n");
155
+ }
156
+ export function formatContextEntity(ctx) {
157
+ const sections = [];
158
+ const entity = (ctx.entity ?? ctx);
159
+ const entityType = ctx.entityType;
160
+ if (entityType === "project") {
161
+ sections.push(formatProjectDetail(entity));
162
+ }
163
+ else {
164
+ sections.push(formatTaskDetail(entity));
165
+ }
166
+ const project = ctx.project;
167
+ if (project) {
168
+ sections.push(`## Parent Project\n${formatProject(project)}`);
169
+ }
170
+ const comments = ctx.recentComments;
171
+ if (comments && comments.length > 0) {
172
+ const formatted = comments
173
+ .map((c) => `**${c.authorName ?? "Unknown"}** (${formatRelativeDate(c.createdAt)}):\n${c.content}`)
174
+ .join("\n\n---\n\n");
175
+ sections.push(`## Recent Comments (${comments.length})\n${formatted}`);
176
+ }
177
+ const subtasks = ctx.subtasks;
178
+ if (subtasks && subtasks.length > 0 && !entity.subtasks) {
179
+ sections.push(`## Subtasks (${subtasks.length})\n${subtasks.map(formatTask).join("\n")}`);
180
+ }
181
+ const collaborators = ctx.collaborators;
182
+ if (collaborators && collaborators.length > 0 && !entity.collaborators) {
183
+ const formatted = collaborators.map((c) => `- ${c.name} (${c.role ?? "member"})`).join("\n");
184
+ sections.push(`## Collaborators (${collaborators.length})\n${formatted}`);
185
+ }
186
+ return sections.join("\n\n");
187
+ }
188
+ export function formatConfirmation(action, entity) {
189
+ const parts = [`${action}: **${entity.name ?? entity.title}**`];
190
+ if (entity.status)
191
+ parts.push(`[${entity.status}]`);
192
+ if (entity.id)
193
+ parts.push(`(id: ${entity.id})`);
194
+ return parts.join(" ");
195
+ }
196
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Webhook Handler — receives inbound webhook events from Blay.
3
+ *
4
+ * This is now a thin HTTP handler that verifies the webhook signature
5
+ * and forwards events to the native channel inbound pipeline.
6
+ * All agent triggering logic is handled by OpenClaw's auto-reply system.
7
+ */
8
+ import type { IncomingMessage, ServerResponse } from "node:http";
9
+ import type { BlayPluginConfig } from "../types.js";
10
+ export declare function createWebhookHandler(config: BlayPluginConfig): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Webhook Handler — receives inbound webhook events from Blay.
3
+ *
4
+ * This is now a thin HTTP handler that verifies the webhook signature
5
+ * and forwards events to the native channel inbound pipeline.
6
+ * All agent triggering logic is handled by OpenClaw's auto-reply system.
7
+ */
8
+ import { createHmac, timingSafeEqual } from "node:crypto";
9
+ import { dispatchBlayEvent } from "../channel/inbound.js";
10
+ function readBody(req) {
11
+ return new Promise((resolve, reject) => {
12
+ const chunks = [];
13
+ req.on("data", (chunk) => chunks.push(chunk));
14
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
15
+ req.on("error", reject);
16
+ });
17
+ }
18
+ function verifySignature(body, signature, secret) {
19
+ const expected = createHmac("sha256", secret).update(body).digest("hex");
20
+ const expectedSignature = `sha256=${expected}`;
21
+ // Use timingSafeEqual to prevent timing attacks
22
+ try {
23
+ const receivedBuffer = Buffer.from(signature, "utf-8");
24
+ const expectedBuffer = Buffer.from(expectedSignature, "utf-8");
25
+ // timingSafeEqual throws if buffer lengths differ
26
+ if (receivedBuffer.length !== expectedBuffer.length) {
27
+ return false;
28
+ }
29
+ return timingSafeEqual(receivedBuffer, expectedBuffer);
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ export function createWebhookHandler(config) {
36
+ return async (req, res) => {
37
+ if (req.method !== "POST") {
38
+ res.writeHead(405, { "Content-Type": "application/json" });
39
+ res.end(JSON.stringify({ error: "Method not allowed" }));
40
+ return;
41
+ }
42
+ const body = await readBody(req);
43
+ // Verify HMAC signature if secret is configured
44
+ if (config.webhookSecret) {
45
+ const signature = req.headers["x-blay-signature"];
46
+ if (!signature || !verifySignature(body, signature, config.webhookSecret)) {
47
+ res.writeHead(401, { "Content-Type": "application/json" });
48
+ res.end(JSON.stringify({ error: "Invalid signature" }));
49
+ return;
50
+ }
51
+ }
52
+ let payload;
53
+ try {
54
+ payload = JSON.parse(body);
55
+ }
56
+ catch {
57
+ res.writeHead(400, { "Content-Type": "application/json" });
58
+ res.end(JSON.stringify({ error: "Invalid JSON" }));
59
+ return;
60
+ }
61
+ // Dispatch directly — OpenClaw's session lane handles serialization & interrupts
62
+ dispatchBlayEvent(payload).catch((err) => {
63
+ console.error("[blay] Webhook dispatch error:", err);
64
+ });
65
+ // Respond immediately (webhook delivery expects fast response)
66
+ res.writeHead(200, { "Content-Type": "application/json" });
67
+ res.end(JSON.stringify({ ok: true }));
68
+ };
69
+ }
70
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/webhook/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "blay-openclaw-plugin",
3
+ "name": "Blay",
4
+ "description": "Integrate with Blay project management — read/write tasks, projects, comments, and receive real-time webhook events.",
5
+ "version": "0.1.16",
6
+ "configSchema": {
7
+ "type": "object",
8
+ "properties": {
9
+ "apiKey": { "type": "string", "description": "Blay API key (blay_...)" },
10
+ "apiUrl": { "type": "string", "description": "Blay API base URL" },
11
+ "webhookSecret": { "type": "string", "description": "HMAC secret for webhook verification" }
12
+ },
13
+ "required": []
14
+ },
15
+ "uiHints": {
16
+ "apiKey": { "label": "API Key", "sensitive": true, "placeholder": "blay_..." },
17
+ "apiUrl": { "label": "API URL", "placeholder": "https://api.blay.io" },
18
+ "webhookSecret": { "label": "Webhook Secret", "sensitive": true }
19
+ },
20
+ "skills": ["./skills"]
21
+ }
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@feeble/blay-openclaw-plugin",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "0.1.17",
7
+ "description": "OpenClaw plugin for Blay — project management tools, real-time events, and agent collaboration.",
8
+ "type": "module",
9
+ "main": "dist/index.js",
10
+ "types": "dist/index.d.ts",
11
+ "files": ["dist", "skills", "openclaw.plugin.json"],
12
+ "license": "MIT",
13
+ "engines": {
14
+ "node": ">=18.0.0"
15
+ },
16
+ "keywords": ["openclaw", "blay", "plugin", "project-management", "agent"],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "lint": "tsc --noEmit",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "dependencies": {
23
+ "@sinclair/typebox": "^0.34.0"
24
+ },
25
+ "peerDependencies": {
26
+ "openclaw": ">=2025.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^22.0.0",
30
+ "openclaw": "2026.2.22-2",
31
+ "typescript": "^5.7.0"
32
+ },
33
+ "openclaw": {
34
+ "extensions": ["./dist/index.js"]
35
+ }
36
+ }