@ourroadmaps/mcp 0.27.0 → 0.28.1
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/dist/index.js +323 -6
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -527,7 +527,8 @@ var SLIDE_TYPES = [
|
|
|
527
527
|
"quote",
|
|
528
528
|
"code",
|
|
529
529
|
"thank_you",
|
|
530
|
-
"mermaid"
|
|
530
|
+
"mermaid",
|
|
531
|
+
"paragraph"
|
|
531
532
|
];
|
|
532
533
|
var slideTypeSchema = z12.enum(SLIDE_TYPES);
|
|
533
534
|
var titleContentSchema = z12.object({
|
|
@@ -586,6 +587,10 @@ var mermaidContentSchema = z12.object({
|
|
|
586
587
|
title: z12.string().optional(),
|
|
587
588
|
code: z12.string().default("")
|
|
588
589
|
});
|
|
590
|
+
var paragraphContentSchema = z12.object({
|
|
591
|
+
title: z12.string().optional(),
|
|
592
|
+
body: z12.string().default("")
|
|
593
|
+
});
|
|
589
594
|
var typedSlideContentSchema = z12.discriminatedUnion("type", [
|
|
590
595
|
z12.object({ type: z12.literal("title"), ...titleContentSchema.shape }),
|
|
591
596
|
z12.object({ type: z12.literal("section_header"), ...sectionHeaderContentSchema.shape }),
|
|
@@ -597,7 +602,8 @@ var typedSlideContentSchema = z12.discriminatedUnion("type", [
|
|
|
597
602
|
z12.object({ type: z12.literal("quote"), ...quoteContentSchema.shape }),
|
|
598
603
|
z12.object({ type: z12.literal("code"), ...codeContentSchema.shape }),
|
|
599
604
|
z12.object({ type: z12.literal("thank_you"), ...thankYouContentSchema.shape }),
|
|
600
|
-
z12.object({ type: z12.literal("mermaid"), ...mermaidContentSchema.shape })
|
|
605
|
+
z12.object({ type: z12.literal("mermaid"), ...mermaidContentSchema.shape }),
|
|
606
|
+
z12.object({ type: z12.literal("paragraph"), ...paragraphContentSchema.shape })
|
|
601
607
|
]);
|
|
602
608
|
var slideContentSchema = z12.object({
|
|
603
609
|
body: z12.string().optional()
|
|
@@ -1131,6 +1137,10 @@ class ApiClient {
|
|
|
1131
1137
|
});
|
|
1132
1138
|
return response.data;
|
|
1133
1139
|
}
|
|
1140
|
+
async getWorkflows() {
|
|
1141
|
+
const response = await this.request("/v1/workflows");
|
|
1142
|
+
return response.data;
|
|
1143
|
+
}
|
|
1134
1144
|
async updateReleaseDescription(roadmapId, description) {
|
|
1135
1145
|
const response = await this.request(`/v1/releases/roadmaps/${roadmapId}/release`, {
|
|
1136
1146
|
method: "PATCH",
|
|
@@ -1152,6 +1162,10 @@ class ApiClient {
|
|
|
1152
1162
|
});
|
|
1153
1163
|
return response.data;
|
|
1154
1164
|
}
|
|
1165
|
+
async listPrototypes(roadmapId) {
|
|
1166
|
+
const response = await this.request(`/v1/roadmaps/${roadmapId}/prototypes`);
|
|
1167
|
+
return response.data;
|
|
1168
|
+
}
|
|
1155
1169
|
async uploadFile(uploadUrl, content, contentType) {
|
|
1156
1170
|
const response = await fetch(uploadUrl, {
|
|
1157
1171
|
method: "PUT",
|
|
@@ -1314,6 +1328,28 @@ class ApiClient {
|
|
|
1314
1328
|
});
|
|
1315
1329
|
return response.data;
|
|
1316
1330
|
}
|
|
1331
|
+
async createFeedbackSession(prototypeId, data) {
|
|
1332
|
+
const response = await this.request(`/v1/prototypes/${prototypeId}/feedback/sessions`, {
|
|
1333
|
+
method: "POST",
|
|
1334
|
+
body: JSON.stringify(data)
|
|
1335
|
+
});
|
|
1336
|
+
return response.data;
|
|
1337
|
+
}
|
|
1338
|
+
async listFeedbackSessions(prototypeId) {
|
|
1339
|
+
const response = await this.request(`/v1/prototypes/${prototypeId}/feedback/sessions`);
|
|
1340
|
+
return response.data;
|
|
1341
|
+
}
|
|
1342
|
+
async getFeedbackComments(prototypeId, sessionId, filter) {
|
|
1343
|
+
const params = filter && filter !== "all" ? `?filter=${filter}` : "";
|
|
1344
|
+
const response = await this.request(`/v1/prototypes/${prototypeId}/feedback/sessions/${sessionId}/comments${params}`);
|
|
1345
|
+
return response.data;
|
|
1346
|
+
}
|
|
1347
|
+
async resolveFeedbackComment(prototypeId, sessionId, commentId) {
|
|
1348
|
+
const response = await this.request(`/v1/prototypes/${prototypeId}/feedback/sessions/${sessionId}/comments/${commentId}/resolve`, {
|
|
1349
|
+
method: "PATCH"
|
|
1350
|
+
});
|
|
1351
|
+
return response.data;
|
|
1352
|
+
}
|
|
1317
1353
|
async getVariantPresentationId(variantId) {
|
|
1318
1354
|
const presentations = await this.listPresentations();
|
|
1319
1355
|
for (const presentation2 of presentations.items) {
|
|
@@ -1409,6 +1445,12 @@ function registerAllTools(server) {
|
|
|
1409
1445
|
registerUploadDesignWalkthrough(server);
|
|
1410
1446
|
registerUploadReleaseWalkthrough(server);
|
|
1411
1447
|
registerPublishPrototype(server);
|
|
1448
|
+
registerListPrototypes(server);
|
|
1449
|
+
registerCreateFeedbackSession(server);
|
|
1450
|
+
registerListFeedbackSessions(server);
|
|
1451
|
+
registerGetFeedbackSummary(server);
|
|
1452
|
+
registerGetFeedbackDetail(server);
|
|
1453
|
+
registerResolveFeedbackComment(server);
|
|
1412
1454
|
registerSearchExports(server);
|
|
1413
1455
|
registerGetExport(server);
|
|
1414
1456
|
registerCreateExport(server);
|
|
@@ -1442,7 +1484,7 @@ function registerGetWorkflows(server) {
|
|
|
1442
1484
|
inputSchema: {}
|
|
1443
1485
|
}, async () => {
|
|
1444
1486
|
const client2 = getApiClient();
|
|
1445
|
-
const response = await client2.
|
|
1487
|
+
const response = await client2.getWorkflows();
|
|
1446
1488
|
return {
|
|
1447
1489
|
content: [
|
|
1448
1490
|
{
|
|
@@ -3537,6 +3579,8 @@ function registerPublishPrototype(server) {
|
|
|
3537
3579
|
type: "text",
|
|
3538
3580
|
text: `Published ${uploaded} files!
|
|
3539
3581
|
|
|
3582
|
+
Prototype ID: ${prototype.id}
|
|
3583
|
+
|
|
3540
3584
|
Share this link:
|
|
3541
3585
|
${prototype.publicUrl}
|
|
3542
3586
|
|
|
@@ -3546,6 +3590,54 @@ Expires: ${expiryDate}`
|
|
|
3546
3590
|
};
|
|
3547
3591
|
});
|
|
3548
3592
|
}
|
|
3593
|
+
function registerListPrototypes(server) {
|
|
3594
|
+
server.registerTool("list_prototypes", {
|
|
3595
|
+
description: "List published prototypes for a roadmap item. Returns prototype IDs needed for creating feedback sessions.",
|
|
3596
|
+
inputSchema: {
|
|
3597
|
+
roadmapId: z15.string().uuid().describe("The UUID of the roadmap item")
|
|
3598
|
+
}
|
|
3599
|
+
}, async ({ roadmapId }) => {
|
|
3600
|
+
const client2 = getApiClient();
|
|
3601
|
+
const prototypes = await client2.listPrototypes(roadmapId);
|
|
3602
|
+
if (prototypes.length === 0) {
|
|
3603
|
+
return {
|
|
3604
|
+
content: [
|
|
3605
|
+
{
|
|
3606
|
+
type: "text",
|
|
3607
|
+
text: "No prototypes found for this roadmap item."
|
|
3608
|
+
}
|
|
3609
|
+
]
|
|
3610
|
+
};
|
|
3611
|
+
}
|
|
3612
|
+
const lines = prototypes.map((p) => {
|
|
3613
|
+
const expiryDate = new Date(p.expiresAt).toLocaleDateString("en-US", {
|
|
3614
|
+
month: "long",
|
|
3615
|
+
day: "numeric",
|
|
3616
|
+
year: "numeric"
|
|
3617
|
+
});
|
|
3618
|
+
const createdDate = new Date(p.createdAt).toLocaleDateString("en-US", {
|
|
3619
|
+
month: "long",
|
|
3620
|
+
day: "numeric",
|
|
3621
|
+
year: "numeric"
|
|
3622
|
+
});
|
|
3623
|
+
return `ID: ${p.id}
|
|
3624
|
+
URL: ${p.publicUrl}
|
|
3625
|
+
Files: ${p.fileCount} | Created: ${createdDate} | Expires: ${expiryDate}`;
|
|
3626
|
+
});
|
|
3627
|
+
return {
|
|
3628
|
+
content: [
|
|
3629
|
+
{
|
|
3630
|
+
type: "text",
|
|
3631
|
+
text: `Found ${prototypes.length} prototype(s):
|
|
3632
|
+
|
|
3633
|
+
${lines.join(`
|
|
3634
|
+
|
|
3635
|
+
`)}`
|
|
3636
|
+
}
|
|
3637
|
+
]
|
|
3638
|
+
};
|
|
3639
|
+
});
|
|
3640
|
+
}
|
|
3549
3641
|
var dateGranularitySchema2 = z15.enum(["day", "month", "quarter", "half-year", "year"]);
|
|
3550
3642
|
function registerSearchInitiatives(server) {
|
|
3551
3643
|
server.registerTool("search_initiatives", {
|
|
@@ -4313,7 +4405,7 @@ function registerGetSlide(server) {
|
|
|
4313
4405
|
}
|
|
4314
4406
|
function registerCreateSlide(server) {
|
|
4315
4407
|
server.registerTool("create_slide", {
|
|
4316
|
-
description: "Create a new slide in a variant. Slide types: title (title + subtitle), section_header (title + subtitle), bullets (title + items array), two_column (title + left/right text), comparison (leftLabel + leftContent + rightLabel + rightContent), timeline (title + steps array of {title, description}), image (title + imageUrl + caption), quote (quote + attribution), code (title + code + language), thank_you (title + subtitle), mermaid (title + code with mermaid diagram syntax).",
|
|
4408
|
+
description: "Create a new slide in a variant. Slide types: title (title + subtitle), section_header (title + subtitle), bullets (title + items array), two_column (title + left/right text), comparison (leftLabel + leftContent + rightLabel + rightContent), timeline (title + steps array of {title, description}), image (title + imageUrl + caption), quote (quote + attribution), code (title + code + language), thank_you (title + subtitle), mermaid (title + code with mermaid diagram syntax), paragraph (title + body with markdown text).",
|
|
4317
4409
|
inputSchema: {
|
|
4318
4410
|
variantId: z15.string().describe("The UUID of the variant"),
|
|
4319
4411
|
slideType: z15.enum([
|
|
@@ -4327,9 +4419,10 @@ function registerCreateSlide(server) {
|
|
|
4327
4419
|
"quote",
|
|
4328
4420
|
"code",
|
|
4329
4421
|
"thank_you",
|
|
4330
|
-
"mermaid"
|
|
4422
|
+
"mermaid",
|
|
4423
|
+
"paragraph"
|
|
4331
4424
|
]).default("bullets").describe("The type of slide to create"),
|
|
4332
|
-
content: z15.record(z15.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. Etc.'),
|
|
4425
|
+
content: z15.record(z15.unknown()).optional().describe('Type-specific content object. For bullets: {title, items: ["..."]}. For title: {title, subtitle}. For two_column: {title, left, right}. For quote: {quote, attribution}. For mermaid: {title, code: "graph TD; A-->B"}. For paragraph: {title, body}. Etc.'),
|
|
4333
4426
|
speakerNotes: z15.string().nullable().optional().describe("Speaker notes for the slide")
|
|
4334
4427
|
}
|
|
4335
4428
|
}, async ({
|
|
@@ -4556,6 +4649,230 @@ function registerUploadSlideImage(server) {
|
|
|
4556
4649
|
};
|
|
4557
4650
|
});
|
|
4558
4651
|
}
|
|
4652
|
+
function registerCreateFeedbackSession(server) {
|
|
4653
|
+
server.registerTool("create_feedback_session", {
|
|
4654
|
+
description: "Create a feedback session for a prototype and get a shareable review link. Reviewers who open the link can optionally enter their name before leaving pin-based feedback.",
|
|
4655
|
+
inputSchema: {
|
|
4656
|
+
prototypeId: z15.string().uuid().describe("The UUID of the prototype to create a feedback session for"),
|
|
4657
|
+
name: z15.string().describe('Name for this feedback session (e.g., "Round 1 Review")'),
|
|
4658
|
+
expiresInDays: z15.number().int().min(1).max(90).optional().describe("Number of days until the session expires (default 7)")
|
|
4659
|
+
}
|
|
4660
|
+
}, async ({
|
|
4661
|
+
prototypeId,
|
|
4662
|
+
name,
|
|
4663
|
+
expiresInDays
|
|
4664
|
+
}) => {
|
|
4665
|
+
const client2 = getApiClient();
|
|
4666
|
+
const days = expiresInDays ?? 7;
|
|
4667
|
+
const expiresAt = new Date(Date.now() + days * 24 * 60 * 60 * 1000).toISOString();
|
|
4668
|
+
const session = await client2.createFeedbackSession(prototypeId, {
|
|
4669
|
+
name,
|
|
4670
|
+
expiresAt,
|
|
4671
|
+
reviewers: [{}]
|
|
4672
|
+
});
|
|
4673
|
+
const invite = session.invites[0];
|
|
4674
|
+
if (!invite) {
|
|
4675
|
+
return {
|
|
4676
|
+
content: [{ type: "text", text: "Error: No invite was created for the session." }]
|
|
4677
|
+
};
|
|
4678
|
+
}
|
|
4679
|
+
const reviewUrl = `https://app.ourroadmaps.com/prototype-review/${invite.token}`;
|
|
4680
|
+
const expiryDate = new Date(session.expiresAt).toLocaleDateString("en-US", {
|
|
4681
|
+
weekday: "long",
|
|
4682
|
+
year: "numeric",
|
|
4683
|
+
month: "long",
|
|
4684
|
+
day: "numeric"
|
|
4685
|
+
});
|
|
4686
|
+
return {
|
|
4687
|
+
content: [
|
|
4688
|
+
{
|
|
4689
|
+
type: "text",
|
|
4690
|
+
text: JSON.stringify({
|
|
4691
|
+
success: true,
|
|
4692
|
+
sessionId: session.id,
|
|
4693
|
+
sessionName: session.name,
|
|
4694
|
+
reviewUrl,
|
|
4695
|
+
expiresAt: session.expiresAt,
|
|
4696
|
+
expiryDate
|
|
4697
|
+
}, null, 2)
|
|
4698
|
+
}
|
|
4699
|
+
]
|
|
4700
|
+
};
|
|
4701
|
+
});
|
|
4702
|
+
}
|
|
4703
|
+
function registerListFeedbackSessions(server) {
|
|
4704
|
+
server.registerTool("list_feedback_sessions", {
|
|
4705
|
+
description: "List all feedback sessions for a prototype with comment counts and status.",
|
|
4706
|
+
inputSchema: {
|
|
4707
|
+
prototypeId: z15.string().uuid().describe("The UUID of the prototype")
|
|
4708
|
+
}
|
|
4709
|
+
}, async ({ prototypeId }) => {
|
|
4710
|
+
const client2 = getApiClient();
|
|
4711
|
+
const sessions = await client2.listFeedbackSessions(prototypeId);
|
|
4712
|
+
return {
|
|
4713
|
+
content: [
|
|
4714
|
+
{
|
|
4715
|
+
type: "text",
|
|
4716
|
+
text: JSON.stringify({
|
|
4717
|
+
sessions: sessions.map((s) => ({
|
|
4718
|
+
id: s.id,
|
|
4719
|
+
name: s.name,
|
|
4720
|
+
status: s.status,
|
|
4721
|
+
totalComments: s.totalComments,
|
|
4722
|
+
unresolvedComments: s.unresolvedComments,
|
|
4723
|
+
inviteCount: s.inviteCount,
|
|
4724
|
+
expiresAt: s.expiresAt,
|
|
4725
|
+
createdAt: s.createdAt
|
|
4726
|
+
}))
|
|
4727
|
+
}, null, 2)
|
|
4728
|
+
}
|
|
4729
|
+
]
|
|
4730
|
+
};
|
|
4731
|
+
});
|
|
4732
|
+
}
|
|
4733
|
+
function formatElementDesc(pinData) {
|
|
4734
|
+
if (!pinData || typeof pinData !== "object")
|
|
4735
|
+
return "";
|
|
4736
|
+
const pd = pinData;
|
|
4737
|
+
const el = pd.element;
|
|
4738
|
+
if (!el)
|
|
4739
|
+
return "";
|
|
4740
|
+
const tag = el.tag || "";
|
|
4741
|
+
const text = el.text ? ` "${String(el.text).slice(0, 80)}"` : "";
|
|
4742
|
+
return ` → <${tag}>${text}`;
|
|
4743
|
+
}
|
|
4744
|
+
function formatCommentLine(c) {
|
|
4745
|
+
const pin = c.pinNumber != null ? `Pin #${c.pinNumber}` : "General";
|
|
4746
|
+
const status = c.resolved ? "[RESOLVED]" : "[OPEN]";
|
|
4747
|
+
const reviewer = c.reviewerName || "Anonymous";
|
|
4748
|
+
const elementDesc = formatElementDesc(c.pinData);
|
|
4749
|
+
return `- **${pin}** ${status} by ${reviewer}${elementDesc}
|
|
4750
|
+
${c.commentText}
|
|
4751
|
+
|
|
4752
|
+
`;
|
|
4753
|
+
}
|
|
4754
|
+
function registerGetFeedbackSummary(server) {
|
|
4755
|
+
server.registerTool("get_feedback_summary", {
|
|
4756
|
+
description: "Get a human-readable summary of feedback for a session, grouped by page. Shows pin numbers, reviewer names, comment text, and which element was pinned. Use this for a quick overview of feedback.",
|
|
4757
|
+
inputSchema: {
|
|
4758
|
+
prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
|
|
4759
|
+
sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
|
|
4760
|
+
filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: unresolved)")
|
|
4761
|
+
}
|
|
4762
|
+
}, async ({
|
|
4763
|
+
prototypeId,
|
|
4764
|
+
sessionId,
|
|
4765
|
+
filter
|
|
4766
|
+
}) => {
|
|
4767
|
+
const client2 = getApiClient();
|
|
4768
|
+
const comments = await client2.getFeedbackComments(prototypeId, sessionId, filter ?? "unresolved");
|
|
4769
|
+
if (comments.length === 0) {
|
|
4770
|
+
return {
|
|
4771
|
+
content: [{ type: "text", text: "No comments found matching the filter." }]
|
|
4772
|
+
};
|
|
4773
|
+
}
|
|
4774
|
+
const byPage = new Map;
|
|
4775
|
+
for (const c of comments) {
|
|
4776
|
+
const page = c.pageUrl || "(no page)";
|
|
4777
|
+
if (!byPage.has(page))
|
|
4778
|
+
byPage.set(page, []);
|
|
4779
|
+
byPage.get(page).push(c);
|
|
4780
|
+
}
|
|
4781
|
+
let summary = `## Feedback Summary (${comments.length} comment${comments.length !== 1 ? "s" : ""})
|
|
4782
|
+
|
|
4783
|
+
`;
|
|
4784
|
+
for (const [page, pageComments] of byPage) {
|
|
4785
|
+
summary += `### Page: ${page}
|
|
4786
|
+
|
|
4787
|
+
`;
|
|
4788
|
+
for (const c of pageComments) {
|
|
4789
|
+
summary += formatCommentLine(c);
|
|
4790
|
+
}
|
|
4791
|
+
}
|
|
4792
|
+
return {
|
|
4793
|
+
content: [{ type: "text", text: summary.trim() }]
|
|
4794
|
+
};
|
|
4795
|
+
});
|
|
4796
|
+
}
|
|
4797
|
+
function registerGetFeedbackDetail(server) {
|
|
4798
|
+
server.registerTool("get_feedback_detail", {
|
|
4799
|
+
description: "Get full raw pin data for feedback comments, including CSS selectors, bounding boxes, parent/sibling DOM context, and coordinates. Use this when you need exact element information to make targeted code changes.",
|
|
4800
|
+
inputSchema: {
|
|
4801
|
+
prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
|
|
4802
|
+
sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
|
|
4803
|
+
commentId: z15.string().uuid().optional().describe("Optional: get detail for a single comment"),
|
|
4804
|
+
filter: z15.enum(["all", "unresolved", "resolved"]).optional().describe("Filter comments by resolved status (default: all). Ignored if commentId is provided.")
|
|
4805
|
+
}
|
|
4806
|
+
}, async ({
|
|
4807
|
+
prototypeId,
|
|
4808
|
+
sessionId,
|
|
4809
|
+
commentId,
|
|
4810
|
+
filter
|
|
4811
|
+
}) => {
|
|
4812
|
+
const client2 = getApiClient();
|
|
4813
|
+
const comments = await client2.getFeedbackComments(prototypeId, sessionId, filter ?? "all");
|
|
4814
|
+
let filtered = comments;
|
|
4815
|
+
if (commentId) {
|
|
4816
|
+
filtered = comments.filter((c) => c.id === commentId);
|
|
4817
|
+
if (filtered.length === 0) {
|
|
4818
|
+
return {
|
|
4819
|
+
content: [
|
|
4820
|
+
{ type: "text", text: `Comment ${commentId} not found in this session.` }
|
|
4821
|
+
]
|
|
4822
|
+
};
|
|
4823
|
+
}
|
|
4824
|
+
}
|
|
4825
|
+
return {
|
|
4826
|
+
content: [
|
|
4827
|
+
{
|
|
4828
|
+
type: "text",
|
|
4829
|
+
text: JSON.stringify({
|
|
4830
|
+
comments: filtered.map((c) => ({
|
|
4831
|
+
id: c.id,
|
|
4832
|
+
pinNumber: c.pinNumber,
|
|
4833
|
+
reviewerName: c.reviewerName,
|
|
4834
|
+
commentText: c.commentText,
|
|
4835
|
+
pageUrl: c.pageUrl,
|
|
4836
|
+
resolved: c.resolved,
|
|
4837
|
+
pinData: c.pinData,
|
|
4838
|
+
createdAt: c.createdAt
|
|
4839
|
+
}))
|
|
4840
|
+
}, null, 2)
|
|
4841
|
+
}
|
|
4842
|
+
]
|
|
4843
|
+
};
|
|
4844
|
+
});
|
|
4845
|
+
}
|
|
4846
|
+
function registerResolveFeedbackComment(server) {
|
|
4847
|
+
server.registerTool("resolve_feedback_comment", {
|
|
4848
|
+
description: "Toggle the resolved status on a feedback comment. If currently unresolved, marks it as resolved. If already resolved, marks it as unresolved.",
|
|
4849
|
+
inputSchema: {
|
|
4850
|
+
prototypeId: z15.string().uuid().describe("The UUID of the prototype"),
|
|
4851
|
+
sessionId: z15.string().uuid().describe("The UUID of the feedback session"),
|
|
4852
|
+
commentId: z15.string().uuid().describe("The UUID of the comment to resolve/unresolve")
|
|
4853
|
+
}
|
|
4854
|
+
}, async ({
|
|
4855
|
+
prototypeId,
|
|
4856
|
+
sessionId,
|
|
4857
|
+
commentId
|
|
4858
|
+
}) => {
|
|
4859
|
+
const client2 = getApiClient();
|
|
4860
|
+
const result = await client2.resolveFeedbackComment(prototypeId, sessionId, commentId);
|
|
4861
|
+
return {
|
|
4862
|
+
content: [
|
|
4863
|
+
{
|
|
4864
|
+
type: "text",
|
|
4865
|
+
text: JSON.stringify({
|
|
4866
|
+
success: true,
|
|
4867
|
+
commentId: result.id,
|
|
4868
|
+
resolved: result.resolved,
|
|
4869
|
+
resolvedAt: result.resolvedAt
|
|
4870
|
+
}, null, 2)
|
|
4871
|
+
}
|
|
4872
|
+
]
|
|
4873
|
+
};
|
|
4874
|
+
});
|
|
4875
|
+
}
|
|
4559
4876
|
|
|
4560
4877
|
// src/index.ts
|
|
4561
4878
|
async function main() {
|