@cat-factory/integrations 0.103.3 → 0.105.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.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/documents/GitHubDocsProvider.d.ts +2 -6
- package/dist/modules/documents/GitHubDocsProvider.d.ts.map +1 -1
- package/dist/modules/documents/GitHubDocsProvider.js +2 -2
- package/dist/modules/documents/GitHubDocsProvider.js.map +1 -1
- package/dist/modules/environments/EnvironmentHandlerSeeder.d.ts +3 -7
- package/dist/modules/environments/EnvironmentHandlerSeeder.d.ts.map +1 -1
- package/dist/modules/environments/EnvironmentHandlerSeeder.js +0 -0
- package/dist/modules/environments/EnvironmentHandlerSeeder.js.map +1 -1
- package/dist/modules/environments/EnvironmentUserHandlerService.d.ts +2 -4
- package/dist/modules/environments/EnvironmentUserHandlerService.d.ts.map +1 -1
- package/dist/modules/environments/EnvironmentUserHandlerService.js +1 -1
- package/dist/modules/environments/EnvironmentUserHandlerService.js.map +1 -1
- package/dist/modules/kubernetes/KubernetesRunnerTransport.d.ts.map +1 -1
- package/dist/modules/kubernetes/KubernetesRunnerTransport.js +4 -3
- package/dist/modules/kubernetes/KubernetesRunnerTransport.js.map +1 -1
- package/dist/modules/runners/HttpRunnerPoolProvider.d.ts.map +1 -1
- package/dist/modules/runners/HttpRunnerPoolProvider.js +40 -4
- package/dist/modules/runners/HttpRunnerPoolProvider.js.map +1 -1
- package/dist/modules/runners/RunnerPoolConnectionService.d.ts +13 -2
- package/dist/modules/runners/RunnerPoolConnectionService.d.ts.map +1 -1
- package/dist/modules/runners/RunnerPoolConnectionService.js +31 -4
- package/dist/modules/runners/RunnerPoolConnectionService.js.map +1 -1
- package/dist/modules/runners/runner-backends.d.ts +9 -1
- package/dist/modules/runners/runner-backends.d.ts.map +1 -1
- package/dist/modules/runners/runner-backends.js +2 -1
- package/dist/modules/runners/runner-backends.js.map +1 -1
- package/dist/modules/runners/runners.logic.d.ts +36 -7
- package/dist/modules/runners/runners.logic.d.ts.map +1 -1
- package/dist/modules/runners/runners.logic.js +123 -15
- package/dist/modules/runners/runners.logic.js.map +1 -1
- package/dist/modules/tasks/BugHuntService.d.ts +73 -0
- package/dist/modules/tasks/BugHuntService.d.ts.map +1 -0
- package/dist/modules/tasks/BugHuntService.js +175 -0
- package/dist/modules/tasks/BugHuntService.js.map +1 -0
- package/dist/modules/tasks/GitHubIssuesProvider.d.ts +27 -1
- package/dist/modules/tasks/GitHubIssuesProvider.d.ts.map +1 -1
- package/dist/modules/tasks/GitHubIssuesProvider.js +51 -12
- package/dist/modules/tasks/GitHubIssuesProvider.js.map +1 -1
- package/dist/modules/tasks/JiraProvider.d.ts +18 -1
- package/dist/modules/tasks/JiraProvider.d.ts.map +1 -1
- package/dist/modules/tasks/JiraProvider.js +47 -0
- package/dist/modules/tasks/JiraProvider.js.map +1 -1
- package/dist/modules/tasks/LinearTaskProvider.d.ts +16 -1
- package/dist/modules/tasks/LinearTaskProvider.d.ts.map +1 -1
- package/dist/modules/tasks/LinearTaskProvider.js +41 -1
- package/dist/modules/tasks/LinearTaskProvider.js.map +1 -1
- package/dist/modules/tasks/TaskLinkService.d.ts +10 -2
- package/dist/modules/tasks/TaskLinkService.d.ts.map +1 -1
- package/dist/modules/tasks/TaskLinkService.js +8 -1
- package/dist/modules/tasks/TaskLinkService.js.map +1 -1
- package/dist/modules/tasks/TrackerWebhookService.d.ts +3 -3
- package/dist/modules/tasks/TrackerWebhookService.d.ts.map +1 -1
- package/dist/modules/tasks/TrackerWebhookService.js +1 -2
- package/dist/modules/tasks/TrackerWebhookService.js.map +1 -1
- package/dist/modules/tasks/github-issues.logic.d.ts +25 -1
- package/dist/modules/tasks/github-issues.logic.d.ts.map +1 -1
- package/dist/modules/tasks/github-issues.logic.js +73 -1
- package/dist/modules/tasks/github-issues.logic.js.map +1 -1
- package/dist/modules/tasks/jira.logic.d.ts +25 -1
- package/dist/modules/tasks/jira.logic.d.ts.map +1 -1
- package/dist/modules/tasks/jira.logic.js +62 -0
- package/dist/modules/tasks/jira.logic.js.map +1 -1
- package/dist/modules/tasks/linear.logic.d.ts +53 -1
- package/dist/modules/tasks/linear.logic.d.ts.map +1 -1
- package/dist/modules/tasks/linear.logic.js +62 -0
- package/dist/modules/tasks/linear.logic.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { ValidationError, parseBugHuntVerdicts, rankBugCandidates, redactSecrets, } from '@cat-factory/kernel';
|
|
2
|
+
/**
|
|
3
|
+
* How many candidates one hunt scans. Bounded because the whole set goes into a single
|
|
4
|
+
* ranking prompt: past this the prompt cost grows without making the shortlist better, since
|
|
5
|
+
* a human is only ever going to look at the top handful. A board with more matching bugs
|
|
6
|
+
* reports `truncated`, so the UI can say the scan was partial rather than implying the board
|
|
7
|
+
* was exhausted.
|
|
8
|
+
*/
|
|
9
|
+
export const BUG_HUNT_SCAN_LIMIT = 40;
|
|
10
|
+
/** The tracker default when the caller names no issue type — the same one intake uses. */
|
|
11
|
+
const DEFAULT_ISSUE_TYPE = 'bug';
|
|
12
|
+
export class BugHuntService {
|
|
13
|
+
deps;
|
|
14
|
+
constructor(deps) {
|
|
15
|
+
this.deps = deps;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* List the boards a hunt can run against. A source whose provider can't enumerate boards
|
|
19
|
+
* throws rather than returning `[]`: an empty picker and "this tracker cannot list boards"
|
|
20
|
+
* look identical to a user, and only the second one tells them to type the board in.
|
|
21
|
+
*/
|
|
22
|
+
async listBoards(workspaceId, source) {
|
|
23
|
+
const provider = this.deps.taskSourceRegistry.get(source);
|
|
24
|
+
if (!provider?.listBoards) {
|
|
25
|
+
// `reason` is what the SPA acts on: "this tracker cannot enumerate boards" is the ONE
|
|
26
|
+
// failure whose answer is "type the board in yourself", and it must be distinguishable
|
|
27
|
+
// from an unreachable tracker or an expired token — which would otherwise present as the
|
|
28
|
+
// same free-text field, followed by a hunt that fails for a reason nobody was told.
|
|
29
|
+
throw new ValidationError(`The '${source}' source cannot list boards on this deployment.`, {
|
|
30
|
+
reason: 'boards_unsupported',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const credentials = await this.credentialsFor(workspaceId, source);
|
|
34
|
+
return provider.listBoards(credentials, workspaceId);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Run a hunt: read the board's open, unassigned bugs (excluding anything already linked to a
|
|
38
|
+
* block), rank them, and return them best-first.
|
|
39
|
+
*
|
|
40
|
+
* The READ throws — an unreachable tracker is a failure the user must see, not an empty
|
|
41
|
+
* board. The RANKING never does: an assessment that fails leaves the real candidates in
|
|
42
|
+
* place under `analysisStatus: 'failed'`, because the list is independently useful and a
|
|
43
|
+
* model outage should not cost the user the scan.
|
|
44
|
+
*/
|
|
45
|
+
async hunt(workspaceId, source, input) {
|
|
46
|
+
const provider = this.deps.taskSourceRegistry.get(source);
|
|
47
|
+
if (!provider?.listBugCandidates) {
|
|
48
|
+
throw new ValidationError(`The '${source}' source cannot back a bug hunt on this deployment.`);
|
|
49
|
+
}
|
|
50
|
+
const credentials = await this.credentialsFor(workspaceId, source);
|
|
51
|
+
// Exclusion list: every issue from this source currently imported AND linked to a block is
|
|
52
|
+
// already being worked, so offering it as a fresh candidate would invite two runs on one
|
|
53
|
+
// bug. ONE batched projection read, filtered in memory — never a per-candidate lookup.
|
|
54
|
+
const projected = await this.deps.taskRepository.listByWorkspace(workspaceId);
|
|
55
|
+
const excludeExternalIds = projected
|
|
56
|
+
.filter((t) => t.linkedBlockId && t.source === source)
|
|
57
|
+
.map((t) => t.externalId);
|
|
58
|
+
const query = {
|
|
59
|
+
board: boardScopeFor(source, input.board),
|
|
60
|
+
...(input.titleFragment ? { titleFragment: input.titleFragment } : {}),
|
|
61
|
+
...(input.labels?.length ? { labels: input.labels } : {}),
|
|
62
|
+
issueType: input.issueType || DEFAULT_ISSUE_TYPE,
|
|
63
|
+
unassignedOnly: true,
|
|
64
|
+
excludeExternalIds,
|
|
65
|
+
// Ask for ONE past the cap purely to learn whether the board holds more. Comparing the
|
|
66
|
+
// returned count against the cap instead cannot tell "exactly 40 bugs, all of them here"
|
|
67
|
+
// from "40 shown, more behind them", and would tell a user their board holds more than
|
|
68
|
+
// they can see whenever it holds exactly the cap.
|
|
69
|
+
limit: BUG_HUNT_SCAN_LIMIT + 1,
|
|
70
|
+
};
|
|
71
|
+
const found = await provider.listBugCandidates(credentials, query, workspaceId);
|
|
72
|
+
const truncated = found.length > BUG_HUNT_SCAN_LIMIT;
|
|
73
|
+
const candidates = truncated ? found.slice(0, BUG_HUNT_SCAN_LIMIT) : found;
|
|
74
|
+
const { ranked, analysisStatus, model } = await this.rank(workspaceId, candidates);
|
|
75
|
+
return {
|
|
76
|
+
source,
|
|
77
|
+
board: input.board,
|
|
78
|
+
analysisStatus,
|
|
79
|
+
model,
|
|
80
|
+
candidates: ranked,
|
|
81
|
+
scanned: candidates.length,
|
|
82
|
+
truncated,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Adopt a confirmed candidate: import the issue into the projection and materialise it as a
|
|
87
|
+
* `bug` task inside `containerId`, with the issue linked for agent context.
|
|
88
|
+
*
|
|
89
|
+
* Stops there deliberately. Starting the run needs the execution engine (and the initiator's
|
|
90
|
+
* personal-credential gate), which is the HTTP layer's job — this service stays inside the
|
|
91
|
+
* integrations layer, exactly as `BugIntakeService` hands its pickup back to the engine.
|
|
92
|
+
*/
|
|
93
|
+
async adopt(workspaceId, source, externalId, containerId, createdBy, pipelineId) {
|
|
94
|
+
await this.deps.importService.import(workspaceId, source, externalId);
|
|
95
|
+
return this.deps.linkService.createTaskFromIssue(workspaceId, containerId, source, externalId, createdBy,
|
|
96
|
+
// A hunted issue is a bug by construction, and the pipeline the human confirmed is the
|
|
97
|
+
// one the task's Run controls should default to — so the created task carries both
|
|
98
|
+
// rather than landing as a generic `feature` the user has to re-classify.
|
|
99
|
+
{ taskType: 'bug', pipelineId });
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Rank a candidate set, degrading to the unranked list with a stated reason. The model's
|
|
103
|
+
* verdicts are joined onto the provider's rows by `rankBugCandidates`, so a hallucinated
|
|
104
|
+
* issue is dropped and a skipped one surfaces as "not assessed" rather than as a zero.
|
|
105
|
+
*/
|
|
106
|
+
async rank(workspaceId, candidates) {
|
|
107
|
+
const unranked = rankBugCandidates(candidates, new Map());
|
|
108
|
+
if (candidates.length === 0) {
|
|
109
|
+
return { ranked: unranked, analysisStatus: 'empty', model: null };
|
|
110
|
+
}
|
|
111
|
+
const assessor = this.deps.assessor;
|
|
112
|
+
if (!assessor?.enabled) {
|
|
113
|
+
return { ranked: unranked, analysisStatus: 'unavailable', model: null };
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
// Checked BEFORE the call, and reported as its OWN status rather than folded into
|
|
117
|
+
// `failed`: an exhausted budget is not a broken model, and the fix (raise the budget, or
|
|
118
|
+
// wait for the window to roll) is not the fix for a revoked key.
|
|
119
|
+
//
|
|
120
|
+
// Inside the try because it reads the spend ledger: a probe that cannot answer must not
|
|
121
|
+
// cost the user the scan they already paid a vendor call for. It then degrades to
|
|
122
|
+
// `failed` — accurate (the rating could not be completed) and fail-CLOSED (no model call
|
|
123
|
+
// is made), which is the only safe direction for a budget guard.
|
|
124
|
+
if (await this.deps.isOverBudget?.(workspaceId)) {
|
|
125
|
+
return { ranked: unranked, analysisStatus: 'over_budget', model: null };
|
|
126
|
+
}
|
|
127
|
+
// Bug bodies are written by anyone who can file a ticket and are about to be sent to a
|
|
128
|
+
// model provider, so they are scrubbed BEFORE they leave the deployment — the same
|
|
129
|
+
// boundary the agent-context snapshots apply, for the same reason.
|
|
130
|
+
const { verdicts, model } = await assessor.assess({
|
|
131
|
+
workspaceId,
|
|
132
|
+
candidates: candidates.map(scrubCandidate),
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
ranked: rankBugCandidates(candidates, parseBugHuntVerdicts(verdicts)),
|
|
136
|
+
analysisStatus: 'ranked',
|
|
137
|
+
model,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Deliberately swallowed: `analysisStatus: 'failed'` is what the user acts on, and the
|
|
142
|
+
// scan they paid for is still in the response. The assessor logs the underlying cause.
|
|
143
|
+
// A budget probe that threw lands here too — nothing was spent, and the scan survives.
|
|
144
|
+
return { ranked: unranked, analysisStatus: 'failed', model: null };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Resolve a source's stored credentials, or an empty bag for a credentialless one (GitHub). */
|
|
148
|
+
async credentialsFor(workspaceId, source) {
|
|
149
|
+
const connection = await this.deps.taskConnectionRepository.getByWorkspace(workspaceId, source);
|
|
150
|
+
return connection?.credentials ?? {};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Put the caller's board id on the field the target provider reads. The three vendors' board
|
|
155
|
+
* notions are structurally different (a Jira project key, a Linear team UUID, an `owner/repo`
|
|
156
|
+
* slug), which is exactly why the wire carries ONE opaque string and the mapping happens here
|
|
157
|
+
* rather than in the SPA — a picker that had to know which field to fill would have to be
|
|
158
|
+
* forked per provider.
|
|
159
|
+
*/
|
|
160
|
+
function boardScopeFor(source, board) {
|
|
161
|
+
if (source === 'jira')
|
|
162
|
+
return { jiraProjectKey: board };
|
|
163
|
+
if (source === 'linear')
|
|
164
|
+
return { linearTeamId: board };
|
|
165
|
+
return { githubRepo: board };
|
|
166
|
+
}
|
|
167
|
+
/** Scrub the free-text fields of a candidate before it is sent to a model provider. */
|
|
168
|
+
function scrubCandidate(candidate) {
|
|
169
|
+
return {
|
|
170
|
+
...candidate,
|
|
171
|
+
title: redactSecrets(candidate.title) ?? '',
|
|
172
|
+
description: redactSecrets(candidate.description) ?? '',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=BugHuntService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BugHuntService.js","sourceRoot":"","sources":["../../../src/modules/tasks/BugHuntService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type GitHubClient, type GitHubInstallationRepository, type IssueIntakeQuery, type TaskContent, type TaskCredentials, type TaskSearchRepoScope, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
1
|
+
import { type BugCandidate, type GitHubClient, type GitHubInstallationRepository, type IssueIntakeQuery, type TaskContent, type TaskCredentials, type TaskSearchRepoScope, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, type TrackerBoard, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
2
2
|
export interface GitHubIssuesProviderDependencies {
|
|
3
3
|
githubClient: GitHubClient;
|
|
4
4
|
/** Resolves which installation owns a given repo owner (by account login). */
|
|
@@ -63,6 +63,32 @@ export declare class GitHubIssuesProvider implements TaskSourceProvider {
|
|
|
63
63
|
* the excluded ids from the single response — never a per-candidate lookup.
|
|
64
64
|
*/
|
|
65
65
|
searchIssues(_credentials: TaskCredentials, query: IssueIntakeQuery, workspaceId: string): Promise<TaskSearchResult[]>;
|
|
66
|
+
/**
|
|
67
|
+
* The oldest-first page walk BOTH intake reads ride, returning the eligible hits so each
|
|
68
|
+
* caller only supplies its own projection ({@link TaskSearchResult} for the recurring
|
|
69
|
+
* intake, {@link BugCandidate} for a hunt).
|
|
70
|
+
*
|
|
71
|
+
* Shared rather than copied because every rule in here is one the two must agree on, and a
|
|
72
|
+
* second copy is how they stop agreeing — the unassigned guard below landed in one of them
|
|
73
|
+
* only. The walk: compile the predicates into one search text, overscan by the exclusion
|
|
74
|
+
* count (the one predicate GitHub search can't express, and the excluded issues ARE the
|
|
75
|
+
* oldest so they cluster at the front), and page through — bounded — so a first page that is
|
|
76
|
+
* entirely excluded can't starve the result while eligible issues exist beyond it.
|
|
77
|
+
*/
|
|
78
|
+
private walkIntakeHits;
|
|
79
|
+
/**
|
|
80
|
+
* List the workspace installation's repositories as hunt boards. No installation ⇒ an empty
|
|
81
|
+
* list, matching every other read on this provider (GitHub Issues rides the App, so "not
|
|
82
|
+
* installed" is an absence, not an error).
|
|
83
|
+
*/
|
|
84
|
+
listBoards(_credentials: TaskCredentials, workspaceId: string): Promise<TrackerBoard[]>;
|
|
85
|
+
/**
|
|
86
|
+
* Bug-hunt candidate search: the SAME repo-scoped walk as {@link searchIssues} (now also
|
|
87
|
+
* carrying `no:assignee`, from `query.unassignedOnly`), projected onto the richer candidate
|
|
88
|
+
* shape. GitHub's search response already carries the body, labels, age and comment count,
|
|
89
|
+
* so no per-candidate detail fetch is needed — the whole board scan is one request per page.
|
|
90
|
+
*/
|
|
91
|
+
listBugCandidates(_credentials: TaskCredentials, query: IssueIntakeQuery, workspaceId: string): Promise<BugCandidate[]>;
|
|
66
92
|
/**
|
|
67
93
|
* Fetch one issue by its canonical external id and project it as a lean search hit,
|
|
68
94
|
* constrained to the SEARCHING workspace's own installation. A pasted issue URL can
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubIssuesProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/GitHubIssuesProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,4BAA4B,
|
|
1
|
+
{"version":3,"file":"GitHubIssuesProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/GitHubIssuesProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,YAAY,EAEjB,KAAK,4BAA4B,EAEjC,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;AAmB5B,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,YAAY,CAAA;IAC1B,8EAA8E;IAC9E,aAAa,EAAE,4BAA4B,CAAA;CAC5C;AAMD,qBAAa,oBAAqB,YAAW,kBAAkB;IAUjD,OAAO,CAAC,QAAQ,CAAC,IAAI;IATjC,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IACjC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,yDAA6B;IAC7C,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;MAA2B;IAE9C,YAA6B,IAAI,EAAE,gCAAgC,EAAI;IAEvE;;;;OAIG;IACH,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,wBAAwB,CAErE;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErC;IAEK,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyCvF;IAED;;;;;;;;;;;;;OAaG;IACG,MAAM,CACV,YAAY,EAAE,eAAe,EAC7B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,mBAAmB,GAC1B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAqC7B;IAED;;;;;;;;OAQG;IACG,YAAY,CAChB,YAAY,EAAE,eAAe,EAC7B,KAAK,EAAE,gBAAgB,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAU7B;IAED;;;;;;;;;;;OAWG;YACW,cAAc;IAoC5B;;;;OAIG;IACG,UAAU,CAAC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAK5F;IAED;;;;;OAKG;IACG,iBAAiB,CACrB,YAAY,EAAE,eAAe,EAC7B,KAAK,EAAE,gBAAgB,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAGzB;IAED;;;;;;;;OAQG;YACW,UAAU;IAsBxB;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,KAAK,EAAE;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAA;KACpC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoDhC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAqC3B;;;;;OAKG;YACW,qBAAqB;CAUpC"}
|
|
@@ -132,6 +132,29 @@ export class GitHubIssuesProvider {
|
|
|
132
132
|
* the excluded ids from the single response — never a per-candidate lookup.
|
|
133
133
|
*/
|
|
134
134
|
async searchIssues(_credentials, query, workspaceId) {
|
|
135
|
+
const hits = await this.walkIntakeHits(query, workspaceId);
|
|
136
|
+
return hits.map((hit) => ({
|
|
137
|
+
source: 'github',
|
|
138
|
+
externalId: githubIssuesLogic.githubIssueExternalId(hit),
|
|
139
|
+
title: hit.title,
|
|
140
|
+
url: hit.url,
|
|
141
|
+
status: hit.state,
|
|
142
|
+
excerpt: '',
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The oldest-first page walk BOTH intake reads ride, returning the eligible hits so each
|
|
147
|
+
* caller only supplies its own projection ({@link TaskSearchResult} for the recurring
|
|
148
|
+
* intake, {@link BugCandidate} for a hunt).
|
|
149
|
+
*
|
|
150
|
+
* Shared rather than copied because every rule in here is one the two must agree on, and a
|
|
151
|
+
* second copy is how they stop agreeing — the unassigned guard below landed in one of them
|
|
152
|
+
* only. The walk: compile the predicates into one search text, overscan by the exclusion
|
|
153
|
+
* count (the one predicate GitHub search can't express, and the excluded issues ARE the
|
|
154
|
+
* oldest so they cluster at the front), and page through — bounded — so a first page that is
|
|
155
|
+
* entirely excluded can't starve the result while eligible issues exist beyond it.
|
|
156
|
+
*/
|
|
157
|
+
async walkIntakeHits(query, workspaceId) {
|
|
135
158
|
const installation = await this.deps.installations.getByWorkspace(workspaceId);
|
|
136
159
|
if (!installation)
|
|
137
160
|
return [];
|
|
@@ -140,10 +163,6 @@ export class GitHubIssuesProvider {
|
|
|
140
163
|
// slips past the filter and is re-picked.
|
|
141
164
|
const excluded = new Set((query.excludeExternalIds ?? []).map((id) => id.toLowerCase()));
|
|
142
165
|
const searchText = githubIssuesLogic.buildGitHubIntakeQuery(query);
|
|
143
|
-
// Oldest-first, and the already-worked (excluded) issues ARE the oldest, so they
|
|
144
|
-
// cluster at the front. The exclusion list is the one predicate GitHub search can't
|
|
145
|
-
// express, so overscan by its size — and page through (bounded) so a first page that
|
|
146
|
-
// is entirely excluded can't starve the result while eligible issues exist beyond it.
|
|
147
166
|
const per = Math.min(query.limit + excluded.size, 100);
|
|
148
167
|
const out = [];
|
|
149
168
|
for (let page = 1; page <= INTAKE_MAX_PAGES && out.length < query.limit; page++) {
|
|
@@ -152,14 +171,12 @@ export class GitHubIssuesProvider {
|
|
|
152
171
|
const externalId = githubIssuesLogic.githubIssueExternalId(hit);
|
|
153
172
|
if (excluded.has(externalId.toLowerCase()))
|
|
154
173
|
continue;
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
excerpt: '',
|
|
162
|
-
});
|
|
174
|
+
// Defence in depth on the unassigned predicate: `no:assignee` is what actually
|
|
175
|
+
// narrows the search, but an adapter that reports an assignee while ignoring the
|
|
176
|
+
// qualifier would otherwise offer up somebody else's in-flight work as free to take.
|
|
177
|
+
if (query.unassignedOnly && hit.assignee)
|
|
178
|
+
continue;
|
|
179
|
+
out.push(hit);
|
|
163
180
|
if (out.length >= query.limit)
|
|
164
181
|
break;
|
|
165
182
|
}
|
|
@@ -168,6 +185,28 @@ export class GitHubIssuesProvider {
|
|
|
168
185
|
}
|
|
169
186
|
return out;
|
|
170
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* List the workspace installation's repositories as hunt boards. No installation ⇒ an empty
|
|
190
|
+
* list, matching every other read on this provider (GitHub Issues rides the App, so "not
|
|
191
|
+
* installed" is an absence, not an error).
|
|
192
|
+
*/
|
|
193
|
+
async listBoards(_credentials, workspaceId) {
|
|
194
|
+
const installation = await this.deps.installations.getByWorkspace(workspaceId);
|
|
195
|
+
if (!installation)
|
|
196
|
+
return [];
|
|
197
|
+
const page = await this.deps.githubClient.listInstallationRepos(installation.installationId);
|
|
198
|
+
return githubIssuesLogic.githubReposToBoards(page.items);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Bug-hunt candidate search: the SAME repo-scoped walk as {@link searchIssues} (now also
|
|
202
|
+
* carrying `no:assignee`, from `query.unassignedOnly`), projected onto the richer candidate
|
|
203
|
+
* shape. GitHub's search response already carries the body, labels, age and comment count,
|
|
204
|
+
* so no per-candidate detail fetch is needed — the whole board scan is one request per page.
|
|
205
|
+
*/
|
|
206
|
+
async listBugCandidates(_credentials, query, workspaceId) {
|
|
207
|
+
const hits = await this.walkIntakeHits(query, workspaceId);
|
|
208
|
+
return hits.map(githubIssuesLogic.githubHitToBugCandidate);
|
|
209
|
+
}
|
|
171
210
|
/**
|
|
172
211
|
* Fetch one issue by its canonical external id and project it as a lean search hit,
|
|
173
212
|
* constrained to the SEARCHING workspace's own installation. A pasted issue URL can
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubIssuesProvider.js","sourceRoot":"","sources":["../../../src/modules/tasks/GitHubIssuesProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,
|
|
1
|
+
{"version":3,"file":"GitHubIssuesProvider.js","sourceRoot":"","sources":["../../../src/modules/tasks/GitHubIssuesProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type IssueIntakeQuery, type TaskContent, type TaskCredentials, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
1
|
+
import { type BugCandidate, type IssueIntakeQuery, type TaskContent, type TaskCredentials, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, type TrackerBoard, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
2
2
|
/** Carries the HTTP status so callers can surface a meaningful error. */
|
|
3
3
|
export declare class JiraApiError extends Error {
|
|
4
4
|
readonly status: number;
|
|
@@ -57,6 +57,23 @@ export declare class JiraProvider implements TaskSourceProvider {
|
|
|
57
57
|
* candidates — see {@link jiraLogic.buildJiraIntakeJql}.
|
|
58
58
|
*/
|
|
59
59
|
searchIssues(credentials: TaskCredentials, query: IssueIntakeQuery): Promise<TaskSearchResult[]>;
|
|
60
|
+
/**
|
|
61
|
+
* List the site's projects as hunt boards. Jira paginates project search at 50/page; one
|
|
62
|
+
* page is the picker's whole appetite, and the SPA filters client-side — a site with more
|
|
63
|
+
* projects than that is served by the free-text board entry the picker also offers.
|
|
64
|
+
*/
|
|
65
|
+
listBoards(credentials: TaskCredentials): Promise<TrackerBoard[]>;
|
|
66
|
+
/** The connection's site root, trimmed and re-validated — the one place either is done. */
|
|
67
|
+
private siteBase;
|
|
68
|
+
/**
|
|
69
|
+
* Bug-hunt candidate search: the same predicate JQL the intake builds (plus
|
|
70
|
+
* `assignee IS EMPTY`, from `query.unassignedOnly`), asked for the richer
|
|
71
|
+
* {@link jiraLogic.JIRA_CANDIDATE_FIELDS} selection. ONE request returns every field the
|
|
72
|
+
* ranking reasons over.
|
|
73
|
+
*/
|
|
74
|
+
listBugCandidates(credentials: TaskCredentials, query: IssueIntakeQuery): Promise<BugCandidate[]>;
|
|
75
|
+
/** Authenticated GET against the connection's site, re-validating the stored base URL. */
|
|
76
|
+
private getJson;
|
|
60
77
|
/** Run a JQL search and map the hits (shared by the free-text and intake searches). */
|
|
61
78
|
private searchByJql;
|
|
62
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JiraProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"JiraProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;AAyB5B,yEAAyE;AACzE,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,MAAM,EAAE,MAAM;IADzB,YACW,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EAIhB;CACF;AAyBD,qBAAa,YAAa,YAAW,kBAAkB;IACrD,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAS;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,yDAAqB;IACrC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;MAAkB;IAErC,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,wBAAwB,CAepE;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErC;IAEK,SAAS,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgEtF;IAED;;;;;OAKG;YACW,cAAc;IA+B5B;;;;;;OAMG;IACG,QAAQ,CAAC,KAAK,EAAE;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAA;KACpC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2EhC;IAEK,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAErF;IAED;;;;;OAKG;IACG,YAAY,CAChB,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAE7B;IAED;;;;OAIG;IACG,UAAU,CAAC,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAMtE;IAED,2FAA2F;IAC3F,OAAO,CAAC,QAAQ;IAMhB;;;;;OAKG;IACG,iBAAiB,CACrB,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAQzB;IAED,0FAA0F;YAC5E,OAAO;IAkBrB,uFAAuF;YACzE,WAAW;CAkC1B"}
|
|
@@ -16,6 +16,8 @@ import { jiraWebhookAdapter } from './webhook/adapters.js';
|
|
|
16
16
|
const USER_AGENT = 'cat-factory';
|
|
17
17
|
/** Max child-issue pages walked per epic (100/page) — a sanity bound on the import fan-out. */
|
|
18
18
|
const CHILD_PAGE_CAP = 20;
|
|
19
|
+
/** How many projects the board picker lists in one page (Jira's project-search maximum). */
|
|
20
|
+
const BOARD_PAGE_SIZE = 50;
|
|
19
21
|
/** Carries the HTTP status so callers can surface a meaningful error. */
|
|
20
22
|
export class JiraApiError extends Error {
|
|
21
23
|
status;
|
|
@@ -240,6 +242,51 @@ export class JiraProvider {
|
|
|
240
242
|
async searchIssues(credentials, query) {
|
|
241
243
|
return this.searchByJql(credentials, jiraLogic.buildJiraIntakeJql(query), query.limit);
|
|
242
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* List the site's projects as hunt boards. Jira paginates project search at 50/page; one
|
|
247
|
+
* page is the picker's whole appetite, and the SPA filters client-side — a site with more
|
|
248
|
+
* projects than that is served by the free-text board entry the picker also offers.
|
|
249
|
+
*/
|
|
250
|
+
async listBoards(credentials) {
|
|
251
|
+
const json = await this.getJson(credentials, `/rest/api/3/project/search?maxResults=${BOARD_PAGE_SIZE}&orderBy=name`);
|
|
252
|
+
return jiraLogic.parseJiraBoards(json);
|
|
253
|
+
}
|
|
254
|
+
/** The connection's site root, trimmed and re-validated — the one place either is done. */
|
|
255
|
+
siteBase(credentials) {
|
|
256
|
+
const base = credentials.baseUrl.replace(/\/+$/, '');
|
|
257
|
+
atlassianLogic.assertSafeAtlassianBaseUrl(base);
|
|
258
|
+
return base;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Bug-hunt candidate search: the same predicate JQL the intake builds (plus
|
|
262
|
+
* `assignee IS EMPTY`, from `query.unassignedOnly`), asked for the richer
|
|
263
|
+
* {@link jiraLogic.JIRA_CANDIDATE_FIELDS} selection. ONE request returns every field the
|
|
264
|
+
* ranking reasons over.
|
|
265
|
+
*/
|
|
266
|
+
async listBugCandidates(credentials, query) {
|
|
267
|
+
const base = this.siteBase(credentials);
|
|
268
|
+
const jql = encodeURIComponent(jiraLogic.buildJiraIntakeJql(query));
|
|
269
|
+
const json = await this.getJson(credentials, `/rest/api/3/search/jql?jql=${jql}&fields=${jiraLogic.JIRA_CANDIDATE_FIELDS}&maxResults=${query.limit}`);
|
|
270
|
+
return jiraLogic.parseJiraBugCandidates(json, base);
|
|
271
|
+
}
|
|
272
|
+
/** Authenticated GET against the connection's site, re-validating the stored base URL. */
|
|
273
|
+
async getJson(credentials, path) {
|
|
274
|
+
const url = `${this.siteBase(credentials)}${path}`;
|
|
275
|
+
const auth = btoa(`${credentials.accountEmail}:${credentials.apiToken}`);
|
|
276
|
+
const res = await fetch(url, {
|
|
277
|
+
method: 'GET',
|
|
278
|
+
headers: {
|
|
279
|
+
authorization: `Basic ${auth}`,
|
|
280
|
+
accept: 'application/json',
|
|
281
|
+
'user-agent': USER_AGENT,
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
if (!res.ok) {
|
|
285
|
+
const text = await res.text().catch(() => '');
|
|
286
|
+
throw new JiraApiError(res.status, `Jira GET ${url} → ${res.status}: ${text.slice(0, 300)}`);
|
|
287
|
+
}
|
|
288
|
+
return await res.json().catch(() => null);
|
|
289
|
+
}
|
|
243
290
|
/** Run a JQL search and map the hits (shared by the free-text and intake searches). */
|
|
244
291
|
async searchByJql(credentials, rawJql, limit) {
|
|
245
292
|
const base = credentials.baseUrl.replace(/\/+$/, '');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JiraProvider.js","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JiraProvider.js","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type IssueIntakeQuery, type TaskContent, type TaskCredentials, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
1
|
+
import { type BugCandidate, type IssueIntakeQuery, type TaskContent, type TaskCredentials, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, type TrackerBoard, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
2
2
|
import { type LinearTeam } from './linear.logic.js';
|
|
3
3
|
export declare class LinearTaskProvider implements TaskSourceProvider {
|
|
4
4
|
readonly kind: 'linear';
|
|
@@ -59,6 +59,21 @@ export declare class LinearTaskProvider implements TaskSourceProvider {
|
|
|
59
59
|
* class to reach it.
|
|
60
60
|
*/
|
|
61
61
|
listTeams(credentials: TaskCredentials): Promise<LinearTeam[]>;
|
|
62
|
+
/**
|
|
63
|
+
* A Linear "board" IS a team, and {@link LinearTeam} is already the {@link TrackerBoard}
|
|
64
|
+
* shape (id / name / key), so the generic board listing is the team listing. Kept as its
|
|
65
|
+
* own method rather than aliased, because the two are the same only by coincidence of
|
|
66
|
+
* Linear's model — the ticket-filing picker and the hunt picker are free to diverge.
|
|
67
|
+
*/
|
|
68
|
+
listBoards(credentials: TaskCredentials): Promise<TrackerBoard[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Bug-hunt candidate search: the same `IssueFilter` + oldest-first walk as
|
|
71
|
+
* {@link searchIssues} (now also carrying `assignee: { null: true }`, from
|
|
72
|
+
* `query.unassignedOnly`), projecting the fields the ranking reasons over. The exclusion
|
|
73
|
+
* list is the one predicate Linear can't express on the human identifier, so the walk
|
|
74
|
+
* overscans by its size and the mapper filters — exactly as the intake does.
|
|
75
|
+
*/
|
|
76
|
+
listBugCandidates(credentials: TaskCredentials, query: IssueIntakeQuery): Promise<BugCandidate[]>;
|
|
62
77
|
/**
|
|
63
78
|
* Live setup check: read `viewer` (the cheapest authenticated query) with the
|
|
64
79
|
* stored key. A 401/403 from Linear's GraphQL surfaces as auth_failed/forbidden;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinearTaskProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/LinearTaskProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;AAM5B,OAAO,
|
|
1
|
+
{"version":3,"file":"LinearTaskProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/LinearTaskProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;AAM5B,OAAO,EAmBL,KAAK,UAAU,EAWhB,MAAM,mBAAmB,CAAA;AAc1B,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IACjC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,yDAAuB;IACvC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;MAAyB;IAE5C,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,wBAAwB,CAapE;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErC;IAEK,SAAS,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAOtF;IAEK,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2BrF;IAED;;;;;;;;;;OAUG;IACG,YAAY,CAChB,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuB7B;IAED,oGAAoG;YACtF,UAAU;IAUxB;;;;;;;OAOG;YACW,QAAQ;IAsDtB;;;;;;OAMG;IACG,SAAS,CAAC,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAInE;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAEtE;IAED;;;;;;OAMG;IACG,iBAAiB,CACrB,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBzB;IAED;;;;OAIG;IACG,QAAQ,CAAC,KAAK,EAAE;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAA;KACpC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqDhC;CACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ValidationError, } from '@cat-factory/kernel';
|
|
2
2
|
import { LinearApiError, LinearGraphqlClient, linearAuthFromCredentials, } from '../shared/linear.client.js';
|
|
3
|
-
import { LINEAR_INTAKE_ISSUES_QUERY, LINEAR_INTAKE_PAGE_CAP, LINEAR_ISSUE_CHILDREN_QUERY, LINEAR_ISSUE_COMMENTS_QUERY, LINEAR_ISSUE_QUERY, LINEAR_PAGE_CAP, LINEAR_SEARCH_ISSUES_QUERY, LINEAR_TASK_DESCRIPTOR, LINEAR_TEAMS_QUERY, LINEAR_VIEWER_QUERY, buildLinearIntakeFilter, linearIssueSearchHit, mapLinearChildIds, mapLinearComments, mapLinearIntakeResults, mapLinearIssue, mapLinearSearchResults, mapLinearTeams, parseLinearRef, } from './linear.logic.js';
|
|
3
|
+
import { LINEAR_CANDIDATE_ISSUES_QUERY, LINEAR_COMMENT_PROBE, LINEAR_INTAKE_ISSUES_QUERY, LINEAR_INTAKE_PAGE_CAP, LINEAR_ISSUE_CHILDREN_QUERY, LINEAR_ISSUE_COMMENTS_QUERY, LINEAR_ISSUE_QUERY, LINEAR_PAGE_CAP, LINEAR_SEARCH_ISSUES_QUERY, LINEAR_TASK_DESCRIPTOR, LINEAR_TEAMS_QUERY, LINEAR_VIEWER_QUERY, buildLinearIntakeFilter, linearIssueSearchHit, mapLinearBugCandidates, mapLinearChildIds, mapLinearComments, mapLinearIntakeResults, mapLinearIssue, mapLinearSearchResults, mapLinearTeams, parseLinearRef, } from './linear.logic.js';
|
|
4
4
|
import { linearWebhookAdapter } from './webhook/adapters.js';
|
|
5
5
|
// LinearTaskProvider: the task-source provider for Linear. It authenticates with a
|
|
6
6
|
// personal API key against Linear's single GraphQL endpoint (via the shared
|
|
@@ -172,6 +172,46 @@ export class LinearTaskProvider {
|
|
|
172
172
|
const data = await client.query(LINEAR_TEAMS_QUERY);
|
|
173
173
|
return mapLinearTeams(data);
|
|
174
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* A Linear "board" IS a team, and {@link LinearTeam} is already the {@link TrackerBoard}
|
|
177
|
+
* shape (id / name / key), so the generic board listing is the team listing. Kept as its
|
|
178
|
+
* own method rather than aliased, because the two are the same only by coincidence of
|
|
179
|
+
* Linear's model — the ticket-filing picker and the hunt picker are free to diverge.
|
|
180
|
+
*/
|
|
181
|
+
async listBoards(credentials) {
|
|
182
|
+
return this.listTeams(credentials);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Bug-hunt candidate search: the same `IssueFilter` + oldest-first walk as
|
|
186
|
+
* {@link searchIssues} (now also carrying `assignee: { null: true }`, from
|
|
187
|
+
* `query.unassignedOnly`), projecting the fields the ranking reasons over. The exclusion
|
|
188
|
+
* list is the one predicate Linear can't express on the human identifier, so the walk
|
|
189
|
+
* overscans by its size and the mapper filters — exactly as the intake does.
|
|
190
|
+
*/
|
|
191
|
+
async listBugCandidates(credentials, query) {
|
|
192
|
+
const client = new LinearGraphqlClient(linearAuthFromCredentials(credentials));
|
|
193
|
+
const exclude = query.excludeExternalIds ?? [];
|
|
194
|
+
const excluded = new Set(exclude.map((id) => id.toUpperCase()));
|
|
195
|
+
const filter = buildLinearIntakeFilter(query);
|
|
196
|
+
const first = Math.min(query.limit + exclude.length, 100);
|
|
197
|
+
const nodes = [];
|
|
198
|
+
let after;
|
|
199
|
+
for (let page = 0; page < LINEAR_INTAKE_PAGE_CAP; page++) {
|
|
200
|
+
const data = await client.query(LINEAR_CANDIDATE_ISSUES_QUERY, {
|
|
201
|
+
filter,
|
|
202
|
+
first,
|
|
203
|
+
after,
|
|
204
|
+
comments: LINEAR_COMMENT_PROBE,
|
|
205
|
+
});
|
|
206
|
+
nodes.push(...(data.issues?.nodes ?? []));
|
|
207
|
+
const fresh = nodes.filter((n) => n.identifier && !excluded.has(n.identifier.toUpperCase())).length;
|
|
208
|
+
const pageInfo = data.issues?.pageInfo;
|
|
209
|
+
if (fresh >= query.limit || !pageInfo?.hasNextPage || !pageInfo.endCursor)
|
|
210
|
+
break;
|
|
211
|
+
after = pageInfo.endCursor;
|
|
212
|
+
}
|
|
213
|
+
return mapLinearBugCandidates({ issues: { nodes } }, query.limit, exclude);
|
|
214
|
+
}
|
|
175
215
|
/**
|
|
176
216
|
* Live setup check: read `viewer` (the cheapest authenticated query) with the
|
|
177
217
|
* stored key. A 401/403 from Linear's GraphQL surfaces as auth_failed/forbidden;
|