@bluewombat/manager-github 0.1.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/README.md +162 -0
- package/SPECS.md +126 -0
- package/dist/adapter/github/fetch-issue.d.ts +29 -0
- package/dist/adapter/github/fetch-issue.d.ts.map +1 -0
- package/dist/adapter/github/fetch-issue.js +34 -0
- package/dist/adapter/github/fetch-issue.js.map +1 -0
- package/dist/adapter/normalize/body.d.ts +24 -0
- package/dist/adapter/normalize/body.d.ts.map +1 -0
- package/dist/adapter/normalize/body.js +104 -0
- package/dist/adapter/normalize/body.js.map +1 -0
- package/dist/adapter/normalize/fingerprint.d.ts +8 -0
- package/dist/adapter/normalize/fingerprint.d.ts.map +1 -0
- package/dist/adapter/normalize/fingerprint.js +26 -0
- package/dist/adapter/normalize/fingerprint.js.map +1 -0
- package/dist/adapter/normalize/intent.d.ts +27 -0
- package/dist/adapter/normalize/intent.d.ts.map +1 -0
- package/dist/adapter/normalize/intent.js +57 -0
- package/dist/adapter/normalize/intent.js.map +1 -0
- package/dist/adapter/normalize/labels.d.ts +17 -0
- package/dist/adapter/normalize/labels.d.ts.map +1 -0
- package/dist/adapter/normalize/labels.js +43 -0
- package/dist/adapter/normalize/labels.js.map +1 -0
- package/dist/adapter/normalize/noise.d.ts +13 -0
- package/dist/adapter/normalize/noise.d.ts.map +1 -0
- package/dist/adapter/normalize/noise.js +28 -0
- package/dist/adapter/normalize/noise.js.map +1 -0
- package/dist/adapter/normalize/normalize.d.ts +22 -0
- package/dist/adapter/normalize/normalize.d.ts.map +1 -0
- package/dist/adapter/normalize/normalize.js +216 -0
- package/dist/adapter/normalize/normalize.js.map +1 -0
- package/dist/adapter/progress/emit.d.ts +3 -0
- package/dist/adapter/progress/emit.d.ts.map +1 -0
- package/dist/adapter/progress/emit.js +6 -0
- package/dist/adapter/progress/emit.js.map +1 -0
- package/dist/adapter/raw/parse-raw.d.ts +14 -0
- package/dist/adapter/raw/parse-raw.d.ts.map +1 -0
- package/dist/adapter/raw/parse-raw.js +47 -0
- package/dist/adapter/raw/parse-raw.js.map +1 -0
- package/dist/adapter/raw/unwrap.d.ts +12 -0
- package/dist/adapter/raw/unwrap.d.ts.map +1 -0
- package/dist/adapter/raw/unwrap.js +19 -0
- package/dist/adapter/raw/unwrap.js.map +1 -0
- package/dist/adapter/run/run-adapter.d.ts +28 -0
- package/dist/adapter/run/run-adapter.d.ts.map +1 -0
- package/dist/adapter/run/run-adapter.js +131 -0
- package/dist/adapter/run/run-adapter.js.map +1 -0
- package/dist/adapter/types.d.ts +69 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/adapter/types.js +3 -0
- package/dist/adapter/types.js.map +1 -0
- package/dist/emitter/event/field-matrix.d.ts +29 -0
- package/dist/emitter/event/field-matrix.d.ts.map +1 -0
- package/dist/emitter/event/field-matrix.js +94 -0
- package/dist/emitter/event/field-matrix.js.map +1 -0
- package/dist/emitter/github/comments.d.ts +14 -0
- package/dist/emitter/github/comments.d.ts.map +1 -0
- package/dist/emitter/github/comments.js +69 -0
- package/dist/emitter/github/comments.js.map +1 -0
- package/dist/emitter/github/labels.d.ts +18 -0
- package/dist/emitter/github/labels.d.ts.map +1 -0
- package/dist/emitter/github/labels.js +81 -0
- package/dist/emitter/github/labels.js.map +1 -0
- package/dist/emitter/github/result.d.ts +19 -0
- package/dist/emitter/github/result.d.ts.map +1 -0
- package/dist/emitter/github/result.js +2 -0
- package/dist/emitter/github/result.js.map +1 -0
- package/dist/emitter/progress/emit.d.ts +3 -0
- package/dist/emitter/progress/emit.d.ts.map +1 -0
- package/dist/emitter/progress/emit.js +6 -0
- package/dist/emitter/progress/emit.js.map +1 -0
- package/dist/emitter/render/render-event.d.ts +20 -0
- package/dist/emitter/render/render-event.d.ts.map +1 -0
- package/dist/emitter/render/render-event.js +293 -0
- package/dist/emitter/render/render-event.js.map +1 -0
- package/dist/emitter/render/truncate.d.ts +9 -0
- package/dist/emitter/render/truncate.d.ts.map +1 -0
- package/dist/emitter/render/truncate.js +10 -0
- package/dist/emitter/render/truncate.js.map +1 -0
- package/dist/emitter/run/run-emitter.d.ts +27 -0
- package/dist/emitter/run/run-emitter.d.ts.map +1 -0
- package/dist/emitter/run/run-emitter.js +121 -0
- package/dist/emitter/run/run-emitter.js.map +1 -0
- package/dist/emitter/thread/marker.d.ts +15 -0
- package/dist/emitter/thread/marker.d.ts.map +1 -0
- package/dist/emitter/thread/marker.js +37 -0
- package/dist/emitter/thread/marker.js.map +1 -0
- package/dist/emitter/types.d.ts +64 -0
- package/dist/emitter/types.d.ts.map +1 -0
- package/dist/emitter/types.js +3 -0
- package/dist/emitter/types.js.map +1 -0
- package/dist/github/client.d.ts +63 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +96 -0
- package/dist/github/client.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +357 -0
- package/dist/index.js.map +1 -0
- package/dist/issue-number.d.ts +5 -0
- package/dist/issue-number.d.ts.map +1 -0
- package/dist/issue-number.js +32 -0
- package/dist/issue-number.js.map +1 -0
- package/dist/labels.d.ts +3 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +24 -0
- package/dist/labels.js.map +1 -0
- package/dist/listener/delivery/run-hook.d.ts +8 -0
- package/dist/listener/delivery/run-hook.d.ts.map +1 -0
- package/dist/listener/delivery/run-hook.js +50 -0
- package/dist/listener/delivery/run-hook.js.map +1 -0
- package/dist/listener/github/list-issues.d.ts +30 -0
- package/dist/listener/github/list-issues.d.ts.map +1 -0
- package/dist/listener/github/list-issues.js +36 -0
- package/dist/listener/github/list-issues.js.map +1 -0
- package/dist/listener/progress/emit.d.ts +3 -0
- package/dist/listener/progress/emit.d.ts.map +1 -0
- package/dist/listener/progress/emit.js +6 -0
- package/dist/listener/progress/emit.js.map +1 -0
- package/dist/listener/run/run-listener.d.ts +35 -0
- package/dist/listener/run/run-listener.d.ts.map +1 -0
- package/dist/listener/run/run-listener.js +217 -0
- package/dist/listener/run/run-listener.js.map +1 -0
- package/dist/listener/source/select-events.d.ts +46 -0
- package/dist/listener/source/select-events.d.ts.map +1 -0
- package/dist/listener/source/select-events.js +102 -0
- package/dist/listener/source/select-events.js.map +1 -0
- package/dist/listener/types.d.ts +56 -0
- package/dist/listener/types.d.ts.map +1 -0
- package/dist/listener/types.js +3 -0
- package/dist/listener/types.js.map +1 -0
- package/dist/manager.d.ts +29 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +256 -0
- package/dist/manager.js.map +1 -0
- package/dist/probe/probe-issue.d.ts +20 -0
- package/dist/probe/probe-issue.d.ts.map +1 -0
- package/dist/probe/probe-issue.js +45 -0
- package/dist/probe/probe-issue.js.map +1 -0
- package/dist/repo.d.ts +6 -0
- package/dist/repo.d.ts.map +1 -0
- package/dist/repo.js +14 -0
- package/dist/repo.js.map +1 -0
- package/dist/setup.d.ts +43 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +281 -0
- package/dist/setup.js.map +1 -0
- package/dist/submission/submission.d.ts +44 -0
- package/dist/submission/submission.d.ts.map +1 -0
- package/dist/submission/submission.js +189 -0
- package/dist/submission/submission.js.map +1 -0
- package/dist/written-fingerprint.d.ts +7 -0
- package/dist/written-fingerprint.d.ts.map +1 -0
- package/dist/written-fingerprint.js +38 -0
- package/dist/written-fingerprint.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Domain types owned by FeatureListener. Names match the Block perimeter only. */
|
|
2
|
+
export type RunOutcome = "completed" | "source-lost" | "invalid-invocation" | "interrupted";
|
|
3
|
+
export type StopReason = "drained" | "max-events" | "duration" | "source-lost" | "signal";
|
|
4
|
+
export type SkipReason = "not-object" | "no-cursor";
|
|
5
|
+
/** The Source: one repository's issues. */
|
|
6
|
+
export type Repository = {
|
|
7
|
+
owner: string;
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
export type IssueState = "open" | "closed" | "all";
|
|
11
|
+
export type Invocation = {
|
|
12
|
+
manager: string;
|
|
13
|
+
repo: Repository;
|
|
14
|
+
/** Root of the REST API, so a GitHub Enterprise host is one argument away. */
|
|
15
|
+
apiBase: string;
|
|
16
|
+
state: IssueState;
|
|
17
|
+
/** Every label an Event must carry; empty means no label filter. */
|
|
18
|
+
labels: string[];
|
|
19
|
+
/** Deliver only Events whose Cursor is strictly greater. */
|
|
20
|
+
since?: string;
|
|
21
|
+
follow: boolean;
|
|
22
|
+
pollIntervalMs?: number;
|
|
23
|
+
maxEvents: number;
|
|
24
|
+
durationMs: number;
|
|
25
|
+
perPage: number;
|
|
26
|
+
/** Extra attempts after the first, on a transport failure, a 5xx, or a rate limit. */
|
|
27
|
+
requestRetries: number;
|
|
28
|
+
onIntentionArgv?: string[];
|
|
29
|
+
};
|
|
30
|
+
export type ParseResult =
|
|
31
|
+
/** The token is beside the Invocation, never inside it: it is not part of what a run describes. */
|
|
32
|
+
{
|
|
33
|
+
ok: true;
|
|
34
|
+
invocation: Invocation;
|
|
35
|
+
token: string;
|
|
36
|
+
} | {
|
|
37
|
+
ok: false;
|
|
38
|
+
reason: string;
|
|
39
|
+
};
|
|
40
|
+
/** What a Cursor is made of: when the issue last moved, and which issue it is. */
|
|
41
|
+
export type Cursor = {
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
number: number;
|
|
44
|
+
};
|
|
45
|
+
/** One line on stdout: an issue that was read and passed through. */
|
|
46
|
+
export type Delivery = {
|
|
47
|
+
cursor: string;
|
|
48
|
+
bytes: number;
|
|
49
|
+
payload: Record<string, unknown>;
|
|
50
|
+
};
|
|
51
|
+
/** An entry that was not a readable issue. It has no Cursor to commit. */
|
|
52
|
+
export type Skip = {
|
|
53
|
+
reason: SkipReason;
|
|
54
|
+
detail: string;
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/listener/types.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,oBAAoB,GAAG,aAAa,CAAC;AAE5F,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE1F,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,CAAC;AAEpD,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEnD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,WAAW;AACrB,mGAAmG;AACnG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,kFAAkF;AAClF,MAAM,MAAM,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,qEAAqE;AACrE,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,MAAM,IAAI,GAAG;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/listener/types.ts"],"names":[],"mappings":"AAAA,mFAAmF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ManagerPort } from "@bluewombat/manager-kit";
|
|
2
|
+
import type { Repository } from "./repo.js";
|
|
3
|
+
export declare const DEFAULT_API_BASE = "https://api.github.com";
|
|
4
|
+
export declare const DEFAULT_TOKEN_ENV = "GITHUB_TOKEN";
|
|
5
|
+
export declare const DEFAULT_READY_LABEL = "ready";
|
|
6
|
+
export declare const DEFAULT_PRIORITY = 50;
|
|
7
|
+
export type GithubManagerOptions = {
|
|
8
|
+
repo: Repository;
|
|
9
|
+
token: string;
|
|
10
|
+
durationMs: number;
|
|
11
|
+
interruptFlag: {
|
|
12
|
+
interrupted: boolean;
|
|
13
|
+
};
|
|
14
|
+
apiBase?: string;
|
|
15
|
+
labels?: string[];
|
|
16
|
+
defaultProject?: string;
|
|
17
|
+
readyLabel?: string;
|
|
18
|
+
defaultPriority?: number;
|
|
19
|
+
stateLabelPrefix?: string;
|
|
20
|
+
/** Leave the feature branch on the remote after a fold. Default: delete it. */
|
|
21
|
+
keepBranch?: boolean;
|
|
22
|
+
/** Replaces the REST API. Tests only. */
|
|
23
|
+
githubFetch?: typeof fetch;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* One repository's issues in, comments (and optional state labels) out.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createGithubManager(options: GithubManagerOptions): ManagerPort;
|
|
29
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,WAAW,EAKZ,MAAM,yBAAyB,CAAC;AASjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAmB5C,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AACzD,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAChD,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,KAAK,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,CAuM9E"}
|
package/dist/manager.js
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { runAdapter } from "./adapter/run/run-adapter.js";
|
|
2
|
+
import { runEmitter } from "./emitter/run/run-emitter.js";
|
|
3
|
+
import { createClient } from "./github/client.js";
|
|
4
|
+
import { issueNumberFromExternalId, issueNumberFromPayload } from "./issue-number.js";
|
|
5
|
+
import { payloadHasLabel } from "./labels.js";
|
|
6
|
+
import { runListener } from "./listener/run/run-listener.js";
|
|
7
|
+
import { probeIssue } from "./probe/probe-issue.js";
|
|
8
|
+
import { foldPullRequest, submitPullRequest, } from "./submission/submission.js";
|
|
9
|
+
import { writtenFingerprint } from "./written-fingerprint.js";
|
|
10
|
+
const silent = () => { };
|
|
11
|
+
const MANAGER = "github";
|
|
12
|
+
const UNKNOWN_PROJECT = "unknown";
|
|
13
|
+
const DEFAULT_MAX_EVENTS = 10_000;
|
|
14
|
+
const DEFAULT_MAX_RAW_BYTES = 65_536;
|
|
15
|
+
const DEFAULT_PER_PAGE = 100;
|
|
16
|
+
const DEFAULT_REQUEST_RETRIES = 2;
|
|
17
|
+
const DEFAULT_PROJECT_LABEL_PREFIX = "project:";
|
|
18
|
+
const DEFAULT_PRIORITY_LABEL_PREFIX = "priority:";
|
|
19
|
+
const MAX_REPORT_CHARS = 8_000;
|
|
20
|
+
export const DEFAULT_API_BASE = "https://api.github.com";
|
|
21
|
+
export const DEFAULT_TOKEN_ENV = "GITHUB_TOKEN";
|
|
22
|
+
export const DEFAULT_READY_LABEL = "ready";
|
|
23
|
+
export const DEFAULT_PRIORITY = 50;
|
|
24
|
+
/**
|
|
25
|
+
* One repository's issues in, comments (and optional state labels) out.
|
|
26
|
+
*/
|
|
27
|
+
export function createGithubManager(options) {
|
|
28
|
+
const apiBase = options.apiBase ?? DEFAULT_API_BASE;
|
|
29
|
+
const readyLabel = options.readyLabel ?? DEFAULT_READY_LABEL;
|
|
30
|
+
const defaultPriority = options.defaultPriority ?? DEFAULT_PRIORITY;
|
|
31
|
+
const labels = options.labels ?? [];
|
|
32
|
+
const testNetwork = options.githubFetch !== undefined;
|
|
33
|
+
function channelOptions() {
|
|
34
|
+
const now = () => Date.now();
|
|
35
|
+
return {
|
|
36
|
+
token: options.token,
|
|
37
|
+
apiBase,
|
|
38
|
+
requestRetries: testNetwork ? 0 : DEFAULT_REQUEST_RETRIES,
|
|
39
|
+
deadlineMs: now() + options.durationMs,
|
|
40
|
+
now,
|
|
41
|
+
shouldInterrupt: () => options.interruptFlag.interrupted,
|
|
42
|
+
throttle: !testNetwork,
|
|
43
|
+
...(options.githubFetch !== undefined ? { fetch: options.githubFetch } : {}),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
signalsReady(payload) {
|
|
48
|
+
return payloadHasLabel(payload, readyLabel);
|
|
49
|
+
},
|
|
50
|
+
async clearReady(key) {
|
|
51
|
+
const issue = issueNumberFromExternalId(key);
|
|
52
|
+
if (issue === undefined) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const call = createClient(channelOptions());
|
|
56
|
+
try {
|
|
57
|
+
await call.request("DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}", {
|
|
58
|
+
owner: options.repo.owner,
|
|
59
|
+
repo: options.repo.name,
|
|
60
|
+
issue_number: issue,
|
|
61
|
+
name: readyLabel,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Already gone, or the label was never there. Either way there is
|
|
66
|
+
// nothing left to take back.
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
async listen(input) {
|
|
70
|
+
const deliveries = [];
|
|
71
|
+
const alreadyDone = (payload) => options.stateLabelPrefix !== undefined &&
|
|
72
|
+
doneAlready(payload, options.stateLabelPrefix, readyLabel);
|
|
73
|
+
const listenerInvocation = {
|
|
74
|
+
manager: MANAGER,
|
|
75
|
+
repo: options.repo,
|
|
76
|
+
apiBase,
|
|
77
|
+
state: "all",
|
|
78
|
+
labels,
|
|
79
|
+
follow: false,
|
|
80
|
+
maxEvents: DEFAULT_MAX_EVENTS,
|
|
81
|
+
durationMs: options.durationMs,
|
|
82
|
+
perPage: DEFAULT_PER_PAGE,
|
|
83
|
+
requestRetries: testNetwork ? 0 : DEFAULT_REQUEST_RETRIES,
|
|
84
|
+
};
|
|
85
|
+
if (input.since !== undefined) {
|
|
86
|
+
listenerInvocation.since = input.since;
|
|
87
|
+
}
|
|
88
|
+
const listened = await runListener({
|
|
89
|
+
invocation: listenerInvocation,
|
|
90
|
+
github: createClient(channelOptions()),
|
|
91
|
+
write: (line) => {
|
|
92
|
+
if (line.event === "intention" &&
|
|
93
|
+
typeof line.cursor === "string" &&
|
|
94
|
+
isObject(line.payload)) {
|
|
95
|
+
if (!alreadyDone(line.payload)) {
|
|
96
|
+
deliveries.push({ cursor: line.cursor, payload: line.payload });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
interruptFlag: options.interruptFlag,
|
|
101
|
+
});
|
|
102
|
+
return { outcome: listened.outcome, deliveries };
|
|
103
|
+
},
|
|
104
|
+
async adapt(payload) {
|
|
105
|
+
const adapterInvocation = {
|
|
106
|
+
manager: MANAGER,
|
|
107
|
+
repo: options.repo,
|
|
108
|
+
apiBase,
|
|
109
|
+
defaultPriority,
|
|
110
|
+
maxRawBytes: DEFAULT_MAX_RAW_BYTES,
|
|
111
|
+
projectLabelPrefix: DEFAULT_PROJECT_LABEL_PREFIX,
|
|
112
|
+
priorityLabelPrefix: DEFAULT_PRIORITY_LABEL_PREFIX,
|
|
113
|
+
readyLabel,
|
|
114
|
+
fetch: true,
|
|
115
|
+
fetchDurationMs: options.durationMs,
|
|
116
|
+
requestRetries: testNetwork ? 0 : DEFAULT_REQUEST_RETRIES,
|
|
117
|
+
};
|
|
118
|
+
if (options.defaultProject !== undefined) {
|
|
119
|
+
adapterInvocation.defaultProject = options.defaultProject;
|
|
120
|
+
}
|
|
121
|
+
const adapted = await runAdapter({
|
|
122
|
+
invocation: adapterInvocation,
|
|
123
|
+
raw: JSON.stringify(payload),
|
|
124
|
+
github: createClient(channelOptions()),
|
|
125
|
+
write: silent,
|
|
126
|
+
interruptFlag: options.interruptFlag,
|
|
127
|
+
});
|
|
128
|
+
if (adapted.outcome === "invalid" && adapted.invalid !== undefined) {
|
|
129
|
+
return {
|
|
130
|
+
outcome: "invalid",
|
|
131
|
+
invalid: adapted.invalid,
|
|
132
|
+
key: keyFromPayload(payload, options.repo),
|
|
133
|
+
project: projectFromPayload(payload, options.defaultProject),
|
|
134
|
+
fingerprint: writtenFingerprint(payload, options.stateLabelPrefix),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (adapted.outcome === "unavailable" || adapted.outcome === "interrupted") {
|
|
138
|
+
return { outcome: adapted.outcome };
|
|
139
|
+
}
|
|
140
|
+
if (adapted.outcome !== "converted" || adapted.feature === undefined) {
|
|
141
|
+
return { outcome: "unavailable" };
|
|
142
|
+
}
|
|
143
|
+
return { outcome: "converted", feature: adapted.feature };
|
|
144
|
+
},
|
|
145
|
+
async report(input) {
|
|
146
|
+
// Every key this manager mints ends in `#<issue>`, so the Thread to write
|
|
147
|
+
// on is recoverable without Host carrying an issue number around.
|
|
148
|
+
const issue = issueNumberFromExternalId(input.key);
|
|
149
|
+
if (issue === undefined) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
const emitterInvocation = {
|
|
153
|
+
repo: options.repo,
|
|
154
|
+
issue,
|
|
155
|
+
apiBase,
|
|
156
|
+
event: input.event,
|
|
157
|
+
key: input.key,
|
|
158
|
+
project: input.project,
|
|
159
|
+
at: new Date().toISOString(),
|
|
160
|
+
fields: input.fields,
|
|
161
|
+
maxReportChars: MAX_REPORT_CHARS,
|
|
162
|
+
defaultPriority,
|
|
163
|
+
durationMs: options.durationMs,
|
|
164
|
+
requestRetries: testNetwork ? 0 : DEFAULT_REQUEST_RETRIES,
|
|
165
|
+
dryRun: false,
|
|
166
|
+
};
|
|
167
|
+
if (input.eventId !== undefined) {
|
|
168
|
+
emitterInvocation.eventId = input.eventId;
|
|
169
|
+
}
|
|
170
|
+
if (options.stateLabelPrefix !== undefined) {
|
|
171
|
+
emitterInvocation.labelPrefix = options.stateLabelPrefix;
|
|
172
|
+
}
|
|
173
|
+
const result = await runEmitter({
|
|
174
|
+
invocation: emitterInvocation,
|
|
175
|
+
github: createClient(channelOptions()),
|
|
176
|
+
write: silent,
|
|
177
|
+
interruptFlag: options.interruptFlag,
|
|
178
|
+
});
|
|
179
|
+
return result.outcome === "reported";
|
|
180
|
+
},
|
|
181
|
+
async submit(input) {
|
|
182
|
+
return await submitPullRequest(input, submissionContext());
|
|
183
|
+
},
|
|
184
|
+
async fold(input) {
|
|
185
|
+
return await foldPullRequest(input.reference, submissionContext());
|
|
186
|
+
},
|
|
187
|
+
async probe(key) {
|
|
188
|
+
const issue = issueNumberFromExternalId(key);
|
|
189
|
+
if (issue === undefined) {
|
|
190
|
+
return "unavailable";
|
|
191
|
+
}
|
|
192
|
+
const now = () => Date.now();
|
|
193
|
+
return await probeIssue({
|
|
194
|
+
github: createClient(channelOptions()),
|
|
195
|
+
repo: options.repo,
|
|
196
|
+
number: issue,
|
|
197
|
+
deadlineMs: now() + options.durationMs,
|
|
198
|
+
now,
|
|
199
|
+
shouldInterrupt: () => options.interruptFlag.interrupted,
|
|
200
|
+
});
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
function submissionContext() {
|
|
204
|
+
const now = () => Date.now();
|
|
205
|
+
return {
|
|
206
|
+
repo: options.repo,
|
|
207
|
+
github: createClient(channelOptions()),
|
|
208
|
+
deadlineMs: now() + options.durationMs,
|
|
209
|
+
now,
|
|
210
|
+
shouldInterrupt: () => options.interruptFlag.interrupted,
|
|
211
|
+
keepBranch: options.keepBranch,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Whether the tracker already says this Feature is finished.
|
|
217
|
+
*
|
|
218
|
+
* The WorkLedger is the source of truth, and it is the only memory: lose it and
|
|
219
|
+
* every open issue looks new, so finished work is built and offered a second
|
|
220
|
+
* time. The state label is what the tracker remembers, and reading it back is
|
|
221
|
+
* cheaper than rebuilding a Feature that is already merged. The resume signal
|
|
222
|
+
* overrides it, so a human still has a way to ask for more.
|
|
223
|
+
*/
|
|
224
|
+
function doneAlready(payload, prefix, ready) {
|
|
225
|
+
return payloadHasLabel(payload, `${prefix}done`) && !payloadHasLabel(payload, ready);
|
|
226
|
+
}
|
|
227
|
+
function keyFromPayload(payload, repo) {
|
|
228
|
+
const number = issueNumberFromPayload(payload);
|
|
229
|
+
return number === undefined
|
|
230
|
+
? `${MANAGER}:unconvertible`
|
|
231
|
+
: `${MANAGER}:${repo.owner}/${repo.name}#${number}`;
|
|
232
|
+
}
|
|
233
|
+
function projectFromPayload(payload, defaultProject) {
|
|
234
|
+
const labels = payload.labels;
|
|
235
|
+
if (Array.isArray(labels)) {
|
|
236
|
+
for (const entry of labels) {
|
|
237
|
+
const name = typeof entry === "string"
|
|
238
|
+
? entry
|
|
239
|
+
: entry !== null && typeof entry === "object" && "name" in entry
|
|
240
|
+
? String(entry.name ?? "")
|
|
241
|
+
: "";
|
|
242
|
+
const prefix = DEFAULT_PROJECT_LABEL_PREFIX;
|
|
243
|
+
if (name.toLowerCase().startsWith(prefix.toLowerCase())) {
|
|
244
|
+
const value = name.slice(prefix.length).trim();
|
|
245
|
+
if (value.length > 0) {
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return defaultProject ?? UNKNOWN_PROJECT;
|
|
252
|
+
}
|
|
253
|
+
function isObject(value) {
|
|
254
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EACL,eAAe,EAEf,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,MAAM,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;AAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC;AACzB,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,4BAA4B,GAAG,UAAU,CAAC;AAChD,MAAM,6BAA6B,GAAG,WAAW,CAAC;AAClD,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAmBnC;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,gBAAgB,CAAC;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC;IAEtD,SAAS,cAAc;QACrB,MAAM,GAAG,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO;YACP,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;YACzD,UAAU,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU;YACtC,GAAG;YACH,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW;YACxD,QAAQ,EAAE,CAAC,WAAW;YACtB,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,CAAC,OAAO;YAClB,OAAO,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAW;YAC1B,MAAM,KAAK,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,kEAAkE,EAAE;oBACrF,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;oBACzB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;oBACvB,YAAY,EAAE,KAAK;oBACnB,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;gBAClE,6BAA6B;YAC/B,CAAC;QACH,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,MAAM,UAAU,GAA+B,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,CAAC,OAAgC,EAAW,EAAE,CAChE,OAAO,CAAC,gBAAgB,KAAK,SAAS;gBACtC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;YAC7D,MAAM,kBAAkB,GAAoD;gBAC1E,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO;gBACP,KAAK,EAAE,KAAK;gBACZ,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,kBAAkB;gBAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,OAAO,EAAE,gBAAgB;gBACzB,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;aAC1D,CAAC;YACF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,kBAAkB,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACzC,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC;gBACjC,UAAU,EAAE,kBAAkB;gBAC9B,MAAM,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;gBACtC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;oBACd,IACE,IAAI,CAAC,KAAK,KAAK,WAAW;wBAC1B,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;wBAC/B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EACtB,CAAC;wBACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;4BAC/B,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;wBAClE,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QACnD,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAAO;YACjB,MAAM,iBAAiB,GAAmD;gBACxE,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO;gBACP,eAAe;gBACf,WAAW,EAAE,qBAAqB;gBAClC,kBAAkB,EAAE,4BAA4B;gBAChD,mBAAmB,EAAE,6BAA6B;gBAClD,UAAU;gBACV,KAAK,EAAE,IAAI;gBACX,eAAe,EAAE,OAAO,CAAC,UAAU;gBACnC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;aAC1D,CAAC;YACF,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;gBACzC,iBAAiB,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAC5D,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC;gBAC/B,UAAU,EAAE,iBAAiB;gBAC7B,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC5B,MAAM,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;gBACtC,KAAK,EAAE,MAAM;gBACb,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnE,OAAO;oBACL,OAAO,EAAE,SAAS;oBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,GAAG,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;oBAC1C,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;oBAC5D,WAAW,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC;iBACnE,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YACtC,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACrE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACpC,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5D,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAkB;YAC7B,0EAA0E;YAC1E,kEAAkE;YAClE,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,iBAAiB,GAAmD;gBACxE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK;gBACL,OAAO;gBACP,KAAK,EAAE,KAAK,CAAC,KAAwB;gBACrC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,cAAc,EAAE,gBAAgB;gBAChC,eAAe;gBACf,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;gBACzD,MAAM,EAAE,KAAK;aACd,CAAC;YACF,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAChC,iBAAiB,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC5C,CAAC;YACD,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBAC3C,iBAAiB,CAAC,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAC3D,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;gBAC9B,UAAU,EAAE,iBAAiB;gBAC7B,MAAM,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;gBACtC,KAAK,EAAE,MAAM;gBACb,aAAa,EAAE,OAAO,CAAC,aAAa;aACrC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAwB;YACnC,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAA4B;YACrC,OAAO,MAAM,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,GAAW;YACrB,MAAM,KAAK,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,MAAM,GAAG,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACrC,OAAO,MAAM,UAAU,CAAC;gBACtB,MAAM,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;gBACtC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,KAAK;gBACb,UAAU,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU;gBACtC,GAAG;gBACH,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW;aACzD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IAEF,SAAS,iBAAiB;QACxB,MAAM,GAAG,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC;YACtC,UAAU,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU;YACtC,GAAG;YACH,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW;YACxD,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,OAAgC,EAAE,MAAc,EAAE,KAAa;IAClF,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,cAAc,CAAC,OAAgC,EAAE,IAAgB;IACxE,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,GAAG,OAAO,gBAAgB;QAC5B,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAgC,EAChC,cAAkC;IAElC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;oBAC9D,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,IAAI,EAAE,CAAC;oBAClD,CAAC,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,4BAA4B,CAAC;YAC5C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,cAAc,IAAI,eAAe,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ProbeResult } from "@bluewombat/manager-kit";
|
|
2
|
+
import { type GithubClient } from "../github/client.js";
|
|
3
|
+
import type { Repository } from "../repo.js";
|
|
4
|
+
export type ProbeIssueRequest = {
|
|
5
|
+
github: GithubClient;
|
|
6
|
+
repo: Repository;
|
|
7
|
+
number: number;
|
|
8
|
+
deadlineMs: number;
|
|
9
|
+
now: () => number;
|
|
10
|
+
shouldInterrupt: () => boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Whether this issue is still an intention the Project can act on.
|
|
14
|
+
*
|
|
15
|
+
* Open is present. Closed is gone — the same intent as a cancel delivery.
|
|
16
|
+
* A 404 is gone too: deleted, or transferred. Every other failure is
|
|
17
|
+
* unavailable: a missed read must not abandon work.
|
|
18
|
+
*/
|
|
19
|
+
export declare function probeIssue(request: ProbeIssueRequest): Promise<ProbeResult>;
|
|
20
|
+
//# sourceMappingURL=probe-issue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-issue.d.ts","sourceRoot":"","sources":["../../src/probe/probe-issue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAc,KAAK,YAAY,EAAe,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAoCjF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { callSignal, readFailure } from "../github/client.js";
|
|
2
|
+
/**
|
|
3
|
+
* Whether this issue is still an intention the Project can act on.
|
|
4
|
+
*
|
|
5
|
+
* Open is present. Closed is gone — the same intent as a cancel delivery.
|
|
6
|
+
* A 404 is gone too: deleted, or transferred. Every other failure is
|
|
7
|
+
* unavailable: a missed read must not abandon work.
|
|
8
|
+
*/
|
|
9
|
+
export async function probeIssue(request) {
|
|
10
|
+
const call = callSignal(request.deadlineMs, request.now, request.shouldInterrupt);
|
|
11
|
+
try {
|
|
12
|
+
const response = await request.github.request("GET /repos/{owner}/{repo}/issues/{issue_number}", {
|
|
13
|
+
owner: request.repo.owner,
|
|
14
|
+
repo: request.repo.name,
|
|
15
|
+
issue_number: request.number,
|
|
16
|
+
request: { signal: call.signal },
|
|
17
|
+
});
|
|
18
|
+
const issue = response.data;
|
|
19
|
+
if (issue === null || typeof issue !== "object" || Array.isArray(issue)) {
|
|
20
|
+
return "unavailable";
|
|
21
|
+
}
|
|
22
|
+
const state = issue.state;
|
|
23
|
+
if (state === "open") {
|
|
24
|
+
return "present";
|
|
25
|
+
}
|
|
26
|
+
if (state === "closed") {
|
|
27
|
+
return "gone";
|
|
28
|
+
}
|
|
29
|
+
return "unavailable";
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (request.shouldInterrupt()) {
|
|
33
|
+
return "interrupted";
|
|
34
|
+
}
|
|
35
|
+
const status = readFailure(error).status;
|
|
36
|
+
if (status === 404 || status === 410) {
|
|
37
|
+
return "gone";
|
|
38
|
+
}
|
|
39
|
+
return "unavailable";
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
call.release();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=probe-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-issue.js","sourceRoot":"","sources":["../../src/probe/probe-issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAqB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAYjF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA0B;IACzD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAClF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAC3C,iDAAiD,EACjD;YACE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;YACzB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI;YACvB,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;SACjC,CACF,CAAC;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAe,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAC;QACnD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;YAC9B,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QACzC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
|
package/dist/repo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../src/repo.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAKzD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAUxD"}
|
package/dist/repo.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** GitHub's own shape for `owner/name`. */
|
|
2
|
+
const REPO_PATTERN = /^([A-Za-z0-9][A-Za-z0-9._-]*)\/([A-Za-z0-9][A-Za-z0-9._-]*)$/;
|
|
3
|
+
export function parseRepo(raw) {
|
|
4
|
+
const matched = REPO_PATTERN.exec(raw);
|
|
5
|
+
if (matched === null) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const [, owner, name] = matched;
|
|
9
|
+
if (owner === undefined || name === undefined) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return { owner, name };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=repo.js.map
|
package/dist/repo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../src/repo.ts"],"names":[],"mappings":"AAEA,2CAA2C;AAC3C,MAAM,YAAY,GAAG,8DAA8D,CAAC;AAEpF,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type SetupResult } from "@bluewombat/manager-kit";
|
|
2
|
+
import type { Repository } from "./repo.js";
|
|
3
|
+
export type SetupSettings = {
|
|
4
|
+
repo: Repository;
|
|
5
|
+
token: string;
|
|
6
|
+
apiBase: string;
|
|
7
|
+
readyLabel: string;
|
|
8
|
+
labels: string[] | undefined;
|
|
9
|
+
defaultProject: string | undefined;
|
|
10
|
+
stateLabelPrefix: string | undefined;
|
|
11
|
+
/** The branch pull requests are opened onto, and whether the config named it. */
|
|
12
|
+
branch: string;
|
|
13
|
+
branchConfigured: boolean;
|
|
14
|
+
durationMs: number;
|
|
15
|
+
interruptFlag: {
|
|
16
|
+
interrupted: boolean;
|
|
17
|
+
};
|
|
18
|
+
githubFetch: typeof fetch | undefined;
|
|
19
|
+
};
|
|
20
|
+
type WantedLabel = {
|
|
21
|
+
name: string;
|
|
22
|
+
colour: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Bring one repository to the shape a run expects: reachable, issues on, a
|
|
27
|
+
* token that can write, and every label the config names.
|
|
28
|
+
*
|
|
29
|
+
* Idempotent by construction — it asks what is there before it creates
|
|
30
|
+
* anything, and creating a label that already exists is never attempted.
|
|
31
|
+
*/
|
|
32
|
+
export declare function runSetup(settings: SetupSettings, input: {
|
|
33
|
+
apply: boolean;
|
|
34
|
+
}): Promise<SetupResult>;
|
|
35
|
+
/** Every label this configuration will look for or write, and why it exists. */
|
|
36
|
+
export declare function wantedLabels(settings: {
|
|
37
|
+
readyLabel: string;
|
|
38
|
+
labels: string[] | undefined;
|
|
39
|
+
defaultProject: string | undefined;
|
|
40
|
+
stateLabelPrefix: string | undefined;
|
|
41
|
+
}): WantedLabel[];
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,WAAW,EAAkB,MAAM,yBAAyB,CAAC;AAEjG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAU5C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IACxC,WAAW,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CACvC,CAAC;AAEF,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GACxB,OAAO,CAAC,WAAW,CAAC,CAyDtB;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,QAAQ,EAAE;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,GAAG,WAAW,EAAE,CAwChB"}
|