@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 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: "Please provide a description for the issue.",
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 === parsed.assignee || u.name.toLowerCase().includes(parsed.assignee.toLowerCase())
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: "Could not determine issue title. Please provide more details.",
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: "No Linear teams found. Please ensure at least one team exists in your Linear workspace.",
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: `Failed to create issue: ${error instanceof Error ? error.message : "Unknown error"}`,
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: "Please specify an issue ID.",
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: "Please provide a valid issue ID (e.g., ENG-123).",
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 = `Issue ${issue.identifier}: ${issue.title}
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: `Failed to get issue: ${error instanceof Error ? error.message : "Unknown error"}`,
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: "Please provide update instructions for the issue.",
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: "Please specify an issue ID (e.g., ENG-123) to update.",
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: `No valid updates found. Please specify what to update (e.g., "Update issue ENG-123 title to 'New Title'")`,
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: `Failed to update issue: ${error instanceof Error ? error.message : "Unknown error"}`,
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: "Please provide search criteria for issues.",
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: "No issues found matching your search criteria.",
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: `Failed to search issues: ${error instanceof Error ? error.message : "Unknown error"}`,
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: "Please provide a message with the issue ID and comment content.",
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: 'Please specify the issue ID and comment content. Example: "Comment on ENG-123: This looks good"',
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: `Failed to create comment: ${error instanceof Error ? error.message : "Unknown error"}`,
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, _message, _state, _options) {
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: "No teams found in Linear.",
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: `Failed to list teams: ${error instanceof Error ? error.message : "Unknown error"}`,
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, _message, _state, _options) {
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: "No projects found in Linear.",
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: `Failed to list projects: ${error instanceof Error ? error.message : "Unknown error"}`,
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, _message, _state, _options) {
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: "No recent Linear activity found.",
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: `Failed to get Linear activity: ${error instanceof Error ? error.message : "Unknown error"}`,
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: "Linear activity log has been cleared.",
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: `Failed to clear Linear activity: ${error instanceof Error ? error.message : "Unknown error"}`,
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-linear",
3
- "version": "1.2.7",
3
+ "version": "1.2.9",
4
4
  "description": "Linear integration plugin for ElizaOS",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",