@dahrk/linear 0.1.0 → 0.2.0

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.
Files changed (67) hide show
  1. package/README.md +24 -12
  2. package/dist/batch-source.d.ts +63 -0
  3. package/dist/batch-source.d.ts.map +1 -0
  4. package/dist/batch-source.js +149 -0
  5. package/dist/batch-source.js.map +1 -0
  6. package/dist/comments.d.ts +36 -0
  7. package/dist/comments.d.ts.map +1 -0
  8. package/dist/comments.js +104 -0
  9. package/dist/comments.js.map +1 -0
  10. package/dist/documents.d.ts +1 -15
  11. package/dist/documents.d.ts.map +1 -1
  12. package/dist/documents.js +37 -27
  13. package/dist/documents.js.map +1 -1
  14. package/dist/format-action.d.ts +25 -0
  15. package/dist/format-action.d.ts.map +1 -0
  16. package/dist/format-action.js +250 -0
  17. package/dist/format-action.js.map +1 -0
  18. package/dist/index.d.ts +119 -15
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +231 -59
  21. package/dist/index.js.map +1 -1
  22. package/dist/issue-graph.d.ts +37 -0
  23. package/dist/issue-graph.d.ts.map +1 -0
  24. package/dist/issue-graph.js +125 -0
  25. package/dist/issue-graph.js.map +1 -0
  26. package/dist/issues.d.ts +27 -2
  27. package/dist/issues.d.ts.map +1 -1
  28. package/dist/issues.js +33 -10
  29. package/dist/issues.js.map +1 -1
  30. package/dist/labels.d.ts +48 -1
  31. package/dist/labels.d.ts.map +1 -1
  32. package/dist/labels.js +72 -24
  33. package/dist/labels.js.map +1 -1
  34. package/dist/linear-client.d.ts +51 -0
  35. package/dist/linear-client.d.ts.map +1 -1
  36. package/dist/linear-client.js +233 -34
  37. package/dist/linear-client.js.map +1 -1
  38. package/dist/oauth.d.ts +52 -12
  39. package/dist/oauth.d.ts.map +1 -1
  40. package/dist/oauth.js +91 -34
  41. package/dist/oauth.js.map +1 -1
  42. package/dist/recording-client.d.ts +20 -2
  43. package/dist/recording-client.d.ts.map +1 -1
  44. package/dist/recording-client.js +39 -1
  45. package/dist/recording-client.js.map +1 -1
  46. package/dist/responding-client.d.ts +49 -0
  47. package/dist/responding-client.d.ts.map +1 -0
  48. package/dist/responding-client.js +47 -0
  49. package/dist/responding-client.js.map +1 -0
  50. package/dist/teams.d.ts +20 -0
  51. package/dist/teams.d.ts.map +1 -0
  52. package/dist/teams.js +32 -0
  53. package/dist/teams.js.map +1 -0
  54. package/package.json +8 -10
  55. package/src/batch-source.ts +208 -0
  56. package/src/comments.ts +126 -0
  57. package/src/documents.ts +162 -0
  58. package/src/format-action.ts +279 -0
  59. package/src/index.ts +617 -0
  60. package/src/issue-graph.ts +169 -0
  61. package/src/issues.ts +142 -0
  62. package/src/labels.ts +254 -0
  63. package/src/linear-client.ts +448 -0
  64. package/src/oauth.ts +255 -0
  65. package/src/recording-client.ts +141 -0
  66. package/src/responding-client.ts +106 -0
  67. package/src/teams.ts +44 -0
@@ -11,19 +11,114 @@
11
11
  * There is no app-settable session `state`: Linear derives it from activities and signals, so
12
12
  * `setState` is a no-op here.
13
13
  */
14
- import { AgentActivitySignal, LinearClient } from "@linear/sdk";
14
+ import { AgentActivitySignal, AgentActivityType, LinearClient } from "@linear/sdk";
15
15
  import { filterExternalUrls } from "./index.js";
16
+ import { formatToolAction } from "./format-action.js";
17
+ /** One query, resolving the disengagement ground truth for a batch of issues. `includeArchived`
18
+ * keeps soft-deleted issues in the result (so they read as archived, not deleted); an id absent
19
+ * from the result was hard-deleted. */
20
+ const ISSUE_ENGAGEMENT_QUERY = /* GraphQL */ `
21
+ query DahrkIssueEngagement($ids: [ID!]!) {
22
+ issues(filter: { id: { in: $ids } }, includeArchived: true, first: 250) {
23
+ nodes {
24
+ id
25
+ archivedAt
26
+ delegateId
27
+ assignee { id }
28
+ state { type }
29
+ }
30
+ }
31
+ }
32
+ `;
33
+ /** DHK-63: proactively open an agent session on an issue / a comment. Returns the new session id off
34
+ * the AgentSessionPayload so the hub can bind a pre-brief run to it. */
35
+ const SESSION_CREATE_ON_ISSUE = /* GraphQL */ `
36
+ mutation DahrkAgentSessionCreateOnIssue($input: AgentSessionCreateOnIssue!) {
37
+ agentSessionCreateOnIssue(input: $input) {
38
+ agentSession { id }
39
+ }
40
+ }
41
+ `;
42
+ const SESSION_CREATE_ON_COMMENT = /* GraphQL */ `
43
+ mutation DahrkAgentSessionCreateOnComment($input: AgentSessionCreateOnComment!) {
44
+ agentSessionCreateOnComment(input: $input) {
45
+ agentSession { id }
46
+ }
47
+ }
48
+ `;
49
+ /** The configured review-state name. This package has no dependency on the hub, so it cannot reuse the
50
+ * hub's `envValue`. The pre-rename legacy twin was dropped: no current host sets it. */
51
+ function reviewStateNameEnv() {
52
+ return process.env.DAHRK_REVIEW_STATE_NAME;
53
+ }
54
+ /** Find the review-target state the way `moveIssueToReview` does, so `startIssue` can EXCLUDE it.
55
+ * Linear has no "review" state type, so it is matched by name: an explicit configured name
56
+ * (`DAHRK_REVIEW_STATE_NAME`) when set, else the first review-ish name. */
57
+ export function findReviewState(states, reviewName) {
58
+ const wanted = (reviewName ?? "").trim().toLowerCase();
59
+ return wanted
60
+ ? states.find((s) => s.name.toLowerCase() === wanted)
61
+ : states.find((s) => /review|in review|qa/i.test(s.name));
62
+ }
63
+ /**
64
+ * Pick the team's working ("In Progress") state for a just-started run. A team can have MORE THAN
65
+ * ONE `started`-typed state (e.g. both "In Progress" and "In Review" are typed `started`), so the
66
+ * naive "lowest-position started state" is ambiguous and can wrongly land the ticket in In Review.
67
+ * Prefer an explicit working-name match (`/in progress|doing|started/i`), else the lowest-position
68
+ * `started` state that is NOT the review state. Returns `undefined` when there is no usable working
69
+ * state (so the caller reports a no-op rather than moving the ticket to review).
70
+ */
71
+ export function selectStartState(states, reviewName) {
72
+ const started = states.filter((s) => s.type === "started").sort((a, b) => a.position - b.position);
73
+ if (started.length === 0)
74
+ return undefined;
75
+ const review = findReviewState(states, reviewName);
76
+ const candidates = started.filter((s) => !review || s.id !== review.id);
77
+ if (candidates.length === 0)
78
+ return undefined;
79
+ return candidates.find((s) => /in progress|doing|started/i.test(s.name)) ?? candidates[0];
80
+ }
81
+ /** Returns true when `delegateId` should be written on the issue.
82
+ * Skipping when already equal avoids the "assigned to you" notification on every re-run (DHK-263). */
83
+ export function shouldSetDelegate(issueDelegateId, viewerId) {
84
+ return issueDelegateId !== viewerId;
85
+ }
86
+ /**
87
+ * The document already attached to this issue under `title`, or null when there is none. This is
88
+ * what gives `createDocument` its upsert: Linear keys documents by id only, so a title match on the
89
+ * issue is our stand-in.
90
+ *
91
+ * Titles are compared trimmed and case-insensitively, so a human who lightly re-cases the title does
92
+ * not cause the next run to fork a second copy. The read is bounded and unpaginated at 50, matching
93
+ * `linearDocumentSource.issueDocuments` in `documents.ts`: an issue carrying more than 50 documents
94
+ * silently drops the overflow, which is a deliberate limit rather than a bug.
95
+ */
96
+ export async function findDocumentByTitle(issue, title) {
97
+ const wanted = title.trim().toLowerCase();
98
+ if (!wanted)
99
+ return null;
100
+ const conn = await issue.documents({ first: 50 });
101
+ return conn.nodes.find((d) => (d.title ?? "").trim().toLowerCase() === wanted) ?? null;
102
+ }
16
103
  /** Build the (untyped) activity content payload Linear expects for each activity type. */
17
104
  function contentOf(a) {
18
105
  switch (a.type) {
19
106
  case "thought":
20
- return { type: "thought", body: a.text };
107
+ return { type: AgentActivityType.Thought, body: a.text };
21
108
  case "response":
22
- return { type: "response", body: a.text };
109
+ return { type: AgentActivityType.Response, body: a.text };
23
110
  case "error":
24
- return { type: "error", body: a.text };
25
- case "action":
26
- return { type: "action", action: a.tool ?? "tool", parameter: a.text };
111
+ return { type: AgentActivityType.Error, body: a.text };
112
+ case "action": {
113
+ // DHK-382: render as a human verb + humanised parameter ("Ran · grep ...") instead of the
114
+ // tool name plus raw JSON. formatToolAction is total and defensive: a malformed/truncated
115
+ // preview degrades to the bare verb rather than throwing or posting raw JSON.
116
+ const { action, parameter } = formatToolAction(a.tool, a.text);
117
+ // DHK-385: fold the tool's outcome under the call as the action's `result` (markdown) when the
118
+ // observation has arrived, so the step is one self-contained activity instead of a call plus a
119
+ // separate observation row. Omitted while the action is still in flight (no result yet).
120
+ return { type: AgentActivityType.Action, action, parameter, ...(a.result ? { result: a.result } : {}) };
121
+ }
27
122
  }
28
123
  }
29
124
  /** Normalise an elicitation option into Linear's `{ label?, value }` shape. */
@@ -32,6 +127,8 @@ function optionOf(o) {
32
127
  }
33
128
  export function createLinearClient(token) {
34
129
  const client = new LinearClient({ accessToken: token });
130
+ // viewer.id is stable for the life of a Connection token; resolve it once and reuse.
131
+ let cachedAppUserId;
35
132
  return {
36
133
  async postActivity(sessionId, activity) {
37
134
  await client.createAgentActivity({
@@ -44,7 +141,7 @@ export function createLinearClient(token) {
44
141
  async raiseElicitation(sessionId, prompt, options) {
45
142
  await client.createAgentActivity({
46
143
  agentSessionId: sessionId,
47
- content: { type: "elicitation", body: prompt },
144
+ content: { type: AgentActivityType.Elicitation, body: prompt },
48
145
  signal: AgentActivitySignal.Select,
49
146
  ...(options ? { signalMetadata: { options: options.map(optionOf) } } : {}),
50
147
  });
@@ -79,7 +176,7 @@ export function createLinearClient(token) {
79
176
  // completes the link at `auth.url`, then the agent resumes on the follow-up `prompted` webhook.
80
177
  await client.createAgentActivity({
81
178
  agentSessionId: sessionId,
82
- content: { type: "elicitation", body: prompt },
179
+ content: { type: AgentActivityType.Elicitation, body: prompt },
83
180
  signal: AgentActivitySignal.Auth,
84
181
  signalMetadata: {
85
182
  url: auth.url,
@@ -93,46 +190,79 @@ export function createLinearClient(token) {
93
190
  const session = await client.agentSession(sessionId);
94
191
  const issue = await session.issue;
95
192
  if (!issue)
96
- return;
193
+ return { moved: false, reason: "no-issue" };
97
194
  // Self-delegate (idempotent: assignment already sets the app as delegate; @mention does not).
195
+ // Split from the state move below so a failure of one does not sink the other (a rejected
196
+ // delegate write must not block moving the ticket to In Progress, and vice-versa).
98
197
  const me = await client.viewer;
99
- const update = { delegateId: me.id };
100
- // Move to the team's first `started` state, but only from a not-yet-started status.
198
+ // DHK-263: only write delegateId when not already delegated to us. Re-writing when equal
199
+ // regenerates the "assigned to you" notification on every re-run of an already-delegated issue.
200
+ if (shouldSetDelegate(issue.delegateId, me.id)) {
201
+ await client.updateIssue(issue.id, { delegateId: me.id }).catch((e) => {
202
+ console.warn(`startIssue self-delegate failed for ${sessionId}: ${e instanceof Error ? e.message : String(e)}`);
203
+ });
204
+ }
205
+ // Move to the team's working state, but only from a not-yet-started status.
101
206
  const current = await issue.state;
102
- if (current && current.type !== "started" && current.type !== "completed" && current.type !== "canceled") {
103
- const team = await issue.team;
104
- if (team) {
105
- const states = await team.states({ filter: { type: { eq: "started" } } });
106
- const first = [...states.nodes].sort((a, b) => a.position - b.position)[0];
107
- if (first)
108
- update.stateId = first.id;
109
- }
207
+ if (!current || current.type === "started" || current.type === "completed" || current.type === "canceled") {
208
+ return { moved: false, reason: "already-active" };
209
+ }
210
+ const team = await issue.team;
211
+ if (!team)
212
+ return { moved: false, reason: "no-team" };
213
+ // Fetch states UNFILTERED and disambiguate in JS. This is a SEMANTIC need, not an SDK-filter
214
+ // workaround: the team has TWO `started`-typed states (In Progress AND In Review), so even a
215
+ // working server-side `filter: { type: { eq: "started" } }` returns both - the wrong answer.
216
+ // (Verified on @linear/sdk 86.0.0, DHK-579: that filter now returns both `In Progress` and
217
+ // `In Review`.) selectStartState excludes the review state and prefers the working one
218
+ // (DHK-258). Do NOT "simplify" this to a server-side filter - it would re-introduce the bug.
219
+ const states = [...(await team.states()).nodes];
220
+ const pick = selectStartState(states, reviewStateNameEnv());
221
+ if (!pick)
222
+ return { moved: false, reason: "no-started-state" };
223
+ try {
224
+ await client.updateIssue(issue.id, { stateId: pick.id });
110
225
  }
111
- await client.updateIssue(issue.id, update);
226
+ catch (e) {
227
+ console.warn(`startIssue state move failed for ${sessionId}: ${e instanceof Error ? e.message : String(e)}`);
228
+ return { moved: false, reason: "update-failed" };
229
+ }
230
+ return { moved: true, stateName: pick.name };
112
231
  },
113
232
  async moveIssueToReview(sessionId) {
114
233
  const session = await client.agentSession(sessionId);
115
234
  const issue = await session.issue;
116
235
  if (!issue)
117
- return;
236
+ return { moved: false, reason: "no-issue" };
118
237
  // Never disturb a closed issue.
119
238
  const current = await issue.state;
120
- if (current && (current.type === "completed" || current.type === "canceled"))
121
- return;
239
+ if (current && (current.type === "completed" || current.type === "canceled")) {
240
+ return { moved: false, reason: "already-there" };
241
+ }
122
242
  const team = await issue.team;
123
243
  if (!team)
124
- return;
125
- // Linear has no "review" state TYPE, so match by name. Prefer an explicit configured name,
126
- // else the first state whose name looks review-ish. No match = leave the issue in `started`
127
- // (never auto-complete), so a human keeps iterating and can re-summon @Skakel on the same PR.
128
- const wanted = (process.env.SKAKEL_REVIEW_STATE_NAME ?? "").trim().toLowerCase();
244
+ return { moved: false, reason: "no-team" };
245
+ // Linear has no "review" state TYPE, so match by name (shared with `startIssue`'s exclusion via
246
+ // `findReviewState`): an explicit configured name, else the first review-ish name. No match =
247
+ // leave the issue in `started` (never auto-complete), so a human keeps iterating and can
248
+ // re-summon @Dahrk on the same PR. DHK-283: a no-match is now RETURNED as `no-review-state`
249
+ // (not a silent void) so the caller can surface it, since a team with no review-ish state would
250
+ // otherwise sit In Progress unremarked.
129
251
  const states = [...(await team.states()).nodes].sort((a, b) => a.position - b.position);
130
- const pick = wanted
131
- ? states.find((s) => s.name.toLowerCase() === wanted)
132
- : states.find((s) => /review|in review|qa/i.test(s.name));
133
- if (!pick || (current && pick.id === current.id))
134
- return;
135
- await client.updateIssue(issue.id, { stateId: pick.id });
252
+ const pick = findReviewState(states, reviewStateNameEnv());
253
+ if (!pick)
254
+ return { moved: false, reason: "no-review-state" };
255
+ // Already in the review state: nothing to do, and benign (a re-run of an already-reviewed issue).
256
+ if (current && pick.id === current.id)
257
+ return { moved: false, reason: "already-there" };
258
+ try {
259
+ await client.updateIssue(issue.id, { stateId: pick.id });
260
+ }
261
+ catch (e) {
262
+ console.warn(`moveIssueToReview state move failed for ${sessionId}: ${e instanceof Error ? e.message : String(e)}`);
263
+ return { moved: false, reason: "update-failed" };
264
+ }
265
+ return { moved: true, stateName: pick.name };
136
266
  },
137
267
  async commentOnIssue(sessionId, body) {
138
268
  // A normal top-level issue comment (not an agent activity), so a run summary lands in the
@@ -165,6 +295,21 @@ export function createLinearClient(token) {
165
295
  // mirroring attachPr. `documentCreate` with an issueId links the document to the issue.
166
296
  const session = await client.agentSession(sessionId);
167
297
  const issue = await session.issue;
298
+ // Idempotent by (issueId, title). Unlike `attachmentCreate`, Linear's `documentCreate` has NO
299
+ // upsert semantics - title is not a key - so we emulate one: look for a document already on
300
+ // this issue with the same title and UPDATE it rather than creating a second. Without this, a
301
+ // continuation run (which re-runs the workflow from stage 0 with a fresh runId, and so a fresh
302
+ // `attach-document:<runId>` journal key) stacks another copy of the same report on the issue.
303
+ // The caveat this buys: a human-authored document on the same issue that happens to carry the
304
+ // workflow's title is overwritten. Title collision on one issue is the accepted trade for not
305
+ // littering the issue with near-duplicate reports; Linear keeps document history either way.
306
+ if (issue) {
307
+ const existing = await findDocumentByTitle(issue, doc.title);
308
+ if (existing) {
309
+ await client.updateDocument(existing.id, { title: doc.title, content: doc.content });
310
+ return { id: existing.id, url: existing.url ?? "" };
311
+ }
312
+ }
168
313
  const payload = await client.createDocument({
169
314
  title: doc.title,
170
315
  content: doc.content,
@@ -193,6 +338,60 @@ export function createLinearClient(token) {
193
338
  async setState() {
194
339
  // Linear derives the agent-session state from activities/signals; not app-settable.
195
340
  },
341
+ async readIssueEngagement(issueIds) {
342
+ const out = new Map();
343
+ const ids = [...new Set(issueIds.filter((id) => id))];
344
+ if (ids.length === 0)
345
+ return out;
346
+ // One rawRequest per <=100-id chunk (a single query per chunk, not per issue), so a sweep over
347
+ // many in-flight runs stays rate-limit friendly. An id that Linear does not return is left out
348
+ // of the map, which the caller reads as "deleted".
349
+ for (let i = 0; i < ids.length; i += 100) {
350
+ const chunk = ids.slice(i, i + 100);
351
+ const res = await client.client.rawRequest(ISSUE_ENGAGEMENT_QUERY, { ids: chunk });
352
+ // A GraphQL error that did not throw must NOT be read as "no issues" (which the caller would
353
+ // treat as every issue deleted). Surface it so the sweep skips this connection this tick.
354
+ if (!res.data && res.errors?.length) {
355
+ throw new Error(`readIssueEngagement: ${res.errors.map((e) => e?.message ?? "error").join("; ")}`);
356
+ }
357
+ for (const n of res.data?.issues?.nodes ?? []) {
358
+ if (!n.id)
359
+ continue;
360
+ out.set(n.id, {
361
+ present: true,
362
+ archived: Boolean(n.archivedAt),
363
+ ...(n.state?.type ? { stateType: n.state.type } : {}),
364
+ ...(n.assignee?.id ? { assigneeId: n.assignee.id } : {}),
365
+ ...(n.delegateId ? { delegateId: n.delegateId } : {}),
366
+ });
367
+ }
368
+ }
369
+ return out;
370
+ },
371
+ async appUserId() {
372
+ if (cachedAppUserId === undefined)
373
+ cachedAppUserId = (await client.viewer).id;
374
+ return cachedAppUserId;
375
+ },
376
+ async createSessionOnIssue(issueId) {
377
+ // DHK-63: proactively open an agent session on an issue (not delegated/@mentioned). The typed SDK
378
+ // does not surface these mutations, so raw GraphQL, selecting the new session id off the returned
379
+ // AgentSessionPayload. Surface a GraphQL error rather than returning a blank id.
380
+ const res = await client.client.rawRequest(SESSION_CREATE_ON_ISSUE, { input: { issueId } });
381
+ const id = res.data?.agentSessionCreateOnIssue?.agentSession?.id;
382
+ if (!id) {
383
+ throw new Error(`agentSessionCreateOnIssue: ${res.errors?.map((e) => e?.message ?? "error").join("; ") ?? "no session id returned"}`);
384
+ }
385
+ return id;
386
+ },
387
+ async createSessionOnComment(commentId) {
388
+ const res = await client.client.rawRequest(SESSION_CREATE_ON_COMMENT, { input: { commentId } });
389
+ const id = res.data?.agentSessionCreateOnComment?.agentSession?.id;
390
+ if (!id) {
391
+ throw new Error(`agentSessionCreateOnComment: ${res.errors?.map((e) => e?.message ?? "error").join("; ") ?? "no session id returned"}`);
392
+ }
393
+ return id;
394
+ },
196
395
  };
197
396
  }
198
397
  //# sourceMappingURL=linear-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linear-client.js","sourceRoot":"","sources":["../src/linear-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linear-client.js","sourceRoot":"","sources":["../src/linear-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AActD;;wCAEwC;AACxC,MAAM,sBAAsB,GAAG,aAAa,CAAC;;;;;;;;;;;;CAY5C,CAAC;AAEF;yEACyE;AACzE,MAAM,uBAAuB,GAAG,aAAa,CAAC;;;;;;CAM7C,CAAC;AAEF,MAAM,yBAAyB,GAAG,aAAa,CAAC;;;;;;CAM/C,CAAC;AAmBF;yFACyF;AACzF,SAAS,kBAAkB;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAC7C,CAAC;AAED;;4EAE4E;AAC5E,MAAM,UAAU,eAAe,CAAsB,MAAoB,EAAE,UAAmB;IAC5F,MAAM,MAAM,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,OAAO,MAAM;QACX,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;QACrD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAsB,MAAoB,EAAE,UAAmB;IAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED;uGACuG;AACvG,MAAM,UAAU,iBAAiB,CAAC,eAAmC,EAAE,QAAgB;IACrF,OAAO,eAAe,KAAK,QAAQ,CAAC;AACtC,CAAC;AAgBD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAqB,EAAE,KAAa;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;AACzF,CAAC;AAED,0FAA0F;AAC1F,SAAS,SAAS,CAAC,CAAW;IAC5B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,0FAA0F;YAC1F,0FAA0F;YAC1F,8EAA8E;YAC9E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/D,+FAA+F;YAC/F,+FAA+F;YAC/F,yFAAyF;YACzF,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1G,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS,QAAQ,CAAC,CAAe;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,qFAAqF;IACrF,IAAI,eAAmC,CAAC;IACxC,OAAO;QACL,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ;YACpC,MAAM,MAAM,CAAC,mBAAmB,CAAC;gBAC/B,cAAc,EAAE,SAAS;gBACzB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC;gBAC5B,iGAAiG;gBACjG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO;YAC/C,MAAM,MAAM,CAAC,mBAAmB,CAAC;gBAC/B,cAAc,EAAE,SAAS;gBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC9D,MAAM,EAAE,mBAAmB,CAAC,MAAM;gBAClC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3E,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU;YAC3C,gGAAgG;YAChG,6FAA6F;YAC7F,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,0BAA0B,CACrD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,EACjG,OAAO,CACR,CAAC;YACF,OAAO,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;gBACxC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC,CAAC;QACN,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI;YAC/B,2FAA2F;YAC3F,8FAA8F;YAC9F,4DAA4D;YAC5D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW;gBAAE,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7D,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YAC3C,CAAC;YACD,IAAI,OAAO;gBAAE,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI;YACvC,6FAA6F;YAC7F,gGAAgG;YAChG,MAAM,MAAM,CAAC,mBAAmB,CAAC;gBAC/B,cAAc,EAAE,SAAS;gBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC9D,MAAM,EAAE,mBAAmB,CAAC,IAAI;gBAChC,cAAc,EAAE;oBACd,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClE;aACF,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,SAAS;YACxB,mGAAmG;YACnG,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YACxD,8FAA8F;YAC9F,0FAA0F;YAC1F,mFAAmF;YACnF,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YAC/B,yFAAyF;YACzF,gGAAgG;YAChG,IAAI,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC/C,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;oBAC7E,OAAO,CAAC,IAAI,CAAC,uCAAuC,SAAS,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,4EAA4E;YAC5E,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC1G,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACtD,6FAA6F;YAC7F,6FAA6F;YAC7F,6FAA6F;YAC7F,2FAA2F;YAC3F,uFAAuF;YACvF,6FAA6F;YAC7F,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,oCAAoC,SAAS,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7G,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,SAAS;YAC/B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YACxD,gCAAgC;YAChC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC;YAClC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;gBAC7E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;YACnD,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACtD,gGAAgG;YAChG,8FAA8F;YAC9F,yFAAyF;YACzF,4FAA4F;YAC5F,gGAAgG;YAChG,wCAAwC;YACxC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YACxF,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;YAC9D,kGAAkG;YAClG,IAAI,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;gBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;YACxF,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,2CAA2C,SAAS,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI;YAClC,0FAA0F;YAC1F,8FAA8F;YAC9F,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAgB;YACxC,gGAAgG;YAChG,6FAA6F;YAC7F,iGAAiG;YACjG,gGAAgG;YAChG,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,MAAM,CAAC,gBAAgB,CAAC;gBAC5B,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,GAAG,EAAE,EAAE,CAAC,GAAG;gBACX,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,GAAkB;YAChD,2FAA2F;YAC3F,wFAAwF;YACxF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;YAElC,8FAA8F;YAC9F,4FAA4F;YAC5F,8FAA8F;YAC9F,+FAA+F;YAC/F,8FAA8F;YAC9F,8FAA8F;YAC9F,8FAA8F;YAC9F,6FAA6F;YAC7F,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrF,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC;gBACtD,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;gBAC1C,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,OAAO,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;QAClF,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK;YAC5B,6FAA6F;YAC7F,2FAA2F;YAC3F,+FAA+F;YAC/F,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE;gBACzC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aAC9E,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI;YACnC,iGAAiG;YACjG,gGAAgG;YAChG,uDAAuD;YACvD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC/B,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,oFAAoF;QACtF,CAAC;QACD,KAAK,CAAC,mBAAmB,CAAC,QAAQ;YAChC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;YAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;YACjC,+FAA+F;YAC/F,+FAA+F;YAC/F,mDAAmD;YACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAGxC,sBAAsB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1C,6FAA6F;gBAC7F,0FAA0F;gBAC1F,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrG,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;oBAC9C,IAAI,CAAC,CAAC,CAAC,EAAE;wBAAE,SAAS;oBACpB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACZ,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;wBAC/B,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,IAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxD,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACtD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,SAAS;YACb,IAAI,eAAe,KAAK,SAAS;gBAAE,eAAe,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,oBAAoB,CAAC,OAAO;YAChC,kGAAkG;YAClG,kGAAkG;YAClG,iFAAiF;YACjF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAGxC,uBAAuB,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,yBAAyB,EAAE,YAAY,EAAE,EAAE,CAAC;YACjE,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CACb,8BAA8B,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,wBAAwB,EAAE,CACrH,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,sBAAsB,CAAC,SAAS;YACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAGxC,yBAAyB,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,2BAA2B,EAAE,YAAY,EAAE,EAAE,CAAC;YACnE,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,wBAAwB,EAAE,CACvH,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/oauth.d.ts CHANGED
@@ -1,17 +1,11 @@
1
- /**
2
- * Linear OAuth 2.0 helpers for the agent install + token rotation (build spec section 14).
3
- *
4
- * An agent becomes assignable/mentionable in a workspace only while the app is INSTALLED via
5
- * the authorization-code flow with `actor=app` and the `app:assignable` / `app:mentionable`
6
- * scopes (admin consent). That flow also yields the access + refresh tokens the hub posts with.
7
- * Access tokens last ~24h, so the hub refreshes them with the refresh token (see the hub's
8
- * `resolveClient`). Plain `fetch`, no SDK; cyrus is a reference, not a dependency.
9
- */
10
1
  /** The agent scopes: read/write plus the two that make the app assignable + mentionable. */
11
2
  export declare const DEFAULT_AGENT_SCOPES: readonly ["read", "write", "app:assignable", "app:mentionable"];
12
3
  export interface LinearTokens {
13
4
  accessToken: string;
14
- /** Absent on some refresh responses; callers keep the prior refresh token when so. */
5
+ /** Present on every authorization-code and refresh response, absent on a client-credentials mint
6
+ * (which issues no refresh token at all). It is NOT optional on a refresh: Linear rotates refresh
7
+ * tokens single-use and always returns the replacement, so a refresh response without one is a
8
+ * protocol violation rather than "keep the one you have" - see {@link refreshTokens}. */
15
9
  refreshToken?: string;
16
10
  /** When the access token expires (computed from `expires_in`). */
17
11
  expiresAt: Date;
@@ -28,6 +22,11 @@ export declare function authorizeUrl(params: {
28
22
  state: string;
29
23
  scopes?: readonly string[];
30
24
  actor?: "app" | "user";
25
+ /** `"consent"` (default) forces Linear's consent screen every time - right for the `actor=app`
26
+ * install (re-grants and re-issues a refresh token, and lets an admin connect another workspace).
27
+ * `"auto"` omits the `prompt` param so Linear only prompts when scopes are not already granted -
28
+ * right for the `actor=user` sign-in, so a returning user is not made to re-authorise on every login. */
29
+ prompt?: "consent" | "auto";
31
30
  }): string;
32
31
  /** Exchange the callback `code` for access + refresh tokens (one-time, at install). */
33
32
  export declare function exchangeCode(params: {
@@ -39,14 +38,19 @@ export declare function exchangeCode(params: {
39
38
  /**
40
39
  * Resolve the workspace (organization) id the access token belongs to. Used at install to backfill
41
40
  * a connection's `workspaceIds` from the token, so an operator need not paste the org id by hand and
42
- * intake can match the workspace on the very first webhook. Plain GraphQL fetch, no SDK.
41
+ * intake can match the workspace on the very first webhook.
43
42
  */
44
43
  export declare function fetchOrganizationId(accessToken: string): Promise<string>;
45
44
  /** The agent identity + bound workspace a token resolves to, for the connection Probe. */
46
45
  export interface LinearProbe {
46
+ /** `email` (verified, owned by Linear) is the cross-provider account join key; `admin` is captured
47
+ * now for later permission gating (unused at launch). Both are non-null on Linear's `User` type but
48
+ * optional here so a partial/legacy probe response never throws. */
47
49
  viewer?: {
48
50
  id: string;
49
51
  name?: string;
52
+ email?: string;
53
+ admin?: boolean;
50
54
  };
51
55
  organization?: {
52
56
  id: string;
@@ -60,12 +64,48 @@ export interface LinearProbe {
60
64
  * binds to. Throws on an auth failure / GraphQL error, which the caller renders as "token invalid".
61
65
  */
62
66
  export declare function probeToken(accessToken: string): Promise<LinearProbe>;
63
- /** Rotate the access token using the stored refresh token (the hub calls this near expiry / on 401). */
67
+ /**
68
+ * Rotate the access token using the stored refresh token (the hub calls this near expiry / on 401).
69
+ *
70
+ * Linear rotates refresh tokens **single-use**: the request consumes the one presented and the response
71
+ * carries "a new valid access token and a new refresh token" (oauth-2-0-authentication.md, "Refresh an
72
+ * access token"). So the replacement is mandatory, and a response without one means the old token has
73
+ * been consumed while we learned nothing - the caller MUST NOT carry on with the previous value, which
74
+ * is now dead. Throwing here is what makes that loud instead of silently arming a connection to fail
75
+ * on its next refresh, forever (DHK-1306).
76
+ *
77
+ * Linear gives a 30-minute grace period for exactly this case: the original request can be replayed to
78
+ * retrieve the new refresh token. Recovery is the caller's to attempt; this function's job is to refuse
79
+ * to report success when the rotation is unaccounted for.
80
+ */
64
81
  export declare function refreshTokens(params: {
65
82
  clientId: string;
66
83
  clientSecret: string;
67
84
  refreshToken: string;
68
85
  }, now?: () => Date): Promise<LinearTokens>;
86
+ /**
87
+ * Revoke an access token at Linear, de-authorising the app for the workspace that token belongs to.
88
+ *
89
+ * This is the ONLY app-callable lever Linear gives us over an install: there is no uninstall mutation
90
+ * and nothing in the GraphQL schema that names or targets an install (`revokeOauthToken`,
91
+ * `userAuthorizedApplications`, `applicationWithAuthorization` are all absent). De-authorisation is
92
+ * per organisation - Linear signals it with an `OAuthApp revoked` webhook carrying `organizationId`.
93
+ *
94
+ * Why it matters beyond hygiene: while an install exists, Linear's authorize hop resolves against it
95
+ * and shows "Dahrk already installed - Continue" rather than a consent screen for the workspace the
96
+ * user is actually in. So a user who wanted to move the connection to another workspace got the old
97
+ * one back, every time, with no way out from inside the product. Forgetting a token locally is not
98
+ * enough; Linear has to be told.
99
+ *
100
+ * A `400` counts as revoked. The endpoint returns it for an already-revoked token, and the caller's
101
+ * question is "is this token dead", to which "Linear dropped it earlier" is a yes. A `401` does not:
102
+ * it means we could not authenticate the revocation at all, so the install may well still be live and
103
+ * the caller must say so rather than report a clean disconnect.
104
+ */
105
+ export declare function revokeToken(params: {
106
+ token: string;
107
+ tokenTypeHint?: "access_token" | "refresh_token";
108
+ }): Promise<void>;
69
109
  /**
70
110
  * Mint an `app` actor token via the `client_credentials` grant: headless (no user, no redirect, no
71
111
  * callback, no refresh token), scoped to the app's workspace, valid ~30 days. Linear's documented
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,iEAAkE,CAAC;AAEpG,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB,GAAG,MAAM,CAWT;AA+BD,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACrF,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,YAAY,CAAC,CAWvB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB9E;AAED,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoB1E;AAED,wGAAwG;AACxG,wBAAgB,aAAa,CAC3B,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EACxE,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,YAAY,CAAC,CAUvB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAC9E,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,YAAY,CAAC,CAUvB"}
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAeA,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,iEAAkE,CAAC;AAEpG,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB;;;8FAG0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB;;;8GAG0G;IAC1G,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B,GAAG,MAAM,CAUT;AA+BD,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACrF,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,YAAY,CAAC,CAWvB;AAYD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI9E;AAED,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B;;yEAEqE;IACrE,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxE,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoB1E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EACxE,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;CAClD,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAC9E,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,YAAY,CAAC,CAUvB"}