@elizaos/plugin-linear 1.2.7 → 1.2.9
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 +235 -45
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -370,11 +370,11 @@ User request: "{{userMessage}}"
|
|
|
370
370
|
Extract and return ONLY a JSON object (no markdown formatting, no code blocks) with the following structure:
|
|
371
371
|
{
|
|
372
372
|
"title": "Brief, clear issue title",
|
|
373
|
-
"description": "Detailed description of the issue (optional)",
|
|
374
|
-
"teamKey": "Team key if mentioned (e.g., ENG, PROD)",
|
|
375
|
-
"priority": "Priority level if mentioned (1=urgent, 2=high, 3=normal, 4=low)",
|
|
376
|
-
"labels": ["label1", "label2"] (if any labels are mentioned),
|
|
377
|
-
"assignee": "Assignee username or email if mentioned"
|
|
373
|
+
"description": "Detailed description of the issue (optional, omit or use null if not provided)",
|
|
374
|
+
"teamKey": "Team key if mentioned (e.g., ENG, PROD) - omit or use null if not mentioned",
|
|
375
|
+
"priority": "Priority level if mentioned (1=urgent, 2=high, 3=normal, 4=low) - omit or use null if not mentioned",
|
|
376
|
+
"labels": ["label1", "label2"] (if any labels are mentioned, empty array if none),
|
|
377
|
+
"assignee": "Assignee username or email if mentioned - omit or use null if not mentioned"
|
|
378
378
|
}
|
|
379
379
|
|
|
380
380
|
Return only the JSON object, no other text.`;
|
|
@@ -419,7 +419,7 @@ var createIssueAction = {
|
|
|
419
419
|
return false;
|
|
420
420
|
}
|
|
421
421
|
},
|
|
422
|
-
async handler(runtime, message, _state, _options) {
|
|
422
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
423
423
|
try {
|
|
424
424
|
const linearService = runtime.getService("linear");
|
|
425
425
|
if (!linearService) {
|
|
@@ -427,8 +427,13 @@ var createIssueAction = {
|
|
|
427
427
|
}
|
|
428
428
|
const content = message.content.text;
|
|
429
429
|
if (!content) {
|
|
430
|
+
const errorMessage = "Please provide a description for the issue.";
|
|
431
|
+
await callback?.({
|
|
432
|
+
text: errorMessage,
|
|
433
|
+
source: message.content.source
|
|
434
|
+
});
|
|
430
435
|
return {
|
|
431
|
-
text:
|
|
436
|
+
text: errorMessage,
|
|
432
437
|
success: false
|
|
433
438
|
};
|
|
434
439
|
}
|
|
@@ -448,9 +453,9 @@ var createIssueAction = {
|
|
|
448
453
|
const cleanedResponse = response.replace(/^```(?:json)?\n?/, "").replace(/\n?```$/, "").trim();
|
|
449
454
|
const parsed = JSON.parse(cleanedResponse);
|
|
450
455
|
issueData = {
|
|
451
|
-
title: parsed.title,
|
|
452
|
-
description: parsed.description,
|
|
453
|
-
priority: parsed.priority
|
|
456
|
+
title: parsed.title || void 0,
|
|
457
|
+
description: parsed.description || void 0,
|
|
458
|
+
priority: parsed.priority ? Number(parsed.priority) : void 0
|
|
454
459
|
};
|
|
455
460
|
if (parsed.teamKey) {
|
|
456
461
|
const teams = await linearService.getTeams();
|
|
@@ -461,15 +466,33 @@ var createIssueAction = {
|
|
|
461
466
|
issueData.teamId = team.id;
|
|
462
467
|
}
|
|
463
468
|
}
|
|
464
|
-
if (parsed.assignee) {
|
|
469
|
+
if (parsed.assignee && parsed.assignee !== "") {
|
|
470
|
+
const cleanAssignee = parsed.assignee.replace(/^@/, "");
|
|
465
471
|
const users = await linearService.getUsers();
|
|
466
472
|
const user = users.find(
|
|
467
|
-
(u) => u.email ===
|
|
473
|
+
(u) => u.email === cleanAssignee || u.name.toLowerCase().includes(cleanAssignee.toLowerCase())
|
|
468
474
|
);
|
|
469
475
|
if (user) {
|
|
470
476
|
issueData.assigneeId = user.id;
|
|
471
477
|
}
|
|
472
478
|
}
|
|
479
|
+
if (parsed.labels && Array.isArray(parsed.labels) && parsed.labels.length > 0) {
|
|
480
|
+
const labels = await linearService.getLabels(issueData.teamId);
|
|
481
|
+
const labelIds = [];
|
|
482
|
+
for (const labelName of parsed.labels) {
|
|
483
|
+
if (labelName && labelName !== "") {
|
|
484
|
+
const label = labels.find(
|
|
485
|
+
(l) => l.name.toLowerCase() === labelName.toLowerCase()
|
|
486
|
+
);
|
|
487
|
+
if (label) {
|
|
488
|
+
labelIds.push(label.id);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
if (labelIds.length > 0) {
|
|
493
|
+
issueData.labelIds = labelIds;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
473
496
|
if (!issueData.teamId) {
|
|
474
497
|
const teams = await linearService.getTeams();
|
|
475
498
|
if (teams.length > 0) {
|
|
@@ -491,18 +514,35 @@ var createIssueAction = {
|
|
|
491
514
|
}
|
|
492
515
|
}
|
|
493
516
|
if (!issueData.title) {
|
|
517
|
+
const errorMessage = "Could not determine issue title. Please provide more details.";
|
|
518
|
+
await callback?.({
|
|
519
|
+
text: errorMessage,
|
|
520
|
+
source: message.content.source
|
|
521
|
+
});
|
|
494
522
|
return {
|
|
495
|
-
text:
|
|
523
|
+
text: errorMessage,
|
|
496
524
|
success: false
|
|
497
525
|
};
|
|
498
526
|
}
|
|
499
527
|
if (!issueData.teamId) {
|
|
528
|
+
const errorMessage = "No Linear teams found. Please ensure at least one team exists in your Linear workspace.";
|
|
529
|
+
await callback?.({
|
|
530
|
+
text: errorMessage,
|
|
531
|
+
source: message.content.source
|
|
532
|
+
});
|
|
500
533
|
return {
|
|
501
|
-
text:
|
|
534
|
+
text: errorMessage,
|
|
502
535
|
success: false
|
|
503
536
|
};
|
|
504
537
|
}
|
|
505
538
|
const issue = await linearService.createIssue(issueData);
|
|
539
|
+
const successMessage = `\u2705 Created Linear issue: ${issue.title} (${issue.identifier})
|
|
540
|
+
|
|
541
|
+
View it at: ${issue.url}`;
|
|
542
|
+
await callback?.({
|
|
543
|
+
text: successMessage,
|
|
544
|
+
source: message.content.source
|
|
545
|
+
});
|
|
506
546
|
return {
|
|
507
547
|
text: `Created issue: ${issue.title} (${issue.identifier})`,
|
|
508
548
|
success: true,
|
|
@@ -514,8 +554,13 @@ var createIssueAction = {
|
|
|
514
554
|
};
|
|
515
555
|
} catch (error) {
|
|
516
556
|
logger2.error("Failed to create issue:", error);
|
|
557
|
+
const errorMessage = `\u274C Failed to create issue: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
558
|
+
await callback?.({
|
|
559
|
+
text: errorMessage,
|
|
560
|
+
source: message.content.source
|
|
561
|
+
});
|
|
517
562
|
return {
|
|
518
|
-
text:
|
|
563
|
+
text: errorMessage,
|
|
519
564
|
success: false
|
|
520
565
|
};
|
|
521
566
|
}
|
|
@@ -565,7 +610,7 @@ var getIssueAction = {
|
|
|
565
610
|
return false;
|
|
566
611
|
}
|
|
567
612
|
},
|
|
568
|
-
async handler(runtime, message, _state, _options) {
|
|
613
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
569
614
|
try {
|
|
570
615
|
const linearService = runtime.getService("linear");
|
|
571
616
|
if (!linearService) {
|
|
@@ -573,15 +618,25 @@ var getIssueAction = {
|
|
|
573
618
|
}
|
|
574
619
|
const content = message.content.text;
|
|
575
620
|
if (!content) {
|
|
621
|
+
const errorMessage = "Please specify an issue ID.";
|
|
622
|
+
await callback?.({
|
|
623
|
+
text: errorMessage,
|
|
624
|
+
source: message.content.source
|
|
625
|
+
});
|
|
576
626
|
return {
|
|
577
|
-
text:
|
|
627
|
+
text: errorMessage,
|
|
578
628
|
success: false
|
|
579
629
|
};
|
|
580
630
|
}
|
|
581
631
|
const issueMatch = content.match(/(\w+-\d+)/);
|
|
582
632
|
if (!issueMatch) {
|
|
633
|
+
const errorMessage = "Please provide a valid issue ID (e.g., ENG-123).";
|
|
634
|
+
await callback?.({
|
|
635
|
+
text: errorMessage,
|
|
636
|
+
source: message.content.source
|
|
637
|
+
});
|
|
583
638
|
return {
|
|
584
|
-
text:
|
|
639
|
+
text: errorMessage,
|
|
585
640
|
success: false
|
|
586
641
|
};
|
|
587
642
|
}
|
|
@@ -630,7 +685,7 @@ var getIssueAction = {
|
|
|
630
685
|
name: project.name
|
|
631
686
|
} : null
|
|
632
687
|
};
|
|
633
|
-
let responseText =
|
|
688
|
+
let responseText = `\u{1F4CB} Issue ${issue.identifier}: ${issue.title}
|
|
634
689
|
`;
|
|
635
690
|
responseText += `Status: ${state?.name || "Unknown"}
|
|
636
691
|
`;
|
|
@@ -651,6 +706,10 @@ Description: ${issue.description}
|
|
|
651
706
|
}
|
|
652
707
|
responseText += `
|
|
653
708
|
View in Linear: ${issue.url}`;
|
|
709
|
+
await callback?.({
|
|
710
|
+
text: responseText,
|
|
711
|
+
source: message.content.source
|
|
712
|
+
});
|
|
654
713
|
return {
|
|
655
714
|
text: responseText,
|
|
656
715
|
success: true,
|
|
@@ -658,8 +717,13 @@ View in Linear: ${issue.url}`;
|
|
|
658
717
|
};
|
|
659
718
|
} catch (error) {
|
|
660
719
|
logger3.error("Failed to get issue:", error);
|
|
720
|
+
const errorMessage = `\u274C Failed to get issue: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
721
|
+
await callback?.({
|
|
722
|
+
text: errorMessage,
|
|
723
|
+
source: message.content.source
|
|
724
|
+
});
|
|
661
725
|
return {
|
|
662
|
-
text:
|
|
726
|
+
text: errorMessage,
|
|
663
727
|
success: false
|
|
664
728
|
};
|
|
665
729
|
}
|
|
@@ -709,7 +773,7 @@ var updateIssueAction = {
|
|
|
709
773
|
return false;
|
|
710
774
|
}
|
|
711
775
|
},
|
|
712
|
-
async handler(runtime, message, _state, _options) {
|
|
776
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
713
777
|
try {
|
|
714
778
|
const linearService = runtime.getService("linear");
|
|
715
779
|
if (!linearService) {
|
|
@@ -717,15 +781,25 @@ var updateIssueAction = {
|
|
|
717
781
|
}
|
|
718
782
|
const content = message.content.text;
|
|
719
783
|
if (!content) {
|
|
784
|
+
const errorMessage = "Please provide update instructions for the issue.";
|
|
785
|
+
await callback?.({
|
|
786
|
+
text: errorMessage,
|
|
787
|
+
source: message.content.source
|
|
788
|
+
});
|
|
720
789
|
return {
|
|
721
|
-
text:
|
|
790
|
+
text: errorMessage,
|
|
722
791
|
success: false
|
|
723
792
|
};
|
|
724
793
|
}
|
|
725
794
|
const issueMatch = content.match(/(\w+-\d+)/);
|
|
726
795
|
if (!issueMatch) {
|
|
796
|
+
const errorMessage = "Please specify an issue ID (e.g., ENG-123) to update.";
|
|
797
|
+
await callback?.({
|
|
798
|
+
text: errorMessage,
|
|
799
|
+
source: message.content.source
|
|
800
|
+
});
|
|
727
801
|
return {
|
|
728
|
-
text:
|
|
802
|
+
text: errorMessage,
|
|
729
803
|
success: false
|
|
730
804
|
};
|
|
731
805
|
}
|
|
@@ -758,13 +832,25 @@ var updateIssueAction = {
|
|
|
758
832
|
logger4.warn("Status updates not yet implemented");
|
|
759
833
|
}
|
|
760
834
|
if (Object.keys(updates).length === 0) {
|
|
835
|
+
const errorMessage = `No valid updates found. Please specify what to update (e.g., "Update issue ENG-123 title to 'New Title'")`;
|
|
836
|
+
await callback?.({
|
|
837
|
+
text: errorMessage,
|
|
838
|
+
source: message.content.source
|
|
839
|
+
});
|
|
761
840
|
return {
|
|
762
|
-
text:
|
|
841
|
+
text: errorMessage,
|
|
763
842
|
success: false
|
|
764
843
|
};
|
|
765
844
|
}
|
|
766
845
|
const updatedIssue = await linearService.updateIssue(issueId, updates);
|
|
767
846
|
const updateSummary = Object.entries(updates).map(([key, value]) => `${key}: ${value}`).join(", ");
|
|
847
|
+
const successMessage = `\u2705 Updated issue ${updatedIssue.identifier}: ${updateSummary}
|
|
848
|
+
|
|
849
|
+
View it at: ${updatedIssue.url}`;
|
|
850
|
+
await callback?.({
|
|
851
|
+
text: successMessage,
|
|
852
|
+
source: message.content.source
|
|
853
|
+
});
|
|
768
854
|
return {
|
|
769
855
|
text: `Updated issue ${updatedIssue.identifier}: ${updateSummary}`,
|
|
770
856
|
success: true,
|
|
@@ -777,8 +863,13 @@ var updateIssueAction = {
|
|
|
777
863
|
};
|
|
778
864
|
} catch (error) {
|
|
779
865
|
logger4.error("Failed to update issue:", error);
|
|
866
|
+
const errorMessage = `\u274C Failed to update issue: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
867
|
+
await callback?.({
|
|
868
|
+
text: errorMessage,
|
|
869
|
+
source: message.content.source
|
|
870
|
+
});
|
|
780
871
|
return {
|
|
781
|
-
text:
|
|
872
|
+
text: errorMessage,
|
|
782
873
|
success: false
|
|
783
874
|
};
|
|
784
875
|
}
|
|
@@ -848,7 +939,7 @@ var searchIssuesAction = {
|
|
|
848
939
|
return false;
|
|
849
940
|
}
|
|
850
941
|
},
|
|
851
|
-
async handler(runtime, message, _state, _options) {
|
|
942
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
852
943
|
try {
|
|
853
944
|
const linearService = runtime.getService("linear");
|
|
854
945
|
if (!linearService) {
|
|
@@ -856,8 +947,13 @@ var searchIssuesAction = {
|
|
|
856
947
|
}
|
|
857
948
|
const content = message.content.text;
|
|
858
949
|
if (!content) {
|
|
950
|
+
const errorMessage = "Please provide search criteria for issues.";
|
|
951
|
+
await callback?.({
|
|
952
|
+
text: errorMessage,
|
|
953
|
+
source: message.content.source
|
|
954
|
+
});
|
|
859
955
|
return {
|
|
860
|
-
text:
|
|
956
|
+
text: errorMessage,
|
|
861
957
|
success: false
|
|
862
958
|
};
|
|
863
959
|
}
|
|
@@ -898,8 +994,13 @@ var searchIssuesAction = {
|
|
|
898
994
|
filters.limit = _options?.limit || 10;
|
|
899
995
|
const issues = await linearService.searchIssues(filters);
|
|
900
996
|
if (issues.length === 0) {
|
|
997
|
+
const noResultsMessage = "No issues found matching your search criteria.";
|
|
998
|
+
await callback?.({
|
|
999
|
+
text: noResultsMessage,
|
|
1000
|
+
source: message.content.source
|
|
1001
|
+
});
|
|
901
1002
|
return {
|
|
902
|
-
text:
|
|
1003
|
+
text: noResultsMessage,
|
|
903
1004
|
success: true,
|
|
904
1005
|
data: {
|
|
905
1006
|
issues: [],
|
|
@@ -913,6 +1014,12 @@ var searchIssuesAction = {
|
|
|
913
1014
|
return `${index + 1}. ${issue.identifier}: ${issue.title} (${state?.name || "No state"})`;
|
|
914
1015
|
}));
|
|
915
1016
|
const issueText = issueList.join("\n");
|
|
1017
|
+
const resultMessage = `\u{1F4CB} Found ${issues.length} issue${issues.length === 1 ? "" : "s"}:
|
|
1018
|
+
${issueText}`;
|
|
1019
|
+
await callback?.({
|
|
1020
|
+
text: resultMessage,
|
|
1021
|
+
source: message.content.source
|
|
1022
|
+
});
|
|
916
1023
|
return {
|
|
917
1024
|
text: `Found ${issues.length} issue${issues.length === 1 ? "" : "s"}:
|
|
918
1025
|
${issueText}`,
|
|
@@ -935,8 +1042,13 @@ ${issueText}`,
|
|
|
935
1042
|
};
|
|
936
1043
|
} catch (error) {
|
|
937
1044
|
logger5.error("Failed to search issues:", error);
|
|
1045
|
+
const errorMessage = `\u274C Failed to search issues: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
1046
|
+
await callback?.({
|
|
1047
|
+
text: errorMessage,
|
|
1048
|
+
source: message.content.source
|
|
1049
|
+
});
|
|
938
1050
|
return {
|
|
939
|
-
text:
|
|
1051
|
+
text: errorMessage,
|
|
940
1052
|
success: false
|
|
941
1053
|
};
|
|
942
1054
|
}
|
|
@@ -986,7 +1098,7 @@ var createCommentAction = {
|
|
|
986
1098
|
return false;
|
|
987
1099
|
}
|
|
988
1100
|
},
|
|
989
|
-
async handler(runtime, message, _state, _options) {
|
|
1101
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
990
1102
|
try {
|
|
991
1103
|
const linearService = runtime.getService("linear");
|
|
992
1104
|
if (!linearService) {
|
|
@@ -994,15 +1106,25 @@ var createCommentAction = {
|
|
|
994
1106
|
}
|
|
995
1107
|
const content = message.content.text;
|
|
996
1108
|
if (!content) {
|
|
1109
|
+
const errorMessage = "Please provide a message with the issue ID and comment content.";
|
|
1110
|
+
await callback?.({
|
|
1111
|
+
text: errorMessage,
|
|
1112
|
+
source: message.content.source
|
|
1113
|
+
});
|
|
997
1114
|
return {
|
|
998
|
-
text:
|
|
1115
|
+
text: errorMessage,
|
|
999
1116
|
success: false
|
|
1000
1117
|
};
|
|
1001
1118
|
}
|
|
1002
1119
|
const issueMatch = content.match(/(?:comment on|add.*comment.*to)\s+(\w+-\d+):?\s*(.*)/i);
|
|
1003
1120
|
if (!issueMatch) {
|
|
1121
|
+
const errorMessage = 'Please specify the issue ID and comment content. Example: "Comment on ENG-123: This looks good"';
|
|
1122
|
+
await callback?.({
|
|
1123
|
+
text: errorMessage,
|
|
1124
|
+
source: message.content.source
|
|
1125
|
+
});
|
|
1004
1126
|
return {
|
|
1005
|
-
text:
|
|
1127
|
+
text: errorMessage,
|
|
1006
1128
|
success: false
|
|
1007
1129
|
};
|
|
1008
1130
|
}
|
|
@@ -1012,6 +1134,11 @@ var createCommentAction = {
|
|
|
1012
1134
|
issueId: issue.id,
|
|
1013
1135
|
body: commentBody.trim()
|
|
1014
1136
|
});
|
|
1137
|
+
const successMessage = `\u2705 Comment added to issue ${issueIdentifier}: "${commentBody.trim()}"`;
|
|
1138
|
+
await callback?.({
|
|
1139
|
+
text: successMessage,
|
|
1140
|
+
source: message.content.source
|
|
1141
|
+
});
|
|
1015
1142
|
return {
|
|
1016
1143
|
text: `Comment added to issue ${issueIdentifier}: "${commentBody.trim()}"`,
|
|
1017
1144
|
success: true,
|
|
@@ -1022,8 +1149,13 @@ var createCommentAction = {
|
|
|
1022
1149
|
};
|
|
1023
1150
|
} catch (error) {
|
|
1024
1151
|
logger6.error("Failed to create comment:", error);
|
|
1152
|
+
const errorMessage = `\u274C Failed to create comment: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
1153
|
+
await callback?.({
|
|
1154
|
+
text: errorMessage,
|
|
1155
|
+
source: message.content.source
|
|
1156
|
+
});
|
|
1025
1157
|
return {
|
|
1026
|
-
text:
|
|
1158
|
+
text: errorMessage,
|
|
1027
1159
|
success: false
|
|
1028
1160
|
};
|
|
1029
1161
|
}
|
|
@@ -1073,7 +1205,7 @@ var listTeamsAction = {
|
|
|
1073
1205
|
return false;
|
|
1074
1206
|
}
|
|
1075
1207
|
},
|
|
1076
|
-
async handler(runtime,
|
|
1208
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
1077
1209
|
try {
|
|
1078
1210
|
const linearService = runtime.getService("linear");
|
|
1079
1211
|
if (!linearService) {
|
|
@@ -1081,8 +1213,13 @@ var listTeamsAction = {
|
|
|
1081
1213
|
}
|
|
1082
1214
|
const teams = await linearService.getTeams();
|
|
1083
1215
|
if (teams.length === 0) {
|
|
1216
|
+
const noTeamsMessage = "No teams found in Linear.";
|
|
1217
|
+
await callback?.({
|
|
1218
|
+
text: noTeamsMessage,
|
|
1219
|
+
source: message.content.source
|
|
1220
|
+
});
|
|
1084
1221
|
return {
|
|
1085
|
-
text:
|
|
1222
|
+
text: noTeamsMessage,
|
|
1086
1223
|
success: true,
|
|
1087
1224
|
data: {
|
|
1088
1225
|
teams: []
|
|
@@ -1092,6 +1229,12 @@ var listTeamsAction = {
|
|
|
1092
1229
|
const teamList = teams.map(
|
|
1093
1230
|
(team, index) => `${index + 1}. ${team.name} (${team.key})${team.description ? ` - ${team.description}` : ""}`
|
|
1094
1231
|
).join("\n");
|
|
1232
|
+
const resultMessage = `\u{1F465} Found ${teams.length} team${teams.length === 1 ? "" : "s"}:
|
|
1233
|
+
${teamList}`;
|
|
1234
|
+
await callback?.({
|
|
1235
|
+
text: resultMessage,
|
|
1236
|
+
source: message.content.source
|
|
1237
|
+
});
|
|
1095
1238
|
return {
|
|
1096
1239
|
text: `Found ${teams.length} team${teams.length === 1 ? "" : "s"}:
|
|
1097
1240
|
${teamList}`,
|
|
@@ -1108,8 +1251,13 @@ ${teamList}`,
|
|
|
1108
1251
|
};
|
|
1109
1252
|
} catch (error) {
|
|
1110
1253
|
logger7.error("Failed to list teams:", error);
|
|
1254
|
+
const errorMessage = `\u274C Failed to list teams: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
1255
|
+
await callback?.({
|
|
1256
|
+
text: errorMessage,
|
|
1257
|
+
source: message.content.source
|
|
1258
|
+
});
|
|
1111
1259
|
return {
|
|
1112
|
-
text:
|
|
1260
|
+
text: errorMessage,
|
|
1113
1261
|
success: false
|
|
1114
1262
|
};
|
|
1115
1263
|
}
|
|
@@ -1159,7 +1307,7 @@ var listProjectsAction = {
|
|
|
1159
1307
|
return false;
|
|
1160
1308
|
}
|
|
1161
1309
|
},
|
|
1162
|
-
async handler(runtime,
|
|
1310
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
1163
1311
|
try {
|
|
1164
1312
|
const linearService = runtime.getService("linear");
|
|
1165
1313
|
if (!linearService) {
|
|
@@ -1167,8 +1315,13 @@ var listProjectsAction = {
|
|
|
1167
1315
|
}
|
|
1168
1316
|
const projects = await linearService.getProjects();
|
|
1169
1317
|
if (projects.length === 0) {
|
|
1318
|
+
const noProjectsMessage = "No projects found in Linear.";
|
|
1319
|
+
await callback?.({
|
|
1320
|
+
text: noProjectsMessage,
|
|
1321
|
+
source: message.content.source
|
|
1322
|
+
});
|
|
1170
1323
|
return {
|
|
1171
|
-
text:
|
|
1324
|
+
text: noProjectsMessage,
|
|
1172
1325
|
success: true,
|
|
1173
1326
|
data: {
|
|
1174
1327
|
projects: []
|
|
@@ -1189,6 +1342,12 @@ var listProjectsAction = {
|
|
|
1189
1342
|
const teamNames = project.teamsList.map((t) => t.name).join(", ") || "No teams";
|
|
1190
1343
|
return `${index + 1}. ${project.name}${project.description ? ` - ${project.description}` : ""} (Teams: ${teamNames})`;
|
|
1191
1344
|
}).join("\n");
|
|
1345
|
+
const resultMessage = `\u{1F4C1} Found ${projects.length} project${projects.length === 1 ? "" : "s"}:
|
|
1346
|
+
${projectList}`;
|
|
1347
|
+
await callback?.({
|
|
1348
|
+
text: resultMessage,
|
|
1349
|
+
source: message.content.source
|
|
1350
|
+
});
|
|
1192
1351
|
return {
|
|
1193
1352
|
text: `Found ${projects.length} project${projects.length === 1 ? "" : "s"}:
|
|
1194
1353
|
${projectList}`,
|
|
@@ -1214,8 +1373,13 @@ ${projectList}`,
|
|
|
1214
1373
|
};
|
|
1215
1374
|
} catch (error) {
|
|
1216
1375
|
logger8.error("Failed to list projects:", error);
|
|
1376
|
+
const errorMessage = `\u274C Failed to list projects: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
1377
|
+
await callback?.({
|
|
1378
|
+
text: errorMessage,
|
|
1379
|
+
source: message.content.source
|
|
1380
|
+
});
|
|
1217
1381
|
return {
|
|
1218
|
-
text:
|
|
1382
|
+
text: errorMessage,
|
|
1219
1383
|
success: false
|
|
1220
1384
|
};
|
|
1221
1385
|
}
|
|
@@ -1265,7 +1429,7 @@ var getActivityAction = {
|
|
|
1265
1429
|
return false;
|
|
1266
1430
|
}
|
|
1267
1431
|
},
|
|
1268
|
-
async handler(runtime,
|
|
1432
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
1269
1433
|
try {
|
|
1270
1434
|
const linearService = runtime.getService("linear");
|
|
1271
1435
|
if (!linearService) {
|
|
@@ -1273,8 +1437,13 @@ var getActivityAction = {
|
|
|
1273
1437
|
}
|
|
1274
1438
|
const activity = linearService.getActivityLog();
|
|
1275
1439
|
if (activity.length === 0) {
|
|
1440
|
+
const noActivityMessage = "No recent Linear activity found.";
|
|
1441
|
+
await callback?.({
|
|
1442
|
+
text: noActivityMessage,
|
|
1443
|
+
source: message.content.source
|
|
1444
|
+
});
|
|
1276
1445
|
return {
|
|
1277
|
-
text:
|
|
1446
|
+
text: noActivityMessage,
|
|
1278
1447
|
success: true,
|
|
1279
1448
|
data: {
|
|
1280
1449
|
activity: []
|
|
@@ -1285,6 +1454,12 @@ var getActivityAction = {
|
|
|
1285
1454
|
const description = `${item.action} ${item.resource_type} ${item.resource_id}${item.error ? ` (failed: ${item.error})` : ""}`;
|
|
1286
1455
|
return `${index + 1}. ${description}`;
|
|
1287
1456
|
}).join("\n");
|
|
1457
|
+
const resultMessage = `\u{1F4CA} Recent Linear activity:
|
|
1458
|
+
${activityText}`;
|
|
1459
|
+
await callback?.({
|
|
1460
|
+
text: resultMessage,
|
|
1461
|
+
source: message.content.source
|
|
1462
|
+
});
|
|
1288
1463
|
return {
|
|
1289
1464
|
text: `Recent Linear activity:
|
|
1290
1465
|
${activityText}`,
|
|
@@ -1296,8 +1471,13 @@ ${activityText}`,
|
|
|
1296
1471
|
};
|
|
1297
1472
|
} catch (error) {
|
|
1298
1473
|
logger9.error("Failed to get Linear activity:", error);
|
|
1474
|
+
const errorMessage = `\u274C Failed to get Linear activity: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
1475
|
+
await callback?.({
|
|
1476
|
+
text: errorMessage,
|
|
1477
|
+
source: message.content.source
|
|
1478
|
+
});
|
|
1299
1479
|
return {
|
|
1300
|
-
text:
|
|
1480
|
+
text: errorMessage,
|
|
1301
1481
|
success: false
|
|
1302
1482
|
};
|
|
1303
1483
|
}
|
|
@@ -1347,21 +1527,31 @@ var clearActivityAction = {
|
|
|
1347
1527
|
return false;
|
|
1348
1528
|
}
|
|
1349
1529
|
},
|
|
1350
|
-
async handler(runtime, message, _state, _options) {
|
|
1530
|
+
async handler(runtime, message, _state, _options, callback) {
|
|
1351
1531
|
try {
|
|
1352
1532
|
const linearService = runtime.getService("linear");
|
|
1353
1533
|
if (!linearService) {
|
|
1354
1534
|
throw new Error("Linear service not available");
|
|
1355
1535
|
}
|
|
1356
1536
|
await linearService.clearActivityLog();
|
|
1537
|
+
const successMessage = "\u2705 Linear activity log has been cleared.";
|
|
1538
|
+
await callback?.({
|
|
1539
|
+
text: successMessage,
|
|
1540
|
+
source: message.content.source
|
|
1541
|
+
});
|
|
1357
1542
|
return {
|
|
1358
|
-
text:
|
|
1543
|
+
text: successMessage,
|
|
1359
1544
|
success: true
|
|
1360
1545
|
};
|
|
1361
1546
|
} catch (error) {
|
|
1362
1547
|
logger10.error("Failed to clear Linear activity:", error);
|
|
1548
|
+
const errorMessage = `\u274C Failed to clear Linear activity: ${error instanceof Error ? error.message : "Unknown error"}`;
|
|
1549
|
+
await callback?.({
|
|
1550
|
+
text: errorMessage,
|
|
1551
|
+
source: message.content.source
|
|
1552
|
+
});
|
|
1363
1553
|
return {
|
|
1364
|
-
text:
|
|
1554
|
+
text: errorMessage,
|
|
1365
1555
|
success: false
|
|
1366
1556
|
};
|
|
1367
1557
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/services/linear.ts","../src/types/index.ts","../src/actions/createIssue.ts","../src/actions/getIssue.ts","../src/actions/updateIssue.ts","../src/actions/searchIssues.ts","../src/actions/createComment.ts","../src/actions/listTeams.ts","../src/actions/listProjects.ts","../src/actions/getActivity.ts","../src/actions/clearActivity.ts","../src/providers/issues.ts","../src/providers/teams.ts","../src/providers/projects.ts","../src/providers/activity.ts","../src/index.ts"],"sourcesContent":["import { logger, Service, type IAgentRuntime } from '@elizaos/core';\nimport { LinearClient, Issue, Project, Team, User, WorkflowState, IssueLabel, Comment } from '@linear/sdk';\nimport type { \n LinearConfig, \n LinearActivityItem, \n LinearIssueInput, \n LinearCommentInput,\n LinearSearchFilters \n} from '../types';\nimport { LinearAPIError, LinearAuthenticationError } from '../types';\n\nexport class LinearService extends Service {\n static serviceType = 'linear';\n \n capabilityDescription = 'Linear API integration for issue tracking, project management, and team collaboration';\n \n private client: LinearClient;\n private activityLog: LinearActivityItem[] = [];\n private linearConfig: LinearConfig;\n private workspaceId?: string;\n \n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n \n // Get config from runtime settings\n const apiKey = runtime?.getSetting('LINEAR_API_KEY') as string;\n const workspaceId = runtime?.getSetting('LINEAR_WORKSPACE_ID') as string;\n \n if (!apiKey) {\n throw new LinearAuthenticationError('Linear API key is required');\n }\n \n this.linearConfig = {\n LINEAR_API_KEY: apiKey,\n LINEAR_WORKSPACE_ID: workspaceId,\n };\n \n this.workspaceId = workspaceId;\n \n this.config = {\n LINEAR_API_KEY: apiKey,\n LINEAR_WORKSPACE_ID: workspaceId,\n };\n \n this.client = new LinearClient({\n apiKey: this.linearConfig.LINEAR_API_KEY,\n });\n }\n \n static async start(runtime: IAgentRuntime): Promise<LinearService> {\n const service = new LinearService(runtime);\n await service.validateConnection();\n logger.info('Linear service started successfully');\n return service;\n }\n \n async stop(): Promise<void> {\n this.activityLog = [];\n logger.info('Linear service stopped');\n }\n \n // Validate the API connection\n private async validateConnection(): Promise<void> {\n try {\n const viewer = await this.client.viewer;\n logger.info(`Linear connected as user: ${viewer.email}`);\n } catch (error) {\n throw new LinearAuthenticationError('Failed to authenticate with Linear API');\n }\n }\n \n // Log activity\n private logActivity(\n action: string,\n resourceType: LinearActivityItem['resource_type'],\n resourceId: string,\n details: Record<string, any>,\n success: boolean,\n error?: string\n ): void {\n const activity: LinearActivityItem = {\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n timestamp: new Date().toISOString(),\n action,\n resource_type: resourceType,\n resource_id: resourceId,\n details,\n success,\n error,\n };\n \n this.activityLog.push(activity);\n \n // Keep only last 1000 activities\n if (this.activityLog.length > 1000) {\n this.activityLog = this.activityLog.slice(-1000);\n }\n }\n \n // Get activity log\n getActivityLog(limit?: number, filter?: Partial<LinearActivityItem>): LinearActivityItem[] {\n let filtered = [...this.activityLog];\n \n if (filter) {\n filtered = filtered.filter(item => {\n return Object.entries(filter).every(([key, value]) => {\n return item[key as keyof LinearActivityItem] === value;\n });\n });\n }\n \n return filtered.slice(-(limit || 100));\n }\n \n // Clear activity log\n clearActivityLog(): void {\n this.activityLog = [];\n logger.info('Linear activity log cleared');\n }\n \n // Team operations\n async getTeams(): Promise<Team[]> {\n try {\n const teams = await this.client.teams();\n const teamList = await teams.nodes;\n \n this.logActivity('list_teams', 'team', 'all', { count: teamList.length }, true);\n return teamList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_teams', 'team', 'all', {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch teams: ${errorMessage}`);\n }\n }\n \n async getTeam(teamId: string): Promise<Team> {\n try {\n const team = await this.client.team(teamId);\n this.logActivity('get_team', 'team', teamId, { name: team.name }, true);\n return team;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_team', 'team', teamId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch team: ${errorMessage}`);\n }\n }\n \n // Issue operations\n async createIssue(input: LinearIssueInput): Promise<Issue> {\n try {\n const issuePayload = await this.client.createIssue({\n title: input.title,\n description: input.description,\n teamId: input.teamId,\n priority: input.priority,\n assigneeId: input.assigneeId,\n labelIds: input.labelIds,\n projectId: input.projectId,\n stateId: input.stateId,\n estimate: input.estimate,\n dueDate: input.dueDate,\n });\n \n const issue = await issuePayload.issue;\n if (!issue) {\n throw new Error('Failed to create issue');\n }\n \n this.logActivity('create_issue', 'issue', issue.id, { \n title: input.title,\n teamId: input.teamId \n }, true);\n \n return issue;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('create_issue', 'issue', 'new', input, false, errorMessage);\n throw new LinearAPIError(`Failed to create issue: ${errorMessage}`);\n }\n }\n \n async getIssue(issueId: string): Promise<Issue> {\n try {\n const issue = await this.client.issue(issueId);\n this.logActivity('get_issue', 'issue', issueId, { \n title: issue.title,\n identifier: issue.identifier \n }, true);\n return issue;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_issue', 'issue', issueId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch issue: ${errorMessage}`);\n }\n }\n \n async updateIssue(issueId: string, updates: Partial<LinearIssueInput>): Promise<Issue> {\n try {\n const updatePayload = await this.client.updateIssue(issueId, {\n title: updates.title,\n description: updates.description,\n priority: updates.priority,\n assigneeId: updates.assigneeId,\n labelIds: updates.labelIds,\n projectId: updates.projectId,\n stateId: updates.stateId,\n estimate: updates.estimate,\n dueDate: updates.dueDate,\n });\n \n const issue = await updatePayload.issue;\n if (!issue) {\n throw new Error('Failed to update issue');\n }\n \n this.logActivity('update_issue', 'issue', issueId, updates, true);\n return issue;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('update_issue', 'issue', issueId, updates, false, errorMessage);\n throw new LinearAPIError(`Failed to update issue: ${errorMessage}`);\n }\n }\n \n async searchIssues(filters: LinearSearchFilters): Promise<Issue[]> {\n try {\n const query = this.client.issues({\n first: filters.limit || 50,\n filter: filters.query ? {\n or: [\n { title: { containsIgnoreCase: filters.query } },\n { description: { containsIgnoreCase: filters.query } },\n ],\n } : undefined,\n });\n \n const issues = await query;\n const issueList = await issues.nodes;\n \n this.logActivity('search_issues', 'issue', 'search', { \n filters,\n count: issueList.length \n }, true);\n \n return issueList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('search_issues', 'issue', 'search', filters, false, errorMessage);\n throw new LinearAPIError(`Failed to search issues: ${errorMessage}`);\n }\n }\n \n // Comment operations\n async createComment(input: LinearCommentInput): Promise<Comment> {\n try {\n const commentPayload = await this.client.createComment({\n body: input.body,\n issueId: input.issueId,\n });\n \n const comment = await commentPayload.comment;\n if (!comment) {\n throw new Error('Failed to create comment');\n }\n \n this.logActivity('create_comment', 'comment', comment.id, { \n issueId: input.issueId,\n bodyLength: input.body.length \n }, true);\n \n return comment;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('create_comment', 'comment', 'new', input, false, errorMessage);\n throw new LinearAPIError(`Failed to create comment: ${errorMessage}`);\n }\n }\n \n // Project operations\n async getProjects(teamId?: string): Promise<Project[]> {\n try {\n // Note: Linear SDK v51 may not support direct team filtering on projects\n // Get all projects and filter manually if needed\n const query = this.client.projects({\n first: 100,\n });\n \n const projects = await query;\n let projectList = await projects.nodes;\n \n // Manual filtering by team if teamId is provided\n if (teamId) {\n const filteredProjects = await Promise.all(\n projectList.map(async (project) => {\n const projectTeams = await project.teams();\n const teamsList = await projectTeams.nodes;\n const hasTeam = teamsList.some((team: any) => team.id === teamId);\n return hasTeam ? project : null;\n })\n );\n projectList = filteredProjects.filter(Boolean) as Project[];\n }\n \n this.logActivity('list_projects', 'project', 'all', { \n count: projectList.length,\n teamId \n }, true);\n \n return projectList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_projects', 'project', 'all', { teamId }, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch projects: ${errorMessage}`);\n }\n }\n \n async getProject(projectId: string): Promise<Project> {\n try {\n const project = await this.client.project(projectId);\n this.logActivity('get_project', 'project', projectId, { \n name: project.name \n }, true);\n return project;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_project', 'project', projectId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch project: ${errorMessage}`);\n }\n }\n \n // User operations\n async getUsers(): Promise<User[]> {\n try {\n const users = await this.client.users();\n const userList = await users.nodes;\n \n this.logActivity('list_users', 'user', 'all', { \n count: userList.length \n }, true);\n \n return userList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_users', 'user', 'all', {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch users: ${errorMessage}`);\n }\n }\n \n async getCurrentUser(): Promise<User> {\n try {\n const user = await this.client.viewer;\n this.logActivity('get_current_user', 'user', user.id, { \n email: user.email,\n name: user.name \n }, true);\n return user;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_current_user', 'user', 'current', {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch current user: ${errorMessage}`);\n }\n }\n \n // Label operations\n async getLabels(teamId?: string): Promise<IssueLabel[]> {\n try {\n const query = this.client.issueLabels({\n first: 100,\n filter: teamId ? {\n team: { id: { eq: teamId } },\n } : undefined,\n });\n \n const labels = await query;\n const labelList = await labels.nodes;\n \n this.logActivity('list_labels', 'label', 'all', { \n count: labelList.length,\n teamId \n }, true);\n \n return labelList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_labels', 'label', 'all', { teamId }, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch labels: ${errorMessage}`);\n }\n }\n \n // Workflow state operations\n async getWorkflowStates(teamId: string): Promise<WorkflowState[]> {\n try {\n const states = await this.client.workflowStates({\n filter: {\n team: { id: { eq: teamId } },\n },\n });\n \n const stateList = await states.nodes;\n \n this.logActivity('list_workflow_states', 'team', teamId, { \n count: stateList.length \n }, true);\n \n return stateList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_workflow_states', 'team', teamId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch workflow states: ${errorMessage}`);\n }\n }\n} ","export interface LinearConfig {\n LINEAR_API_KEY: string;\n LINEAR_WORKSPACE_ID?: string;\n}\n\nexport interface LinearActivityItem {\n id: string;\n timestamp: string;\n action: string;\n resource_type: 'issue' | 'project' | 'comment' | 'label' | 'user' | 'team';\n resource_id: string;\n details: Record<string, any>;\n success: boolean;\n error?: string;\n}\n\nexport interface LinearIssueInput {\n title: string;\n description?: string;\n teamId: string;\n priority?: number; // 0 = No priority, 1 = Urgent, 2 = High, 3 = Normal, 4 = Low\n assigneeId?: string;\n labelIds?: string[];\n projectId?: string;\n stateId?: string;\n estimate?: number;\n dueDate?: Date;\n}\n\nexport interface LinearCommentInput {\n body: string;\n issueId: string;\n}\n\nexport interface LinearSearchFilters {\n state?: string[];\n assignee?: string[];\n label?: string[];\n project?: string;\n team?: string;\n priority?: number[];\n query?: string;\n limit?: number;\n}\n\n// Error classes specific to Linear\nexport class LinearAPIError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: any\n ) {\n super(message);\n this.name = 'LinearAPIError';\n }\n}\n\nexport class LinearAuthenticationError extends LinearAPIError {\n constructor(message: string) {\n super(message, 401);\n this.name = 'LinearAuthenticationError';\n }\n}\n\nexport class LinearRateLimitError extends LinearAPIError {\n constructor(\n message: string,\n public resetTime: number\n ) {\n super(message, 429);\n this.name = 'LinearRateLimitError';\n }\n} ","import {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n State,\n ModelType,\n logger,\n} from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearIssueInput } from '../types';\n\nconst createIssueTemplate = `Given the user's request, extract the information needed to create a Linear issue.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object (no markdown formatting, no code blocks) with the following structure:\n{\n \"title\": \"Brief, clear issue title\",\n \"description\": \"Detailed description of the issue (optional)\",\n \"teamKey\": \"Team key if mentioned (e.g., ENG, PROD)\",\n \"priority\": \"Priority level if mentioned (1=urgent, 2=high, 3=normal, 4=low)\",\n \"labels\": [\"label1\", \"label2\"] (if any labels are mentioned),\n \"assignee\": \"Assignee username or email if mentioned\"\n}\n\nReturn only the JSON object, no other text.`;\n\nexport const createIssueAction: Action = {\n name: 'CREATE_LINEAR_ISSUE',\n description: 'Create a new issue in Linear',\n similes: ['create-linear-issue', 'new-linear-issue', 'add-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Create a new issue: Fix login button not working on mobile devices'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll create that issue for you in Linear.',\n actions: ['CREATE_LINEAR_ISSUE']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Create a bug report for the ENG team: API returns 500 error when updating user profile'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll create a bug report for the engineering team right away.',\n actions: ['CREATE_LINEAR_ISSUE']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n return {\n text: 'Please provide a description for the issue.',\n success: false\n };\n }\n \n // Check if the message already has structured data\n const structuredData = _options?.issueData as Partial<LinearIssueInput> | undefined;\n \n let issueData: Partial<LinearIssueInput>;\n \n if (structuredData) {\n issueData = structuredData;\n } else {\n // Use LLM to extract issue information\n const prompt = createIssueTemplate.replace('{{userMessage}}', content);\n \n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt\n });\n \n if (!response) {\n throw new Error('Failed to extract issue information');\n }\n \n try {\n // Strip markdown code blocks if present\n const cleanedResponse = response.replace(/^```(?:json)?\\n?/,'').replace(/\\n?```$/,'').trim();\n const parsed = JSON.parse(cleanedResponse);\n issueData = {\n title: parsed.title,\n description: parsed.description,\n priority: parsed.priority,\n };\n \n // Handle team assignment\n if (parsed.teamKey) {\n const teams = await linearService.getTeams();\n const team = teams.find(t => \n t.key.toLowerCase() === parsed.teamKey.toLowerCase()\n );\n if (team) {\n issueData.teamId = team.id;\n }\n }\n \n // Handle assignee\n if (parsed.assignee) {\n const users = await linearService.getUsers();\n const user = users.find(u => \n u.email === parsed.assignee || \n u.name.toLowerCase().includes(parsed.assignee.toLowerCase())\n );\n if (user) {\n issueData.assigneeId = user.id;\n }\n }\n \n // If no team was specified, use the first available team as default\n if (!issueData.teamId) {\n const teams = await linearService.getTeams();\n if (teams.length > 0) {\n issueData.teamId = teams[0].id;\n logger.warn(`No team specified, using default team: ${teams[0].name}`);\n }\n }\n } catch (parseError) {\n logger.error('Failed to parse LLM response:', parseError);\n // Fallback to simple title extraction\n issueData = {\n title: content.length > 100 ? content.substring(0, 100) + '...' : content,\n description: content\n };\n \n // Ensure we have a teamId even in fallback case\n const teams = await linearService.getTeams();\n if (teams.length > 0) {\n issueData.teamId = teams[0].id;\n logger.warn(`Using default team for fallback: ${teams[0].name}`);\n }\n }\n }\n \n if (!issueData.title) {\n return {\n text: 'Could not determine issue title. Please provide more details.',\n success: false\n };\n }\n \n // Final check for required teamId\n if (!issueData.teamId) {\n return {\n text: 'No Linear teams found. Please ensure at least one team exists in your Linear workspace.',\n success: false\n };\n }\n \n const issue = await linearService.createIssue(issueData as LinearIssueInput);\n \n return {\n text: `Created issue: ${issue.title} (${issue.identifier})`,\n success: true,\n data: {\n issueId: issue.id,\n identifier: issue.identifier,\n url: issue.url\n }\n };\n } catch (error) {\n logger.error('Failed to create issue:', error);\n return {\n text: `Failed to create issue: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const getIssueAction: Action = {\n name: 'GET_LINEAR_ISSUE',\n description: 'Get details of a specific Linear issue',\n similes: ['get-linear-issue', 'show-linear-issue', 'view-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me issue ENG-123'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll get the details for issue ENG-123.',\n actions: ['GET_LINEAR_ISSUE']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What\\'s the status of BUG-456?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me check the status of BUG-456 for you.',\n actions: ['GET_LINEAR_ISSUE']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n return {\n text: 'Please specify an issue ID.',\n success: false\n };\n }\n \n // Extract issue ID from the message\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (!issueMatch) {\n return {\n text: 'Please provide a valid issue ID (e.g., ENG-123).',\n success: false\n };\n }\n \n const issueId = issueMatch[1];\n const issue = await linearService.getIssue(issueId);\n \n const assignee = await issue.assignee;\n const state = await issue.state;\n const team = await issue.team;\n const labels = await issue.labels();\n const project = await issue.project;\n \n const issueDetails = {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n priority: issue.priority,\n priorityLabel: issue.priorityLabel,\n url: issue.url,\n createdAt: issue.createdAt,\n updatedAt: issue.updatedAt,\n dueDate: issue.dueDate,\n estimate: issue.estimate,\n assignee: assignee ? {\n id: assignee.id,\n name: assignee.name,\n email: assignee.email,\n } : null,\n state: state ? {\n id: state.id,\n name: state.name,\n type: state.type,\n color: state.color,\n } : null,\n team: team ? {\n id: team.id,\n name: team.name,\n key: team.key,\n } : null,\n labels: labels.nodes.map(label => ({\n id: label.id,\n name: label.name,\n color: label.color,\n })),\n project: project ? {\n id: project.id,\n name: project.name,\n } : null,\n };\n \n // Format the response text\n let responseText = `Issue ${issue.identifier}: ${issue.title}\\n`;\n responseText += `Status: ${state?.name || 'Unknown'}\\n`;\n responseText += `Priority: ${issue.priorityLabel}\\n`;\n if (assignee) {\n responseText += `Assignee: ${assignee.name}\\n`;\n }\n if (issue.dueDate) {\n responseText += `Due: ${new Date(issue.dueDate).toLocaleDateString()}\\n`;\n }\n if (issue.description) {\n responseText += `\\nDescription: ${issue.description}\\n`;\n }\n responseText += `\\nView in Linear: ${issue.url}`;\n \n return {\n text: responseText,\n success: true,\n data: issueDetails\n };\n } catch (error) {\n logger.error('Failed to get issue:', error);\n return {\n text: `Failed to get issue: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearIssueInput } from '../types';\n\nexport const updateIssueAction: Action = {\n name: 'UPDATE_LINEAR_ISSUE',\n description: 'Update an existing Linear issue',\n similes: ['update-linear-issue', 'edit-linear-issue', 'modify-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Update issue ENG-123 title to \"Fix login button on all devices\"'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll update the title of issue ENG-123 for you.',\n actions: ['UPDATE_LINEAR_ISSUE']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Change the priority of BUG-456 to high'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll change the priority of BUG-456 to high.',\n actions: ['UPDATE_LINEAR_ISSUE']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n return {\n text: 'Please provide update instructions for the issue.',\n success: false\n };\n }\n \n // Extract issue ID from the message\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (!issueMatch) {\n return {\n text: 'Please specify an issue ID (e.g., ENG-123) to update.',\n success: false\n };\n }\n \n const issueId = issueMatch[1];\n \n // Parse update instructions\n const updates: Partial<LinearIssueInput> = {};\n \n // Title update\n const titleMatch = content.match(/title to [\"'](.+?)[\"']/i);\n if (titleMatch) {\n updates.title = titleMatch[1];\n }\n \n // Priority update\n const priorityMatch = content.match(/priority (?:to |as )?(\\w+)/i);\n if (priorityMatch) {\n const priorityMap: Record<string, number> = {\n 'urgent': 1,\n 'high': 2,\n 'normal': 3,\n 'medium': 3,\n 'low': 4,\n };\n const priority = priorityMap[priorityMatch[1].toLowerCase()];\n if (priority) {\n updates.priority = priority;\n }\n }\n \n // Description update\n const descMatch = content.match(/description to [\"'](.+?)[\"']/i);\n if (descMatch) {\n updates.description = descMatch[1];\n }\n \n // Status update\n const statusMatch = content.match(/status to (\\w+)/i);\n if (statusMatch) {\n // This would need to look up the state ID - simplified for now\n logger.warn('Status updates not yet implemented');\n }\n \n if (Object.keys(updates).length === 0) {\n return {\n text: 'No valid updates found. Please specify what to update (e.g., \"Update issue ENG-123 title to \\'New Title\\'\")',\n success: false\n };\n }\n \n const updatedIssue = await linearService.updateIssue(issueId, updates);\n \n const updateSummary = Object.entries(updates)\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n \n return {\n text: `Updated issue ${updatedIssue.identifier}: ${updateSummary}`,\n success: true,\n data: {\n issueId: updatedIssue.id,\n identifier: updatedIssue.identifier,\n updates,\n url: updatedIssue.url\n }\n };\n } catch (error) {\n logger.error('Failed to update issue:', error);\n return {\n text: `Failed to update issue: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n State,\n ModelType,\n logger,\n} from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearSearchFilters } from '../types';\n\nconst searchTemplate = `Extract search criteria from the user's request for Linear issues.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object (no markdown formatting, no code blocks) with these possible filters:\n{\n \"query\": \"general search text\",\n \"state\": \"filter by state name (e.g., 'In Progress', 'Done', 'Todo')\",\n \"assignee\": \"filter by assignee name or email\",\n \"priority\": \"filter by priority (1=urgent, 2=high, 3=normal, 4=low)\",\n \"team\": \"filter by team name or key\",\n \"label\": \"filter by label name\",\n \"hasAssignee\": true/false - whether issue should have an assignee,\n \"limit\": number of results to return (default 10)\n}\n\nOnly include fields that are mentioned. Return only the JSON object.`;\n\nexport const searchIssuesAction: Action = {\n name: 'SEARCH_LINEAR_ISSUES',\n description: 'Search for issues in Linear with various filters',\n similes: ['search-linear-issues', 'find-linear-issues', 'query-linear-issues'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me all open bugs'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll search for all open bug issues in Linear.',\n actions: ['SEARCH_LINEAR_ISSUES']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Find high priority issues assigned to me'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll search for high priority issues assigned to you.',\n actions: ['SEARCH_LINEAR_ISSUES']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n return {\n text: 'Please provide search criteria for issues.',\n success: false\n };\n }\n \n let filters: LinearSearchFilters = {};\n \n // Check if we have explicit filters in options\n if (_options?.filters) {\n filters = _options.filters as LinearSearchFilters;\n } else {\n // Use LLM to extract search filters\n const prompt = searchTemplate.replace('{{userMessage}}', content);\n \n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt\n });\n \n if (!response) {\n // Fallback to simple keyword search\n filters = { query: content };\n } else {\n try {\n // Strip markdown code blocks if present\n const cleanedResponse = response.replace(/^```(?:json)?\\n?/,'').replace(/\\n?```$/,'').trim();\n const parsed = JSON.parse(cleanedResponse);\n filters = {\n query: parsed.query,\n state: parsed.state ? [parsed.state] : undefined,\n assignee: parsed.assignee ? [parsed.assignee] : undefined,\n priority: parsed.priority ? [parsed.priority] : undefined,\n team: parsed.team,\n label: parsed.label ? [parsed.label] : undefined,\n limit: parsed.limit\n };\n \n // Clean up undefined values\n Object.keys(filters).forEach(key => {\n if (filters[key as keyof LinearSearchFilters] === undefined) {\n delete filters[key as keyof LinearSearchFilters];\n }\n });\n } catch (parseError) {\n logger.error('Failed to parse search filters:', parseError);\n // Fallback to simple search\n filters = { query: content };\n }\n }\n }\n \n filters.limit = (_options?.limit as number) || 10;\n const issues = await linearService.searchIssues(filters);\n \n if (issues.length === 0) {\n return {\n text: 'No issues found matching your search criteria.',\n success: true,\n data: {\n issues: [],\n filters,\n count: 0\n }\n };\n }\n \n const issueList = await Promise.all(issues.map(async (issue, index) => {\n const state = await issue.state;\n return `${index + 1}. ${issue.identifier}: ${issue.title} (${state?.name || 'No state'})`;\n }));\n const issueText = issueList.join('\\n');\n \n return {\n text: `Found ${issues.length} issue${issues.length === 1 ? '' : 's'}:\\n${issueText}`,\n success: true,\n data: {\n issues: issues.map(i => ({\n id: i.id,\n identifier: i.identifier,\n title: i.title,\n description: i.description,\n url: i.url,\n state: i.state,\n priority: i.priority,\n priorityLabel: i.priorityLabel,\n assignee: i.assignee\n })),\n filters,\n count: issues.length\n }\n };\n } catch (error) {\n logger.error('Failed to search issues:', error);\n return {\n text: `Failed to search issues: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, ActionExample, logger } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const createCommentAction: Action = {\n name: 'CREATE_LINEAR_COMMENT',\n description: 'Create a comment on a Linear issue',\n similes: ['create-linear-comment', 'add-linear-comment', 'comment-on-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Comment on ENG-123: This has been fixed in the latest release'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll add that comment to issue ENG-123.',\n actions: ['CREATE_LINEAR_COMMENT']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Add a comment to BUG-456: Need more information from the reporter'\n }\n },\n {\n name: 'Assistant', \n content: {\n text: 'I\\'ll post that comment on BUG-456 right away.',\n actions: ['CREATE_LINEAR_COMMENT']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n return {\n text: 'Please provide a message with the issue ID and comment content.',\n success: false\n };\n }\n \n const issueMatch = content.match(/(?:comment on|add.*comment.*to)\\s+(\\w+-\\d+):?\\s*(.*)/i);\n \n if (!issueMatch) {\n return {\n text: 'Please specify the issue ID and comment content. Example: \"Comment on ENG-123: This looks good\"',\n success: false\n };\n }\n \n const [, issueIdentifier, commentBody] = issueMatch;\n \n // Find the issue first to get its ID\n const issue = await linearService.getIssue(issueIdentifier);\n \n const comment = await linearService.createComment({\n issueId: issue.id,\n body: commentBody.trim()\n });\n \n return {\n text: `Comment added to issue ${issueIdentifier}: \"${commentBody.trim()}\"`,\n success: true,\n data: {\n commentId: comment.id,\n issueId: issue.id\n }\n };\n } catch (error) {\n logger.error('Failed to create comment:', error);\n return {\n text: `Failed to create comment: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const listTeamsAction: Action = {\n name: 'LIST_LINEAR_TEAMS',\n description: 'List all teams in Linear',\n similes: ['list-linear-teams', 'show-linear-teams', 'get-linear-teams'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me all teams'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll list all the teams in Linear for you.',\n actions: ['LIST_LINEAR_TEAMS']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What teams are available?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me show you all the available teams.',\n actions: ['LIST_LINEAR_TEAMS']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const teams = await linearService.getTeams();\n \n if (teams.length === 0) {\n return {\n text: 'No teams found in Linear.',\n success: true,\n data: {\n teams: []\n }\n };\n }\n \n const teamList = teams.map((team, index) => \n `${index + 1}. ${team.name} (${team.key})${team.description ? ` - ${team.description}` : ''}`\n ).join('\\n');\n \n return {\n text: `Found ${teams.length} team${teams.length === 1 ? '' : 's'}:\\n${teamList}`,\n success: true,\n data: {\n teams: teams.map(t => ({\n id: t.id,\n name: t.name,\n key: t.key,\n description: t.description\n })),\n count: teams.length\n }\n };\n } catch (error) {\n logger.error('Failed to list teams:', error);\n return {\n text: `Failed to list teams: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const listProjectsAction: Action = {\n name: 'LIST_LINEAR_PROJECTS',\n description: 'List all projects in Linear',\n similes: ['list-linear-projects', 'show-linear-projects', 'get-linear-projects'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me all projects'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll list all the projects in Linear for you.',\n actions: ['LIST_LINEAR_PROJECTS']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What projects do we have?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me show you all the available projects.',\n actions: ['LIST_LINEAR_PROJECTS']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const projects = await linearService.getProjects();\n \n if (projects.length === 0) {\n return {\n text: 'No projects found in Linear.',\n success: true,\n data: {\n projects: []\n }\n };\n }\n \n // Get teams for each project\n const projectsWithDetails = await Promise.all(\n projects.map(async (project) => {\n const teamsQuery = await project.teams();\n const teams = await teamsQuery.nodes;\n return {\n ...project,\n teamsList: teams\n };\n })\n );\n \n const projectList = projectsWithDetails.map((project, index) => {\n const teamNames = project.teamsList.map((t: any) => t.name).join(', ') || 'No teams';\n return `${index + 1}. ${project.name}${project.description ? ` - ${project.description}` : ''} (Teams: ${teamNames})`;\n }).join('\\n');\n \n return {\n text: `Found ${projects.length} project${projects.length === 1 ? '' : 's'}:\\n${projectList}`,\n success: true,\n data: {\n projects: projectsWithDetails.map(p => ({\n id: p.id,\n name: p.name,\n description: p.description,\n url: p.url,\n teams: p.teamsList.map((t: any) => ({\n id: t.id,\n name: t.name,\n key: t.key\n })),\n state: p.state,\n progress: p.progress,\n startDate: p.startDate,\n targetDate: p.targetDate\n })),\n count: projects.length\n }\n };\n } catch (error) {\n logger.error('Failed to list projects:', error);\n return {\n text: `Failed to list projects: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const getActivityAction: Action = {\n name: 'GET_LINEAR_ACTIVITY',\n description: 'Get recent Linear activity',\n similes: ['get-linear-activity', 'show-linear-activity', 'view-linear-activity'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me recent Linear activity'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll check the recent Linear activity for you.',\n actions: ['GET_LINEAR_ACTIVITY']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What\\'s been happening in Linear?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me show you the recent Linear activity.',\n actions: ['GET_LINEAR_ACTIVITY']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const activity = linearService.getActivityLog();\n \n if (activity.length === 0) {\n return {\n text: 'No recent Linear activity found.',\n success: true,\n data: {\n activity: []\n }\n };\n }\n \n const activityText = activity\n .slice(0, 10) // Show last 10 activities\n .map((item, index) => {\n const description = `${item.action} ${item.resource_type} ${item.resource_id}${item.error ? ` (failed: ${item.error})` : ''}`;\n return `${index + 1}. ${description}`;\n })\n .join('\\n');\n \n return {\n text: `Recent Linear activity:\\n${activityText}`,\n success: true,\n data: {\n activity: activity.slice(0, 10),\n count: activity.length\n }\n };\n } catch (error) {\n logger.error('Failed to get Linear activity:', error);\n return {\n text: `Failed to get Linear activity: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, ActionExample, logger } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const clearActivityAction: Action = {\n name: 'CLEAR_LINEAR_ACTIVITY',\n description: 'Clear the Linear activity log',\n similes: ['clear-linear-activity', 'reset-linear-activity', 'delete-linear-activity'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Clear the Linear activity log'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll clear the Linear activity log for you.',\n actions: ['CLEAR_LINEAR_ACTIVITY']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Reset Linear activity'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll reset the Linear activity log now.',\n actions: ['CLEAR_LINEAR_ACTIVITY']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n await linearService.clearActivityLog();\n \n return {\n text: 'Linear activity log has been cleared.',\n success: true\n };\n } catch (error) {\n logger.error('Failed to clear Linear activity:', error);\n return {\n text: `Failed to clear Linear activity: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false\n };\n }\n }\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const linearIssuesProvider: Provider = {\n name: 'LINEAR_ISSUES',\n description: 'Provides context about recent Linear issues',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n // Get recent issues\n const issues = await linearService.searchIssues({ limit: 10 });\n \n if (issues.length === 0) {\n return {\n text: 'No recent Linear issues found',\n };\n }\n \n // Format issues for context\n const issuesList = await Promise.all(\n issues.map(async (issue: any) => {\n const [assignee, state] = await Promise.all([\n issue.assignee,\n issue.state,\n ]);\n \n return `- ${issue.identifier}: ${issue.title} (${state?.name || 'Unknown'}, ${assignee?.name || 'Unassigned'})`;\n })\n );\n \n const text = `Recent Linear Issues:\\n${issuesList.join('\\n')}`;\n \n return {\n text,\n data: {\n issues: issues.map((issue: any) => ({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n })),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear issues',\n };\n }\n },\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const linearTeamsProvider: Provider = {\n name: 'LINEAR_TEAMS',\n description: 'Provides context about Linear teams',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n const teams = await linearService.getTeams();\n \n if (teams.length === 0) {\n return {\n text: 'No Linear teams found',\n };\n }\n \n const teamsList = teams.map((team: any) => \n `- ${team.name} (${team.key}): ${team.description || 'No description'}`\n );\n \n const text = `Linear Teams:\\n${teamsList.join('\\n')}`;\n \n return {\n text,\n data: {\n teams: teams.map((team: any) => ({\n id: team.id,\n name: team.name,\n key: team.key,\n })),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear teams',\n };\n }\n },\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const linearProjectsProvider: Provider = {\n name: 'LINEAR_PROJECTS',\n description: 'Provides context about active Linear projects',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n const projects = await linearService.getProjects();\n \n if (projects.length === 0) {\n return {\n text: 'No Linear projects found',\n };\n }\n \n // Filter active projects\n const activeProjects = projects.filter((project: any) => \n project.state === 'started' || project.state === 'planned'\n );\n \n const projectsList = activeProjects.slice(0, 10).map((project: any) => \n `- ${project.name}: ${project.state} (${project.startDate || 'No start date'} - ${project.targetDate || 'No target date'})`\n );\n \n const text = `Active Linear Projects:\\n${projectsList.join('\\n')}`;\n \n return {\n text,\n data: {\n projects: activeProjects.slice(0, 10).map((project: any) => ({\n id: project.id,\n name: project.name,\n state: project.state,\n })),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear projects',\n };\n }\n },\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearActivityItem } from '../types';\n\nexport const linearActivityProvider: Provider = {\n name: 'LINEAR_ACTIVITY',\n description: 'Provides context about recent Linear activity',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n const activity = linearService.getActivityLog(10);\n \n if (activity.length === 0) {\n return {\n text: 'No recent Linear activity',\n };\n }\n \n const activityList = activity.map((item: LinearActivityItem) => {\n const status = item.success ? '✓' : '✗';\n const time = new Date(item.timestamp).toLocaleTimeString();\n return `${status} ${time}: ${item.action} ${item.resource_type} ${item.resource_id}`;\n });\n \n const text = `Recent Linear Activity:\\n${activityList.join('\\n')}`;\n \n return {\n text,\n data: {\n activity: activity.slice(0, 10),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear activity',\n };\n }\n },\n}; ","import { Plugin } from '@elizaos/core';\nimport { LinearService } from './services/linear';\n\n// Import all actions\nimport { createIssueAction } from './actions/createIssue';\nimport { getIssueAction } from './actions/getIssue';\nimport { updateIssueAction } from './actions/updateIssue';\nimport { searchIssuesAction } from './actions/searchIssues';\nimport { createCommentAction } from './actions/createComment';\nimport { listTeamsAction } from './actions/listTeams';\nimport { listProjectsAction } from './actions/listProjects';\nimport { getActivityAction } from './actions/getActivity';\nimport { clearActivityAction } from './actions/clearActivity';\n\n// Import all providers\nimport { linearIssuesProvider } from './providers/issues';\nimport { linearTeamsProvider } from './providers/teams';\nimport { linearProjectsProvider } from './providers/projects';\nimport { linearActivityProvider } from './providers/activity';\n\nexport const linearPlugin: Plugin = {\n name: '@elizaos/plugin-linear',\n description: 'Plugin for integrating with Linear issue tracking system',\n services: [LinearService],\n actions: [\n createIssueAction,\n getIssueAction,\n updateIssueAction,\n searchIssuesAction,\n createCommentAction,\n listTeamsAction,\n listProjectsAction,\n getActivityAction,\n clearActivityAction,\n ],\n providers: [\n linearIssuesProvider,\n linearTeamsProvider,\n linearProjectsProvider,\n linearActivityProvider,\n ],\n};\n\n// Re-export types and service for external use\nexport * from './types';\nexport { LinearService } from './services/linear'; "],"mappings":"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","names":["logger","logger","logger","ModelType","logger","logger","logger","logger","logger","logger"]}
|
|
1
|
+
{"version":3,"sources":["../src/services/linear.ts","../src/types/index.ts","../src/actions/createIssue.ts","../src/actions/getIssue.ts","../src/actions/updateIssue.ts","../src/actions/searchIssues.ts","../src/actions/createComment.ts","../src/actions/listTeams.ts","../src/actions/listProjects.ts","../src/actions/getActivity.ts","../src/actions/clearActivity.ts","../src/providers/issues.ts","../src/providers/teams.ts","../src/providers/projects.ts","../src/providers/activity.ts","../src/index.ts"],"sourcesContent":["import { logger, Service, type IAgentRuntime } from '@elizaos/core';\nimport { LinearClient, Issue, Project, Team, User, WorkflowState, IssueLabel, Comment } from '@linear/sdk';\nimport type { \n LinearConfig, \n LinearActivityItem, \n LinearIssueInput, \n LinearCommentInput,\n LinearSearchFilters \n} from '../types';\nimport { LinearAPIError, LinearAuthenticationError } from '../types';\n\nexport class LinearService extends Service {\n static serviceType = 'linear';\n \n capabilityDescription = 'Linear API integration for issue tracking, project management, and team collaboration';\n \n private client: LinearClient;\n private activityLog: LinearActivityItem[] = [];\n private linearConfig: LinearConfig;\n private workspaceId?: string;\n \n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n \n // Get config from runtime settings\n const apiKey = runtime?.getSetting('LINEAR_API_KEY') as string;\n const workspaceId = runtime?.getSetting('LINEAR_WORKSPACE_ID') as string;\n \n if (!apiKey) {\n throw new LinearAuthenticationError('Linear API key is required');\n }\n \n this.linearConfig = {\n LINEAR_API_KEY: apiKey,\n LINEAR_WORKSPACE_ID: workspaceId,\n };\n \n this.workspaceId = workspaceId;\n \n this.config = {\n LINEAR_API_KEY: apiKey,\n LINEAR_WORKSPACE_ID: workspaceId,\n };\n \n this.client = new LinearClient({\n apiKey: this.linearConfig.LINEAR_API_KEY,\n });\n }\n \n static async start(runtime: IAgentRuntime): Promise<LinearService> {\n const service = new LinearService(runtime);\n await service.validateConnection();\n logger.info('Linear service started successfully');\n return service;\n }\n \n async stop(): Promise<void> {\n this.activityLog = [];\n logger.info('Linear service stopped');\n }\n \n // Validate the API connection\n private async validateConnection(): Promise<void> {\n try {\n const viewer = await this.client.viewer;\n logger.info(`Linear connected as user: ${viewer.email}`);\n } catch (error) {\n throw new LinearAuthenticationError('Failed to authenticate with Linear API');\n }\n }\n \n // Log activity\n private logActivity(\n action: string,\n resourceType: LinearActivityItem['resource_type'],\n resourceId: string,\n details: Record<string, any>,\n success: boolean,\n error?: string\n ): void {\n const activity: LinearActivityItem = {\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n timestamp: new Date().toISOString(),\n action,\n resource_type: resourceType,\n resource_id: resourceId,\n details,\n success,\n error,\n };\n \n this.activityLog.push(activity);\n \n // Keep only last 1000 activities\n if (this.activityLog.length > 1000) {\n this.activityLog = this.activityLog.slice(-1000);\n }\n }\n \n // Get activity log\n getActivityLog(limit?: number, filter?: Partial<LinearActivityItem>): LinearActivityItem[] {\n let filtered = [...this.activityLog];\n \n if (filter) {\n filtered = filtered.filter(item => {\n return Object.entries(filter).every(([key, value]) => {\n return item[key as keyof LinearActivityItem] === value;\n });\n });\n }\n \n return filtered.slice(-(limit || 100));\n }\n \n // Clear activity log\n clearActivityLog(): void {\n this.activityLog = [];\n logger.info('Linear activity log cleared');\n }\n \n // Team operations\n async getTeams(): Promise<Team[]> {\n try {\n const teams = await this.client.teams();\n const teamList = await teams.nodes;\n \n this.logActivity('list_teams', 'team', 'all', { count: teamList.length }, true);\n return teamList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_teams', 'team', 'all', {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch teams: ${errorMessage}`);\n }\n }\n \n async getTeam(teamId: string): Promise<Team> {\n try {\n const team = await this.client.team(teamId);\n this.logActivity('get_team', 'team', teamId, { name: team.name }, true);\n return team;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_team', 'team', teamId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch team: ${errorMessage}`);\n }\n }\n \n // Issue operations\n async createIssue(input: LinearIssueInput): Promise<Issue> {\n try {\n const issuePayload = await this.client.createIssue({\n title: input.title,\n description: input.description,\n teamId: input.teamId,\n priority: input.priority,\n assigneeId: input.assigneeId,\n labelIds: input.labelIds,\n projectId: input.projectId,\n stateId: input.stateId,\n estimate: input.estimate,\n dueDate: input.dueDate,\n });\n \n const issue = await issuePayload.issue;\n if (!issue) {\n throw new Error('Failed to create issue');\n }\n \n this.logActivity('create_issue', 'issue', issue.id, { \n title: input.title,\n teamId: input.teamId \n }, true);\n \n return issue;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('create_issue', 'issue', 'new', input, false, errorMessage);\n throw new LinearAPIError(`Failed to create issue: ${errorMessage}`);\n }\n }\n \n async getIssue(issueId: string): Promise<Issue> {\n try {\n const issue = await this.client.issue(issueId);\n this.logActivity('get_issue', 'issue', issueId, { \n title: issue.title,\n identifier: issue.identifier \n }, true);\n return issue;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_issue', 'issue', issueId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch issue: ${errorMessage}`);\n }\n }\n \n async updateIssue(issueId: string, updates: Partial<LinearIssueInput>): Promise<Issue> {\n try {\n const updatePayload = await this.client.updateIssue(issueId, {\n title: updates.title,\n description: updates.description,\n priority: updates.priority,\n assigneeId: updates.assigneeId,\n labelIds: updates.labelIds,\n projectId: updates.projectId,\n stateId: updates.stateId,\n estimate: updates.estimate,\n dueDate: updates.dueDate,\n });\n \n const issue = await updatePayload.issue;\n if (!issue) {\n throw new Error('Failed to update issue');\n }\n \n this.logActivity('update_issue', 'issue', issueId, updates, true);\n return issue;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('update_issue', 'issue', issueId, updates, false, errorMessage);\n throw new LinearAPIError(`Failed to update issue: ${errorMessage}`);\n }\n }\n \n async searchIssues(filters: LinearSearchFilters): Promise<Issue[]> {\n try {\n const query = this.client.issues({\n first: filters.limit || 50,\n filter: filters.query ? {\n or: [\n { title: { containsIgnoreCase: filters.query } },\n { description: { containsIgnoreCase: filters.query } },\n ],\n } : undefined,\n });\n \n const issues = await query;\n const issueList = await issues.nodes;\n \n this.logActivity('search_issues', 'issue', 'search', { \n filters,\n count: issueList.length \n }, true);\n \n return issueList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('search_issues', 'issue', 'search', filters, false, errorMessage);\n throw new LinearAPIError(`Failed to search issues: ${errorMessage}`);\n }\n }\n \n // Comment operations\n async createComment(input: LinearCommentInput): Promise<Comment> {\n try {\n const commentPayload = await this.client.createComment({\n body: input.body,\n issueId: input.issueId,\n });\n \n const comment = await commentPayload.comment;\n if (!comment) {\n throw new Error('Failed to create comment');\n }\n \n this.logActivity('create_comment', 'comment', comment.id, { \n issueId: input.issueId,\n bodyLength: input.body.length \n }, true);\n \n return comment;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('create_comment', 'comment', 'new', input, false, errorMessage);\n throw new LinearAPIError(`Failed to create comment: ${errorMessage}`);\n }\n }\n \n // Project operations\n async getProjects(teamId?: string): Promise<Project[]> {\n try {\n // Note: Linear SDK v51 may not support direct team filtering on projects\n // Get all projects and filter manually if needed\n const query = this.client.projects({\n first: 100,\n });\n \n const projects = await query;\n let projectList = await projects.nodes;\n \n // Manual filtering by team if teamId is provided\n if (teamId) {\n const filteredProjects = await Promise.all(\n projectList.map(async (project) => {\n const projectTeams = await project.teams();\n const teamsList = await projectTeams.nodes;\n const hasTeam = teamsList.some((team: any) => team.id === teamId);\n return hasTeam ? project : null;\n })\n );\n projectList = filteredProjects.filter(Boolean) as Project[];\n }\n \n this.logActivity('list_projects', 'project', 'all', { \n count: projectList.length,\n teamId \n }, true);\n \n return projectList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_projects', 'project', 'all', { teamId }, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch projects: ${errorMessage}`);\n }\n }\n \n async getProject(projectId: string): Promise<Project> {\n try {\n const project = await this.client.project(projectId);\n this.logActivity('get_project', 'project', projectId, { \n name: project.name \n }, true);\n return project;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_project', 'project', projectId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch project: ${errorMessage}`);\n }\n }\n \n // User operations\n async getUsers(): Promise<User[]> {\n try {\n const users = await this.client.users();\n const userList = await users.nodes;\n \n this.logActivity('list_users', 'user', 'all', { \n count: userList.length \n }, true);\n \n return userList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_users', 'user', 'all', {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch users: ${errorMessage}`);\n }\n }\n \n async getCurrentUser(): Promise<User> {\n try {\n const user = await this.client.viewer;\n this.logActivity('get_current_user', 'user', user.id, { \n email: user.email,\n name: user.name \n }, true);\n return user;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('get_current_user', 'user', 'current', {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch current user: ${errorMessage}`);\n }\n }\n \n // Label operations\n async getLabels(teamId?: string): Promise<IssueLabel[]> {\n try {\n const query = this.client.issueLabels({\n first: 100,\n filter: teamId ? {\n team: { id: { eq: teamId } },\n } : undefined,\n });\n \n const labels = await query;\n const labelList = await labels.nodes;\n \n this.logActivity('list_labels', 'label', 'all', { \n count: labelList.length,\n teamId \n }, true);\n \n return labelList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_labels', 'label', 'all', { teamId }, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch labels: ${errorMessage}`);\n }\n }\n \n // Workflow state operations\n async getWorkflowStates(teamId: string): Promise<WorkflowState[]> {\n try {\n const states = await this.client.workflowStates({\n filter: {\n team: { id: { eq: teamId } },\n },\n });\n \n const stateList = await states.nodes;\n \n this.logActivity('list_workflow_states', 'team', teamId, { \n count: stateList.length \n }, true);\n \n return stateList;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.logActivity('list_workflow_states', 'team', teamId, {}, false, errorMessage);\n throw new LinearAPIError(`Failed to fetch workflow states: ${errorMessage}`);\n }\n }\n} ","export interface LinearConfig {\n LINEAR_API_KEY: string;\n LINEAR_WORKSPACE_ID?: string;\n}\n\nexport interface LinearActivityItem {\n id: string;\n timestamp: string;\n action: string;\n resource_type: 'issue' | 'project' | 'comment' | 'label' | 'user' | 'team';\n resource_id: string;\n details: Record<string, any>;\n success: boolean;\n error?: string;\n}\n\nexport interface LinearIssueInput {\n title: string;\n description?: string;\n teamId: string;\n priority?: number; // 0 = No priority, 1 = Urgent, 2 = High, 3 = Normal, 4 = Low\n assigneeId?: string;\n labelIds?: string[];\n projectId?: string;\n stateId?: string;\n estimate?: number;\n dueDate?: Date;\n}\n\nexport interface LinearCommentInput {\n body: string;\n issueId: string;\n}\n\nexport interface LinearSearchFilters {\n state?: string[];\n assignee?: string[];\n label?: string[];\n project?: string;\n team?: string;\n priority?: number[];\n query?: string;\n limit?: number;\n}\n\n// Error classes specific to Linear\nexport class LinearAPIError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: any\n ) {\n super(message);\n this.name = 'LinearAPIError';\n }\n}\n\nexport class LinearAuthenticationError extends LinearAPIError {\n constructor(message: string) {\n super(message, 401);\n this.name = 'LinearAuthenticationError';\n }\n}\n\nexport class LinearRateLimitError extends LinearAPIError {\n constructor(\n message: string,\n public resetTime: number\n ) {\n super(message, 429);\n this.name = 'LinearRateLimitError';\n }\n} ","import {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n State,\n ModelType,\n logger,\n HandlerCallback,\n} from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearIssueInput } from '../types';\n\nconst createIssueTemplate = `Given the user's request, extract the information needed to create a Linear issue.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object (no markdown formatting, no code blocks) with the following structure:\n{\n \"title\": \"Brief, clear issue title\",\n \"description\": \"Detailed description of the issue (optional, omit or use null if not provided)\",\n \"teamKey\": \"Team key if mentioned (e.g., ENG, PROD) - omit or use null if not mentioned\",\n \"priority\": \"Priority level if mentioned (1=urgent, 2=high, 3=normal, 4=low) - omit or use null if not mentioned\",\n \"labels\": [\"label1\", \"label2\"] (if any labels are mentioned, empty array if none),\n \"assignee\": \"Assignee username or email if mentioned - omit or use null if not mentioned\"\n}\n\nReturn only the JSON object, no other text.`;\n\nexport const createIssueAction: Action = {\n name: 'CREATE_LINEAR_ISSUE',\n description: 'Create a new issue in Linear',\n similes: ['create-linear-issue', 'new-linear-issue', 'add-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Create a new issue: Fix login button not working on mobile devices'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll create that issue for you in Linear.',\n actions: ['CREATE_LINEAR_ISSUE']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Create a bug report for the ENG team: API returns 500 error when updating user profile'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll create a bug report for the engineering team right away.',\n actions: ['CREATE_LINEAR_ISSUE']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n const errorMessage = 'Please provide a description for the issue.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n // Check if the message already has structured data\n const structuredData = _options?.issueData as Partial<LinearIssueInput> | undefined;\n \n let issueData: Partial<LinearIssueInput>;\n \n if (structuredData) {\n issueData = structuredData;\n } else {\n // Use LLM to extract issue information\n const prompt = createIssueTemplate.replace('{{userMessage}}', content);\n \n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt\n });\n \n if (!response) {\n throw new Error('Failed to extract issue information');\n }\n \n try {\n // Strip markdown code blocks if present\n const cleanedResponse = response.replace(/^```(?:json)?\\n?/,'').replace(/\\n?```$/,'').trim();\n const parsed = JSON.parse(cleanedResponse);\n \n // Clean up parsed data - convert empty strings to undefined for fields that need it\n issueData = {\n title: parsed.title || undefined,\n description: parsed.description || undefined,\n priority: parsed.priority ? Number(parsed.priority) : undefined,\n };\n \n // Handle team assignment\n if (parsed.teamKey) {\n const teams = await linearService.getTeams();\n const team = teams.find(t => \n t.key.toLowerCase() === parsed.teamKey.toLowerCase()\n );\n if (team) {\n issueData.teamId = team.id;\n }\n }\n \n // Handle assignee\n if (parsed.assignee && parsed.assignee !== '') {\n // Clean up assignee - remove @ symbol if present\n const cleanAssignee = parsed.assignee.replace(/^@/, '');\n \n const users = await linearService.getUsers();\n const user = users.find(u => \n u.email === cleanAssignee || \n u.name.toLowerCase().includes(cleanAssignee.toLowerCase())\n );\n if (user) {\n issueData.assigneeId = user.id;\n }\n }\n \n // Handle labels\n if (parsed.labels && Array.isArray(parsed.labels) && parsed.labels.length > 0) {\n const labels = await linearService.getLabels(issueData.teamId);\n const labelIds: string[] = [];\n \n for (const labelName of parsed.labels) {\n if (labelName && labelName !== '') {\n const label = labels.find(l => \n l.name.toLowerCase() === labelName.toLowerCase()\n );\n if (label) {\n labelIds.push(label.id);\n }\n }\n }\n \n if (labelIds.length > 0) {\n issueData.labelIds = labelIds;\n }\n }\n \n // If no team was specified, use the first available team as default\n if (!issueData.teamId) {\n const teams = await linearService.getTeams();\n if (teams.length > 0) {\n issueData.teamId = teams[0].id;\n logger.warn(`No team specified, using default team: ${teams[0].name}`);\n }\n }\n } catch (parseError) {\n logger.error('Failed to parse LLM response:', parseError);\n // Fallback to simple title extraction\n issueData = {\n title: content.length > 100 ? content.substring(0, 100) + '...' : content,\n description: content\n };\n \n // Ensure we have a teamId even in fallback case\n const teams = await linearService.getTeams();\n if (teams.length > 0) {\n issueData.teamId = teams[0].id;\n logger.warn(`Using default team for fallback: ${teams[0].name}`);\n }\n }\n }\n \n if (!issueData.title) {\n const errorMessage = 'Could not determine issue title. Please provide more details.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n // Final check for required teamId\n if (!issueData.teamId) {\n const errorMessage = 'No Linear teams found. Please ensure at least one team exists in your Linear workspace.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n const issue = await linearService.createIssue(issueData as LinearIssueInput);\n \n // Send success message to channel\n const successMessage = `✅ Created Linear issue: ${issue.title} (${issue.identifier})\\n\\nView it at: ${issue.url}`;\n await callback?.({\n text: successMessage,\n source: message.content.source\n });\n \n return {\n text: `Created issue: ${issue.title} (${issue.identifier})`,\n success: true,\n data: {\n issueId: issue.id,\n identifier: issue.identifier,\n url: issue.url\n }\n };\n } catch (error) {\n logger.error('Failed to create issue:', error);\n const errorMessage = `❌ Failed to create issue: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger, HandlerCallback } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const getIssueAction: Action = {\n name: 'GET_LINEAR_ISSUE',\n description: 'Get details of a specific Linear issue',\n similes: ['get-linear-issue', 'show-linear-issue', 'view-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me issue ENG-123'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll get the details for issue ENG-123.',\n actions: ['GET_LINEAR_ISSUE']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What\\'s the status of BUG-456?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me check the status of BUG-456 for you.',\n actions: ['GET_LINEAR_ISSUE']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n const errorMessage = 'Please specify an issue ID.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n // Extract issue ID from the message\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (!issueMatch) {\n const errorMessage = 'Please provide a valid issue ID (e.g., ENG-123).';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n const issueId = issueMatch[1];\n const issue = await linearService.getIssue(issueId);\n \n const assignee = await issue.assignee;\n const state = await issue.state;\n const team = await issue.team;\n const labels = await issue.labels();\n const project = await issue.project;\n \n const issueDetails = {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n description: issue.description,\n priority: issue.priority,\n priorityLabel: issue.priorityLabel,\n url: issue.url,\n createdAt: issue.createdAt,\n updatedAt: issue.updatedAt,\n dueDate: issue.dueDate,\n estimate: issue.estimate,\n assignee: assignee ? {\n id: assignee.id,\n name: assignee.name,\n email: assignee.email,\n } : null,\n state: state ? {\n id: state.id,\n name: state.name,\n type: state.type,\n color: state.color,\n } : null,\n team: team ? {\n id: team.id,\n name: team.name,\n key: team.key,\n } : null,\n labels: labels.nodes.map(label => ({\n id: label.id,\n name: label.name,\n color: label.color,\n })),\n project: project ? {\n id: project.id,\n name: project.name,\n } : null,\n };\n \n // Format the response text\n let responseText = `📋 Issue ${issue.identifier}: ${issue.title}\\n`;\n responseText += `Status: ${state?.name || 'Unknown'}\\n`;\n responseText += `Priority: ${issue.priorityLabel}\\n`;\n if (assignee) {\n responseText += `Assignee: ${assignee.name}\\n`;\n }\n if (issue.dueDate) {\n responseText += `Due: ${new Date(issue.dueDate).toLocaleDateString()}\\n`;\n }\n if (issue.description) {\n responseText += `\\nDescription: ${issue.description}\\n`;\n }\n responseText += `\\nView in Linear: ${issue.url}`;\n \n // Send the formatted issue details to the channel\n await callback?.({\n text: responseText,\n source: message.content.source\n });\n \n return {\n text: responseText,\n success: true,\n data: issueDetails\n };\n } catch (error) {\n logger.error('Failed to get issue:', error);\n const errorMessage = `❌ Failed to get issue: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger, HandlerCallback } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearIssueInput } from '../types';\n\nexport const updateIssueAction: Action = {\n name: 'UPDATE_LINEAR_ISSUE',\n description: 'Update an existing Linear issue',\n similes: ['update-linear-issue', 'edit-linear-issue', 'modify-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Update issue ENG-123 title to \"Fix login button on all devices\"'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll update the title of issue ENG-123 for you.',\n actions: ['UPDATE_LINEAR_ISSUE']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Change the priority of BUG-456 to high'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll change the priority of BUG-456 to high.',\n actions: ['UPDATE_LINEAR_ISSUE']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n const errorMessage = 'Please provide update instructions for the issue.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n // Extract issue ID from the message\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (!issueMatch) {\n const errorMessage = 'Please specify an issue ID (e.g., ENG-123) to update.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n const issueId = issueMatch[1];\n \n // Parse update instructions\n const updates: Partial<LinearIssueInput> = {};\n \n // Title update\n const titleMatch = content.match(/title to [\"'](.+?)[\"']/i);\n if (titleMatch) {\n updates.title = titleMatch[1];\n }\n \n // Priority update\n const priorityMatch = content.match(/priority (?:to |as )?(\\w+)/i);\n if (priorityMatch) {\n const priorityMap: Record<string, number> = {\n 'urgent': 1,\n 'high': 2,\n 'normal': 3,\n 'medium': 3,\n 'low': 4,\n };\n const priority = priorityMap[priorityMatch[1].toLowerCase()];\n if (priority) {\n updates.priority = priority;\n }\n }\n \n // Description update\n const descMatch = content.match(/description to [\"'](.+?)[\"']/i);\n if (descMatch) {\n updates.description = descMatch[1];\n }\n \n // Status update\n const statusMatch = content.match(/status to (\\w+)/i);\n if (statusMatch) {\n // This would need to look up the state ID - simplified for now\n logger.warn('Status updates not yet implemented');\n }\n \n if (Object.keys(updates).length === 0) {\n const errorMessage = 'No valid updates found. Please specify what to update (e.g., \"Update issue ENG-123 title to \\'New Title\\'\")';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n const updatedIssue = await linearService.updateIssue(issueId, updates);\n \n const updateSummary = Object.entries(updates)\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n \n const successMessage = `✅ Updated issue ${updatedIssue.identifier}: ${updateSummary}\\n\\nView it at: ${updatedIssue.url}`;\n await callback?.({\n text: successMessage,\n source: message.content.source\n });\n \n return {\n text: `Updated issue ${updatedIssue.identifier}: ${updateSummary}`,\n success: true,\n data: {\n issueId: updatedIssue.id,\n identifier: updatedIssue.identifier,\n updates,\n url: updatedIssue.url\n }\n };\n } catch (error) {\n logger.error('Failed to update issue:', error);\n const errorMessage = `❌ Failed to update issue: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import {\n Action,\n ActionResult,\n IAgentRuntime,\n Memory,\n State,\n ModelType,\n logger,\n HandlerCallback,\n} from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearSearchFilters } from '../types';\n\nconst searchTemplate = `Extract search criteria from the user's request for Linear issues.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object (no markdown formatting, no code blocks) with these possible filters:\n{\n \"query\": \"general search text\",\n \"state\": \"filter by state name (e.g., 'In Progress', 'Done', 'Todo')\",\n \"assignee\": \"filter by assignee name or email\",\n \"priority\": \"filter by priority (1=urgent, 2=high, 3=normal, 4=low)\",\n \"team\": \"filter by team name or key\",\n \"label\": \"filter by label name\",\n \"hasAssignee\": true/false - whether issue should have an assignee,\n \"limit\": number of results to return (default 10)\n}\n\nOnly include fields that are mentioned. Return only the JSON object.`;\n\nexport const searchIssuesAction: Action = {\n name: 'SEARCH_LINEAR_ISSUES',\n description: 'Search for issues in Linear with various filters',\n similes: ['search-linear-issues', 'find-linear-issues', 'query-linear-issues'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me all open bugs'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll search for all open bug issues in Linear.',\n actions: ['SEARCH_LINEAR_ISSUES']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Find high priority issues assigned to me'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll search for high priority issues assigned to you.',\n actions: ['SEARCH_LINEAR_ISSUES']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n const errorMessage = 'Please provide search criteria for issues.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n let filters: LinearSearchFilters = {};\n \n // Check if we have explicit filters in options\n if (_options?.filters) {\n filters = _options.filters as LinearSearchFilters;\n } else {\n // Use LLM to extract search filters\n const prompt = searchTemplate.replace('{{userMessage}}', content);\n \n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt\n });\n \n if (!response) {\n // Fallback to simple keyword search\n filters = { query: content };\n } else {\n try {\n // Strip markdown code blocks if present\n const cleanedResponse = response.replace(/^```(?:json)?\\n?/,'').replace(/\\n?```$/,'').trim();\n const parsed = JSON.parse(cleanedResponse);\n filters = {\n query: parsed.query,\n state: parsed.state ? [parsed.state] : undefined,\n assignee: parsed.assignee ? [parsed.assignee] : undefined,\n priority: parsed.priority ? [parsed.priority] : undefined,\n team: parsed.team,\n label: parsed.label ? [parsed.label] : undefined,\n limit: parsed.limit\n };\n \n // Clean up undefined values\n Object.keys(filters).forEach(key => {\n if (filters[key as keyof LinearSearchFilters] === undefined) {\n delete filters[key as keyof LinearSearchFilters];\n }\n });\n } catch (parseError) {\n logger.error('Failed to parse search filters:', parseError);\n // Fallback to simple search\n filters = { query: content };\n }\n }\n }\n \n filters.limit = (_options?.limit as number) || 10;\n const issues = await linearService.searchIssues(filters);\n \n if (issues.length === 0) {\n const noResultsMessage = 'No issues found matching your search criteria.';\n await callback?.({\n text: noResultsMessage,\n source: message.content.source\n });\n return {\n text: noResultsMessage,\n success: true,\n data: {\n issues: [],\n filters,\n count: 0\n }\n };\n }\n \n const issueList = await Promise.all(issues.map(async (issue, index) => {\n const state = await issue.state;\n return `${index + 1}. ${issue.identifier}: ${issue.title} (${state?.name || 'No state'})`;\n }));\n const issueText = issueList.join('\\n');\n \n const resultMessage = `📋 Found ${issues.length} issue${issues.length === 1 ? '' : 's'}:\\n${issueText}`;\n await callback?.({\n text: resultMessage,\n source: message.content.source\n });\n \n return {\n text: `Found ${issues.length} issue${issues.length === 1 ? '' : 's'}:\\n${issueText}`,\n success: true,\n data: {\n issues: issues.map(i => ({\n id: i.id,\n identifier: i.identifier,\n title: i.title,\n description: i.description,\n url: i.url,\n state: i.state,\n priority: i.priority,\n priorityLabel: i.priorityLabel,\n assignee: i.assignee\n })),\n filters,\n count: issues.length\n }\n };\n } catch (error) {\n logger.error('Failed to search issues:', error);\n const errorMessage = `❌ Failed to search issues: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, ActionExample, logger, HandlerCallback } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const createCommentAction: Action = {\n name: 'CREATE_LINEAR_COMMENT',\n description: 'Create a comment on a Linear issue',\n similes: ['create-linear-comment', 'add-linear-comment', 'comment-on-linear-issue'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Comment on ENG-123: This has been fixed in the latest release'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll add that comment to issue ENG-123.',\n actions: ['CREATE_LINEAR_COMMENT']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Add a comment to BUG-456: Need more information from the reporter'\n }\n },\n {\n name: 'Assistant', \n content: {\n text: 'I\\'ll post that comment on BUG-456 right away.',\n actions: ['CREATE_LINEAR_COMMENT']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const content = message.content.text;\n if (!content) {\n const errorMessage = 'Please provide a message with the issue ID and comment content.';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n const issueMatch = content.match(/(?:comment on|add.*comment.*to)\\s+(\\w+-\\d+):?\\s*(.*)/i);\n \n if (!issueMatch) {\n const errorMessage = 'Please specify the issue ID and comment content. Example: \"Comment on ENG-123: This looks good\"';\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n \n const [, issueIdentifier, commentBody] = issueMatch;\n \n // Find the issue first to get its ID\n const issue = await linearService.getIssue(issueIdentifier);\n \n const comment = await linearService.createComment({\n issueId: issue.id,\n body: commentBody.trim()\n });\n \n const successMessage = `✅ Comment added to issue ${issueIdentifier}: \"${commentBody.trim()}\"`;\n await callback?.({\n text: successMessage,\n source: message.content.source\n });\n \n return {\n text: `Comment added to issue ${issueIdentifier}: \"${commentBody.trim()}\"`,\n success: true,\n data: {\n commentId: comment.id,\n issueId: issue.id\n }\n };\n } catch (error) {\n logger.error('Failed to create comment:', error);\n const errorMessage = `❌ Failed to create comment: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger, HandlerCallback } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const listTeamsAction: Action = {\n name: 'LIST_LINEAR_TEAMS',\n description: 'List all teams in Linear',\n similes: ['list-linear-teams', 'show-linear-teams', 'get-linear-teams'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me all teams'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll list all the teams in Linear for you.',\n actions: ['LIST_LINEAR_TEAMS']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What teams are available?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me show you all the available teams.',\n actions: ['LIST_LINEAR_TEAMS']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const teams = await linearService.getTeams();\n \n if (teams.length === 0) {\n const noTeamsMessage = 'No teams found in Linear.';\n await callback?.({\n text: noTeamsMessage,\n source: message.content.source\n });\n return {\n text: noTeamsMessage,\n success: true,\n data: {\n teams: []\n }\n };\n }\n \n const teamList = teams.map((team, index) => \n `${index + 1}. ${team.name} (${team.key})${team.description ? ` - ${team.description}` : ''}`\n ).join('\\n');\n \n const resultMessage = `👥 Found ${teams.length} team${teams.length === 1 ? '' : 's'}:\\n${teamList}`;\n await callback?.({\n text: resultMessage,\n source: message.content.source\n });\n \n return {\n text: `Found ${teams.length} team${teams.length === 1 ? '' : 's'}:\\n${teamList}`,\n success: true,\n data: {\n teams: teams.map(t => ({\n id: t.id,\n name: t.name,\n key: t.key,\n description: t.description\n })),\n count: teams.length\n }\n };\n } catch (error) {\n logger.error('Failed to list teams:', error);\n const errorMessage = `❌ Failed to list teams: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger, HandlerCallback } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const listProjectsAction: Action = {\n name: 'LIST_LINEAR_PROJECTS',\n description: 'List all projects in Linear',\n similes: ['list-linear-projects', 'show-linear-projects', 'get-linear-projects'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me all projects'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll list all the projects in Linear for you.',\n actions: ['LIST_LINEAR_PROJECTS']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What projects do we have?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me show you all the available projects.',\n actions: ['LIST_LINEAR_PROJECTS']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const projects = await linearService.getProjects();\n \n if (projects.length === 0) {\n const noProjectsMessage = 'No projects found in Linear.';\n await callback?.({\n text: noProjectsMessage,\n source: message.content.source\n });\n return {\n text: noProjectsMessage,\n success: true,\n data: {\n projects: []\n }\n };\n }\n \n // Get teams for each project\n const projectsWithDetails = await Promise.all(\n projects.map(async (project) => {\n const teamsQuery = await project.teams();\n const teams = await teamsQuery.nodes;\n return {\n ...project,\n teamsList: teams\n };\n })\n );\n \n const projectList = projectsWithDetails.map((project, index) => {\n const teamNames = project.teamsList.map((t: any) => t.name).join(', ') || 'No teams';\n return `${index + 1}. ${project.name}${project.description ? ` - ${project.description}` : ''} (Teams: ${teamNames})`;\n }).join('\\n');\n \n const resultMessage = `📁 Found ${projects.length} project${projects.length === 1 ? '' : 's'}:\\n${projectList}`;\n await callback?.({\n text: resultMessage,\n source: message.content.source\n });\n \n return {\n text: `Found ${projects.length} project${projects.length === 1 ? '' : 's'}:\\n${projectList}`,\n success: true,\n data: {\n projects: projectsWithDetails.map(p => ({\n id: p.id,\n name: p.name,\n description: p.description,\n url: p.url,\n teams: p.teamsList.map((t: any) => ({\n id: t.id,\n name: t.name,\n key: t.key\n })),\n state: p.state,\n progress: p.progress,\n startDate: p.startDate,\n targetDate: p.targetDate\n })),\n count: projects.length\n }\n };\n } catch (error) {\n logger.error('Failed to list projects:', error);\n const errorMessage = `❌ Failed to list projects: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, logger, HandlerCallback } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const getActivityAction: Action = {\n name: 'GET_LINEAR_ACTIVITY',\n description: 'Get recent Linear activity',\n similes: ['get-linear-activity', 'show-linear-activity', 'view-linear-activity'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Show me recent Linear activity'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll check the recent Linear activity for you.',\n actions: ['GET_LINEAR_ACTIVITY']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'What\\'s been happening in Linear?'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'Let me show you the recent Linear activity.',\n actions: ['GET_LINEAR_ACTIVITY']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n const activity = linearService.getActivityLog();\n \n if (activity.length === 0) {\n const noActivityMessage = 'No recent Linear activity found.';\n await callback?.({\n text: noActivityMessage,\n source: message.content.source\n });\n return {\n text: noActivityMessage,\n success: true,\n data: {\n activity: []\n }\n };\n }\n \n const activityText = activity\n .slice(0, 10) // Show last 10 activities\n .map((item, index) => {\n const description = `${item.action} ${item.resource_type} ${item.resource_id}${item.error ? ` (failed: ${item.error})` : ''}`;\n return `${index + 1}. ${description}`;\n })\n .join('\\n');\n \n const resultMessage = `📊 Recent Linear activity:\\n${activityText}`;\n await callback?.({\n text: resultMessage,\n source: message.content.source\n });\n \n return {\n text: `Recent Linear activity:\\n${activityText}`,\n success: true,\n data: {\n activity: activity.slice(0, 10),\n count: activity.length\n }\n };\n } catch (error) {\n logger.error('Failed to get Linear activity:', error);\n const errorMessage = `❌ Failed to get Linear activity: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import { Action, ActionResult, IAgentRuntime, Memory, State, ActionExample, logger, HandlerCallback } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const clearActivityAction: Action = {\n name: 'CLEAR_LINEAR_ACTIVITY',\n description: 'Clear the Linear activity log',\n similes: ['clear-linear-activity', 'reset-linear-activity', 'delete-linear-activity'],\n \n examples: [[\n {\n name: 'User',\n content: {\n text: 'Clear the Linear activity log'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll clear the Linear activity log for you.',\n actions: ['CLEAR_LINEAR_ACTIVITY']\n }\n }\n ], [\n {\n name: 'User',\n content: {\n text: 'Reset Linear activity'\n }\n },\n {\n name: 'Assistant',\n content: {\n text: 'I\\'ll reset the Linear activity log now.',\n actions: ['CLEAR_LINEAR_ACTIVITY']\n }\n }\n ]],\n \n async validate(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<boolean> {\n try {\n const apiKey = runtime.getSetting('LINEAR_API_KEY');\n return !!apiKey;\n } catch {\n return false;\n }\n },\n \n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n throw new Error('Linear service not available');\n }\n \n await linearService.clearActivityLog();\n \n const successMessage = '✅ Linear activity log has been cleared.';\n await callback?.({\n text: successMessage,\n source: message.content.source\n });\n \n return {\n text: successMessage,\n success: true\n };\n } catch (error) {\n logger.error('Failed to clear Linear activity:', error);\n const errorMessage = `❌ Failed to clear Linear activity: ${error instanceof Error ? error.message : 'Unknown error'}`;\n await callback?.({\n text: errorMessage,\n source: message.content.source\n });\n return {\n text: errorMessage,\n success: false\n };\n }\n }\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const linearIssuesProvider: Provider = {\n name: 'LINEAR_ISSUES',\n description: 'Provides context about recent Linear issues',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n // Get recent issues\n const issues = await linearService.searchIssues({ limit: 10 });\n \n if (issues.length === 0) {\n return {\n text: 'No recent Linear issues found',\n };\n }\n \n // Format issues for context\n const issuesList = await Promise.all(\n issues.map(async (issue: any) => {\n const [assignee, state] = await Promise.all([\n issue.assignee,\n issue.state,\n ]);\n \n return `- ${issue.identifier}: ${issue.title} (${state?.name || 'Unknown'}, ${assignee?.name || 'Unassigned'})`;\n })\n );\n \n const text = `Recent Linear Issues:\\n${issuesList.join('\\n')}`;\n \n return {\n text,\n data: {\n issues: issues.map((issue: any) => ({\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n })),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear issues',\n };\n }\n },\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const linearTeamsProvider: Provider = {\n name: 'LINEAR_TEAMS',\n description: 'Provides context about Linear teams',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n const teams = await linearService.getTeams();\n \n if (teams.length === 0) {\n return {\n text: 'No Linear teams found',\n };\n }\n \n const teamsList = teams.map((team: any) => \n `- ${team.name} (${team.key}): ${team.description || 'No description'}`\n );\n \n const text = `Linear Teams:\\n${teamsList.join('\\n')}`;\n \n return {\n text,\n data: {\n teams: teams.map((team: any) => ({\n id: team.id,\n name: team.name,\n key: team.key,\n })),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear teams',\n };\n }\n },\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\n\nexport const linearProjectsProvider: Provider = {\n name: 'LINEAR_PROJECTS',\n description: 'Provides context about active Linear projects',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n const projects = await linearService.getProjects();\n \n if (projects.length === 0) {\n return {\n text: 'No Linear projects found',\n };\n }\n \n // Filter active projects\n const activeProjects = projects.filter((project: any) => \n project.state === 'started' || project.state === 'planned'\n );\n \n const projectsList = activeProjects.slice(0, 10).map((project: any) => \n `- ${project.name}: ${project.state} (${project.startDate || 'No start date'} - ${project.targetDate || 'No target date'})`\n );\n \n const text = `Active Linear Projects:\\n${projectsList.join('\\n')}`;\n \n return {\n text,\n data: {\n projects: activeProjects.slice(0, 10).map((project: any) => ({\n id: project.id,\n name: project.name,\n state: project.state,\n })),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear projects',\n };\n }\n },\n}; ","import type { IAgentRuntime, Memory, Provider, State } from '@elizaos/core';\nimport { LinearService } from '../services/linear';\nimport type { LinearActivityItem } from '../types';\n\nexport const linearActivityProvider: Provider = {\n name: 'LINEAR_ACTIVITY',\n description: 'Provides context about recent Linear activity',\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State) => {\n try {\n const linearService = runtime.getService<LinearService>('linear');\n if (!linearService) {\n return {\n text: 'Linear service is not available',\n };\n }\n \n const activity = linearService.getActivityLog(10);\n \n if (activity.length === 0) {\n return {\n text: 'No recent Linear activity',\n };\n }\n \n const activityList = activity.map((item: LinearActivityItem) => {\n const status = item.success ? '✓' : '✗';\n const time = new Date(item.timestamp).toLocaleTimeString();\n return `${status} ${time}: ${item.action} ${item.resource_type} ${item.resource_id}`;\n });\n \n const text = `Recent Linear Activity:\\n${activityList.join('\\n')}`;\n \n return {\n text,\n data: {\n activity: activity.slice(0, 10),\n },\n };\n } catch (error) {\n return {\n text: 'Error retrieving Linear activity',\n };\n }\n },\n}; ","import { Plugin } from '@elizaos/core';\nimport { LinearService } from './services/linear';\n\n// Import all actions\nimport { createIssueAction } from './actions/createIssue';\nimport { getIssueAction } from './actions/getIssue';\nimport { updateIssueAction } from './actions/updateIssue';\nimport { searchIssuesAction } from './actions/searchIssues';\nimport { createCommentAction } from './actions/createComment';\nimport { listTeamsAction } from './actions/listTeams';\nimport { listProjectsAction } from './actions/listProjects';\nimport { getActivityAction } from './actions/getActivity';\nimport { clearActivityAction } from './actions/clearActivity';\n\n// Import all providers\nimport { linearIssuesProvider } from './providers/issues';\nimport { linearTeamsProvider } from './providers/teams';\nimport { linearProjectsProvider } from './providers/projects';\nimport { linearActivityProvider } from './providers/activity';\n\nexport const linearPlugin: Plugin = {\n name: '@elizaos/plugin-linear',\n description: 'Plugin for integrating with Linear issue tracking system',\n services: [LinearService],\n actions: [\n createIssueAction,\n getIssueAction,\n updateIssueAction,\n searchIssuesAction,\n createCommentAction,\n listTeamsAction,\n listProjectsAction,\n getActivityAction,\n clearActivityAction,\n ],\n providers: [\n linearIssuesProvider,\n linearTeamsProvider,\n linearProjectsProvider,\n linearActivityProvider,\n ],\n};\n\n// Re-export types and service for external use\nexport * from './types';\nexport { LinearService } from './services/linear'; "],"mappings":"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","names":["logger","logger","logger","ModelType","logger","logger","logger","logger","logger","logger"]}
|