@cat-factory/integrations 0.10.4 → 0.11.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 +24 -1
- package/dist/modules/tasks/GitHubIssuesProvider.d.ts.map +1 -1
- package/dist/modules/tasks/GitHubIssuesProvider.js +98 -0
- 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/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 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). */
|
|
@@ -39,6 +39,29 @@ export declare class GitHubIssuesProvider implements TaskSourceProvider {
|
|
|
39
39
|
* Credentials are unused (the App authenticates), matching `fetchTask`.
|
|
40
40
|
*/
|
|
41
41
|
search(_credentials: TaskCredentials, query: string, workspaceId: string): Promise<TaskSearchResult[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Live setup check: confirm the workspace's App installation can actually read
|
|
44
|
+
* issues. Three escalating probes, each isolating a distinct failure:
|
|
45
|
+
* 1. `getInstallation` — validates the App's own credentials (id + key).
|
|
46
|
+
* 2. `listInstallationRepos` — mints the installation token (catches a
|
|
47
|
+
* suspended/revoked install) and yields a concrete repo to probe.
|
|
48
|
+
* 3. `listIssues` on that repo — the only call that needs the **Issues**
|
|
49
|
+
* permission, so a 403 here pinpoints the most common GitHub-App
|
|
50
|
+
* misconfiguration (Issues access not granted).
|
|
51
|
+
* Credentials are ignored — GitHub Issues rides the App, keyed on `workspaceId`.
|
|
52
|
+
*/
|
|
53
|
+
diagnose(input: {
|
|
54
|
+
workspaceId: string;
|
|
55
|
+
credentials: TaskCredentials | null;
|
|
56
|
+
}): Promise<TaskSourceDiagnostic>;
|
|
57
|
+
/**
|
|
58
|
+
* Map a GitHub client failure onto a setup diagnostic. 401 ⇒ the App key/JWT was
|
|
59
|
+
* rejected; 403 ⇒ authenticated but lacking a scope (when raised by the issues
|
|
60
|
+
* probe, that's the Issues permission specifically); a missing status ⇒ the host
|
|
61
|
+
* couldn't be reached. `permission` tags the issues-read probe so the 403 hint
|
|
62
|
+
* names the exact permission to grant.
|
|
63
|
+
*/
|
|
64
|
+
private classifyGitHubError;
|
|
42
65
|
/**
|
|
43
66
|
* Find the GitHub App installation whose account owns `owner`. The
|
|
44
67
|
* 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,EACjB,KAAK,4BAA4B,EACjC,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"GitHubIssuesProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/GitHubIssuesProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,4BAA4B,EACjC,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,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;;;;;;OAMG;IACG,MAAM,CACV,YAAY,EAAE,eAAe,EAC7B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAsB7B;IAED;;;;;;;;;;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';
|
|
@@ -74,6 +75,103 @@ export class GitHubIssuesProvider {
|
|
|
74
75
|
}
|
|
75
76
|
return out.slice(0, 20);
|
|
76
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Live setup check: confirm the workspace's App installation can actually read
|
|
80
|
+
* issues. Three escalating probes, each isolating a distinct failure:
|
|
81
|
+
* 1. `getInstallation` — validates the App's own credentials (id + key).
|
|
82
|
+
* 2. `listInstallationRepos` — mints the installation token (catches a
|
|
83
|
+
* suspended/revoked install) and yields a concrete repo to probe.
|
|
84
|
+
* 3. `listIssues` on that repo — the only call that needs the **Issues**
|
|
85
|
+
* permission, so a 403 here pinpoints the most common GitHub-App
|
|
86
|
+
* misconfiguration (Issues access not granted).
|
|
87
|
+
* Credentials are ignored — GitHub Issues rides the App, keyed on `workspaceId`.
|
|
88
|
+
*/
|
|
89
|
+
async diagnose(input) {
|
|
90
|
+
const installation = await this.deps.installations.getByWorkspace(input.workspaceId);
|
|
91
|
+
if (!installation) {
|
|
92
|
+
return {
|
|
93
|
+
source: 'github',
|
|
94
|
+
ok: false,
|
|
95
|
+
status: 'not_installed',
|
|
96
|
+
message: "This workspace's GitHub App isn't installed. Install it under Integrations → GitHub.",
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const id = installation.installationId;
|
|
100
|
+
try {
|
|
101
|
+
await this.deps.githubClient.getInstallation(id);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
return this.classifyGitHubError(err, 'validating the GitHub App credentials');
|
|
105
|
+
}
|
|
106
|
+
let repoCount = 0;
|
|
107
|
+
let probeRef = null;
|
|
108
|
+
try {
|
|
109
|
+
const repos = await this.deps.githubClient.listInstallationRepos(id);
|
|
110
|
+
repoCount = repos.items.length;
|
|
111
|
+
const first = repos.items[0];
|
|
112
|
+
if (first)
|
|
113
|
+
probeRef = { owner: first.owner, repo: first.name };
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
return this.classifyGitHubError(err, 'listing the repositories the App can access');
|
|
117
|
+
}
|
|
118
|
+
if (probeRef) {
|
|
119
|
+
try {
|
|
120
|
+
await this.deps.githubClient.listIssues(id, probeRef);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return this.classifyGitHubError(err, `reading issues on ${probeRef.owner}/${probeRef.repo}`, true);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
source: 'github',
|
|
128
|
+
ok: true,
|
|
129
|
+
status: 'ready',
|
|
130
|
+
message: `Connected via the GitHub App on ${installation.accountLogin}.`,
|
|
131
|
+
detail: repoCount > 0
|
|
132
|
+
? `${repoCount} repositor${repoCount === 1 ? 'y' : 'ies'} accessible.`
|
|
133
|
+
: 'No repositories are shared with the App yet — grant it access to a repo to link its issues.',
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Map a GitHub client failure onto a setup diagnostic. 401 ⇒ the App key/JWT was
|
|
138
|
+
* rejected; 403 ⇒ authenticated but lacking a scope (when raised by the issues
|
|
139
|
+
* probe, that's the Issues permission specifically); a missing status ⇒ the host
|
|
140
|
+
* couldn't be reached. `permission` tags the issues-read probe so the 403 hint
|
|
141
|
+
* names the exact permission to grant.
|
|
142
|
+
*/
|
|
143
|
+
classifyGitHubError(err, whileDoing, permission = false) {
|
|
144
|
+
const status = httpStatusOf(err);
|
|
145
|
+
const base = { source: 'github', ok: false };
|
|
146
|
+
if (status === 401) {
|
|
147
|
+
return {
|
|
148
|
+
...base,
|
|
149
|
+
status: 'auth_failed',
|
|
150
|
+
message: `GitHub rejected the App credentials while ${whileDoing}. Re-check the App id and private key, then reconnect the installation.`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (status === 403) {
|
|
154
|
+
return {
|
|
155
|
+
...base,
|
|
156
|
+
status: 'forbidden',
|
|
157
|
+
message: permission
|
|
158
|
+
? "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."
|
|
159
|
+
: `GitHub denied access (403) while ${whileDoing}. The App is missing a required permission — review its installed permissions, then re-check.`,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
if (status === null) {
|
|
163
|
+
return {
|
|
164
|
+
...base,
|
|
165
|
+
status: 'unreachable',
|
|
166
|
+
message: `Couldn't reach GitHub while ${whileDoing}. Check network/API connectivity, then re-check.`,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
...base,
|
|
171
|
+
status: 'error',
|
|
172
|
+
message: `GitHub returned ${status} while ${whileDoing}: ${err instanceof Error ? err.message : String(err)}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
77
175
|
/**
|
|
78
176
|
* Find the GitHub App installation whose account owns `owner`. The
|
|
79
177
|
* 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":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,GAQf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAE5C,+EAA+E;AAC/E,iFAAiF;AACjF,8EAA8E;AAC9E,gFAAgF;AAChF,kFAAkF;AAClF,mFAAmF;AACnF,4DAA4D;AAC5D,EAAE;AACF,mFAAmF;AACnF,kFAAkF;AAClF,iFAAiF;AAEjF,MAAM,UAAU,GAAG,aAAa,CAAA;AAEhC,yEAAyE;AACzE,MAAM,OAAO,YAAa,SAAQ,KAAK;IAE1B,MAAM;IADjB,YACW,MAAc,EACvB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;sBAHL,MAAM;QAIf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF;AAsBD,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,MAAe,CAAA;IACtB,UAAU,GAAG,eAAe,CAAA;IAErC,mBAAmB,CAAC,KAAsB;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;QACxC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,CAAA;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAA;QACvC,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,eAAe,CAAC,uDAAuD,CAAC,CAAA;QACpF,CAAC;QACD,MAAM,OAAO,GAAG,cAAc,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAA;QACpE,oEAAoE;QACpE,8DAA8D;QAC9D,cAAc,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAA;QAClD,OAAO;YACL,WAAW,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE;YAChD,KAAK,EAAE,OAAO;SACf,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,WAA4B,EAAE,UAAkB;QAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,uEAAuE,CAAA;QACtF,MAAM,GAAG,GAAG,GAAG,IAAI,qBAAqB,kBAAkB,CAAC,UAAU,CAAC,WAAW,MAAM,EAAE,CAAA;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;QAExE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,IAAI,EAAE;gBAC9B,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,UAAU;aACzB;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;YAC7C,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QAC9F,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAyB,CAAA;QACzE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,8CAA8C,UAAU,EAAE,CAAC,CAAA;QACzF,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QACrB,MAAM,QAAQ,GAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE;YACnC,SAAS,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YAC1B,IAAI,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;SACtC,CAAC,CAAC,CAAA;QAEH,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,GAAG;YACpB,GAAG,EAAE,GAAG,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE;YACjC,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,YAAY;YAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE;YAC5B,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE;YAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,IAAI,IAAI;YACzC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI;YAClC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC/C,WAAW,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;YACnD,QAAQ;SACT,CAAA;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CAAC,KAGd;QACC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAA;QAC/B,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9D,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,eAAe;gBACvB,OAAO,EAAE,kFAAkF;aAC5F,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC;YACH,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,IAAI,EAAE;aAC9E,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5D,IAAI,GAAa,CAAA;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,oBAAoB,EAAE;gBAC7C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,aAAa,EAAE,SAAS,IAAI,EAAE;oBAC9B,MAAM,EAAE,kBAAkB;oBAC1B,YAAY,EAAE,UAAU;iBACzB;aACF,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE,kBAAkB,IAAI,+DAA+D;aAC/F,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,aAAa;gBACrB,OAAO,EACL,wHAAwH;aAC3H,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,WAAW;gBACnB,OAAO,EACL,kHAAkH;aACrH,CAAA;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;YAC7C,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,iBAAiB,GAAG,CAAC,MAAM,iBAAiB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aAC1E,CAAA;QACH,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAoC,CAAA;QAClF,OAAO;YACL,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,oBAAoB,IAAI,GAAG;YACpC,MAAM,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI;SACnE,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAA4B,EAAE,KAAa;QACtD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACrD,+EAA+E;QAC/E,2EAA2E;QAC3E,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;QACnE,+EAA+E;QAC/E,+EAA+E;QAC/E,0EAA0E;QAC1E,MAAM,GAAG,GAAG,GAAG,IAAI,8BAA8B,GAAG,sCAAsC,CAAA;QAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;QAExE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,IAAI,EAAE;gBAC9B,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,UAAU;aACzB;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;YAC7C,MAAM,IAAI,YAAY,CACpB,GAAG,CAAC,MAAM,EACV,eAAe,GAAG,MAAM,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC5D,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC/C,OAAO,SAAS,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrD,CAAC;CACF"}
|
|
@@ -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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"}
|
|
@@ -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.11.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.15.0",
|
|
29
|
+
"@cat-factory/kernel": "0.14.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"typescript": "7.0.1-rc",
|