@robinpath/linear
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const LinearModule: ModuleAdapter; | ||
| export default LinearModule; | ||
| export { LinearModule }; | ||
| export { LinearFunctions, LinearFunctionMetadata, LinearModuleMetadata, LinearCredentialTypes, configureLinear, } from "./linear.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,YAAY,EAAE,aAQnB,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,MAAM,aAAa,CAAC"} |
| import { LinearFunctions, LinearFunctionMetadata, LinearModuleMetadata, LinearCredentialTypes, configureLinear, } from "./linear.js"; | ||
| const LinearModule = { | ||
| name: "linear", | ||
| functions: LinearFunctions, | ||
| functionMetadata: LinearFunctionMetadata, | ||
| moduleMetadata: LinearModuleMetadata, | ||
| credentialTypes: LinearCredentialTypes, | ||
| configure: configureLinear, | ||
| global: false, | ||
| }; | ||
| export default LinearModule; | ||
| export { LinearModule }; | ||
| export { LinearFunctions, LinearFunctionMetadata, LinearModuleMetadata, LinearCredentialTypes, configureLinear, } from "./linear.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,MAAM,YAAY,GAAkB;IAClC,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,eAAe;IAC1B,gBAAgB,EAAE,sBAAsB;IACxC,cAAc,EAAE,oBAAoB;IACpC,eAAe,EAAE,qBAAqB;IACtC,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,MAAM,aAAa,CAAC"} |
| /** | ||
| * RobinPath Linear Module (Node port) | ||
| * | ||
| * Linear GraphQL API — issues, projects, teams, labels, users, and comments. | ||
| * Shares the credential-vault + ModuleHost pattern with the other RobinPath | ||
| * modules so the visual editor can render them identically. | ||
| * | ||
| * Linear authenticates with a **Personal API Key** from | ||
| * https://linear.app/settings/api. The key is sent in the `Authorization` | ||
| * header **without** a `Bearer` prefix — that's a Linear quirk, not a typo. | ||
| * | ||
| * Every method takes a credential slug as its first argument; the module | ||
| * resolves the stored api key at call time via the injected ModuleHost. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - linear : { api_key } | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureLinear(h: ModuleHost): void; | ||
| export declare const LinearFunctions: Record<string, BuiltinHandler>; | ||
| export declare const LinearCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const LinearFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const LinearModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=linear.d.ts.map |
| {"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../src/linear.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEnD;AAqlBD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CA6B1D,CAAC;AAIF,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,EAiBvD,CAAC;AAuEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAsoBnE,CAAC;AAIF,eAAO,MAAM,oBAAoB,EAAE,cA0DlC,CAAC"} |
+1332
| /** | ||
| * RobinPath Linear Module (Node port) | ||
| * | ||
| * Linear GraphQL API — issues, projects, teams, labels, users, and comments. | ||
| * Shares the credential-vault + ModuleHost pattern with the other RobinPath | ||
| * modules so the visual editor can render them identically. | ||
| * | ||
| * Linear authenticates with a **Personal API Key** from | ||
| * https://linear.app/settings/api. The key is sent in the `Authorization` | ||
| * header **without** a `Bearer` prefix — that's a Linear quirk, not a typo. | ||
| * | ||
| * Every method takes a credential slug as its first argument; the module | ||
| * resolves the stored api key at call time via the injected ModuleHost. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - linear : { api_key } | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Linear module not initialized. Pass the adapter to rp.installModule() so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureLinear(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const GRAPHQL_ENDPOINT = "https://api.linear.app/graphql"; | ||
| const CREDENTIAL_TYPE = "linear"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| // ── Credential resolver ──────────────────────────────────────────────── | ||
| async function resolveApiKey(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const apiKey = String(fields.api_key ?? fields.apiKey ?? fields.token ?? ""); | ||
| if (!apiKey) { | ||
| return errorReturn("Credential has no `api_key` field.", "api_key_missing"); | ||
| } | ||
| return { apiKey }; | ||
| } | ||
| // ── Internal helpers ─────────────────────────────────────────────────── | ||
| function isPlainObject(v) { | ||
| return !!v && typeof v === "object" && !Array.isArray(v); | ||
| } | ||
| // ── GraphQL helper (normalized envelope, never throws for API errors) ── | ||
| async function callGraphql(cred, query, variables) { | ||
| const resolved = await resolveApiKey(cred); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| const headers = { | ||
| // Linear expects the raw api key, NOT "Bearer <key>". | ||
| Authorization: resolved.apiKey, | ||
| "Content-Type": "application/json", | ||
| Accept: "application/json", | ||
| }; | ||
| const body = JSON.stringify({ query, variables: variables ?? {} }); | ||
| let response; | ||
| try { | ||
| response = await fetch(GRAPHQL_ENDPOINT, { method: "POST", headers, body }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const status = response.status; | ||
| const raw = await response.text(); | ||
| let decoded; | ||
| try { | ||
| decoded = JSON.parse(raw); | ||
| } | ||
| catch { | ||
| decoded = { raw: raw.slice(0, 500) }; | ||
| } | ||
| const decodedObj = decoded && typeof decoded === "object" && !Array.isArray(decoded) | ||
| ? decoded | ||
| : { raw: raw.slice(0, 500) }; | ||
| if (status < 200 || status >= 300) { | ||
| return linearError(status, decodedObj); | ||
| } | ||
| // GraphQL surfaces errors in the `errors` array even on HTTP 200. | ||
| const errs = decodedObj.errors; | ||
| if (Array.isArray(errs) && errs.length > 0) { | ||
| return linearError(status, decodedObj); | ||
| } | ||
| const data = decodedObj.data; | ||
| if (data !== undefined && data !== null && typeof data === "object") { | ||
| return data; | ||
| } | ||
| return decodedObj; | ||
| } | ||
| function linearError(status, decoded) { | ||
| let message = ""; | ||
| const errs = decoded.errors; | ||
| if (Array.isArray(errs) && errs.length > 0) { | ||
| const first = errs[0]; | ||
| if (first && typeof first === "object") { | ||
| const m = first.message; | ||
| if (typeof m === "string") | ||
| message = m; | ||
| const ext = first.extensions; | ||
| if (!message && isPlainObject(ext) && typeof ext.userMessage === "string") { | ||
| message = ext.userMessage; | ||
| } | ||
| } | ||
| } | ||
| if (!message && typeof decoded.message === "string") | ||
| message = decoded.message; | ||
| if (!message) | ||
| message = `Linear returned HTTP ${status}.`; | ||
| let code = "linear_error"; | ||
| if (status === 401) | ||
| code = "unauthorized"; | ||
| else if (status === 403) | ||
| code = "permission_denied"; | ||
| else if (status === 404) | ||
| code = "not_found"; | ||
| else if (status === 400 || status === 422) | ||
| code = "validation_failed"; | ||
| else if (status === 429) | ||
| code = "rate_limited"; | ||
| // GraphQL error extensions can carry richer codes. | ||
| if (Array.isArray(decoded.errors) && decoded.errors.length > 0) { | ||
| const first = decoded.errors[0]; | ||
| if (isPlainObject(first)) { | ||
| const ext = first.extensions; | ||
| if (isPlainObject(ext) && typeof ext.code === "string") { | ||
| const ec = ext.code; | ||
| if (ec === "FEATURE_NOT_ACCESSIBLE") | ||
| code = "permission_denied"; | ||
| else if (ec === "AUTHENTICATION_ERROR") | ||
| code = "unauthorized"; | ||
| else if (ec === "INVALID_INPUT") | ||
| code = "validation_failed"; | ||
| else if (ec === "RATELIMITED") | ||
| code = "rate_limited"; | ||
| } | ||
| } | ||
| } | ||
| return errorReturn(message, code, { status, linear_error: decoded }); | ||
| } | ||
| // ── GraphQL fragments ────────────────────────────────────────────────── | ||
| const ISSUE_FIELDS = ` | ||
| id identifier title description url | ||
| priority priorityLabel | ||
| estimate | ||
| createdAt updatedAt completedAt canceledAt dueDate | ||
| state { id name type color } | ||
| assignee { id name email displayName } | ||
| creator { id name displayName } | ||
| team { id key name } | ||
| project { id name } | ||
| cycle { id number name startsAt endsAt } | ||
| labels { nodes { id name color } } | ||
| parent { id identifier title } | ||
| `; | ||
| const PROJECT_FIELDS = ` | ||
| id name description slugId url color icon | ||
| state startDate targetDate completedAt canceledAt | ||
| progress scope | ||
| createdAt updatedAt | ||
| lead { id name displayName } | ||
| teams { nodes { id key name } } | ||
| `; | ||
| const TEAM_FIELDS = ` | ||
| id key name description color icon | ||
| private cyclesEnabled | ||
| createdAt | ||
| organization { id name urlKey } | ||
| `; | ||
| const LABEL_FIELDS = ` | ||
| id name description color | ||
| team { id key } | ||
| `; | ||
| const COMMENT_FIELDS = ` | ||
| id body url | ||
| createdAt updatedAt | ||
| user { id name displayName } | ||
| issue { id identifier } | ||
| `; | ||
| const USER_FIELDS = ` | ||
| id name displayName email | ||
| avatarUrl | ||
| active admin guest | ||
| createdAt | ||
| `; | ||
| // ── Handlers: Viewer ─────────────────────────────────────────────────── | ||
| const getViewer = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const query = ` | ||
| query Viewer { | ||
| viewer { ${USER_FIELDS} } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query)); | ||
| }; | ||
| // ── Handlers: Issues ─────────────────────────────────────────────────── | ||
| const listIssues = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = isPlainObject(args[1]) ? args[1] : {}; | ||
| const vars = {}; | ||
| if (opts.filter !== undefined) | ||
| vars.filter = opts.filter; | ||
| if (opts.first !== undefined) | ||
| vars.first = opts.first; | ||
| else | ||
| vars.first = 50; | ||
| if (opts.after !== undefined) | ||
| vars.after = opts.after; | ||
| if (opts.orderBy !== undefined) | ||
| vars.orderBy = opts.orderBy; | ||
| if (opts.includeArchived !== undefined) | ||
| vars.includeArchived = opts.includeArchived; | ||
| const query = ` | ||
| query ListIssues($first: Int, $after: String, $filter: IssueFilter, $orderBy: PaginationOrderBy, $includeArchived: Boolean) { | ||
| issues(first: $first, after: $after, filter: $filter, orderBy: $orderBy, includeArchived: $includeArchived) { | ||
| nodes { ${ISSUE_FIELDS} } | ||
| pageInfo { hasNextPage endCursor } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, vars)); | ||
| }; | ||
| const getIssue = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const idOrIdentifier = String(args[1] ?? ""); | ||
| if (!idOrIdentifier) { | ||
| return errorReturn("`issueId` is required.", "validation_failed"); | ||
| } | ||
| // Linear's `issue(id: …)` accepts either the UUID or the human identifier (e.g. "ENG-123"). | ||
| const query = ` | ||
| query GetIssue($id: String!) { | ||
| issue(id: $id) { ${ISSUE_FIELDS} } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { id: idOrIdentifier })); | ||
| }; | ||
| const createIssue = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const input = isPlainObject(args[1]) ? args[1] : {}; | ||
| if (!input.teamId) { | ||
| return errorReturn("`input.teamId` is required (get one from listTeams).", "validation_failed"); | ||
| } | ||
| if (!input.title) { | ||
| return errorReturn("`input.title` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation CreateIssue($input: IssueCreateInput!) { | ||
| issueCreate(input: $input) { | ||
| success | ||
| issue { ${ISSUE_FIELDS} } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { input })); | ||
| }; | ||
| const updateIssue = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| const input = isPlainObject(args[2]) ? args[2] : {}; | ||
| if (!id) { | ||
| return errorReturn("`issueId` is required.", "validation_failed"); | ||
| } | ||
| if (Object.keys(input).length === 0) { | ||
| return errorReturn("`input` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) { | ||
| issueUpdate(id: $id, input: $input) { | ||
| success | ||
| issue { ${ISSUE_FIELDS} } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { id, input })); | ||
| }; | ||
| const deleteIssue = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`issueId` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation DeleteIssue($id: String!) { | ||
| issueDelete(id: $id) { success } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { id })); | ||
| }; | ||
| const archiveIssue = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`issueId` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation ArchiveIssue($id: String!) { | ||
| issueArchive(id: $id) { success } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { id })); | ||
| }; | ||
| const searchIssues = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const term = String(args[1] ?? ""); | ||
| const opts = isPlainObject(args[2]) ? args[2] : {}; | ||
| if (!term) { | ||
| return errorReturn("`query` is required.", "validation_failed"); | ||
| } | ||
| const vars = { term }; | ||
| if (opts.first !== undefined) | ||
| vars.first = opts.first; | ||
| else | ||
| vars.first = 25; | ||
| if (opts.after !== undefined) | ||
| vars.after = opts.after; | ||
| if (opts.teamId !== undefined) | ||
| vars.teamId = opts.teamId; | ||
| if (opts.includeArchived !== undefined) | ||
| vars.includeArchived = opts.includeArchived; | ||
| const query = ` | ||
| query SearchIssues($term: String!, $first: Int, $after: String, $teamId: String, $includeArchived: Boolean) { | ||
| searchIssues(term: $term, first: $first, after: $after, teamId: $teamId, includeArchived: $includeArchived) { | ||
| nodes { ${ISSUE_FIELDS} } | ||
| pageInfo { hasNextPage endCursor } | ||
| totalCount | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, vars)); | ||
| }; | ||
| // ── Handlers: Projects ───────────────────────────────────────────────── | ||
| const listProjects = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = isPlainObject(args[1]) ? args[1] : {}; | ||
| const vars = {}; | ||
| if (opts.filter !== undefined) | ||
| vars.filter = opts.filter; | ||
| if (opts.first !== undefined) | ||
| vars.first = opts.first; | ||
| else | ||
| vars.first = 50; | ||
| if (opts.after !== undefined) | ||
| vars.after = opts.after; | ||
| if (opts.includeArchived !== undefined) | ||
| vars.includeArchived = opts.includeArchived; | ||
| const query = ` | ||
| query ListProjects($first: Int, $after: String, $filter: ProjectFilter, $includeArchived: Boolean) { | ||
| projects(first: $first, after: $after, filter: $filter, includeArchived: $includeArchived) { | ||
| nodes { ${PROJECT_FIELDS} } | ||
| pageInfo { hasNextPage endCursor } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, vars)); | ||
| }; | ||
| const getProject = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`projectId` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| query GetProject($id: String!) { | ||
| project(id: $id) { ${PROJECT_FIELDS} } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { id })); | ||
| }; | ||
| const createProject = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const input = isPlainObject(args[1]) ? args[1] : {}; | ||
| if (!input.name) { | ||
| return errorReturn("`input.name` is required.", "validation_failed"); | ||
| } | ||
| if (!input.teamIds) { | ||
| return errorReturn("`input.teamIds` is required (array of team ids).", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation CreateProject($input: ProjectCreateInput!) { | ||
| projectCreate(input: $input) { | ||
| success | ||
| project { ${PROJECT_FIELDS} } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { input })); | ||
| }; | ||
| const updateProject = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| const input = isPlainObject(args[2]) ? args[2] : {}; | ||
| if (!id) { | ||
| return errorReturn("`projectId` is required.", "validation_failed"); | ||
| } | ||
| if (Object.keys(input).length === 0) { | ||
| return errorReturn("`input` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation UpdateProject($id: String!, $input: ProjectUpdateInput!) { | ||
| projectUpdate(id: $id, input: $input) { | ||
| success | ||
| project { ${PROJECT_FIELDS} } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { id, input })); | ||
| }; | ||
| // ── Handlers: Teams ──────────────────────────────────────────────────── | ||
| const listTeams = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = isPlainObject(args[1]) ? args[1] : {}; | ||
| const vars = {}; | ||
| if (opts.first !== undefined) | ||
| vars.first = opts.first; | ||
| else | ||
| vars.first = 50; | ||
| if (opts.after !== undefined) | ||
| vars.after = opts.after; | ||
| if (opts.filter !== undefined) | ||
| vars.filter = opts.filter; | ||
| const query = ` | ||
| query ListTeams($first: Int, $after: String, $filter: TeamFilter) { | ||
| teams(first: $first, after: $after, filter: $filter) { | ||
| nodes { ${TEAM_FIELDS} } | ||
| pageInfo { hasNextPage endCursor } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, vars)); | ||
| }; | ||
| const getTeam = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const id = String(args[1] ?? ""); | ||
| if (!id) { | ||
| return errorReturn("`teamId` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| query GetTeam($id: String!) { | ||
| team(id: $id) { ${TEAM_FIELDS} } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { id })); | ||
| }; | ||
| // ── Handlers: Labels ─────────────────────────────────────────────────── | ||
| const listLabels = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = isPlainObject(args[1]) ? args[1] : {}; | ||
| const vars = {}; | ||
| if (opts.filter !== undefined) | ||
| vars.filter = opts.filter; | ||
| if (opts.first !== undefined) | ||
| vars.first = opts.first; | ||
| else | ||
| vars.first = 50; | ||
| if (opts.after !== undefined) | ||
| vars.after = opts.after; | ||
| const query = ` | ||
| query ListLabels($first: Int, $after: String, $filter: IssueLabelFilter) { | ||
| issueLabels(first: $first, after: $after, filter: $filter) { | ||
| nodes { ${LABEL_FIELDS} } | ||
| pageInfo { hasNextPage endCursor } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, vars)); | ||
| }; | ||
| const createLabel = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const input = isPlainObject(args[1]) ? args[1] : {}; | ||
| if (!input.name) { | ||
| return errorReturn("`input.name` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation CreateLabel($input: IssueLabelCreateInput!) { | ||
| issueLabelCreate(input: $input) { | ||
| success | ||
| issueLabel { ${LABEL_FIELDS} } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { input })); | ||
| }; | ||
| // ── Handlers: Comments ───────────────────────────────────────────────── | ||
| const listComments = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const issueId = String(args[1] ?? ""); | ||
| const opts = isPlainObject(args[2]) ? args[2] : {}; | ||
| if (!issueId) { | ||
| return errorReturn("`issueId` is required.", "validation_failed"); | ||
| } | ||
| const vars = { | ||
| filter: { issue: { id: { eq: issueId } } }, | ||
| }; | ||
| if (opts.first !== undefined) | ||
| vars.first = opts.first; | ||
| else | ||
| vars.first = 50; | ||
| if (opts.after !== undefined) | ||
| vars.after = opts.after; | ||
| const query = ` | ||
| query ListComments($first: Int, $after: String, $filter: CommentFilter) { | ||
| comments(first: $first, after: $after, filter: $filter) { | ||
| nodes { ${COMMENT_FIELDS} } | ||
| pageInfo { hasNextPage endCursor } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, vars)); | ||
| }; | ||
| const createComment = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const issueId = String(args[1] ?? ""); | ||
| const body = String(args[2] ?? ""); | ||
| if (!issueId) { | ||
| return errorReturn("`issueId` is required.", "validation_failed"); | ||
| } | ||
| if (!body) { | ||
| return errorReturn("`body` is required.", "validation_failed"); | ||
| } | ||
| const query = ` | ||
| mutation CreateComment($input: CommentCreateInput!) { | ||
| commentCreate(input: $input) { | ||
| success | ||
| comment { ${COMMENT_FIELDS} } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, { | ||
| input: { issueId, body }, | ||
| })); | ||
| }; | ||
| // ── Handlers: Users ──────────────────────────────────────────────────── | ||
| const listUsers = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = isPlainObject(args[1]) ? args[1] : {}; | ||
| const vars = {}; | ||
| if (opts.first !== undefined) | ||
| vars.first = opts.first; | ||
| else | ||
| vars.first = 50; | ||
| if (opts.after !== undefined) | ||
| vars.after = opts.after; | ||
| if (opts.filter !== undefined) | ||
| vars.filter = opts.filter; | ||
| if (opts.includeArchived !== undefined) | ||
| vars.includeArchived = opts.includeArchived; | ||
| const query = ` | ||
| query ListUsers($first: Int, $after: String, $filter: UserFilter, $includeArchived: Boolean) { | ||
| users(first: $first, after: $after, filter: $filter, includeArchived: $includeArchived) { | ||
| nodes { ${USER_FIELDS} } | ||
| pageInfo { hasNextPage endCursor } | ||
| } | ||
| } | ||
| `; | ||
| return (await callGraphql(cred, query, vars)); | ||
| }; | ||
| // ── Handlers: Raw GraphQL escape hatch ───────────────────────────────── | ||
| const query = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const q = String(args[1] ?? ""); | ||
| const variables = isPlainObject(args[2]) ? args[2] : {}; | ||
| if (!q) { | ||
| return errorReturn("`query` is required.", "validation_failed"); | ||
| } | ||
| return (await callGraphql(cred, q, variables)); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const LinearFunctions = { | ||
| // Viewer. | ||
| getViewer, | ||
| // Issues. | ||
| listIssues, | ||
| getIssue, | ||
| createIssue, | ||
| updateIssue, | ||
| deleteIssue, | ||
| archiveIssue, | ||
| searchIssues, | ||
| // Projects. | ||
| listProjects, | ||
| getProject, | ||
| createProject, | ||
| updateProject, | ||
| // Teams. | ||
| listTeams, | ||
| getTeam, | ||
| // Labels. | ||
| listLabels, | ||
| createLabel, | ||
| // Comments. | ||
| listComments, | ||
| createComment, | ||
| // Users. | ||
| listUsers, | ||
| // Raw GraphQL. | ||
| query, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const LinearCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Linear API key", | ||
| icon: "layers", | ||
| fields: [ | ||
| { | ||
| name: "api_key", | ||
| title: "Personal API key", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "lin_api_…", | ||
| description: "Create one at https://linear.app/settings/api. The key is sent in the `Authorization` header *without* a `Bearer` prefix — Linear's own quirk.", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Shared parameter metadata ────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `linear` credential (Personal API key).", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_linear", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const issueIdParam = { | ||
| name: "issueId", | ||
| title: "Issue id or identifier", | ||
| description: "Either the UUID of the issue or its human identifier (e.g. `ENG-123`). Both forms work wherever an issue id is accepted.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "ENG-123", | ||
| }; | ||
| const projectIdParam = { | ||
| name: "projectId", | ||
| title: "Project id", | ||
| description: "UUID of a Linear project (get it from `listProjects`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "proj_01HXY…", | ||
| }; | ||
| const teamIdParam = { | ||
| name: "teamId", | ||
| title: "Team id", | ||
| description: "UUID of a Linear team (get it from `listTeams`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "team_01HXY…", | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| api_key_missing: "The credential has no `api_key` field.", | ||
| transport: "Network failure calling api.linear.app.", | ||
| linear_error: "Linear returned an error — see `linear_error.errors[]` in the response.", | ||
| unauthorized: "API key rejected (HTTP 401 or AUTHENTICATION_ERROR).", | ||
| permission_denied: "The key does not have permission for this resource (HTTP 403 or FEATURE_NOT_ACCESSIBLE).", | ||
| not_found: "No resource with that id exists (HTTP 404).", | ||
| validation_failed: "Linear rejected the input (GraphQL INVALID_INPUT / HTTP 400).", | ||
| rate_limited: "Hit Linear rate limits — back off and retry.", | ||
| }; | ||
| // ── Exports: function metadata ───────────────────────────────────────── | ||
| export const LinearFunctionMetadata = { | ||
| // ===================== VIEWER ===================== | ||
| getViewer: { | ||
| title: "Get viewer", | ||
| summary: "Fetch the user that owns the API key", | ||
| description: "Runs `{ viewer { … } }` — returns the authenticated user record. Useful to confirm the credential is valid and discover the user id for assignments.", | ||
| group: "viewer", | ||
| action: "read", | ||
| icon: "user", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "user", "me"], | ||
| parameters: [credentialParam], | ||
| returnType: "object", | ||
| returnDescription: "{ viewer: {id,name,displayName,email,active,…} }.", | ||
| errors: commonErrors, | ||
| example: 'linear.getViewer "my_linear"', | ||
| }, | ||
| // ===================== ISSUES ===================== | ||
| listIssues: { | ||
| title: "List issues", | ||
| summary: "Page through issues with optional filter", | ||
| description: "Runs `issues(filter, first, after, orderBy)`. Pass `options.filter` as a Linear `IssueFilter` object — examples:\n - `{state: {type: {eq: \"started\"}}}`\n - `{team: {key: {eq: \"ENG\"}}}`\n - `{assignee: {id: {eq: \"<userId>\"}}}`\n - `{priority: {lte: 2}}`\n\nPagination uses cursor pagination — pass the previous response's `pageInfo.endCursor` as `options.after`.", | ||
| group: "issues", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "issue", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n filter : IssueFilter GraphQL object\n first : page size (default 50, max 250)\n after : cursor from previous response's `pageInfo.endCursor`\n orderBy : `createdAt` | `updatedAt`\n includeArchived : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ issues: { nodes: [{id,identifier,title,…}, …], pageInfo: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.listIssues "my_linear" {filter: {state: {type: {eq: "started"}}}, first: 50}', | ||
| }, | ||
| getIssue: { | ||
| title: "Get issue", | ||
| summary: "Fetch a single issue by id or identifier", | ||
| description: "Runs `issue(id)`. Accepts either the UUID or the human identifier (e.g. `ENG-123`).", | ||
| group: "issues", | ||
| action: "read", | ||
| icon: "file-text", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "issue", "lookup"], | ||
| parameters: [credentialParam, issueIdParam], | ||
| returnType: "object", | ||
| returnDescription: "{ issue: {id,identifier,title,description,state,assignee,…} }.", | ||
| errors: commonErrors, | ||
| example: 'linear.getIssue "my_linear" "ENG-123"', | ||
| }, | ||
| createIssue: { | ||
| title: "Create issue", | ||
| summary: "Create a new issue on a team", | ||
| description: "Runs `issueCreate(input: IssueCreateInput)`. Required: `input.teamId`, `input.title`. Common optional fields:\n - `description` : markdown\n - `priority` : 0 (no priority), 1 (urgent), 2 (high), 3 (medium), 4 (low)\n - `assigneeId` : user UUID\n - `stateId` : workflow state UUID\n - `projectId` : project UUID\n - `labelIds` : array of label UUIDs\n - `dueDate` : ISO date\n - `estimate` : Fibonacci points (team must have estimation enabled)\n - `parentId` : for sub-issues", | ||
| group: "issues", | ||
| action: "write", | ||
| icon: "plus-square", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["linear", "issue", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "input", | ||
| title: "Issue input", | ||
| description: "`IssueCreateInput` object. Required: `teamId`, `title`. Optional: `description`, `priority`, `assigneeId`, `stateId`, `projectId`, `labelIds`, `dueDate`, `estimate`, `parentId`.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 8, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ issueCreate: { success: bool, issue: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.createIssue "my_linear" {\n teamId: "team_…",\n title: "Fix login 500 on Safari",\n description: "Reported by 3 users on Safari 17",\n priority: 2\n}', | ||
| }, | ||
| updateIssue: { | ||
| title: "Update issue", | ||
| summary: "Patch fields on an existing issue", | ||
| description: "Runs `issueUpdate(id, input: IssueUpdateInput)`. Pass any subset of fields supported by `IssueUpdateInput`. Common uses: change status via `stateId`, reassign via `assigneeId`, move project via `projectId`, update `priority`/`dueDate`.", | ||
| group: "issues", | ||
| action: "write", | ||
| icon: "edit-3", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "issue", "update"], | ||
| parameters: [ | ||
| credentialParam, | ||
| issueIdParam, | ||
| { | ||
| name: "input", | ||
| title: "Fields to patch", | ||
| description: "`IssueUpdateInput` object — any subset of `title`, `description`, `priority`, `assigneeId`, `stateId`, `projectId`, `labelIds`, `dueDate`, `estimate`.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ issueUpdate: { success: bool, issue: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.updateIssue "my_linear" "ENG-123" {priority: 1, stateId: "state_…"}', | ||
| }, | ||
| deleteIssue: { | ||
| title: "Delete issue", | ||
| summary: "Permanently delete an issue", | ||
| description: "Runs `issueDelete(id)`. **Hard delete — not recoverable.** Use `archiveIssue` for a reversible alternative.", | ||
| group: "issues", | ||
| action: "delete", | ||
| icon: "trash-2", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "destructive"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "issue", "delete", "destructive"], | ||
| parameters: [credentialParam, issueIdParam], | ||
| returnType: "object", | ||
| returnDescription: "{ issueDelete: { success: bool } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.deleteIssue "my_linear" "ENG-123"', | ||
| }, | ||
| archiveIssue: { | ||
| title: "Archive issue", | ||
| summary: "Archive an issue (reversible)", | ||
| description: "Runs `issueArchive(id)`. Archived issues are hidden by default but can be restored from the Linear UI or by setting `includeArchived:true` in list queries.", | ||
| group: "issues", | ||
| action: "write", | ||
| icon: "archive", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "issue", "archive"], | ||
| parameters: [credentialParam, issueIdParam], | ||
| returnType: "object", | ||
| returnDescription: "{ issueArchive: { success: bool } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.archiveIssue "my_linear" "ENG-123"', | ||
| }, | ||
| searchIssues: { | ||
| title: "Search issues", | ||
| summary: "Full-text search across issues", | ||
| description: "Runs `searchIssues(term)`. Use `options.teamId` to scope to a single team. Pagination via `options.first`/`options.after`.", | ||
| group: "issues", | ||
| action: "query", | ||
| icon: "search", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "issue", "search"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "query", | ||
| title: "Search query", | ||
| description: "Free-text search across issue titles and descriptions.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "login 500", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n teamId : scope to a single team\n first : page size (default 25, max 100)\n after : cursor\n includeArchived : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ searchIssues: { nodes: [...], pageInfo: {…}, totalCount: int } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.searchIssues "my_linear" "login 500" {first: 25}', | ||
| }, | ||
| // ===================== PROJECTS ===================== | ||
| listProjects: { | ||
| title: "List projects", | ||
| summary: "Page through projects", | ||
| description: "Runs `projects(filter, first, after)`. Pass `options.filter` as a `ProjectFilter` object — e.g. `{state: {eq: \"started\"}}` or `{team: {key: {eq: \"ENG\"}}}`.", | ||
| group: "projects", | ||
| action: "query", | ||
| icon: "folder", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "project", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n filter : ProjectFilter GraphQL object\n first : page size (default 50)\n after : cursor\n includeArchived : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ projects: { nodes: [{id,name,state,lead,…}, …], pageInfo: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.listProjects "my_linear" {filter: {state: {eq: "started"}}}', | ||
| }, | ||
| getProject: { | ||
| title: "Get project", | ||
| summary: "Fetch a single project by id", | ||
| description: "Runs `project(id)`. Returns the full project record.", | ||
| group: "projects", | ||
| action: "read", | ||
| icon: "folder", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "project", "lookup"], | ||
| parameters: [credentialParam, projectIdParam], | ||
| returnType: "object", | ||
| returnDescription: "{ project: {id,name,description,state,lead,teams,…} }.", | ||
| errors: commonErrors, | ||
| example: 'linear.getProject "my_linear" "proj_01HXY…"', | ||
| }, | ||
| createProject: { | ||
| title: "Create project", | ||
| summary: "Open a new project on one or more teams", | ||
| description: "Runs `projectCreate(input: ProjectCreateInput)`. Required: `name`, `teamIds` (array). Common optional: `description`, `startDate`, `targetDate`, `leadId`, `color`, `icon`, `state`.", | ||
| group: "projects", | ||
| action: "write", | ||
| icon: "folder-plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["linear", "project", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "input", | ||
| title: "Project input", | ||
| description: "`ProjectCreateInput` object. Required: `name`, `teamIds` (array). Optional: `description`, `startDate`, `targetDate`, `leadId`, `color`, `icon`, `state`.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ projectCreate: { success: bool, project: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.createProject "my_linear" {\n name: "Q2 Launch",\n teamIds: ["team_…"],\n targetDate: "2026-06-30"\n}', | ||
| }, | ||
| updateProject: { | ||
| title: "Update project", | ||
| summary: "Patch fields on an existing project", | ||
| description: "Runs `projectUpdate(id, input: ProjectUpdateInput)`. Common uses: set `state:\"completed\"` to mark a project done, update `targetDate`, change `leadId`.", | ||
| group: "projects", | ||
| action: "write", | ||
| icon: "edit-3", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "project", "update"], | ||
| parameters: [ | ||
| credentialParam, | ||
| projectIdParam, | ||
| { | ||
| name: "input", | ||
| title: "Fields to patch", | ||
| description: "`ProjectUpdateInput` object — any subset of `name`, `description`, `state`, `startDate`, `targetDate`, `leadId`, `color`, `icon`.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ projectUpdate: { success: bool, project: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.updateProject "my_linear" "proj_…" {state: "completed"}', | ||
| }, | ||
| // ===================== TEAMS ===================== | ||
| listTeams: { | ||
| title: "List teams", | ||
| summary: "Page through teams visible to the key", | ||
| description: "Runs `teams(first, after, filter)`. Teams are Linear's top-level work containers — each has its own key (`ENG`, `DES`, …), cycles, labels, and workflow states.", | ||
| group: "teams", | ||
| action: "query", | ||
| icon: "users", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "team", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n filter : TeamFilter GraphQL object (e.g. `{key: {eq: \"ENG\"}}`)\n first : page size (default 50)\n after : cursor", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ teams: { nodes: [{id,key,name,private,…}, …], pageInfo: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.listTeams "my_linear"', | ||
| }, | ||
| getTeam: { | ||
| title: "Get team", | ||
| summary: "Fetch a single team by id", | ||
| description: "Runs `team(id)`. Returns the full team record.", | ||
| group: "teams", | ||
| action: "read", | ||
| icon: "users", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "team", "lookup"], | ||
| parameters: [credentialParam, teamIdParam], | ||
| returnType: "object", | ||
| returnDescription: "{ team: {id,key,name,description,private,…} }.", | ||
| errors: commonErrors, | ||
| example: 'linear.getTeam "my_linear" "team_…"', | ||
| }, | ||
| // ===================== LABELS ===================== | ||
| listLabels: { | ||
| title: "List labels", | ||
| summary: "Page through issue labels", | ||
| description: "Runs `issueLabels(first, after, filter)`. Scope to a single team with `options.filter = {team: {id: {eq: \"<teamId>\"}}}`.", | ||
| group: "labels", | ||
| action: "read", | ||
| icon: "tag", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "label", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n filter : IssueLabelFilter GraphQL object\n first : page size (default 50)\n after : cursor", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ issueLabels: { nodes: [{id,name,color,team:{key}}, …], pageInfo: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.listLabels "my_linear" {filter: {team: {id: {eq: "team_…"}}}}', | ||
| }, | ||
| createLabel: { | ||
| title: "Create label", | ||
| summary: "Create a new issue label", | ||
| description: "Runs `issueLabelCreate(input: IssueLabelCreateInput)`. Required: `name`. Common optional: `color` (hex), `description`, `teamId` (scope to one team — omit for a workspace-wide label).", | ||
| group: "labels", | ||
| action: "write", | ||
| icon: "plus-circle", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["linear", "label", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "input", | ||
| title: "Label input", | ||
| description: "`IssueLabelCreateInput` object. Required: `name`. Optional: `color`, `description`, `teamId`.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ issueLabelCreate: { success: bool, issueLabel: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.createLabel "my_linear" {name: "bug", color: "#dc2626", teamId: "team_…"}', | ||
| }, | ||
| // ===================== COMMENTS ===================== | ||
| listComments: { | ||
| title: "List comments on an issue", | ||
| summary: "Page through comments belonging to an issue", | ||
| description: "Runs `comments(filter: {issue: {id: {eq: <issueId>}}}, first, after)`. Comments are returned oldest-first by default.", | ||
| group: "comments", | ||
| action: "read", | ||
| icon: "message-circle", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "comment", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| issueIdParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n first : page size (default 50)\n after : cursor", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 2, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ comments: { nodes: [{id,body,user,createdAt,…}, …], pageInfo: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.listComments "my_linear" "ENG-123"', | ||
| }, | ||
| createComment: { | ||
| title: "Add comment", | ||
| summary: "Post a comment on an issue", | ||
| description: "Runs `commentCreate(input: {issueId, body})`. Comment bodies support Linear's Markdown.", | ||
| group: "comments", | ||
| action: "write", | ||
| icon: "message-square", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["linear", "comment", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| issueIdParam, | ||
| { | ||
| name: "body", | ||
| title: "Comment body", | ||
| description: "Markdown-formatted comment text. `@username` notifies members.", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: true, | ||
| allowExpression: true, | ||
| rows: 4, | ||
| placeholder: "Root-cause found — fix shipping in build #42.", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ commentCreate: { success: bool, comment: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.createComment "my_linear" "ENG-123" "Shipped in build #42"', | ||
| }, | ||
| // ===================== USERS ===================== | ||
| listUsers: { | ||
| title: "List users", | ||
| summary: "Page through users in the organization", | ||
| description: "Runs `users(first, after, filter, includeArchived)`. Use `options.filter = {email: {eq: \"foo@bar.com\"}}` to resolve a user by email.", | ||
| group: "users", | ||
| action: "query", | ||
| icon: "users", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "user", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n filter : UserFilter GraphQL object\n first : page size (default 50)\n after : cursor\n includeArchived : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ users: { nodes: [{id,name,displayName,email,active,…}, …], pageInfo: {…} } }.", | ||
| errors: commonErrors, | ||
| example: 'linear.listUsers "my_linear" {filter: {active: {eq: true}}}', | ||
| }, | ||
| // ===================== RAW ===================== | ||
| query: { | ||
| title: "Raw GraphQL query", | ||
| summary: "Execute an arbitrary GraphQL query/mutation", | ||
| description: "Escape hatch for any operation not covered by the typed wrappers — pass the full GraphQL string plus a `variables` object. The response is returned as-is (the `data` envelope is unwrapped; `errors[]` causes the call to return a `linear_error` envelope).", | ||
| group: "raw", | ||
| action: "query", | ||
| icon: "code", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["linear", "graphql", "raw"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "query", | ||
| title: "GraphQL document", | ||
| description: "A full GraphQL query or mutation string. Declare variables in the operation signature and pass their values via `variables`.", | ||
| dataType: "string", | ||
| formInputType: "code", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "graphql", | ||
| rows: 10, | ||
| placeholder: "query { viewer { id name } }", | ||
| }, | ||
| { | ||
| name: "variables", | ||
| title: "Variables", | ||
| description: "Flat object of GraphQL variables referenced by the document.", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "The unwrapped `data` payload from Linear's GraphQL response.", | ||
| errors: commonErrors, | ||
| example: 'linear.query "my_linear" "query($id: String!) { issue(id: $id) { title } }" {id:"ENG-123"}', | ||
| }, | ||
| }; | ||
| // ── Exports: module metadata ─────────────────────────────────────────── | ||
| export const LinearModuleMetadata = { | ||
| slug: "linear", | ||
| title: "Linear", | ||
| summary: "Issues, projects, cycles, teams, labels — manage your Linear workspace", | ||
| description: "Create and update Linear issues from RobinPath scripts — sync form submissions, transition issues through workflow states, reassign, comment, label, and search your workspace via GraphQL.\n\nAuthenticated with a **Personal API Key** from linear.app/settings/api. Store the key as a `linear` credential and pass the slug as the first argument to every method.\n\nLinear authenticates with a raw `Authorization` header (no `Bearer` prefix) — that's a Linear quirk. The module handles it; you just store the key.\n\nMost typed wrappers map directly to a single GraphQL query/mutation and return the full response. Use `linear.query` for anything not covered — you can execute any GraphQL operation with full access to the Linear schema.", | ||
| category: "project-management", | ||
| icon: "icon.svg", | ||
| color: "#5E6AD2", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/linear", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| viewer: { | ||
| title: "Viewer", | ||
| description: "Inspect the user behind the API key.", | ||
| order: 1, | ||
| }, | ||
| issues: { | ||
| title: "Issues", | ||
| description: "Create, update, search, and delete issues.", | ||
| order: 2, | ||
| }, | ||
| projects: { | ||
| title: "Projects", | ||
| description: "Multi-team initiatives with milestones and target dates.", | ||
| order: 3, | ||
| }, | ||
| teams: { | ||
| title: "Teams", | ||
| description: "Top-level work containers — each has its own key and workflow.", | ||
| order: 4, | ||
| }, | ||
| labels: { | ||
| title: "Labels", | ||
| description: "Issue labels, per-team or workspace-wide.", | ||
| order: 5, | ||
| }, | ||
| comments: { | ||
| title: "Comments", | ||
| description: "Post and list comments on issues.", | ||
| order: 6, | ||
| }, | ||
| users: { | ||
| title: "Users", | ||
| description: "Look up organization members by name, email, or id.", | ||
| order: 7, | ||
| }, | ||
| raw: { | ||
| title: "Raw GraphQL", | ||
| description: "Escape hatch for arbitrary Linear GraphQL operations.", | ||
| order: 8, | ||
| }, | ||
| }, | ||
| methods: Object.keys(LinearFunctions), | ||
| }; | ||
| //# sourceMappingURL=linear.js.map |
| {"version":3,"file":"linear.js","sourceRoot":"","sources":["../src/linear.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH,2EAA2E;AAE3E,MAAM,KAAK,GAA0B,EAAE,CAAC;AAExC,SAAS,IAAI;IACX,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAa;IAC3C,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,0EAA0E;AAE1E,MAAM,gBAAgB,GAAG,gCAAgC,CAAC;AAC1D,MAAM,eAAe,GAAG,QAAQ,CAAC;AAWjC,SAAS,WAAW,CAClB,KAAa,EACb,IAAY,EACZ,QAAiC,EAAE;IAEnC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,EAAiB,CAAC;AAClD,CAAC;AAED,0EAA0E;AAE1E,KAAK,UAAU,aAAa,CAC1B,cAAsB;IAEtB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,8BAA8B,EAAE,sBAAsB,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,MAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,WAAW,CAChB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC1C,sBAAsB,CACvB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,WAAW,CAAC,eAAe,cAAc,cAAc,EAAE,sBAAsB,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CACnB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CACtD,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,WAAW,CAAC,oCAAoC,EAAE,iBAAiB,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AAED,0EAA0E;AAE1E,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,0EAA0E;AAE1E,KAAK,UAAU,WAAW,CACxB,IAAY,EACZ,KAAa,EACb,SAAmC;IAEnC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAEzC,MAAM,OAAO,GAA2B;QACtC,sDAAsD;QACtD,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC;IAEnE,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,WAAW,CAChB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC1C,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAElC,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,UAAU,GACd,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAC/D,CAAC,CAAE,OAAmC;QACtC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAEjC,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,kEAAkE;IAClE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC7B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpE,OAAO,IAA+B,CAAC;IACzC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,OAAgC;IACnE,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,GAAI,KAAiC,CAAC,OAAO,CAAC;YACrD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC,CAAC;YACvC,MAAM,GAAG,GAAI,KAAiC,CAAC,UAAU,CAAC;YAC1D,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC1E,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC/E,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,wBAAwB,MAAM,GAAG,CAAC;IAE1D,IAAI,IAAI,GAAG,cAAc,CAAC;IAC1B,IAAI,MAAM,KAAK,GAAG;QAAE,IAAI,GAAG,cAAc,CAAC;SACrC,IAAI,MAAM,KAAK,GAAG;QAAE,IAAI,GAAG,mBAAmB,CAAC;SAC/C,IAAI,MAAM,KAAK,GAAG;QAAE,IAAI,GAAG,WAAW,CAAC;SACvC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,IAAI,GAAG,mBAAmB,CAAC;SACjE,IAAI,MAAM,KAAK,GAAG;QAAE,IAAI,GAAG,cAAc,CAAC;IAC/C,mDAAmD;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC;YAC7B,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,KAAK,wBAAwB;oBAAE,IAAI,GAAG,mBAAmB,CAAC;qBAC3D,IAAI,EAAE,KAAK,sBAAsB;oBAAE,IAAI,GAAG,cAAc,CAAC;qBACzD,IAAI,EAAE,KAAK,eAAe;oBAAE,IAAI,GAAG,mBAAmB,CAAC;qBACvD,IAAI,EAAE,KAAK,aAAa;oBAAE,IAAI,GAAG,cAAc,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,0EAA0E;AAE1E,MAAM,YAAY,GAAG;;;;;;;;;;;;;CAapB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;CAOtB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;CAKnB,CAAC;AAEF,MAAM,YAAY,GAAG;;;CAGpB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;CAKtB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;CAKnB,CAAC;AAEF,0EAA0E;AAE1E,MAAM,SAAS,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG;;iBAEC,WAAW;;GAEzB,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAmB,CAAC;AAC5D,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,UAAU,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC5D,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACpF,MAAM,KAAK,GAAG;;;kBAGE,YAAY;;;;GAI3B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAmB,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,wBAAwB,EAAE,mBAAmB,CAAmB,CAAC;IACtF,CAAC;IACD,4FAA4F;IAC5F,MAAM,KAAK,GAAG;;yBAES,YAAY;;GAElC,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAmB,CAAC;AACpF,CAAC,CAAC;AAEF,MAAM,WAAW,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,WAAW,CAChB,sDAAsD,EACtD,mBAAmB,CACF,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC,4BAA4B,EAAE,mBAAmB,CAAmB,CAAC;IAC1F,CAAC;IACD,MAAM,KAAK,GAAG;;;;kBAIE,YAAY;;;GAG3B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAmB,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,WAAW,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,WAAW,CAAC,wBAAwB,EAAE,mBAAmB,CAAmB,CAAC;IACtF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC,sBAAsB,EAAE,mBAAmB,CAAmB,CAAC;IACpF,CAAC;IACD,MAAM,KAAK,GAAG;;;;kBAIE,YAAY;;;GAG3B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAmB,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,WAAW,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,WAAW,CAAC,wBAAwB,EAAE,mBAAmB,CAAmB,CAAC;IACtF,CAAC;IACD,MAAM,KAAK,GAAG;;;;GAIb,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAmB,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,YAAY,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,WAAW,CAAC,wBAAwB,EAAE,mBAAmB,CAAmB,CAAC;IACtF,CAAC;IACD,MAAM,KAAK,GAAG;;;;GAIb,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAmB,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,YAAY,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,WAAW,CAAC,sBAAsB,EAAE,mBAAmB,CAAmB,CAAC;IACpF,CAAC;IACD,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACpF,MAAM,KAAK,GAAG;;;kBAGE,YAAY;;;;;GAK3B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAmB,CAAC;AAClE,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,YAAY,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACpF,MAAM,KAAK,GAAG;;;kBAGE,cAAc;;;;GAI7B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAmB,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,UAAU,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,WAAW,CAAC,0BAA0B,EAAE,mBAAmB,CAAmB,CAAC;IACxF,CAAC;IACD,MAAM,KAAK,GAAG;;2BAEW,cAAc;;GAEtC,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAmB,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,aAAa,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,2BAA2B,EAAE,mBAAmB,CAAmB,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,WAAW,CAChB,kDAAkD,EAClD,mBAAmB,CACF,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG;;;;oBAII,cAAc;;;GAG/B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAmB,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,aAAa,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,WAAW,CAAC,0BAA0B,EAAE,mBAAmB,CAAmB,CAAC;IACxF,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC,sBAAsB,EAAE,mBAAmB,CAAmB,CAAC;IACpF,CAAC;IACD,MAAM,KAAK,GAAG;;;;oBAII,cAAc;;;GAG/B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAmB,CAAC;AAC3E,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,SAAS,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD,MAAM,KAAK,GAAG;;;kBAGE,WAAW;;;;GAI1B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAmB,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,OAAO,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,WAAW,CAAC,uBAAuB,EAAE,mBAAmB,CAAmB,CAAC;IACrF,CAAC;IACD,MAAM,KAAK,GAAG;;wBAEQ,WAAW;;GAEhC,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAmB,CAAC;AACpE,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,UAAU,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG;;;kBAGE,YAAY;;;;GAI3B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAmB,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,WAAW,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,2BAA2B,EAAE,mBAAmB,CAAmB,CAAC;IACzF,CAAC;IACD,MAAM,KAAK,GAAG;;;;uBAIO,YAAY;;;GAGhC,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAmB,CAAC;AACvE,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,YAAY,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,wBAAwB,EAAE,mBAAmB,CAAmB,CAAC;IACtF,CAAC;IACD,MAAM,IAAI,GAA4B;QACpC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;KAC3C,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG;;;kBAGE,cAAc;;;;GAI7B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAmB,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,aAAa,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,WAAW,CAAC,wBAAwB,EAAE,mBAAmB,CAAmB,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,WAAW,CAAC,qBAAqB,EAAE,mBAAmB,CAAmB,CAAC;IACnF,CAAC;IACD,MAAM,KAAK,GAAG;;;;oBAII,cAAc;;;GAG/B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;QACrC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;KACzB,CAAC,CAAmB,CAAC;AACxB,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,SAAS,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACpF,MAAM,KAAK,GAAG;;;kBAGE,WAAW;;;;GAI1B,CAAC;IACF,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAmB,CAAC;AAClE,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,KAAK,GAAmB,KAAK,EAAE,IAAI,EAAE,EAAE;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,WAAW,CAAC,sBAAsB,EAAE,mBAAmB,CAAmB,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAmB,CAAC;AACnE,CAAC,CAAC;AAEF,0EAA0E;AAE1E,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC7D,UAAU;IACV,SAAS;IACT,UAAU;IACV,UAAU;IACV,QAAQ;IACR,WAAW;IACX,WAAW;IACX,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,aAAa;IACb,aAAa;IACb,SAAS;IACT,SAAS;IACT,OAAO;IACP,UAAU;IACV,UAAU;IACV,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,SAAS;IACT,SAAS;IACT,eAAe;IACf,KAAK;CACN,CAAC;AAEF,0EAA0E;AAE1E,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,WAAW;gBACxB,WAAW,EACT,gJAAgJ;aACnJ;SACF;KACF;CACF,CAAC;AAEF,0EAA0E;AAE1E,MAAM,eAAe,GAAsB;IACzC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,yDAAyD;IACtE,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,UAAU;IACzB,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE;QACR,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,iBAAiB;QACzB,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;QAC7B,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;KAClC;CACF,CAAC;AAEF,MAAM,YAAY,GAAsB;IACtC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,0HAA0H;IAC5H,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,WAAW,EAAE,SAAS;CACvB,CAAC;AAEF,MAAM,cAAc,GAAsB;IACxC,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,wDAAwD;IACrE,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,WAAW,EAAE,aAAa;CAC3B,CAAC;AAEF,MAAM,WAAW,GAAsB;IACrC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,kDAAkD;IAC/D,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,MAAM;IACrB,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,WAAW,EAAE,aAAa;CAC3B,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,oBAAoB,EAAE,mDAAmD;IACzE,eAAe,EAAE,wCAAwC;IACzD,SAAS,EAAE,yCAAyC;IACpD,YAAY,EAAE,yEAAyE;IACvF,YAAY,EAAE,sDAAsD;IACpE,iBAAiB,EACf,0FAA0F;IAC5F,SAAS,EAAE,6CAA6C;IACxD,iBAAiB,EAAE,+DAA+D;IAClF,YAAY,EAAE,8CAA8C;CAC7D,CAAC;AAEF,0EAA0E;AAE1E,MAAM,CAAC,MAAM,sBAAsB,GAAqC;IACtE,qDAAqD;IAErD,SAAS,EAAE;QACT,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,sCAAsC;QAC/C,WAAW,EACT,sJAAsJ;QACxJ,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;QAC9B,UAAU,EAAE,CAAC,eAAe,CAAC;QAC7B,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,mDAAmD;QACtE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,8BAA8B;KACxC;IAED,qDAAqD;IAErD,UAAU,EAAE;QACV,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,0CAA0C;QACnD,WAAW,EACT,qXAAqX;QACvX,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;QACjC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,0QAA0Q;gBAC5Q,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,qEAAqE;QACxF,MAAM,EAAE,YAAY;QACpB,OAAO,EACL,qFAAqF;KACxF;IAED,QAAQ,EAAE;QACR,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,0CAA0C;QACnD,WAAW,EACT,qFAAqF;QACvF,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;QACnC,UAAU,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC;QAC3C,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,gEAAgE;QACnF,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,uCAAuC;KACjD;IAED,WAAW,EAAE;QACX,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,8BAA8B;QACvC,WAAW,EACT,sgBAAsgB;QACxgB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;QACnC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,aAAa;gBACpB,WAAW,EACT,mLAAmL;gBACrL,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,iDAAiD;QACpE,MAAM,EAAE,YAAY;QACpB,OAAO,EACL,kKAAkK;KACrK;IAED,WAAW,EAAE;QACX,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,mCAAmC;QAC5C,WAAW,EACT,6OAA6O;QAC/O,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;QACnC,UAAU,EAAE;YACV,eAAe;YACf,YAAY;YACZ;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,iBAAiB;gBACxB,WAAW,EACT,wJAAwJ;gBAC1J,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,iDAAiD;QACpE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,4EAA4E;KACtF;IAED,WAAW,EAAE;QACX,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,6BAA6B;QACtC,WAAW,EACT,6GAA6G;QAC/G,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC/C,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC;QAClD,UAAU,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC;QAC3C,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,qCAAqC;QACxD,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,0CAA0C;KACpD;IAED,YAAY,EAAE;QACZ,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,+BAA+B;QACxC,WAAW,EACT,6JAA6J;QAC/J,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;QACpC,UAAU,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC;QAC3C,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,sCAAsC;QACzD,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,2CAA2C;KACrD;IAED,YAAY,EAAE;QACZ,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,gCAAgC;QACzC,WAAW,EACT,4HAA4H;QAC9H,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;QACnC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,cAAc;gBACrB,WAAW,EAAE,wDAAwD;gBACrE,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,WAAW,EAAE,WAAW;aACzB;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,yKAAyK;gBAC3K,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;aACf;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EACf,qEAAqE;QACvE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,yDAAyD;KACnE;IAED,uDAAuD;IAEvD,YAAY,EAAE;QACZ,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,uBAAuB;QAChC,WAAW,EACT,iKAAiK;QACnK,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;QACnC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,sKAAsK;gBACxK,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,sEAAsE;QACzF,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,oEAAoE;KAC9E;IAED,UAAU,EAAE;QACV,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,8BAA8B;QACvC,WAAW,EAAE,sDAAsD;QACnE,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;QACrC,UAAU,EAAE,CAAC,eAAe,EAAE,cAAc,CAAC;QAC7C,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,wDAAwD;QAC3E,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,6CAA6C;KACvD;IAED,aAAa,EAAE;QACb,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,yCAAyC;QAClD,WAAW,EACT,sLAAsL;QACxL,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;QACrC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,eAAe;gBACtB,WAAW,EACT,2JAA2J;gBAC7J,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,qDAAqD;QACxE,MAAM,EAAE,YAAY;QACpB,OAAO,EACL,iHAAiH;KACpH;IAED,aAAa,EAAE;QACb,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,qCAAqC;QAC9C,WAAW,EACT,2JAA2J;QAC7J,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;QACrC,UAAU,EAAE;YACV,eAAe;YACf,cAAc;YACd;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,iBAAiB;gBACxB,WAAW,EACT,mIAAmI;gBACrI,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,qDAAqD;QACxE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,gEAAgE;KAC1E;IAED,oDAAoD;IAEpD,SAAS,EAAE;QACT,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,uCAAuC;QAChD,WAAW,EACT,iKAAiK;QACnK,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QAChC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,4IAA4I;gBAC9I,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;aACf;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,oEAAoE;QACvF,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,8BAA8B;KACxC;IAED,OAAO,EAAE;QACP,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,2BAA2B;QACpC,WAAW,EAAE,gDAAgD;QAC7D,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;QAClC,UAAU,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC;QAC1C,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,gDAAgD;QACnE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,qCAAqC;KAC/C;IAED,qDAAqD;IAErD,UAAU,EAAE;QACV,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,2BAA2B;QACpC,WAAW,EACT,4HAA4H;QAC9H,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;QACjC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,oHAAoH;gBACtH,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;aACf;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,6EAA6E;QAChG,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,sEAAsE;KAChF;IAED,WAAW,EAAE;QACX,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,0BAA0B;QACnC,WAAW,EACT,yLAAyL;QAC3L,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;QACnC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,aAAa;gBACpB,WAAW,EACT,+FAA+F;gBACjG,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,2DAA2D;QAC9E,MAAM,EAAE,YAAY;QACpB,OAAO,EACL,kFAAkF;KACrF;IAED,uDAAuD;IAEvD,YAAY,EAAE;QACZ,KAAK,EAAE,2BAA2B;QAClC,OAAO,EAAE,6CAA6C;QACtD,WAAW,EACT,uHAAuH;QACzH,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;QACnC,UAAU,EAAE;YACV,eAAe;YACf,YAAY;YACZ;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,sEAAsE;gBACxE,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;aACf;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,0EAA0E;QAC7F,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,2CAA2C;KACrD;IAED,aAAa,EAAE;QACb,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,4BAA4B;QACrC,WAAW,EACT,yFAAyF;QAC3F,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,gBAAgB;QACtB,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;QACrC,UAAU,EAAE;YACV,eAAe;YACf,YAAY;YACZ;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,cAAc;gBACrB,WAAW,EAAE,gEAAgE;gBAC7E,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,UAAU;gBACzB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,IAAI,EAAE,CAAC;gBACP,WAAW,EAAE,+CAA+C;aAC7D;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,qDAAqD;QACxE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,mEAAmE;KAC7E;IAED,oDAAoD;IAEpD,SAAS,EAAE;QACT,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,wCAAwC;QACjD,WAAW,EACT,wIAAwI;QAC1I,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QAChC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,WAAW,EACT,mKAAmK;gBACrK,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,IAAI;aACf;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,iFAAiF;QACpG,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,6DAA6D;KACvE;IAED,kDAAkD;IAElD,KAAK,EAAE;QACL,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,6CAA6C;QACtD,WAAW,EACT,+PAA+P;QACjQ,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,gBAAgB;QAC5B,WAAW,EAAE,CAAC,iBAAiB,CAAC;QAChC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;QAClC,UAAU,EAAE;YACV,eAAe;YACf;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,kBAAkB;gBACzB,WAAW,EACT,8HAA8H;gBAChI,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,EAAE;gBACR,WAAW,EAAE,8BAA8B;aAC5C;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,WAAW;gBAClB,WAAW,EAAE,8DAA8D;gBAC3E,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,CAAC;aACR;SACF;QACD,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,8DAA8D;QACjF,MAAM,EAAE,YAAY;QACpB,OAAO,EACL,4FAA4F;KAC/F;CACF,CAAC;AAEF,0EAA0E;AAE1E,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,wEAAwE;IACjF,WAAW,EACT,+tBAA+tB;IACjuB,QAAQ,EAAE,oBAAoB;IAC9B,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,2CAA2C;IACpD,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,EAAE;IACZ,cAAc,EAAE,QAAQ;IACxB,eAAe,EAAE,eAAe;IAChC,eAAe,EAAE;QACf,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,sCAAsC;YACnD,KAAK,EAAE,CAAC;SACT;QACD,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,4CAA4C;YACzD,KAAK,EAAE,CAAC;SACT;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,0DAA0D;YACvE,KAAK,EAAE,CAAC;SACT;QACD,KAAK,EAAE;YACL,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,gEAAgE;YAC7E,KAAK,EAAE,CAAC;SACT;QACD,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,2CAA2C;YACxD,KAAK,EAAE,CAAC;SACT;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,mCAAmC;YAChD,KAAK,EAAE,CAAC;SACT;QACD,KAAK,EAAE;YACL,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,qDAAqD;YAClE,KAAK,EAAE,CAAC;SACT;QACD,GAAG,EAAE;YACH,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,uDAAuD;YACpE,KAAK,EAAE,CAAC;SACT;KACF;IACD,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;CACtC,CAAC"} |
+19
-9
| { | ||
| "name": "@robinpath/linear", | ||
| "version": "0.1.2", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,12 +23,16 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "Linear module for RobinPath.", | ||
| "description": "Linear GraphQL API — issues, projects, teams, labels, users, and comments. Uses the encrypted credential vault for Personal API keys.", | ||
| "keywords": [ | ||
| "linear", | ||
| "project management" | ||
| "project management", | ||
| "project-management", | ||
| "issues", | ||
| "graphql", | ||
| "productivity" | ||
| ], | ||
@@ -38,7 +42,13 @@ "license": "MIT", | ||
| "category": "project-management", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "functionCount": 21, | ||
| "baseUrl": "https://api.linear.app" | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 20, | ||
| "baseUrl": "https://api.linear.app", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/linear | ||
| ```bash | ||
| npm install @robinpath/linear | ||
| robinpath add @robinpath/linear | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
92612
2363.74%10
400%1376
Infinity%2
100%