@supaku/agentfactory-linear 0.7.19 → 0.7.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/agent-client.d.ts +7 -0
- package/dist/src/agent-client.d.ts.map +1 -1
- package/dist/src/agent-client.js +181 -85
- package/dist/src/circuit-breaker.d.ts +2 -1
- package/dist/src/circuit-breaker.d.ts.map +1 -1
- package/dist/src/circuit-breaker.js +2 -4
- package/dist/src/circuit-breaker.test.js +5 -5
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -141,6 +141,8 @@ export declare class LinearAgentClient {
|
|
|
141
141
|
/**
|
|
142
142
|
* Get all relations for an issue (both outgoing and incoming)
|
|
143
143
|
*
|
|
144
|
+
* Uses a single raw GraphQL query instead of N+1 lazy-loaded SDK calls.
|
|
145
|
+
*
|
|
144
146
|
* @param issueId - The issue ID or identifier (e.g., "SUP-123")
|
|
145
147
|
* @returns Relations result with both directions of relationships
|
|
146
148
|
*/
|
|
@@ -199,6 +201,7 @@ export declare class LinearAgentClient {
|
|
|
199
201
|
/**
|
|
200
202
|
* Get lightweight sub-issue statuses (no blocking relations)
|
|
201
203
|
*
|
|
204
|
+
* Uses a single raw GraphQL query instead of N+1 lazy-loaded SDK calls.
|
|
202
205
|
* Returns identifier, title, and status for each sub-issue.
|
|
203
206
|
* Used by QA and acceptance agents to validate sub-issue completion
|
|
204
207
|
* without the overhead of fetching the full dependency graph.
|
|
@@ -221,6 +224,10 @@ export declare class LinearAgentClient {
|
|
|
221
224
|
/**
|
|
222
225
|
* Get sub-issues with their blocking relations for dependency graph building
|
|
223
226
|
*
|
|
227
|
+
* Uses a single raw GraphQL query instead of N+1 lazy-loaded SDK calls.
|
|
228
|
+
* Previous implementation made 2 + 4N + M API calls (where N = children,
|
|
229
|
+
* M = total relations). This version makes exactly 1 API call.
|
|
230
|
+
*
|
|
224
231
|
* Builds a complete dependency graph of a parent issue's children, including
|
|
225
232
|
* which sub-issues block which other sub-issues. This is used by the coordinator
|
|
226
233
|
* agent to determine execution order.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../../src/agent-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGb,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EAEb,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,8BAA8B,EAC9B,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EAExB,oBAAoB,EACpB,iBAAiB,EAEjB,aAAa,EACb,cAAc,EAGf,MAAM,YAAY,CAAA;AAMnB;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,WAAW,CAAwC;gBAE/C,MAAM,EAAE,uBAAuB;IAa3C;;OAEG;IACH,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED;;;;;;;;;;OAUG;YACW,SAAS;
|
|
1
|
+
{"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../../src/agent-client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/agent-client.js
CHANGED
|
@@ -66,7 +66,8 @@ export class LinearAgentClient {
|
|
|
66
66
|
if (this.circuitBreaker.isAuthError(error)) {
|
|
67
67
|
const statusCode = extractAuthStatusCode(error);
|
|
68
68
|
await this.circuitBreaker.recordAuthFailure(statusCode);
|
|
69
|
-
|
|
69
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
70
|
+
console.warn(`[LinearAgentClient] Auth error detected (status ${statusCode}), circuit breaker notified: ${msg}`);
|
|
70
71
|
}
|
|
71
72
|
throw error;
|
|
72
73
|
}
|
|
@@ -377,47 +378,79 @@ export class LinearAgentClient {
|
|
|
377
378
|
/**
|
|
378
379
|
* Get all relations for an issue (both outgoing and incoming)
|
|
379
380
|
*
|
|
381
|
+
* Uses a single raw GraphQL query instead of N+1 lazy-loaded SDK calls.
|
|
382
|
+
*
|
|
380
383
|
* @param issueId - The issue ID or identifier (e.g., "SUP-123")
|
|
381
384
|
* @returns Relations result with both directions of relationships
|
|
382
385
|
*/
|
|
383
386
|
async getIssueRelations(issueId) {
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
387
|
+
const canProceed = await this.circuitBreaker.canProceed();
|
|
388
|
+
if (!canProceed) {
|
|
389
|
+
const breaker = this.circuitBreaker;
|
|
390
|
+
if (typeof breaker.createOpenError === 'function') {
|
|
391
|
+
throw breaker.createOpenError();
|
|
388
392
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
393
|
+
throw new LinearApiError('Circuit breaker is open — API calls blocked', 503);
|
|
394
|
+
}
|
|
395
|
+
await this.rateLimiter.acquire();
|
|
396
|
+
const query = `
|
|
397
|
+
query IssueRelations($id: String!) {
|
|
398
|
+
issue(id: $id) {
|
|
399
|
+
id
|
|
400
|
+
identifier
|
|
401
|
+
relations(first: 50) {
|
|
402
|
+
nodes {
|
|
403
|
+
id
|
|
404
|
+
type
|
|
405
|
+
createdAt
|
|
406
|
+
relatedIssue { id identifier }
|
|
403
407
|
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
type: relation.type,
|
|
412
|
-
issueId: sourceIssue?.id ?? '',
|
|
413
|
-
issueIdentifier: sourceIssue?.identifier,
|
|
414
|
-
relatedIssueId: issue.id,
|
|
415
|
-
relatedIssueIdentifier: issue.identifier,
|
|
416
|
-
createdAt: relation.createdAt,
|
|
417
|
-
});
|
|
408
|
+
}
|
|
409
|
+
inverseRelations(first: 50) {
|
|
410
|
+
nodes {
|
|
411
|
+
id
|
|
412
|
+
type
|
|
413
|
+
createdAt
|
|
414
|
+
issue { id identifier }
|
|
418
415
|
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
`;
|
|
420
|
+
try {
|
|
421
|
+
const result = await this.client.client.rawRequest(query, { id: issueId });
|
|
422
|
+
await this.circuitBreaker.recordSuccess();
|
|
423
|
+
const data = result.data;
|
|
424
|
+
if (!data.issue) {
|
|
425
|
+
throw new LinearApiError(`Issue not found: ${issueId}`, 404);
|
|
426
|
+
}
|
|
427
|
+
const relations = data.issue.relations.nodes.map((rel) => ({
|
|
428
|
+
id: rel.id,
|
|
429
|
+
type: rel.type,
|
|
430
|
+
issueId: data.issue.id,
|
|
431
|
+
issueIdentifier: data.issue.identifier,
|
|
432
|
+
relatedIssueId: rel.relatedIssue?.id ?? '',
|
|
433
|
+
relatedIssueIdentifier: rel.relatedIssue?.identifier,
|
|
434
|
+
createdAt: new Date(rel.createdAt),
|
|
435
|
+
}));
|
|
436
|
+
const inverseRelations = data.issue.inverseRelations.nodes.map((rel) => ({
|
|
437
|
+
id: rel.id,
|
|
438
|
+
type: rel.type,
|
|
439
|
+
issueId: rel.issue?.id ?? '',
|
|
440
|
+
issueIdentifier: rel.issue?.identifier,
|
|
441
|
+
relatedIssueId: data.issue.id,
|
|
442
|
+
relatedIssueIdentifier: data.issue.identifier,
|
|
443
|
+
createdAt: new Date(rel.createdAt),
|
|
444
|
+
}));
|
|
419
445
|
return { relations, inverseRelations };
|
|
420
|
-
}
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
if (this.circuitBreaker.isAuthError(error)) {
|
|
449
|
+
const statusCode = extractAuthStatusCode(error);
|
|
450
|
+
await this.circuitBreaker.recordAuthFailure(statusCode);
|
|
451
|
+
}
|
|
452
|
+
throw error;
|
|
453
|
+
}
|
|
421
454
|
}
|
|
422
455
|
/**
|
|
423
456
|
* Delete an issue relation
|
|
@@ -558,6 +591,7 @@ export class LinearAgentClient {
|
|
|
558
591
|
/**
|
|
559
592
|
* Get lightweight sub-issue statuses (no blocking relations)
|
|
560
593
|
*
|
|
594
|
+
* Uses a single raw GraphQL query instead of N+1 lazy-loaded SDK calls.
|
|
561
595
|
* Returns identifier, title, and status for each sub-issue.
|
|
562
596
|
* Used by QA and acceptance agents to validate sub-issue completion
|
|
563
597
|
* without the overhead of fetching the full dependency graph.
|
|
@@ -566,23 +600,48 @@ export class LinearAgentClient {
|
|
|
566
600
|
* @returns Array of sub-issue statuses
|
|
567
601
|
*/
|
|
568
602
|
async getSubIssueStatuses(issueIdOrIdentifier) {
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
603
|
+
const canProceed = await this.circuitBreaker.canProceed();
|
|
604
|
+
if (!canProceed) {
|
|
605
|
+
const breaker = this.circuitBreaker;
|
|
606
|
+
if (typeof breaker.createOpenError === 'function') {
|
|
607
|
+
throw breaker.createOpenError();
|
|
608
|
+
}
|
|
609
|
+
throw new LinearApiError('Circuit breaker is open — API calls blocked', 503);
|
|
610
|
+
}
|
|
611
|
+
await this.rateLimiter.acquire();
|
|
612
|
+
const query = `
|
|
613
|
+
query SubIssueStatuses($id: String!) {
|
|
614
|
+
issue(id: $id) {
|
|
615
|
+
children(first: 50) {
|
|
616
|
+
nodes {
|
|
617
|
+
identifier
|
|
618
|
+
title
|
|
619
|
+
state { name }
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
`;
|
|
625
|
+
try {
|
|
626
|
+
const result = await this.client.client.rawRequest(query, { id: issueIdOrIdentifier });
|
|
627
|
+
await this.circuitBreaker.recordSuccess();
|
|
628
|
+
const data = result.data;
|
|
629
|
+
if (!data.issue) {
|
|
572
630
|
throw new LinearApiError(`Issue not found: ${issueIdOrIdentifier}`, 404);
|
|
573
631
|
}
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
632
|
+
return data.issue.children.nodes.map((child) => ({
|
|
633
|
+
identifier: child.identifier,
|
|
634
|
+
title: child.title,
|
|
635
|
+
status: child.state?.name ?? 'Unknown',
|
|
636
|
+
}));
|
|
637
|
+
}
|
|
638
|
+
catch (error) {
|
|
639
|
+
if (this.circuitBreaker.isAuthError(error)) {
|
|
640
|
+
const statusCode = extractAuthStatusCode(error);
|
|
641
|
+
await this.circuitBreaker.recordAuthFailure(statusCode);
|
|
583
642
|
}
|
|
584
|
-
|
|
585
|
-
}
|
|
643
|
+
throw error;
|
|
644
|
+
}
|
|
586
645
|
}
|
|
587
646
|
/**
|
|
588
647
|
* Get the repository URL associated with a project via its links or description
|
|
@@ -617,6 +676,10 @@ export class LinearAgentClient {
|
|
|
617
676
|
/**
|
|
618
677
|
* Get sub-issues with their blocking relations for dependency graph building
|
|
619
678
|
*
|
|
679
|
+
* Uses a single raw GraphQL query instead of N+1 lazy-loaded SDK calls.
|
|
680
|
+
* Previous implementation made 2 + 4N + M API calls (where N = children,
|
|
681
|
+
* M = total relations). This version makes exactly 1 API call.
|
|
682
|
+
*
|
|
620
683
|
* Builds a complete dependency graph of a parent issue's children, including
|
|
621
684
|
* which sub-issues block which other sub-issues. This is used by the coordinator
|
|
622
685
|
* agent to determine execution order.
|
|
@@ -625,66 +688,99 @@ export class LinearAgentClient {
|
|
|
625
688
|
* @returns The sub-issue dependency graph
|
|
626
689
|
*/
|
|
627
690
|
async getSubIssueGraph(issueIdOrIdentifier) {
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
691
|
+
const canProceed = await this.circuitBreaker.canProceed();
|
|
692
|
+
if (!canProceed) {
|
|
693
|
+
const breaker = this.circuitBreaker;
|
|
694
|
+
if (typeof breaker.createOpenError === 'function') {
|
|
695
|
+
throw breaker.createOpenError();
|
|
696
|
+
}
|
|
697
|
+
throw new LinearApiError('Circuit breaker is open — API calls blocked', 503);
|
|
698
|
+
}
|
|
699
|
+
await this.rateLimiter.acquire();
|
|
700
|
+
const query = `
|
|
701
|
+
query SubIssueGraph($id: String!) {
|
|
702
|
+
issue(id: $id) {
|
|
703
|
+
id
|
|
704
|
+
identifier
|
|
705
|
+
children(first: 50) {
|
|
706
|
+
nodes {
|
|
707
|
+
id
|
|
708
|
+
identifier
|
|
709
|
+
title
|
|
710
|
+
description
|
|
711
|
+
priority
|
|
712
|
+
url
|
|
713
|
+
state { name }
|
|
714
|
+
labels(first: 20) { nodes { name } }
|
|
715
|
+
relations(first: 50) {
|
|
716
|
+
nodes {
|
|
717
|
+
type
|
|
718
|
+
relatedIssue { id identifier }
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
inverseRelations(first: 50) {
|
|
722
|
+
nodes {
|
|
723
|
+
type
|
|
724
|
+
issue { id identifier }
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
`;
|
|
732
|
+
try {
|
|
733
|
+
const result = await this.client.client.rawRequest(query, { id: issueIdOrIdentifier });
|
|
734
|
+
await this.circuitBreaker.recordSuccess();
|
|
735
|
+
const data = result.data;
|
|
736
|
+
if (!data.issue) {
|
|
631
737
|
throw new LinearApiError(`Issue not found: ${issueIdOrIdentifier}`, 404);
|
|
632
738
|
}
|
|
633
|
-
const
|
|
634
|
-
const subIssueIds = new Set(children.nodes.map((c) => c.id));
|
|
635
|
-
const
|
|
636
|
-
// Build identifier map for all sub-issues
|
|
637
|
-
for (const child of children.nodes) {
|
|
638
|
-
subIssueIdentifiers.set(child.id, child.identifier);
|
|
639
|
-
}
|
|
640
|
-
const graphNodes = [];
|
|
641
|
-
for (const child of children.nodes) {
|
|
642
|
-
const state = await child.state;
|
|
643
|
-
const labels = await child.labels();
|
|
644
|
-
// Get relations to find blocking dependencies
|
|
645
|
-
const relations = await child.relations();
|
|
646
|
-
const inverseRelations = await child.inverseRelations();
|
|
739
|
+
const parentIssue = data.issue;
|
|
740
|
+
const subIssueIds = new Set(parentIssue.children.nodes.map((c) => c.id));
|
|
741
|
+
const graphNodes = parentIssue.children.nodes.map((child) => {
|
|
647
742
|
const blockedBy = [];
|
|
648
743
|
const blocks = [];
|
|
649
|
-
//
|
|
650
|
-
for (const rel of inverseRelations.nodes) {
|
|
651
|
-
if (rel.type === 'blocks') {
|
|
652
|
-
|
|
653
|
-
if (sourceIssue && subIssueIds.has(sourceIssue.id)) {
|
|
654
|
-
blockedBy.push(sourceIssue.identifier);
|
|
655
|
-
}
|
|
744
|
+
// Inverse relations: other issues blocking this one
|
|
745
|
+
for (const rel of child.inverseRelations.nodes) {
|
|
746
|
+
if (rel.type === 'blocks' && rel.issue && subIssueIds.has(rel.issue.id)) {
|
|
747
|
+
blockedBy.push(rel.issue.identifier);
|
|
656
748
|
}
|
|
657
749
|
}
|
|
658
|
-
//
|
|
659
|
-
for (const rel of relations.nodes) {
|
|
660
|
-
if (rel.type === 'blocks') {
|
|
661
|
-
|
|
662
|
-
if (relatedIssue && subIssueIds.has(relatedIssue.id)) {
|
|
663
|
-
blocks.push(relatedIssue.identifier);
|
|
664
|
-
}
|
|
750
|
+
// Outgoing relations: this issue blocking others
|
|
751
|
+
for (const rel of child.relations.nodes) {
|
|
752
|
+
if (rel.type === 'blocks' && rel.relatedIssue && subIssueIds.has(rel.relatedIssue.id)) {
|
|
753
|
+
blocks.push(rel.relatedIssue.identifier);
|
|
665
754
|
}
|
|
666
755
|
}
|
|
667
|
-
|
|
756
|
+
return {
|
|
668
757
|
issue: {
|
|
669
758
|
id: child.id,
|
|
670
759
|
identifier: child.identifier,
|
|
671
760
|
title: child.title,
|
|
672
761
|
description: child.description ?? undefined,
|
|
673
|
-
status: state?.name,
|
|
762
|
+
status: child.state?.name,
|
|
674
763
|
priority: child.priority,
|
|
675
|
-
labels: labels.nodes.map((l) => l.name),
|
|
764
|
+
labels: child.labels.nodes.map((l) => l.name),
|
|
676
765
|
url: child.url,
|
|
677
766
|
},
|
|
678
767
|
blockedBy,
|
|
679
768
|
blocks,
|
|
680
|
-
}
|
|
681
|
-
}
|
|
769
|
+
};
|
|
770
|
+
});
|
|
682
771
|
return {
|
|
683
772
|
parentId: parentIssue.id,
|
|
684
773
|
parentIdentifier: parentIssue.identifier,
|
|
685
774
|
subIssues: graphNodes,
|
|
686
775
|
};
|
|
687
|
-
}
|
|
776
|
+
}
|
|
777
|
+
catch (error) {
|
|
778
|
+
if (this.circuitBreaker.isAuthError(error)) {
|
|
779
|
+
const statusCode = extractAuthStatusCode(error);
|
|
780
|
+
await this.circuitBreaker.recordAuthFailure(statusCode);
|
|
781
|
+
}
|
|
782
|
+
throw error;
|
|
783
|
+
}
|
|
688
784
|
}
|
|
689
785
|
}
|
|
690
786
|
/**
|
|
@@ -37,8 +37,9 @@ export declare class CircuitBreaker implements CircuitBreakerStrategy {
|
|
|
37
37
|
recordSuccess(): void;
|
|
38
38
|
/**
|
|
39
39
|
* Record an auth failure. May trip the circuit to open.
|
|
40
|
+
* Called after isAuthError() returns true, so the error is already vetted.
|
|
40
41
|
*/
|
|
41
|
-
recordAuthFailure(
|
|
42
|
+
recordAuthFailure(_statusCode?: number): void;
|
|
42
43
|
/**
|
|
43
44
|
* Check if an error is an auth/rate-limit error that should count as a circuit failure.
|
|
44
45
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAE9E,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;AAE1D,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,oBAAoB,CAMzE,CAAA;AAED,qBAAa,cAAe,YAAW,sBAAsB;IAC3D,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,mBAAmB,CAAI;IAC/B,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;gBAE3C,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAKlD,IAAI,KAAK,IAAI,YAAY,CAOxB;IAED;;;OAGG;IACH,UAAU,IAAI,OAAO;IAgBrB;;OAEG;IACH,aAAa,IAAI,IAAI;IASrB
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAE9E,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;AAE1D,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,oBAAoB,CAMzE,CAAA;AAED,qBAAa,cAAe,YAAW,sBAAsB;IAC3D,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,mBAAmB,CAAI;IAC/B,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;gBAE3C,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAKlD,IAAI,KAAK,IAAI,YAAY,CAOxB;IAED;;;OAGG;IACH,UAAU,IAAI,OAAO;IAgBrB;;OAEG;IACH,aAAa,IAAI,IAAI;IASrB;;;OAGG;IACH,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAmB7C;;;;;;;OAOG;IACH,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAyBpC;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAKzC;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,SAAS,IAAI;QACX,KAAK,EAAE,YAAY,CAAA;QACnB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,qBAAqB,EAAE,MAAM,CAAA;QAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAC7B;IASD;;OAEG;IACH,eAAe,IAAI,gBAAgB;IAgBnC,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,0BAA0B;CAGnC"}
|
|
@@ -72,12 +72,10 @@ export class CircuitBreaker {
|
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* Record an auth failure. May trip the circuit to open.
|
|
75
|
+
* Called after isAuthError() returns true, so the error is already vetted.
|
|
75
76
|
*/
|
|
76
|
-
recordAuthFailure(
|
|
77
|
+
recordAuthFailure(_statusCode) {
|
|
77
78
|
this.probeInFlight = false;
|
|
78
|
-
if (!this.config.authErrorCodes.includes(statusCode)) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
79
|
this.consecutiveFailures++;
|
|
82
80
|
if (this._state === 'half-open') {
|
|
83
81
|
// Probe failed — reopen with exponential backoff
|
|
@@ -68,12 +68,12 @@ describe('CircuitBreaker', () => {
|
|
|
68
68
|
cb.recordAuthFailure(401);
|
|
69
69
|
expect(cb.state).toBe('open');
|
|
70
70
|
});
|
|
71
|
-
it('
|
|
71
|
+
it('always counts failures regardless of status code (isAuthError already vetted)', () => {
|
|
72
72
|
const cb = new CircuitBreaker({ failureThreshold: 2 });
|
|
73
|
-
cb.recordAuthFailure(
|
|
74
|
-
cb.
|
|
75
|
-
|
|
76
|
-
expect(cb.
|
|
73
|
+
cb.recordAuthFailure(200); // e.g., GraphQL 200 with auth error in body
|
|
74
|
+
expect(cb.getStatus().consecutiveFailures).toBe(1);
|
|
75
|
+
cb.recordAuthFailure(); // no status code at all
|
|
76
|
+
expect(cb.state).toBe('open');
|
|
77
77
|
});
|
|
78
78
|
it('resets failure count on success', () => {
|
|
79
79
|
const cb = new CircuitBreaker({ failureThreshold: 3 });
|
package/dist/src/types.d.ts
CHANGED
|
@@ -164,7 +164,7 @@ export interface RateLimiterStrategy {
|
|
|
164
164
|
export interface CircuitBreakerStrategy {
|
|
165
165
|
canProceed(): boolean | Promise<boolean>;
|
|
166
166
|
recordSuccess(): void | Promise<void>;
|
|
167
|
-
recordAuthFailure(statusCode
|
|
167
|
+
recordAuthFailure(statusCode?: number): void | Promise<void>;
|
|
168
168
|
isAuthError(error: unknown): boolean;
|
|
169
169
|
reset(): void | Promise<void>;
|
|
170
170
|
}
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@supaku/agentfactory-linear",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.20",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Linear issue tracker integration for AgentFactory — status transitions, agent sessions, work routing",
|
|
6
6
|
"author": "Supaku (https://supaku.com)",
|