@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.
- package/README.md +24 -0
- package/dist/channel/abort.d.ts +11 -0
- package/dist/channel/abort.js +20 -0
- package/dist/channel/abort.js.map +1 -0
- package/dist/channel/inbound.d.ts +53 -0
- package/dist/channel/inbound.js +384 -0
- package/dist/channel/inbound.js.map +1 -0
- package/dist/channel/plugin.d.ts +25 -0
- package/dist/channel/plugin.js +291 -0
- package/dist/channel/plugin.js.map +1 -0
- package/dist/channel/run-tracker.d.ts +54 -0
- package/dist/channel/run-tracker.js +137 -0
- package/dist/channel/run-tracker.js.map +1 -0
- package/dist/channel/runtime.d.ts +8 -0
- package/dist/channel/runtime.js +16 -0
- package/dist/channel/runtime.js.map +1 -0
- package/dist/channel/sse-client.d.ts +54 -0
- package/dist/channel/sse-client.js +154 -0
- package/dist/channel/sse-client.js.map +1 -0
- package/dist/channel/state.d.ts +6 -0
- package/dist/channel/state.js +11 -0
- package/dist/channel/state.js.map +1 -0
- package/dist/client.d.ts +23 -0
- package/dist/client.js +98 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +228 -0
- package/dist/index.js.map +1 -0
- package/dist/telemetry/pusher.d.ts +71 -0
- package/dist/telemetry/pusher.js +461 -0
- package/dist/telemetry/pusher.js.map +1 -0
- package/dist/telemetry/usage-collector.d.ts +39 -0
- package/dist/telemetry/usage-collector.js +60 -0
- package/dist/telemetry/usage-collector.js.map +1 -0
- package/dist/tools/action-items.d.ts +60 -0
- package/dist/tools/action-items.js +101 -0
- package/dist/tools/action-items.js.map +1 -0
- package/dist/tools/briefing.d.ts +15 -0
- package/dist/tools/briefing.js +138 -0
- package/dist/tools/briefing.js.map +1 -0
- package/dist/tools/comments.d.ts +43 -0
- package/dist/tools/comments.js +79 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/context.d.ts +20 -0
- package/dist/tools/context.js +31 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/instrumentation.d.ts +19 -0
- package/dist/tools/instrumentation.js +84 -0
- package/dist/tools/instrumentation.js.map +1 -0
- package/dist/tools/notifications.d.ts +29 -0
- package/dist/tools/notifications.js +57 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/tools/org.d.ts +12 -0
- package/dist/tools/org.js +31 -0
- package/dist/tools/org.js.map +1 -0
- package/dist/tools/projects.d.ts +73 -0
- package/dist/tools/projects.js +121 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/search.d.ts +20 -0
- package/dist/tools/search.js +50 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tasks.d.ts +110 -0
- package/dist/tools/tasks.js +168 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/users.d.ts +12 -0
- package/dist/tools/users.js +31 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/formatting.d.ts +16 -0
- package/dist/utils/formatting.js +196 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/webhook/handler.d.ts +10 -0
- package/dist/webhook/handler.js +70 -0
- package/dist/webhook/handler.js.map +1 -0
- package/openclaw.plugin.json +21 -0
- package/package.json +36 -0
- package/skills/blay/SKILL.md +25 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Item Tools — blay_list_action_items, blay_create_action_item, blay_update_action_item
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from "@sinclair/typebox";
|
|
5
|
+
import { formatError } from "../client.js";
|
|
6
|
+
import { formatActionItem, formatConfirmation } from "../utils/formatting.js";
|
|
7
|
+
export function createListActionItemsTool(client) {
|
|
8
|
+
return {
|
|
9
|
+
name: "blay_list_action_items",
|
|
10
|
+
label: "Blay List Action Items",
|
|
11
|
+
description: "List action items (discrete to-dos assigned to people). Use this for follow-ups and commitments — these are separate from tasks. Filter by assignee, status, or overdue.",
|
|
12
|
+
parameters: Type.Object({
|
|
13
|
+
assigneeId: Type.Optional(Type.String({ description: "Filter by assignee user ID" })),
|
|
14
|
+
status: Type.Optional(Type.String({ description: "Filter by status (pending, completed, cancelled)" })),
|
|
15
|
+
overdue: Type.Optional(Type.Boolean({ description: "Only return overdue action items" })),
|
|
16
|
+
limit: Type.Optional(Type.Number({ description: "Max results (default 50)" })),
|
|
17
|
+
}),
|
|
18
|
+
async execute(_toolCallId, params) {
|
|
19
|
+
const res = await client.get("/api/v1/action-items", {
|
|
20
|
+
assigneeId: params.assigneeId,
|
|
21
|
+
status: params.status,
|
|
22
|
+
overdue: params.overdue ? "true" : undefined,
|
|
23
|
+
limit: params.limit?.toString(),
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
return { content: [{ type: "text", text: formatError(res) }], details: {} };
|
|
27
|
+
}
|
|
28
|
+
const items = res.data.data ?? [];
|
|
29
|
+
if (items.length === 0) {
|
|
30
|
+
return { content: [{ type: "text", text: "No action items found." }], details: {} };
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
content: [
|
|
34
|
+
{ type: "text", text: `# Action Items (${items.length})\n\n${items.map(formatActionItem).join("\n")}` },
|
|
35
|
+
],
|
|
36
|
+
details: {},
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function createCreateActionItemTool(client) {
|
|
42
|
+
return {
|
|
43
|
+
name: "blay_create_action_item",
|
|
44
|
+
label: "Blay Create Action Item",
|
|
45
|
+
description: "Create a new action item assigned to a user. Action items are discrete follow-ups or commitments — use tasks for larger pieces of work.",
|
|
46
|
+
parameters: Type.Object({
|
|
47
|
+
title: Type.String({ description: "Action item title" }),
|
|
48
|
+
targetUserId: Type.String({ description: "User ID of the person who needs to act on this" }),
|
|
49
|
+
priority: Type.Optional(Type.String({ description: "Priority level" })),
|
|
50
|
+
dueDate: Type.Optional(Type.Number({ description: "Due date as Unix timestamp in milliseconds" })),
|
|
51
|
+
projectId: Type.Optional(Type.String({ description: "Associated project ID" })),
|
|
52
|
+
}),
|
|
53
|
+
async execute(_toolCallId, params) {
|
|
54
|
+
const res = await client.post("/api/v1/action-items", {
|
|
55
|
+
title: params.title,
|
|
56
|
+
targetUserId: params.targetUserId,
|
|
57
|
+
priority: params.priority,
|
|
58
|
+
dueDate: params.dueDate,
|
|
59
|
+
projectId: params.projectId,
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
return { content: [{ type: "text", text: formatError(res) }], details: {} };
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: formatConfirmation("Action item created", res.data) }],
|
|
66
|
+
details: {},
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function createUpdateActionItemTool(client) {
|
|
72
|
+
return {
|
|
73
|
+
name: "blay_update_action_item",
|
|
74
|
+
label: "Blay Update Action Item",
|
|
75
|
+
description: "Update an existing action item's fields. Use blay_list_action_items first to find the right ID.",
|
|
76
|
+
parameters: Type.Object({
|
|
77
|
+
actionItemId: Type.String({ description: "The action item ID to update" }),
|
|
78
|
+
title: Type.Optional(Type.String({ description: "New title" })),
|
|
79
|
+
status: Type.Optional(Type.String({ description: "New status (pending, completed, cancelled)" })),
|
|
80
|
+
priority: Type.Optional(Type.String({ description: "New priority" })),
|
|
81
|
+
dueDate: Type.Optional(Type.Number({ description: "New due date as Unix timestamp in milliseconds" })),
|
|
82
|
+
}),
|
|
83
|
+
async execute(_toolCallId, params) {
|
|
84
|
+
const { actionItemId, ...updates } = params;
|
|
85
|
+
const body = {};
|
|
86
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
87
|
+
if (value !== undefined)
|
|
88
|
+
body[key] = value;
|
|
89
|
+
}
|
|
90
|
+
const res = await client.patch(`/api/v1/action-items/${actionItemId}`, body);
|
|
91
|
+
if (!res.ok) {
|
|
92
|
+
return { content: [{ type: "text", text: formatError(res) }], details: {} };
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: "text", text: formatConfirmation("Action item updated", res.data) }],
|
|
96
|
+
details: {},
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=action-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-items.js","sourceRoot":"","sources":["../../src/tools/action-items.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG9E,MAAM,UAAU,yBAAyB,CAAC,MAAkB;IAC1D,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,0KAA0K;QAC5K,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;YACrF,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC,CAAC;YACvG,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC,CAAC;YACzF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC,CAAC;SAC/E,CAAC;QACF,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,MAAmF;YAEnF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,sBAAsB,EACtB;gBACE,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBAC5C,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE;aAChC,CACF,CAAC;YAEF,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,wBAAwB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtF,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;iBACxG;gBACD,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAkB;IAC3D,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,yIAAyI;QAC3I,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;YACxD,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;YAC5F,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACvE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC,CAAC;YAClG,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;SAChF,CAAC;QACF,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,MAAwG;YAExG,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAA0B,sBAAsB,EAAE;gBAC7E,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;YAEH,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,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtF,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAkB;IAC3D,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,iGAAiG;QACnG,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;YAC1E,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC,CAAC;YACjG,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;YACrE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC,CAAC;SACvG,CAAC;QACF,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,MAAsG;YAEtG,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAC;YAC5C,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,IAAI,KAAK,KAAK,SAAS;oBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC7C,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAA0B,wBAAwB,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;YAEtG,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,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtF,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Briefing Tool — blay_briefing
|
|
3
|
+
*
|
|
4
|
+
* Composite tool that calls multiple endpoints in parallel and
|
|
5
|
+
* assembles a complete context dump in one tool call.
|
|
6
|
+
*/
|
|
7
|
+
import type { BlayClient } from "../client.js";
|
|
8
|
+
import type { ToolResult } from "../types.js";
|
|
9
|
+
export declare function createBriefingTool(client: BlayClient): {
|
|
10
|
+
name: string;
|
|
11
|
+
label: string;
|
|
12
|
+
description: string;
|
|
13
|
+
parameters: import("@sinclair/typebox").TObject<{}>;
|
|
14
|
+
execute(): Promise<ToolResult>;
|
|
15
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Briefing Tool — blay_briefing
|
|
3
|
+
*
|
|
4
|
+
* Composite tool that calls multiple endpoints in parallel and
|
|
5
|
+
* assembles a complete context dump in one tool call.
|
|
6
|
+
*/
|
|
7
|
+
import { Type } from "@sinclair/typebox";
|
|
8
|
+
import { formatError } from "../client.js";
|
|
9
|
+
import { formatTask, formatActionItem, formatNotification, formatUser, formatRelativeDate, } from "../utils/formatting.js";
|
|
10
|
+
export function createBriefingTool(client) {
|
|
11
|
+
return {
|
|
12
|
+
name: "blay_briefing",
|
|
13
|
+
label: "Blay Briefing",
|
|
14
|
+
description: "Get a complete briefing of your current work in Blay. Returns your identity, urgent/overdue items, in-progress tasks (with stale flags), backlog, recently completed work, blocked items, pending action items, unread notifications, and team summary. This is the best tool to start with when you need context about the user's work.",
|
|
15
|
+
parameters: Type.Object({}),
|
|
16
|
+
async execute() {
|
|
17
|
+
const meRes = await client.get("/api/v1/me");
|
|
18
|
+
if (!meRes.ok) {
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: `Error fetching user identity: ${formatError(meRes)}` }],
|
|
21
|
+
details: {},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const me = meRes.data;
|
|
25
|
+
const userId = me.userId;
|
|
26
|
+
const [orgRes, inProgressRes, backlogRes, overdueRes, blockedRes, staleRes, completedRes, actionItemsRes, notificationsRes] = await Promise.all([
|
|
27
|
+
client.get("/api/v1/org"),
|
|
28
|
+
client.get("/api/v1/tasks", {
|
|
29
|
+
assigneeId: userId,
|
|
30
|
+
status: "in_progress",
|
|
31
|
+
limit: "20",
|
|
32
|
+
}),
|
|
33
|
+
client.get("/api/v1/tasks", {
|
|
34
|
+
assigneeId: userId,
|
|
35
|
+
status: "not_started",
|
|
36
|
+
limit: "20",
|
|
37
|
+
}),
|
|
38
|
+
client.get("/api/v1/tasks", {
|
|
39
|
+
assigneeId: userId,
|
|
40
|
+
overdue: "true",
|
|
41
|
+
limit: "20",
|
|
42
|
+
}),
|
|
43
|
+
client.get("/api/v1/tasks", {
|
|
44
|
+
assigneeId: userId,
|
|
45
|
+
blocked: "true",
|
|
46
|
+
limit: "20",
|
|
47
|
+
}),
|
|
48
|
+
client.get("/api/v1/tasks", {
|
|
49
|
+
assigneeId: userId,
|
|
50
|
+
stale: "true",
|
|
51
|
+
limit: "20",
|
|
52
|
+
}),
|
|
53
|
+
client.get("/api/v1/tasks", {
|
|
54
|
+
assigneeId: userId,
|
|
55
|
+
status: "completed",
|
|
56
|
+
limit: "5",
|
|
57
|
+
}),
|
|
58
|
+
client.get("/api/v1/action-items", {
|
|
59
|
+
assigneeId: userId,
|
|
60
|
+
status: "pending",
|
|
61
|
+
limit: "20",
|
|
62
|
+
}),
|
|
63
|
+
client.get("/api/v1/notifications", {
|
|
64
|
+
unreadOnly: "true",
|
|
65
|
+
limit: "20",
|
|
66
|
+
}),
|
|
67
|
+
]);
|
|
68
|
+
const sections = [];
|
|
69
|
+
sections.push(`## You\n**${me.name}** (${me.email}) — ${me.role ?? "member"} at **${me.orgName ?? "your org"}**\nYour user ID: ${me.userId}`);
|
|
70
|
+
const overdue = overdueRes.ok ? overdueRes.data.data : [];
|
|
71
|
+
if (overdue.length > 0) {
|
|
72
|
+
sections.push(`## Overdue Tasks (${overdue.length})\n${overdue.map(formatTask).join("\n")}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
sections.push("## Overdue Tasks\nNone — you're all caught up!");
|
|
76
|
+
}
|
|
77
|
+
const blocked = blockedRes.ok ? blockedRes.data.data : [];
|
|
78
|
+
if (blocked.length > 0) {
|
|
79
|
+
sections.push(`## Blocked Tasks (${blocked.length})\n${blocked.map(formatTask).join("\n")}`);
|
|
80
|
+
}
|
|
81
|
+
const inProgress = inProgressRes.ok ? inProgressRes.data.data : [];
|
|
82
|
+
const staleIds = new Set((staleRes.ok ? staleRes.data.data : []).map((t) => t.id));
|
|
83
|
+
if (inProgress.length > 0) {
|
|
84
|
+
const formatted = inProgress.map((t) => {
|
|
85
|
+
const line = formatTask(t);
|
|
86
|
+
if (staleIds.has(t.id)) {
|
|
87
|
+
const updated = t.updatedAt
|
|
88
|
+
? ` (last update: ${formatRelativeDate(t.updatedAt)})`
|
|
89
|
+
: "";
|
|
90
|
+
return `${line} STALE${updated}`;
|
|
91
|
+
}
|
|
92
|
+
return line;
|
|
93
|
+
});
|
|
94
|
+
const staleCount = inProgress.filter((t) => staleIds.has(t.id)).length;
|
|
95
|
+
const header = staleCount > 0
|
|
96
|
+
? `## In Progress (${inProgress.length}) — ${staleCount} stale`
|
|
97
|
+
: `## In Progress (${inProgress.length})`;
|
|
98
|
+
sections.push(`${header}\n${formatted.join("\n")}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
sections.push("## In Progress\nNo tasks currently in progress.");
|
|
102
|
+
}
|
|
103
|
+
const backlog = backlogRes.ok ? backlogRes.data.data : [];
|
|
104
|
+
if (backlog.length > 0) {
|
|
105
|
+
sections.push(`## Backlog (${backlog.length})\n${backlog.map(formatTask).join("\n")}`);
|
|
106
|
+
}
|
|
107
|
+
const completed = completedRes.ok ? completedRes.data.data : [];
|
|
108
|
+
if (completed.length > 0) {
|
|
109
|
+
const formatted = completed.map((t) => {
|
|
110
|
+
const line = formatTask(t);
|
|
111
|
+
const when = t.updatedAt ? ` — completed ${formatRelativeDate(t.updatedAt)}` : "";
|
|
112
|
+
return `${line}${when}`;
|
|
113
|
+
});
|
|
114
|
+
sections.push(`## Recently Completed (${completed.length})\n${formatted.join("\n")}`);
|
|
115
|
+
}
|
|
116
|
+
const actionItems = actionItemsRes.ok ? actionItemsRes.data.data : [];
|
|
117
|
+
if (actionItems.length > 0) {
|
|
118
|
+
sections.push(`## Pending Action Items (${actionItems.length})\n${actionItems.map(formatActionItem).join("\n")}`);
|
|
119
|
+
}
|
|
120
|
+
const notifications = notificationsRes.ok ? notificationsRes.data.data : [];
|
|
121
|
+
if (notifications.length > 0) {
|
|
122
|
+
sections.push(`## Unread Notifications (${notifications.length})\n${notifications.map(formatNotification).join("\n")}`);
|
|
123
|
+
}
|
|
124
|
+
if (orgRes.ok) {
|
|
125
|
+
const org = orgRes.data;
|
|
126
|
+
const members = org.members ?? [];
|
|
127
|
+
if (members.length > 0) {
|
|
128
|
+
sections.push(`## Team (${members.length} members)\n${members.map(formatUser).join("\n")}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
content: [{ type: "text", text: `# Blay Briefing\n\n${sections.join("\n\n")}` }],
|
|
133
|
+
details: {},
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=briefing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefing.js","sourceRoot":"","sources":["../../src/tools/briefing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment Tools — blay_list_comments, blay_post_comment
|
|
3
|
+
*/
|
|
4
|
+
import type { BlayClient } from "../client.js";
|
|
5
|
+
import type { ToolResult } from "../types.js";
|
|
6
|
+
export declare function createListCommentsTool(client: BlayClient): {
|
|
7
|
+
name: string;
|
|
8
|
+
label: string;
|
|
9
|
+
description: string;
|
|
10
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
11
|
+
entityType: import("@sinclair/typebox").TString;
|
|
12
|
+
entityId: import("@sinclair/typebox").TString;
|
|
13
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
14
|
+
}>;
|
|
15
|
+
execute(_toolCallId: string, params: {
|
|
16
|
+
entityType: string;
|
|
17
|
+
entityId: string;
|
|
18
|
+
limit?: number;
|
|
19
|
+
}): Promise<ToolResult>;
|
|
20
|
+
};
|
|
21
|
+
export declare function createPostCommentTool(client: BlayClient): {
|
|
22
|
+
name: string;
|
|
23
|
+
label: string;
|
|
24
|
+
description: string;
|
|
25
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
26
|
+
content: import("@sinclair/typebox").TString;
|
|
27
|
+
taskId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
28
|
+
projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
29
|
+
resourceId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
30
|
+
actionItemId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
31
|
+
isNote: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
32
|
+
mentions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
|
|
33
|
+
}>;
|
|
34
|
+
execute(_toolCallId: string, params: {
|
|
35
|
+
content: string;
|
|
36
|
+
taskId?: string;
|
|
37
|
+
projectId?: string;
|
|
38
|
+
resourceId?: string;
|
|
39
|
+
actionItemId?: string;
|
|
40
|
+
isNote?: boolean;
|
|
41
|
+
mentions?: string[];
|
|
42
|
+
}): Promise<ToolResult>;
|
|
43
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment Tools — blay_list_comments, blay_post_comment
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from "@sinclair/typebox";
|
|
5
|
+
import { formatError } from "../client.js";
|
|
6
|
+
import { formatRelativeDate } from "../utils/formatting.js";
|
|
7
|
+
export function createListCommentsTool(client) {
|
|
8
|
+
return {
|
|
9
|
+
name: "blay_list_comments",
|
|
10
|
+
label: "Blay List Comments",
|
|
11
|
+
description: "List comments on a task, project, resource, or action item. Use blay_get_context instead if you also need the entity's metadata and other details in one call.",
|
|
12
|
+
parameters: Type.Object({
|
|
13
|
+
entityType: Type.String({ description: "Entity type: 'task', 'project', 'resource', or 'actionItem'" }),
|
|
14
|
+
entityId: Type.String({ description: "The entity ID" }),
|
|
15
|
+
limit: Type.Optional(Type.Number({ description: "Max comments to return (default 50)" })),
|
|
16
|
+
}),
|
|
17
|
+
async execute(_toolCallId, params) {
|
|
18
|
+
const res = await client.get("/api/v1/comments", {
|
|
19
|
+
entityType: params.entityType,
|
|
20
|
+
entityId: params.entityId,
|
|
21
|
+
limit: params.limit?.toString(),
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
return { content: [{ type: "text", text: formatError(res) }], details: {} };
|
|
25
|
+
}
|
|
26
|
+
const comments = res.data.data ?? [];
|
|
27
|
+
if (comments.length === 0) {
|
|
28
|
+
return { content: [{ type: "text", text: "No comments found." }], details: {} };
|
|
29
|
+
}
|
|
30
|
+
const formatted = comments
|
|
31
|
+
.map((c) => `**${c.authorName ?? "Unknown"}** (${formatRelativeDate(c.createdAt)}):\n${c.content}`)
|
|
32
|
+
.join("\n\n---\n\n");
|
|
33
|
+
return {
|
|
34
|
+
content: [{ type: "text", text: `# Comments (${comments.length})\n\n${formatted}` }],
|
|
35
|
+
details: {},
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function createPostCommentTool(client) {
|
|
41
|
+
return {
|
|
42
|
+
name: "blay_post_comment",
|
|
43
|
+
label: "Blay Post Comment",
|
|
44
|
+
description: "Post a comment on a task, project, resource, or action item. Specify exactly one entity ID.",
|
|
45
|
+
parameters: Type.Object({
|
|
46
|
+
content: Type.String({ description: "Comment text" }),
|
|
47
|
+
taskId: Type.Optional(Type.String({ description: "Task ID to comment on" })),
|
|
48
|
+
projectId: Type.Optional(Type.String({ description: "Project ID to comment on" })),
|
|
49
|
+
resourceId: Type.Optional(Type.String({ description: "Resource ID to comment on" })),
|
|
50
|
+
actionItemId: Type.Optional(Type.String({ description: "Action item ID to comment on" })),
|
|
51
|
+
isNote: Type.Optional(Type.Boolean({ description: "If true, this is a private note" })),
|
|
52
|
+
mentions: Type.Optional(Type.Array(Type.String(), { description: "User IDs to mention" })),
|
|
53
|
+
}),
|
|
54
|
+
async execute(_toolCallId, params) {
|
|
55
|
+
const body = { content: params.content };
|
|
56
|
+
if (params.taskId)
|
|
57
|
+
body.taskId = params.taskId;
|
|
58
|
+
if (params.projectId)
|
|
59
|
+
body.projectId = params.projectId;
|
|
60
|
+
if (params.resourceId)
|
|
61
|
+
body.resourceId = params.resourceId;
|
|
62
|
+
if (params.actionItemId)
|
|
63
|
+
body.actionItemId = params.actionItemId;
|
|
64
|
+
if (params.isNote !== undefined)
|
|
65
|
+
body.isNote = params.isNote;
|
|
66
|
+
if (params.mentions)
|
|
67
|
+
body.mentions = params.mentions;
|
|
68
|
+
const res = await client.post("/api/v1/comments", body);
|
|
69
|
+
if (!res.ok) {
|
|
70
|
+
return { content: [{ type: "text", text: formatError(res) }], details: {} };
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
content: [{ type: "text", text: "Comment posted successfully." }],
|
|
74
|
+
details: {},
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Tool — blay_get_context
|
|
3
|
+
*/
|
|
4
|
+
import type { BlayClient } from "../client.js";
|
|
5
|
+
import type { ToolResult } from "../types.js";
|
|
6
|
+
export declare function createGetContextTool(client: BlayClient): {
|
|
7
|
+
name: string;
|
|
8
|
+
label: string;
|
|
9
|
+
description: string;
|
|
10
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
11
|
+
entityType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"task">, import("@sinclair/typebox").TLiteral<"project">]>;
|
|
12
|
+
entityId: import("@sinclair/typebox").TString;
|
|
13
|
+
depth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"shallow">, import("@sinclair/typebox").TLiteral<"standard">, import("@sinclair/typebox").TLiteral<"deep">]>>;
|
|
14
|
+
}>;
|
|
15
|
+
execute(_toolCallId: string, params: {
|
|
16
|
+
entityType: "task" | "project";
|
|
17
|
+
entityId: string;
|
|
18
|
+
depth?: "shallow" | "standard" | "deep";
|
|
19
|
+
}): Promise<ToolResult>;
|
|
20
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Tool — blay_get_context
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from "@sinclair/typebox";
|
|
5
|
+
import { formatError } from "../client.js";
|
|
6
|
+
import { formatContextEntity } from "../utils/formatting.js";
|
|
7
|
+
export function createGetContextTool(client) {
|
|
8
|
+
return {
|
|
9
|
+
name: "blay_get_context",
|
|
10
|
+
label: "Blay Get Context",
|
|
11
|
+
description: "Get deep assembled context for a task or project in one call. Prefer this over blay_get_task + blay_list_comments + separate calls when you need comprehensive context. Returns the entity, its project, recent comments, subtasks, resources, and collaborators depending on depth level.",
|
|
12
|
+
parameters: Type.Object({
|
|
13
|
+
entityType: Type.Union([Type.Literal("task"), Type.Literal("project")], { description: "Entity type" }),
|
|
14
|
+
entityId: Type.String({ description: "Entity ID" }),
|
|
15
|
+
depth: Type.Optional(Type.Union([Type.Literal("shallow"), Type.Literal("standard"), Type.Literal("deep")], {
|
|
16
|
+
description: "Context depth: 'shallow' (metadata only), 'standard' (entity + project + recent comments, default), 'deep' (everything including subtasks, resources, links, collaborators)",
|
|
17
|
+
})),
|
|
18
|
+
}),
|
|
19
|
+
async execute(_toolCallId, params) {
|
|
20
|
+
const res = await client.get(`/api/v1/context/${params.entityType}/${params.entityId}`, { depth: params.depth });
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
return { content: [{ type: "text", text: formatError(res) }], details: {} };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: "text", text: formatContextEntity(res.data) }],
|
|
26
|
+
details: {},
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,4RAA4R;QAC9R,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;YACvG,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;YACnD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE;gBACpF,WAAW,EACT,6KAA6K;aAChL,CAAC,CACH;SACF,CAAC;QACF,KAAK,CAAC,OAAO,CACX,WAAmB,EACnB,MAAqG;YAErG,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAC1B,mBAAmB,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,EACzD,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CACxB,CAAC;YAEF,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,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChE,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Instrumentation — wraps tool execute() to capture telemetry.
|
|
3
|
+
*
|
|
4
|
+
* When a RunTracker is active, records start time, params, result/error,
|
|
5
|
+
* and duration for each tool call. When no tracker is active, passes
|
|
6
|
+
* through to the original execute unchanged.
|
|
7
|
+
*
|
|
8
|
+
* Truncates params to 2KB and results to 1KB to keep run records bounded.
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolResult } from "../types.js";
|
|
11
|
+
export declare function truncate(value: unknown, maxLength: number): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Wraps a tool's execute method to capture telemetry for the active RunTracker.
|
|
14
|
+
* Returns the same tool shape with instrumented execute.
|
|
15
|
+
*/
|
|
16
|
+
export declare function instrumentTool<T extends {
|
|
17
|
+
name: string;
|
|
18
|
+
execute: (...args: any[]) => Promise<ToolResult>;
|
|
19
|
+
}>(tool: T): T;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Instrumentation — wraps tool execute() to capture telemetry.
|
|
3
|
+
*
|
|
4
|
+
* When a RunTracker is active, records start time, params, result/error,
|
|
5
|
+
* and duration for each tool call. When no tracker is active, passes
|
|
6
|
+
* through to the original execute unchanged.
|
|
7
|
+
*
|
|
8
|
+
* Truncates params to 2KB and results to 1KB to keep run records bounded.
|
|
9
|
+
*/
|
|
10
|
+
import { getCurrentRunTracker } from "../channel/run-tracker.js";
|
|
11
|
+
import { isAborted } from "../channel/abort.js";
|
|
12
|
+
const MAX_PARAMS_LENGTH = 2048;
|
|
13
|
+
const MAX_RESULT_LENGTH = 1024;
|
|
14
|
+
export function truncate(value, maxLength) {
|
|
15
|
+
if (value === undefined || value === null)
|
|
16
|
+
return undefined;
|
|
17
|
+
let str;
|
|
18
|
+
if (typeof value === "string") {
|
|
19
|
+
str = value;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
try {
|
|
23
|
+
str = JSON.stringify(value);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
str = String(value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (str.length > maxLength) {
|
|
30
|
+
return str.slice(0, maxLength) + "...[truncated]";
|
|
31
|
+
}
|
|
32
|
+
return str;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Wraps a tool's execute method to capture telemetry for the active RunTracker.
|
|
36
|
+
* Returns the same tool shape with instrumented execute.
|
|
37
|
+
*/
|
|
38
|
+
export function instrumentTool(tool) {
|
|
39
|
+
const originalExecute = tool.execute;
|
|
40
|
+
const instrumentedExecute = async function (toolCallId, params, ...rest) {
|
|
41
|
+
// Safety net: block blay_* tool execution when abort is active
|
|
42
|
+
if (isAborted()) {
|
|
43
|
+
throw new Error("Agent run was aborted by user");
|
|
44
|
+
}
|
|
45
|
+
const tracker = getCurrentRunTracker();
|
|
46
|
+
if (!tracker) {
|
|
47
|
+
return originalExecute.call(this, toolCallId, params, ...rest);
|
|
48
|
+
}
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
try {
|
|
51
|
+
const result = await originalExecute.call(this, toolCallId, params, ...rest);
|
|
52
|
+
const completedAt = Date.now();
|
|
53
|
+
const resultText = result?.content?.[0]?.text;
|
|
54
|
+
const record = {
|
|
55
|
+
name: tool.name,
|
|
56
|
+
params: truncate(params, MAX_PARAMS_LENGTH),
|
|
57
|
+
result: truncate(resultText, MAX_RESULT_LENGTH),
|
|
58
|
+
status: "success",
|
|
59
|
+
startedAt,
|
|
60
|
+
completedAt,
|
|
61
|
+
durationMs: completedAt - startedAt,
|
|
62
|
+
};
|
|
63
|
+
tracker.recordToolCall(record);
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const completedAt = Date.now();
|
|
68
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
69
|
+
const record = {
|
|
70
|
+
name: tool.name,
|
|
71
|
+
params: truncate(params, MAX_PARAMS_LENGTH),
|
|
72
|
+
status: "error",
|
|
73
|
+
error: truncate(errorMessage, MAX_RESULT_LENGTH),
|
|
74
|
+
startedAt,
|
|
75
|
+
completedAt,
|
|
76
|
+
durationMs: completedAt - startedAt,
|
|
77
|
+
};
|
|
78
|
+
tracker.recordToolCall(record);
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
return { ...tool, execute: instrumentedExecute };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/tools/instrumentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification Tools — blay_list_notifications, blay_mark_notification_read
|
|
3
|
+
*/
|
|
4
|
+
import type { BlayClient } from "../client.js";
|
|
5
|
+
import type { ToolResult } from "../types.js";
|
|
6
|
+
export declare function createListNotificationsTool(client: BlayClient): {
|
|
7
|
+
name: string;
|
|
8
|
+
label: string;
|
|
9
|
+
description: string;
|
|
10
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
11
|
+
unreadOnly: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
12
|
+
limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
13
|
+
}>;
|
|
14
|
+
execute(_toolCallId: string, params: {
|
|
15
|
+
unreadOnly?: boolean;
|
|
16
|
+
limit?: number;
|
|
17
|
+
}): Promise<ToolResult>;
|
|
18
|
+
};
|
|
19
|
+
export declare function createMarkNotificationReadTool(client: BlayClient): {
|
|
20
|
+
name: string;
|
|
21
|
+
label: string;
|
|
22
|
+
description: string;
|
|
23
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
24
|
+
notificationId: import("@sinclair/typebox").TString;
|
|
25
|
+
}>;
|
|
26
|
+
execute(_toolCallId: string, params: {
|
|
27
|
+
notificationId: string;
|
|
28
|
+
}): Promise<ToolResult>;
|
|
29
|
+
};
|