@elizaos/plugin-linear 2.0.0-alpha.6 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1808 -1187
- package/dist/index.js.map +29 -21
- package/package.json +8 -8
package/dist/index.js.map
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/actions/clearActivity.ts", "../src/actions/createComment.ts", "../src/
|
|
3
|
+
"sources": ["../src/index.ts", "../src/accounts.ts", "../src/actions/account-options.ts", "../src/actions/clearActivity.ts", "../src/actions/validate-linear-intent.ts", "../src/actions/createComment.ts", "../src/prompts.ts", "../src/actions/parseLinearPrompt.ts", "../src/actions/createIssue.ts", "../src/actions/deleteComment.ts", "../src/actions/deleteIssue.ts", "../src/actions/getActivity.ts", "../src/actions/getIssue.ts", "../src/actions/listComments.ts", "../src/actions/searchIssues.ts", "../src/actions/updateComment.ts", "../src/actions/updateIssue.ts", "../src/actions/linear.ts", "../src/connector-account-provider.ts", "../src/providers/activity.ts", "../src/providers/issues.ts", "../src/providers/projects.ts", "../src/providers/teams.ts", "../src/search-category.ts", "../src/services/linear.ts", "../src/types/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import
|
|
6
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { createCommentTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { CreateCommentParameters } from \"../types/index.js\";\n\nexport const createCommentAction: Action = {\n name: \"CREATE_LINEAR_COMMENT\",\n description: \"Add a comment to a Linear issue\",\n similes: [\n \"create-linear-comment\",\n \"add-linear-comment\",\n \"comment-on-linear-issue\",\n \"reply-to-linear-issue\",\n ],\n\n examples: [\n [\n {\n name: \"User\",\n content: {\n text: \"Comment on ENG-123: This looks good to me\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll add your comment to issue ENG-123.\",\n actions: [\"CREATE_LINEAR_COMMENT\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Tell the login bug that we need more information from QA\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll add that comment to the login bug issue.\",\n actions: [\"CREATE_LINEAR_COMMENT\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Reply to COM2-7: Thanks for the update, I'll look into it\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll add your reply to issue COM2-7.\",\n actions: [\"CREATE_LINEAR_COMMENT\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"create\", \"linear\", \"comment\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:create|linear|comment)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 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 let issueId: string;\n let commentBody: string;\n\n const params = _options?.parameters as CreateCommentParameters | undefined;\n if (params?.issueId && params?.body) {\n issueId = params.issueId;\n commentBody = params.body;\n } else {\n const prompt = createCommentTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (!response) {\n const issueMatch = content.match(\n /(?:comment on|add.*comment.*to|reply to|tell)\\s+(\\w+-\\d+):?\\s*(.*)/i\n );\n if (issueMatch) {\n issueId = issueMatch[1];\n commentBody = issueMatch[2].trim();\n } else {\n throw new Error(\"Could not understand comment request\");\n }\n } else {\n try {\n const parsed = JSON.parse(\n response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim()\n );\n\n if (parsed.issueId) {\n issueId = parsed.issueId;\n commentBody = parsed.commentBody;\n } else if (parsed.issueDescription) {\n const filters: { query: string; limit: number; team?: string } = {\n query: parsed.issueDescription,\n limit: 5,\n };\n\n const defaultTeamKey = runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string;\n if (defaultTeamKey) {\n filters.team = defaultTeamKey;\n }\n\n const issues = await linearService.searchIssues(filters);\n\n if (issues.length === 0) {\n const errorMessage = `No issues found matching \"${parsed.issueDescription}\". Please provide a specific 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 if (issues.length === 1) {\n issueId = issues[0].identifier;\n commentBody = parsed.commentBody;\n } else {\n const issueList = await Promise.all(\n 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 );\n\n const clarifyMessage = `Found multiple issues matching \"${parsed.issueDescription}\":\\n${issueList.join(\"\\n\")}\\n\\nPlease specify which issue to comment on by its ID.`;\n await callback?.({\n text: clarifyMessage,\n source: message.content.source,\n });\n\n return {\n text: clarifyMessage,\n success: false,\n data: {\n multipleMatches: true,\n issues: issues.map((i) => ({\n id: i.id,\n identifier: i.identifier,\n title: i.title,\n })),\n pendingComment: parsed.commentBody,\n },\n };\n }\n } else {\n throw new Error(\"No issue identifier or description found\");\n }\n\n if (parsed.commentType && parsed.commentType !== \"note\") {\n commentBody = `[${parsed.commentType.toUpperCase()}] ${commentBody}`;\n }\n } catch (parseError) {\n logger.warn(\"Failed to parse LLM response, falling back to regex:\", parseError);\n const issueMatch = content.match(\n /(?:comment on|add.*comment.*to|reply to|tell)\\s+(\\w+-\\d+):?\\s*(.*)/i\n );\n\n if (!issueMatch) {\n const errorMessage =\n '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 issueId = issueMatch[1];\n commentBody = issueMatch[2].trim();\n }\n }\n }\n\n if (!commentBody || commentBody.length === 0) {\n const errorMessage = \"Please provide the 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 issue = await linearService.getIssue(issueId);\n\n const comment = await linearService.createComment({\n issueId: issue.id,\n body: commentBody,\n });\n\n const successMessage = `✅ Comment added to issue ${issue.identifier}: \"${commentBody}\"`;\n await callback?.({\n text: successMessage,\n source: message.content.source,\n });\n\n return {\n text: `Added comment to issue ${issue.identifier}`,\n success: true,\n data: {\n commentId: comment.id,\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n commentBody: commentBody,\n createdAt:\n comment.createdAt instanceof Date ? comment.createdAt.toISOString() : comment.createdAt,\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};\n",
|
|
7
|
-
"/**\n * Auto-generated prompt templates\n * DO NOT EDIT - Generated from ../../../../../prompts/*.txt\n *\n * These prompts use Handlebars-style template syntax:\n * - {{variableName}} for simple substitution\n * - {{#each items}}...{{/each}} for iteration\n * - {{#if condition}}...{{/if}} for conditionals\n */\n\nexport const createCommentTemplate = `Extract comment details from the user's request to add a comment to a Linear issue.\n\nUser request: \"{{userMessage}}\"\n\nThe user might express this in various ways:\n- \"Comment on ENG-123: This looks good\"\n- \"Tell ENG-123 that the fix is ready for testing\"\n- \"Add a note to the login bug saying we need more info\"\n- \"Reply to COM2-7: Thanks for the update\"\n- \"Let the payment issue know that it's blocked by API changes\"\n\nReturn ONLY a JSON object:\n{\n \"issueId\": \"Direct issue ID if explicitly mentioned (e.g., ENG-123)\",\n \"issueDescription\": \"Description/keywords of the issue if no ID provided\",\n \"commentBody\": \"The actual comment content to add\",\n \"commentType\": \"note/reply/update/question/feedback (inferred from context)\"\n}\n\nExtract the core message the user wants to convey as the comment body.`;\n\nexport const CREATE_COMMENT_TEMPLATE = createCommentTemplate;\n\nexport const 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 CREATE_ISSUE_TEMPLATE = createIssueTemplate;\n\nexport const deleteIssueTemplate = `Given the user's request to delete/archive a Linear issue, extract the issue identifier.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object (no markdown formatting, no code blocks) with:\n{\n \"issueId\": \"The issue identifier (e.g., ENG-123, COM2-7)\"\n}\n\nReturn only the JSON object, no other text.`;\n\nexport const DELETE_ISSUE_TEMPLATE = deleteIssueTemplate;\n\nexport const getActivityTemplate = `Extract activity filter criteria from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might ask for activity in various ways:\n- \"Show me today's activity\" → time range filter\n- \"What issues were created?\" → action type filter\n- \"What did John do yesterday?\" → user filter + time range\n- \"Activity on ENG-123\" → resource filter\n- \"Recent comment activity\" → action type + recency\n- \"Failed operations this week\" → success filter + time range\n\nReturn ONLY a JSON object:\n{\n \"timeRange\": {\n \"period\": \"today/yesterday/this-week/last-week/this-month\",\n \"from\": \"ISO datetime if specific\",\n \"to\": \"ISO datetime if specific\"\n },\n \"actionTypes\": [\"create_issue/update_issue/delete_issue/create_comment/search_issues/etc\"],\n \"resourceTypes\": [\"issue/project/comment/team\"],\n \"resourceId\": \"Specific resource ID if mentioned (e.g., ENG-123)\",\n \"user\": \"User name or 'me' for current user\",\n \"successFilter\": \"success/failed/all\",\n \"limit\": number (default 10)\n}\n\nOnly include fields that are clearly mentioned.`;\n\nexport const GET_ACTIVITY_TEMPLATE = getActivityTemplate;\n\nexport const getIssueTemplate = `Extract issue identification from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might reference an issue by:\n- Direct ID (e.g., \"ENG-123\", \"COM2-7\")\n- Title keywords (e.g., \"the login bug\", \"that payment issue\")\n- Assignee (e.g., \"John's high priority task\")\n- Recency (e.g., \"the latest bug\", \"most recent issue\")\n- Team context (e.g., \"newest issue in ELIZA team\")\n\nReturn ONLY a JSON object:\n{\n \"directId\": \"Issue ID if explicitly mentioned (e.g., ENG-123)\",\n \"searchBy\": {\n \"title\": \"Keywords from issue title if mentioned\",\n \"assignee\": \"Name/email of assignee if mentioned\", \n \"priority\": \"Priority level if mentioned (urgent/high/normal/low or 1-4)\",\n \"team\": \"Team name or key if mentioned\",\n \"state\": \"Issue state if mentioned (todo/in-progress/done)\",\n \"recency\": \"latest/newest/recent/last if mentioned\",\n \"type\": \"bug/feature/task if mentioned\"\n }\n}\n\nOnly include fields that are clearly mentioned or implied.`;\n\nexport const GET_ISSUE_TEMPLATE = getIssueTemplate;\n\nexport const listProjectsTemplate = `Extract project filter criteria from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might ask for projects in various ways:\n- \"Show me all projects\" → list all projects\n- \"Active projects\" → filter by state (active/planned/completed)\n- \"Projects due this quarter\" → filter by target date\n- \"Which projects is Sarah managing?\" → filter by lead/owner\n- \"Projects with high priority issues\" → filter by contained issue priority\n- \"Projects for the engineering team\" → filter by team\n- \"Completed projects\" → filter by state\n- \"Projects starting next month\" → filter by start date\n\nReturn ONLY a JSON object:\n{\n \"teamFilter\": \"Team name or key if mentioned\",\n \"stateFilter\": \"active/planned/completed/all\",\n \"dateFilter\": {\n \"type\": \"due/starting\",\n \"period\": \"this-week/this-month/this-quarter/next-month/next-quarter\",\n \"from\": \"ISO date if specific\",\n \"to\": \"ISO date if specific\"\n },\n \"leadFilter\": \"Project lead name if mentioned\",\n \"showAll\": true/false (true if user explicitly asks for \"all\")\n}\n\nOnly include fields that are clearly mentioned.`;\n\nexport const LIST_PROJECTS_TEMPLATE = listProjectsTemplate;\n\nexport const listTeamsTemplate = `Extract team filter criteria from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might ask for teams in various ways:\n- \"Show me all teams\" → list all teams\n- \"Engineering teams\" → filter by teams with engineering in name/description\n- \"List teams I'm part of\" → filter by membership\n- \"Which teams work on the mobile app?\" → filter by description/focus\n- \"Show me the ELIZA team details\" → specific team lookup\n- \"Active teams\" → teams with recent activity\n- \"Frontend and backend teams\" → multiple team types\n\nReturn ONLY a JSON object:\n{\n \"nameFilter\": \"Keywords to search in team names\",\n \"specificTeam\": \"Specific team name or key if looking for one team\",\n \"myTeams\": true/false (true if user wants their teams),\n \"showAll\": true/false (true if user explicitly asks for \"all\"),\n \"includeDetails\": true/false (true if user wants detailed info)\n}\n\nOnly include fields that are clearly mentioned.`;\n\nexport const LIST_TEAMS_TEMPLATE = listTeamsTemplate;\n\nexport const searchIssuesTemplate = `Extract search criteria from the user's request for Linear issues.\n\nUser request: \"{{userMessage}}\"\n\nThe user might express searches in various ways:\n- \"Show me what John is working on\" → assignee filter\n- \"Any blockers for the next release?\" → priority/label filters\n- \"Issues created this week\" → date range filter\n- \"My high priority bugs\" → assignee (current user) + priority + label\n- \"Unassigned tasks in the backend team\" → no assignee + team filter\n- \"What did Sarah close yesterday?\" → assignee + state + date\n- \"Bugs that are almost done\" → label + state filter\n- \"Show me the oldest open issues\" → state + sort order\n\nExtract and return ONLY a JSON object:\n{\n \"query\": \"General search text for title/description\",\n \"states\": [\"state names like In Progress, Done, Todo, Backlog\"],\n \"assignees\": [\"assignee names or emails, or 'me' for current user\"],\n \"priorities\": [\"urgent/high/normal/low or 1/2/3/4\"],\n \"teams\": [\"team names or keys\"],\n \"labels\": [\"label names\"],\n \"hasAssignee\": true/false (true = has assignee, false = unassigned),\n \"dateRange\": {\n \"field\": \"created/updated/completed\",\n \"period\": \"today/yesterday/this-week/last-week/this-month/last-month\",\n \"from\": \"ISO date if specific date\",\n \"to\": \"ISO date if specific date\"\n },\n \"sort\": {\n \"field\": \"created/updated/priority\",\n \"order\": \"asc/desc\"\n },\n \"limit\": number (default 10)\n}\n\nOnly include fields that are clearly mentioned or implied. For \"my\" issues, set assignees to [\"me\"].`;\n\nexport const SEARCH_ISSUES_TEMPLATE = searchIssuesTemplate;\n\nexport const updateIssueTemplate = `Given the user's request to update a Linear issue, extract the information needed.\n\nUser request: \"{{userMessage}}\"\n\nExtract and return ONLY a JSON object (no markdown formatting, no code blocks) with the following structure:\n{\n \"issueId\": \"The issue identifier (e.g., ENG-123, COM2-7)\",\n \"updates\": {\n \"title\": \"New title if changing the title\",\n \"description\": \"New description if changing the description\",\n \"priority\": \"Priority level if changing (1=urgent, 2=high, 3=normal, 4=low)\",\n \"teamKey\": \"New team key if moving to another team (e.g., ENG, ELIZA, COM2)\",\n \"assignee\": \"New assignee username or email if changing\",\n \"status\": \"New status if changing (e.g., todo, in-progress, done, canceled)\",\n \"labels\": [\"label1\", \"label2\"] (if changing labels, empty array to clear)\n }\n}\n\nOnly include fields that are being updated. Return only the JSON object, no other text.`;\n\nexport const UPDATE_ISSUE_TEMPLATE = updateIssueTemplate;\n",
|
|
8
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { createIssueTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { CreateIssueParameters, LinearIssueInput } from \"../types/index.js\";\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 {\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 {\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\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"create\", \"linear\", \"issue\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:create|linear|issue)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const params = _options?.parameters as CreateIssueParameters | undefined;\n const structuredData = params?.issueData;\n\n let issueData: Partial<LinearIssueInput>;\n\n if (structuredData) {\n issueData = structuredData;\n } else {\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 const cleanedResponse = response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim();\n const parsed = JSON.parse(cleanedResponse);\n\n issueData = {\n title: parsed.title || undefined,\n description: parsed.description || undefined,\n priority: parsed.priority ? Number(parsed.priority) : undefined,\n };\n\n if (parsed.teamKey) {\n const teams = await linearService.getTeams();\n const team = teams.find((t) => t.key.toLowerCase() === parsed.teamKey.toLowerCase());\n if (team) {\n issueData.teamId = team.id;\n }\n }\n\n if (parsed.assignee && parsed.assignee !== \"\") {\n const cleanAssignee = parsed.assignee.replace(/^@/, \"\");\n\n const users = await linearService.getUsers();\n const user = users.find(\n (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 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) => l.name.toLowerCase() === labelName.toLowerCase());\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 (!issueData.teamId) {\n const defaultTeamKey = runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string;\n\n if (defaultTeamKey) {\n const teams = await linearService.getTeams();\n const defaultTeam = teams.find(\n (t) => t.key.toLowerCase() === defaultTeamKey.toLowerCase()\n );\n if (defaultTeam) {\n issueData.teamId = defaultTeam.id;\n logger.info(\n `Using configured default team: ${defaultTeam.name} (${defaultTeam.key})`\n );\n } else {\n logger.warn(`Default team key ${defaultTeamKey} not found`);\n }\n }\n\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 first available team: ${teams[0].name}`);\n }\n }\n }\n } catch (parseError) {\n logger.error(\"Failed to parse LLM response:\", parseError);\n issueData = {\n title: content.length > 100 ? `${content.substring(0, 100)}...` : content,\n description: content,\n };\n\n const defaultTeamKey = runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string;\n const teams = await linearService.getTeams();\n\n if (defaultTeamKey) {\n const defaultTeam = teams.find(\n (t) => t.key.toLowerCase() === defaultTeamKey.toLowerCase()\n );\n if (defaultTeam) {\n issueData.teamId = defaultTeam.id;\n logger.info(\n `Using configured default team for fallback: ${defaultTeam.name} (${defaultTeam.key})`\n );\n }\n }\n\n if (!issueData.teamId && teams.length > 0) {\n issueData.teamId = teams[0].id;\n logger.warn(`Using first available 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 if (!issueData.teamId) {\n const errorMessage =\n \"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 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};\n",
|
|
9
|
-
"import
|
|
10
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { getActivityTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { LinearService } from \"../services/linear\";\n\nexport const getActivityAction: Action = {\n name: \"GET_LINEAR_ACTIVITY\",\n description: \"Get recent Linear activity log with optional filters\",\n similes: [\n \"get-linear-activity\",\n \"show-linear-activity\",\n \"view-linear-activity\",\n \"check-linear-activity\",\n ],\n\n examples: [\n [\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 show you the recent Linear activity.\",\n actions: [\"GET_LINEAR_ACTIVITY\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"What happened in Linear today?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"Let me check today's Linear activity for you.\",\n actions: [\"GET_LINEAR_ACTIVITY\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me what issues John created this week\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll find the issues John created this week.\",\n actions: [\"GET_LINEAR_ACTIVITY\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"get\", \"linear\", \"activity\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:get|linear|activity)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const filters: Record<string, unknown> = {};\n let limit = 10;\n\n if (content) {\n const prompt = getActivityTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (response) {\n try {\n const parsed = JSON.parse(\n response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim()\n );\n\n if (parsed.timeRange) {\n const now = new Date();\n let fromDate: Date | undefined;\n\n if (parsed.timeRange.from) {\n fromDate = new Date(parsed.timeRange.from);\n } else if (parsed.timeRange.period) {\n switch (parsed.timeRange.period) {\n case \"today\":\n fromDate = new Date(now.setHours(0, 0, 0, 0));\n break;\n case \"yesterday\":\n fromDate = new Date(now.setDate(now.getDate() - 1));\n fromDate.setHours(0, 0, 0, 0);\n break;\n case \"this-week\":\n fromDate = new Date(now.setDate(now.getDate() - now.getDay()));\n fromDate.setHours(0, 0, 0, 0);\n break;\n case \"last-week\":\n fromDate = new Date(now.setDate(now.getDate() - now.getDay() - 7));\n fromDate.setHours(0, 0, 0, 0);\n break;\n case \"this-month\":\n fromDate = new Date(now.getFullYear(), now.getMonth(), 1);\n break;\n }\n }\n\n if (fromDate) {\n filters.fromDate = fromDate.toISOString();\n }\n }\n\n if (parsed.actionTypes && parsed.actionTypes.length > 0) {\n filters.action = parsed.actionTypes[0];\n }\n\n if (parsed.resourceTypes && parsed.resourceTypes.length > 0) {\n filters.resource_type = parsed.resourceTypes[0];\n }\n\n if (parsed.resourceId) {\n filters.resource_id = parsed.resourceId;\n }\n\n if (parsed.successFilter && parsed.successFilter !== \"all\") {\n filters.success = parsed.successFilter === \"success\";\n }\n\n limit = parsed.limit || 10;\n } catch (parseError) {\n logger.warn(\"Failed to parse activity filters:\", parseError);\n }\n }\n }\n\n let activity = linearService.getActivityLog(limit * 2, filters);\n\n if (filters.fromDate) {\n const fromDateValue = filters.fromDate;\n const fromDate =\n typeof fromDateValue === \"string\"\n ? fromDateValue\n : fromDateValue instanceof Date\n ? fromDateValue.toISOString()\n : String(fromDateValue);\n const fromTime = new Date(fromDate).getTime();\n if (!Number.isNaN(fromTime)) {\n activity = activity.filter((item) => new Date(item.timestamp).getTime() >= fromTime);\n }\n }\n\n activity = activity.slice(0, limit);\n\n if (activity.length === 0) {\n const noActivityMessage = filters.fromDate\n ? `No Linear activity found for the specified filters.`\n : \"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 .map((item, index) => {\n const time = new Date(item.timestamp).toLocaleString();\n const status = item.success ? \"✅\" : \"❌\";\n const details = Object.entries(item.details)\n .filter(([key]) => key !== \"filters\")\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(\", \");\n\n return `${index + 1}. ${status} ${item.action} on ${item.resource_type} ${item.resource_id}\\n Time: ${time}\\n ${details ? `Details: ${details}` : \"\"}${item.error ? `\\n Error: ${item.error}` : \"\"}`;\n })\n .join(\"\\n\\n\");\n\n const headerText = filters.fromDate\n ? `📊 Linear activity ${content}:`\n : \"📊 Recent Linear activity:\";\n\n const resultMessage = `${headerText}\\n\\n${activityText}`;\n await callback?.({\n text: resultMessage,\n source: message.content.source,\n });\n\n return {\n text: `Found ${activity.length} activity item${activity.length === 1 ? \"\" : \"s\"}`,\n success: true,\n data: {\n activity: activity.map((item) => ({\n id: item.id,\n action: item.action,\n resource_type: item.resource_type,\n resource_id: item.resource_id,\n success: item.success,\n error: item.error,\n details: JSON.stringify(item.details) as string,\n timestamp:\n typeof item.timestamp === \"string\"\n ? item.timestamp\n : new Date(item.timestamp).toISOString(),\n })) as Array<Record<string, string | boolean | undefined>>,\n filters: filters\n ? {\n ...filters,\n fromDate: filters.fromDate\n ? typeof filters.fromDate === \"string\"\n ? filters.fromDate\n : String(filters.fromDate)\n : undefined,\n }\n : undefined,\n count: activity.length,\n },\n };\n } catch (error) {\n logger.error(\"Failed to get activity:\", error);\n const errorMessage = `❌ Failed to get 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};\n",
|
|
11
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport type { Issue, IssueLabel } from \"@linear/sdk\";\nimport { getIssueTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { 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: [\n \"get-linear-issue\",\n \"show-linear-issue\",\n \"view-linear-issue\",\n \"check-linear-issue\",\n \"find-linear-issue\",\n ],\n\n examples: [\n [\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 {\n name: \"User\",\n content: {\n text: \"What's the status of the login bug?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"Let me find the login bug issue for you.\",\n actions: [\"GET_LINEAR_ISSUE\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me the latest high priority issue assigned to Sarah\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll find the latest high priority issue assigned to Sarah.\",\n actions: [\"GET_LINEAR_ISSUE\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"get\", \"linear\", \"issue\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:get|linear|issue)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 which issue you want to see.\";\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 prompt = getIssueTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (!response) {\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (issueMatch) {\n const issue = await linearService.getIssue(issueMatch[1]);\n return await formatIssueResponse(issue, callback, message);\n }\n throw new Error(\"Could not understand issue reference\");\n }\n\n try {\n const parsed = JSON.parse(\n response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim()\n );\n\n if (parsed.directId) {\n const issue = await linearService.getIssue(parsed.directId);\n return await formatIssueResponse(issue, callback, message);\n }\n\n if (parsed.searchBy && Object.keys(parsed.searchBy).length > 0) {\n const filters: Record<string, unknown> = {};\n\n if (parsed.searchBy.title) {\n filters.query = parsed.searchBy.title;\n }\n\n if (parsed.searchBy.assignee) {\n filters.assignee = [parsed.searchBy.assignee];\n }\n\n if (parsed.searchBy.priority) {\n const priorityMap: Record<string, number> = {\n urgent: 1,\n high: 2,\n normal: 3,\n low: 4,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n };\n const priority = priorityMap[parsed.searchBy.priority.toLowerCase()];\n if (priority) {\n filters.priority = [priority];\n }\n }\n\n if (parsed.searchBy.team) {\n filters.team = parsed.searchBy.team;\n }\n\n if (parsed.searchBy.state) {\n filters.state = [parsed.searchBy.state];\n }\n\n const defaultTeamKey = runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string;\n if (defaultTeamKey && !filters.team) {\n filters.team = defaultTeamKey;\n }\n\n const issues = await linearService.searchIssues({\n ...filters,\n limit: parsed.searchBy.recency ? 10 : 5,\n });\n\n if (issues.length === 0) {\n const noResultsMessage = \"No issues found matching your criteria.\";\n await callback?.({\n text: noResultsMessage,\n source: message.content.source,\n });\n return {\n text: noResultsMessage,\n success: false,\n };\n }\n\n if (parsed.searchBy.recency) {\n issues.sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n }\n\n if (parsed.searchBy.recency && issues.length > 0) {\n return await formatIssueResponse(issues[0], callback, message);\n }\n\n if (issues.length === 1) {\n return await formatIssueResponse(issues[0], callback, message);\n }\n\n const issueList = await Promise.all(\n issues.slice(0, 5).map(async (issue, index) => {\n const state = await issue.state;\n return `${index + 1}. ${issue.identifier}: ${issue.title} (${state?.name || \"No state\"})`;\n })\n );\n\n const clarifyMessage = `Found ${issues.length} issues matching your criteria:\\n${issueList.join(\"\\n\")}\\n\\nPlease specify which one you want to see by its ID.`;\n await callback?.({\n text: clarifyMessage,\n source: message.content.source,\n });\n\n return {\n text: clarifyMessage,\n success: true,\n data: {\n multipleResults: true,\n issues: issues.slice(0, 5).map((i) => ({\n id: i.id,\n identifier: i.identifier,\n title: i.title,\n })),\n },\n };\n }\n } catch (parseError) {\n logger.warn(\"Failed to parse LLM response, falling back to regex:\", parseError);\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (issueMatch) {\n const issue = await linearService.getIssue(issueMatch[1]);\n return await formatIssueResponse(issue, callback, message);\n }\n }\n\n const errorMessage =\n \"Could not understand which issue you want to see. Please provide an issue ID (e.g., ENG-123) or describe it more specifically.\";\n await callback?.({\n text: errorMessage,\n source: message.content.source,\n });\n return {\n text: errorMessage,\n success: false,\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};\n\nasync function formatIssueResponse(\n issue: Issue,\n callback: HandlerCallback | undefined,\n message: Memory\n): Promise<ActionResult> {\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 ? {\n id: assignee.id,\n name: assignee.name,\n email: assignee.email,\n }\n : null,\n state: state\n ? {\n id: state.id,\n name: state.name,\n type: state.type,\n color: state.color,\n }\n : null,\n team: team\n ? {\n id: team.id,\n name: team.name,\n key: team.key,\n }\n : null,\n labels: labels.nodes.map((label: IssueLabel) => ({\n id: label.id,\n name: label.name,\n color: label.color,\n })),\n project: project\n ? {\n id: project.id,\n name: project.name,\n description: project.description,\n }\n : null,\n };\n\n const priorityLabels = [\"\", \"Urgent\", \"High\", \"Normal\", \"Low\"];\n const priority = priorityLabels[issue.priority || 0] || \"No priority\";\n\n const labelText =\n issueDetails.labels.length > 0\n ? `Labels: ${issueDetails.labels.map((l) => l.name).join(\", \")}`\n : \"\";\n\n const issueMessage = `📋 **${issue.identifier}: ${issue.title}**\n \nStatus: ${state?.name || \"No status\"}\nPriority: ${priority}\nTeam: ${team?.name || \"No team\"}\nAssignee: ${assignee?.name || \"Unassigned\"}\n${issue.dueDate ? `Due: ${new Date(issue.dueDate).toLocaleDateString()}` : \"\"}\n${labelText}\n${project ? `Project: ${project.name}` : \"\"}\n\n${issue.description || \"No description\"}\n\nView in Linear: ${issue.url}`;\n\n await callback?.({\n text: issueMessage,\n source: message.content.source,\n });\n\n const serializedIssue = {\n ...issueDetails,\n createdAt:\n issueDetails.createdAt instanceof Date\n ? issueDetails.createdAt.toISOString()\n : issueDetails.createdAt,\n updatedAt:\n issueDetails.updatedAt instanceof Date\n ? issueDetails.updatedAt.toISOString()\n : issueDetails.updatedAt,\n dueDate: issueDetails.dueDate\n ? issueDetails.dueDate instanceof Date\n ? issueDetails.dueDate.toISOString()\n : issueDetails.dueDate\n : null,\n };\n\n return {\n text: `Retrieved issue ${issue.identifier}: ${issue.title}`,\n success: true,\n data: { issue: serializedIssue },\n };\n}\n",
|
|
12
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport type { Team } from \"@linear/sdk\";\nimport { listProjectsTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { LinearService } from \"../services/linear\";\n\nexport const listProjectsAction: Action = {\n name: \"LIST_LINEAR_PROJECTS\",\n description: \"List projects in Linear with optional filters\",\n similes: [\n \"list-linear-projects\",\n \"show-linear-projects\",\n \"get-linear-projects\",\n \"view-linear-projects\",\n ],\n\n examples: [\n [\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 {\n name: \"User\",\n content: {\n text: \"What active projects do we have?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"Let me show you all the active projects.\",\n actions: [\"LIST_LINEAR_PROJECTS\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me projects for the engineering team\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll find the projects for the engineering team.\",\n actions: [\"LIST_LINEAR_PROJECTS\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"list\", \"linear\", \"projects\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:list|linear|projects)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 let teamId: string | undefined;\n let showAll = false;\n let stateFilter: string | undefined;\n\n if (content) {\n const prompt = listProjectsTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (response) {\n try {\n const parsed = JSON.parse(\n response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim()\n );\n\n if (parsed.teamFilter) {\n const teams = await linearService.getTeams();\n const team = teams.find(\n (t) =>\n t.key.toLowerCase() === parsed.teamFilter.toLowerCase() ||\n t.name.toLowerCase() === parsed.teamFilter.toLowerCase()\n );\n if (team) {\n teamId = team.id;\n logger.info(`Filtering projects by team: ${team.name} (${team.key})`);\n }\n }\n\n showAll = parsed.showAll === true;\n stateFilter = parsed.stateFilter;\n } catch (parseError) {\n logger.warn(\"Failed to parse project filters, using basic parsing:\", parseError);\n\n const teamMatch = content.match(/(?:for|in|of)\\s+(?:the\\s+)?(\\w+)\\s+team/i);\n if (teamMatch) {\n const teams = await linearService.getTeams();\n const team = teams.find(\n (t) =>\n t.key.toLowerCase() === teamMatch[1].toLowerCase() ||\n t.name.toLowerCase() === teamMatch[1].toLowerCase()\n );\n if (team) {\n teamId = team.id;\n logger.info(`Filtering projects by team: ${team.name} (${team.key})`);\n }\n }\n\n showAll =\n content.toLowerCase().includes(\"all\") && content.toLowerCase().includes(\"project\");\n }\n }\n }\n\n if (!teamId && !showAll) {\n const defaultTeamKey = runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string;\n if (defaultTeamKey) {\n const teams = await linearService.getTeams();\n const defaultTeam = teams.find(\n (t) => t.key.toLowerCase() === defaultTeamKey.toLowerCase()\n );\n if (defaultTeam) {\n teamId = defaultTeam.id;\n logger.info(\n `Applying default team filter for projects: ${defaultTeam.name} (${defaultTeam.key})`\n );\n }\n }\n }\n\n let projects = await linearService.getProjects(teamId);\n\n if (stateFilter && stateFilter !== \"all\") {\n projects = projects.filter((project) => {\n const state = project.state?.toLowerCase() || \"\";\n if (stateFilter === \"active\") {\n return state === \"started\" || state === \"in progress\" || !state;\n } else if (stateFilter === \"planned\") {\n return state === \"planned\" || state === \"backlog\";\n } else if (stateFilter === \"completed\") {\n return state === \"completed\" || state === \"done\" || state === \"canceled\";\n }\n return true;\n });\n }\n\n if (projects.length === 0) {\n const noProjectsMessage = teamId\n ? \"No projects found for the specified team.\"\n : \"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 const projectsWithDetails = await Promise.all(\n projects.map(async (project) => {\n const teamsQuery = await project.teams();\n const teams = await teamsQuery.nodes;\n const lead = await project.lead;\n\n return {\n ...project,\n teamsList: teams,\n leadUser: lead,\n };\n })\n );\n\n const projectList = projectsWithDetails\n .map((project, index) => {\n const teamNames = project.teamsList.map((t: Team) => t.name).join(\", \") || \"No teams\";\n const status = project.state || \"Active\";\n const progress = project.progress\n ? ` (${Math.round(project.progress * 100)}% complete)`\n : \"\";\n const lead = project.leadUser ? ` | Lead: ${project.leadUser.name}` : \"\";\n const dates = [];\n if (project.startDate)\n dates.push(`Start: ${new Date(project.startDate).toLocaleDateString()}`);\n if (project.targetDate)\n dates.push(`Due: ${new Date(project.targetDate).toLocaleDateString()}`);\n const dateInfo = dates.length > 0 ? `\\n ${dates.join(\" | \")}` : \"\";\n\n return `${index + 1}. ${project.name}${project.description ? ` - ${project.description}` : \"\"}\\n Status: ${status}${progress} | Teams: ${teamNames}${lead}${dateInfo}`;\n })\n .join(\"\\n\\n\");\n\n const headerText =\n stateFilter && stateFilter !== \"all\"\n ? `📁 Found ${projects.length} ${stateFilter} project${projects.length === 1 ? \"\" : \"s\"}:`\n : `📁 Found ${projects.length} project${projects.length === 1 ? \"\" : \"s\"}:`;\n\n const resultMessage = `${headerText}\\n\\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 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: Team) => ({\n id: t.id,\n name: t.name,\n key: t.key,\n })),\n lead: p.leadUser\n ? {\n id: p.leadUser.id,\n name: p.leadUser.name,\n email: p.leadUser.email,\n }\n : null,\n state: p.state,\n progress: p.progress,\n startDate: p.startDate,\n targetDate: p.targetDate,\n })),\n count: projects.length,\n filters: {\n team: teamId,\n state: stateFilter,\n },\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};\n",
|
|
13
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport type { Team, User } from \"@linear/sdk\";\nimport { listTeamsTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { LinearService } from \"../services/linear\";\n\ninterface TeamWithDetails extends Team {\n memberCount?: number;\n projectCount?: number;\n membersList?: User[];\n}\n\nexport const listTeamsAction: Action = {\n name: \"LIST_LINEAR_TEAMS\",\n description: \"List teams in Linear with optional filters\",\n similes: [\"list-linear-teams\", \"show-linear-teams\", \"get-linear-teams\", \"view-linear-teams\"],\n\n examples: [\n [\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 {\n name: \"User\",\n content: {\n text: \"Which engineering teams do we have?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"Let me find the engineering teams for you.\",\n actions: [\"LIST_LINEAR_TEAMS\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me the teams I'm part of\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll show you the teams you're a member of.\",\n actions: [\"LIST_LINEAR_TEAMS\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"list\", \"linear\", \"teams\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:list|linear|teams)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 let nameFilter: string | undefined;\n let specificTeam: string | undefined;\n let myTeams = false;\n let includeDetails = false;\n\n if (content) {\n const prompt = listTeamsTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (response) {\n try {\n const parsed = JSON.parse(\n response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim()\n );\n\n nameFilter = parsed.nameFilter;\n specificTeam = parsed.specificTeam;\n myTeams = parsed.myTeams === true;\n includeDetails = parsed.includeDetails === true;\n } catch (parseError) {\n logger.warn(\"Failed to parse team filters:\", parseError);\n }\n }\n }\n\n let teams = await linearService.getTeams();\n\n if (specificTeam) {\n teams = teams.filter(\n (team) =>\n team.key.toLowerCase() === specificTeam.toLowerCase() ||\n team.name.toLowerCase() === specificTeam.toLowerCase()\n );\n }\n\n if (nameFilter && !specificTeam) {\n const keywords = nameFilter.toLowerCase().split(/\\s+/);\n teams = teams.filter((team) => {\n const teamText = `${team.name} ${team.description || \"\"}`.toLowerCase();\n return keywords.some((keyword) => teamText.includes(keyword));\n });\n }\n\n if (myTeams) {\n try {\n const userTeams = await linearService.getUserTeams();\n const userTeamIds = new Set(userTeams.map((t) => t.id));\n teams = teams.filter((team) => userTeamIds.has(team.id));\n } catch (error) {\n logger.warn(\"Could not filter for user's teams:\", error);\n }\n }\n\n if (teams.length === 0) {\n const noTeamsMessage = specificTeam\n ? `No team found matching \"${specificTeam}\".`\n : nameFilter\n ? `No teams found matching \"${nameFilter}\".`\n : \"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 let teamsWithDetails: TeamWithDetails[] = teams;\n if (includeDetails || specificTeam) {\n teamsWithDetails = await Promise.all(\n teams.map(async (team): Promise<TeamWithDetails> => {\n const membersQuery = await team.members();\n const members = await membersQuery.nodes;\n const projectsQuery = await team.projects();\n const projects = await projectsQuery.nodes;\n\n return Object.assign(team, {\n memberCount: members.length,\n projectCount: projects.length,\n membersList: specificTeam ? members.slice(0, 5) : [],\n });\n })\n );\n }\n\n const teamList = teamsWithDetails\n .map((team: TeamWithDetails, index: number) => {\n let info = `${index + 1}. ${team.name} (${team.key})`;\n\n if (team.description) {\n info += `\\n ${team.description}`;\n }\n\n if (includeDetails || specificTeam) {\n info += `\\n Members: ${team.memberCount ?? 0} | Projects: ${team.projectCount ?? 0}`;\n\n const membersList = team.membersList ?? [];\n if (specificTeam && membersList.length > 0) {\n const memberNames = membersList.map((m: User) => m.name).join(\", \");\n info += `\\n Team members: ${memberNames}${(team.memberCount ?? 0) > 5 ? \" ...\" : \"\"}`;\n }\n }\n\n return info;\n })\n .join(\"\\n\\n\");\n\n const headerText =\n specificTeam && teams.length === 1\n ? `📋 Team Details:`\n : nameFilter\n ? `📋 Found ${teams.length} team${teams.length === 1 ? \"\" : \"s\"} matching \"${nameFilter}\":`\n : `📋 Found ${teams.length} team${teams.length === 1 ? \"\" : \"s\"}:`;\n\n const resultMessage = `${headerText}\\n\\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 success: true,\n data: {\n teams: teamsWithDetails.map((t: TeamWithDetails) => ({\n id: t.id,\n name: t.name,\n key: t.key,\n description: t.description,\n memberCount: t.memberCount,\n projectCount: t.projectCount,\n })),\n count: teams.length,\n filters: {\n name: nameFilter,\n specific: specificTeam,\n },\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};\n",
|
|
14
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { searchIssuesTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { LinearSearchFilters, SearchIssuesParameters } from \"../types/index.js\";\n\nconst searchTemplate = searchIssuesTemplate;\n\nexport const searchIssuesAction: Action = {\n name: \"SEARCH_LINEAR_ISSUES\",\n description: \"Search for issues in Linear with various filters\",\n similes: [\n \"search-linear-issues\",\n \"find-linear-issues\",\n \"query-linear-issues\",\n \"list-linear-issues\",\n ],\n\n examples: [\n [\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 {\n name: \"User\",\n content: {\n text: \"What is John working on?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll find the issues assigned to John.\",\n actions: [\"SEARCH_LINEAR_ISSUES\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me high priority issues created this week\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll search for high priority issues created this week.\",\n actions: [\"SEARCH_LINEAR_ISSUES\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"search\", \"linear\", \"issues\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:search|linear|issues)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const params = _options?.parameters as SearchIssuesParameters | undefined;\n if (params?.filters) {\n filters = params.filters;\n } else {\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 filters = { query: content };\n } else {\n try {\n const cleanedResponse = response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim();\n const parsed = JSON.parse(cleanedResponse);\n\n filters = {\n query: parsed.query,\n limit: parsed.limit || 10,\n };\n\n if (parsed.states && parsed.states.length > 0) {\n filters.state = parsed.states;\n }\n\n if (parsed.assignees && parsed.assignees.length > 0) {\n const processedAssignees = [];\n for (const assignee of parsed.assignees) {\n if (assignee.toLowerCase() === \"me\") {\n try {\n const currentUser = await linearService.getCurrentUser();\n processedAssignees.push(currentUser.email);\n } catch {\n logger.warn('Could not resolve \"me\" to current user');\n }\n } else {\n processedAssignees.push(assignee);\n }\n }\n if (processedAssignees.length > 0) {\n filters.assignee = processedAssignees;\n }\n }\n\n if (parsed.hasAssignee === false) {\n filters.query = filters.query ? `${filters.query} unassigned` : \"unassigned\";\n }\n\n if (parsed.priorities && parsed.priorities.length > 0) {\n const priorityMap: Record<string, number> = {\n urgent: 1,\n high: 2,\n normal: 3,\n low: 4,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n };\n const priorities = parsed.priorities\n .map((p: string) => priorityMap[p.toLowerCase()])\n .filter(Boolean);\n if (priorities.length > 0) {\n filters.priority = priorities;\n }\n }\n\n if (parsed.teams && parsed.teams.length > 0) {\n filters.team = parsed.teams[0];\n }\n\n if (parsed.labels && parsed.labels.length > 0) {\n filters.label = parsed.labels;\n }\n\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 if (!filters.team) {\n const defaultTeamKey = runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string;\n if (defaultTeamKey) {\n const searchingAllIssues =\n content.toLowerCase().includes(\"all\") &&\n (content.toLowerCase().includes(\"issue\") ||\n content.toLowerCase().includes(\"bug\") ||\n content.toLowerCase().includes(\"task\"));\n\n if (!searchingAllIssues) {\n filters.team = defaultTeamKey;\n logger.info(`Applying default team filter: ${defaultTeamKey}`);\n }\n }\n }\n\n filters.limit = params?.limit ?? filters.limit ?? 10;\n\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: filters ? { ...filters } : undefined,\n count: 0,\n },\n };\n }\n\n const issueList = await Promise.all(\n issues.map(async (issue, index) => {\n const state = await issue.state;\n const assignee = await issue.assignee;\n const priorityLabels = [\"\", \"Urgent\", \"High\", \"Normal\", \"Low\"];\n const priority = priorityLabels[issue.priority || 0] || \"No priority\";\n\n return `${index + 1}. ${issue.identifier}: ${issue.title}\\n Status: ${state?.name || \"No state\"} | Priority: ${priority} | Assignee: ${assignee?.name || \"Unassigned\"}`;\n })\n );\n const issueText = issueList.join(\"\\n\\n\");\n\n const resultMessage = `📋 Found ${issues.length} issue${issues.length === 1 ? \"\" : \"s\"}:\\n\\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 success: true,\n data: {\n issues: await Promise.all(\n issues.map(async (issue) => {\n const state = await issue.state;\n const assignee = await issue.assignee;\n const team = await issue.team;\n\n return {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n url: issue.url,\n priority: issue.priority,\n state: state ? { name: state.name, type: state.type } : null,\n assignee: assignee ? { name: assignee.name, email: assignee.email } : null,\n team: team ? { name: team.name, key: team.key } : null,\n createdAt:\n issue.createdAt instanceof Date ? issue.createdAt.toISOString() : issue.createdAt,\n updatedAt:\n issue.updatedAt instanceof Date ? issue.updatedAt.toISOString() : issue.updatedAt,\n };\n })\n ),\n filters: filters ? { ...filters } : undefined,\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};\n",
|
|
15
|
-
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { updateIssueTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport type { 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: [\n \"update-linear-issue\",\n \"edit-linear-issue\",\n \"modify-linear-issue\",\n \"move-linear-issue\",\n \"change-linear-issue\",\n ],\n\n examples: [\n [\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 {\n name: \"User\",\n content: {\n text: \"Move issue COM2-7 to the ELIZA team\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll move issue COM2-7 to the ELIZA team.\",\n actions: [\"UPDATE_LINEAR_ISSUE\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Change the priority of BUG-456 to high and assign to john@example.com\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll change the priority of BUG-456 to high and assign it to john@example.com.\",\n actions: [\"UPDATE_LINEAR_ISSUE\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n const __avTextRaw = typeof message?.content?.text === \"string\" ? message.content.text : \"\";\n const __avText = __avTextRaw.toLowerCase();\n const __avKeywords = [\"update\", \"linear\", \"issue\"];\n const __avKeywordOk =\n __avKeywords.length > 0 && __avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n const __avRegex = /\\b(?:update|linear|issue)\\b/i;\n const __avRegexOk = __avRegex.test(__avText);\n const __avSource = String(message?.content?.source ?? message?.source ?? \"\");\n const __avExpectedSource = \"\";\n const __avSourceOk = __avExpectedSource\n ? __avSource === __avExpectedSource\n : Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n const __avOptions = options && typeof options === \"object\" ? options : {};\n const __avInputOk =\n __avText.trim().length > 0 ||\n Object.keys(__avOptions as Record<string, unknown>).length > 0 ||\n Boolean(message?.content && typeof message.content === \"object\");\n\n if (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n return false;\n }\n\n const __avLegacyValidate = async (runtime: IAgentRuntime, _message: Memory, _state?: State) => {\n const apiKey = runtime.getSetting(\"LINEAR_API_KEY\");\n return !!apiKey;\n };\n try {\n return Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n } catch {\n return false;\n }\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const prompt = updateIssueTemplate.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 update information\");\n }\n\n let issueId: string;\n const updates: Partial<LinearIssueInput> = {};\n\n try {\n const cleanedResponse = response\n .replace(/^```(?:json)?\\n?/, \"\")\n .replace(/\\n?```$/, \"\")\n .trim();\n const parsed = JSON.parse(cleanedResponse);\n\n issueId = parsed.issueId;\n if (!issueId) {\n throw new Error(\"Issue ID not found in parsed response\");\n }\n\n if (parsed.updates?.title) {\n updates.title = parsed.updates.title;\n }\n\n if (parsed.updates?.description) {\n updates.description = parsed.updates.description;\n }\n\n if (parsed.updates?.priority) {\n updates.priority = Number(parsed.updates.priority);\n }\n\n if (parsed.updates?.teamKey) {\n const teams = await linearService.getTeams();\n const team = teams.find(\n (t) => t.key.toLowerCase() === parsed.updates.teamKey.toLowerCase()\n );\n if (team) {\n updates.teamId = team.id;\n logger.info(`Moving issue to team: ${team.name} (${team.key})`);\n } else {\n logger.warn(`Team with key ${parsed.updates.teamKey} not found`);\n }\n }\n\n if (parsed.updates?.assignee) {\n const cleanAssignee = parsed.updates.assignee.replace(/^@/, \"\");\n const users = await linearService.getUsers();\n const user = users.find(\n (u) =>\n u.email === cleanAssignee ||\n u.name.toLowerCase().includes(cleanAssignee.toLowerCase())\n );\n if (user) {\n updates.assigneeId = user.id;\n } else {\n logger.warn(`User ${cleanAssignee} not found`);\n }\n }\n\n if (parsed.updates?.status) {\n const issue = await linearService.getIssue(issueId);\n const issueTeam = await issue.team;\n const teamId = updates.teamId || issueTeam?.id;\n if (!teamId) {\n logger.warn(\"Could not determine team for status update\");\n } else {\n const states = await linearService.getWorkflowStates(teamId);\n\n const state = states.find(\n (s) =>\n s.name.toLowerCase() === parsed.updates.status.toLowerCase() ||\n s.type.toLowerCase() === parsed.updates.status.toLowerCase()\n );\n\n if (state) {\n updates.stateId = state.id;\n logger.info(`Changing status to: ${state.name}`);\n } else {\n logger.warn(`Status ${parsed.updates.status} not found for team`);\n }\n }\n }\n\n if (parsed.updates?.labels && Array.isArray(parsed.updates.labels)) {\n const teamId = updates.teamId;\n const labels = await linearService.getLabels(teamId);\n const labelIds: string[] = [];\n\n for (const labelName of parsed.updates.labels) {\n if (labelName) {\n const label = labels.find((l) => l.name.toLowerCase() === labelName.toLowerCase());\n if (label) {\n labelIds.push(label.id);\n }\n }\n }\n\n updates.labelIds = labelIds;\n }\n } catch (parseError) {\n logger.warn(\"Failed to parse LLM response, falling back to regex parsing:\", parseError);\n\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 issueId = issueMatch[1];\n\n const titleMatch = content.match(/title to [\"'](.+?)[\"']/i);\n if (titleMatch) {\n updates.title = titleMatch[1];\n }\n\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\n if (Object.keys(updates).length === 0) {\n const errorMessage =\n \"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 = [];\n if (updates.title) updateSummary.push(`title: \"${updates.title}\"`);\n if (updates.priority)\n updateSummary.push(\n `priority: ${[\"\", \"urgent\", \"high\", \"normal\", \"low\"][updates.priority]}`\n );\n if (updates.teamId) updateSummary.push(`moved to team`);\n if (updates.assigneeId) updateSummary.push(`assigned to user`);\n if (updates.stateId) updateSummary.push(`status changed`);\n if (updates.labelIds) updateSummary.push(`labels updated`);\n\n const successMessage = `✅ Updated issue ${updatedIssue.identifier}: ${updateSummary.join(\", \")}\\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.join(\", \")}`,\n success: true,\n data: {\n issueId: updatedIssue.id,\n identifier: updatedIssue.identifier,\n updates: updates\n ? Object.fromEntries(\n Object.entries(updates).map(([key, value]) => [\n key,\n value instanceof Date ? value.toISOString() : value,\n ])\n )\n : undefined,\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};\n",
|
|
16
|
-
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { 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 dynamic: true,\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).map((item) => ({\n id: item.id,\n action: item.action,\n resource_type: item.resource_type,\n resource_id: item.resource_id,\n success: item.success,\n error: item.error,\n details: JSON.stringify(item.details) as string,\n timestamp:\n typeof item.timestamp === \"string\"\n ? item.timestamp\n : new Date(item.timestamp).toISOString(),\n })) as Array<Record<string, string | boolean | undefined>>,\n },\n };\n } catch (_error) {\n return {\n text: \"Error retrieving Linear activity\",\n };\n }\n },\n};\n",
|
|
17
|
-
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { Issue } from \"@linear/sdk\";\nimport type { LinearService } from \"../services/linear\";\n\nexport const linearIssuesProvider: Provider = {\n name: \"LINEAR_ISSUES\",\n description: \"Provides context about recent Linear issues\",\n dynamic: true,\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 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 const issuesList = await Promise.all(\n issues.map(async (issue: Issue) => {\n const [assignee, state] = await Promise.all([issue.assignee, issue.state]);\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: Issue) => ({\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};\n",
|
|
18
|
-
"import type
|
|
19
|
-
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { Team } from \"@linear/sdk\";\nimport type { LinearService } from \"../services/linear\";\n\nexport const linearTeamsProvider: Provider = {\n name: \"LINEAR_TEAMS\",\n description: \"Provides context about Linear teams\",\n dynamic: true,\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(\n (team: Team) => `- ${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: Team) => ({\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};\n",
|
|
20
|
-
"import { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport {\n type Comment,\n type Issue,\n type IssueLabel,\n LinearClient,\n type Project,\n type Team,\n type User,\n type WorkflowState,\n} from \"@linear/sdk\";\nimport type {\n ActivityDetailObject,\n ActivityDetailValue,\n LinearActivityItem,\n LinearCommentInput,\n LinearConfig,\n LinearIssueInput,\n LinearSearchFilters,\n} from \"../types\";\nimport { LinearAuthenticationError } from \"../types\";\n\nexport class LinearService extends Service {\n static serviceType = \"linear\";\n\n capabilityDescription =\n \"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 public workspaceId?: string;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n\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.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 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 private logActivity(\n action: string,\n resourceType: LinearActivityItem[\"resource_type\"],\n resourceId: string,\n details: Record<string, ActivityDetailValue>,\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 if (this.activityLog.length > 1000) {\n this.activityLog = this.activityLog.slice(-1000);\n }\n }\n\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 clearActivityLog(): void {\n this.activityLog = [];\n logger.info(\"Linear activity log cleared\");\n }\n\n async getTeams(): Promise<Team[]> {\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 }\n\n async getTeam(teamId: string): Promise<Team> {\n const team = await this.client.team(teamId);\n this.logActivity(\"get_team\", \"team\", teamId, { name: team.name }, true);\n return team;\n }\n\n async createIssue(input: LinearIssueInput): Promise<Issue> {\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(\n \"create_issue\",\n \"issue\",\n issue.id,\n {\n title: input.title,\n teamId: input.teamId,\n },\n true\n );\n\n return issue;\n }\n\n async getIssue(issueId: string): Promise<Issue> {\n const issue = await this.client.issue(issueId);\n this.logActivity(\n \"get_issue\",\n \"issue\",\n issueId,\n {\n title: issue.title,\n identifier: issue.identifier,\n },\n true\n );\n return issue;\n }\n\n async updateIssue(issueId: string, updates: Partial<LinearIssueInput>): Promise<Issue> {\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 }\n\n async deleteIssue(issueId: string): Promise<void> {\n const archivePayload = await this.client.archiveIssue(issueId);\n\n const success = await archivePayload.success;\n if (!success) {\n throw new Error(\"Failed to archive issue\");\n }\n\n this.logActivity(\"delete_issue\", \"issue\", issueId, { action: \"archived\" }, true);\n }\n\n async searchIssues(filters: LinearSearchFilters): Promise<Issue[]> {\n const filterObject: Record<string, string | number | boolean | object | null | undefined> = {};\n\n if (filters.query) {\n filterObject.or = [\n { title: { containsIgnoreCase: filters.query } },\n { description: { containsIgnoreCase: filters.query } },\n ];\n }\n\n if (filters.team) {\n const teams = await this.getTeams();\n const team = teams.find(\n (t) =>\n t.key.toLowerCase() === filters.team?.toLowerCase() ||\n t.name.toLowerCase() === filters.team?.toLowerCase()\n );\n\n if (team) {\n filterObject.team = { id: { eq: team.id } };\n }\n }\n\n if (filters.assignee && filters.assignee.length > 0) {\n const users = await this.getUsers();\n const assigneeIds = filters.assignee\n .map((assigneeName) => {\n const user = users.find(\n (u) =>\n u.email === assigneeName || u.name.toLowerCase().includes(assigneeName.toLowerCase())\n );\n return user?.id;\n })\n .filter(Boolean);\n\n if (assigneeIds.length > 0) {\n filterObject.assignee = { id: { in: assigneeIds } };\n }\n }\n\n if (filters.priority && filters.priority.length > 0) {\n filterObject.priority = { number: { in: filters.priority } };\n }\n\n // Add state filter\n if (filters.state && filters.state.length > 0) {\n filterObject.state = {\n name: { in: filters.state },\n };\n }\n\n if (filters.label && filters.label.length > 0) {\n filterObject.labels = {\n some: {\n name: { in: filters.label },\n },\n };\n }\n\n const query = this.client.issues({\n first: filters.limit || 50,\n filter: Object.keys(filterObject).length > 0 ? filterObject : undefined,\n });\n\n const issues = await query;\n const issueList = await issues.nodes;\n\n this.logActivity(\n \"search_issues\",\n \"issue\",\n \"search\",\n {\n filters: { ...filters } as ActivityDetailObject,\n count: issueList.length,\n },\n true\n );\n\n return issueList;\n }\n\n async createComment(input: LinearCommentInput): Promise<Comment> {\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(\n \"create_comment\",\n \"comment\",\n comment.id,\n {\n issueId: input.issueId,\n bodyLength: input.body.length,\n },\n true\n );\n\n return comment;\n }\n\n async getProjects(teamId?: string): Promise<Project[]> {\n // Linear SDK v51 requires manual team filtering on projects\n const query = this.client.projects({\n first: 100,\n });\n\n const projects = await query;\n let projectList = await projects.nodes;\n\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: Team) => team.id === teamId);\n return hasTeam ? project : null;\n })\n );\n projectList = filteredProjects.filter(Boolean) as Project[];\n }\n\n this.logActivity(\n \"list_projects\",\n \"project\",\n \"all\",\n {\n count: projectList.length,\n teamId,\n },\n true\n );\n\n return projectList;\n }\n\n async getProject(projectId: string): Promise<Project> {\n const project = await this.client.project(projectId);\n this.logActivity(\n \"get_project\",\n \"project\",\n projectId,\n {\n name: project.name,\n },\n true\n );\n return project;\n }\n\n async getUsers(): Promise<User[]> {\n const users = await this.client.users();\n const userList = await users.nodes;\n\n this.logActivity(\n \"list_users\",\n \"user\",\n \"all\",\n {\n count: userList.length,\n },\n true\n );\n\n return userList;\n }\n\n async getCurrentUser(): Promise<User> {\n const user = await this.client.viewer;\n this.logActivity(\n \"get_current_user\",\n \"user\",\n user.id,\n {\n email: user.email,\n name: user.name,\n },\n true\n );\n return user;\n }\n\n async getUserTeams(): Promise<Team[]> {\n const viewer = await this.client.viewer;\n const teams = await viewer.teams();\n const teamList = await teams.nodes;\n\n this.logActivity(\n \"list_user_teams\",\n \"team\",\n viewer.id,\n {\n count: teamList.length,\n },\n true\n );\n\n return teamList;\n }\n\n async getLabels(teamId?: string): Promise<IssueLabel[]> {\n const query = this.client.issueLabels({\n first: 100,\n filter: teamId\n ? {\n team: { id: { eq: teamId } },\n }\n : undefined,\n });\n\n const labels = await query;\n const labelList = await labels.nodes;\n\n this.logActivity(\n \"list_labels\",\n \"label\",\n \"all\",\n {\n count: labelList.length,\n teamId,\n },\n true\n );\n\n return labelList;\n }\n\n async getWorkflowStates(teamId: string): Promise<WorkflowState[]> {\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(\n \"list_workflow_states\",\n \"team\",\n teamId,\n {\n count: stateList.length,\n },\n true\n );\n\n return stateList;\n }\n}\n",
|
|
21
|
-
"export interface LinearConfig {\n LINEAR_API_KEY: string;\n LINEAR_WORKSPACE_ID?: string;\n}\n\n/** Primitive types allowed in activity details */\nexport type ActivityDetailPrimitive = string | number | boolean | null;\n\n/** Array types allowed in activity details */\nexport type ActivityDetailArray = ActivityDetailPrimitive[];\n\n/** Nested object allowed in activity details (one level deep) */\nexport type ActivityDetailObject = Record<string, ActivityDetailPrimitive | ActivityDetailArray>;\n\n/** Valid values for activity detail fields */\nexport type ActivityDetailValue =\n | ActivityDetailPrimitive\n | ActivityDetailArray\n | ActivityDetailObject\n | Date;\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, ActivityDetailValue>;\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\nexport interface CreateCommentParameters {\n issueId?: string;\n body?: string;\n}\n\nexport interface CreateIssueParameters {\n issueData?: Partial<LinearIssueInput>;\n}\n\nexport interface DeleteIssueParameters {\n issueId?: string;\n}\n\nexport interface SearchIssuesParameters {\n filters?: LinearSearchFilters;\n limit?: number;\n}\n\nexport interface LinearErrorResponse {\n message?: string;\n errors?: Array<{ message: string; path?: string[] }>;\n}\nexport class LinearAPIError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: LinearErrorResponse\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}\n",
|
|
22
|
-
"import type {
|
|
5
|
+
"import type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { getConnectorAccountManager, logger, promoteSubactionsToActions } from \"@elizaos/core\";\nimport { linearAction } from \"./actions/linear\";\nimport { createLinearConnectorAccountProvider } from \"./connector-account-provider\";\nimport { linearActivityProvider } from \"./providers/activity\";\nimport { linearIssuesProvider } from \"./providers/issues\";\nimport { linearProjectsProvider } from \"./providers/projects\";\nimport { linearTeamsProvider } from \"./providers/teams\";\nimport { registerLinearSearchCategory } from \"./search-category\";\nimport { LinearService } from \"./services/linear\";\n\nexport const linearPlugin: Plugin = {\n name: \"@elizaos/plugin-linear-ts\",\n description: \"Plugin for integrating with Linear issue tracking system\",\n services: [LinearService],\n actions: [...promoteSubactionsToActions(linearAction)],\n providers: [\n linearIssuesProvider,\n linearTeamsProvider,\n linearProjectsProvider,\n linearActivityProvider,\n ],\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n registerLinearSearchCategory(runtime);\n try {\n const manager = getConnectorAccountManager(runtime);\n manager.registerProvider(createLinearConnectorAccountProvider(runtime));\n } catch (err) {\n logger.warn(\n {\n src: \"plugin:linear\",\n err: err instanceof Error ? err.message : String(err),\n },\n \"Failed to register Linear provider with ConnectorAccountManager\"\n );\n }\n },\n};\n\nexport * from \"./accounts\";\nexport { createLinearConnectorAccountProvider } from \"./connector-account-provider\";\nexport { LinearService } from \"./services/linear\";\n",
|
|
6
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\n\nexport const DEFAULT_LINEAR_ACCOUNT_ID = \"default\";\nexport const DEFAULT_LINEAR_ACCOUNT_ROLE = \"OWNER\";\n\nexport interface LinearAccountConfig {\n accountId: string;\n role: typeof DEFAULT_LINEAR_ACCOUNT_ROLE;\n apiKey: string;\n workspaceId?: string;\n defaultTeamKey?: string;\n label?: string;\n}\n\ntype RawAccountRecord = Record<string, unknown>;\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction readSetting(runtime: IAgentRuntime, key: string): string | undefined {\n return nonEmptyString(runtime.getSetting(key));\n}\n\nexport function normalizeLinearAccountId(value: unknown): string {\n return nonEmptyString(value) ?? DEFAULT_LINEAR_ACCOUNT_ID;\n}\n\nexport function resolveLinearAccountId(\n runtime: IAgentRuntime,\n options?: Record<string, unknown>\n): string {\n const requested = nonEmptyString(options?.accountId) ?? nonEmptyString(options?.linearAccountId);\n if (requested) return requested;\n\n const configuredDefault =\n readSetting(runtime, \"LINEAR_DEFAULT_ACCOUNT_ID\") ?? readSetting(runtime, \"LINEAR_ACCOUNT_ID\");\n const accounts = readLinearAccounts(runtime);\n const defaultAccount = resolveLinearDefaultAccount(accounts, configuredDefault);\n return defaultAccount?.accountId ?? normalizeLinearAccountId(configuredDefault);\n}\n\nfunction parseAccountsJson(raw: string | undefined): RawAccountRecord[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return parsed.filter(\n (item): item is RawAccountRecord =>\n Boolean(item) && typeof item === \"object\" && !Array.isArray(item)\n );\n }\n if (parsed && typeof parsed === \"object\") {\n return Object.entries(parsed as Record<string, unknown>)\n .filter(([, value]) => value && typeof value === \"object\")\n .map(([id, value]) => ({\n ...(value as RawAccountRecord),\n accountId: (value as RawAccountRecord).accountId ?? id,\n }));\n }\n } catch {\n return [];\n }\n return [];\n}\n\nfunction readRawField(record: RawAccountRecord, keys: readonly string[]): string | undefined {\n const credentials =\n record.credentials && typeof record.credentials === \"object\"\n ? (record.credentials as RawAccountRecord)\n : {};\n const metadata =\n record.metadata && typeof record.metadata === \"object\"\n ? (record.metadata as RawAccountRecord)\n : {};\n const settings =\n record.settings && typeof record.settings === \"object\"\n ? (record.settings as RawAccountRecord)\n : {};\n\n for (const source of [record, credentials, metadata, settings]) {\n for (const key of keys) {\n const value = nonEmptyString(source[key]);\n if (value) return value;\n }\n }\n return undefined;\n}\n\nfunction accountFromRecord(record: RawAccountRecord): LinearAccountConfig | null {\n const accountId = normalizeLinearAccountId(record.accountId ?? record.id ?? record.name);\n const apiKey = readRawField(record, [\n \"LINEAR_API_KEY\",\n \"apiKey\",\n \"token\",\n \"accessToken\",\n \"access\",\n ]);\n if (!apiKey) return null;\n return {\n accountId,\n role: DEFAULT_LINEAR_ACCOUNT_ROLE,\n apiKey,\n workspaceId: readRawField(record, [\"LINEAR_WORKSPACE_ID\", \"workspaceId\"]),\n defaultTeamKey: readRawField(record, [\"LINEAR_DEFAULT_TEAM_KEY\", \"defaultTeamKey\"]),\n label: nonEmptyString(record.label ?? record.displayName),\n };\n}\n\nfunction addAccount(\n accounts: Map<string, LinearAccountConfig>,\n account: LinearAccountConfig | null\n): void {\n if (account) {\n accounts.set(account.accountId, account);\n }\n}\n\nexport function readLinearAccounts(runtime: IAgentRuntime): LinearAccountConfig[] {\n const accounts = new Map<string, LinearAccountConfig>();\n const characterConfig = runtime.character?.settings?.linear as { accounts?: unknown } | undefined;\n const characterAccounts = characterConfig?.accounts;\n\n if (Array.isArray(characterAccounts)) {\n for (const item of characterAccounts) {\n if (item && typeof item === \"object\") {\n addAccount(accounts, accountFromRecord(item as RawAccountRecord));\n }\n }\n } else if (characterAccounts && typeof characterAccounts === \"object\") {\n for (const [id, value] of Object.entries(characterAccounts as Record<string, unknown>)) {\n if (value && typeof value === \"object\") {\n addAccount(\n accounts,\n accountFromRecord({\n ...(value as RawAccountRecord),\n accountId: (value as RawAccountRecord).accountId ?? id,\n })\n );\n }\n }\n }\n\n for (const record of parseAccountsJson(readSetting(runtime, \"LINEAR_ACCOUNTS\"))) {\n addAccount(accounts, accountFromRecord(record));\n }\n\n const apiKey = readSetting(runtime, \"LINEAR_API_KEY\");\n if (apiKey) {\n addAccount(accounts, {\n accountId: normalizeLinearAccountId(\n readSetting(runtime, \"LINEAR_ACCOUNT_ID\") ??\n readSetting(runtime, \"LINEAR_DEFAULT_ACCOUNT_ID\")\n ),\n role: DEFAULT_LINEAR_ACCOUNT_ROLE,\n apiKey,\n workspaceId: readSetting(runtime, \"LINEAR_WORKSPACE_ID\"),\n defaultTeamKey: readSetting(runtime, \"LINEAR_DEFAULT_TEAM_KEY\"),\n });\n }\n\n return Array.from(accounts.values());\n}\n\nexport function resolveLinearAccount(\n accounts: readonly LinearAccountConfig[],\n accountId: string\n): LinearAccountConfig | null {\n return accounts.find((account) => account.accountId === accountId) ?? null;\n}\n\nexport function resolveLinearDefaultAccount(\n accounts: readonly LinearAccountConfig[],\n accountId?: string\n): LinearAccountConfig | null {\n const normalized = normalizeLinearAccountId(accountId);\n return (\n resolveLinearAccount(accounts, normalized) ??\n resolveLinearAccount(accounts, DEFAULT_LINEAR_ACCOUNT_ID) ??\n accounts.find((account) => account.role === DEFAULT_LINEAR_ACCOUNT_ROLE) ??\n accounts[0] ??\n null\n );\n}\n\nexport function hasLinearAccountConfig(\n runtime: IAgentRuntime,\n options?: Record<string, unknown>\n): boolean {\n const accountId = resolveLinearAccountId(runtime, options);\n return Boolean(resolveLinearAccount(readLinearAccounts(runtime), accountId));\n}\n",
|
|
7
|
+
"import type { HandlerOptions, IAgentRuntime } from \"@elizaos/core\";\nimport { resolveLinearAccountId } from \"../accounts\";\n\nexport function getLinearActionOptions(\n options?: HandlerOptions | Record<string, unknown>\n): Record<string, unknown> {\n const direct = (options ?? {}) as Record<string, unknown>;\n const parameters =\n direct.parameters && typeof direct.parameters === \"object\"\n ? (direct.parameters as Record<string, unknown>)\n : {};\n return { ...direct, ...parameters };\n}\n\nexport function getLinearAccountId(\n runtime: IAgentRuntime,\n options?: HandlerOptions | Record<string, unknown>\n): string {\n return resolveLinearAccountId(runtime, getLinearActionOptions(options));\n}\n\nexport const linearAccountIdParameter = {\n name: \"accountId\",\n description:\n \"Optional Linear account id from LINEAR_ACCOUNTS. Defaults to LINEAR_DEFAULT_ACCOUNT_ID or the legacy single API key.\",\n required: false,\n schema: { type: \"string\" as const },\n};\n",
|
|
8
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n requireConfirmation,\n type State,\n} from \"@elizaos/core\";\nimport type { LinearService } from \"../services/linear\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nconst CLEAR_ACTIVITY_TIMEOUT_MS = 10_000;\n\nexport const clearActivityAction: Action = {\n name: \"CLEAR_LINEAR_ACTIVITY\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description:\n \"Clear the cached Linear activity log for the connected Linear account. Use when the user asks to reset, wipe, or refresh their Linear activity history before pulling a fresh view of recent issue and comment events.\",\n descriptionCompressed: \"clear Linear activity log\",\n similes: [\"clear-linear-activity\", \"reset-linear-activity\", \"delete-linear-activity\"],\n parameters: [linearAccountIdParameter],\n\n examples: [\n [\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 {\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\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"clear\", \"linear\", \"activity\"],\n regexAlternation: \"clear|linear|activity\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n // Two-phase confirmation: clearing the activity log is destructive\n // and not undoable from the agent's side.\n const decision = await requireConfirmation({\n runtime,\n message,\n actionName: \"CLEAR_LINEAR_ACTIVITY\",\n pendingKey: `clear_log:${accountId}`,\n prompt: 'Clear the Linear activity log? Reply \"yes\" to confirm.',\n callback,\n });\n if (decision.status === \"pending\") {\n return {\n text: \"Awaiting confirmation to clear Linear activity.\",\n success: true,\n data: { awaitingUserInput: true },\n };\n }\n if (decision.status === \"cancelled\") {\n const cancelMessage = \"Clear of Linear activity cancelled.\";\n await callback?.({ text: cancelMessage, source: message.content.source });\n return {\n text: cancelMessage,\n success: true,\n data: { cancelled: true },\n };\n }\n\n await Promise.race([\n linearService.clearActivityLog(accountId),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Linear clear activity timeout\")),\n CLEAR_ACTIVITY_TIMEOUT_MS\n )\n ),\n ]);\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};\n",
|
|
9
|
+
"import type { IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { hasLinearAccountConfig } from \"../accounts\";\n\nexport interface LinearIntentValidationSpec {\n readonly keywords: readonly string[];\n /** Alternation body only, e.g. `clear|linear|activity` for `/\\b(?:…)\\b/i`. */\n readonly regexAlternation: string;\n}\n\n/**\n * Shared action validator: hard availability only. Intent/keyword routing is\n * handled by action retrieval, while this confirms Linear is configured.\n */\nexport async function validateLinearActionIntent(\n runtime: IAgentRuntime,\n _message: Memory,\n _state: State | undefined,\n _spec: LinearIntentValidationSpec\n): Promise<boolean> {\n try {\n return hasLinearAccountConfig(runtime);\n } catch {\n return false;\n }\n}\n",
|
|
10
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { createCommentTemplate } from \"../prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { CreateCommentParameters } from \"../types/index.js\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport { getStringValue, parseLinearPromptResponse } from \"./parseLinearPrompt.js\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nexport const createCommentAction: Action = {\n name: \"CREATE_LINEAR_COMMENT\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description: \"Add a comment to a Linear issue\",\n descriptionCompressed: \"add comment Linear issue\",\n parameters: [\n {\n name: \"issueId\",\n description: \"Linear issue id or identifier to comment on.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"body\",\n description: \"Comment body to add to the issue.\",\n required: false,\n schema: { type: \"string\" },\n },\n linearAccountIdParameter,\n ],\n similes: [\n \"create-linear-comment\",\n \"add-linear-comment\",\n \"comment-on-linear-issue\",\n \"reply-to-linear-issue\",\n ],\n\n examples: [\n [\n {\n name: \"User\",\n content: {\n text: \"Comment on ENG-123: This looks good to me\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll add your comment to issue ENG-123.\",\n actions: [\"CREATE_LINEAR_COMMENT\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Tell the login bug that we need more information from QA\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll add that comment to the login bug issue.\",\n actions: [\"CREATE_LINEAR_COMMENT\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Reply to COM2-7: Thanks for the update, I'll look into it\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll add your reply to issue COM2-7.\",\n actions: [\"CREATE_LINEAR_COMMENT\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"create\", \"linear\", \"comment\"],\n regexAlternation: \"create|linear|comment\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n const content = message.content.text;\n if (!content) {\n const errorMessage = \"Please provide a message with the issue 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 let issueId: string;\n let commentBody: string;\n\n const params = _options?.parameters as CreateCommentParameters | undefined;\n if (params?.issueId && params?.body) {\n issueId = params.issueId;\n commentBody = params.body;\n } else {\n const prompt = createCommentTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (!response) {\n const issueMatch = content.match(\n /(?:comment on|add.*comment.*to|reply to|tell)\\s+(\\w+-\\d+):?\\s*(.*)/i\n );\n if (issueMatch) {\n issueId = issueMatch[1];\n commentBody = issueMatch[2].trim();\n } else {\n throw new Error(\"Could not understand comment request\");\n }\n } else {\n try {\n const parsed = parseLinearPromptResponse(response);\n if (Object.keys(parsed).length === 0) {\n throw new Error(\"No fields found in model response\");\n }\n\n const parsedIssueId = getStringValue(parsed.issueId);\n const issueDescription = getStringValue(parsed.issueDescription);\n const parsedCommentBody = getStringValue(parsed.commentBody) ?? \"\";\n\n if (parsedIssueId) {\n issueId = parsedIssueId;\n commentBody = parsedCommentBody;\n } else if (issueDescription) {\n const filters: { query: string; limit: number; team?: string } = {\n query: issueDescription,\n limit: 5,\n };\n\n const defaultTeamKey =\n linearService.getDefaultTeamKey(accountId) ??\n (runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string);\n if (defaultTeamKey) {\n filters.team = defaultTeamKey;\n }\n\n const issues = await linearService.searchIssues(filters, accountId);\n\n if (issues.length === 0) {\n const errorMessage = `No issues found matching \"${issueDescription}\". Please provide a specific 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 if (issues.length === 1) {\n issueId = issues[0].identifier;\n commentBody = parsedCommentBody;\n } else {\n const issueList = await Promise.all(\n 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 );\n\n const clarifyMessage = `Found multiple issues matching \"${issueDescription}\":\\n${issueList.join(\"\\n\")}\\n\\nPlease specify which issue to comment on by its ID.`;\n await callback?.({\n text: clarifyMessage,\n source: message.content.source,\n });\n\n return {\n text: clarifyMessage,\n success: false,\n data: {\n multipleMatches: true,\n issues: issues.map((i) => ({\n id: i.id,\n identifier: i.identifier,\n title: i.title,\n })),\n pendingComment: parsedCommentBody,\n },\n };\n }\n } else {\n throw new Error(\"No issue identifier or description found\");\n }\n\n const commentType = getStringValue(parsed.commentType)?.toLowerCase();\n if (commentType && commentType !== \"note\") {\n commentBody = `[${commentType.toUpperCase()}] ${commentBody}`;\n }\n } catch (parseError) {\n logger.warn(\"Failed to parse LLM response, falling back to regex:\", parseError);\n const issueMatch = content.match(\n /(?:comment on|add.*comment.*to|reply to|tell)\\s+(\\w+-\\d+):?\\s*(.*)/i\n );\n\n if (!issueMatch) {\n const errorMessage =\n '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 issueId = issueMatch[1];\n commentBody = issueMatch[2].trim();\n }\n }\n }\n\n if (!commentBody || commentBody.length === 0) {\n const errorMessage = \"Please provide the 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 issue = await linearService.getIssue(issueId, accountId);\n\n const comment = await linearService.createComment(\n {\n issueId: issue.id,\n body: commentBody,\n },\n accountId\n );\n\n const successMessage = `✅ Comment added to issue ${issue.identifier}: \"${commentBody}\"`;\n await callback?.({\n text: successMessage,\n source: message.content.source,\n });\n\n return {\n text: `Added comment to issue ${issue.identifier}`,\n success: true,\n data: {\n commentId: comment.id,\n issueId: issue.id,\n issueIdentifier: issue.identifier,\n commentBody: commentBody,\n createdAt:\n comment.createdAt instanceof Date ? comment.createdAt.toISOString() : comment.createdAt,\n accountId,\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};\n",
|
|
11
|
+
"/**\n * Prompt templates for Linear plugin actions.\n *\n * Handlebars-style template syntax:\n * - {{variableName}} for simple substitution\n * - {{#each items}}...{{/each}} for iteration\n * - {{#if condition}}...{{/if}} for conditionals\n */\n\nexport const createCommentTemplate = `Extract comment details from the user's request to add a comment to a Linear issue.\n\nUser request: \"{{userMessage}}\"\n\nThe user might express this in various ways:\n- \"Comment on ENG-123: This looks good\"\n- \"Tell ENG-123 that the fix is ready for testing\"\n- \"Add a note to the login bug saying we need more info\"\n- \"Reply to COM2-7: Thanks for the update\"\n- \"Let the payment issue know that it's blocked by API changes\"\n\nRespond with JSON only. Use this shape:\n{\n \"issueId\": \"Direct issue ID if explicitly mentioned, for example ENG-123\",\n \"issueDescription\": \"Description or keywords of the issue if no ID was provided\",\n \"commentBody\": \"The actual comment content to add\",\n \"commentType\": \"note|reply|update|question|feedback\"\n}\n\nExtract the core message the user wants to convey as the comment body.\nOmit unknown fields. Output only the JSON object, with no prose before or after it.`;\n\nexport const CREATE_COMMENT_TEMPLATE = createCommentTemplate;\n\nexport const createIssueTemplate = `Given the user's request, extract the information needed to create a Linear issue.\n\nUser request: \"{{userMessage}}\"\n\nRespond with JSON only. Use this shape:\n{\n \"title\": \"Brief, clear issue title\",\n \"description\": \"Detailed description of the issue\",\n \"teamKey\": \"Team key if mentioned, such as ENG or PROD\",\n \"priority\": 3,\n \"labels\": [\"label\"],\n \"assignee\": \"Assignee username or email if mentioned\"\n}\n\nOmit optional fields when they are not provided. Output only the JSON object, with no prose before or after it.`;\n\nexport const CREATE_ISSUE_TEMPLATE = createIssueTemplate;\n\nexport const deleteIssueTemplate = `Given the user's request to delete/archive a Linear issue, extract the issue identifier.\n\nUser request: \"{{userMessage}}\"\n\nRespond with JSON only:\n{\n \"issueId\": \"The issue identifier, such as ENG-123 or COM2-7\"\n}\n\nOutput only the JSON object, with no prose before or after it.`;\n\nexport const DELETE_ISSUE_TEMPLATE = deleteIssueTemplate;\n\nexport const getActivityTemplate = `Extract activity filter criteria from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might ask for activity in various ways:\n- \"Show me today's activity\" → time range filter\n- \"What issues were created?\" → action type filter\n- \"What did John do yesterday?\" → user filter + time range\n- \"Activity on ENG-123\" → resource filter\n- \"Recent comment activity\" → action type + recency\n- \"Failed operations this week\" → success filter + time range\n\nRespond with JSON only. Use this shape:\n{\n \"timeRange\": {\n \"period\": \"today|yesterday|this-week|last-week|this-month\",\n \"from\": \"ISO datetime if a specific start is mentioned\",\n \"to\": \"ISO datetime if a specific end is mentioned\"\n },\n \"actionTypes\": [\"create_issue\"],\n \"resourceTypes\": [\"issue\"],\n \"resourceId\": \"Specific resource ID if mentioned, such as ENG-123\",\n \"user\": \"User name, or me for current user\",\n \"successFilter\": \"success|failed|all\",\n \"limit\": 10\n}\n\nOnly include fields that are clearly mentioned. Output only the JSON object, with no prose before or after it.`;\n\nexport const GET_ACTIVITY_TEMPLATE = getActivityTemplate;\n\nexport const getIssueTemplate = `Extract issue identification from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might reference an issue by:\n- Direct ID (e.g., \"ENG-123\", \"COM2-7\")\n- Title keywords (e.g., \"the login bug\", \"that payment issue\")\n- Assignee (e.g., \"John's high priority task\")\n- Recency (e.g., \"the latest bug\", \"most recent issue\")\n- Team context (e.g., \"newest issue in ELIZA team\")\n\nRespond with JSON only. Use directId when an issue ID is explicitly mentioned:\n{\n \"directId\": \"Issue ID such as ENG-123\"\n}\n\nWhen no issue ID is provided, use searchBy fields:\n{\n \"searchBy\": {\n \"title\": \"Keywords from issue title if mentioned\",\n \"assignee\": \"Name or email of assignee if mentioned\",\n \"priority\": \"urgent|high|normal|low|1|2|3|4\",\n \"team\": \"Team name or key if mentioned\",\n \"state\": \"Issue state if mentioned, such as todo, in-progress, or done\",\n \"recency\": \"latest|newest|recent|last\",\n \"type\": \"bug|feature|task\"\n }\n}\n\nOnly include fields that are clearly mentioned or implied. Output only the JSON object, with no prose before or after it.`;\n\nexport const GET_ISSUE_TEMPLATE = getIssueTemplate;\n\nexport const listProjectsTemplate = `Extract project filter criteria from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might ask for projects in various ways:\n- \"Show me all projects\" → list all projects\n- \"Active projects\" → filter by state (active/planned/completed)\n- \"Projects due this quarter\" → filter by target date\n- \"Which projects is Sarah managing?\" → filter by lead/owner\n- \"Projects with high priority issues\" → filter by contained issue priority\n- \"Projects for the engineering team\" → filter by team\n- \"Completed projects\" → filter by state\n- \"Projects starting next month\" → filter by start date\n\nRespond with JSON only. Use this shape:\n{\n \"teamFilter\": \"Team name or key if mentioned\",\n \"stateFilter\": \"active|planned|completed|all\",\n \"dateFilter\": {\n \"type\": \"due|starting\",\n \"period\": \"this-week|this-month|this-quarter|next-month|next-quarter\",\n \"from\": \"ISO date if a specific start is mentioned\",\n \"to\": \"ISO date if a specific end is mentioned\"\n },\n \"leadFilter\": \"Project lead name if mentioned\",\n \"showAll\": true\n}\n\nOnly include fields that are clearly mentioned. Output only the JSON object, with no prose before or after it.`;\n\nexport const LIST_PROJECTS_TEMPLATE = listProjectsTemplate;\n\nexport const listTeamsTemplate = `Extract team filter criteria from the user's request.\n\nUser request: \"{{userMessage}}\"\n\nThe user might ask for teams in various ways:\n- \"Show me all teams\" → list all teams\n- \"Engineering teams\" → filter by teams with engineering in name/description\n- \"List teams I'm part of\" → filter by membership\n- \"Which teams work on the mobile app?\" → filter by description/focus\n- \"Show me the ELIZA team details\" → specific team lookup\n- \"Active teams\" → teams with recent activity\n- \"Frontend and backend teams\" → multiple team types\n\nRespond with JSON only. Use this shape:\n{\n \"nameFilter\": \"Keywords to search in team names\",\n \"specificTeam\": \"Specific team name or key if looking for one team\",\n \"myTeams\": true,\n \"showAll\": true,\n \"includeDetails\": true\n}\n\nOnly include fields that are clearly mentioned. Output only the JSON object, with no prose before or after it.`;\n\nexport const LIST_TEAMS_TEMPLATE = listTeamsTemplate;\n\nexport const searchIssuesTemplate = `Extract search criteria from the user's request for Linear issues.\n\nUser request: \"{{userMessage}}\"\n\nThe user might express searches in various ways:\n- \"Show me what John is working on\" → assignee filter\n- \"Any blockers for the next release?\" → priority/label filters\n- \"Issues created this week\" → date range filter\n- \"My high priority bugs\" → assignee (current user) + priority + label\n- \"Unassigned tasks in the backend team\" → no assignee + team filter\n- \"What did Sarah close yesterday?\" → assignee + state + date\n- \"Bugs that are almost done\" → label + state filter\n- \"Show me the oldest open issues\" → state + sort order\n\nRespond with JSON only. Use this shape:\n{\n \"query\": \"General search text for title or description\",\n \"states\": [\"In Progress\"],\n \"assignees\": [\"me\"],\n \"priorities\": [\"high\"],\n \"teams\": [\"ENG\"],\n \"labels\": [\"bug\"],\n \"hasAssignee\": true,\n \"dateRange\": {\n \"field\": \"created|updated|completed\",\n \"period\": \"today|yesterday|this-week|last-week|this-month|last-month\",\n \"from\": \"ISO date if a specific start is mentioned\",\n \"to\": \"ISO date if a specific end is mentioned\"\n },\n \"sort\": {\n \"field\": \"created|updated|priority\",\n \"order\": \"asc|desc\"\n },\n \"limit\": 10\n}\n\nOnly include fields that are clearly mentioned or implied. For \"my\" issues, set assignees to [\"me\"]. Output only the JSON object, with no prose before or after it.`;\n\nexport const SEARCH_ISSUES_TEMPLATE = searchIssuesTemplate;\n\nexport const updateIssueTemplate = `Given the user's request to update a Linear issue, extract the information needed.\n\nUser request: \"{{userMessage}}\"\n\nRespond with JSON only. Use this shape:\n{\n \"issueId\": \"Issue identifier such as ENG-123 or COM2-7\",\n \"updates\": {\n \"title\": \"New title if changing the title\",\n \"description\": \"New description if changing the description\",\n \"priority\": 3,\n \"teamKey\": \"New team key if moving to another team, such as ENG, ELIZA, or COM2\",\n \"assignee\": \"New assignee username or email if changing\",\n \"status\": \"todo|in-progress|done|canceled\",\n \"labels\": [\"label\"]\n }\n}\n\nOnly include fields that are being updated. Use an empty labels array to clear all labels. Output only the JSON object, with no prose before or after it.`;\n\nexport const UPDATE_ISSUE_TEMPLATE = updateIssueTemplate;\n",
|
|
12
|
+
"const EMPTY_SCALAR_VALUES = new Set([\"\", \"none\", \"null\", \"undefined\", \"n/a\", \"not provided\"]);\n\nconst EMPTY_LIST_VALUES = new Set([...EMPTY_SCALAR_VALUES, \"clear\", \"clear all\", \"no labels\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stripWrappingQuotes(value: string): string {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1).trim();\n }\n return trimmed;\n}\n\nfunction normalizeListEntry(value: string): string {\n return stripWrappingQuotes(value.replace(/^\\s*[-*]\\s*/, \"\").trim());\n}\n\nfunction splitListString(value: string): string[] {\n let trimmed = value.trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n trimmed = trimmed.slice(1, -1);\n }\n\n return trimmed.split(/[,\\n]/).map(normalizeListEntry).filter(Boolean);\n}\n\nexport function parseLinearPromptResponse(response: string): Record<string, unknown> {\n try {\n const trimmed = response.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n const candidate = (fenced?.[1] ?? trimmed).trim();\n const firstBrace = candidate.indexOf(\"{\");\n const lastBrace = candidate.lastIndexOf(\"}\");\n if (firstBrace < 0 || lastBrace <= firstBrace) return {};\n const parsed = JSON.parse(candidate.slice(firstBrace, lastBrace + 1));\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nexport function getRecordValue(value: unknown): Record<string, unknown> | undefined {\n if (isRecord(value)) {\n return value;\n }\n\n if (typeof value === \"string\" && value.trim().startsWith(\"{\")) {\n const parsed = parseLinearPromptResponse(value);\n return Object.keys(parsed).length > 0 ? parsed : undefined;\n }\n\n return undefined;\n}\n\nexport function getStringValue(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n const normalized = stripWrappingQuotes(value);\n return EMPTY_SCALAR_VALUES.has(normalized.toLowerCase()) ? undefined : normalized;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return undefined;\n}\n\nexport function getStringArrayValue(value: unknown): string[] | undefined {\n if (Array.isArray(value)) {\n return value\n .flatMap((entry) => {\n if (entry == null) {\n return [];\n }\n if (typeof entry === \"string\") {\n return splitListString(entry);\n }\n return [String(entry)];\n })\n .filter(Boolean);\n }\n\n if (typeof value === \"string\") {\n const normalized = stripWrappingQuotes(value);\n if (EMPTY_LIST_VALUES.has(normalized.toLowerCase())) {\n return [];\n }\n return splitListString(normalized);\n }\n\n return undefined;\n}\n\nexport function getBooleanValue(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if ([\"true\", \"yes\", \"y\"].includes(normalized)) {\n return true;\n }\n if ([\"false\", \"no\", \"n\"].includes(normalized)) {\n return false;\n }\n }\n\n return undefined;\n}\n\nexport function getNumberValue(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim();\n if (!normalized) {\n return undefined;\n }\n\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n return undefined;\n}\n\nexport function getPriorityNumberValue(value: unknown): number | undefined {\n const numeric = getNumberValue(value);\n if (numeric) {\n return numeric;\n }\n\n const priority = getStringValue(value)?.toLowerCase();\n if (!priority) {\n return undefined;\n }\n\n const priorityMap: Record<string, number> = {\n urgent: 1,\n high: 2,\n normal: 3,\n medium: 3,\n low: 4,\n };\n\n return priorityMap[priority];\n}\n",
|
|
13
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { createIssueTemplate } from \"../prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { CreateIssueParameters, LinearIssueInput } from \"../types/index.js\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport {\n getPriorityNumberValue,\n getStringArrayValue,\n getStringValue,\n parseLinearPromptResponse,\n} from \"./parseLinearPrompt.js\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nexport const createIssueAction: Action = {\n name: \"CREATE_LINEAR_ISSUE\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description:\n \"Create a new Linear issue with title, description, priority, team, assignee, and labels. Use when the user wants to file, log, or track a new ticket, bug, story, or task in Linear from chat.\",\n descriptionCompressed: \"create new issue Linear\",\n parameters: [\n {\n name: \"issueData\",\n description: \"Structured Linear issue fields.\",\n required: false,\n schema: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n description: { type: \"string\" },\n priority: { type: \"number\" },\n teamId: { type: \"string\" },\n assigneeId: { type: \"string\" },\n labelIds: { type: \"array\", items: { type: \"string\" } },\n },\n },\n },\n linearAccountIdParameter,\n ],\n similes: [\"create-linear-issue\", \"new-linear-issue\", \"add-linear-issue\"],\n\n examples: [\n [\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 {\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\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"create\", \"linear\", \"issue\"],\n regexAlternation: \"create|linear|issue\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\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 const params = _options?.parameters as CreateIssueParameters | undefined;\n const structuredData = params?.issueData;\n\n let issueData: Partial<LinearIssueInput>;\n\n if (structuredData) {\n issueData = structuredData;\n } else {\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 const parsed = parseLinearPromptResponse(response);\n if (Object.keys(parsed).length === 0) {\n throw new Error(\"No fields found in model response\");\n }\n\n issueData = {\n title: getStringValue(parsed.title),\n description: getStringValue(parsed.description),\n priority: getPriorityNumberValue(parsed.priority),\n };\n\n const teamKey = getStringValue(parsed.teamKey);\n if (teamKey) {\n const teams = await linearService.getTeams(accountId);\n const team = teams.find((t) => t.key.toLowerCase() === teamKey.toLowerCase());\n if (team) {\n issueData.teamId = team.id;\n }\n }\n\n const assignee = getStringValue(parsed.assignee);\n if (assignee) {\n const cleanAssignee = assignee.replace(/^@/, \"\");\n\n const users = await linearService.getUsers(accountId);\n const user = users.find(\n (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 const parsedLabels = getStringArrayValue(parsed.labels);\n if (parsedLabels && parsedLabels.length > 0) {\n const labels = await linearService.getLabels(issueData.teamId, accountId);\n const labelIds: string[] = [];\n\n for (const labelName of parsedLabels) {\n const label = labels.find((l) => l.name.toLowerCase() === labelName.toLowerCase());\n if (label) {\n labelIds.push(label.id);\n }\n }\n\n if (labelIds.length > 0) {\n issueData.labelIds = labelIds;\n }\n }\n\n if (!issueData.teamId) {\n const defaultTeamKey =\n linearService.getDefaultTeamKey(accountId) ??\n (runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string);\n\n if (defaultTeamKey) {\n const teams = await linearService.getTeams(accountId);\n const defaultTeam = teams.find(\n (t) => t.key.toLowerCase() === defaultTeamKey.toLowerCase()\n );\n if (defaultTeam) {\n issueData.teamId = defaultTeam.id;\n logger.info(\n `Using configured default team: ${defaultTeam.name} (${defaultTeam.key})`\n );\n } else {\n logger.warn(`Default team key ${defaultTeamKey} not found`);\n }\n }\n\n if (!issueData.teamId) {\n const teams = await linearService.getTeams(accountId);\n if (teams.length > 0) {\n issueData.teamId = teams[0].id;\n logger.warn(`No team specified, using first available team: ${teams[0].name}`);\n }\n }\n }\n } catch (parseError) {\n logger.error(\"Failed to parse LLM response:\", parseError);\n issueData = {\n title: content.length > 100 ? `${content.substring(0, 100)}...` : content,\n description: content,\n };\n\n const defaultTeamKey =\n linearService.getDefaultTeamKey(accountId) ??\n (runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string);\n const teams = await linearService.getTeams(accountId);\n\n if (defaultTeamKey) {\n const defaultTeam = teams.find(\n (t) => t.key.toLowerCase() === defaultTeamKey.toLowerCase()\n );\n if (defaultTeam) {\n issueData.teamId = defaultTeam.id;\n logger.info(\n `Using configured default team for fallback: ${defaultTeam.name} (${defaultTeam.key})`\n );\n }\n }\n\n if (!issueData.teamId && teams.length > 0) {\n issueData.teamId = teams[0].id;\n logger.warn(`Using first available 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 if (!issueData.teamId) {\n const errorMessage =\n \"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, accountId);\n\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 accountId,\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};\n",
|
|
14
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { LinearService } from \"../services/linear\";\nimport type { DeleteCommentParameters } from \"../types/index.js\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nexport const deleteCommentAction: Action = {\n name: \"DELETE_LINEAR_COMMENT\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description:\n \"Delete a specific Linear comment by its comment id. Use when the user asks to remove, retract, or erase a comment they previously left on a Linear issue.\",\n descriptionCompressed: \"delete Linear comment id\",\n parameters: [\n {\n name: \"commentId\",\n description: \"Linear comment id to delete.\",\n required: false,\n schema: { type: \"string\" },\n },\n linearAccountIdParameter,\n ],\n similes: [\"remove-linear-comment\", \"erase-linear-comment\"],\n\n examples: [\n [\n {\n name: \"User\",\n content: { text: \"Delete comment abc-123 from ENG-456.\" },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll delete that comment.\",\n actions: [\"DELETE_LINEAR_COMMENT\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"delete\", \"remove\", \"linear\", \"comment\"],\n regexAlternation: \"delete|remove|linear|comment\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n const params = _options?.parameters as DeleteCommentParameters | undefined;\n const commentId = params?.commentId?.trim() ?? \"\";\n\n if (!commentId) {\n const errorMessage = \"Please provide a commentId to delete.\";\n await callback?.({ text: errorMessage, source: message.content.source });\n return { text: errorMessage, success: false };\n }\n\n await linearService.deleteComment(commentId, accountId);\n\n const successMessage = `Deleted comment ${commentId}.`;\n await callback?.({ text: successMessage, source: message.content.source });\n return {\n text: successMessage,\n success: true,\n data: { commentId, accountId },\n };\n } catch (error) {\n logger.error(\"Failed to delete comment:\", error);\n const errorMessage = `Failed to delete comment: ${error instanceof Error ? error.message : \"Unknown error\"}`;\n await callback?.({ text: errorMessage, source: message.content.source });\n return { text: errorMessage, success: false };\n }\n },\n};\n",
|
|
15
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n requireConfirmation,\n type State,\n} from \"@elizaos/core\";\nimport { deleteIssueTemplate } from \"../prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { DeleteIssueParameters } from \"../types/index.js\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport { getStringValue, parseLinearPromptResponse } from \"./parseLinearPrompt.js\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nconst LINEAR_MODEL_TIMEOUT_MS = 15_000;\nconst LINEAR_ISSUE_TITLE_MAX_CHARS = 300;\n\nexport const deleteIssueAction: Action = {\n name: \"DELETE_LINEAR_ISSUE\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description: \"Delete (archive) an issue in Linear\",\n descriptionCompressed: \"delete (archive) issue Linear\",\n parameters: [\n {\n name: \"issueId\",\n description: \"Linear issue id or identifier to archive.\",\n required: false,\n schema: { type: \"string\" },\n },\n linearAccountIdParameter,\n ],\n similes: [\n \"delete-linear-issue\",\n \"archive-linear-issue\",\n \"remove-linear-issue\",\n \"close-linear-issue\",\n ],\n\n examples: [\n [\n {\n name: \"User\",\n content: {\n text: \"Delete issue ENG-123\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll archive issue ENG-123 for you.\",\n actions: [\"DELETE_LINEAR_ISSUE\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Remove COM2-7 from Linear\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll archive issue COM2-7 in Linear.\",\n actions: [\"DELETE_LINEAR_ISSUE\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Archive the bug report BUG-456\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll archive issue BUG-456 for you.\",\n actions: [\"DELETE_LINEAR_ISSUE\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"delete\", \"linear\", \"issue\"],\n regexAlternation: \"delete|linear|issue\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n const content = message.content.text;\n if (!content) {\n const errorMessage = \"Please specify which issue to delete.\";\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 issueId: string;\n\n const params = _options?.parameters as DeleteIssueParameters | undefined;\n if (params?.issueId) {\n issueId = params.issueId;\n } else {\n const prompt = deleteIssueTemplate.replace(\"{{userMessage}}\", content);\n\n const response = await Promise.race([\n runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Linear issue extraction timeout\")),\n LINEAR_MODEL_TIMEOUT_MS\n )\n ),\n ]);\n\n if (!response) {\n throw new Error(\"Failed to extract issue identifier\");\n }\n\n try {\n const parsed = parseLinearPromptResponse(response);\n if (Object.keys(parsed).length === 0) {\n throw new Error(\"No fields found in model response\");\n }\n\n issueId = getStringValue(parsed.issueId) ?? \"\";\n if (!issueId) {\n throw new Error(\"Issue ID not found in parsed response\");\n }\n } catch (parseError) {\n logger.warn(\"Failed to parse LLM response, falling back to regex parsing:\", parseError);\n\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (!issueMatch) {\n const errorMessage = \"Please specify an issue ID (e.g., ENG-123) to delete.\";\n await callback?.({\n text: errorMessage,\n source: message.content.source,\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n issueId = issueMatch[1];\n }\n }\n\n const issue = await linearService.getIssue(issueId, accountId);\n const issueTitle = issue.title.slice(0, LINEAR_ISSUE_TITLE_MAX_CHARS);\n const issueIdentifier = issue.identifier;\n\n // Two-phase confirmation: archiving a Linear issue is irreversible\n // from the agent's side, so always ask the user to confirm.\n const decision = await requireConfirmation({\n runtime,\n message,\n actionName: \"DELETE_LINEAR_ISSUE\",\n pendingKey: `archive:${issue.id}`,\n prompt: `Archive issue ${issueIdentifier}: \"${issueTitle}\"? This moves it out of active views. Reply \"yes\" to confirm.`,\n callback,\n });\n if (decision.status === \"pending\") {\n return {\n text: `Awaiting confirmation to archive ${issueIdentifier}.`,\n success: true,\n data: { awaitingUserInput: true, issueId: issue.id, identifier: issueIdentifier },\n };\n }\n if (decision.status === \"cancelled\") {\n const cancelMessage = `Archive of ${issueIdentifier} cancelled.`;\n await callback?.({ text: cancelMessage, source: message.content.source });\n return {\n text: cancelMessage,\n success: true,\n data: { cancelled: true, issueId: issue.id, identifier: issueIdentifier },\n };\n }\n\n logger.info(`Archiving issue ${issueIdentifier}: ${issueTitle}`);\n\n await linearService.deleteIssue(issueId, accountId);\n\n const successMessage = `✅ Successfully archived issue ${issueIdentifier}: \"${issueTitle}\"\\n\\nThe issue has been moved to the archived state and will no longer appear in active views.`;\n await callback?.({\n text: successMessage,\n source: message.content.source,\n });\n\n return {\n text: `Archived issue ${issueIdentifier}: \"${issueTitle}\"`,\n success: true,\n data: {\n issueId: issue.id,\n identifier: issueIdentifier,\n title: issueTitle,\n archived: true,\n accountId,\n },\n };\n } catch (error) {\n logger.error(\"Failed to delete issue:\", error);\n const errorMessage = `❌ Failed to delete 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};\n",
|
|
16
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { getActivityTemplate } from \"../prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport {\n getNumberValue,\n getRecordValue,\n getStringArrayValue,\n getStringValue,\n parseLinearPromptResponse,\n} from \"./parseLinearPrompt.js\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nfunction formatActivityDetail(value: unknown): string {\n if (value === null || value === undefined) {\n return \"none\";\n }\n if (Array.isArray(value)) {\n return value.map(formatActivityDetail).join(\", \");\n }\n if (typeof value === \"object\") {\n return Object.entries(value as Record<string, unknown>)\n .map(([key, nestedValue]) => `${key}=${formatActivityDetail(nestedValue)}`)\n .join(\"; \");\n }\n return String(value);\n}\n\ntype ActivityParams = {\n filters?: Record<string, unknown>;\n limit?: number;\n};\n\nexport const getActivityAction: Action = {\n name: \"GET_LINEAR_ACTIVITY\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description: \"Get recent Linear activity log with optional filters\",\n descriptionCompressed: \"get recent Linear activity log w/ optional filter\",\n similes: [\n \"get-linear-activity\",\n \"show-linear-activity\",\n \"view-linear-activity\",\n \"check-linear-activity\",\n ],\n parameters: [\n {\n name: \"filters\",\n description:\n \"Optional activity filters, e.g. fromDate ISO timestamp, action, resource_type, resource_id, or success.\",\n required: false,\n schema: { type: \"object\" as const },\n },\n {\n name: \"limit\",\n description: \"Maximum number of activity log entries to return.\",\n required: false,\n schema: { type: \"number\" as const },\n },\n linearAccountIdParameter,\n ],\n\n examples: [\n [\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 show you the recent Linear activity.\",\n actions: [\"GET_LINEAR_ACTIVITY\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"What happened in Linear today?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"Let me check today's Linear activity for you.\",\n actions: [\"GET_LINEAR_ACTIVITY\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me what issues John created this week\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll find the issues John created this week.\",\n actions: [\"GET_LINEAR_ACTIVITY\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"get\", \"linear\", \"activity\"],\n regexAlternation: \"get|linear|activity\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n const content = message.content.text || \"\";\n const params = (_options?.parameters ?? {}) as ActivityParams;\n const filters: Record<string, unknown> = { ...(params.filters ?? {}) };\n let limit =\n typeof params.limit === \"number\" && Number.isFinite(params.limit)\n ? Math.max(1, Math.floor(params.limit))\n : 10;\n\n if (content) {\n const prompt = getActivityTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (response) {\n try {\n const parsed = parseLinearPromptResponse(response);\n if (Object.keys(parsed).length === 0) {\n throw new Error(\"No fields found in model response\");\n }\n\n const timeRange = getRecordValue(parsed.timeRange);\n if (timeRange) {\n const now = new Date();\n let fromDate: Date | undefined;\n\n const from = getStringValue(timeRange.from);\n const period = getStringValue(timeRange.period);\n if (from) {\n fromDate = new Date(from);\n } else if (period) {\n switch (period) {\n case \"today\":\n fromDate = new Date(now.setHours(0, 0, 0, 0));\n break;\n case \"yesterday\":\n fromDate = new Date(now.setDate(now.getDate() - 1));\n fromDate.setHours(0, 0, 0, 0);\n break;\n case \"this-week\":\n fromDate = new Date(now.setDate(now.getDate() - now.getDay()));\n fromDate.setHours(0, 0, 0, 0);\n break;\n case \"last-week\":\n fromDate = new Date(now.setDate(now.getDate() - now.getDay() - 7));\n fromDate.setHours(0, 0, 0, 0);\n break;\n case \"this-month\":\n fromDate = new Date(now.getFullYear(), now.getMonth(), 1);\n break;\n }\n }\n\n if (fromDate) {\n filters.fromDate = fromDate.toISOString();\n }\n }\n\n const actionTypes = getStringArrayValue(parsed.actionTypes);\n if (actionTypes && actionTypes.length > 0) {\n filters.action = actionTypes[0];\n }\n\n const resourceTypes = getStringArrayValue(parsed.resourceTypes);\n if (resourceTypes && resourceTypes.length > 0) {\n filters.resource_type = resourceTypes[0];\n }\n\n const resourceId = getStringValue(parsed.resourceId);\n if (resourceId) {\n filters.resource_id = resourceId;\n }\n\n const successFilter = getStringValue(parsed.successFilter);\n if (successFilter && successFilter !== \"all\") {\n filters.success = successFilter === \"success\";\n }\n\n limit = getNumberValue(parsed.limit) || 10;\n } catch (parseError) {\n logger.warn(\"Failed to parse activity filters:\", parseError);\n }\n }\n }\n\n let activity = linearService.getActivityLog(limit * 2, filters, accountId);\n\n if (filters.fromDate) {\n const fromDateValue = filters.fromDate;\n const fromDate =\n typeof fromDateValue === \"string\"\n ? fromDateValue\n : fromDateValue instanceof Date\n ? fromDateValue.toISOString()\n : String(fromDateValue);\n const fromTime = new Date(fromDate).getTime();\n if (!Number.isNaN(fromTime)) {\n activity = activity.filter((item) => new Date(item.timestamp).getTime() >= fromTime);\n }\n }\n\n activity = activity.slice(0, limit);\n\n if (activity.length === 0) {\n const noActivityMessage = filters.fromDate\n ? `No Linear activity found for the specified filters.`\n : \"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 accountId,\n },\n };\n }\n\n const activityText = activity\n .map((item, index) => {\n const time = new Date(item.timestamp).toLocaleString();\n const status = item.success ? \"✅\" : \"❌\";\n const details = Object.entries(item.details)\n .filter(([key]) => key !== \"filters\")\n .map(([key, value]) => `${key}: ${formatActivityDetail(value)}`)\n .join(\", \");\n\n return `${index + 1}. ${status} ${item.action} on ${item.resource_type} ${item.resource_id}\\n Time: ${time}\\n ${details ? `Details: ${details}` : \"\"}${item.error ? `\\n Error: ${item.error}` : \"\"}`;\n })\n .join(\"\\n\\n\");\n\n const headerText = filters.fromDate\n ? `📊 Linear activity ${content}:`\n : \"📊 Recent Linear activity:\";\n\n const resultMessage = `${headerText}\\n\\n${activityText}`;\n await callback?.({\n text: resultMessage,\n source: message.content.source,\n });\n\n return {\n text: `Found ${activity.length} activity item${activity.length === 1 ? \"\" : \"s\"}`,\n success: true,\n data: {\n activity: activity.map((item) => ({\n id: item.id,\n action: item.action,\n resource_type: item.resource_type,\n resource_id: item.resource_id,\n success: item.success,\n error: item.error,\n details: formatActivityDetail(item.details),\n timestamp:\n typeof item.timestamp === \"string\"\n ? item.timestamp\n : new Date(item.timestamp).toISOString(),\n })) as Array<Record<string, string | boolean | undefined>>,\n filters: filters\n ? {\n ...filters,\n fromDate: filters.fromDate\n ? typeof filters.fromDate === \"string\"\n ? filters.fromDate\n : String(filters.fromDate)\n : undefined,\n }\n : undefined,\n count: activity.length,\n accountId,\n },\n };\n } catch (error) {\n logger.error(\"Failed to get activity:\", error);\n const errorMessage = `❌ Failed to get 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};\n",
|
|
17
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport type { Issue, IssueLabel } from \"@linear/sdk\";\nimport { getIssueTemplate } from \"../prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport { getRecordValue, getStringValue, parseLinearPromptResponse } from \"./parseLinearPrompt.js\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\ntype GetIssueParams = {\n issueId?: string;\n query?: string;\n};\n\nexport const getIssueAction: Action = {\n name: \"GET_LINEAR_ISSUE\",\n contexts: [\"tasks\", \"connectors\", \"knowledge\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"knowledge\"] },\n roleGate: { minRole: \"USER\" },\n description: \"Get details of a specific Linear issue\",\n descriptionCompressed: \"get detail specific Linear issue\",\n similes: [\n \"get-linear-issue\",\n \"show-linear-issue\",\n \"view-linear-issue\",\n \"check-linear-issue\",\n \"find-linear-issue\",\n ],\n parameters: [\n {\n name: \"issueId\",\n description: \"Linear issue identifier or id, e.g. ENG-123.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n {\n name: \"query\",\n description: \"Search text when the exact Linear issue identifier is unknown.\",\n required: false,\n schema: { type: \"string\" as const },\n },\n linearAccountIdParameter,\n ],\n\n examples: [\n [\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 {\n name: \"User\",\n content: {\n text: \"What's the status of the login bug?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"Let me find the login bug issue for you.\",\n actions: [\"GET_LINEAR_ISSUE\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me the latest high priority issue assigned to Sarah\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll find the latest high priority issue assigned to Sarah.\",\n actions: [\"GET_LINEAR_ISSUE\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"get\", \"linear\", \"issue\"],\n regexAlternation: \"get|linear|issue\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n const params = (_options?.parameters ?? {}) as GetIssueParams;\n const content = params.query ?? params.issueId ?? message.content.text;\n if (!content) {\n const errorMessage = \"Please specify which issue you want to see.\";\n await callback?.({\n text: errorMessage,\n source: message.content.source,\n });\n return {\n text: errorMessage,\n success: false,\n };\n }\n\n if (params.issueId) {\n const issue = await linearService.getIssue(params.issueId, accountId);\n return await formatIssueResponse(issue, callback, message);\n }\n\n const prompt = getIssueTemplate.replace(\"{{userMessage}}\", content);\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n });\n\n if (!response) {\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (issueMatch) {\n const issue = await linearService.getIssue(issueMatch[1], accountId);\n return await formatIssueResponse(issue, callback, message);\n }\n throw new Error(\"Could not understand issue reference\");\n }\n\n try {\n const parsed = parseLinearPromptResponse(response);\n if (Object.keys(parsed).length === 0) {\n throw new Error(\"No fields found in model response\");\n }\n\n const directId = getStringValue(parsed.directId);\n if (directId) {\n const issue = await linearService.getIssue(directId, accountId);\n return await formatIssueResponse(issue, callback, message);\n }\n\n const searchBy = getRecordValue(parsed.searchBy);\n if (searchBy && Object.keys(searchBy).length > 0) {\n const filters: Record<string, unknown> = {};\n\n const title = getStringValue(searchBy.title);\n if (title) {\n filters.query = title;\n }\n\n const assignee = getStringValue(searchBy.assignee);\n if (assignee) {\n filters.assignee = [assignee];\n }\n\n const priorityValue = getStringValue(searchBy.priority);\n if (priorityValue) {\n const priorityMap: Record<string, number> = {\n urgent: 1,\n high: 2,\n normal: 3,\n low: 4,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n };\n const priority = priorityMap[priorityValue.toLowerCase()];\n if (priority) {\n filters.priority = [priority];\n }\n }\n\n const team = getStringValue(searchBy.team);\n if (team) {\n filters.team = team;\n }\n\n const state = getStringValue(searchBy.state);\n if (state) {\n filters.state = [state];\n }\n\n const defaultTeamKey =\n linearService.getDefaultTeamKey(accountId) ??\n (runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string);\n if (defaultTeamKey && !filters.team) {\n filters.team = defaultTeamKey;\n }\n\n const issues = await linearService.searchIssues(\n {\n ...filters,\n limit: getStringValue(searchBy.recency) ? 10 : 5,\n },\n accountId\n );\n\n if (issues.length === 0) {\n const noResultsMessage = \"No issues found matching your criteria.\";\n await callback?.({\n text: noResultsMessage,\n source: message.content.source,\n });\n return {\n text: noResultsMessage,\n success: false,\n };\n }\n\n if (getStringValue(searchBy.recency)) {\n issues.sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n }\n\n if (getStringValue(searchBy.recency) && issues.length > 0) {\n return await formatIssueResponse(issues[0], callback, message);\n }\n\n if (issues.length === 1) {\n return await formatIssueResponse(issues[0], callback, message);\n }\n\n const issueList = await Promise.all(\n issues.slice(0, 5).map(async (issue, index) => {\n const state = await issue.state;\n return `${index + 1}. ${issue.identifier}: ${issue.title} (${state?.name || \"No state\"})`;\n })\n );\n\n const clarifyMessage = `Found ${issues.length} issues matching your criteria:\\n${issueList.join(\"\\n\")}\\n\\nPlease specify which one you want to see by its ID.`;\n await callback?.({\n text: clarifyMessage,\n source: message.content.source,\n });\n\n return {\n text: clarifyMessage,\n success: true,\n data: {\n multipleResults: true,\n issues: issues.slice(0, 5).map((i) => ({\n id: i.id,\n identifier: i.identifier,\n title: i.title,\n })),\n },\n };\n }\n } catch (parseError) {\n logger.warn(\"Failed to parse LLM response, falling back to regex:\", parseError);\n const issueMatch = content.match(/(\\w+-\\d+)/);\n if (issueMatch) {\n const issue = await linearService.getIssue(issueMatch[1], accountId);\n return await formatIssueResponse(issue, callback, message);\n }\n }\n\n const errorMessage =\n \"Could not understand which issue you want to see. Please provide an issue ID (e.g., ENG-123) or describe it more specifically.\";\n await callback?.({\n text: errorMessage,\n source: message.content.source,\n });\n return {\n text: errorMessage,\n success: false,\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};\n\nasync function formatIssueResponse(\n issue: Issue,\n callback: HandlerCallback | undefined,\n message: Memory\n): Promise<ActionResult> {\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 ? {\n id: assignee.id,\n name: assignee.name,\n email: assignee.email,\n }\n : null,\n state: state\n ? {\n id: state.id,\n name: state.name,\n type: state.type,\n color: state.color,\n }\n : null,\n team: team\n ? {\n id: team.id,\n name: team.name,\n key: team.key,\n }\n : null,\n labels: labels.nodes.map((label: IssueLabel) => ({\n id: label.id,\n name: label.name,\n color: label.color,\n })),\n project: project\n ? {\n id: project.id,\n name: project.name,\n description: project.description,\n }\n : null,\n };\n\n const priorityLabels = [\"\", \"Urgent\", \"High\", \"Normal\", \"Low\"];\n const priority = priorityLabels[issue.priority || 0] || \"No priority\";\n\n const labelText =\n issueDetails.labels.length > 0\n ? `Labels: ${issueDetails.labels.map((l) => l.name).join(\", \")}`\n : \"\";\n\n const issueMessage = `📋 **${issue.identifier}: ${issue.title}**\n \nStatus: ${state?.name || \"No status\"}\nPriority: ${priority}\nTeam: ${team?.name || \"No team\"}\nAssignee: ${assignee?.name || \"Unassigned\"}\n${issue.dueDate ? `Due: ${new Date(issue.dueDate).toLocaleDateString()}` : \"\"}\n${labelText}\n${project ? `Project: ${project.name}` : \"\"}\n\n${issue.description || \"No description\"}\n\nView in Linear: ${issue.url}`;\n\n await callback?.({\n text: issueMessage,\n source: message.content.source,\n });\n\n const serializedIssue = {\n ...issueDetails,\n createdAt:\n issueDetails.createdAt instanceof Date\n ? issueDetails.createdAt.toISOString()\n : issueDetails.createdAt,\n updatedAt:\n issueDetails.updatedAt instanceof Date\n ? issueDetails.updatedAt.toISOString()\n : issueDetails.updatedAt,\n dueDate: issueDetails.dueDate\n ? issueDetails.dueDate instanceof Date\n ? issueDetails.dueDate.toISOString()\n : issueDetails.dueDate\n : null,\n };\n\n return {\n text: `Retrieved issue ${issue.identifier}: ${issue.title}`,\n success: true,\n data: { issue: serializedIssue },\n };\n}\n",
|
|
18
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { LinearService } from \"../services/linear\";\nimport type { ListCommentsParameters } from \"../types/index.js\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nexport const listCommentsAction: Action = {\n name: \"LIST_LINEAR_COMMENTS\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description: \"List comments on a Linear issue\",\n descriptionCompressed: \"list comment Linear issue\",\n parameters: [\n {\n name: \"issueId\",\n description: \"Linear issue id or identifier to list comments for.\",\n required: false,\n schema: { type: \"string\" },\n },\n {\n name: \"limit\",\n description: \"Maximum number of comments to return (default 25, max 100).\",\n required: false,\n schema: { type: \"number\" },\n },\n linearAccountIdParameter,\n ],\n similes: [\"get-linear-comments\", \"show-linear-comments\", \"fetch-linear-comments\"],\n\n examples: [\n [\n {\n name: \"User\",\n content: { text: \"Show the comments on ENG-123.\" },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"Here are the comments on ENG-123.\",\n actions: [\"LIST_LINEAR_COMMENTS\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"list\", \"comments\", \"linear\", \"issue\"],\n regexAlternation: \"list|comments|linear|issue\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n const params = _options?.parameters as ListCommentsParameters | undefined;\n const issueId = params?.issueId?.trim() ?? \"\";\n const limit =\n typeof params?.limit === \"number\" ? Math.min(Math.max(1, params.limit), 100) : 25;\n\n if (!issueId) {\n // Try to extract issue id from message text\n const match = message.content.text?.match(/([A-Z]+-\\d+)/);\n if (!match) {\n const errorMessage = \"Please provide an issueId to list comments for.\";\n await callback?.({\n text: errorMessage,\n source: message.content.source,\n });\n return { text: errorMessage, success: false };\n }\n const extractedId = match[1];\n const comments = await linearService.listComments(extractedId, limit, accountId);\n return formatCommentResult(extractedId, comments, message, callback);\n }\n\n const comments = await linearService.listComments(issueId, limit, accountId);\n return formatCommentResult(issueId, comments, message, callback);\n } catch (error) {\n logger.error(\"Failed to list comments:\", error);\n const errorMessage = `Failed to list comments: ${error instanceof Error ? error.message : \"Unknown error\"}`;\n await callback?.({ text: errorMessage, source: message.content.source });\n return { text: errorMessage, success: false };\n }\n },\n};\n\nasync function formatCommentResult(\n issueId: string,\n comments: Awaited<ReturnType<LinearService[\"listComments\"]>>,\n message: Memory,\n callback?: HandlerCallback\n): Promise<ActionResult> {\n if (comments.length === 0) {\n const text = `No comments on issue ${issueId}.`;\n await callback?.({ text, source: message.content.source });\n return { text, success: true, data: { issueId, comments: [] } };\n }\n\n const lines = await Promise.all(\n comments.map(async (c) => {\n const user = await c.user;\n const name = user?.name ?? \"unknown\";\n const created = c.createdAt ? new Date(c.createdAt).toISOString().slice(0, 10) : \"?\";\n const body = (c.body ?? \"\").slice(0, 200);\n return `- [${c.id}] ${name} (${created}): ${body}`;\n })\n );\n\n const text = `${comments.length} comment(s) on ${issueId}:\\n${lines.join(\"\\n\")}`;\n await callback?.({ text, source: message.content.source });\n return {\n text,\n success: true,\n data: {\n issueId,\n count: comments.length,\n comments: comments.map((c) => ({ id: c.id })),\n },\n };\n}\n",
|
|
19
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { searchIssuesTemplate } from \"../prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { LinearSearchFilters, SearchIssuesParameters } from \"../types/index.js\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport {\n getBooleanValue,\n getNumberValue,\n getStringArrayValue,\n getStringValue,\n parseLinearPromptResponse,\n} from \"./parseLinearPrompt.js\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nconst searchTemplate = searchIssuesTemplate;\n\nexport const searchIssuesAction: Action = {\n name: \"SEARCH_LINEAR_ISSUES\",\n contexts: [\"tasks\", \"connectors\", \"knowledge\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"knowledge\"] },\n roleGate: { minRole: \"USER\" },\n description: \"Search for issues in Linear with various filters\",\n descriptionCompressed: \"search issue Linear w/ various filter\",\n similes: [\n \"search-linear-issues\",\n \"find-linear-issues\",\n \"query-linear-issues\",\n \"list-linear-issues\",\n ],\n parameters: [\n {\n name: \"filters\",\n description:\n \"Structured Linear issue filters: query, state, assignee, priority, team, label, and limit.\",\n required: false,\n schema: { type: \"object\" as const },\n },\n {\n name: \"limit\",\n description: \"Maximum number of issues to return.\",\n required: false,\n schema: { type: \"number\" as const },\n },\n linearAccountIdParameter,\n ],\n\n examples: [\n [\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 {\n name: \"User\",\n content: {\n text: \"What is John working on?\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll find the issues assigned to John.\",\n actions: [\"SEARCH_LINEAR_ISSUES\"],\n },\n },\n ],\n [\n {\n name: \"User\",\n content: {\n text: \"Show me high priority issues created this week\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll search for high priority issues created this week.\",\n actions: [\"SEARCH_LINEAR_ISSUES\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"search\", \"linear\", \"issues\"],\n regexAlternation: \"search|linear|issues\",\n }),\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\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 const params = _options?.parameters as SearchIssuesParameters | undefined;\n if (params?.filters) {\n filters = params.filters;\n } else {\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 filters = { query: content };\n } else {\n try {\n const parsed = parseLinearPromptResponse(response);\n if (Object.keys(parsed).length === 0) {\n throw new Error(\"No fields found in model response\");\n }\n\n filters = {\n query: getStringValue(parsed.query),\n limit: getNumberValue(parsed.limit) || 10,\n };\n\n const states = getStringArrayValue(parsed.states);\n if (states && states.length > 0) {\n filters.state = states;\n }\n\n const assignees = getStringArrayValue(parsed.assignees);\n if (assignees && assignees.length > 0) {\n const processedAssignees = [];\n for (const assignee of assignees) {\n if (assignee.toLowerCase() === \"me\") {\n try {\n const currentUser = await linearService.getCurrentUser(accountId);\n processedAssignees.push(currentUser.email);\n } catch {\n logger.warn('Could not resolve \"me\" to current user');\n }\n } else {\n processedAssignees.push(assignee);\n }\n }\n if (processedAssignees.length > 0) {\n filters.assignee = processedAssignees;\n }\n }\n\n if (getBooleanValue(parsed.hasAssignee) === false) {\n filters.query = filters.query ? `${filters.query} unassigned` : \"unassigned\";\n }\n\n const parsedPriorities = getStringArrayValue(parsed.priorities);\n if (parsedPriorities && parsedPriorities.length > 0) {\n const priorityMap: Record<string, number> = {\n urgent: 1,\n high: 2,\n normal: 3,\n low: 4,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n };\n const priorities = parsedPriorities\n .map((p: string) => priorityMap[p.toLowerCase()])\n .filter(Boolean);\n if (priorities.length > 0) {\n filters.priority = priorities;\n }\n }\n\n const teams = getStringArrayValue(parsed.teams);\n if (teams && teams.length > 0) {\n filters.team = teams[0];\n }\n\n const labels = getStringArrayValue(parsed.labels);\n if (labels && labels.length > 0) {\n filters.label = labels;\n }\n\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 if (!filters.team) {\n const defaultTeamKey =\n linearService.getDefaultTeamKey(accountId) ??\n (runtime.getSetting(\"LINEAR_DEFAULT_TEAM_KEY\") as string);\n if (defaultTeamKey) {\n const searchingAllIssues =\n content.toLowerCase().includes(\"all\") &&\n (content.toLowerCase().includes(\"issue\") ||\n content.toLowerCase().includes(\"bug\") ||\n content.toLowerCase().includes(\"task\"));\n\n if (!searchingAllIssues) {\n filters.team = defaultTeamKey;\n logger.info(`Applying default team filter: ${defaultTeamKey}`);\n }\n }\n }\n\n filters.limit = params?.limit ?? filters.limit ?? 10;\n\n const issues = await linearService.searchIssues(filters, accountId);\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: filters ? { ...filters } : undefined,\n count: 0,\n accountId,\n },\n };\n }\n\n const issueList = await Promise.all(\n issues.map(async (issue, index) => {\n const state = await issue.state;\n const assignee = await issue.assignee;\n const priorityLabels = [\"\", \"Urgent\", \"High\", \"Normal\", \"Low\"];\n const priority = priorityLabels[issue.priority || 0] || \"No priority\";\n\n return `${index + 1}. ${issue.identifier}: ${issue.title}\\n Status: ${state?.name || \"No state\"} | Priority: ${priority} | Assignee: ${assignee?.name || \"Unassigned\"}`;\n })\n );\n const issueText = issueList.join(\"\\n\\n\");\n\n const resultMessage = `📋 Found ${issues.length} issue${issues.length === 1 ? \"\" : \"s\"}:\\n\\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 success: true,\n data: {\n issues: await Promise.all(\n issues.map(async (issue) => {\n const state = await issue.state;\n const assignee = await issue.assignee;\n const team = await issue.team;\n\n return {\n id: issue.id,\n identifier: issue.identifier,\n title: issue.title,\n url: issue.url,\n priority: issue.priority,\n state: state ? { name: state.name, type: state.type } : null,\n assignee: assignee ? { name: assignee.name, email: assignee.email } : null,\n team: team ? { name: team.name, key: team.key } : null,\n createdAt:\n issue.createdAt instanceof Date ? issue.createdAt.toISOString() : issue.createdAt,\n updatedAt:\n issue.updatedAt instanceof Date ? issue.updatedAt.toISOString() : issue.updatedAt,\n };\n })\n ),\n filters: filters ? { ...filters } : undefined,\n count: issues.length,\n accountId,\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};\n",
|
|
20
|
+
"import {\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport type { LinearService } from \"../services/linear\";\nimport type { UpdateCommentParameters } from \"../types/index.js\";\nimport { getLinearAccountId } from \"./account-options\";\n\nexport async function handleUpdateComment(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\n\n const params = _options?.parameters as UpdateCommentParameters | undefined;\n const commentId = params?.commentId?.trim() ?? \"\";\n const body = params?.body?.trim() ?? \"\";\n\n if (!commentId || !body) {\n const errorMessage = \"Please provide both commentId and body to update a comment.\";\n await callback?.({ text: errorMessage, source: message.content.source });\n return { text: errorMessage, success: false };\n }\n\n const comment = await linearService.updateComment(commentId, body, accountId);\n\n const successMessage = `Updated comment ${commentId}.`;\n await callback?.({ text: successMessage, source: message.content.source });\n return {\n text: successMessage,\n success: true,\n data: { commentId: comment.id, accountId },\n };\n } catch (error) {\n logger.error(\"Failed to update comment:\", error);\n const errorMessage = `Failed to update comment: ${error instanceof Error ? error.message : \"Unknown error\"}`;\n await callback?.({ text: errorMessage, source: message.content.source });\n return { text: errorMessage, success: false };\n }\n}\n",
|
|
21
|
+
"import {\n type Action,\n type ActionResult,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n type State,\n} from \"@elizaos/core\";\nimport { updateIssueTemplate } from \"../prompts.js\";\nimport type { LinearService } from \"../services/linear\";\nimport type { LinearIssueInput } from \"../types\";\nimport { getLinearAccountId, linearAccountIdParameter } from \"./account-options\";\nimport {\n getPriorityNumberValue,\n getRecordValue,\n getStringArrayValue,\n getStringValue,\n parseLinearPromptResponse,\n} from \"./parseLinearPrompt.js\";\nimport { validateLinearActionIntent } from \"./validate-linear-intent\";\n\nconst LINEAR_MODEL_TIMEOUT_MS = 15_000;\nconst LINEAR_LOOKUP_LIMIT = 100;\n\nexport async function handleUpdateIssue(\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: HandlerOptions,\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 const accountId = getLinearAccountId(runtime, _options);\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 const prompt = updateIssueTemplate.replace(\"{{userMessage}}\", content);\n\n const response = await Promise.race([\n runtime.useModel(ModelType.TEXT_LARGE, {\n prompt: prompt,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Linear update extraction timeout\")),\n LINEAR_MODEL_TIMEOUT_MS\n )\n ),\n ]);\n\n if (!response) {\n throw new Error(\"Failed to extract update information\");\n }\n\n let issueId: string;\n const updates: Partial<LinearIssueInput> = {};\n\n try {\n const parsed = parseLinearPromptResponse(response);\n if (Object.keys(parsed).length === 0) {\n throw new Error(\"No fields found in model response\");\n }\n\n issueId = getStringValue(parsed.issueId) ?? \"\";\n if (!issueId) {\n throw new Error(\"Issue ID not found in parsed response\");\n }\n\n const parsedUpdates = getRecordValue(parsed.updates) ?? {};\n const title = getStringValue(parsedUpdates.title);\n if (title) {\n updates.title = title;\n }\n\n const description = getStringValue(parsedUpdates.description);\n if (description) {\n updates.description = description;\n }\n\n const priority = getPriorityNumberValue(parsedUpdates.priority);\n if (priority) {\n updates.priority = priority;\n }\n\n const teamKey = getStringValue(parsedUpdates.teamKey);\n if (teamKey) {\n const teams = await linearService.getTeams(accountId);\n const team = teams\n .slice(0, LINEAR_LOOKUP_LIMIT)\n .find((t) => t.key.toLowerCase() === teamKey.toLowerCase());\n if (team) {\n updates.teamId = team.id;\n logger.info(`Moving issue to team: ${team.name} (${team.key})`);\n } else {\n logger.warn(`Team with key ${teamKey} not found`);\n }\n }\n\n const assignee = getStringValue(parsedUpdates.assignee);\n if (assignee) {\n const cleanAssignee = assignee.replace(/^@/, \"\");\n const users = await linearService.getUsers(accountId);\n const user = users\n .slice(0, LINEAR_LOOKUP_LIMIT)\n .find(\n (u) =>\n u.email === cleanAssignee ||\n u.name.toLowerCase().includes(cleanAssignee.toLowerCase())\n );\n if (user) {\n updates.assigneeId = user.id;\n } else {\n logger.warn(`User ${cleanAssignee} not found`);\n }\n }\n\n const status = getStringValue(parsedUpdates.status);\n if (status) {\n const issue = await linearService.getIssue(issueId, accountId);\n const issueTeam = await issue.team;\n const teamId = updates.teamId || issueTeam?.id;\n if (!teamId) {\n logger.warn(\"Could not determine team for status update\");\n } else {\n const states = await linearService.getWorkflowStates(teamId, accountId);\n\n const state = states\n .slice(0, LINEAR_LOOKUP_LIMIT)\n .find(\n (s) =>\n s.name.toLowerCase() === status.toLowerCase() ||\n s.type.toLowerCase() === status.toLowerCase()\n );\n\n if (state) {\n updates.stateId = state.id;\n logger.info(`Changing status to: ${state.name}`);\n } else {\n logger.warn(`Status ${status} not found for team`);\n }\n }\n }\n\n const parsedLabels = getStringArrayValue(parsedUpdates.labels);\n if (parsedLabels !== undefined) {\n const teamId = updates.teamId;\n const labels = await linearService.getLabels(teamId, accountId);\n const labelIds: string[] = [];\n\n for (const labelName of parsedLabels.slice(0, LINEAR_LOOKUP_LIMIT)) {\n const label = labels\n .slice(0, LINEAR_LOOKUP_LIMIT)\n .find((l) => l.name.toLowerCase() === labelName.toLowerCase());\n if (label) {\n labelIds.push(label.id);\n }\n }\n\n updates.labelIds = labelIds;\n }\n } catch (parseError) {\n logger.warn(\"Failed to parse LLM response, falling back to regex parsing:\", parseError);\n\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 issueId = issueMatch[1];\n\n const titleMatch = content.match(/title to [\"'](.+?)[\"']/i);\n if (titleMatch) {\n updates.title = titleMatch[1];\n }\n\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\n if (Object.keys(updates).length === 0) {\n const errorMessage =\n \"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, accountId);\n\n const updateSummary = [];\n if (updates.title) updateSummary.push(`title: \"${updates.title}\"`);\n if (updates.priority)\n updateSummary.push(`priority: ${[\"\", \"urgent\", \"high\", \"normal\", \"low\"][updates.priority]}`);\n if (updates.teamId) updateSummary.push(`moved to team`);\n if (updates.assigneeId) updateSummary.push(`assigned to user`);\n if (updates.stateId) updateSummary.push(`status changed`);\n if (updates.labelIds) updateSummary.push(`labels updated`);\n\n const successMessage = `✅ Updated issue ${updatedIssue.identifier}: ${updateSummary.join(\", \")}\\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.join(\", \")}`,\n success: true,\n data: {\n issueId: updatedIssue.id,\n identifier: updatedIssue.identifier,\n updates: updates\n ? Object.fromEntries(\n Object.entries(updates).map(([key, value]) => [\n key,\n value instanceof Date ? value.toISOString() : value,\n ])\n )\n : undefined,\n url: updatedIssue.url,\n accountId,\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\nexport const updateIssueAction: Action = {\n name: \"UPDATE_LINEAR_ISSUE\",\n contexts: [\"tasks\", \"connectors\", \"automation\"],\n contextGate: { anyOf: [\"tasks\", \"connectors\", \"automation\"] },\n roleGate: { minRole: \"USER\" },\n description: \"Update an existing Linear issue (title, priority, assignee, status, labels, team)\",\n descriptionCompressed: \"update Linear issue\",\n parameters: [\n {\n name: \"issueId\",\n description: \"Linear issue id or identifier to update.\",\n required: false,\n schema: { type: \"string\" },\n },\n linearAccountIdParameter,\n ],\n similes: [\"update-linear-issue\", \"edit-linear-issue\", \"modify-linear-issue\"],\n\n examples: [\n [\n {\n name: \"User\",\n content: {\n text: \"Update ENG-123 priority to high\",\n },\n },\n {\n name: \"Assistant\",\n content: {\n text: \"I'll update issue ENG-123 in Linear.\",\n actions: [\"UPDATE_LINEAR_ISSUE\"],\n },\n },\n ],\n ],\n\n validate: async (runtime: IAgentRuntime, message: Memory, state?: State): Promise<boolean> =>\n validateLinearActionIntent(runtime, message, state, {\n keywords: [\"update\", \"edit\", \"modify\", \"linear\", \"issue\"],\n regexAlternation: \"update|edit|modify|linear|issue\",\n }),\n\n handler: handleUpdateIssue,\n};\n",
|
|
22
|
+
"import type {\n Action,\n ActionResult,\n HandlerCallback,\n HandlerOptions,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport { hasLinearAccountConfig } from \"../accounts\";\nimport { linearAccountIdParameter } from \"./account-options\";\nimport { clearActivityAction } from \"./clearActivity\";\nimport { createCommentAction } from \"./createComment\";\nimport { createIssueAction } from \"./createIssue\";\nimport { deleteCommentAction } from \"./deleteComment\";\nimport { deleteIssueAction } from \"./deleteIssue\";\nimport { getActivityAction } from \"./getActivity\";\nimport { getIssueAction } from \"./getIssue\";\nimport { listCommentsAction } from \"./listComments\";\nimport { searchIssuesAction } from \"./searchIssues\";\nimport { handleUpdateComment } from \"./updateComment\";\nimport { handleUpdateIssue } from \"./updateIssue\";\n\nexport const LINEAR_CONTEXT = \"linear\";\n\ntype LinearOp =\n | \"create_issue\"\n | \"get_issue\"\n | \"update_issue\"\n | \"delete_issue\"\n | \"create_comment\"\n | \"update_comment\"\n | \"delete_comment\"\n | \"list_comments\"\n | \"get_activity\"\n | \"clear_activity\"\n | \"search_issues\";\n\nconst ALL_OPS: readonly LinearOp[] = [\n \"create_issue\",\n \"get_issue\",\n \"update_issue\",\n \"delete_issue\",\n \"create_comment\",\n \"update_comment\",\n \"delete_comment\",\n \"list_comments\",\n \"get_activity\",\n \"clear_activity\",\n \"search_issues\",\n] as const;\n\ntype LinearHandlerFn = (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: HandlerOptions,\n callback?: HandlerCallback\n) => Promise<ActionResult>;\n\ninterface LinearRoute {\n op: LinearOp;\n action?: Action;\n run?: LinearHandlerFn;\n match: RegExp;\n}\n\nconst ROUTES: LinearRoute[] = [\n {\n op: \"delete_issue\",\n action: deleteIssueAction,\n match: /\\b(delete|archive|remove|close)\\b.*\\b(issue|bug|task|ticket|[a-z]+-\\d+)\\b/i,\n },\n {\n op: \"update_issue\",\n run: handleUpdateIssue,\n match:\n /\\b(update|edit|modify|move|change|assign|reassign|priority|status|label)\\b.*\\b(issue|bug|task|ticket|[a-z]+-\\d+)\\b/i,\n },\n {\n op: \"create_issue\",\n action: createIssueAction,\n match:\n /\\b(create|new|add|file|open)\\b.*\\b(issue|bug|task|ticket|linear)\\b|\\b(issue|bug|task|ticket)\\b.*\\b(create|new|add|file|open)\\b/i,\n },\n {\n op: \"create_comment\",\n action: createCommentAction,\n match: /\\b(comment|reply|note|tell)\\b.*\\b(issue|bug|task|ticket|[a-z]+-\\d+)\\b/i,\n },\n {\n op: \"update_comment\",\n run: handleUpdateComment,\n match: /\\b(update|edit|modify|change)\\b.*\\bcomment\\b/i,\n },\n {\n op: \"delete_comment\",\n action: deleteCommentAction,\n match: /\\b(delete|remove|erase)\\b.*\\bcomment\\b/i,\n },\n {\n op: \"list_comments\",\n action: listCommentsAction,\n match:\n /\\b(list|show|get|fetch|view)\\b.*\\bcomments?\\b|\\bcomments?\\b.*\\b(list|show|get|fetch)\\b/i,\n },\n {\n op: \"clear_activity\",\n action: clearActivityAction,\n match: /\\b(clear|reset|delete)\\b.*\\b(activity|activity log)\\b/i,\n },\n {\n op: \"get_activity\",\n action: getActivityAction,\n match: /\\b(activity|activity log|what happened|recent changes|audit)\\b/i,\n },\n {\n op: \"search_issues\",\n action: searchIssuesAction,\n match:\n /\\b(search|find|query|list|show)\\b.*\\b(issues?|bugs?|tasks?|tickets?)\\b|\\b(open|closed|unassigned|assigned|high priority|blockers?)\\b.*\\b(issues?|bugs?|tasks?|tickets?)\\b/i,\n },\n {\n op: \"get_issue\",\n action: getIssueAction,\n match:\n /\\b(show|get|view|check|details?|status|what'?s|find)\\b.*\\b(issue|bug|task|ticket|[a-z]+-\\d+)\\b|[a-z]+-\\d+/i,\n },\n];\n\nfunction textOf(message: Memory): string {\n return typeof message.content?.text === \"string\" ? message.content.text : \"\";\n}\n\nfunction readOptions(options?: HandlerOptions | Record<string, unknown>): Record<string, unknown> {\n const direct = (options ?? {}) as Record<string, unknown>;\n const parameters =\n direct.parameters && typeof direct.parameters === \"object\"\n ? (direct.parameters as Record<string, unknown>)\n : {};\n return { ...direct, ...parameters };\n}\n\nfunction normalizeOp(value: unknown): LinearOp | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, \"_\");\n return (ALL_OPS as readonly string[]).includes(trimmed) ? (trimmed as LinearOp) : null;\n}\n\nfunction selectRoute(\n message: Memory,\n options?: HandlerOptions | Record<string, unknown>\n): LinearRoute | null {\n const opts = readOptions(options);\n const requested = normalizeOp(opts.action ?? opts.subaction ?? opts.op);\n if (requested) {\n const route = ROUTES.find((candidate) => candidate.op === requested);\n if (route) return route;\n }\n const text = textOf(message);\n return ROUTES.find((route) => route.match.test(text)) ?? null;\n}\n\nfunction hasLinearAccess(runtime: IAgentRuntime): boolean {\n return hasLinearAccountConfig(runtime);\n}\n\nexport const linearAction: Action = {\n name: \"LINEAR\",\n description:\n \"Manage Linear issues, comments, and activity. Operations: create_issue, get_issue, update_issue, delete_issue, create_comment, update_comment, delete_comment, list_comments, get_activity, clear_activity, search_issues. The op is inferred from the message text when not explicitly provided.\",\n descriptionCompressed:\n \"Linear: create/get/update/delete issue, create/update/delete/list comment, search issues, get/clear activity.\",\n similes: [\n // Group/router-style names\n \"LINEAR_ISSUE\",\n \"LINEAR_ISSUES\",\n \"LINEAR_COMMENT\",\n \"LINEAR_COMMENTS\",\n \"LINEAR_WORKFLOW\",\n \"LINEAR_ACTIVITY\",\n \"LINEAR_SEARCH\",\n // Issue ops\n \"CREATE_LINEAR_ISSUE\",\n \"GET_LINEAR_ISSUE\",\n \"UPDATE_LINEAR_ISSUE\",\n \"DELETE_LINEAR_ISSUE\",\n \"MANAGE_LINEAR_ISSUE\",\n \"MANAGE_LINEAR_ISSUES\",\n // Comment ops\n \"CREATE_LINEAR_COMMENT\",\n \"COMMENT_LINEAR_ISSUE\",\n \"UPDATE_LINEAR_COMMENT\",\n \"DELETE_LINEAR_COMMENT\",\n \"LIST_LINEAR_COMMENTS\",\n // Workflow / activity / search ops\n \"GET_LINEAR_ACTIVITY\",\n \"CLEAR_LINEAR_ACTIVITY\",\n \"SEARCH_LINEAR_ISSUES\",\n \"LINEAR_WORKFLOW_SEARCH\",\n ],\n contexts: [\"general\", \"automation\", \"knowledge\", LINEAR_CONTEXT],\n contextGate: { anyOf: [\"general\", \"automation\", \"knowledge\", LINEAR_CONTEXT] },\n roleGate: { minRole: \"USER\" },\n parameters: [\n {\n name: \"action\",\n description:\n \"Operation to perform. One of: create_issue, get_issue, update_issue, delete_issue, create_comment, update_comment, delete_comment, list_comments, get_activity, clear_activity, search_issues. Inferred from message text when omitted.\",\n required: false,\n schema: { type: \"string\", enum: [...ALL_OPS] },\n },\n linearAccountIdParameter,\n ],\n validate: async (runtime: IAgentRuntime) => {\n if (!hasLinearAccess(runtime)) return false;\n return true;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State | undefined,\n options?: HandlerOptions,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n const route = selectRoute(message, options);\n if (!route) {\n const ops = ALL_OPS.join(\", \");\n const text = `LINEAR could not determine the operation. Specify one of: ${ops}.`;\n await callback?.({ text, source: message.content?.source });\n return {\n success: false,\n text,\n values: { error: \"MISSING\" },\n data: { actionName: \"LINEAR\", availableOps: ops },\n };\n }\n\n const dispatch = route.run ?? route.action?.handler?.bind(route.action);\n const result = dispatch\n ? ((await dispatch(runtime, message, state, options, callback)) ??\n ({ success: true } as ActionResult))\n : ({ success: true } as ActionResult);\n return {\n ...result,\n data: {\n ...(typeof result.data === \"object\" && result.data ? result.data : {}),\n actionName: \"LINEAR\",\n routedActionName: route.action?.name ?? route.op,\n op: route.op,\n },\n };\n },\n examples: [\n [\n { name: \"{{user1}}\", content: { text: \"Create a Linear issue for the mobile login bug\" } },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"I'll create that Linear issue.\",\n actions: [\"LINEAR\"],\n },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Comment on ENG-123 that QA can retest it\" } },\n {\n name: \"{{agentName}}\",\n content: { text: \"I'll add that comment to ENG-123.\", actions: [\"LINEAR\"] },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"Search open Linear bugs for the backend team\" } },\n {\n name: \"{{agentName}}\",\n content: { text: \"I'll search Linear issues.\", actions: [\"LINEAR\"] },\n },\n ],\n [\n { name: \"{{user1}}\", content: { text: \"What's the status of ENG-456?\" } },\n {\n name: \"{{agentName}}\",\n content: { text: \"Looking up ENG-456.\", actions: [\"LINEAR\"] },\n },\n ],\n ],\n};\n",
|
|
23
|
+
"/**\n * Linear ConnectorAccountManager provider.\n *\n * Bridges plugin-linear to the @elizaos/core ConnectorAccountManager so the\n * generic HTTP CRUD + OAuth surface can list, create, patch, delete, and run\n * the OAuth flow for Linear workspaces.\n *\n * Account model:\n * - role \"OWNER\" — workspace admin (workspace API key or OAuth)\n * - accountKey — workspace id (or workspace handle if id unavailable)\n * - purpose — [\"admin\"]\n */\n\nimport {\n type ConnectorAccount,\n type ConnectorAccountManager,\n type ConnectorAccountPatch,\n type ConnectorAccountProvider,\n type ConnectorAccountPurpose,\n type ConnectorOAuthCallbackRequest,\n type ConnectorOAuthCallbackResult,\n type ConnectorOAuthStartRequest,\n type ConnectorOAuthStartResult,\n type IAgentRuntime,\n logger,\n} from \"@elizaos/core\";\nimport { readLinearAccounts } from \"./accounts\";\n\nexport const LINEAR_PROVIDER_NAME = \"linear\";\n\nconst LINEAR_AUTHORIZATION_ENDPOINT = \"https://linear.app/oauth/authorize\";\nconst LINEAR_TOKEN_ENDPOINT = \"https://api.linear.app/oauth/token\";\nconst LINEAR_GRAPHQL_ENDPOINT = \"https://api.linear.app/graphql\";\n\nconst DEFAULT_PURPOSES: ConnectorAccountPurpose[] = [\"admin\" as ConnectorAccountPurpose];\n\ninterface LinearTokenResponse {\n access_token?: string;\n token_type?: string;\n scope?: string;\n refresh_token?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}\n\ninterface LinearViewerPayload {\n data?: {\n viewer?: {\n id?: string;\n name?: string;\n email?: string;\n organization?: {\n id?: string;\n name?: string;\n urlKey?: string;\n };\n };\n };\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readSetting(runtime: IAgentRuntime, key: string): string | undefined {\n return nonEmptyString(runtime.getSetting?.(key));\n}\n\nfunction readClientConfig(runtime: IAgentRuntime): {\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n} {\n const clientId = readSetting(runtime, \"LINEAR_OAUTH_CLIENT_ID\");\n const clientSecret = readSetting(runtime, \"LINEAR_OAUTH_CLIENT_SECRET\");\n const redirectUri = readSetting(runtime, \"LINEAR_OAUTH_REDIRECT_URI\");\n if (!clientId || !clientSecret || !redirectUri) {\n throw new Error(\n \"Linear OAuth requires LINEAR_OAUTH_CLIENT_ID, LINEAR_OAUTH_CLIENT_SECRET, and LINEAR_OAUTH_REDIRECT_URI to be configured.\"\n );\n }\n return { clientId, clientSecret, redirectUri };\n}\n\nfunction parseScopes(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(/[,\\s]+/)\n .map((scope) => scope.trim())\n .filter(Boolean);\n}\n\nasync function exchangeCodeForToken(args: {\n clientId: string;\n clientSecret: string;\n redirectUri: string;\n code: string;\n}): Promise<LinearTokenResponse> {\n const response = await fetch(LINEAR_TOKEN_ENDPOINT, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n client_id: args.clientId,\n client_secret: args.clientSecret,\n code: args.code,\n redirect_uri: args.redirectUri,\n grant_type: \"authorization_code\",\n }).toString(),\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Linear token exchange failed with ${response.status}: ${body}`);\n }\n const parsed = (await response.json()) as LinearTokenResponse;\n if (parsed.error) {\n throw new Error(\n `Linear token exchange returned error ${parsed.error}: ${parsed.error_description ?? \"no description\"}`\n );\n }\n if (!parsed.access_token) {\n throw new Error(\"Linear token exchange returned no access_token.\");\n }\n return parsed;\n}\n\nasync function fetchLinearViewer(accessToken: string): Promise<LinearViewerPayload> {\n const response = await fetch(LINEAR_GRAPHQL_ENDPOINT, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query: \"{ viewer { id name email organization { id name urlKey } } }\",\n }),\n });\n if (!response.ok) {\n throw new Error(`Linear viewer query failed with ${response.status}`);\n }\n return (await response.json()) as LinearViewerPayload;\n}\n\nfunction synthesizeEnvAccounts(runtime: IAgentRuntime): ConnectorAccount[] {\n const now = Date.now();\n return readLinearAccounts(runtime).map((account) => ({\n id: account.accountId,\n provider: LINEAR_PROVIDER_NAME,\n label: account.label ?? `Linear (${account.accountId})`,\n role: \"OWNER\" as const,\n purpose: DEFAULT_PURPOSES,\n accessGate: \"open\" as const,\n status: \"connected\" as const,\n externalId: account.workspaceId,\n displayHandle: account.workspaceId ?? account.accountId,\n createdAt: now,\n updatedAt: now,\n metadata: {\n authMethod: \"api_key\",\n source: \"env\",\n defaultTeamKey: account.defaultTeamKey ?? null,\n },\n }));\n}\n\n/**\n * Build the Linear ConnectorAccountManager provider.\n */\nexport function createLinearConnectorAccountProvider(\n runtime: IAgentRuntime\n): ConnectorAccountProvider {\n return {\n provider: LINEAR_PROVIDER_NAME,\n label: \"Linear\",\n\n listAccounts: async (manager: ConnectorAccountManager): Promise<ConnectorAccount[]> => {\n const stored = await manager.getStorage().listAccounts(LINEAR_PROVIDER_NAME);\n if (stored.length > 0) return stored;\n return synthesizeEnvAccounts(runtime);\n },\n\n createAccount: async (input: ConnectorAccountPatch, _manager: ConnectorAccountManager) => {\n return {\n ...input,\n provider: LINEAR_PROVIDER_NAME,\n role: input.role ?? \"OWNER\",\n purpose: input.purpose ?? DEFAULT_PURPOSES,\n accessGate: input.accessGate ?? \"open\",\n status: input.status ?? \"pending\",\n };\n },\n\n patchAccount: async (\n _accountId: string,\n patch: ConnectorAccountPatch,\n _manager: ConnectorAccountManager\n ) => {\n return { ...patch, provider: LINEAR_PROVIDER_NAME };\n },\n\n deleteAccount: async (_accountId: string, _manager: ConnectorAccountManager): Promise<void> => {\n // Credential cleanup is the credential store's responsibility.\n },\n\n startOAuth: async (\n request: ConnectorOAuthStartRequest,\n _manager: ConnectorAccountManager\n ): Promise<ConnectorOAuthStartResult> => {\n const config = readClientConfig(runtime);\n const redirectUri = request.redirectUri ?? config.redirectUri;\n const scopes =\n request.scopes && request.scopes.length > 0\n ? request.scopes\n : [\"read\", \"write\", \"issues:create\", \"comments:create\"];\n\n const params = new URLSearchParams({\n client_id: config.clientId,\n redirect_uri: redirectUri,\n response_type: \"code\",\n scope: scopes.join(\",\"),\n state: request.flow.state,\n prompt: \"consent\",\n });\n\n return {\n authUrl: `${LINEAR_AUTHORIZATION_ENDPOINT}?${params.toString()}`,\n metadata: {\n ...request.metadata,\n requestedScopes: scopes,\n redirectUri,\n },\n };\n },\n\n completeOAuth: async (\n request: ConnectorOAuthCallbackRequest,\n _manager: ConnectorAccountManager\n ): Promise<ConnectorOAuthCallbackResult> => {\n const code = nonEmptyString(request.code);\n if (!code) {\n throw new Error(\"Linear OAuth callback is missing an authorization code.\");\n }\n\n const config = readClientConfig(runtime);\n const redirectUri = nonEmptyString(request.flow.redirectUri) ?? config.redirectUri;\n\n const tokens = await exchangeCodeForToken({\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n redirectUri,\n code,\n });\n\n if (!tokens.access_token) {\n throw new Error(\"Linear token exchange returned no access_token.\");\n }\n\n const viewerPayload = await fetchLinearViewer(tokens.access_token);\n const viewer = viewerPayload.data?.viewer;\n const organization = viewer?.organization;\n const workspaceId = nonEmptyString(organization?.id);\n const workspaceHandle = nonEmptyString(organization?.urlKey);\n const externalId = workspaceId ?? workspaceHandle;\n if (!externalId) {\n throw new Error(\"Linear viewer payload did not include an organization id or urlKey.\");\n }\n\n const accountPatch: ConnectorAccountPatch & { provider: string } = {\n provider: LINEAR_PROVIDER_NAME,\n role: \"OWNER\",\n purpose: DEFAULT_PURPOSES,\n accessGate: \"open\",\n status: \"connected\",\n externalId,\n displayHandle: workspaceHandle ?? externalId,\n label: nonEmptyString(organization?.name) ?? nonEmptyString(workspaceHandle) ?? \"Linear\",\n metadata: {\n authMethod: \"oauth\",\n workspaceId: workspaceId ?? null,\n workspaceHandle: workspaceHandle ?? null,\n workspaceName: nonEmptyString(organization?.name) ?? null,\n viewerId: nonEmptyString(viewer?.id) ?? null,\n viewerEmail: nonEmptyString(viewer?.email) ?? null,\n viewerName: nonEmptyString(viewer?.name) ?? null,\n tokenType: nonEmptyString(tokens.token_type) ?? \"bearer\",\n grantedScopes: parseScopes(tokens.scope),\n hasRefreshToken: Boolean(tokens.refresh_token),\n },\n };\n\n logger.info(\n {\n src: \"plugin:linear:connector\",\n workspaceId: workspaceId ?? null,\n workspaceHandle: workspaceHandle ?? null,\n },\n \"Linear OAuth completed\"\n );\n\n return {\n account: accountPatch,\n flow: { status: \"completed\" },\n };\n },\n };\n}\n",
|
|
24
|
+
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { LinearService } from \"../services/linear\";\nimport type { LinearActivityItem } from \"../types\";\n\nfunction formatDetails(details: unknown): string {\n if (details === null || details === undefined) {\n return \"none\";\n }\n if (Array.isArray(details)) {\n return details.map(formatDetails).join(\", \");\n }\n if (typeof details !== \"object\") {\n return String(details);\n }\n return Object.entries(details as Record<string, unknown>)\n .map(([key, value]) => `${key}: ${formatDetails(value)}`)\n .join(\"; \");\n}\n\nexport const linearActivityProvider: Provider = {\n name: \"LINEAR_ACTIVITY\",\n description: \"Provides context about recent Linear activity\",\n descriptionCompressed: \"provide context recent Linear activity\",\n dynamic: true,\n contexts: [\"automation\", \"connectors\"],\n contextGate: { anyOf: [\"automation\", \"connectors\"] },\n cacheScope: \"turn\",\n roleGate: { minRole: \"ADMIN\" },\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).map((item) => ({\n id: item.id,\n action: item.action,\n resource_type: item.resource_type,\n resource_id: item.resource_id,\n success: item.success,\n error: item.error,\n details: formatDetails(item.details),\n timestamp:\n typeof item.timestamp === \"string\"\n ? item.timestamp\n : new Date(item.timestamp).toISOString(),\n })) as Array<Record<string, string | boolean | undefined>>,\n },\n };\n } catch (_error) {\n return {\n text: \"Error retrieving Linear activity\",\n };\n }\n },\n};\n",
|
|
25
|
+
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { Issue } from \"@linear/sdk\";\nimport type { LinearService } from \"../services/linear\";\n\nexport const linearIssuesProvider: Provider = {\n name: \"LINEAR_ISSUES\",\n description: \"Provides context about recent Linear issues\",\n descriptionCompressed: \"provide context recent Linear issue\",\n dynamic: true,\n contexts: [\"automation\", \"connectors\"],\n contextGate: { anyOf: [\"automation\", \"connectors\"] },\n cacheScope: \"turn\",\n roleGate: { minRole: \"ADMIN\" },\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 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 const issuesList = await Promise.all(\n issues.map(async (issue: Issue) => {\n const [assignee, state] = await Promise.all([issue.assignee, issue.state]);\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: Issue) => ({\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};\n",
|
|
26
|
+
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { Project } from \"@linear/sdk\";\nimport type { LinearService } from \"../services/linear\";\n\nexport const linearProjectsProvider: Provider = {\n name: \"LINEAR_PROJECTS\",\n description: \"Provides context about active Linear projects\",\n descriptionCompressed: \"provide context active Linear project\",\n dynamic: true,\n contexts: [\"automation\", \"connectors\"],\n contextGate: { anyOf: [\"automation\", \"connectors\"] },\n cacheScope: \"agent\",\n roleGate: { minRole: \"ADMIN\" },\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 const activeProjects = projects.filter(\n (project: Project) => project.state === \"started\" || project.state === \"planned\"\n );\n\n const projectsList = activeProjects\n .slice(0, 10)\n .map(\n (project: Project) =>\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: Project) => ({\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};\n",
|
|
27
|
+
"import type { IAgentRuntime, Memory, Provider, State } from \"@elizaos/core\";\nimport type { Team } from \"@linear/sdk\";\nimport type { LinearService } from \"../services/linear\";\n\nconst MAX_LINEAR_TEAMS = 20;\nconst MAX_DESCRIPTION_CHARS = 180;\n\nexport const linearTeamsProvider: Provider = {\n name: \"LINEAR_TEAMS\",\n description: \"Provides context about Linear teams\",\n descriptionCompressed: \"provide context Linear team\",\n dynamic: true,\n contexts: [\"automation\", \"connectors\"],\n contextGate: { anyOf: [\"automation\", \"connectors\"] },\n cacheScope: \"agent\",\n roleGate: { minRole: \"ADMIN\" },\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 const listedTeams = teams.slice(0, MAX_LINEAR_TEAMS);\n\n if (teams.length === 0) {\n return {\n text: \"No Linear teams found\",\n };\n }\n\n const teamsList = listedTeams.map(\n (team: Team) =>\n `- ${team.name} (${team.key}): ${(team.description || \"No description\").slice(0, MAX_DESCRIPTION_CHARS)}`\n );\n\n const text = `Linear Teams:\\n${teamsList.join(\"\\n\")}`;\n\n return {\n text,\n data: {\n teams: listedTeams.map((team: Team) => ({\n id: team.id,\n name: team.name,\n key: team.key,\n })),\n truncated: teams.length > listedTeams.length,\n },\n };\n } catch (_error) {\n return {\n text: \"Error retrieving Linear teams\",\n };\n }\n },\n};\n",
|
|
28
|
+
"import type { IAgentRuntime, SearchCategoryRegistration } from \"@elizaos/core\";\n\nexport const LINEAR_ISSUES_SEARCH_CATEGORY: SearchCategoryRegistration = {\n category: \"linear_issues\",\n label: \"Linear issues\",\n description: \"Search Linear issues by text and issue metadata filters.\",\n contexts: [\"automation\", \"system\"],\n filters: [\n { name: \"query\", label: \"Query\", type: \"string\", required: true },\n {\n name: \"state\",\n label: \"States\",\n description: \"Issue workflow state names.\",\n type: \"string[]\",\n },\n {\n name: \"assignee\",\n label: \"Assignees\",\n description: \"Assignee names or emails.\",\n type: \"string[]\",\n },\n {\n name: \"label\",\n label: \"Labels\",\n description: \"Linear issue label names.\",\n type: \"string[]\",\n },\n {\n name: \"project\",\n label: \"Project\",\n description: \"Linear project name or identifier.\",\n type: \"string\",\n },\n {\n name: \"team\",\n label: \"Team\",\n description: \"Linear team key, name, or identifier.\",\n type: \"string\",\n },\n {\n name: \"priority\",\n label: \"Priorities\",\n description: \"Linear priorities: 1 urgent, 2 high, 3 normal, 4 low.\",\n type: \"number[]\",\n },\n {\n name: \"limit\",\n label: \"Limit\",\n description: \"Maximum issues to return.\",\n type: \"number\",\n default: 10,\n },\n {\n name: \"accountId\",\n label: \"Account\",\n description:\n \"Optional Linear account id. Defaults to LINEAR_DEFAULT_ACCOUNT_ID or the legacy single API key.\",\n type: \"string\",\n },\n ],\n resultSchemaSummary:\n \"LinearIssue[] with id, identifier, title, description, state, assignee, labels, priority, team, project, url, and updatedAt.\",\n capabilities: [\"issues\", \"filters\", \"workflow\", \"team\"],\n source: \"plugin:linear\",\n serviceType: \"linear\",\n};\n\nfunction hasSearchCategory(runtime: IAgentRuntime, category: string): boolean {\n try {\n runtime.getSearchCategory(category, { includeDisabled: true });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function registerLinearSearchCategory(runtime: IAgentRuntime): void {\n if (!hasSearchCategory(runtime, LINEAR_ISSUES_SEARCH_CATEGORY.category)) {\n runtime.registerSearchCategory(LINEAR_ISSUES_SEARCH_CATEGORY);\n }\n}\n",
|
|
29
|
+
"import { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport {\n type Comment,\n type Issue,\n type IssueLabel,\n LinearClient,\n type Project,\n type Team,\n type User,\n type WorkflowState,\n} from \"@linear/sdk\";\nimport {\n DEFAULT_LINEAR_ACCOUNT_ID,\n type LinearAccountConfig,\n normalizeLinearAccountId,\n readLinearAccounts,\n resolveLinearDefaultAccount,\n} from \"../accounts\";\nimport type {\n ActivityDetailObject,\n ActivityDetailValue,\n LinearActivityItem,\n LinearCommentInput,\n LinearIssueInput,\n LinearSearchFilters,\n} from \"../types\";\nimport { LinearAuthenticationError } from \"../types\";\n\ninterface LinearClientState {\n accountId: string;\n config: LinearAccountConfig;\n client: LinearClient;\n}\n\nexport class LinearService extends Service {\n static serviceType = \"linear\";\n\n capabilityDescription =\n \"Linear API integration for issue tracking, project management, and team collaboration\";\n\n private clients = new Map<string, LinearClientState>();\n private activityLog: LinearActivityItem[] = [];\n private defaultAccountId = DEFAULT_LINEAR_ACCOUNT_ID;\n public workspaceId?: string;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n\n const accounts = runtime ? readLinearAccounts(runtime) : [];\n const requestedDefault = runtime\n ? normalizeLinearAccountId(\n runtime.getSetting(\"LINEAR_DEFAULT_ACCOUNT_ID\") ?? runtime.getSetting(\"LINEAR_ACCOUNT_ID\")\n )\n : DEFAULT_LINEAR_ACCOUNT_ID;\n const defaultAccount = resolveLinearDefaultAccount(accounts, requestedDefault);\n\n if (!defaultAccount) {\n throw new LinearAuthenticationError(\"Linear API key is required\");\n }\n\n this.defaultAccountId = defaultAccount.accountId;\n this.workspaceId = defaultAccount.workspaceId;\n\n for (const account of accounts) {\n this.clients.set(account.accountId, {\n accountId: account.accountId,\n config: account,\n client: new LinearClient({ apiKey: account.apiKey }),\n });\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 private async validateConnection(accountId?: string): Promise<void> {\n try {\n const state = this.getAccountState(accountId);\n const viewer = await state.client.viewer;\n logger.info(`Linear connected as user: ${viewer.email} (accountId=${state.accountId})`);\n } catch (_error) {\n throw new LinearAuthenticationError(\"Failed to authenticate with Linear API\");\n }\n }\n\n hasAccount(accountId?: string): boolean {\n return Boolean(this.getAccountState(accountId, false));\n }\n\n getDefaultTeamKey(accountId?: string): string | undefined {\n return this.getAccountState(accountId).config.defaultTeamKey;\n }\n\n private getAccountState(accountId?: string): LinearClientState;\n private getAccountState(\n accountId: string | undefined,\n throwOnMissing: false\n ): LinearClientState | null;\n private getAccountState(accountId?: string, throwOnMissing = true): LinearClientState | null {\n const normalized = normalizeLinearAccountId(accountId);\n const state = accountId\n ? (this.clients.get(normalized) ?? null)\n : (this.clients.get(this.defaultAccountId) ?? Array.from(this.clients.values())[0] ?? null);\n if (!state && throwOnMissing) {\n throw new LinearAuthenticationError(\"Linear API key is required\");\n }\n return state;\n }\n\n private getClient(accountId?: string): LinearClient {\n return this.getAccountState(accountId)?.client as LinearClient;\n }\n\n private logActivity(\n action: string,\n resourceType: LinearActivityItem[\"resource_type\"],\n resourceId: string,\n details: Record<string, ActivityDetailValue>,\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 if (this.activityLog.length > 1000) {\n this.activityLog = this.activityLog.slice(-1000);\n }\n }\n\n getActivityLog(\n limit?: number,\n filter?: Partial<LinearActivityItem>,\n accountId?: string\n ): 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 if (accountId) {\n filtered = filtered.filter((item) => item.details.accountId === accountId);\n }\n\n return filtered.slice(-(limit || 100));\n }\n\n clearActivityLog(accountId?: string): void {\n if (accountId) {\n this.activityLog = this.activityLog.filter((item) => item.details.accountId !== accountId);\n logger.info(`Linear activity log cleared for accountId=${accountId}`);\n return;\n }\n this.activityLog = [];\n logger.info(\"Linear activity log cleared\");\n }\n\n async getTeams(accountId?: string): Promise<Team[]> {\n const state = this.getAccountState(accountId);\n const teams = await state.client.teams();\n const teamList = await teams.nodes;\n\n this.logActivity(\n \"list_teams\",\n \"team\",\n \"all\",\n { count: teamList.length, accountId: state.accountId },\n true\n );\n return teamList;\n }\n\n async getTeam(teamId: string, accountId?: string): Promise<Team> {\n const state = this.getAccountState(accountId);\n const team = await state.client.team(teamId);\n this.logActivity(\n \"get_team\",\n \"team\",\n teamId,\n { name: team.name, accountId: state.accountId },\n true\n );\n return team;\n }\n\n async createIssue(input: LinearIssueInput, accountId?: string): Promise<Issue> {\n const state = this.getAccountState(accountId);\n const issuePayload = await state.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(\n \"create_issue\",\n \"issue\",\n issue.id,\n {\n title: input.title,\n teamId: input.teamId,\n accountId: state.accountId,\n },\n true\n );\n\n return issue;\n }\n\n async getIssue(issueId: string, accountId?: string): Promise<Issue> {\n const state = this.getAccountState(accountId);\n const issue = await state.client.issue(issueId);\n this.logActivity(\n \"get_issue\",\n \"issue\",\n issueId,\n {\n title: issue.title,\n identifier: issue.identifier,\n accountId: state.accountId,\n },\n true\n );\n return issue;\n }\n\n async updateIssue(\n issueId: string,\n updates: Partial<LinearIssueInput>,\n accountId?: string\n ): Promise<Issue> {\n const state = this.getAccountState(accountId);\n const updatePayload = await state.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(\n \"update_issue\",\n \"issue\",\n issueId,\n { ...updates, accountId: state.accountId },\n true\n );\n return issue;\n }\n\n async deleteIssue(issueId: string, accountId?: string): Promise<void> {\n const state = this.getAccountState(accountId);\n const archivePayload = await state.client.archiveIssue(issueId);\n\n const success = await archivePayload.success;\n if (!success) {\n throw new Error(\"Failed to archive issue\");\n }\n\n this.logActivity(\n \"delete_issue\",\n \"issue\",\n issueId,\n { action: \"archived\", accountId: state.accountId },\n true\n );\n }\n\n async searchIssues(filters: LinearSearchFilters, accountId?: string): Promise<Issue[]> {\n const state = this.getAccountState(accountId);\n const filterObject: Record<string, string | number | boolean | object | null | undefined> = {};\n\n if (filters.query) {\n filterObject.or = [\n { title: { containsIgnoreCase: filters.query } },\n { description: { containsIgnoreCase: filters.query } },\n ];\n }\n\n if (filters.team) {\n const teams = await this.getTeams(state.accountId);\n const team = teams.find(\n (t) =>\n t.key.toLowerCase() === filters.team?.toLowerCase() ||\n t.name.toLowerCase() === filters.team?.toLowerCase()\n );\n\n if (team) {\n filterObject.team = { id: { eq: team.id } };\n }\n }\n\n if (filters.assignee && filters.assignee.length > 0) {\n const users = await this.getUsers(state.accountId);\n const assigneeIds = filters.assignee\n .map((assigneeName) => {\n const user = users.find(\n (u) =>\n u.email === assigneeName || u.name.toLowerCase().includes(assigneeName.toLowerCase())\n );\n return user?.id;\n })\n .filter(Boolean);\n\n if (assigneeIds.length > 0) {\n filterObject.assignee = { id: { in: assigneeIds } };\n }\n }\n\n if (filters.priority && filters.priority.length > 0) {\n filterObject.priority = { number: { in: filters.priority } };\n }\n\n // Add state filter\n if (filters.state && filters.state.length > 0) {\n filterObject.state = {\n name: { in: filters.state },\n };\n }\n\n if (filters.label && filters.label.length > 0) {\n filterObject.labels = {\n some: {\n name: { in: filters.label },\n },\n };\n }\n\n const query = state.client.issues({\n first: filters.limit || 50,\n filter: Object.keys(filterObject).length > 0 ? filterObject : undefined,\n });\n\n const issues = await query;\n const issueList = await issues.nodes;\n\n this.logActivity(\n \"search_issues\",\n \"issue\",\n \"search\",\n {\n filters: { ...filters, accountId: state.accountId } as ActivityDetailObject,\n count: issueList.length,\n },\n true\n );\n\n return issueList;\n }\n\n async createComment(input: LinearCommentInput, accountId?: string): Promise<Comment> {\n const state = this.getAccountState(accountId);\n const commentPayload = await state.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(\n \"create_comment\",\n \"comment\",\n comment.id,\n {\n issueId: input.issueId,\n bodyLength: input.body.length,\n accountId: state.accountId,\n },\n true\n );\n\n return comment;\n }\n\n async updateComment(commentId: string, body: string, accountId?: string): Promise<Comment> {\n const state = this.getAccountState(accountId);\n const commentPayload = await state.client.updateComment(commentId, {\n body,\n });\n const comment = await commentPayload.comment;\n if (!comment) {\n throw new Error(\"Failed to update comment\");\n }\n this.logActivity(\n \"update_comment\",\n \"comment\",\n commentId,\n { bodyLength: body.length, accountId: state.accountId },\n true\n );\n return comment;\n }\n\n async deleteComment(commentId: string, accountId?: string): Promise<void> {\n const state = this.getAccountState(accountId);\n const payload = await state.client.deleteComment(commentId);\n if (!payload.success) {\n throw new Error(\"Failed to delete comment\");\n }\n this.logActivity(\"delete_comment\", \"comment\", commentId, { accountId: state.accountId }, true);\n }\n\n async listComments(issueId: string, limit = 25, accountId?: string): Promise<Comment[]> {\n const issue = await this.getClient(accountId).issue(issueId);\n const connection = await issue.comments({ first: Math.min(limit, 100) });\n return connection.nodes;\n }\n\n async getProjects(teamId?: string, accountId?: string): Promise<Project[]> {\n const state = this.getAccountState(accountId);\n // Linear SDK v51 requires manual team filtering on projects\n const query = state.client.projects({\n first: 100,\n });\n\n const projects = await query;\n let projectList = await projects.nodes;\n\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: Team) => team.id === teamId);\n return hasTeam ? project : null;\n })\n );\n projectList = filteredProjects.filter(Boolean) as Project[];\n }\n\n this.logActivity(\n \"list_projects\",\n \"project\",\n \"all\",\n {\n count: projectList.length,\n teamId,\n accountId: state.accountId,\n },\n true\n );\n\n return projectList;\n }\n\n async getProject(projectId: string, accountId?: string): Promise<Project> {\n const state = this.getAccountState(accountId);\n const project = await state.client.project(projectId);\n this.logActivity(\n \"get_project\",\n \"project\",\n projectId,\n {\n name: project.name,\n accountId: state.accountId,\n },\n true\n );\n return project;\n }\n\n async getUsers(accountId?: string): Promise<User[]> {\n const state = this.getAccountState(accountId);\n const users = await state.client.users();\n const userList = await users.nodes;\n\n this.logActivity(\n \"list_users\",\n \"user\",\n \"all\",\n {\n count: userList.length,\n accountId: state.accountId,\n },\n true\n );\n\n return userList;\n }\n\n async getCurrentUser(accountId?: string): Promise<User> {\n const state = this.getAccountState(accountId);\n const user = await state.client.viewer;\n this.logActivity(\n \"get_current_user\",\n \"user\",\n user.id,\n {\n email: user.email,\n name: user.name,\n accountId: state.accountId,\n },\n true\n );\n return user;\n }\n\n async getUserTeams(accountId?: string): Promise<Team[]> {\n const state = this.getAccountState(accountId);\n const viewer = await state.client.viewer;\n const teams = await viewer.teams();\n const teamList = await teams.nodes;\n\n this.logActivity(\n \"list_user_teams\",\n \"team\",\n viewer.id,\n {\n count: teamList.length,\n accountId: state.accountId,\n },\n true\n );\n\n return teamList;\n }\n\n async getLabels(teamId?: string, accountId?: string): Promise<IssueLabel[]> {\n const state = this.getAccountState(accountId);\n const query = state.client.issueLabels({\n first: 100,\n filter: teamId\n ? {\n team: { id: { eq: teamId } },\n }\n : undefined,\n });\n\n const labels = await query;\n const labelList = await labels.nodes;\n\n this.logActivity(\n \"list_labels\",\n \"label\",\n \"all\",\n {\n count: labelList.length,\n teamId,\n accountId: state.accountId,\n },\n true\n );\n\n return labelList;\n }\n\n async getWorkflowStates(teamId: string, accountId?: string): Promise<WorkflowState[]> {\n const state = this.getAccountState(accountId);\n const states = await state.client.workflowStates({\n filter: {\n team: { id: { eq: teamId } },\n },\n });\n\n const stateList = await states.nodes;\n\n this.logActivity(\n \"list_workflow_states\",\n \"team\",\n teamId,\n {\n count: stateList.length,\n accountId: state.accountId,\n },\n true\n );\n\n return stateList;\n }\n}\n",
|
|
30
|
+
"export interface LinearConfig {\n LINEAR_API_KEY: string;\n LINEAR_WORKSPACE_ID?: string;\n LINEAR_ACCOUNT_ID?: string;\n LINEAR_DEFAULT_ACCOUNT_ID?: string;\n LINEAR_ACCOUNTS?: string;\n}\n\n/** Primitive types allowed in activity details */\nexport type ActivityDetailPrimitive = string | number | boolean | null;\n\n/** Array types allowed in activity details */\nexport type ActivityDetailArray = ActivityDetailPrimitive[];\n\n/** Nested object allowed in activity details (one level deep) */\nexport type ActivityDetailObject = Record<string, ActivityDetailPrimitive | ActivityDetailArray>;\n\n/** Valid values for activity detail fields */\nexport type ActivityDetailValue =\n | ActivityDetailPrimitive\n | ActivityDetailArray\n | ActivityDetailObject\n | Date;\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, ActivityDetailValue>;\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\nexport interface CreateCommentParameters {\n issueId?: string;\n body?: string;\n}\n\nexport interface UpdateCommentParameters {\n commentId?: string;\n body?: string;\n}\n\nexport interface DeleteCommentParameters {\n commentId?: string;\n}\n\nexport interface ListCommentsParameters {\n issueId?: string;\n limit?: number;\n}\n\nexport interface CreateIssueParameters {\n issueData?: Partial<LinearIssueInput>;\n}\n\nexport interface DeleteIssueParameters {\n issueId?: string;\n}\n\nexport interface SearchIssuesParameters {\n filters?: LinearSearchFilters;\n limit?: number;\n}\n\nexport interface LinearErrorResponse {\n message?: string;\n errors?: Array<{ message: string; path?: string[] }>;\n}\nexport class LinearAPIError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: LinearErrorResponse\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}\n"
|
|
23
31
|
],
|
|
24
|
-
"mappings": ";AAAA;AAAA;AAAA;AAYO,IAAM,sBAA8B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS,CAAC,yBAAyB,yBAAyB,wBAAwB;AAAA,EAEpF,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,uBAAuB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,uBAAuB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,SAAS,UAAU,UAAU;AAAA,IACnD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,cAAc,iBAAiB;AAAA,MAErC,MAAM,iBAAiB;AAAA,MACvB,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,OAAO,OAAO;AAAA,MACd,OAAO,MAAM,oCAAoC,KAAK;AAAA,MACtD,MAAM,eAAe,sCAAqC,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACnG,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;AC1HA;AAAA,YAME;AAAA;AAAA;;;ACIK,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuB9B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB5B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa5B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+B5B,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BzB,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgC7B,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0B1B,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwC7B,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AD/M5B,IAAM,sBAA8B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,uBAAuB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,uBAAuB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,uBAAuB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,UAAU,UAAU,SAAS;AAAA,IACnD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ;AAAA,MAChC,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,eAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,IAAI;AAAA,MACJ,IAAI;AAAA,MAEJ,MAAM,SAAS,UAAU;AAAA,MACzB,IAAI,QAAQ,WAAW,QAAQ,MAAM;AAAA,QACnC,UAAU,OAAO;AAAA,QACjB,cAAc,OAAO;AAAA,MACvB,EAAO;AAAA,QACL,MAAM,SAAS,sBAAsB,QAAQ,mBAAmB,OAAO;AAAA,QACvE,MAAM,WAAW,MAAM,QAAQ,SAAS,UAAU,YAAY;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,IAAI,CAAC,UAAU;AAAA,UACb,MAAM,aAAa,QAAQ,MACzB,qEACF;AAAA,UACA,IAAI,YAAY;AAAA,YACd,UAAU,WAAW;AAAA,YACrB,cAAc,WAAW,GAAG,KAAK;AAAA,UACnC,EAAO;AAAA,YACL,MAAM,IAAI,MAAM,sCAAsC;AAAA;AAAA,QAE1D,EAAO;AAAA,UACL,IAAI;AAAA,YACF,MAAM,SAAS,KAAK,MAClB,SACG,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK,CACV;AAAA,YAEA,IAAI,OAAO,SAAS;AAAA,cAClB,UAAU,OAAO;AAAA,cACjB,cAAc,OAAO;AAAA,YACvB,EAAO,SAAI,OAAO,kBAAkB;AAAA,cAClC,MAAM,UAA2D;AAAA,gBAC/D,OAAO,OAAO;AAAA,gBACd,OAAO;AAAA,cACT;AAAA,cAEA,MAAM,iBAAiB,QAAQ,WAAW,yBAAyB;AAAA,cACnE,IAAI,gBAAgB;AAAA,gBAClB,QAAQ,OAAO;AAAA,cACjB;AAAA,cAEA,MAAM,SAAS,MAAM,cAAc,aAAa,OAAO;AAAA,cAEvD,IAAI,OAAO,WAAW,GAAG;AAAA,gBACvB,MAAM,eAAe,6BAA6B,OAAO;AAAA,gBACzD,MAAM,WAAW;AAAA,kBACf,MAAM;AAAA,kBACN,QAAQ,QAAQ,QAAQ;AAAA,gBAC1B,CAAC;AAAA,gBACD,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,SAAS;AAAA,gBACX;AAAA,cACF;AAAA,cAEA,IAAI,OAAO,WAAW,GAAG;AAAA,gBACvB,UAAU,OAAO,GAAG;AAAA,gBACpB,cAAc,OAAO;AAAA,cACvB,EAAO;AAAA,gBACL,MAAM,YAAY,MAAM,QAAQ,IAC9B,OAAO,IAAI,OAAO,QAAO,UAAU;AAAA,kBACjC,MAAM,QAAQ,MAAM,OAAM;AAAA,kBAC1B,OAAO,GAAG,QAAQ,MAAM,OAAM,eAAe,OAAM,UAAU,OAAO,QAAQ;AAAA,iBAC7E,CACH;AAAA,gBAEA,MAAM,iBAAiB,mCAAmC,OAAO;AAAA,EAAuB,UAAU,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,gBAC3G,MAAM,WAAW;AAAA,kBACf,MAAM;AAAA,kBACN,QAAQ,QAAQ,QAAQ;AAAA,gBAC1B,CAAC;AAAA,gBAED,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,MAAM;AAAA,oBACJ,iBAAiB;AAAA,oBACjB,QAAQ,OAAO,IAAI,CAAC,OAAO;AAAA,sBACzB,IAAI,EAAE;AAAA,sBACN,YAAY,EAAE;AAAA,sBACd,OAAO,EAAE;AAAA,oBACX,EAAE;AAAA,oBACF,gBAAgB,OAAO;AAAA,kBACzB;AAAA,gBACF;AAAA;AAAA,YAEJ,EAAO;AAAA,cACL,MAAM,IAAI,MAAM,0CAA0C;AAAA;AAAA,YAG5D,IAAI,OAAO,eAAe,OAAO,gBAAgB,QAAQ;AAAA,cACvD,cAAc,IAAI,OAAO,YAAY,YAAY,MAAM;AAAA,YACzD;AAAA,YACA,OAAO,YAAY;AAAA,YACnB,QAAO,KAAK,wDAAwD,UAAU;AAAA,YAC9E,MAAM,aAAa,QAAQ,MACzB,qEACF;AAAA,YAEA,IAAI,CAAC,YAAY;AAAA,cACf,MAAM,eACJ;AAAA,cACF,MAAM,WAAW;AAAA,gBACf,MAAM;AAAA,gBACN,QAAQ,QAAQ,QAAQ;AAAA,cAC1B,CAAC;AAAA,cACD,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,cACX;AAAA,YACF;AAAA,YAEA,UAAU,WAAW;AAAA,YACrB,cAAc,WAAW,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA,MAKvC,IAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAAA,QAC5C,MAAM,eAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,MAAM,QAAQ,MAAM,cAAc,SAAS,OAAO;AAAA,MAElD,MAAM,UAAU,MAAM,cAAc,cAAc;AAAA,QAChD,SAAS,MAAM;AAAA,QACf,MAAM;AAAA,MACR,CAAC;AAAA,MAED,MAAM,iBAAiB,4BAA2B,MAAM,gBAAgB;AAAA,MACxE,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,0BAA0B,MAAM;AAAA,QACtC,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,WAAW,QAAQ;AAAA,UACnB,SAAS,MAAM;AAAA,UACf,iBAAiB,MAAM;AAAA,UACvB;AAAA,UACA,WACE,QAAQ,qBAAqB,OAAO,QAAQ,UAAU,YAAY,IAAI,QAAQ;AAAA,QAClF;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,6BAA6B,KAAK;AAAA,MAC/C,MAAM,eAAe,+BAA8B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC5F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;AElTA;AAAA,YAME;AAAA,eAEA;AAAA;AAOK,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS,CAAC,uBAAuB,oBAAoB,kBAAkB;AAAA,EAEvE,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,UAAU,UAAU,OAAO;AAAA,IACjD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ;AAAA,MAChC,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,eAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,UAAU;AAAA,MACzB,MAAM,iBAAiB,QAAQ;AAAA,MAE/B,IAAI;AAAA,MAEJ,IAAI,gBAAgB;AAAA,QAClB,YAAY;AAAA,MACd,EAAO;AAAA,QACL,MAAM,SAAS,oBAAoB,QAAQ,mBAAmB,OAAO;AAAA,QAErE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,IAAI,CAAC,UAAU;AAAA,UACb,MAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAAA,QAEA,IAAI;AAAA,UACF,MAAM,kBAAkB,SACrB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK;AAAA,UACR,MAAM,SAAS,KAAK,MAAM,eAAe;AAAA,UAEzC,YAAY;AAAA,YACV,OAAO,OAAO,SAAS;AAAA,YACvB,aAAa,OAAO,eAAe;AAAA,YACnC,UAAU,OAAO,WAAW,OAAO,OAAO,QAAQ,IAAI;AAAA,UACxD;AAAA,UAEA,IAAI,OAAO,SAAS;AAAA,YAClB,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,YAC3C,MAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI,YAAY,MAAM,OAAO,QAAQ,YAAY,CAAC;AAAA,YACnF,IAAI,MAAM;AAAA,cACR,UAAU,SAAS,KAAK;AAAA,YAC1B;AAAA,UACF;AAAA,UAEA,IAAI,OAAO,YAAY,OAAO,aAAa,IAAI;AAAA,YAC7C,MAAM,gBAAgB,OAAO,SAAS,QAAQ,MAAM,EAAE;AAAA,YAEtD,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,YAC3C,MAAM,OAAO,MAAM,KACjB,CAAC,MACC,EAAE,UAAU,iBACZ,EAAE,KAAK,YAAY,EAAE,SAAS,cAAc,YAAY,CAAC,CAC7D;AAAA,YACA,IAAI,MAAM;AAAA,cACR,UAAU,aAAa,KAAK;AAAA,YAC9B;AAAA,UACF;AAAA,UAEA,IAAI,OAAO,UAAU,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,OAAO,SAAS,GAAG;AAAA,YAC7E,MAAM,SAAS,MAAM,cAAc,UAAU,UAAU,MAAM;AAAA,YAC7D,MAAM,WAAqB,CAAC;AAAA,YAE5B,WAAW,aAAa,OAAO,QAAQ;AAAA,cACrC,IAAI,aAAa,cAAc,IAAI;AAAA,gBACjC,MAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,UAAU,YAAY,CAAC;AAAA,gBACjF,IAAI,OAAO;AAAA,kBACT,SAAS,KAAK,MAAM,EAAE;AAAA,gBACxB;AAAA,cACF;AAAA,YACF;AAAA,YAEA,IAAI,SAAS,SAAS,GAAG;AAAA,cACvB,UAAU,WAAW;AAAA,YACvB;AAAA,UACF;AAAA,UAEA,IAAI,CAAC,UAAU,QAAQ;AAAA,YACrB,MAAM,iBAAiB,QAAQ,WAAW,yBAAyB;AAAA,YAEnE,IAAI,gBAAgB;AAAA,cAClB,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,cAC3C,MAAM,cAAc,MAAM,KACxB,CAAC,MAAM,EAAE,IAAI,YAAY,MAAM,eAAe,YAAY,CAC5D;AAAA,cACA,IAAI,aAAa;AAAA,gBACf,UAAU,SAAS,YAAY;AAAA,gBAC/B,QAAO,KACL,kCAAkC,YAAY,SAAS,YAAY,MACrE;AAAA,cACF,EAAO;AAAA,gBACL,QAAO,KAAK,oBAAoB,0BAA0B;AAAA;AAAA,YAE9D;AAAA,YAEA,IAAI,CAAC,UAAU,QAAQ;AAAA,cACrB,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,cAC3C,IAAI,MAAM,SAAS,GAAG;AAAA,gBACpB,UAAU,SAAS,MAAM,GAAG;AAAA,gBAC5B,QAAO,KAAK,kDAAkD,MAAM,GAAG,MAAM;AAAA,cAC/E;AAAA,YACF;AAAA,UACF;AAAA,UACA,OAAO,YAAY;AAAA,UACnB,QAAO,MAAM,iCAAiC,UAAU;AAAA,UACxD,YAAY;AAAA,YACV,OAAO,QAAQ,SAAS,MAAM,GAAG,QAAQ,UAAU,GAAG,GAAG,SAAS;AAAA,YAClE,aAAa;AAAA,UACf;AAAA,UAEA,MAAM,iBAAiB,QAAQ,WAAW,yBAAyB;AAAA,UACnE,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,UAE3C,IAAI,gBAAgB;AAAA,YAClB,MAAM,cAAc,MAAM,KACxB,CAAC,MAAM,EAAE,IAAI,YAAY,MAAM,eAAe,YAAY,CAC5D;AAAA,YACA,IAAI,aAAa;AAAA,cACf,UAAU,SAAS,YAAY;AAAA,cAC/B,QAAO,KACL,+CAA+C,YAAY,SAAS,YAAY,MAClF;AAAA,YACF;AAAA,UACF;AAAA,UAEA,IAAI,CAAC,UAAU,UAAU,MAAM,SAAS,GAAG;AAAA,YACzC,UAAU,SAAS,MAAM,GAAG;AAAA,YAC5B,QAAO,KAAK,4CAA4C,MAAM,GAAG,MAAM;AAAA,UACzE;AAAA;AAAA;AAAA,MAIJ,IAAI,CAAC,UAAU,OAAO;AAAA,QACpB,MAAM,eAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,IAAI,CAAC,UAAU,QAAQ;AAAA,QACrB,MAAM,eACJ;AAAA,QACF,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,MAAM,QAAQ,MAAM,cAAc,YAAY,SAA6B;AAAA,MAE3E,MAAM,iBAAiB,2BAA0B,MAAM,UAAU,MAAM;AAAA;AAAA,cAA8B,MAAM;AAAA,MAC3G,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,kBAAkB,MAAM,UAAU,MAAM;AAAA,QAC9C,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,SAAS,MAAM;AAAA,UACf,YAAY,MAAM;AAAA,UAClB,KAAK,MAAM;AAAA,QACb;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,2BAA2B,KAAK;AAAA,MAC7C,MAAM,eAAe,6BAA4B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC1F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;ACtSA;AAAA,YAME;AAAA,eAEA;AAAA;AAOK,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,UAAU,UAAU,OAAO;AAAA,IACjD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ;AAAA,MAChC,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,eAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,IAAI;AAAA,MAEJ,MAAM,SAAS,UAAU;AAAA,MACzB,IAAI,QAAQ,SAAS;AAAA,QACnB,UAAU,OAAO;AAAA,MACnB,EAAO;AAAA,QACL,MAAM,SAAS,oBAAoB,QAAQ,mBAAmB,OAAO;AAAA,QAErE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,IAAI,CAAC,UAAU;AAAA,UACb,MAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AAAA,QAEA,IAAI;AAAA,UACF,MAAM,kBAAkB,SACrB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK;AAAA,UACR,MAAM,SAAS,KAAK,MAAM,eAAe;AAAA,UAEzC,UAAU,OAAO;AAAA,UACjB,IAAI,CAAC,SAAS;AAAA,YACZ,MAAM,IAAI,MAAM,uCAAuC;AAAA,UACzD;AAAA,UACA,OAAO,YAAY;AAAA,UACnB,QAAO,KAAK,gEAAgE,UAAU;AAAA,UAEtF,MAAM,aAAa,QAAQ,MAAM,WAAW;AAAA,UAC5C,IAAI,CAAC,YAAY;AAAA,YACf,MAAM,eAAe;AAAA,YACrB,MAAM,WAAW;AAAA,cACf,MAAM;AAAA,cACN,QAAQ,QAAQ,QAAQ;AAAA,YAC1B,CAAC;AAAA,YACD,OAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,UAEA,UAAU,WAAW;AAAA;AAAA;AAAA,MAIzB,MAAM,QAAQ,MAAM,cAAc,SAAS,OAAO;AAAA,MAClD,MAAM,aAAa,MAAM;AAAA,MACzB,MAAM,kBAAkB,MAAM;AAAA,MAE9B,QAAO,KAAK,mBAAmB,oBAAoB,YAAY;AAAA,MAE/D,MAAM,cAAc,YAAY,OAAO;AAAA,MAEvC,MAAM,iBAAiB,iCAAgC,qBAAqB;AAAA;AAAA;AAAA,MAC5E,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,kBAAkB,qBAAqB;AAAA,QAC7C,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,SAAS,MAAM;AAAA,UACf,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,2BAA2B,KAAK;AAAA,MAC7C,MAAM,eAAe,6BAA4B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC1F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;ACzNA;AAAA,YAME;AAAA,eAEA;AAAA;AAMK,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,OAAO,UAAU,UAAU;AAAA,IACjD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ,QAAQ;AAAA,MACxC,MAAM,UAAmC,CAAC;AAAA,MAC1C,IAAI,QAAQ;AAAA,MAEZ,IAAI,SAAS;AAAA,QACX,MAAM,SAAS,oBAAoB,QAAQ,mBAAmB,OAAO;AAAA,QACrE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,IAAI,UAAU;AAAA,UACZ,IAAI;AAAA,YACF,MAAM,SAAS,KAAK,MAClB,SACG,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK,CACV;AAAA,YAEA,IAAI,OAAO,WAAW;AAAA,cACpB,MAAM,MAAM,IAAI;AAAA,cAChB,IAAI;AAAA,cAEJ,IAAI,OAAO,UAAU,MAAM;AAAA,gBACzB,WAAW,IAAI,KAAK,OAAO,UAAU,IAAI;AAAA,cAC3C,EAAO,SAAI,OAAO,UAAU,QAAQ;AAAA,gBAClC,QAAQ,OAAO,UAAU;AAAA,uBAClB;AAAA,oBACH,WAAW,IAAI,KAAK,IAAI,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,oBAC5C;AAAA,uBACG;AAAA,oBACH,WAAW,IAAI,KAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAAC;AAAA,oBAClD,SAAS,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,oBAC5B;AAAA,uBACG;AAAA,oBACH,WAAW,IAAI,KAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,OAAO,CAAC,CAAC;AAAA,oBAC7D,SAAS,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,oBAC5B;AAAA,uBACG;AAAA,oBACH,WAAW,IAAI,KAAK,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC;AAAA,oBACjE,SAAS,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,oBAC5B;AAAA,uBACG;AAAA,oBACH,WAAW,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,CAAC;AAAA,oBACxD;AAAA;AAAA,cAEN;AAAA,cAEA,IAAI,UAAU;AAAA,gBACZ,QAAQ,WAAW,SAAS,YAAY;AAAA,cAC1C;AAAA,YACF;AAAA,YAEA,IAAI,OAAO,eAAe,OAAO,YAAY,SAAS,GAAG;AAAA,cACvD,QAAQ,SAAS,OAAO,YAAY;AAAA,YACtC;AAAA,YAEA,IAAI,OAAO,iBAAiB,OAAO,cAAc,SAAS,GAAG;AAAA,cAC3D,QAAQ,gBAAgB,OAAO,cAAc;AAAA,YAC/C;AAAA,YAEA,IAAI,OAAO,YAAY;AAAA,cACrB,QAAQ,cAAc,OAAO;AAAA,YAC/B;AAAA,YAEA,IAAI,OAAO,iBAAiB,OAAO,kBAAkB,OAAO;AAAA,cAC1D,QAAQ,UAAU,OAAO,kBAAkB;AAAA,YAC7C;AAAA,YAEA,QAAQ,OAAO,SAAS;AAAA,YACxB,OAAO,YAAY;AAAA,YACnB,QAAO,KAAK,qCAAqC,UAAU;AAAA;AAAA,QAE/D;AAAA,MACF;AAAA,MAEA,IAAI,WAAW,cAAc,eAAe,QAAQ,GAAG,OAAO;AAAA,MAE9D,IAAI,QAAQ,UAAU;AAAA,QACpB,MAAM,gBAAgB,QAAQ;AAAA,QAC9B,MAAM,WACJ,OAAO,kBAAkB,WACrB,gBACA,yBAAyB,OACvB,cAAc,YAAY,IAC1B,OAAO,aAAa;AAAA,QAC5B,MAAM,WAAW,IAAI,KAAK,QAAQ,EAAE,QAAQ;AAAA,QAC5C,IAAI,CAAC,OAAO,MAAM,QAAQ,GAAG;AAAA,UAC3B,WAAW,SAAS,OAAO,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ,KAAK,QAAQ;AAAA,QACrF;AAAA,MACF;AAAA,MAEA,WAAW,SAAS,MAAM,GAAG,KAAK;AAAA,MAElC,IAAI,SAAS,WAAW,GAAG;AAAA,QACzB,MAAM,oBAAoB,QAAQ,WAC9B,wDACA;AAAA,QACJ,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,YACJ,UAAU,CAAC;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,SAClB,IAAI,CAAC,MAAM,UAAU;AAAA,QACpB,MAAM,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,eAAe;AAAA,QACrD,MAAM,SAAS,KAAK,UAAU,MAAK;AAAA,QACnC,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO,EACxC,OAAO,EAAE,SAAS,QAAQ,SAAS,EACnC,IAAI,EAAE,KAAK,WAAW,GAAG,QAAQ,KAAK,UAAU,KAAK,GAAG,EACxD,KAAK,IAAI;AAAA,QAEZ,OAAO,GAAG,QAAQ,MAAM,UAAU,KAAK,aAAa,KAAK,iBAAiB,KAAK;AAAA,WAAyB;AAAA,KAAY,UAAU,YAAY,YAAY,KAAK,KAAK,QAAQ;AAAA,YAAe,KAAK,UAAU;AAAA,OACvM,EACA,KAAK;AAAA;AAAA,CAAM;AAAA,MAEd,MAAM,aAAa,QAAQ,WACvB,gCAAqB,aACrB;AAAA,MAEJ,MAAM,gBAAgB,GAAG;AAAA;AAAA,EAAiB;AAAA,MAC1C,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,SAAS,SAAS,uBAAuB,SAAS,WAAW,IAAI,KAAK;AAAA,QAC5E,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,UAAU,SAAS,IAAI,CAAC,UAAU;AAAA,YAChC,IAAI,KAAK;AAAA,YACT,QAAQ,KAAK;AAAA,YACb,eAAe,KAAK;AAAA,YACpB,aAAa,KAAK;AAAA,YAClB,SAAS,KAAK;AAAA,YACd,OAAO,KAAK;AAAA,YACZ,SAAS,KAAK,UAAU,KAAK,OAAO;AAAA,YACpC,WACE,OAAO,KAAK,cAAc,WACtB,KAAK,YACL,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY;AAAA,UAC7C,EAAE;AAAA,UACF,SAAS,UACL;AAAA,eACK;AAAA,YACH,UAAU,QAAQ,WACd,OAAO,QAAQ,aAAa,WAC1B,QAAQ,WACR,OAAO,QAAQ,QAAQ,IACzB;AAAA,UACN,IACA;AAAA,UACJ,OAAO,SAAS;AAAA,QAClB;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,2BAA2B,KAAK;AAAA,MAC7C,MAAM,eAAe,6BAA4B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC1F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;ACxSA;AAAA,YAME;AAAA,eAEA;AAAA;AAOK,IAAM,iBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,kBAAkB;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,kBAAkB;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,kBAAkB;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,OAAO,UAAU,OAAO;AAAA,IAC9C,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ;AAAA,MAChC,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,gBAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,iBAAiB,QAAQ,mBAAmB,OAAO;AAAA,MAClE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,MAED,IAAI,CAAC,UAAU;AAAA,QACb,MAAM,aAAa,QAAQ,MAAM,WAAW;AAAA,QAC5C,IAAI,YAAY;AAAA,UACd,MAAM,QAAQ,MAAM,cAAc,SAAS,WAAW,EAAE;AAAA,UACxD,OAAO,MAAM,oBAAoB,OAAO,UAAU,OAAO;AAAA,QAC3D;AAAA,QACA,MAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AAAA,MAEA,IAAI;AAAA,QACF,MAAM,SAAS,KAAK,MAClB,SACG,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK,CACV;AAAA,QAEA,IAAI,OAAO,UAAU;AAAA,UACnB,MAAM,QAAQ,MAAM,cAAc,SAAS,OAAO,QAAQ;AAAA,UAC1D,OAAO,MAAM,oBAAoB,OAAO,UAAU,OAAO;AAAA,QAC3D;AAAA,QAEA,IAAI,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AAAA,UAC9D,MAAM,UAAmC,CAAC;AAAA,UAE1C,IAAI,OAAO,SAAS,OAAO;AAAA,YACzB,QAAQ,QAAQ,OAAO,SAAS;AAAA,UAClC;AAAA,UAEA,IAAI,OAAO,SAAS,UAAU;AAAA,YAC5B,QAAQ,WAAW,CAAC,OAAO,SAAS,QAAQ;AAAA,UAC9C;AAAA,UAEA,IAAI,OAAO,SAAS,UAAU;AAAA,YAC5B,MAAM,cAAsC;AAAA,cAC1C,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,YACP;AAAA,YACA,MAAM,WAAW,YAAY,OAAO,SAAS,SAAS,YAAY;AAAA,YAClE,IAAI,UAAU;AAAA,cACZ,QAAQ,WAAW,CAAC,QAAQ;AAAA,YAC9B;AAAA,UACF;AAAA,UAEA,IAAI,OAAO,SAAS,MAAM;AAAA,YACxB,QAAQ,OAAO,OAAO,SAAS;AAAA,UACjC;AAAA,UAEA,IAAI,OAAO,SAAS,OAAO;AAAA,YACzB,QAAQ,QAAQ,CAAC,OAAO,SAAS,KAAK;AAAA,UACxC;AAAA,UAEA,MAAM,iBAAiB,QAAQ,WAAW,yBAAyB;AAAA,UACnE,IAAI,kBAAkB,CAAC,QAAQ,MAAM;AAAA,YACnC,QAAQ,OAAO;AAAA,UACjB;AAAA,UAEA,MAAM,SAAS,MAAM,cAAc,aAAa;AAAA,eAC3C;AAAA,YACH,OAAO,OAAO,SAAS,UAAU,KAAK;AAAA,UACxC,CAAC;AAAA,UAED,IAAI,OAAO,WAAW,GAAG;AAAA,YACvB,MAAM,mBAAmB;AAAA,YACzB,MAAM,WAAW;AAAA,cACf,MAAM;AAAA,cACN,QAAQ,QAAQ,QAAQ;AAAA,YAC1B,CAAC;AAAA,YACD,OAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,UAEA,IAAI,OAAO,SAAS,SAAS;AAAA,YAC3B,OAAO,KACL,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAC5E;AAAA,UACF;AAAA,UAEA,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,GAAG;AAAA,YAChD,OAAO,MAAM,oBAAoB,OAAO,IAAI,UAAU,OAAO;AAAA,UAC/D;AAAA,UAEA,IAAI,OAAO,WAAW,GAAG;AAAA,YACvB,OAAO,MAAM,oBAAoB,OAAO,IAAI,UAAU,OAAO;AAAA,UAC/D;AAAA,UAEA,MAAM,YAAY,MAAM,QAAQ,IAC9B,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,OAAO,OAAO,UAAU;AAAA,YAC7C,MAAM,QAAQ,MAAM,MAAM;AAAA,YAC1B,OAAO,GAAG,QAAQ,MAAM,MAAM,eAAe,MAAM,UAAU,OAAO,QAAQ;AAAA,WAC7E,CACH;AAAA,UAEA,MAAM,iBAAiB,SAAS,OAAO;AAAA,EAA0C,UAAU,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,UACpG,MAAM,WAAW;AAAA,YACf,MAAM;AAAA,YACN,QAAQ,QAAQ,QAAQ;AAAA,UAC1B,CAAC;AAAA,UAED,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,QAAQ,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO;AAAA,gBACrC,IAAI,EAAE;AAAA,gBACN,YAAY,EAAE;AAAA,gBACd,OAAO,EAAE;AAAA,cACX,EAAE;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,QACA,OAAO,YAAY;AAAA,QACnB,QAAO,KAAK,wDAAwD,UAAU;AAAA,QAC9E,MAAM,aAAa,QAAQ,MAAM,WAAW;AAAA,QAC5C,IAAI,YAAY;AAAA,UACd,MAAM,QAAQ,MAAM,cAAc,SAAS,WAAW,EAAE;AAAA,UACxD,OAAO,MAAM,oBAAoB,OAAO,UAAU,OAAO;AAAA,QAC3D;AAAA;AAAA,MAGF,MAAM,eACJ;AAAA,MACF,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,wBAAwB,KAAK;AAAA,MAC1C,MAAM,eAAe,0BAAyB,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACvF,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;AAEA,eAAe,mBAAmB,CAChC,OACA,UACA,SACuB;AAAA,EACvB,MAAM,WAAW,MAAM,MAAM;AAAA,EAC7B,MAAM,QAAQ,MAAM,MAAM;AAAA,EAC1B,MAAM,OAAO,MAAM,MAAM;AAAA,EACzB,MAAM,SAAS,MAAM,MAAM,OAAO;AAAA,EAClC,MAAM,UAAU,MAAM,MAAM;AAAA,EAE5B,MAAM,eAAe;AAAA,IACnB,IAAI,MAAM;AAAA,IACV,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM;AAAA,IAChB,eAAe,MAAM;AAAA,IACrB,KAAK,MAAM;AAAA,IACX,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,UAAU,WACN;AAAA,MACE,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,IAClB,IACA;AAAA,IACJ,OAAO,QACH;AAAA,MACE,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf,IACA;AAAA,IACJ,MAAM,OACF;AAAA,MACE,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,IACZ,IACA;AAAA,IACJ,QAAQ,OAAO,MAAM,IAAI,CAAC,WAAuB;AAAA,MAC/C,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf,EAAE;AAAA,IACF,SAAS,UACL;AAAA,MACE,IAAI,QAAQ;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,IACvB,IACA;AAAA,EACN;AAAA,EAEA,MAAM,iBAAiB,CAAC,IAAI,UAAU,QAAQ,UAAU,KAAK;AAAA,EAC7D,MAAM,WAAW,eAAe,MAAM,YAAY,MAAM;AAAA,EAExD,MAAM,YACJ,aAAa,OAAO,SAAS,IACzB,WAAW,aAAa,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,MAC3D;AAAA,EAEN,MAAM,eAAe,kBAAO,MAAM,eAAe,MAAM;AAAA;AAAA,UAE/C,OAAO,QAAQ;AAAA,YACb;AAAA,QACJ,MAAM,QAAQ;AAAA,YACV,UAAU,QAAQ;AAAA,EAC5B,MAAM,UAAU,QAAQ,IAAI,KAAK,MAAM,OAAO,EAAE,mBAAmB,MAAM;AAAA,EACzE;AAAA,EACA,UAAU,YAAY,QAAQ,SAAS;AAAA;AAAA,EAEvC,MAAM,eAAe;AAAA;AAAA,kBAEL,MAAM;AAAA,EAEtB,MAAM,WAAW;AAAA,IACf,MAAM;AAAA,IACN,QAAQ,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AAAA,EAED,MAAM,kBAAkB;AAAA,OACnB;AAAA,IACH,WACE,aAAa,qBAAqB,OAC9B,aAAa,UAAU,YAAY,IACnC,aAAa;AAAA,IACnB,WACE,aAAa,qBAAqB,OAC9B,aAAa,UAAU,YAAY,IACnC,aAAa;AAAA,IACnB,SAAS,aAAa,UAClB,aAAa,mBAAmB,OAC9B,aAAa,QAAQ,YAAY,IACjC,aAAa,UACf;AAAA,EACN;AAAA,EAEA,OAAO;AAAA,IACL,MAAM,mBAAmB,MAAM,eAAe,MAAM;AAAA,IACpD,SAAS;AAAA,IACT,MAAM,EAAE,OAAO,gBAAgB;AAAA,EACjC;AAAA;;;AChZF;AAAA,YAME;AAAA,eAEA;AAAA;AAOK,IAAM,qBAA6B;AAAA,EACxC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,sBAAsB;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,sBAAsB;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,sBAAsB;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,QAAQ,UAAU,UAAU;AAAA,IAClD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ,QAAQ;AAAA,MACxC,IAAI;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI;AAAA,MAEJ,IAAI,SAAS;AAAA,QACX,MAAM,SAAS,qBAAqB,QAAQ,mBAAmB,OAAO;AAAA,QACtE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,IAAI,UAAU;AAAA,UACZ,IAAI;AAAA,YACF,MAAM,SAAS,KAAK,MAClB,SACG,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK,CACV;AAAA,YAEA,IAAI,OAAO,YAAY;AAAA,cACrB,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,cAC3C,MAAM,OAAO,MAAM,KACjB,CAAC,MACC,EAAE,IAAI,YAAY,MAAM,OAAO,WAAW,YAAY,KACtD,EAAE,KAAK,YAAY,MAAM,OAAO,WAAW,YAAY,CAC3D;AAAA,cACA,IAAI,MAAM;AAAA,gBACR,SAAS,KAAK;AAAA,gBACd,QAAO,KAAK,+BAA+B,KAAK,SAAS,KAAK,MAAM;AAAA,cACtE;AAAA,YACF;AAAA,YAEA,UAAU,OAAO,YAAY;AAAA,YAC7B,cAAc,OAAO;AAAA,YACrB,OAAO,YAAY;AAAA,YACnB,QAAO,KAAK,yDAAyD,UAAU;AAAA,YAE/E,MAAM,YAAY,QAAQ,MAAM,0CAA0C;AAAA,YAC1E,IAAI,WAAW;AAAA,cACb,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,cAC3C,MAAM,OAAO,MAAM,KACjB,CAAC,MACC,EAAE,IAAI,YAAY,MAAM,UAAU,GAAG,YAAY,KACjD,EAAE,KAAK,YAAY,MAAM,UAAU,GAAG,YAAY,CACtD;AAAA,cACA,IAAI,MAAM;AAAA,gBACR,SAAS,KAAK;AAAA,gBACd,QAAO,KAAK,+BAA+B,KAAK,SAAS,KAAK,MAAM;AAAA,cACtE;AAAA,YACF;AAAA,YAEA,UACE,QAAQ,YAAY,EAAE,SAAS,KAAK,KAAK,QAAQ,YAAY,EAAE,SAAS,SAAS;AAAA;AAAA,QAEvF;AAAA,MACF;AAAA,MAEA,IAAI,CAAC,UAAU,CAAC,SAAS;AAAA,QACvB,MAAM,iBAAiB,QAAQ,WAAW,yBAAyB;AAAA,QACnE,IAAI,gBAAgB;AAAA,UAClB,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,UAC3C,MAAM,cAAc,MAAM,KACxB,CAAC,MAAM,EAAE,IAAI,YAAY,MAAM,eAAe,YAAY,CAC5D;AAAA,UACA,IAAI,aAAa;AAAA,YACf,SAAS,YAAY;AAAA,YACrB,QAAO,KACL,8CAA8C,YAAY,SAAS,YAAY,MACjF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,WAAW,MAAM,cAAc,YAAY,MAAM;AAAA,MAErD,IAAI,eAAe,gBAAgB,OAAO;AAAA,QACxC,WAAW,SAAS,OAAO,CAAC,YAAY;AAAA,UACtC,MAAM,QAAQ,QAAQ,OAAO,YAAY,KAAK;AAAA,UAC9C,IAAI,gBAAgB,UAAU;AAAA,YAC5B,OAAO,UAAU,aAAa,UAAU,iBAAiB,CAAC;AAAA,UAC5D,EAAO,SAAI,gBAAgB,WAAW;AAAA,YACpC,OAAO,UAAU,aAAa,UAAU;AAAA,UAC1C,EAAO,SAAI,gBAAgB,aAAa;AAAA,YACtC,OAAO,UAAU,eAAe,UAAU,UAAU,UAAU;AAAA,UAChE;AAAA,UACA,OAAO;AAAA,SACR;AAAA,MACH;AAAA,MAEA,IAAI,SAAS,WAAW,GAAG;AAAA,QACzB,MAAM,oBAAoB,SACtB,8CACA;AAAA,QACJ,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,YACJ,UAAU,CAAC;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,sBAAsB,MAAM,QAAQ,IACxC,SAAS,IAAI,OAAO,YAAY;AAAA,QAC9B,MAAM,aAAa,MAAM,QAAQ,MAAM;AAAA,QACvC,MAAM,QAAQ,MAAM,WAAW;AAAA,QAC/B,MAAM,OAAO,MAAM,QAAQ;AAAA,QAE3B,OAAO;AAAA,aACF;AAAA,UACH,WAAW;AAAA,UACX,UAAU;AAAA,QACZ;AAAA,OACD,CACH;AAAA,MAEA,MAAM,cAAc,oBACjB,IAAI,CAAC,SAAS,UAAU;AAAA,QACvB,MAAM,YAAY,QAAQ,UAAU,IAAI,CAAC,MAAY,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK;AAAA,QAC3E,MAAM,SAAS,QAAQ,SAAS;AAAA,QAChC,MAAM,WAAW,QAAQ,WACrB,KAAK,KAAK,MAAM,QAAQ,WAAW,GAAG,iBACtC;AAAA,QACJ,MAAM,OAAO,QAAQ,WAAW,YAAY,QAAQ,SAAS,SAAS;AAAA,QACtE,MAAM,QAAQ,CAAC;AAAA,QACf,IAAI,QAAQ;AAAA,UACV,MAAM,KAAK,UAAU,IAAI,KAAK,QAAQ,SAAS,EAAE,mBAAmB,GAAG;AAAA,QACzE,IAAI,QAAQ;AAAA,UACV,MAAM,KAAK,QAAQ,IAAI,KAAK,QAAQ,UAAU,EAAE,mBAAmB,GAAG;AAAA,QACxE,MAAM,WAAW,MAAM,SAAS,IAAI;AAAA,KAAQ,MAAM,KAAK,KAAK,MAAM;AAAA,QAElE,OAAO,GAAG,QAAQ,MAAM,QAAQ,OAAO,QAAQ,cAAc,MAAM,QAAQ,gBAAgB;AAAA,aAAkB,SAAS,qBAAqB,YAAY,OAAO;AAAA,OAC/J,EACA,KAAK;AAAA;AAAA,CAAM;AAAA,MAEd,MAAM,aACJ,eAAe,gBAAgB,QAC3B,sBAAW,SAAS,UAAU,sBAAsB,SAAS,WAAW,IAAI,KAAK,SACjF,sBAAW,SAAS,iBAAiB,SAAS,WAAW,IAAI,KAAK;AAAA,MAExE,MAAM,gBAAgB,GAAG;AAAA;AAAA,EAAiB;AAAA,MAC1C,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,SAAS,SAAS,iBAAiB,SAAS,WAAW,IAAI,KAAK;AAAA,QACtE,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,UAAU,oBAAoB,IAAI,CAAC,OAAO;AAAA,YACxC,IAAI,EAAE;AAAA,YACN,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,KAAK,EAAE;AAAA,YACP,OAAO,EAAE,UAAU,IAAI,CAAC,OAAa;AAAA,cACnC,IAAI,EAAE;AAAA,cACN,MAAM,EAAE;AAAA,cACR,KAAK,EAAE;AAAA,YACT,EAAE;AAAA,YACF,MAAM,EAAE,WACJ;AAAA,cACE,IAAI,EAAE,SAAS;AAAA,cACf,MAAM,EAAE,SAAS;AAAA,cACjB,OAAO,EAAE,SAAS;AAAA,YACpB,IACA;AAAA,YACJ,OAAO,EAAE;AAAA,YACT,UAAU,EAAE;AAAA,YACZ,WAAW,EAAE;AAAA,YACb,YAAY,EAAE;AAAA,UAChB,EAAE;AAAA,UACF,OAAO,SAAS;AAAA,UAChB,SAAS;AAAA,YACP,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,4BAA4B,KAAK;AAAA,MAC9C,MAAM,eAAe,8BAA6B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;AC7TA;AAAA,YAME;AAAA,eAEA;AAAA;AAaK,IAAM,kBAA0B;AAAA,EACrC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS,CAAC,qBAAqB,qBAAqB,oBAAoB,mBAAmB;AAAA,EAE3F,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,mBAAmB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,mBAAmB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,mBAAmB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,QAAQ,UAAU,OAAO;AAAA,IAC/C,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ,QAAQ;AAAA,MACxC,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI,UAAU;AAAA,MACd,IAAI,iBAAiB;AAAA,MAErB,IAAI,SAAS;AAAA,QACX,MAAM,SAAS,kBAAkB,QAAQ,mBAAmB,OAAO;AAAA,QACnE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,IAAI,UAAU;AAAA,UACZ,IAAI;AAAA,YACF,MAAM,SAAS,KAAK,MAClB,SACG,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK,CACV;AAAA,YAEA,aAAa,OAAO;AAAA,YACpB,eAAe,OAAO;AAAA,YACtB,UAAU,OAAO,YAAY;AAAA,YAC7B,iBAAiB,OAAO,mBAAmB;AAAA,YAC3C,OAAO,YAAY;AAAA,YACnB,QAAO,KAAK,iCAAiC,UAAU;AAAA;AAAA,QAE3D;AAAA,MACF;AAAA,MAEA,IAAI,QAAQ,MAAM,cAAc,SAAS;AAAA,MAEzC,IAAI,cAAc;AAAA,QAChB,QAAQ,MAAM,OACZ,CAAC,SACC,KAAK,IAAI,YAAY,MAAM,aAAa,YAAY,KACpD,KAAK,KAAK,YAAY,MAAM,aAAa,YAAY,CACzD;AAAA,MACF;AAAA,MAEA,IAAI,cAAc,CAAC,cAAc;AAAA,QAC/B,MAAM,WAAW,WAAW,YAAY,EAAE,MAAM,KAAK;AAAA,QACrD,QAAQ,MAAM,OAAO,CAAC,SAAS;AAAA,UAC7B,MAAM,WAAW,GAAG,KAAK,QAAQ,KAAK,eAAe,KAAK,YAAY;AAAA,UACtE,OAAO,SAAS,KAAK,CAAC,YAAY,SAAS,SAAS,OAAO,CAAC;AAAA,SAC7D;AAAA,MACH;AAAA,MAEA,IAAI,SAAS;AAAA,QACX,IAAI;AAAA,UACF,MAAM,YAAY,MAAM,cAAc,aAAa;AAAA,UACnD,MAAM,cAAc,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,UACtD,QAAQ,MAAM,OAAO,CAAC,SAAS,YAAY,IAAI,KAAK,EAAE,CAAC;AAAA,UACvD,OAAO,OAAO;AAAA,UACd,QAAO,KAAK,sCAAsC,KAAK;AAAA;AAAA,MAE3D;AAAA,MAEA,IAAI,MAAM,WAAW,GAAG;AAAA,QACtB,MAAM,iBAAiB,eACnB,2BAA2B,mBAC3B,aACE,4BAA4B,iBAC5B;AAAA,QACN,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,YACJ,OAAO,CAAC;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,mBAAsC;AAAA,MAC1C,IAAI,kBAAkB,cAAc;AAAA,QAClC,mBAAmB,MAAM,QAAQ,IAC/B,MAAM,IAAI,OAAO,SAAmC;AAAA,UAClD,MAAM,eAAe,MAAM,KAAK,QAAQ;AAAA,UACxC,MAAM,UAAU,MAAM,aAAa;AAAA,UACnC,MAAM,gBAAgB,MAAM,KAAK,SAAS;AAAA,UAC1C,MAAM,WAAW,MAAM,cAAc;AAAA,UAErC,OAAO,OAAO,OAAO,MAAM;AAAA,YACzB,aAAa,QAAQ;AAAA,YACrB,cAAc,SAAS;AAAA,YACvB,aAAa,eAAe,QAAQ,MAAM,GAAG,CAAC,IAAI,CAAC;AAAA,UACrD,CAAC;AAAA,SACF,CACH;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,iBACd,IAAI,CAAC,MAAuB,UAAkB;AAAA,QAC7C,IAAI,OAAO,GAAG,QAAQ,MAAM,KAAK,SAAS,KAAK;AAAA,QAE/C,IAAI,KAAK,aAAa;AAAA,UACpB,QAAQ;AAAA,KAAQ,KAAK;AAAA,QACvB;AAAA,QAEA,IAAI,kBAAkB,cAAc;AAAA,UAClC,QAAQ;AAAA,cAAiB,KAAK,eAAe,iBAAiB,KAAK,gBAAgB;AAAA,UAEnF,MAAM,cAAc,KAAK,eAAe,CAAC;AAAA,UACzC,IAAI,gBAAgB,YAAY,SAAS,GAAG;AAAA,YAC1C,MAAM,cAAc,YAAY,IAAI,CAAC,MAAY,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,YAClE,QAAQ;AAAA,mBAAsB,eAAe,KAAK,eAAe,KAAK,IAAI,SAAS;AAAA,UACrF;AAAA,QACF;AAAA,QAEA,OAAO;AAAA,OACR,EACA,KAAK;AAAA;AAAA,CAAM;AAAA,MAEd,MAAM,aACJ,gBAAgB,MAAM,WAAW,IAC7B,+BACA,aACE,sBAAW,MAAM,cAAc,MAAM,WAAW,IAAI,KAAK,iBAAiB,iBAC1E,sBAAW,MAAM,cAAc,MAAM,WAAW,IAAI,KAAK;AAAA,MAEjE,MAAM,gBAAgB,GAAG;AAAA;AAAA,EAAiB;AAAA,MAC1C,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,SAAS,MAAM,cAAc,MAAM,WAAW,IAAI,KAAK;AAAA,QAC7D,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,OAAO,iBAAiB,IAAI,CAAC,OAAwB;AAAA,YACnD,IAAI,EAAE;AAAA,YACN,MAAM,EAAE;AAAA,YACR,KAAK,EAAE;AAAA,YACP,aAAa,EAAE;AAAA,YACf,aAAa,EAAE;AAAA,YACf,cAAc,EAAE;AAAA,UAClB,EAAE;AAAA,UACF,OAAO,MAAM;AAAA,UACb,SAAS;AAAA,YACP,MAAM;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,yBAAyB,KAAK;AAAA,MAC3C,MAAM,eAAe,2BAA0B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACxF,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;AC5RA;AAAA,YAME;AAAA,eAEA;AAAA;AAOF,IAAM,iBAAiB;AAEhB,IAAM,qBAA6B;AAAA,EACxC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,sBAAsB;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,sBAAsB;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,sBAAsB;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,UAAU,UAAU,QAAQ;AAAA,IAClD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ;AAAA,MAChC,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,eAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,IAAI,UAA+B,CAAC;AAAA,MAEpC,MAAM,SAAS,UAAU;AAAA,MACzB,IAAI,QAAQ,SAAS;AAAA,QACnB,UAAU,OAAO;AAAA,MACnB,EAAO;AAAA,QACL,MAAM,SAAS,eAAe,QAAQ,mBAAmB,OAAO;AAAA,QAEhE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,IAAI,CAAC,UAAU;AAAA,UACb,UAAU,EAAE,OAAO,QAAQ;AAAA,QAC7B,EAAO;AAAA,UACL,IAAI;AAAA,YACF,MAAM,kBAAkB,SACrB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK;AAAA,YACR,MAAM,SAAS,KAAK,MAAM,eAAe;AAAA,YAEzC,UAAU;AAAA,cACR,OAAO,OAAO;AAAA,cACd,OAAO,OAAO,SAAS;AAAA,YACzB;AAAA,YAEA,IAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAAA,cAC7C,QAAQ,QAAQ,OAAO;AAAA,YACzB;AAAA,YAEA,IAAI,OAAO,aAAa,OAAO,UAAU,SAAS,GAAG;AAAA,cACnD,MAAM,qBAAqB,CAAC;AAAA,cAC5B,WAAW,YAAY,OAAO,WAAW;AAAA,gBACvC,IAAI,SAAS,YAAY,MAAM,MAAM;AAAA,kBACnC,IAAI;AAAA,oBACF,MAAM,cAAc,MAAM,cAAc,eAAe;AAAA,oBACvD,mBAAmB,KAAK,YAAY,KAAK;AAAA,oBACzC,MAAM;AAAA,oBACN,QAAO,KAAK,wCAAwC;AAAA;AAAA,gBAExD,EAAO;AAAA,kBACL,mBAAmB,KAAK,QAAQ;AAAA;AAAA,cAEpC;AAAA,cACA,IAAI,mBAAmB,SAAS,GAAG;AAAA,gBACjC,QAAQ,WAAW;AAAA,cACrB;AAAA,YACF;AAAA,YAEA,IAAI,OAAO,gBAAgB,OAAO;AAAA,cAChC,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,qBAAqB;AAAA,YAClE;AAAA,YAEA,IAAI,OAAO,cAAc,OAAO,WAAW,SAAS,GAAG;AAAA,cACrD,MAAM,cAAsC;AAAA,gBAC1C,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,cACP;AAAA,cACA,MAAM,aAAa,OAAO,WACvB,IAAI,CAAC,MAAc,YAAY,EAAE,YAAY,EAAE,EAC/C,OAAO,OAAO;AAAA,cACjB,IAAI,WAAW,SAAS,GAAG;AAAA,gBACzB,QAAQ,WAAW;AAAA,cACrB;AAAA,YACF;AAAA,YAEA,IAAI,OAAO,SAAS,OAAO,MAAM,SAAS,GAAG;AAAA,cAC3C,QAAQ,OAAO,OAAO,MAAM;AAAA,YAC9B;AAAA,YAEA,IAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAAA,cAC7C,QAAQ,QAAQ,OAAO;AAAA,YACzB;AAAA,YAEA,OAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AAAA,cACpC,IAAI,QAAQ,SAAsC,WAAW;AAAA,gBAC3D,OAAO,QAAQ;AAAA,cACjB;AAAA,aACD;AAAA,YACD,OAAO,YAAY;AAAA,YACnB,QAAO,MAAM,mCAAmC,UAAU;AAAA,YAE1D,UAAU,EAAE,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA,MAKjC,IAAI,CAAC,QAAQ,MAAM;AAAA,QACjB,MAAM,iBAAiB,QAAQ,WAAW,yBAAyB;AAAA,QACnE,IAAI,gBAAgB;AAAA,UAClB,MAAM,qBACJ,QAAQ,YAAY,EAAE,SAAS,KAAK,MACnC,QAAQ,YAAY,EAAE,SAAS,OAAO,KACrC,QAAQ,YAAY,EAAE,SAAS,KAAK,KACpC,QAAQ,YAAY,EAAE,SAAS,MAAM;AAAA,UAEzC,IAAI,CAAC,oBAAoB;AAAA,YACvB,QAAQ,OAAO;AAAA,YACf,QAAO,KAAK,iCAAiC,gBAAgB;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,SAAS;AAAA,MAElD,MAAM,SAAS,MAAM,cAAc,aAAa,OAAO;AAAA,MAEvD,IAAI,OAAO,WAAW,GAAG;AAAA,QACvB,MAAM,mBAAmB;AAAA,QACzB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,YACJ,QAAQ,CAAC;AAAA,YACT,SAAS,UAAU,KAAK,QAAQ,IAAI;AAAA,YACpC,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,MAAM,QAAQ,IAC9B,OAAO,IAAI,OAAO,OAAO,UAAU;AAAA,QACjC,MAAM,QAAQ,MAAM,MAAM;AAAA,QAC1B,MAAM,WAAW,MAAM,MAAM;AAAA,QAC7B,MAAM,iBAAiB,CAAC,IAAI,UAAU,QAAQ,UAAU,KAAK;AAAA,QAC7D,MAAM,WAAW,eAAe,MAAM,YAAY,MAAM;AAAA,QAExD,OAAO,GAAG,QAAQ,MAAM,MAAM,eAAe,MAAM;AAAA,aAAqB,OAAO,QAAQ,0BAA0B,wBAAwB,UAAU,QAAQ;AAAA,OAC5J,CACH;AAAA,MACA,MAAM,YAAY,UAAU,KAAK;AAAA;AAAA,CAAM;AAAA,MAEvC,MAAM,gBAAgB,sBAAW,OAAO,eAAe,OAAO,WAAW,IAAI,KAAK;AAAA;AAAA,EAAW;AAAA,MAC7F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,SAAS,OAAO,eAAe,OAAO,WAAW,IAAI,KAAK;AAAA,QAChE,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,QAAQ,MAAM,QAAQ,IACpB,OAAO,IAAI,OAAO,UAAU;AAAA,YAC1B,MAAM,QAAQ,MAAM,MAAM;AAAA,YAC1B,MAAM,WAAW,MAAM,MAAM;AAAA,YAC7B,MAAM,OAAO,MAAM,MAAM;AAAA,YAEzB,OAAO;AAAA,cACL,IAAI,MAAM;AAAA,cACV,YAAY,MAAM;AAAA,cAClB,OAAO,MAAM;AAAA,cACb,KAAK,MAAM;AAAA,cACX,UAAU,MAAM;AAAA,cAChB,OAAO,QAAQ,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,IAAI;AAAA,cACxD,UAAU,WAAW,EAAE,MAAM,SAAS,MAAM,OAAO,SAAS,MAAM,IAAI;AAAA,cACtE,MAAM,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,cAClD,WACE,MAAM,qBAAqB,OAAO,MAAM,UAAU,YAAY,IAAI,MAAM;AAAA,cAC1E,WACE,MAAM,qBAAqB,OAAO,MAAM,UAAU,YAAY,IAAI,MAAM;AAAA,YAC5E;AAAA,WACD,CACH;AAAA,UACA,SAAS,UAAU,KAAK,QAAQ,IAAI;AAAA,UACpC,OAAO,OAAO;AAAA,QAChB;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAO,MAAM,4BAA4B,KAAK;AAAA,MAC9C,MAAM,eAAe,8BAA6B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;ACvUA;AAAA,YAME;AAAA,eAEA;AAAA;AAOK,IAAM,oBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU;AAAA,IACR;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,SAAS,CAAC,qBAAqB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAO,SAAc,SAAc,OAAa,YAAoC;AAAA,IAC5F,MAAM,cAAc,OAAO,SAAS,SAAS,SAAS,WAAW,QAAQ,QAAQ,OAAO;AAAA,IACxF,MAAM,WAAW,YAAY,YAAY;AAAA,IACzC,MAAM,eAAe,CAAC,UAAU,UAAU,OAAO;AAAA,IACjD,MAAM,gBACJ,aAAa,SAAS,KAAK,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAC7F,MAAM,YAAY;AAAA,IAClB,MAAM,cAAc,UAAU,KAAK,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,SAAS,SAAS,UAAU,SAAS,UAAU,EAAE;AAAA,IAC3E,MAAM,qBAAqB;AAAA,IAC3B,MAAM,eAAe,qBACjB,eAAe,qBACf,QAAQ,cAAc,SAAS,SAAS,WAAW,SAAS,UAAU;AAAA,IAC1E,MAAM,cAAc,WAAW,OAAO,YAAY,WAAW,UAAU,CAAC;AAAA,IACxE,MAAM,cACJ,SAAS,KAAK,EAAE,SAAS,KACzB,OAAO,KAAK,WAAsC,EAAE,SAAS,KAC7D,QAAQ,SAAS,WAAW,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAEjE,IAAI,EAAE,iBAAiB,eAAe,gBAAgB,cAAc;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,qBAAqB,OAAO,UAAwB,UAAkB,WAAmB;AAAA,MAC7F,MAAM,SAAS,SAAQ,WAAW,gBAAgB;AAAA,MAClD,OAAO,CAAC,CAAC;AAAA;AAAA,IAEX,IAAI;AAAA,MACF,OAAO,QAAQ,MAAO,mBAA2B,SAAS,SAAS,OAAO,OAAO,CAAC;AAAA,MAClF,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,QAAO,CACX,SACA,SACA,QACA,UACA,UACuB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,MAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAAA,MAEA,MAAM,UAAU,QAAQ,QAAQ;AAAA,MAChC,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,eAAe;AAAA,QACrB,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,oBAAoB,QAAQ,mBAAmB,OAAO;AAAA,MAErE,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAU,YAAY;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,MAED,IAAI,CAAC,UAAU;AAAA,QACb,MAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AAAA,MAEA,IAAI;AAAA,MACJ,MAAM,UAAqC,CAAC;AAAA,MAE5C,IAAI;AAAA,QACF,MAAM,kBAAkB,SACrB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,WAAW,EAAE,EACrB,KAAK;AAAA,QACR,MAAM,SAAS,KAAK,MAAM,eAAe;AAAA,QAEzC,UAAU,OAAO;AAAA,QACjB,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,IAAI,MAAM,uCAAuC;AAAA,QACzD;AAAA,QAEA,IAAI,OAAO,SAAS,OAAO;AAAA,UACzB,QAAQ,QAAQ,OAAO,QAAQ;AAAA,QACjC;AAAA,QAEA,IAAI,OAAO,SAAS,aAAa;AAAA,UAC/B,QAAQ,cAAc,OAAO,QAAQ;AAAA,QACvC;AAAA,QAEA,IAAI,OAAO,SAAS,UAAU;AAAA,UAC5B,QAAQ,WAAW,OAAO,OAAO,QAAQ,QAAQ;AAAA,QACnD;AAAA,QAEA,IAAI,OAAO,SAAS,SAAS;AAAA,UAC3B,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,UAC3C,MAAM,OAAO,MAAM,KACjB,CAAC,MAAM,EAAE,IAAI,YAAY,MAAM,OAAO,QAAQ,QAAQ,YAAY,CACpE;AAAA,UACA,IAAI,MAAM;AAAA,YACR,QAAQ,SAAS,KAAK;AAAA,YACtB,SAAO,KAAK,yBAAyB,KAAK,SAAS,KAAK,MAAM;AAAA,UAChE,EAAO;AAAA,YACL,SAAO,KAAK,iBAAiB,OAAO,QAAQ,mBAAmB;AAAA;AAAA,QAEnE;AAAA,QAEA,IAAI,OAAO,SAAS,UAAU;AAAA,UAC5B,MAAM,gBAAgB,OAAO,QAAQ,SAAS,QAAQ,MAAM,EAAE;AAAA,UAC9D,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,UAC3C,MAAM,OAAO,MAAM,KACjB,CAAC,MACC,EAAE,UAAU,iBACZ,EAAE,KAAK,YAAY,EAAE,SAAS,cAAc,YAAY,CAAC,CAC7D;AAAA,UACA,IAAI,MAAM;AAAA,YACR,QAAQ,aAAa,KAAK;AAAA,UAC5B,EAAO;AAAA,YACL,SAAO,KAAK,QAAQ,yBAAyB;AAAA;AAAA,QAEjD;AAAA,QAEA,IAAI,OAAO,SAAS,QAAQ;AAAA,UAC1B,MAAM,QAAQ,MAAM,cAAc,SAAS,OAAO;AAAA,UAClD,MAAM,YAAY,MAAM,MAAM;AAAA,UAC9B,MAAM,SAAS,QAAQ,UAAU,WAAW;AAAA,UAC5C,IAAI,CAAC,QAAQ;AAAA,YACX,SAAO,KAAK,4CAA4C;AAAA,UAC1D,EAAO;AAAA,YACL,MAAM,SAAS,MAAM,cAAc,kBAAkB,MAAM;AAAA,YAE3D,MAAM,QAAQ,OAAO,KACnB,CAAC,MACC,EAAE,KAAK,YAAY,MAAM,OAAO,QAAQ,OAAO,YAAY,KAC3D,EAAE,KAAK,YAAY,MAAM,OAAO,QAAQ,OAAO,YAAY,CAC/D;AAAA,YAEA,IAAI,OAAO;AAAA,cACT,QAAQ,UAAU,MAAM;AAAA,cACxB,SAAO,KAAK,uBAAuB,MAAM,MAAM;AAAA,YACjD,EAAO;AAAA,cACL,SAAO,KAAK,UAAU,OAAO,QAAQ,2BAA2B;AAAA;AAAA;AAAA,QAGtE;AAAA,QAEA,IAAI,OAAO,SAAS,UAAU,MAAM,QAAQ,OAAO,QAAQ,MAAM,GAAG;AAAA,UAClE,MAAM,SAAS,QAAQ;AAAA,UACvB,MAAM,SAAS,MAAM,cAAc,UAAU,MAAM;AAAA,UACnD,MAAM,WAAqB,CAAC;AAAA,UAE5B,WAAW,aAAa,OAAO,QAAQ,QAAQ;AAAA,YAC7C,IAAI,WAAW;AAAA,cACb,MAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,UAAU,YAAY,CAAC;AAAA,cACjF,IAAI,OAAO;AAAA,gBACT,SAAS,KAAK,MAAM,EAAE;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,UAEA,QAAQ,WAAW;AAAA,QACrB;AAAA,QACA,OAAO,YAAY;AAAA,QACnB,SAAO,KAAK,gEAAgE,UAAU;AAAA,QAEtF,MAAM,aAAa,QAAQ,MAAM,WAAW;AAAA,QAC5C,IAAI,CAAC,YAAY;AAAA,UACf,MAAM,eAAe;AAAA,UACrB,MAAM,WAAW;AAAA,YACf,MAAM;AAAA,YACN,QAAQ,QAAQ,QAAQ;AAAA,UAC1B,CAAC;AAAA,UACD,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QAEA,UAAU,WAAW;AAAA,QAErB,MAAM,aAAa,QAAQ,MAAM,yBAAyB;AAAA,QAC1D,IAAI,YAAY;AAAA,UACd,QAAQ,QAAQ,WAAW;AAAA,QAC7B;AAAA,QAEA,MAAM,gBAAgB,QAAQ,MAAM,6BAA6B;AAAA,QACjE,IAAI,eAAe;AAAA,UACjB,MAAM,cAAsC;AAAA,YAC1C,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,KAAK;AAAA,UACP;AAAA,UACA,MAAM,WAAW,YAAY,cAAc,GAAG,YAAY;AAAA,UAC1D,IAAI,UAAU;AAAA,YACZ,QAAQ,WAAW;AAAA,UACrB;AAAA,QACF;AAAA;AAAA,MAGF,IAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AAAA,QACrC,MAAM,eACJ;AAAA,QACF,MAAM,WAAW;AAAA,UACf,MAAM;AAAA,UACN,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,MAAM,cAAc,YAAY,SAAS,OAAO;AAAA,MAErE,MAAM,gBAAgB,CAAC;AAAA,MACvB,IAAI,QAAQ;AAAA,QAAO,cAAc,KAAK,WAAW,QAAQ,QAAQ;AAAA,MACjE,IAAI,QAAQ;AAAA,QACV,cAAc,KACZ,aAAa,CAAC,IAAI,UAAU,QAAQ,UAAU,KAAK,EAAE,QAAQ,WAC/D;AAAA,MACF,IAAI,QAAQ;AAAA,QAAQ,cAAc,KAAK,eAAe;AAAA,MACtD,IAAI,QAAQ;AAAA,QAAY,cAAc,KAAK,kBAAkB;AAAA,MAC7D,IAAI,QAAQ;AAAA,QAAS,cAAc,KAAK,gBAAgB;AAAA,MACxD,IAAI,QAAQ;AAAA,QAAU,cAAc,KAAK,gBAAgB;AAAA,MAEzD,MAAM,iBAAiB,mBAAkB,aAAa,eAAe,cAAc,KAAK,IAAI;AAAA;AAAA,cAAoB,aAAa;AAAA,MAC7H,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MAED,OAAO;AAAA,QACL,MAAM,iBAAiB,aAAa,eAAe,cAAc,KAAK,IAAI;AAAA,QAC1E,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,SAAS,aAAa;AAAA,UACtB,YAAY,aAAa;AAAA,UACzB,SAAS,UACL,OAAO,YACL,OAAO,QAAQ,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW;AAAA,YAC5C;AAAA,YACA,iBAAiB,OAAO,MAAM,YAAY,IAAI;AAAA,UAChD,CAAC,CACH,IACA;AAAA,UACJ,KAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,SAAO,MAAM,2BAA2B,KAAK;AAAA,MAC7C,MAAM,eAAe,6BAA4B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC1F,MAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAAA,MACD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA;AAAA;AAGN;;;AChVO,IAAM,yBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,KAAK,OAAO,SAAwB,UAAkB,WAAkB;AAAA,IACtE,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,cAAc,eAAe,EAAE;AAAA,MAEhD,IAAI,SAAS,WAAW,GAAG;AAAA,QACzB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,SAAS,IAAI,CAAC,SAA6B;AAAA,QAC9D,MAAM,SAAS,KAAK,UAAU,MAAK;AAAA,QACnC,MAAM,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,mBAAmB;AAAA,QACzD,OAAO,GAAG,UAAU,SAAS,KAAK,UAAU,KAAK,iBAAiB,KAAK;AAAA,OACxE;AAAA,MAED,MAAM,OAAO;AAAA,EAA4B,aAAa,KAAK;AAAA,CAAI;AAAA,MAE/D,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,UACJ,UAAU,SAAS,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,UAAU;AAAA,YAC7C,IAAI,KAAK;AAAA,YACT,QAAQ,KAAK;AAAA,YACb,eAAe,KAAK;AAAA,YACpB,aAAa,KAAK;AAAA,YAClB,SAAS,KAAK;AAAA,YACd,OAAO,KAAK;AAAA,YACZ,SAAS,KAAK,UAAU,KAAK,OAAO;AAAA,YACpC,WACE,OAAO,KAAK,cAAc,WACtB,KAAK,YACL,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY;AAAA,UAC7C,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,OAAO;AAAA,QACL,MAAM;AAAA,MACR;AAAA;AAAA;AAGN;;;ACrDO,IAAM,uBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,KAAK,OAAO,SAAwB,UAAkB,WAAkB;AAAA,IACtE,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,MAAM,cAAc,aAAa,EAAE,OAAO,GAAG,CAAC;AAAA,MAE7D,IAAI,OAAO,WAAW,GAAG;AAAA,QACvB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,aAAa,MAAM,QAAQ,IAC/B,OAAO,IAAI,OAAO,UAAiB;AAAA,QACjC,OAAO,UAAU,SAAS,MAAM,QAAQ,IAAI,CAAC,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,QAEzE,OAAO,KAAK,MAAM,eAAe,MAAM,UAAU,OAAO,QAAQ,cAAc,UAAU,QAAQ;AAAA,OACjG,CACH;AAAA,MAEA,MAAM,OAAO;AAAA,EAA0B,WAAW,KAAK;AAAA,CAAI;AAAA,MAE3D,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,UACJ,QAAQ,OAAO,IAAI,CAAC,WAAkB;AAAA,YACpC,IAAI,MAAM;AAAA,YACV,YAAY,MAAM;AAAA,YAClB,OAAO,MAAM;AAAA,UACf,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,OAAO;AAAA,QACL,MAAM;AAAA,MACR;AAAA;AAAA;AAGN;;;AC/CO,IAAM,yBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,KAAK,OAAO,SAAwB,UAAkB,WAAkB;AAAA,IACtE,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,MAAM,cAAc,YAAY;AAAA,MAEjD,IAAI,SAAS,WAAW,GAAG;AAAA,QACzB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,iBAAiB,SAAS,OAC9B,CAAC,YAAqB,QAAQ,UAAU,aAAa,QAAQ,UAAU,SACzE;AAAA,MAEA,MAAM,eAAe,eAClB,MAAM,GAAG,EAAE,EACX,IACC,CAAC,YACC,KAAK,QAAQ,SAAS,QAAQ,UAAU,QAAQ,aAAa,qBAAqB,QAAQ,cAAc,mBAC5G;AAAA,MAEF,MAAM,OAAO;AAAA,EAA4B,aAAa,KAAK;AAAA,CAAI;AAAA,MAE/D,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,UACJ,UAAU,eAAe,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,aAAsB;AAAA,YAC/D,IAAI,QAAQ;AAAA,YACZ,MAAM,QAAQ;AAAA,YACd,OAAO,QAAQ;AAAA,UACjB,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,OAAO;AAAA,QACL,MAAM;AAAA,MACR;AAAA;AAAA;AAGN;;;AClDO,IAAM,sBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,KAAK,OAAO,SAAwB,UAAkB,WAAkB;AAAA,IACtE,IAAI;AAAA,MACF,MAAM,gBAAgB,QAAQ,WAA0B,QAAQ;AAAA,MAChE,IAAI,CAAC,eAAe;AAAA,QAClB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,QAAQ,MAAM,cAAc,SAAS;AAAA,MAE3C,IAAI,MAAM,WAAW,GAAG;AAAA,QACtB,OAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,MAAM,IACtB,CAAC,SAAe,KAAK,KAAK,SAAS,KAAK,SAAS,KAAK,eAAe,kBACvE;AAAA,MAEA,MAAM,OAAO;AAAA,EAAkB,UAAU,KAAK;AAAA,CAAI;AAAA,MAElD,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,UACJ,OAAO,MAAM,IAAI,CAAC,UAAgB;AAAA,YAChC,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,KAAK,KAAK;AAAA,UACZ,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,OAAO;AAAA,QACL,MAAM;AAAA,MACR;AAAA;AAAA;AAGN;;;AC/CA,mBAA6B;AAC7B;AAAA;AAAA;;;ACkFO,MAAM,uBAAuB,MAAM;AAAA,EAG/B;AAAA,EACA;AAAA,EAHT,WAAW,CACT,SACO,QACA,UACP;AAAA,IACA,MAAM,OAAO;AAAA,IAHN;AAAA,IACA;AAAA,IAGP,KAAK,OAAO;AAAA;AAEhB;AAAA;AAEO,MAAM,kCAAkC,eAAe;AAAA,EAC5D,WAAW,CAAC,SAAiB;AAAA,IAC3B,MAAM,SAAS,GAAG;AAAA,IAClB,KAAK,OAAO;AAAA;AAEhB;;;AD7EO,MAAM,sBAAsB,QAAQ;AAAA,SAClC,cAAc;AAAA,EAErB,wBACE;AAAA,EAEM;AAAA,EACA,cAAoC,CAAC;AAAA,EACrC;AAAA,EACD;AAAA,EAEP,WAAW,CAAC,SAAyB;AAAA,IACnC,MAAM,OAAO;AAAA,IAEb,MAAM,SAAS,SAAS,WAAW,gBAAgB;AAAA,IACnD,MAAM,cAAc,SAAS,WAAW,qBAAqB;AAAA,IAE7D,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,0BAA0B,4BAA4B;AAAA,IAClE;AAAA,IAEA,KAAK,eAAe;AAAA,MAClB,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,IACvB;AAAA,IAEA,KAAK,cAAc;AAAA,IAEnB,KAAK,SAAS,IAAI,aAAa;AAAA,MAC7B,QAAQ,KAAK,aAAa;AAAA,IAC5B,CAAC;AAAA;AAAA,cAGU,MAAK,CAAC,SAAgD;AAAA,IACjE,MAAM,UAAU,IAAI,cAAc,OAAO;AAAA,IACzC,MAAM,QAAQ,mBAAmB;AAAA,IACjC,SAAO,KAAK,qCAAqC;AAAA,IACjD,OAAO;AAAA;AAAA,OAGH,KAAI,GAAkB;AAAA,IAC1B,KAAK,cAAc,CAAC;AAAA,IACpB,SAAO,KAAK,wBAAwB;AAAA;AAAA,OAGxB,mBAAkB,GAAkB;AAAA,IAChD,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MACjC,SAAO,KAAK,6BAA6B,OAAO,OAAO;AAAA,MACvD,OAAO,QAAQ;AAAA,MACf,MAAM,IAAI,0BAA0B,wCAAwC;AAAA;AAAA;AAAA,EAIxE,WAAW,CACjB,QACA,cACA,YACA,SACA,SACA,OACM;AAAA,IACN,MAAM,WAA+B;AAAA,MACnC,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAAA,MAC3D,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,MAClC;AAAA,MACA,eAAe;AAAA,MACf,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA,KAAK,YAAY,KAAK,QAAQ;AAAA,IAE9B,IAAI,KAAK,YAAY,SAAS,MAAM;AAAA,MAClC,KAAK,cAAc,KAAK,YAAY,MAAM,KAAK;AAAA,IACjD;AAAA;AAAA,EAGF,cAAc,CAAC,OAAgB,QAA4D;AAAA,IACzF,IAAI,WAAW,CAAC,GAAG,KAAK,WAAW;AAAA,IAEnC,IAAI,QAAQ;AAAA,MACV,WAAW,SAAS,OAAO,CAAC,SAAS;AAAA,QACnC,OAAO,OAAO,QAAQ,MAAM,EAAE,MAAM,EAAE,KAAK,WAAW;AAAA,UACpD,OAAO,KAAK,SAAqC;AAAA,SAClD;AAAA,OACF;AAAA,IACH;AAAA,IAEA,OAAO,SAAS,MAAM,EAAE,SAAS,IAAI;AAAA;AAAA,EAGvC,gBAAgB,GAAS;AAAA,IACvB,KAAK,cAAc,CAAC;AAAA,IACpB,SAAO,KAAK,6BAA6B;AAAA;AAAA,OAGrC,SAAQ,GAAoB;AAAA,IAChC,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM;AAAA,IACtC,MAAM,WAAW,MAAM,MAAM;AAAA,IAE7B,KAAK,YAAY,cAAc,QAAQ,OAAO,EAAE,OAAO,SAAS,OAAO,GAAG,IAAI;AAAA,IAC9E,OAAO;AAAA;AAAA,OAGH,QAAO,CAAC,QAA+B;AAAA,IAC3C,MAAM,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM;AAAA,IAC1C,KAAK,YAAY,YAAY,QAAQ,QAAQ,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI;AAAA,IACtE,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,OAAyC;AAAA,IACzD,MAAM,eAAe,MAAM,KAAK,OAAO,YAAY;AAAA,MACjD,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,MACjB,SAAS,MAAM;AAAA,MACf,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,IAED,MAAM,QAAQ,MAAM,aAAa;AAAA,IACjC,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAAA,IAEA,KAAK,YACH,gBACA,SACA,MAAM,IACN;AAAA,MACE,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,IAChB,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,SAAQ,CAAC,SAAiC;AAAA,IAC9C,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,OAAO;AAAA,IAC7C,KAAK,YACH,aACA,SACA,SACA;AAAA,MACE,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,IACpB,GACA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,SAAiB,SAAoD;AAAA,IACrF,MAAM,gBAAgB,MAAM,KAAK,OAAO,YAAY,SAAS;AAAA,MAC3D,OAAO,QAAQ;AAAA,MACf,aAAa,QAAQ;AAAA,MACrB,UAAU,QAAQ;AAAA,MAClB,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,IACnB,CAAC;AAAA,IAED,MAAM,QAAQ,MAAM,cAAc;AAAA,IAClC,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAAA,IAEA,KAAK,YAAY,gBAAgB,SAAS,SAAS,SAAS,IAAI;AAAA,IAChE,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,SAAgC;AAAA,IAChD,MAAM,iBAAiB,MAAM,KAAK,OAAO,aAAa,OAAO;AAAA,IAE7D,MAAM,UAAU,MAAM,eAAe;AAAA,IACrC,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAAA,IAEA,KAAK,YAAY,gBAAgB,SAAS,SAAS,EAAE,QAAQ,WAAW,GAAG,IAAI;AAAA;AAAA,OAG3E,aAAY,CAAC,SAAgD;AAAA,IACjE,MAAM,eAAsF,CAAC;AAAA,IAE7F,IAAI,QAAQ,OAAO;AAAA,MACjB,aAAa,KAAK;AAAA,QAChB,EAAE,OAAO,EAAE,oBAAoB,QAAQ,MAAM,EAAE;AAAA,QAC/C,EAAE,aAAa,EAAE,oBAAoB,QAAQ,MAAM,EAAE;AAAA,MACvD;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,MAAM;AAAA,MAChB,MAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,MAClC,MAAM,OAAO,MAAM,KACjB,CAAC,MACC,EAAE,IAAI,YAAY,MAAM,QAAQ,MAAM,YAAY,KAClD,EAAE,KAAK,YAAY,MAAM,QAAQ,MAAM,YAAY,CACvD;AAAA,MAEA,IAAI,MAAM;AAAA,QACR,aAAa,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,GAAG,EAAE;AAAA,MAC5C;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AAAA,MACnD,MAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,MAClC,MAAM,cAAc,QAAQ,SACzB,IAAI,CAAC,iBAAiB;AAAA,QACrB,MAAM,OAAO,MAAM,KACjB,CAAC,MACC,EAAE,UAAU,gBAAgB,EAAE,KAAK,YAAY,EAAE,SAAS,aAAa,YAAY,CAAC,CACxF;AAAA,QACA,OAAO,MAAM;AAAA,OACd,EACA,OAAO,OAAO;AAAA,MAEjB,IAAI,YAAY,SAAS,GAAG;AAAA,QAC1B,aAAa,WAAW,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE;AAAA,MACpD;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AAAA,MACnD,aAAa,WAAW,EAAE,QAAQ,EAAE,IAAI,QAAQ,SAAS,EAAE;AAAA,IAC7D;AAAA,IAGA,IAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAAA,MAC7C,aAAa,QAAQ;AAAA,QACnB,MAAM,EAAE,IAAI,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAAA,MAC7C,aAAa,SAAS;AAAA,QACpB,MAAM;AAAA,UACJ,MAAM,EAAE,IAAI,QAAQ,MAAM;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,MAC/B,OAAO,QAAQ,SAAS;AAAA,MACxB,QAAQ,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,eAAe;AAAA,IAChE,CAAC;AAAA,IAED,MAAM,SAAS,MAAM;AAAA,IACrB,MAAM,YAAY,MAAM,OAAO;AAAA,IAE/B,KAAK,YACH,iBACA,SACA,UACA;AAAA,MACE,SAAS,KAAK,QAAQ;AAAA,MACtB,OAAO,UAAU;AAAA,IACnB,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,cAAa,CAAC,OAA6C;AAAA,IAC/D,MAAM,iBAAiB,MAAM,KAAK,OAAO,cAAc;AAAA,MACrD,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,IAED,MAAM,UAAU,MAAM,eAAe;AAAA,IACrC,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAAA,IAEA,KAAK,YACH,kBACA,WACA,QAAQ,IACR;AAAA,MACE,SAAS,MAAM;AAAA,MACf,YAAY,MAAM,KAAK;AAAA,IACzB,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,QAAqC;AAAA,IAErD,MAAM,QAAQ,KAAK,OAAO,SAAS;AAAA,MACjC,OAAO;AAAA,IACT,CAAC;AAAA,IAED,MAAM,WAAW,MAAM;AAAA,IACvB,IAAI,cAAc,MAAM,SAAS;AAAA,IAEjC,IAAI,QAAQ;AAAA,MACV,MAAM,mBAAmB,MAAM,QAAQ,IACrC,YAAY,IAAI,OAAO,YAAY;AAAA,QACjC,MAAM,eAAe,MAAM,QAAQ,MAAM;AAAA,QACzC,MAAM,YAAY,MAAM,aAAa;AAAA,QACrC,MAAM,UAAU,UAAU,KAAK,CAAC,SAAe,KAAK,OAAO,MAAM;AAAA,QACjE,OAAO,UAAU,UAAU;AAAA,OAC5B,CACH;AAAA,MACA,cAAc,iBAAiB,OAAO,OAAO;AAAA,IAC/C;AAAA,IAEA,KAAK,YACH,iBACA,WACA,OACA;AAAA,MACE,OAAO,YAAY;AAAA,MACnB;AAAA,IACF,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,WAAU,CAAC,WAAqC;AAAA,IACpD,MAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,SAAS;AAAA,IACnD,KAAK,YACH,eACA,WACA,WACA;AAAA,MACE,MAAM,QAAQ;AAAA,IAChB,GACA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,SAAQ,GAAoB;AAAA,IAChC,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM;AAAA,IACtC,MAAM,WAAW,MAAM,MAAM;AAAA,IAE7B,KAAK,YACH,cACA,QACA,OACA;AAAA,MACE,OAAO,SAAS;AAAA,IAClB,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,eAAc,GAAkB;AAAA,IACpC,MAAM,OAAO,MAAM,KAAK,OAAO;AAAA,IAC/B,KAAK,YACH,oBACA,QACA,KAAK,IACL;AAAA,MACE,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,IACb,GACA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,GAAoB;AAAA,IACpC,MAAM,SAAS,MAAM,KAAK,OAAO;AAAA,IACjC,MAAM,QAAQ,MAAM,OAAO,MAAM;AAAA,IACjC,MAAM,WAAW,MAAM,MAAM;AAAA,IAE7B,KAAK,YACH,mBACA,QACA,OAAO,IACP;AAAA,MACE,OAAO,SAAS;AAAA,IAClB,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,UAAS,CAAC,QAAwC;AAAA,IACtD,MAAM,QAAQ,KAAK,OAAO,YAAY;AAAA,MACpC,OAAO;AAAA,MACP,QAAQ,SACJ;AAAA,QACE,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE;AAAA,MAC7B,IACA;AAAA,IACN,CAAC;AAAA,IAED,MAAM,SAAS,MAAM;AAAA,IACrB,MAAM,YAAY,MAAM,OAAO;AAAA,IAE/B,KAAK,YACH,eACA,SACA,OACA;AAAA,MACE,OAAO,UAAU;AAAA,MACjB;AAAA,IACF,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGH,kBAAiB,CAAC,QAA0C;AAAA,IAChE,MAAM,SAAS,MAAM,KAAK,OAAO,eAAe;AAAA,MAC9C,QAAQ;AAAA,QACN,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,IAED,MAAM,YAAY,MAAM,OAAO;AAAA,IAE/B,KAAK,YACH,wBACA,QACA,QACA;AAAA,MACE,OAAO,UAAU;AAAA,IACnB,GACA,IACF;AAAA,IAEA,OAAO;AAAA;AAEX;;;AEpcO,IAAM,eAAuB;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU,CAAC,aAAa;AAAA,EACxB,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
25
|
-
"debugId": "
|
|
32
|
+
"mappings": "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",
|
|
33
|
+
"debugId": "F5689DC5E2BC1C6664756E2164756E21",
|
|
26
34
|
"names": []
|
|
27
35
|
}
|