pi-loop 0.1.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 (166) hide show
  1. package/agents/code-reviewer.md +82 -0
  2. package/agents/coder.md +82 -0
  3. package/agents/decomposer.md +55 -0
  4. package/agents/judge.md +90 -0
  5. package/agents/review-optimizer.md +44 -0
  6. package/dist/agents/adapter.d.ts +9 -0
  7. package/dist/agents/adapter.d.ts.map +1 -0
  8. package/dist/agents/adapter.js +41 -0
  9. package/dist/agents/adapter.js.map +1 -0
  10. package/dist/agents/factory.d.ts +7 -0
  11. package/dist/agents/factory.d.ts.map +1 -0
  12. package/dist/agents/factory.js +49 -0
  13. package/dist/agents/factory.js.map +1 -0
  14. package/dist/agents/registry.d.ts +4 -0
  15. package/dist/agents/registry.d.ts.map +1 -0
  16. package/dist/agents/registry.js +98 -0
  17. package/dist/agents/registry.js.map +1 -0
  18. package/dist/agents/types.d.ts +21 -0
  19. package/dist/agents/types.d.ts.map +1 -0
  20. package/dist/agents/types.js +39 -0
  21. package/dist/agents/types.js.map +1 -0
  22. package/dist/cli/args.d.ts +38 -0
  23. package/dist/cli/args.d.ts.map +1 -0
  24. package/dist/cli/args.js +160 -0
  25. package/dist/cli/args.js.map +1 -0
  26. package/dist/cli/commands.d.ts +29 -0
  27. package/dist/cli/commands.d.ts.map +1 -0
  28. package/dist/cli/commands.js +362 -0
  29. package/dist/cli/commands.js.map +1 -0
  30. package/dist/cli/output.d.ts +33 -0
  31. package/dist/cli/output.d.ts.map +1 -0
  32. package/dist/cli/output.js +99 -0
  33. package/dist/cli/output.js.map +1 -0
  34. package/dist/config/defaults.d.ts +3 -0
  35. package/dist/config/defaults.d.ts.map +1 -0
  36. package/dist/config/defaults.js +31 -0
  37. package/dist/config/defaults.js.map +1 -0
  38. package/dist/config/loader.d.ts +11 -0
  39. package/dist/config/loader.d.ts.map +1 -0
  40. package/dist/config/loader.js +70 -0
  41. package/dist/config/loader.js.map +1 -0
  42. package/dist/config/types.d.ts +41 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +5 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/core/checkpoint.d.ts +18 -0
  47. package/dist/core/checkpoint.d.ts.map +1 -0
  48. package/dist/core/checkpoint.js +32 -0
  49. package/dist/core/checkpoint.js.map +1 -0
  50. package/dist/core/judge.d.ts +11 -0
  51. package/dist/core/judge.d.ts.map +1 -0
  52. package/dist/core/judge.js +91 -0
  53. package/dist/core/judge.js.map +1 -0
  54. package/dist/core/learnings.d.ts +4 -0
  55. package/dist/core/learnings.d.ts.map +1 -0
  56. package/dist/core/learnings.js +33 -0
  57. package/dist/core/learnings.js.map +1 -0
  58. package/dist/core/orchestrator.d.ts +64 -0
  59. package/dist/core/orchestrator.d.ts.map +1 -0
  60. package/dist/core/orchestrator.js +499 -0
  61. package/dist/core/orchestrator.js.map +1 -0
  62. package/dist/core/plan.d.ts +7 -0
  63. package/dist/core/plan.d.ts.map +1 -0
  64. package/dist/core/plan.js +15 -0
  65. package/dist/core/plan.js.map +1 -0
  66. package/dist/core/readiness-policy.d.ts +11 -0
  67. package/dist/core/readiness-policy.d.ts.map +1 -0
  68. package/dist/core/readiness-policy.js +24 -0
  69. package/dist/core/readiness-policy.js.map +1 -0
  70. package/dist/core/scheduling-policy.d.ts +9 -0
  71. package/dist/core/scheduling-policy.d.ts.map +1 -0
  72. package/dist/core/scheduling-policy.js +56 -0
  73. package/dist/core/scheduling-policy.js.map +1 -0
  74. package/dist/core/task-backend.d.ts +55 -0
  75. package/dist/core/task-backend.d.ts.map +1 -0
  76. package/dist/core/task-backend.js +76 -0
  77. package/dist/core/task-backend.js.map +1 -0
  78. package/dist/core/task-state.d.ts +26 -0
  79. package/dist/core/task-state.d.ts.map +1 -0
  80. package/dist/core/task-state.js +182 -0
  81. package/dist/core/task-state.js.map +1 -0
  82. package/dist/core/wiring.d.ts +12 -0
  83. package/dist/core/wiring.d.ts.map +1 -0
  84. package/dist/core/wiring.js +131 -0
  85. package/dist/core/wiring.js.map +1 -0
  86. package/dist/git/conflict.d.ts +6 -0
  87. package/dist/git/conflict.d.ts.map +1 -0
  88. package/dist/git/conflict.js +25 -0
  89. package/dist/git/conflict.js.map +1 -0
  90. package/dist/git/repo.d.ts +13 -0
  91. package/dist/git/repo.d.ts.map +1 -0
  92. package/dist/git/repo.js +74 -0
  93. package/dist/git/repo.js.map +1 -0
  94. package/dist/git/same-branch.d.ts +9 -0
  95. package/dist/git/same-branch.d.ts.map +1 -0
  96. package/dist/git/same-branch.js +55 -0
  97. package/dist/git/same-branch.js.map +1 -0
  98. package/dist/git/worktree.d.ts +14 -0
  99. package/dist/git/worktree.d.ts.map +1 -0
  100. package/dist/git/worktree.js +78 -0
  101. package/dist/git/worktree.js.map +1 -0
  102. package/dist/index.d.ts +6 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +47 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/integrations/linear/backend.d.ts +38 -0
  107. package/dist/integrations/linear/backend.d.ts.map +1 -0
  108. package/dist/integrations/linear/backend.js +374 -0
  109. package/dist/integrations/linear/backend.js.map +1 -0
  110. package/dist/integrations/linear/client.d.ts +19 -0
  111. package/dist/integrations/linear/client.d.ts.map +1 -0
  112. package/dist/integrations/linear/client.js +86 -0
  113. package/dist/integrations/linear/client.js.map +1 -0
  114. package/dist/integrations/linear/comment-templates.d.ts +14 -0
  115. package/dist/integrations/linear/comment-templates.d.ts.map +1 -0
  116. package/dist/integrations/linear/comment-templates.js +50 -0
  117. package/dist/integrations/linear/comment-templates.js.map +1 -0
  118. package/dist/integrations/linear/contract.d.ts +15 -0
  119. package/dist/integrations/linear/contract.d.ts.map +1 -0
  120. package/dist/integrations/linear/contract.js +86 -0
  121. package/dist/integrations/linear/contract.js.map +1 -0
  122. package/dist/integrations/linear/types.d.ts +39 -0
  123. package/dist/integrations/linear/types.d.ts.map +1 -0
  124. package/dist/integrations/linear/types.js +2 -0
  125. package/dist/integrations/linear/types.js.map +1 -0
  126. package/dist/swarm/pool.d.ts +33 -0
  127. package/dist/swarm/pool.d.ts.map +1 -0
  128. package/dist/swarm/pool.js +182 -0
  129. package/dist/swarm/pool.js.map +1 -0
  130. package/dist/swarm/scheduler.d.ts +38 -0
  131. package/dist/swarm/scheduler.d.ts.map +1 -0
  132. package/dist/swarm/scheduler.js +191 -0
  133. package/dist/swarm/scheduler.js.map +1 -0
  134. package/dist/swarm/worker.d.ts +49 -0
  135. package/dist/swarm/worker.d.ts.map +1 -0
  136. package/dist/swarm/worker.js +180 -0
  137. package/dist/swarm/worker.js.map +1 -0
  138. package/dist/tools/bash-tool.d.ts +24 -0
  139. package/dist/tools/bash-tool.d.ts.map +1 -0
  140. package/dist/tools/bash-tool.js +177 -0
  141. package/dist/tools/bash-tool.js.map +1 -0
  142. package/dist/tools/file-tools.d.ts +3 -0
  143. package/dist/tools/file-tools.d.ts.map +1 -0
  144. package/dist/tools/file-tools.js +68 -0
  145. package/dist/tools/file-tools.js.map +1 -0
  146. package/dist/tools/git-tools.d.ts +3 -0
  147. package/dist/tools/git-tools.d.ts.map +1 -0
  148. package/dist/tools/git-tools.js +44 -0
  149. package/dist/tools/git-tools.js.map +1 -0
  150. package/dist/tools/learnings-tool.d.ts +3 -0
  151. package/dist/tools/learnings-tool.d.ts.map +1 -0
  152. package/dist/tools/learnings-tool.js +48 -0
  153. package/dist/tools/learnings-tool.js.map +1 -0
  154. package/dist/tools/plan-tool.d.ts +3 -0
  155. package/dist/tools/plan-tool.d.ts.map +1 -0
  156. package/dist/tools/plan-tool.js +24 -0
  157. package/dist/tools/plan-tool.js.map +1 -0
  158. package/dist/tools/task-tools.d.ts +3 -0
  159. package/dist/tools/task-tools.d.ts.map +1 -0
  160. package/dist/tools/task-tools.js +108 -0
  161. package/dist/tools/task-tools.js.map +1 -0
  162. package/dist/tools/test-tool.d.ts +3 -0
  163. package/dist/tools/test-tool.d.ts.map +1 -0
  164. package/dist/tools/test-tool.js +43 -0
  165. package/dist/tools/test-tool.js.map +1 -0
  166. package/package.json +47 -0
@@ -0,0 +1,374 @@
1
+ import { LinearClient } from "./client.js";
2
+ import { formatNeedsDecisionComment } from "./comment-templates.js";
3
+ import { validateAgentContract } from "./contract.js";
4
+ const LIST_ISSUES_QUERY = `
5
+ query ListIssues($first: Int!, $after: String) {
6
+ issues(first: $first, after: $after) {
7
+ nodes {
8
+ id
9
+ identifier
10
+ title
11
+ description
12
+ priority
13
+ createdAt
14
+ updatedAt
15
+ state {
16
+ id
17
+ name
18
+ type
19
+ }
20
+ labels {
21
+ nodes {
22
+ id
23
+ name
24
+ }
25
+ }
26
+ cycle {
27
+ id
28
+ name
29
+ }
30
+ }
31
+ pageInfo {
32
+ hasNextPage
33
+ endCursor
34
+ }
35
+ }
36
+ }
37
+ `;
38
+ const ISSUE_BY_IDENTIFIER_QUERY = `
39
+ query IssueByIdentifier($identifier: String!) {
40
+ issue(identifier: $identifier) {
41
+ id
42
+ identifier
43
+ title
44
+ description
45
+ priority
46
+ createdAt
47
+ updatedAt
48
+ state {
49
+ id
50
+ name
51
+ type
52
+ }
53
+ labels {
54
+ nodes {
55
+ id
56
+ name
57
+ }
58
+ }
59
+ cycle {
60
+ id
61
+ name
62
+ }
63
+ }
64
+ }
65
+ `;
66
+ const WORKFLOW_STATES_QUERY = `
67
+ query WorkflowStates($first: Int!) {
68
+ workflowStates(first: $first) {
69
+ nodes {
70
+ id
71
+ name
72
+ }
73
+ }
74
+ }
75
+ `;
76
+ const ISSUE_LABELS_QUERY = `
77
+ query IssueLabels($first: Int!) {
78
+ issueLabels(first: $first) {
79
+ nodes {
80
+ id
81
+ name
82
+ }
83
+ }
84
+ }
85
+ `;
86
+ const ISSUE_UPDATE_MUTATION = `
87
+ mutation UpdateIssueState($id: String!, $stateId: String!) {
88
+ issueUpdate(id: $id, input: { stateId: $stateId }) {
89
+ success
90
+ }
91
+ }
92
+ `;
93
+ const COMMENT_CREATE_MUTATION = `
94
+ mutation CreateComment($issueId: String!, $body: String!) {
95
+ commentCreate(input: { issueId: $issueId, body: $body }) {
96
+ success
97
+ }
98
+ }
99
+ `;
100
+ const ISSUE_LABEL_CREATE_MUTATION = `
101
+ mutation AddIssueLabel($issueId: String!, $labelId: String!) {
102
+ issueLabelCreate(input: { issueId: $issueId, labelId: $labelId }) {
103
+ success
104
+ }
105
+ }
106
+ `;
107
+ export class LinearTaskBackend {
108
+ client;
109
+ config;
110
+ mode = "linear";
111
+ activeCycle = 0;
112
+ currentTaskId;
113
+ lastSyncedAt;
114
+ reconciliationSummary;
115
+ issueIdByIdentifier = new Map();
116
+ stateIdByName = new Map();
117
+ labelIdByName = new Map();
118
+ constructor(client, config) {
119
+ this.client = client;
120
+ this.config = config;
121
+ }
122
+ async initializeCycle(cycle) {
123
+ this.activeCycle = cycle;
124
+ }
125
+ async getReadyTasks(_role) {
126
+ const issues = await this.listIssues();
127
+ const ready = issues.filter((issue) => {
128
+ if (issue.state.name !== this.config.readyStateName)
129
+ return false;
130
+ if (this.config.cycleName && issue.cycle?.name !== this.config.cycleName)
131
+ return false;
132
+ return true;
133
+ });
134
+ this.lastSyncedAt = new Date().toISOString();
135
+ this.reconciliationSummary = `ready=${ready.length}; total=${issues.length}`;
136
+ for (const issue of ready) {
137
+ this.issueIdByIdentifier.set(issue.identifier, issue.id);
138
+ }
139
+ return ready.map((issue) => ({
140
+ id: issue.identifier,
141
+ title: issue.title,
142
+ status: "pending",
143
+ dependencies: [],
144
+ attempts: 0,
145
+ cycle: this.activeCycle,
146
+ rejectionHistory: [],
147
+ subtasks: [],
148
+ priority: issue.priority,
149
+ createdAt: issue.createdAt,
150
+ labels: issue.labels.map((label) => label.name),
151
+ description: issue.description,
152
+ externalId: issue.id,
153
+ externalIdentifier: issue.identifier,
154
+ }));
155
+ }
156
+ async reconcileState() {
157
+ const issues = await this.listIssues();
158
+ const counts = {
159
+ ready: 0,
160
+ inProgress: 0,
161
+ inReview: 0,
162
+ done: 0,
163
+ blocked: 0,
164
+ other: 0,
165
+ };
166
+ for (const issue of issues) {
167
+ const stateName = issue.state.name;
168
+ if (stateName === this.config.readyStateName)
169
+ counts.ready += 1;
170
+ else if (stateName === this.config.inProgressStateName)
171
+ counts.inProgress += 1;
172
+ else if (stateName === this.config.inReviewStateName)
173
+ counts.inReview += 1;
174
+ else if (stateName === this.config.doneStateName)
175
+ counts.done += 1;
176
+ else if (stateName === this.config.blockedStateName)
177
+ counts.blocked += 1;
178
+ else
179
+ counts.other += 1;
180
+ }
181
+ this.lastSyncedAt = new Date().toISOString();
182
+ this.reconciliationSummary =
183
+ `ready=${counts.ready}, inProgress=${counts.inProgress}, inReview=${counts.inReview}, done=${counts.done}, blocked=${counts.blocked}, other=${counts.other}`;
184
+ return this.reconciliationSummary;
185
+ }
186
+ async validateDefinitionOfReady(task) {
187
+ const validation = validateAgentContract(task.description ?? "");
188
+ return {
189
+ ok: validation.valid,
190
+ reasons: validation.reasons,
191
+ };
192
+ }
193
+ async markInProgress(taskId) {
194
+ this.currentTaskId = taskId;
195
+ await this.transitionIssue(taskId, this.config.inProgressStateName);
196
+ }
197
+ async markInReview(taskId, worklog) {
198
+ await this.transitionIssue(taskId, this.config.inReviewStateName);
199
+ if (worklog.trim()) {
200
+ await this.commentOnIssue(taskId, worklog);
201
+ }
202
+ }
203
+ async markDone(taskId, verificationLog) {
204
+ await this.transitionIssue(taskId, this.config.doneStateName);
205
+ if (this.currentTaskId === taskId) {
206
+ this.currentTaskId = undefined;
207
+ }
208
+ if (verificationLog.trim()) {
209
+ await this.commentOnIssue(taskId, verificationLog);
210
+ }
211
+ }
212
+ async markFailed(taskId, reason) {
213
+ await this.transitionIssue(taskId, this.config.blockedStateName);
214
+ if (this.currentTaskId === taskId) {
215
+ this.currentTaskId = undefined;
216
+ }
217
+ await this.commentOnIssue(taskId, `Autonomous execution failed:\n\n- ${reason}`);
218
+ }
219
+ async markNeedsDecision(taskId, optionsComment) {
220
+ await this.transitionIssue(taskId, this.config.blockedStateName);
221
+ if (this.currentTaskId === taskId) {
222
+ this.currentTaskId = undefined;
223
+ }
224
+ await this.ensureLabel(taskId, this.config.needsDecisionLabel);
225
+ await this.commentOnIssue(taskId, formatNeedsDecisionComment([optionsComment]));
226
+ }
227
+ async snapshotForJudge() {
228
+ const issues = await this.listIssues();
229
+ const lines = [];
230
+ lines.push("# Tasks");
231
+ lines.push("");
232
+ lines.push("<!-- plan-hash: linear -->");
233
+ lines.push(`<!-- updated: ${new Date().toISOString()} -->`);
234
+ lines.push(`<!-- cycle: ${this.activeCycle} -->`);
235
+ for (const issue of issues) {
236
+ lines.push("");
237
+ lines.push(`## ${issue.identifier}: ${issue.title} [${toTaskStatus(issue.state.name, this.config)}]`);
238
+ lines.push("- **Dependencies**: none");
239
+ lines.push("- **Attempts**: 0");
240
+ lines.push(`- **Cycle**: ${this.activeCycle}`);
241
+ }
242
+ lines.push("");
243
+ return lines.join("\n");
244
+ }
245
+ async getCheckpointContext() {
246
+ return {
247
+ currentTaskId: this.currentTaskId,
248
+ lastSyncedAt: this.lastSyncedAt,
249
+ reconciliationSummary: this.reconciliationSummary,
250
+ };
251
+ }
252
+ async applyCheckpointContext(context) {
253
+ this.currentTaskId = context?.currentTaskId;
254
+ this.lastSyncedAt = context?.lastSyncedAt;
255
+ this.reconciliationSummary = context?.reconciliationSummary;
256
+ }
257
+ async listIssues() {
258
+ const nodes = await this.client.paginate(LIST_ISSUES_QUERY, (data) => data.issues);
259
+ const allIssues = [];
260
+ for (const node of nodes) {
261
+ if (!node.state)
262
+ continue;
263
+ allIssues.push({
264
+ id: node.id,
265
+ identifier: node.identifier,
266
+ title: node.title,
267
+ description: node.description ?? "",
268
+ priority: node.priority,
269
+ createdAt: node.createdAt,
270
+ updatedAt: node.updatedAt,
271
+ state: {
272
+ id: node.state.id,
273
+ name: node.state.name,
274
+ type: node.state.type ?? undefined,
275
+ },
276
+ labels: (node.labels?.nodes ?? []).map((label) => ({ id: label.id, name: label.name })),
277
+ cycle: node.cycle
278
+ ? {
279
+ id: node.cycle.id,
280
+ name: node.cycle.name,
281
+ }
282
+ : undefined,
283
+ });
284
+ }
285
+ return allIssues;
286
+ }
287
+ async transitionIssue(taskId, stateName) {
288
+ const issueId = await this.resolveIssueId(taskId);
289
+ const stateId = await this.resolveStateId(stateName);
290
+ await this.client.request(ISSUE_UPDATE_MUTATION, {
291
+ id: issueId,
292
+ stateId,
293
+ });
294
+ }
295
+ async commentOnIssue(taskId, body) {
296
+ const issueId = await this.resolveIssueId(taskId);
297
+ await this.client.request(COMMENT_CREATE_MUTATION, {
298
+ issueId,
299
+ body,
300
+ });
301
+ }
302
+ async ensureLabel(taskId, labelName) {
303
+ const issueId = await this.resolveIssueId(taskId);
304
+ const labelId = await this.resolveLabelId(labelName);
305
+ try {
306
+ await this.client.request(ISSUE_LABEL_CREATE_MUTATION, {
307
+ issueId,
308
+ labelId,
309
+ });
310
+ }
311
+ catch (error) {
312
+ const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
313
+ if (message.includes("already exists") || message.includes("duplicate")) {
314
+ return;
315
+ }
316
+ throw error;
317
+ }
318
+ }
319
+ async resolveIssueId(taskId) {
320
+ const cached = this.issueIdByIdentifier.get(taskId);
321
+ if (cached)
322
+ return cached;
323
+ const data = await this.client.request(ISSUE_BY_IDENTIFIER_QUERY, {
324
+ identifier: taskId,
325
+ });
326
+ if (!data.issue) {
327
+ throw new Error(`Linear issue not found for identifier ${taskId}`);
328
+ }
329
+ this.issueIdByIdentifier.set(taskId, data.issue.id);
330
+ return data.issue.id;
331
+ }
332
+ async resolveStateId(stateName) {
333
+ const cached = this.stateIdByName.get(stateName);
334
+ if (cached)
335
+ return cached;
336
+ const data = await this.client.request(WORKFLOW_STATES_QUERY, {
337
+ first: 200,
338
+ });
339
+ const state = data.workflowStates.nodes.find((node) => node.name === stateName);
340
+ if (!state) {
341
+ throw new Error(`Linear workflow state not found: ${stateName}`);
342
+ }
343
+ this.stateIdByName.set(stateName, state.id);
344
+ return state.id;
345
+ }
346
+ async resolveLabelId(labelName) {
347
+ const cached = this.labelIdByName.get(labelName);
348
+ if (cached)
349
+ return cached;
350
+ const data = await this.client.request(ISSUE_LABELS_QUERY, { first: 200 });
351
+ const label = data.issueLabels.nodes.find((node) => node.name === labelName);
352
+ if (!label) {
353
+ throw new Error(`Linear issue label not found: ${labelName}`);
354
+ }
355
+ this.labelIdByName.set(labelName, label.id);
356
+ return label.id;
357
+ }
358
+ }
359
+ function toTaskStatus(stateName, config) {
360
+ if (stateName === config.doneStateName)
361
+ return "done";
362
+ if (stateName === config.inReviewStateName)
363
+ return "in-review";
364
+ if (stateName === config.inProgressStateName)
365
+ return "in-progress";
366
+ if (stateName === config.blockedStateName)
367
+ return "rejected";
368
+ return "pending";
369
+ }
370
+ export function createLinearTaskBackend(config) {
371
+ const client = new LinearClient(config);
372
+ return new LinearTaskBackend(client, config);
373
+ }
374
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../src/integrations/linear/backend.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAyDtD,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCzB,CAAC;AAEF,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BjC,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;CAS7B,CAAC;AAEF,MAAM,kBAAkB,GAAG;;;;;;;;;CAS1B,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;CAM7B,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;CAM/B,CAAC;AAEF,MAAM,2BAA2B,GAAG;;;;;;CAMnC,CAAC;AAEF,MAAM,OAAO,iBAAiB;IAYX;IACA;IAZT,IAAI,GAAG,QAAiB,CAAC;IAE1B,WAAW,GAAG,CAAC,CAAC;IAChB,aAAa,CAAqB;IAClC,YAAY,CAAqB;IACjC,qBAAqB,CAAqB;IACjC,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3D,YACkB,MAAoB,EACpB,MAAoB;QADpB,WAAM,GAAN,MAAM,CAAc;QACpB,WAAM,GAAN,MAAM,CAAc;IACnC,CAAC;IAEJ,KAAK,CAAC,eAAe,CAAC,KAAa;QAClC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAgB;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,cAAc;gBAAE,OAAO,KAAK,CAAC;YAClE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YACvF,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,qBAAqB,GAAG,SAAS,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC;QAE7E,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,EAAE,EAAE,KAAK,CAAC,UAAU;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,gBAAgB,EAAE,EAAE;YACpB,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/C,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,UAAU,EAAE,KAAK,CAAC,EAAE;YACpB,kBAAkB,EAAE,KAAK,CAAC,UAAU;SACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG;YACd,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;SACR,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,cAAc;gBAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;iBAC3D,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,mBAAmB;gBAAE,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;iBAC1E,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,iBAAiB;gBAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;iBACtE,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa;gBAAE,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;iBAC9D,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,gBAAgB;gBAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;;gBACpE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,qBAAqB;YACzB,SAAS,MAAM,CAAC,KAAK,gBAAgB,MAAM,CAAC,UAAU,cAAc,MAAM,CAAC,QAAQ,UAAU,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC;QAE9J,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,IAAiB;QAChD,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO;YACN,EAAE,EAAE,UAAU,CAAC,KAAK;YACpB,OAAO,EAAE,UAAU,CAAC,OAAO;SAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QAClC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,OAAe;QACjD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAClE,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,eAAuB;QACrD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,MAAc;QAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,qCAAqC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,cAAsB;QAC7D,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,gBAAgB;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,MAAM,CAAC,CAAC;QAElD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtG,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,oBAAoB;QACzB,OAAO;YACN,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;SACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAAkC;QAC9D,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;QAC1C,IAAI,CAAC,qBAAqB,GAAG,OAAO,EAAE,qBAAqB,CAAC;IAC7D,CAAC;IAEO,KAAK,CAAC,UAAU;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CACvC,iBAAiB,EACjB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CACrB,CAAC;QAEF,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAC1B,SAAS,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;gBACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,KAAK,EAAE;oBACN,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;oBACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;oBACrB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS;iBAClC;gBACD,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvF,KAAK,EAAE,IAAI,CAAC,KAAK;oBAChB,CAAC,CAAC;wBACA,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;wBACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;qBACrB;oBACF,CAAC,CAAC,SAAS;aACZ,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,SAAiB;QAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAuD,qBAAqB,EAAE;YACtG,EAAE,EAAE,OAAO;YACX,OAAO;SACP,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,IAAY;QACxD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAyD,uBAAuB,EAAE;YAC1G,OAAO;YACP,IAAI;SACJ,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,SAAiB;QAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,2BAA2B,EAC3B;gBACC,OAAO;gBACP,OAAO;aACP,CACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACnG,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzE,OAAO;YACR,CAAC;YACD,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,MAAc;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA+C,yBAAyB,EAAE;YAC/G,UAAU,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,SAAiB;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA6C,qBAAqB,EAAE;YACzG,KAAK,EAAE,GAAG;SACV,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAChF,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,EAAE,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,SAAiB;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0C,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpH,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,EAAE,CAAC;IACjB,CAAC;CACD;AAED,SAAS,YAAY,CACpB,SAAiB,EACjB,MAAoB;IAEpB,IAAI,SAAS,KAAK,MAAM,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC;IACtD,IAAI,SAAS,KAAK,MAAM,CAAC,iBAAiB;QAAE,OAAO,WAAW,CAAC;IAC/D,IAAI,SAAS,KAAK,MAAM,CAAC,mBAAmB;QAAE,OAAO,aAAa,CAAC;IACnE,IAAI,SAAS,KAAK,MAAM,CAAC,gBAAgB;QAAE,OAAO,UAAU,CAAC;IAC7D,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC3D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { LinearConfig } from "../../config/types.js";
2
+ export interface PaginationResult<TNode> {
3
+ nodes: TNode[];
4
+ pageInfo: {
5
+ hasNextPage: boolean;
6
+ endCursor?: string | null;
7
+ };
8
+ }
9
+ export declare class LinearClient {
10
+ private readonly apiUrl;
11
+ private readonly tokenEnvVar;
12
+ private readonly maxRetries;
13
+ constructor(config: LinearConfig, maxRetries?: number);
14
+ request<TData, TVariables extends Record<string, unknown> = Record<string, unknown>>(query: string, variables?: TVariables): Promise<TData>;
15
+ paginate<TData, TNode>(query: string, getPage: (data: TData) => PaginationResult<TNode>, initialVariables?: Record<string, unknown>): Promise<TNode[]>;
16
+ private buildHeaders;
17
+ private backoffDelay;
18
+ }
19
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/integrations/linear/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAW1D,MAAM,WAAW,gBAAgB,CAAC,KAAK;IACtC,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,QAAQ,EAAE;QACT,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;CACF;AAED,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,YAAY,EAAE,UAAU,SAAI;IAM1C,OAAO,CAAC,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxF,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,UAAU,GACpB,OAAO,CAAC,KAAK,CAAC;IA0CX,QAAQ,CAAC,KAAK,EAAE,KAAK,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,gBAAgB,CAAC,KAAK,CAAC,EACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,OAAO,CAAC,KAAK,EAAE,CAAC;IAoBnB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,YAAY;CAMpB"}
@@ -0,0 +1,86 @@
1
+ export class LinearClient {
2
+ apiUrl;
3
+ tokenEnvVar;
4
+ maxRetries;
5
+ constructor(config, maxRetries = 3) {
6
+ this.apiUrl = config.apiUrl;
7
+ this.tokenEnvVar = config.tokenEnvVar;
8
+ this.maxRetries = maxRetries;
9
+ }
10
+ async request(query, variables) {
11
+ const payload = {
12
+ query,
13
+ variables: variables ?? {},
14
+ };
15
+ let attempt = 0;
16
+ while (attempt <= this.maxRetries) {
17
+ try {
18
+ const response = await fetch(this.apiUrl, {
19
+ method: "POST",
20
+ headers: this.buildHeaders(),
21
+ body: JSON.stringify(payload),
22
+ });
23
+ if (!response.ok) {
24
+ throw new Error(`Linear API returned HTTP ${response.status}`);
25
+ }
26
+ const json = (await response.json());
27
+ if (json.errors && json.errors.length > 0) {
28
+ throw new Error(json.errors.map((error) => error.message).join("; "));
29
+ }
30
+ if (!json.data) {
31
+ throw new Error("Linear API returned no data");
32
+ }
33
+ return json.data;
34
+ }
35
+ catch (error) {
36
+ const isLastAttempt = attempt >= this.maxRetries;
37
+ if (isLastAttempt) {
38
+ throw error;
39
+ }
40
+ const delayMs = this.backoffDelay(attempt);
41
+ await sleep(delayMs);
42
+ attempt += 1;
43
+ }
44
+ }
45
+ throw new Error("Linear request failed unexpectedly");
46
+ }
47
+ async paginate(query, getPage, initialVariables) {
48
+ const nodes = [];
49
+ let hasNextPage = true;
50
+ let after;
51
+ while (hasNextPage) {
52
+ const data = await this.request(query, {
53
+ first: 50,
54
+ ...(initialVariables ?? {}),
55
+ after,
56
+ });
57
+ const page = getPage(data);
58
+ nodes.push(...page.nodes);
59
+ hasNextPage = page.pageInfo.hasNextPage;
60
+ after = page.pageInfo.endCursor ?? undefined;
61
+ }
62
+ return nodes;
63
+ }
64
+ buildHeaders() {
65
+ const token = process.env[this.tokenEnvVar];
66
+ if (!token) {
67
+ throw new Error(`Missing Linear token in environment variable ${this.tokenEnvVar}`);
68
+ }
69
+ return {
70
+ "Content-Type": "application/json",
71
+ Authorization: token.startsWith("Bearer ") ? token : `Bearer ${token}`,
72
+ };
73
+ }
74
+ backoffDelay(attempt) {
75
+ const base = 200;
76
+ const exponential = base * 2 ** attempt;
77
+ const jitter = Math.floor(Math.random() * 100);
78
+ return exponential + jitter;
79
+ }
80
+ }
81
+ function sleep(ms) {
82
+ return new Promise((resolve) => {
83
+ setTimeout(resolve, ms);
84
+ });
85
+ }
86
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/integrations/linear/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface BuilderWorklogInput {
2
+ summary: string;
3
+ filesChanged: string[];
4
+ commandsRun: string[];
5
+ }
6
+ export interface VerifierWorklogInput {
7
+ passed: boolean;
8
+ checks: string[];
9
+ notes?: string;
10
+ }
11
+ export declare function formatBuilderWorklog(input: BuilderWorklogInput): string;
12
+ export declare function formatVerifierWorklog(input: VerifierWorklogInput): string;
13
+ export declare function formatNeedsDecisionComment(reasons: string[]): string;
14
+ //# sourceMappingURL=comment-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-templates.d.ts","sourceRoot":"","sources":["../../../src/integrations/linear/comment-templates.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAqBvE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAezE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAapE"}
@@ -0,0 +1,50 @@
1
+ export function formatBuilderWorklog(input) {
2
+ const lines = [];
3
+ lines.push("### Autonomous Builder Update");
4
+ lines.push("");
5
+ lines.push(`- Summary: ${input.summary}`);
6
+ if (input.filesChanged.length > 0) {
7
+ lines.push("- Files changed:");
8
+ for (const file of input.filesChanged) {
9
+ lines.push(` - \`${file}\``);
10
+ }
11
+ }
12
+ if (input.commandsRun.length > 0) {
13
+ lines.push("- Commands run:");
14
+ for (const command of input.commandsRun) {
15
+ lines.push(` - \`${command}\``);
16
+ }
17
+ }
18
+ return lines.join("\n");
19
+ }
20
+ export function formatVerifierWorklog(input) {
21
+ const lines = [];
22
+ lines.push("### Autonomous Verifier Result");
23
+ lines.push("");
24
+ lines.push(`- Result: ${input.passed ? "PASS" : "FAIL"}`);
25
+ if (input.checks.length > 0) {
26
+ lines.push("- Checks:");
27
+ for (const check of input.checks) {
28
+ lines.push(` - ${check}`);
29
+ }
30
+ }
31
+ if (input.notes) {
32
+ lines.push(`- Notes: ${input.notes}`);
33
+ }
34
+ return lines.join("\n");
35
+ }
36
+ export function formatNeedsDecisionComment(reasons) {
37
+ const lines = [];
38
+ lines.push("### Needs Decision");
39
+ lines.push("");
40
+ lines.push("The autonomous agent could not continue safely and needs human input.");
41
+ lines.push("");
42
+ lines.push("Reasons:");
43
+ for (const reason of reasons) {
44
+ lines.push(`- ${reason}`);
45
+ }
46
+ lines.push("");
47
+ lines.push("Please choose an option and move this issue back to Ready when unblocked.");
48
+ return lines.join("\n");
49
+ }
50
+ //# sourceMappingURL=comment-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-templates.js","sourceRoot":"","sources":["../../../src/integrations/linear/comment-templates.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,oBAAoB,CAAC,KAA0B;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAA2B;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAiB;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IACxF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface AgentContract {
2
+ goal: string;
3
+ acceptanceCriteria: string[];
4
+ constraints: string[];
5
+ testPlan: string[];
6
+ stopConditions: string[];
7
+ }
8
+ export interface ContractValidationResult {
9
+ valid: boolean;
10
+ reasons: string[];
11
+ contract: AgentContract;
12
+ }
13
+ export declare function parseAgentContract(description: string): AgentContract;
14
+ export declare function validateAgentContract(description: string): ContractValidationResult;
15
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/integrations/linear/contract.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;CACxB;AAMD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAWrE;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAgCnF"}