@cat-factory/integrations 0.10.4 → 0.12.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/modules/tasks/GitHubIssuesProvider.d.ts +42 -2
- package/dist/modules/tasks/GitHubIssuesProvider.d.ts.map +1 -1
- package/dist/modules/tasks/GitHubIssuesProvider.js +147 -4
- package/dist/modules/tasks/GitHubIssuesProvider.js.map +1 -1
- package/dist/modules/tasks/JiraProvider.d.ts +12 -1
- package/dist/modules/tasks/JiraProvider.d.ts.map +1 -1
- package/dist/modules/tasks/JiraProvider.js +83 -0
- package/dist/modules/tasks/JiraProvider.js.map +1 -1
- package/dist/modules/tasks/TaskConnectionService.d.ts +17 -1
- package/dist/modules/tasks/TaskConnectionService.d.ts.map +1 -1
- package/dist/modules/tasks/TaskConnectionService.js +71 -0
- package/dist/modules/tasks/TaskConnectionService.js.map +1 -1
- package/dist/modules/tasks/TaskImportService.d.ts +6 -2
- package/dist/modules/tasks/TaskImportService.d.ts.map +1 -1
- package/dist/modules/tasks/TaskImportService.js +6 -2
- package/dist/modules/tasks/TaskImportService.js.map +1 -1
- package/dist/modules/tasks/github-issues.logic.d.ts +20 -1
- package/dist/modules/tasks/github-issues.logic.d.ts.map +1 -1
- package/dist/modules/tasks/github-issues.logic.js +34 -0
- package/dist/modules/tasks/github-issues.logic.js.map +1 -1
- package/dist/modules/tasks/tasks.logic.d.ts +7 -0
- package/dist/modules/tasks/tasks.logic.d.ts.map +1 -1
- package/dist/modules/tasks/tasks.logic.js +14 -0
- package/dist/modules/tasks/tasks.logic.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type GitHubClient, type GitHubInstallationRepository, type TaskContent, type TaskCredentials, type TaskSearchResult, type TaskSourceProvider, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
1
|
+
import { type GitHubClient, type GitHubInstallationRepository, type TaskContent, type TaskCredentials, type TaskSearchRepoScope, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, 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). */
|
|
@@ -37,8 +37,48 @@ export declare class GitHubIssuesProvider implements TaskSourceProvider {
|
|
|
37
37
|
* workspace's installation keeps results from leaking across tenants — a
|
|
38
38
|
* deployment may host many installations, but a workspace owns exactly one.
|
|
39
39
|
* Credentials are unused (the App authenticates), matching `fetchTask`.
|
|
40
|
+
*
|
|
41
|
+
* When a `scope` is supplied (the search runs from a service linked to a repo)
|
|
42
|
+
* the query is narrowed to `repo:owner/name` so hits never leak in from sibling
|
|
43
|
+
* repos, AND input that names one specific issue — a pasted issue URL or a bare
|
|
44
|
+
* issue number against the scoped repo — is resolved to that exact issue and
|
|
45
|
+
* surfaced FIRST, rather than fuzzy-matched. A miss on the exact lookup (e.g. a
|
|
46
|
+
* number with no such issue) falls through to the text search instead of failing.
|
|
40
47
|
*/
|
|
41
|
-
search(_credentials: TaskCredentials, query: string, workspaceId: string): Promise<TaskSearchResult[]>;
|
|
48
|
+
search(_credentials: TaskCredentials, query: string, workspaceId: string, scope?: TaskSearchRepoScope): Promise<TaskSearchResult[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Fetch one issue by its canonical external id and project it as a lean search hit,
|
|
51
|
+
* constrained to the SEARCHING workspace's own installation. A pasted issue URL can
|
|
52
|
+
* name any `owner/repo`, but the search must never reach across tenants to a different
|
|
53
|
+
* account's installation to read its issues — that would leak the title/url/state of a
|
|
54
|
+
* repo this workspace has no relationship to (see `search`'s isolation note). An exact
|
|
55
|
+
* ref outside this installation's account returns null and falls through to the
|
|
56
|
+
* repo-scoped text search (which finds nothing in the wrong repo), exactly as a miss.
|
|
57
|
+
*/
|
|
58
|
+
private fetchExact;
|
|
59
|
+
/**
|
|
60
|
+
* Live setup check: confirm the workspace's App installation can actually read
|
|
61
|
+
* issues. Three escalating probes, each isolating a distinct failure:
|
|
62
|
+
* 1. `getInstallation` — validates the App's own credentials (id + key).
|
|
63
|
+
* 2. `listInstallationRepos` — mints the installation token (catches a
|
|
64
|
+
* suspended/revoked install) and yields a concrete repo to probe.
|
|
65
|
+
* 3. `listIssues` on that repo — the only call that needs the **Issues**
|
|
66
|
+
* permission, so a 403 here pinpoints the most common GitHub-App
|
|
67
|
+
* misconfiguration (Issues access not granted).
|
|
68
|
+
* Credentials are ignored — GitHub Issues rides the App, keyed on `workspaceId`.
|
|
69
|
+
*/
|
|
70
|
+
diagnose(input: {
|
|
71
|
+
workspaceId: string;
|
|
72
|
+
credentials: TaskCredentials | null;
|
|
73
|
+
}): Promise<TaskSourceDiagnostic>;
|
|
74
|
+
/**
|
|
75
|
+
* Map a GitHub client failure onto a setup diagnostic. 401 ⇒ the App key/JWT was
|
|
76
|
+
* rejected; 403 ⇒ authenticated but lacking a scope (when raised by the issues
|
|
77
|
+
* probe, that's the Issues permission specifically); a missing status ⇒ the host
|
|
78
|
+
* couldn't be reached. `permission` tags the issues-read probe so the 403 hint
|
|
79
|
+
* names the exact permission to grant.
|
|
80
|
+
*/
|
|
81
|
+
private classifyGitHubError;
|
|
42
82
|
/**
|
|
43
83
|
* Find the GitHub App installation whose account owns `owner`. The
|
|
44
84
|
* installation token for that account is what can read the repo's issues,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubIssuesProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/GitHubIssuesProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"GitHubIssuesProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/GitHubIssuesProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,4BAA4B,EACjC,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;AAkB5B,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,YAAY,CAAA;IAC1B,8EAA8E;IAC9E,aAAa,EAAE,4BAA4B,CAAA;CAC5C;AAED,qBAAa,oBAAqB,YAAW,kBAAkB;IAIjD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IACjC,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,CA0BvF;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;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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ConflictError, ValidationError, } from '@cat-factory/kernel';
|
|
2
2
|
import { GITHUB_ISSUES_DESCRIPTOR } from './github-issues.logic.js';
|
|
3
3
|
import * as githubIssuesLogic from './github-issues.logic.js';
|
|
4
|
+
import { httpStatusOf } from './tasks.logic.js';
|
|
4
5
|
export class GitHubIssuesProvider {
|
|
5
6
|
deps;
|
|
6
7
|
kind = 'github';
|
|
@@ -48,16 +49,36 @@ export class GitHubIssuesProvider {
|
|
|
48
49
|
* workspace's installation keeps results from leaking across tenants — a
|
|
49
50
|
* deployment may host many installations, but a workspace owns exactly one.
|
|
50
51
|
* Credentials are unused (the App authenticates), matching `fetchTask`.
|
|
52
|
+
*
|
|
53
|
+
* When a `scope` is supplied (the search runs from a service linked to a repo)
|
|
54
|
+
* the query is narrowed to `repo:owner/name` so hits never leak in from sibling
|
|
55
|
+
* repos, AND input that names one specific issue — a pasted issue URL or a bare
|
|
56
|
+
* issue number against the scoped repo — is resolved to that exact issue and
|
|
57
|
+
* surfaced FIRST, rather than fuzzy-matched. A miss on the exact lookup (e.g. a
|
|
58
|
+
* number with no such issue) falls through to the text search instead of failing.
|
|
51
59
|
*/
|
|
52
|
-
async search(_credentials, query, workspaceId) {
|
|
60
|
+
async search(_credentials, query, workspaceId, scope) {
|
|
53
61
|
const installation = await this.deps.installations.getByWorkspace(workspaceId);
|
|
54
62
|
if (!installation)
|
|
55
63
|
return [];
|
|
56
|
-
const hits = await this.deps.githubClient
|
|
57
|
-
.searchIssues(installation.installationId, query, 20)
|
|
58
|
-
.catch(() => []);
|
|
59
64
|
const out = [];
|
|
60
65
|
const seen = new Set();
|
|
66
|
+
// Exact match first: a pasted URL/shorthand or a bare number resolves to one
|
|
67
|
+
// issue, which the picker offers as the top option ("point at it, don't search").
|
|
68
|
+
const exactId = githubIssuesLogic.detectExactGitHubIssueRef(query, scope);
|
|
69
|
+
if (exactId) {
|
|
70
|
+
const hit = await this.fetchExact(exactId, installation).catch(() => null);
|
|
71
|
+
if (hit) {
|
|
72
|
+
seen.add(exactId);
|
|
73
|
+
out.push(hit);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const searchText = githubIssuesLogic.buildGitHubIssueSearchQuery(query, scope);
|
|
77
|
+
const hits = searchText
|
|
78
|
+
? await this.deps.githubClient
|
|
79
|
+
.searchIssues(installation.installationId, searchText, 20)
|
|
80
|
+
.catch(() => [])
|
|
81
|
+
: [];
|
|
61
82
|
for (const hit of hits) {
|
|
62
83
|
const externalId = githubIssuesLogic.githubIssueExternalId(hit);
|
|
63
84
|
if (seen.has(externalId))
|
|
@@ -74,6 +95,128 @@ export class GitHubIssuesProvider {
|
|
|
74
95
|
}
|
|
75
96
|
return out.slice(0, 20);
|
|
76
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Fetch one issue by its canonical external id and project it as a lean search hit,
|
|
100
|
+
* constrained to the SEARCHING workspace's own installation. A pasted issue URL can
|
|
101
|
+
* name any `owner/repo`, but the search must never reach across tenants to a different
|
|
102
|
+
* account's installation to read its issues — that would leak the title/url/state of a
|
|
103
|
+
* repo this workspace has no relationship to (see `search`'s isolation note). An exact
|
|
104
|
+
* ref outside this installation's account returns null and falls through to the
|
|
105
|
+
* repo-scoped text search (which finds nothing in the wrong repo), exactly as a miss.
|
|
106
|
+
*/
|
|
107
|
+
async fetchExact(externalId, installation) {
|
|
108
|
+
const id = githubIssuesLogic.parseGitHubIssueExternalId(externalId);
|
|
109
|
+
if (!id)
|
|
110
|
+
return null;
|
|
111
|
+
if (id.owner.toLowerCase() !== installation.accountLogin.toLowerCase())
|
|
112
|
+
return null;
|
|
113
|
+
const detail = await this.deps.githubClient.getIssue(installation.installationId, { owner: id.owner, repo: id.repo }, id.number);
|
|
114
|
+
return {
|
|
115
|
+
source: 'github',
|
|
116
|
+
externalId,
|
|
117
|
+
title: detail.title,
|
|
118
|
+
url: detail.url || githubIssuesLogic.githubIssueUrl(id),
|
|
119
|
+
status: detail.state,
|
|
120
|
+
excerpt: '',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Live setup check: confirm the workspace's App installation can actually read
|
|
125
|
+
* issues. Three escalating probes, each isolating a distinct failure:
|
|
126
|
+
* 1. `getInstallation` — validates the App's own credentials (id + key).
|
|
127
|
+
* 2. `listInstallationRepos` — mints the installation token (catches a
|
|
128
|
+
* suspended/revoked install) and yields a concrete repo to probe.
|
|
129
|
+
* 3. `listIssues` on that repo — the only call that needs the **Issues**
|
|
130
|
+
* permission, so a 403 here pinpoints the most common GitHub-App
|
|
131
|
+
* misconfiguration (Issues access not granted).
|
|
132
|
+
* Credentials are ignored — GitHub Issues rides the App, keyed on `workspaceId`.
|
|
133
|
+
*/
|
|
134
|
+
async diagnose(input) {
|
|
135
|
+
const installation = await this.deps.installations.getByWorkspace(input.workspaceId);
|
|
136
|
+
if (!installation) {
|
|
137
|
+
return {
|
|
138
|
+
source: 'github',
|
|
139
|
+
ok: false,
|
|
140
|
+
status: 'not_installed',
|
|
141
|
+
message: "This workspace's GitHub App isn't installed. Install it under Integrations → GitHub.",
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const id = installation.installationId;
|
|
145
|
+
try {
|
|
146
|
+
await this.deps.githubClient.getInstallation(id);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
return this.classifyGitHubError(err, 'validating the GitHub App credentials');
|
|
150
|
+
}
|
|
151
|
+
let repoCount = 0;
|
|
152
|
+
let probeRef = null;
|
|
153
|
+
try {
|
|
154
|
+
const repos = await this.deps.githubClient.listInstallationRepos(id);
|
|
155
|
+
repoCount = repos.items.length;
|
|
156
|
+
const first = repos.items[0];
|
|
157
|
+
if (first)
|
|
158
|
+
probeRef = { owner: first.owner, repo: first.name };
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return this.classifyGitHubError(err, 'listing the repositories the App can access');
|
|
162
|
+
}
|
|
163
|
+
if (probeRef) {
|
|
164
|
+
try {
|
|
165
|
+
await this.deps.githubClient.listIssues(id, probeRef);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return this.classifyGitHubError(err, `reading issues on ${probeRef.owner}/${probeRef.repo}`, true);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
source: 'github',
|
|
173
|
+
ok: true,
|
|
174
|
+
status: 'ready',
|
|
175
|
+
message: `Connected via the GitHub App on ${installation.accountLogin}.`,
|
|
176
|
+
detail: repoCount > 0
|
|
177
|
+
? `${repoCount} repositor${repoCount === 1 ? 'y' : 'ies'} accessible.`
|
|
178
|
+
: 'No repositories are shared with the App yet — grant it access to a repo to link its issues.',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Map a GitHub client failure onto a setup diagnostic. 401 ⇒ the App key/JWT was
|
|
183
|
+
* rejected; 403 ⇒ authenticated but lacking a scope (when raised by the issues
|
|
184
|
+
* probe, that's the Issues permission specifically); a missing status ⇒ the host
|
|
185
|
+
* couldn't be reached. `permission` tags the issues-read probe so the 403 hint
|
|
186
|
+
* names the exact permission to grant.
|
|
187
|
+
*/
|
|
188
|
+
classifyGitHubError(err, whileDoing, permission = false) {
|
|
189
|
+
const status = httpStatusOf(err);
|
|
190
|
+
const base = { source: 'github', ok: false };
|
|
191
|
+
if (status === 401) {
|
|
192
|
+
return {
|
|
193
|
+
...base,
|
|
194
|
+
status: 'auth_failed',
|
|
195
|
+
message: `GitHub rejected the App credentials while ${whileDoing}. Re-check the App id and private key, then reconnect the installation.`,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
if (status === 403) {
|
|
199
|
+
return {
|
|
200
|
+
...base,
|
|
201
|
+
status: 'forbidden',
|
|
202
|
+
message: permission
|
|
203
|
+
? "The GitHub App is installed but lacks the Issues permission. In the App's settings grant Read access to Issues and accept the permission update on the installation, then re-check."
|
|
204
|
+
: `GitHub denied access (403) while ${whileDoing}. The App is missing a required permission — review its installed permissions, then re-check.`,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
if (status === null) {
|
|
208
|
+
return {
|
|
209
|
+
...base,
|
|
210
|
+
status: 'unreachable',
|
|
211
|
+
message: `Couldn't reach GitHub while ${whileDoing}. Check network/API connectivity, then re-check.`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
...base,
|
|
216
|
+
status: 'error',
|
|
217
|
+
message: `GitHub returned ${status} while ${whileDoing}: ${err instanceof Error ? err.message : String(err)}`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
77
220
|
/**
|
|
78
221
|
* Find the GitHub App installation whose account owns `owner`. The
|
|
79
222
|
* installation token for that account is what can read the repo's issues,
|
|
@@ -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 TaskContent, type TaskCredentials, type TaskSearchResult, type TaskSourceProvider, type NormalizedTaskConnection } from '@cat-factory/kernel';
|
|
1
|
+
import { type TaskContent, type TaskCredentials, type TaskSearchResult, type TaskSourceDiagnostic, type TaskSourceProvider, 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;
|
|
@@ -24,6 +24,17 @@ export declare class JiraProvider implements TaskSourceProvider {
|
|
|
24
24
|
normalizeConnection(input: TaskCredentials): NormalizedTaskConnection;
|
|
25
25
|
parseRef(input: string): string | null;
|
|
26
26
|
fetchTask(credentials: TaskCredentials, externalId: string): Promise<TaskContent>;
|
|
27
|
+
/**
|
|
28
|
+
* Live setup check: authenticate against `/myself` (the cheapest authenticated
|
|
29
|
+
* read) with the stored email + API token. A 401 means Jira rejected the
|
|
30
|
+
* credentials (wrong email/token, or a revoked token); a 403 means the account
|
|
31
|
+
* is authenticated but lacks access; anything else surfaces verbatim. A thrown
|
|
32
|
+
* fetch (DNS/network) ⇒ unreachable. Resolves (never rejects), per the port.
|
|
33
|
+
*/
|
|
34
|
+
diagnose(input: {
|
|
35
|
+
workspaceId: string;
|
|
36
|
+
credentials: TaskCredentials | null;
|
|
37
|
+
}): Promise<TaskSourceDiagnostic>;
|
|
27
38
|
search(credentials: TaskCredentials, query: string): Promise<TaskSearchResult[]>;
|
|
28
39
|
}
|
|
29
40
|
//# sourceMappingURL=JiraProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JiraProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;AAkB5B,yEAAyE;AACzE,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,MAAM,EAAE,MAAM;IADzB,YACW,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EAIhB;CACF;AAsBD,qBAAa,YAAa,YAAW,kBAAkB;IACrD,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAS;IAC/B,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,CA4CtF;IAEK,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6BrF;CACF"}
|
|
1
|
+
{"version":3,"file":"JiraProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;AAkB5B,yEAAyE;AACzE,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,MAAM,EAAE,MAAM;IADzB,YACW,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EAIhB;CACF;AAsBD,qBAAa,YAAa,YAAW,kBAAkB;IACrD,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAS;IAC/B,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,CA4CtF;IAED;;;;;;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,CA6BrF;CACF"}
|
|
@@ -84,6 +84,89 @@ export class JiraProvider {
|
|
|
84
84
|
comments,
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Live setup check: authenticate against `/myself` (the cheapest authenticated
|
|
89
|
+
* read) with the stored email + API token. A 401 means Jira rejected the
|
|
90
|
+
* credentials (wrong email/token, or a revoked token); a 403 means the account
|
|
91
|
+
* is authenticated but lacks access; anything else surfaces verbatim. A thrown
|
|
92
|
+
* fetch (DNS/network) ⇒ unreachable. Resolves (never rejects), per the port.
|
|
93
|
+
*/
|
|
94
|
+
async diagnose(input) {
|
|
95
|
+
const creds = input.credentials;
|
|
96
|
+
if (!creds?.baseUrl || !creds.accountEmail || !creds.apiToken) {
|
|
97
|
+
return {
|
|
98
|
+
source: 'jira',
|
|
99
|
+
ok: false,
|
|
100
|
+
status: 'not_connected',
|
|
101
|
+
message: 'Jira has no stored credentials. Connect it with a site URL, email and API token.',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const base = creds.baseUrl.replace(/\/+$/, '');
|
|
105
|
+
try {
|
|
106
|
+
atlassianLogic.assertSafeAtlassianBaseUrl(base);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
return {
|
|
110
|
+
source: 'jira',
|
|
111
|
+
ok: false,
|
|
112
|
+
status: 'error',
|
|
113
|
+
message: err instanceof Error ? err.message : `Unsafe Jira base URL: ${base}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const auth = btoa(`${creds.accountEmail}:${creds.apiToken}`);
|
|
117
|
+
let res;
|
|
118
|
+
try {
|
|
119
|
+
res = await fetch(`${base}/rest/api/3/myself`, {
|
|
120
|
+
method: 'GET',
|
|
121
|
+
headers: {
|
|
122
|
+
authorization: `Basic ${auth}`,
|
|
123
|
+
accept: 'application/json',
|
|
124
|
+
'user-agent': USER_AGENT,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return {
|
|
130
|
+
source: 'jira',
|
|
131
|
+
ok: false,
|
|
132
|
+
status: 'unreachable',
|
|
133
|
+
message: `Couldn't reach ${base}. Check the site URL and network connectivity, then re-check.`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (res.status === 401) {
|
|
137
|
+
return {
|
|
138
|
+
source: 'jira',
|
|
139
|
+
ok: false,
|
|
140
|
+
status: 'auth_failed',
|
|
141
|
+
message: 'Jira rejected the account email or API token (401). Re-check the email and generate a fresh API token, then reconnect.',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (res.status === 403) {
|
|
145
|
+
return {
|
|
146
|
+
source: 'jira',
|
|
147
|
+
ok: false,
|
|
148
|
+
status: 'forbidden',
|
|
149
|
+
message: 'Jira authenticated the account but denied access (403). Confirm the account can view the project, then re-check.',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (!res.ok) {
|
|
153
|
+
const text = await res.text().catch(() => '');
|
|
154
|
+
return {
|
|
155
|
+
source: 'jira',
|
|
156
|
+
ok: false,
|
|
157
|
+
status: 'error',
|
|
158
|
+
message: `Jira returned ${res.status} for /myself: ${text.slice(0, 200)}`,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const me = (await res.json().catch(() => null));
|
|
162
|
+
return {
|
|
163
|
+
source: 'jira',
|
|
164
|
+
ok: true,
|
|
165
|
+
status: 'ready',
|
|
166
|
+
message: `Authenticated to ${base}.`,
|
|
167
|
+
detail: me?.displayName ? `Signed in as ${me.displayName}.` : null,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
87
170
|
async search(credentials, query) {
|
|
88
171
|
const base = credentials.baseUrl.replace(/\/+$/, '');
|
|
89
172
|
// Re-validate the stored base before fetching with the workspace's credentials
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JiraProvider.js","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,
|
|
1
|
+
{"version":3,"file":"JiraProvider.js","sourceRoot":"","sources":["../../../src/modules/tasks/JiraProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import type { TaskConnectionRecord, TaskConnectionRepository } from '@cat-factor
|
|
|
3
3
|
import type { TaskSourceSettingsRepository } from '@cat-factory/kernel';
|
|
4
4
|
import type { GitHubInstallationRepository } from '@cat-factory/kernel';
|
|
5
5
|
import type { TaskSourceRegistry } from '@cat-factory/kernel';
|
|
6
|
-
import type { TaskConnection, TaskSourceKind, TaskSourceState } from '@cat-factory/kernel';
|
|
6
|
+
import type { TaskConnection, TaskSourceDiagnostic, TaskSourceKind, TaskSourceState } from '@cat-factory/kernel';
|
|
7
7
|
import type { WorkspaceRepository } from '@cat-factory/kernel';
|
|
8
8
|
export interface TaskConnectionServiceDependencies {
|
|
9
9
|
taskConnectionRepository: TaskConnectionRepository;
|
|
@@ -33,6 +33,22 @@ export declare class TaskConnectionService {
|
|
|
33
33
|
listSourceStates(workspaceId: string): Promise<TaskSourceState[]>;
|
|
34
34
|
/** Whether a source can be used right now (drives the import gate + the UI toggle's enablement). */
|
|
35
35
|
private isAvailable;
|
|
36
|
+
/**
|
|
37
|
+
* Live "check setup" probe for a source: gate on availability first (a GitHub
|
|
38
|
+
* App must be installed, a credentialed source must be connected), then delegate
|
|
39
|
+
* the real authenticate-and-read check to the provider. The result classifies
|
|
40
|
+
* exactly what's wrong (not installed / not connected / auth failed / missing
|
|
41
|
+
* permission / unreachable) with an actionable message, so the panel can guide
|
|
42
|
+
* setup instead of just hiding behind "install integration first".
|
|
43
|
+
*/
|
|
44
|
+
diagnose(workspaceId: string, source: TaskSourceKind): Promise<TaskSourceDiagnostic>;
|
|
45
|
+
/**
|
|
46
|
+
* Run a provider's live `diagnose`, defending against a provider that lacks one
|
|
47
|
+
* (static "ready" verdict — availability was already confirmed above) or one
|
|
48
|
+
* that rejects despite the contract (mapped to a generic error rather than
|
|
49
|
+
* bubbling out of the check endpoint).
|
|
50
|
+
*/
|
|
51
|
+
private runProviderDiagnose;
|
|
36
52
|
/** The workspace's toggle for a source (defaults to enabled when no row exists). */
|
|
37
53
|
isEnabled(workspaceId: string, source: TaskSourceKind): Promise<boolean>;
|
|
38
54
|
/** Enable or disable a source for the workspace (the per-workspace toggle). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskConnectionService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"TaskConnectionService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAA;AACvE,OAAO,KAAK,EAAuC,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAClG,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,eAAe,EAChB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAQ9D,MAAM,WAAW,iCAAiC;IAChD,wBAAwB,EAAE,wBAAwB,CAAA;IAClD,0EAA0E;IAC1E,4BAA4B,EAAE,4BAA4B,CAAA;IAC1D,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,KAAK,EAAE,KAAK,CAAA;IACZ;;;;;OAKG;IACH,aAAa,CAAC,EAAE,4BAA4B,CAAA;CAC7C;AA+BD,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,iCAAiC,EAAI;IAExE;;;;;;OAMG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAatE;IAED,oGAAoG;YACtF,WAAW;IAWzB;;;;;;;OAOG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CzF;IAED;;;;;OAKG;YACW,mBAAmB;IAyBjC,oFAAoF;IAC9E,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAG7E;IAED,+EAA+E;IACzE,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F;IAED,gFAAgF;IAChF,OAAO,CAAC,eAAe;IAMvB,4DAA4D;IACtD,OAAO,CACX,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,cAAc,CAAC,CAsBzB;IAED,iFAAiF;IAC3E,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAG/F;IAED,iEAAiE;IAC3D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAGpE;IAED,gFAAgF;IAC1E,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAM/B;IAED,qEAAqE;IAC/D,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3E;CACF"}
|
|
@@ -62,6 +62,77 @@ export class TaskConnectionService {
|
|
|
62
62
|
}
|
|
63
63
|
return ((await this.deps.taskConnectionRepository.getByWorkspace(workspaceId, provider.kind)) !== null);
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Live "check setup" probe for a source: gate on availability first (a GitHub
|
|
67
|
+
* App must be installed, a credentialed source must be connected), then delegate
|
|
68
|
+
* the real authenticate-and-read check to the provider. The result classifies
|
|
69
|
+
* exactly what's wrong (not installed / not connected / auth failed / missing
|
|
70
|
+
* permission / unreachable) with an actionable message, so the panel can guide
|
|
71
|
+
* setup instead of just hiding behind "install integration first".
|
|
72
|
+
*/
|
|
73
|
+
async diagnose(workspaceId, source) {
|
|
74
|
+
const provider = this.deps.registry.get(source);
|
|
75
|
+
if (!provider) {
|
|
76
|
+
return {
|
|
77
|
+
source,
|
|
78
|
+
ok: false,
|
|
79
|
+
status: 'error',
|
|
80
|
+
message: `The ${source} task source isn't configured on this deployment.`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const label = provider.descriptor.label;
|
|
84
|
+
if (ridesGitHubApp(provider)) {
|
|
85
|
+
const installed = !!this.deps.installations &&
|
|
86
|
+
(await this.deps.installations.getByWorkspace(workspaceId)) !== null;
|
|
87
|
+
if (!installed) {
|
|
88
|
+
return {
|
|
89
|
+
source,
|
|
90
|
+
ok: false,
|
|
91
|
+
status: 'not_installed',
|
|
92
|
+
message: `${label} rides this workspace's GitHub App, which isn't installed yet. Install it under Integrations → GitHub, then re-check.`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return this.runProviderDiagnose(provider, { workspaceId, credentials: null }, label);
|
|
96
|
+
}
|
|
97
|
+
// Credentialed source (Jira, …): a connection must exist before we can probe.
|
|
98
|
+
const connection = await this.deps.taskConnectionRepository.getByWorkspace(workspaceId, source);
|
|
99
|
+
if (!connection) {
|
|
100
|
+
return {
|
|
101
|
+
source,
|
|
102
|
+
ok: false,
|
|
103
|
+
status: 'not_connected',
|
|
104
|
+
message: `${label} isn't connected yet. Connect it with an account email and API token, then re-check.`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return this.runProviderDiagnose(provider, { workspaceId, credentials: connection.credentials }, label);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Run a provider's live `diagnose`, defending against a provider that lacks one
|
|
111
|
+
* (static "ready" verdict — availability was already confirmed above) or one
|
|
112
|
+
* that rejects despite the contract (mapped to a generic error rather than
|
|
113
|
+
* bubbling out of the check endpoint).
|
|
114
|
+
*/
|
|
115
|
+
async runProviderDiagnose(provider, input, label) {
|
|
116
|
+
if (!provider.diagnose) {
|
|
117
|
+
return {
|
|
118
|
+
source: provider.kind,
|
|
119
|
+
ok: true,
|
|
120
|
+
status: 'ready',
|
|
121
|
+
message: `${label} is configured.`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
return await provider.diagnose(input);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return {
|
|
129
|
+
source: provider.kind,
|
|
130
|
+
ok: false,
|
|
131
|
+
status: 'error',
|
|
132
|
+
message: `${label} check failed unexpectedly: ${err instanceof Error ? err.message : String(err)}`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
65
136
|
/** The workspace's toggle for a source (defaults to enabled when no row exists). */
|
|
66
137
|
async isEnabled(workspaceId, source) {
|
|
67
138
|
const row = await this.deps.taskSourceSettingsRepository.get(workspaceId, source);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskConnectionService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TaskConnectionService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskConnectionService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Clock } from '@cat-factory/kernel';
|
|
1
|
+
import type { Clock, TaskSearchRepoScope } from '@cat-factory/kernel';
|
|
2
2
|
import type { TaskSourceRegistry } from '@cat-factory/kernel';
|
|
3
3
|
import type { TaskRecord, TaskRepository } from '@cat-factory/kernel';
|
|
4
4
|
import type { SourceTask, TaskSearchResult, TaskSourceKind } from '@cat-factory/kernel';
|
|
@@ -32,8 +32,12 @@ export declare class TaskImportService {
|
|
|
32
32
|
* provider authenticates with the workspace's stored credentials and builds/
|
|
33
33
|
* parses the source-specific query. Throws if the source can't search (no
|
|
34
34
|
* provider `search`), so the controller can answer cleanly.
|
|
35
|
+
*
|
|
36
|
+
* `scope` (resolved by the controller from the search's originating block) pins
|
|
37
|
+
* a repo-backed source to one repository; the provider ignores it when the
|
|
38
|
+
* source has no repo notion.
|
|
35
39
|
*/
|
|
36
|
-
search(workspaceId: string, source: TaskSourceKind, query: string): Promise<TaskSearchResult[]>;
|
|
40
|
+
search(workspaceId: string, source: TaskSourceKind, query: string, scope?: TaskSearchRepoScope): Promise<TaskSearchResult[]>;
|
|
37
41
|
/** Every issue imported into the workspace, across sources, as wire shapes. */
|
|
38
42
|
listTasks(workspaceId: string): Promise<SourceTask[]>;
|
|
39
43
|
/** Resolve a stored task record or throw if not imported. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskImportService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"TaskImportService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,KAAK,EAAuC,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AASvE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,iBAAiB,EAAE,qBAAqB,CAAA;IACxC,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,KAAK,EAAE,KAAK,CAAA;CACb;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAiB3D;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,6BAA6B,EAAI;IAEpE,OAAO,CAAC,eAAe;IAMvB;;;;;;OAMG;YACW,kBAAkB;IAahC,mFAAmF;IAC7E,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgC1F;IAED;;;;;;;;;OASG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,mBAAmB,GAC1B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAQ7B;IAED,+EAA+E;IACzE,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAG1D;IAED,6DAA6D;IACvD,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,CAAC,CAMrB;CACF"}
|
|
@@ -85,15 +85,19 @@ export class TaskImportService {
|
|
|
85
85
|
* provider authenticates with the workspace's stored credentials and builds/
|
|
86
86
|
* parses the source-specific query. Throws if the source can't search (no
|
|
87
87
|
* provider `search`), so the controller can answer cleanly.
|
|
88
|
+
*
|
|
89
|
+
* `scope` (resolved by the controller from the search's originating block) pins
|
|
90
|
+
* a repo-backed source to one repository; the provider ignores it when the
|
|
91
|
+
* source has no repo notion.
|
|
88
92
|
*/
|
|
89
|
-
async search(workspaceId, source, query) {
|
|
93
|
+
async search(workspaceId, source, query, scope) {
|
|
90
94
|
await requireWorkspace(this.deps.workspaceRepository, workspaceId);
|
|
91
95
|
const provider = this.requireProvider(source);
|
|
92
96
|
if (!provider.search) {
|
|
93
97
|
throw new ValidationError(`The ${source} source does not support search`);
|
|
94
98
|
}
|
|
95
99
|
const credentials = await this.resolveCredentials(workspaceId, source, provider);
|
|
96
|
-
return provider.search(credentials, query, workspaceId);
|
|
100
|
+
return provider.search(credentials, query, workspaceId, scope);
|
|
97
101
|
}
|
|
98
102
|
/** Every issue imported into the workspace, across sources, as wire shapes. */
|
|
99
103
|
async listTasks(workspaceId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskImportService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TaskImportService.js","sourceRoot":"","sources":["../../../src/modules/tasks/TaskImportService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TaskSourceDescriptor } from '@cat-factory/kernel';
|
|
1
|
+
import type { TaskSearchRepoScope, TaskSourceDescriptor } from '@cat-factory/kernel';
|
|
2
2
|
/**
|
|
3
3
|
* What the connect UI renders. GitHub issues piggyback on the workspace's
|
|
4
4
|
* existing GitHub App installation, so there are NO credential fields — the
|
|
@@ -32,4 +32,23 @@ export interface GitHubIssueExternalId {
|
|
|
32
32
|
export declare function parseGitHubIssueExternalId(externalId: string): GitHubIssueExternalId | null;
|
|
33
33
|
/** The canonical web URL for an issue external id. */
|
|
34
34
|
export declare function githubIssueUrl(id: GitHubIssueExternalId): string;
|
|
35
|
+
/**
|
|
36
|
+
* Build the GitHub issue-search text, scoping it to a single repo when a service's
|
|
37
|
+
* repo is known. The `repo:owner/name` qualifier keeps hits from leaking in from
|
|
38
|
+
* sibling repositories the installation can also see; the adapter appends
|
|
39
|
+
* `is:issue`, so this returns only the user's text plus the optional scope.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildGitHubIssueSearchQuery(query: string, scope?: TaskSearchRepoScope): string;
|
|
42
|
+
/**
|
|
43
|
+
* Resolve raw search input that names ONE specific issue (rather than free text)
|
|
44
|
+
* into its canonical `owner/repo#number` external id, so the caller can fetch it
|
|
45
|
+
* and surface it as the exact match instead of a fuzzy search hit. Two forms:
|
|
46
|
+
* 1. An explicit reference — a full issue URL, the `owner/repo/issues/n` path, or
|
|
47
|
+
* the `owner/repo#n` shorthand — parsed verbatim (its own repo wins, even if
|
|
48
|
+
* it differs from `scope`, so a pasted URL points at the actual issue).
|
|
49
|
+
* 2. A bare issue number (`11`) — resolved against `scope` (the service's repo),
|
|
50
|
+
* which is the only way to know which repo a lone number belongs to.
|
|
51
|
+
* Returns null when the input is neither (treat it as free-text search).
|
|
52
|
+
*/
|
|
53
|
+
export declare function detectExactGitHubIssueRef(query: string, scope?: TaskSearchRepoScope): string | null;
|
|
35
54
|
//# sourceMappingURL=github-issues.logic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-issues.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/github-issues.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"github-issues.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/github-issues.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAUpF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,oBAQtC,CAAA;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,qBAAqB,GAAG,MAAM,CAEvE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShE;AAED,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAI3F;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,EAAE,EAAE,qBAAqB,GAAG,MAAM,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAK9F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,mBAAmB,GAC1B,MAAM,GAAG,IAAI,CAQf"}
|
|
@@ -64,4 +64,38 @@ export function parseGitHubIssueExternalId(externalId) {
|
|
|
64
64
|
export function githubIssueUrl(id) {
|
|
65
65
|
return `https://github.com/${id.owner}/${id.repo}/issues/${id.number}`;
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Build the GitHub issue-search text, scoping it to a single repo when a service's
|
|
69
|
+
* repo is known. The `repo:owner/name` qualifier keeps hits from leaking in from
|
|
70
|
+
* sibling repositories the installation can also see; the adapter appends
|
|
71
|
+
* `is:issue`, so this returns only the user's text plus the optional scope.
|
|
72
|
+
*/
|
|
73
|
+
export function buildGitHubIssueSearchQuery(query, scope) {
|
|
74
|
+
const text = query.trim();
|
|
75
|
+
if (!scope)
|
|
76
|
+
return text;
|
|
77
|
+
const repoQualifier = `repo:${scope.owner}/${scope.repo}`;
|
|
78
|
+
return text ? `${repoQualifier} ${text}` : repoQualifier;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve raw search input that names ONE specific issue (rather than free text)
|
|
82
|
+
* into its canonical `owner/repo#number` external id, so the caller can fetch it
|
|
83
|
+
* and surface it as the exact match instead of a fuzzy search hit. Two forms:
|
|
84
|
+
* 1. An explicit reference — a full issue URL, the `owner/repo/issues/n` path, or
|
|
85
|
+
* the `owner/repo#n` shorthand — parsed verbatim (its own repo wins, even if
|
|
86
|
+
* it differs from `scope`, so a pasted URL points at the actual issue).
|
|
87
|
+
* 2. A bare issue number (`11`) — resolved against `scope` (the service's repo),
|
|
88
|
+
* which is the only way to know which repo a lone number belongs to.
|
|
89
|
+
* Returns null when the input is neither (treat it as free-text search).
|
|
90
|
+
*/
|
|
91
|
+
export function detectExactGitHubIssueRef(query, scope) {
|
|
92
|
+
const trimmed = query.trim();
|
|
93
|
+
const ref = parseGitHubIssueRef(trimmed);
|
|
94
|
+
if (ref)
|
|
95
|
+
return ref;
|
|
96
|
+
if (scope && /^\d+$/.test(trimmed)) {
|
|
97
|
+
return githubIssueExternalId({ owner: scope.owner, repo: scope.repo, number: Number(trimmed) });
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
67
101
|
//# sourceMappingURL=github-issues.logic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-issues.logic.js","sourceRoot":"","sources":["../../../src/modules/tasks/github-issues.logic.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,iFAAiF;AACjF,kFAAkF;AAClF,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,6BAA6B;AAE7B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAyB;IAC5D,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,eAAe;IACtB,IAAI,EAAE,iBAAiB;IACvB,gBAAgB,EAAE,EAAE;IACpB,QAAQ,EAAE,gCAAgC;IAC1C,cAAc,EAAE,4DAA4D;IAC5E,UAAU,EAAE,IAAI;CACjB,CAAA;AAED,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,EAAyB;IAC7D,OAAO,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,CAAA;AAC9C,CAAC;AAED,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,GAAG,GAAG,iBAAiB,CAAA;AAE7B;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAA;IACrF,IAAI,GAAG;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAA;IAC3E,IAAI,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,CAAA;IACrE,IAAI,KAAK;QAAE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACvD,OAAO,IAAI,CAAA;AACb,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAAkB;IAC3D,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,CAAA;IACpE,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACnB,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC5D,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAAC,EAAyB;IACtD,OAAO,sBAAsB,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,EAAE,CAAA;AACxE,CAAC"}
|
|
1
|
+
{"version":3,"file":"github-issues.logic.js","sourceRoot":"","sources":["../../../src/modules/tasks/github-issues.logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,4 +9,11 @@ export declare class MapTaskSourceRegistry extends MapSourceRegistry<TaskSourceK
|
|
|
9
9
|
}
|
|
10
10
|
/** A short plain-text excerpt of an issue: its summary + the start of its description. */
|
|
11
11
|
export declare function buildTaskExcerpt(content: TaskContent | TaskRecord, max?: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Read a numeric HTTP status off a thrown error, if it carries one. Both the
|
|
14
|
+
* GitHub (`GitHubApiError`) and Jira (`JiraApiError`) clients expose a `status`
|
|
15
|
+
* field; the setup-check probes duck-type it (rather than importing those classes
|
|
16
|
+
* across the layer boundary) to classify auth/permission/transport failures.
|
|
17
|
+
*/
|
|
18
|
+
export declare function httpStatusOf(err: unknown): number | null;
|
|
12
19
|
//# sourceMappingURL=tasks.logic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/tasks.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAgC,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAErF,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAQvD,4EAA4E;AAC5E,qBAAa,qBACX,SAAQ,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,CAC5D,YAAW,kBAAkB;CAAG;AAElC,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,GAAG,SAAM,GAAG,MAAM,CAIrF"}
|
|
1
|
+
{"version":3,"file":"tasks.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/tasks.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAgC,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAErF,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAQvD,4EAA4E;AAC5E,qBAAa,qBACX,SAAQ,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,CAC5D,YAAW,kBAAkB;CAAG;AAElC,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,GAAG,SAAM,GAAG,MAAM,CAIrF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMxD"}
|
|
@@ -14,4 +14,18 @@ export function buildTaskExcerpt(content, max = 280) {
|
|
|
14
14
|
const lead = description ? `${content.title} — ${description}` : content.title;
|
|
15
15
|
return buildExcerpt(lead, max);
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Read a numeric HTTP status off a thrown error, if it carries one. Both the
|
|
19
|
+
* GitHub (`GitHubApiError`) and Jira (`JiraApiError`) clients expose a `status`
|
|
20
|
+
* field; the setup-check probes duck-type it (rather than importing those classes
|
|
21
|
+
* across the layer boundary) to classify auth/permission/transport failures.
|
|
22
|
+
*/
|
|
23
|
+
export function httpStatusOf(err) {
|
|
24
|
+
if (err && typeof err === 'object' && 'status' in err) {
|
|
25
|
+
const status = err.status;
|
|
26
|
+
if (typeof status === 'number')
|
|
27
|
+
return status;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
17
31
|
//# sourceMappingURL=tasks.logic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.logic.js","sourceRoot":"","sources":["../../../src/modules/tasks/tasks.logic.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,0EAA0E;AAC1E,gFAAgF;AAChF,kFAAkF;AAClF,yEAAyE;AACzE,sEAAsE;AAEtE,4EAA4E;AAC5E,MAAM,OAAO,qBACX,SAAQ,iBAAqD;CAC7B;AAElC,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,OAAiC,EAAE,GAAG,GAAG,GAAG;IAC3E,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAA;IAC9E,OAAO,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAChC,CAAC"}
|
|
1
|
+
{"version":3,"file":"tasks.logic.js","sourceRoot":"","sources":["../../../src/modules/tasks/tasks.logic.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,0EAA0E;AAC1E,gFAAgF;AAChF,kFAAkF;AAClF,yEAAyE;AACzE,sEAAsE;AAEtE,4EAA4E;AAC5E,MAAM,OAAO,qBACX,SAAQ,iBAAqD;CAC7B;AAElC,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,OAAiC,EAAE,GAAG,GAAG,GAAG;IAC3E,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAA;IAC9E,OAAO,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;QACtD,MAAM,MAAM,GAAI,GAA2B,CAAC,MAAM,CAAA;QAClD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAA;IAC/C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/integrations",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "External-system integration domain logic for the Agent Architecture Board (GitHub, documents, tasks, environments, runners).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"ai": "^6.0.209",
|
|
28
|
-
"@cat-factory/contracts": "0.
|
|
29
|
-
"@cat-factory/kernel": "0.
|
|
28
|
+
"@cat-factory/contracts": "0.16.0",
|
|
29
|
+
"@cat-factory/kernel": "0.15.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"typescript": "7.0.1-rc",
|