@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunnerPoolConnectionService.d.ts","sourceRoot":"","sources":["../../../src/modules/runners/RunnerPoolConnectionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"RunnerPoolConnectionService.d.ts","sourceRoot":"","sources":["../../../src/modules/runners/RunnerPoolConnectionService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAExD,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAC/B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,6BAA6B,EAC9B,MAAM,qBAAqB,CAAA;AAG5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAejE,MAAM,WAAW,uCAAuC;IACtD,8BAA8B,EAAE,8BAA8B,CAAA;IAC9D,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,YAAY,EAAE,YAAY,CAAA;IAC1B,KAAK,EAAE,KAAK,CAAA;IACZ,gFAAgF;IAChF,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,gFAAgF;IAChF,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,4FAA4F;AAC5F,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,eAAe,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,2BAA2B;IAG1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAE5B,YAA6B,IAAI,EAAE,uCAAuC,EAEzE;IAED,+EAA+E;IAC/E,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,QAAQ;IAMhB,sFAAsF;IACtF,OAAO,CAAC,aAAa;IASrB,0DAA0D;IACpD,QAAQ,CACZ,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE;QAAE,MAAM,EAAE,mBAAmB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GACtE,OAAO,CAAC,oBAAoB,CAAC,CAwC/B;IAED,sEAAsE;IAChE,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAW/B;IAED;;;;;;;;;;;;OAYG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiEtF;IAED;;;;;;;;OAQG;IACG,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAa/B;IAED,mEAAmE;IAC7D,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAK7E;IAED;;;;OAIG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzD;IAED,+EAA+E;IACzE,iBAAiB,CACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,MAAM,EAAE,0BAA0B,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAA;KAAE,CAAC,CAO9E;IAED;;;;;OAKG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAYxE;IAED,uDAAuD;IACjD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInD;YAEa,cAAc;IAQ5B,OAAO,CAAC,YAAY;IAmBpB,iFAAiF;IACjF,OAAO,CAAC,WAAW;CAOpB"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { noopLogger } from '@cat-factory/kernel';
|
|
1
2
|
import { ConflictError, ValidationError } from '@cat-factory/kernel';
|
|
2
3
|
import { requireWorkspace } from '@cat-factory/kernel';
|
|
3
4
|
import { missingRequiredConfigKeys } from '../environments/environments.logic.js';
|
|
4
5
|
export class RunnerPoolConnectionService {
|
|
5
6
|
deps;
|
|
7
|
+
log;
|
|
6
8
|
constructor(deps) {
|
|
7
9
|
this.deps = deps;
|
|
10
|
+
this.log = deps.logger ?? noopLogger;
|
|
8
11
|
}
|
|
9
12
|
/** The per-call context a backend provider needs to build/test a transport. */
|
|
10
13
|
context(resolveSecret) {
|
|
@@ -54,6 +57,19 @@ export class RunnerPoolConnectionService {
|
|
|
54
57
|
deletedAt: null,
|
|
55
58
|
};
|
|
56
59
|
await this.deps.runnerPoolConnectionRepository.upsert(record);
|
|
60
|
+
// Each gap the provider reports costs a recovery/cleanup path that is otherwise invisible
|
|
61
|
+
// until an incident (a release-less manifest leaks a runner on every cancelled run). Log it
|
|
62
|
+
// at REGISTRATION rather than per dispatch, where `resolve()` would re-emit the same line
|
|
63
|
+
// for every job. This is the deployment-operator's copy; the person who pasted the config
|
|
64
|
+
// sees the same gaps on their connection test, which is the surface they are looking at.
|
|
65
|
+
for (const warning of provider.warnings?.(config) ?? []) {
|
|
66
|
+
this.log.warn(`Runner backend registered with a gap: ${warning.message}`, {
|
|
67
|
+
workspaceId,
|
|
68
|
+
kind: config.kind,
|
|
69
|
+
providerId: meta.providerId,
|
|
70
|
+
warning: warning.code,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
57
73
|
return this.toConnection(record, Object.keys(input.secrets));
|
|
58
74
|
}
|
|
59
75
|
/** Rotate/replace the secret bundle without re-sending the config. */
|
|
@@ -144,15 +160,26 @@ export class RunnerPoolConnectionService {
|
|
|
144
160
|
: {}),
|
|
145
161
|
};
|
|
146
162
|
}
|
|
147
|
-
/**
|
|
163
|
+
/**
|
|
164
|
+
* Probe a candidate backend connection before saving (nothing is persisted), and report the
|
|
165
|
+
* config's non-fatal gaps alongside the probe.
|
|
166
|
+
*
|
|
167
|
+
* The gaps ride the test rather than a surface of their own because this is the one moment
|
|
168
|
+
* the operator is looking at THIS config, and they are the same person who can fix it. They
|
|
169
|
+
* are independent of `ok`: a manifest with no `release` template connects perfectly well and
|
|
170
|
+
* still leaks a runner on every cancelled run.
|
|
171
|
+
*/
|
|
148
172
|
async testConnection(workspaceId, input) {
|
|
149
173
|
await requireWorkspace(this.deps.workspaceRepository, workspaceId);
|
|
150
174
|
if (!input.config)
|
|
151
175
|
return { ok: true, message: 'Nothing to test.' };
|
|
152
|
-
const
|
|
153
|
-
provider.
|
|
176
|
+
const config = input.config;
|
|
177
|
+
const provider = this.provider(config.kind);
|
|
178
|
+
provider.assertConfigSafe(config, this.safetyOptions());
|
|
154
179
|
const secrets = input.secrets ?? {};
|
|
155
|
-
|
|
180
|
+
const result = await provider.testConnection(config, this.context((key) => secrets[key]));
|
|
181
|
+
const warnings = provider.warnings?.(config) ?? [];
|
|
182
|
+
return warnings.length ? { ...result, warnings } : result;
|
|
156
183
|
}
|
|
157
184
|
/** The workspace's current connection (safe metadata), or null. */
|
|
158
185
|
async getConnection(workspaceId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RunnerPoolConnectionService.js","sourceRoot":"","sources":["../../../src/modules/runners/RunnerPoolConnectionService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RunnerPoolConnectionService.js","sourceRoot":"","sources":["../../../src/modules/runners/RunnerPoolConnectionService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConnectionTestResult, ProviderConfigField, RunnerBackendConfig, RunnerPoolProvider, RunnerTransport, SecretResolver, UrlSafetyPolicy } from '@cat-factory/kernel';
|
|
1
|
+
import type { ConnectionTestResult, ConnectionWarning, ProviderConfigField, RunnerBackendConfig, RunnerPoolProvider, RunnerTransport, SecretResolver, UrlSafetyPolicy } from '@cat-factory/kernel';
|
|
2
2
|
import { kubernetesRunnerBackend } from '../kubernetes/kubernetes-runner-backend.js';
|
|
3
3
|
/** Per-call dependencies a provider may need to build/test its transport. */
|
|
4
4
|
export interface RunnerBackendContext {
|
|
@@ -67,6 +67,14 @@ export interface RunnerBackendProvider {
|
|
|
67
67
|
};
|
|
68
68
|
/** Validate the config at the write boundary (SSRF / URL + runtime safety). Throws if unsafe. */
|
|
69
69
|
assertConfigSafe(config: RunnerBackendConfig, opts?: RunnerBackendSafetyOptions): void;
|
|
70
|
+
/**
|
|
71
|
+
* Non-fatal gaps in an otherwise-valid config: logged once at registration AND returned on
|
|
72
|
+
* the connection test, which is where the operator actually sees them (a deployment log line
|
|
73
|
+
* reaches whoever reads logs, not whoever pasted the config). A backend describes its own
|
|
74
|
+
* gaps because only it can read its config shape — the connection service stays
|
|
75
|
+
* kind-agnostic. Absent ⇒ this backend reports none.
|
|
76
|
+
*/
|
|
77
|
+
warnings?(config: RunnerBackendConfig): ConnectionWarning[];
|
|
70
78
|
/** Build the live transport the execution engine dispatches/polls/releases through. */
|
|
71
79
|
buildTransport(config: RunnerBackendConfig, ctx: RunnerBackendContext): RunnerTransport;
|
|
72
80
|
/** Probe the backend without persisting anything. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-backends.d.ts","sourceRoot":"","sources":["../../../src/modules/runners/runner-backends.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,eAAe,EAChB,MAAM,qBAAqB,CAAA;AAK5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAA;
|
|
1
|
+
{"version":3,"file":"runner-backends.d.ts","sourceRoot":"","sources":["../../../src/modules/runners/runner-backends.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,eAAe,EAChB,MAAM,qBAAqB,CAAA;AAK5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAA;AA4BpF,6EAA6E;AAC7E,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,cAAc,CAAA;IAC7B,sFAAsF;IACtF,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CACxC;AAED,0FAA0F;AAC1F,UAAU,0BAA0B;IAClC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,UAAU,iBAAiB;IACzB,MAAM,IAAI,mBAAmB,EAAE,CAAA;IAC/B,QAAQ,IAAI,mBAAmB,CAAA;IAC/B,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtE;AAED,MAAM,WAAW,qBAAqB;IAGpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACjC,yFAAyF;IACzF,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAAA;IAC3D,6EAA6E;IAC7E,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG;QAC3C,UAAU,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,iGAAiG;IACjG,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAA;IACtF;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,MAAM,EAAE,mBAAmB,GAAG,iBAAiB,EAAE,CAAA;IAC3D,uFAAuF;IACvF,cAAc,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,oBAAoB,GAAG,eAAe,CAAA;IACvF,qDAAqD;IACrD,cAAc,CACZ,MAAM,EAAE,mBAAmB,EAC3B,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAAA;CACjC;AAED;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA2C;IAE/D,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAG9C;IAED,uEAAuE;IACvE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAEnD;IAED,+EAA+E;IAC/E,KAAK,IAAI,MAAM,EAAE,CAEhB;IAED;;;OAGG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAE5C;CACF;AAED,kFAAkF;AAClF,wBAAgB,4BAA4B,IAAI,qBAAqB,CAIpE;AASD,eAAO,MAAM,qBAAqB,EAAE,qBAqCnC,CAAA;AAOD,OAAO,EAAE,uBAAuB,EAAE,CAAA"}
|
|
@@ -5,7 +5,7 @@ import { STRICT_URL_SAFETY_POLICY } from '@cat-factory/kernel';
|
|
|
5
5
|
import { kubernetesRunnerBackend } from '../kubernetes/kubernetes-runner-backend.js';
|
|
6
6
|
import { HttpRunnerPoolProvider } from './HttpRunnerPoolProvider.js';
|
|
7
7
|
import { RunnerPoolTransport } from './RunnerPoolTransport.js';
|
|
8
|
-
import { assertManifestUrlsSafe, referencedSecretKeys as manifestSecretKeys, } from './runners.logic.js';
|
|
8
|
+
import { assertManifestUrlsSafe, manifestWarnings, referencedSecretKeys as manifestSecretKeys, } from './runners.logic.js';
|
|
9
9
|
/**
|
|
10
10
|
* The app-owned registry of runner-backend providers, keyed by `kind`. Constructed by the
|
|
11
11
|
* composition root (via {@link defaultRunnerBackendRegistry} / `createBackendRegistries`)
|
|
@@ -65,6 +65,7 @@ export const manifestRunnerBackend = {
|
|
|
65
65
|
assertManifestUrlsSafe(config.manifest, opts?.urlPolicy ?? STRICT_URL_SAFETY_POLICY);
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
|
+
warnings: (config) => (config.kind === 'manifest' ? manifestWarnings(config.manifest) : []),
|
|
68
69
|
buildTransport: (config, ctx) => {
|
|
69
70
|
if (config.kind !== 'manifest')
|
|
70
71
|
throw new Error('Expected a manifest runner config');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-backends.js","sourceRoot":"","sources":["../../../src/modules/runners/runner-backends.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner-backends.js","sourceRoot":"","sources":["../../../src/modules/runners/runner-backends.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,45 @@
|
|
|
1
|
-
import type { RunnerJobState, RunnerPoolManifest, UrlSafetyPolicy } from '@cat-factory/kernel';
|
|
1
|
+
import type { ConnectionWarning, ContainerEvictionKind, RunnerJobState, RunnerPoolManifest, UrlSafetyPolicy } from '@cat-factory/kernel';
|
|
2
2
|
/** Collect every secret key a manifest's auth scheme references. */
|
|
3
3
|
export declare function referencedSecretKeys(manifest: RunnerPoolManifest): string[];
|
|
4
4
|
/** Validate every URL a manifest will fetch (defence against SSRF). */
|
|
5
5
|
export declare function assertManifestUrlsSafe(manifest: RunnerPoolManifest, policy?: UrlSafetyPolicy): void;
|
|
6
|
+
/** A poll's classified outcome: the canonical job state plus, on a loss, the eviction flavour. */
|
|
7
|
+
export interface RunnerJobStatusVerdict {
|
|
8
|
+
state: RunnerJobState;
|
|
9
|
+
/**
|
|
10
|
+
* Set only when the failure is the RUNNER vanishing rather than the job failing, so the
|
|
11
|
+
* engine engages its eviction recovery (a fresh pool member) instead of terminally failing
|
|
12
|
+
* the run. `crash` — a pool member is ordinary infrastructure, not the flagged, expected
|
|
13
|
+
* churn (`transient`) a facade mints for its own rollouts.
|
|
14
|
+
*/
|
|
15
|
+
evicted?: ContainerEvictionKind;
|
|
16
|
+
}
|
|
6
17
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
18
|
+
* Classify a scheduler's status string into the canonical job state (+ an eviction verdict).
|
|
19
|
+
*
|
|
20
|
+
* Precedence: the manifest's own `statusMap` decides the STATE — an operator saying what their
|
|
21
|
+
* scheduler's words mean always wins — then the built-in vocabularies above cover the words a
|
|
22
|
+
* manifest didn't map. A resolved `failed` is additionally checked against
|
|
23
|
+
* {@link EVICTION_STATUSES} on the RAW word, so a manifest mapping `evicted → failed` still
|
|
24
|
+
* gets eviction recovery rather than a terminal failure.
|
|
25
|
+
*
|
|
26
|
+
* An UNRECOGNISED word still falls back to `running`, keeping the driver waiting: a scheduler
|
|
27
|
+
* vocabulary we don't know is far more likely to be a queue state (`provisioning`, `assigning`)
|
|
28
|
+
* than a death, and wrongly killing a live run is the worse error of the two. Such a run is
|
|
29
|
+
* still bounded by the poll budget, and the manifest can always map the word explicitly.
|
|
11
30
|
*/
|
|
12
|
-
export declare function
|
|
31
|
+
export declare function classifyJobStatus(raw: string | undefined, statusMap: {
|
|
13
32
|
from: string;
|
|
14
33
|
to: RunnerJobState;
|
|
15
|
-
}[] | undefined):
|
|
34
|
+
}[] | undefined): RunnerJobStatusVerdict;
|
|
35
|
+
/**
|
|
36
|
+
* Non-fatal gaps in a manifest worth telling the operator about. A manifest is valid without
|
|
37
|
+
* these — the pool still runs jobs — but each one silently costs a recovery or cleanup path,
|
|
38
|
+
* which is invisible until an incident.
|
|
39
|
+
*
|
|
40
|
+
* Each gap carries a machine-readable `code` beside its English `message` because it reaches
|
|
41
|
+
* two audiences with different needs: the deployment log takes the prose, while the connection
|
|
42
|
+
* test hands the code to the SPA, which owns the operator-facing (translated) copy.
|
|
43
|
+
*/
|
|
44
|
+
export declare function manifestWarnings(manifest: RunnerPoolManifest): ConnectionWarning[];
|
|
16
45
|
//# sourceMappingURL=runners.logic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runners.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/runners/runners.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"runners.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/runners/runners.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,eAAe,EAChB,MAAM,qBAAqB,CAAA;AAW5B,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAe3E;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,GAAE,eAA0C,GACjD,IAAI,CAKN;AA0ED,kGAAkG;AAClG,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,cAAc,CAAA;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,qBAAqB,CAAA;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,cAAc,CAAA;CAAE,EAAE,GAAG,SAAS,GAC5D,sBAAsB,CAgBxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,iBAAiB,EAAE,CAoBlF"}
|
|
@@ -31,22 +31,130 @@ export function assertManifestUrlsSafe(manifest, policy = STRICT_URL_SAFETY_POLI
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
34
|
+
* Scheduler status words that mean the RUNNER went away — the pool member was reclaimed
|
|
35
|
+
* out from under a job that was otherwise fine. Distinct from the failure words below
|
|
36
|
+
* because the recovery differs: an eviction re-dispatches onto a FRESH member (the engine's
|
|
37
|
+
* `recoverContainerEviction` budget), while a job-level failure is the job's own verdict and
|
|
38
|
+
* must not be silently retried.
|
|
39
|
+
*
|
|
40
|
+
* Deliberately narrow. Only words that can mean nothing else are listed: `killed`,
|
|
41
|
+
* `terminated` and `cancelled` are NOT here (they routinely mean "an operator stopped this",
|
|
42
|
+
* and resurrecting such a job on a fresh member would be worse than the wedge this fixes),
|
|
43
|
+
* and neither is anything that could name a queue state.
|
|
38
44
|
*/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
const EVICTION_STATUSES = new Set([
|
|
46
|
+
'evicted',
|
|
47
|
+
'eviction',
|
|
48
|
+
'preempted',
|
|
49
|
+
'preemption',
|
|
50
|
+
'lost',
|
|
51
|
+
'nodelost',
|
|
52
|
+
'node_lost',
|
|
53
|
+
'node-lost',
|
|
54
|
+
'nodefailure',
|
|
55
|
+
'node_failure',
|
|
56
|
+
'oomkilled',
|
|
57
|
+
'oom_killed',
|
|
58
|
+
'oom-killed',
|
|
59
|
+
]);
|
|
60
|
+
/**
|
|
61
|
+
* Scheduler status words that mean the job is OVER and did not succeed. Without these a
|
|
62
|
+
* pool whose scheduler says `error` / `cancelled` reads as `running` and the run burns its
|
|
63
|
+
* whole ~70-minute poll budget before failing `timeout` — a wedge with a misleading cause.
|
|
64
|
+
*
|
|
65
|
+
* Every word here must be TERMINAL in every vocabulary it could come from — a word that can
|
|
66
|
+
* also name a job still waiting for capacity belongs in neither this set nor
|
|
67
|
+
* {@link EVICTION_STATUSES}, so it falls back to `running`. `unschedulable` is the instructive
|
|
68
|
+
* exclusion: Kubernetes reports it as a condition on a PENDING pod while the cluster
|
|
69
|
+
* autoscales, so failing on it would kill a live run on its FIRST poll — the wrong-kill class
|
|
70
|
+
* this whole classification exists to avoid.
|
|
71
|
+
*/
|
|
72
|
+
const FAILED_STATUSES = new Set([
|
|
73
|
+
'failed',
|
|
74
|
+
'failure',
|
|
75
|
+
'error',
|
|
76
|
+
'errored',
|
|
77
|
+
'cancelled',
|
|
78
|
+
'canceled',
|
|
79
|
+
'aborted',
|
|
80
|
+
'killed',
|
|
81
|
+
'timeout',
|
|
82
|
+
'timedout',
|
|
83
|
+
'timed_out',
|
|
84
|
+
'timed-out',
|
|
85
|
+
'deadlineexceeded',
|
|
86
|
+
'deadline_exceeded',
|
|
87
|
+
]);
|
|
88
|
+
/** Scheduler status words that mean the job finished successfully. */
|
|
89
|
+
const DONE_STATUSES = new Set(['done', 'complete', 'completed', 'succeeded', 'success', 'finished']);
|
|
90
|
+
/**
|
|
91
|
+
* Fold a status word (a scheduler's, or an operator's `statusMap.from`) to its comparison form.
|
|
92
|
+
* Both sides go through this, so a mapping entry and the status it means match whatever
|
|
93
|
+
* casing/padding either arrives with — a scheduler that pads or pretty-cases its enum
|
|
94
|
+
* (`' Evicted '`) is describing the same state as one that doesn't. Nothing left ⇒ undefined:
|
|
95
|
+
* a blank status is an ABSENT one, not a word to classify.
|
|
96
|
+
*/
|
|
97
|
+
function normalizeStatus(raw) {
|
|
98
|
+
const lower = raw?.trim().toLowerCase();
|
|
99
|
+
return lower ? lower : undefined;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Classify a scheduler's status string into the canonical job state (+ an eviction verdict).
|
|
103
|
+
*
|
|
104
|
+
* Precedence: the manifest's own `statusMap` decides the STATE — an operator saying what their
|
|
105
|
+
* scheduler's words mean always wins — then the built-in vocabularies above cover the words a
|
|
106
|
+
* manifest didn't map. A resolved `failed` is additionally checked against
|
|
107
|
+
* {@link EVICTION_STATUSES} on the RAW word, so a manifest mapping `evicted → failed` still
|
|
108
|
+
* gets eviction recovery rather than a terminal failure.
|
|
109
|
+
*
|
|
110
|
+
* An UNRECOGNISED word still falls back to `running`, keeping the driver waiting: a scheduler
|
|
111
|
+
* vocabulary we don't know is far more likely to be a queue state (`provisioning`, `assigning`)
|
|
112
|
+
* than a death, and wrongly killing a live run is the worse error of the two. Such a run is
|
|
113
|
+
* still bounded by the poll budget, and the manifest can always map the word explicitly.
|
|
114
|
+
*/
|
|
115
|
+
export function classifyJobStatus(raw, statusMap) {
|
|
116
|
+
const lower = normalizeStatus(raw);
|
|
117
|
+
// No status reported at all (no `statusPath`, an absent field, or a blank string): nothing to
|
|
118
|
+
// classify, so keep the driver waiting exactly as an unrecognised word does.
|
|
119
|
+
if (lower === undefined)
|
|
120
|
+
return { state: 'running' };
|
|
121
|
+
const mapped = statusMap?.find((m) => normalizeStatus(m.from) === lower)?.to;
|
|
122
|
+
const state = mapped ??
|
|
123
|
+
(FAILED_STATUSES.has(lower) || EVICTION_STATUSES.has(lower)
|
|
124
|
+
? 'failed'
|
|
125
|
+
: DONE_STATUSES.has(lower)
|
|
126
|
+
? 'done'
|
|
127
|
+
: 'running');
|
|
128
|
+
return state === 'failed' && EVICTION_STATUSES.has(lower)
|
|
129
|
+
? { state, evicted: 'crash' }
|
|
130
|
+
: { state };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Non-fatal gaps in a manifest worth telling the operator about. A manifest is valid without
|
|
134
|
+
* these — the pool still runs jobs — but each one silently costs a recovery or cleanup path,
|
|
135
|
+
* which is invisible until an incident.
|
|
136
|
+
*
|
|
137
|
+
* Each gap carries a machine-readable `code` beside its English `message` because it reaches
|
|
138
|
+
* two audiences with different needs: the deployment log takes the prose, while the connection
|
|
139
|
+
* test hands the code to the SPA, which owns the operator-facing (translated) copy.
|
|
140
|
+
*/
|
|
141
|
+
export function manifestWarnings(manifest) {
|
|
142
|
+
const warnings = [];
|
|
143
|
+
if (!manifest.release) {
|
|
144
|
+
warnings.push({
|
|
145
|
+
code: 'runner_manifest_no_release',
|
|
146
|
+
message: `Manifest '${manifest.providerId}' defines no release template, so cancelling a run ` +
|
|
147
|
+
`cannot tell the pool to stop its job — an orphaned job keeps its runner until the ` +
|
|
148
|
+
`pool reclaims it on its own.`,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (!manifest.response.statusPath) {
|
|
152
|
+
warnings.push({
|
|
153
|
+
code: 'runner_manifest_no_status_path',
|
|
154
|
+
message: `Manifest '${manifest.providerId}' maps no status path, so every poll reads as still ` +
|
|
155
|
+
`running and a job can only end by exhausting the run's poll budget.`,
|
|
156
|
+
});
|
|
49
157
|
}
|
|
50
|
-
return
|
|
158
|
+
return warnings;
|
|
51
159
|
}
|
|
52
160
|
//# sourceMappingURL=runners.logic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runners.logic.js","sourceRoot":"","sources":["../../../src/modules/runners/runners.logic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runners.logic.js","sourceRoot":"","sources":["../../../src/modules/runners/runners.logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { BugHuntAssessor, BugHuntResult, RunBugHuntInput, TaskConnectionRepository, TaskRepository, TaskSourceKind, TaskSourceRegistry, TrackerBoard } from '@cat-factory/kernel';
|
|
2
|
+
import type { TaskImportService } from './TaskImportService.js';
|
|
3
|
+
import type { TaskFromIssue, TaskLinkService } from './TaskLinkService.js';
|
|
4
|
+
export interface BugHuntServiceDependencies {
|
|
5
|
+
taskSourceRegistry: TaskSourceRegistry;
|
|
6
|
+
taskConnectionRepository: TaskConnectionRepository;
|
|
7
|
+
taskRepository: TaskRepository;
|
|
8
|
+
importService: TaskImportService;
|
|
9
|
+
linkService: TaskLinkService;
|
|
10
|
+
/**
|
|
11
|
+
* The ranking model. Absent (or disabled) ⇒ a hunt still returns the board's candidates,
|
|
12
|
+
* flagged `analysisStatus: 'unavailable'` — the read is useful on its own, and silently
|
|
13
|
+
* presenting an unranked list as a ranking would be the one genuinely misleading outcome.
|
|
14
|
+
*/
|
|
15
|
+
assessor?: BugHuntAssessor;
|
|
16
|
+
/**
|
|
17
|
+
* The workspace spend safeguard, as the narrow predicate the ranking needs (so this layer
|
|
18
|
+
* takes no dependency on `@cat-factory/spend`).
|
|
19
|
+
*
|
|
20
|
+
* A hunt is the platform's first BILLABLE model call that is not behind a run start, so the
|
|
21
|
+
* budget check `RunAdmission` performs for a run has no equivalent here unless it is made
|
|
22
|
+
* one: without it, a workspace that has exhausted its budget — and can therefore no longer
|
|
23
|
+
* start the very run a hunt exists to start — could still spend on ranking, repeatedly.
|
|
24
|
+
* Unwired ⇒ no guard, exactly as an unwired spend service means no guard on a run.
|
|
25
|
+
*/
|
|
26
|
+
isOverBudget?: (workspaceId: string) => Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* How many candidates one hunt scans. Bounded because the whole set goes into a single
|
|
30
|
+
* ranking prompt: past this the prompt cost grows without making the shortlist better, since
|
|
31
|
+
* a human is only ever going to look at the top handful. A board with more matching bugs
|
|
32
|
+
* reports `truncated`, so the UI can say the scan was partial rather than implying the board
|
|
33
|
+
* was exhausted.
|
|
34
|
+
*/
|
|
35
|
+
export declare const BUG_HUNT_SCAN_LIMIT = 40;
|
|
36
|
+
export declare class BugHuntService {
|
|
37
|
+
private readonly deps;
|
|
38
|
+
constructor(deps: BugHuntServiceDependencies);
|
|
39
|
+
/**
|
|
40
|
+
* List the boards a hunt can run against. A source whose provider can't enumerate boards
|
|
41
|
+
* throws rather than returning `[]`: an empty picker and "this tracker cannot list boards"
|
|
42
|
+
* look identical to a user, and only the second one tells them to type the board in.
|
|
43
|
+
*/
|
|
44
|
+
listBoards(workspaceId: string, source: TaskSourceKind): Promise<TrackerBoard[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Run a hunt: read the board's open, unassigned bugs (excluding anything already linked to a
|
|
47
|
+
* block), rank them, and return them best-first.
|
|
48
|
+
*
|
|
49
|
+
* The READ throws — an unreachable tracker is a failure the user must see, not an empty
|
|
50
|
+
* board. The RANKING never does: an assessment that fails leaves the real candidates in
|
|
51
|
+
* place under `analysisStatus: 'failed'`, because the list is independently useful and a
|
|
52
|
+
* model outage should not cost the user the scan.
|
|
53
|
+
*/
|
|
54
|
+
hunt(workspaceId: string, source: TaskSourceKind, input: RunBugHuntInput): Promise<BugHuntResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Adopt a confirmed candidate: import the issue into the projection and materialise it as a
|
|
57
|
+
* `bug` task inside `containerId`, with the issue linked for agent context.
|
|
58
|
+
*
|
|
59
|
+
* Stops there deliberately. Starting the run needs the execution engine (and the initiator's
|
|
60
|
+
* personal-credential gate), which is the HTTP layer's job — this service stays inside the
|
|
61
|
+
* integrations layer, exactly as `BugIntakeService` hands its pickup back to the engine.
|
|
62
|
+
*/
|
|
63
|
+
adopt(workspaceId: string, source: TaskSourceKind, externalId: string, containerId: string, createdBy: string | null, pipelineId: string): Promise<TaskFromIssue>;
|
|
64
|
+
/**
|
|
65
|
+
* Rank a candidate set, degrading to the unranked list with a stated reason. The model's
|
|
66
|
+
* verdicts are joined onto the provider's rows by `rankBugCandidates`, so a hallucinated
|
|
67
|
+
* issue is dropped and a skipped one surfaces as "not assessed" rather than as a zero.
|
|
68
|
+
*/
|
|
69
|
+
private rank;
|
|
70
|
+
/** Resolve a source's stored credentials, or an empty bag for a credentialless one (GitHub). */
|
|
71
|
+
private credentialsFor;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=BugHuntService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BugHuntService.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/BugHuntService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,eAAe,EAEf,aAAa,EAEb,eAAe,EACf,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,YAAY,EACb,MAAM,qBAAqB,CAAA;AAO5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAkB1E,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,wBAAwB,EAAE,wBAAwB,CAAA;IAClD,cAAc,EAAE,cAAc,CAAA;IAC9B,aAAa,EAAE,iBAAiB,CAAA;IAChC,WAAW,EAAE,eAAe,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACzD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAKrC,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,0BAA0B,EAAI;IAEjE;;;;OAIG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAarF;IAED;;;;;;;;OAQG;IACG,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,aAAa,CAAC,CA0CxB;IAED;;;;;;;OAOG;IACG,KAAK,CACT,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAaxB;IAED;;;;OAIG;YACW,IAAI;IAgDlB,gGAAgG;YAClF,cAAc;CAO7B"}
|