baxian 2.0.5 → 2.0.7
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 +5 -5
- package/README.zh-CN.md +5 -5
- package/dist/agent/bootstrap-poller.d.ts +2 -2
- package/dist/agent/bootstrap-poller.d.ts.map +1 -1
- package/dist/agent/bootstrap-poller.js.map +1 -1
- package/dist/agent/bootstrap.d.ts +1 -1
- package/dist/agent/bootstrap.d.ts.map +1 -1
- package/dist/agent/bootstrap.js +24 -48
- package/dist/agent/bootstrap.js.map +1 -1
- package/dist/agent/manager.d.ts +9 -35
- package/dist/agent/manager.d.ts.map +1 -1
- package/dist/agent/manager.js +86 -335
- package/dist/agent/manager.js.map +1 -1
- package/dist/agent/net-exec.d.ts +0 -1
- package/dist/agent/net-exec.d.ts.map +1 -1
- package/dist/agent/net-exec.js +0 -1
- package/dist/agent/net-exec.js.map +1 -1
- package/dist/agent/pane-streamer-manager.d.ts.map +1 -1
- package/dist/agent/pane-streamer-manager.js +1 -3
- package/dist/agent/pane-streamer-manager.js.map +1 -1
- package/dist/agent/preflight.d.ts +1 -20
- package/dist/agent/preflight.d.ts.map +1 -1
- package/dist/agent/preflight.js +39 -122
- package/dist/agent/preflight.js.map +1 -1
- package/dist/agent/prompt.d.ts +6 -16
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +128 -79
- package/dist/agent/prompt.js.map +1 -1
- package/dist/agent/repo-store.d.ts +1 -5
- package/dist/agent/repo-store.d.ts.map +1 -1
- package/dist/agent/repo-store.js +8 -33
- package/dist/agent/repo-store.js.map +1 -1
- package/dist/agent/runner.d.ts +1 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +1 -3
- package/dist/agent/runner.js.map +1 -1
- package/dist/api/config.d.ts +1 -2
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +5 -22
- package/dist/api/config.js.map +1 -1
- package/dist/api/platform-guard.d.ts.map +1 -1
- package/dist/api/platform-guard.js +5 -15
- package/dist/api/platform-guard.js.map +1 -1
- package/dist/api/projects.d.ts.map +1 -1
- package/dist/api/projects.js +18 -25
- package/dist/api/projects.js.map +1 -1
- package/dist/api/tasks.js +2 -2
- package/dist/api/tasks.js.map +1 -1
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/config/backup.d.ts +1 -3
- package/dist/config/backup.d.ts.map +1 -1
- package/dist/config/backup.js +28 -82
- package/dist/config/backup.js.map +1 -1
- package/dist/config/hot-reload.d.ts +3 -2
- package/dist/config/hot-reload.d.ts.map +1 -1
- package/dist/config/hot-reload.js +6 -16
- package/dist/config/hot-reload.js.map +1 -1
- package/dist/config/loader.d.ts +3 -10
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +53 -67
- package/dist/config/loader.js.map +1 -1
- package/dist/config/validator.d.ts +2 -8
- package/dist/config/validator.d.ts.map +1 -1
- package/dist/config/validator.js +42 -120
- package/dist/config/validator.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -39
- package/dist/index.js.map +1 -1
- package/dist/platform/driver-host.d.ts +4 -3
- package/dist/platform/driver-host.d.ts.map +1 -1
- package/dist/platform/driver-host.js +12 -11
- package/dist/platform/driver-host.js.map +1 -1
- package/dist/platform/feedback.d.ts +5 -6
- package/dist/platform/feedback.d.ts.map +1 -1
- package/dist/platform/feedback.js +4 -7
- package/dist/platform/feedback.js.map +1 -1
- package/dist/platform/github-driver.d.ts +36 -0
- package/dist/platform/github-driver.d.ts.map +1 -0
- package/dist/platform/github-driver.js +374 -0
- package/dist/platform/github-driver.js.map +1 -0
- package/dist/platform/markers.d.ts +1 -4
- package/dist/platform/markers.d.ts.map +1 -1
- package/dist/platform/markers.js +0 -8
- package/dist/platform/markers.js.map +1 -1
- package/dist/platform/platform-poller.d.ts +2 -17
- package/dist/platform/platform-poller.d.ts.map +1 -1
- package/dist/platform/platform-poller.js +9 -15
- package/dist/platform/platform-poller.js.map +1 -1
- package/dist/platform/response-parser.d.ts.map +1 -1
- package/dist/platform/response-parser.js +6 -63
- package/dist/platform/response-parser.js.map +1 -1
- package/dist/platform/review-timeline.d.ts +6 -8
- package/dist/platform/review-timeline.d.ts.map +1 -1
- package/dist/platform/review-timeline.js +4 -6
- package/dist/platform/review-timeline.js.map +1 -1
- package/dist/platform/row-schema.d.ts +1 -2
- package/dist/platform/row-schema.d.ts.map +1 -1
- package/dist/platform/row-schema.js +13 -1
- package/dist/platform/row-schema.js.map +1 -1
- package/dist/platform/startup.d.ts +6 -34
- package/dist/platform/startup.d.ts.map +1 -1
- package/dist/platform/startup.js +10 -109
- package/dist/platform/startup.js.map +1 -1
- package/dist/platform/types.d.ts +61 -54
- package/dist/platform/types.d.ts.map +1 -1
- package/dist/platform/types.js +38 -26
- package/dist/platform/types.js.map +1 -1
- package/dist/platform/verdict-engine.d.ts +1 -1
- package/dist/platform/verdict-engine.d.ts.map +1 -1
- package/dist/platform/verdict-engine.js +1 -1
- package/dist/platform/verdict-engine.js.map +1 -1
- package/dist/shared/constants.d.ts +2 -9
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +2 -20
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/git-url.d.ts +0 -14
- package/dist/shared/git-url.d.ts.map +1 -1
- package/dist/shared/git-url.js +4 -57
- package/dist/shared/git-url.js.map +1 -1
- package/dist/shared/types.d.ts +2 -10
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/state/agent-store.js +0 -3
- package/dist/state/agent-store.js.map +1 -1
- package/dist/state/task-store.js +2 -2
- package/dist/state/task-store.js.map +1 -1
- package/dist/web/assets/index-KH_4rYrI.js +15 -0
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/config/normalizer.d.ts +0 -2
- package/dist/config/normalizer.d.ts.map +0 -1
- package/dist/config/normalizer.js +0 -46
- package/dist/config/normalizer.js.map +0 -1
- package/dist/platform/command-renderer.d.ts +0 -29
- package/dist/platform/command-renderer.d.ts.map +0 -1
- package/dist/platform/command-renderer.js +0 -113
- package/dist/platform/command-renderer.js.map +0 -1
- package/dist/platform/driver-spec.d.ts +0 -7
- package/dist/platform/driver-spec.d.ts.map +0 -1
- package/dist/platform/driver-spec.js +0 -506
- package/dist/platform/driver-spec.js.map +0 -1
- package/dist/platform/field-mapper.d.ts +0 -7
- package/dist/platform/field-mapper.d.ts.map +0 -1
- package/dist/platform/field-mapper.js +0 -109
- package/dist/platform/field-mapper.js.map +0 -1
- package/dist/platform/git-driver.d.ts +0 -64
- package/dist/platform/git-driver.d.ts.map +0 -1
- package/dist/platform/git-driver.js +0 -230
- package/dist/platform/git-driver.js.map +0 -1
- package/dist/platform/manifest.d.ts +0 -11
- package/dist/platform/manifest.d.ts.map +0 -1
- package/dist/platform/manifest.js +0 -42
- package/dist/platform/manifest.js.map +0 -1
- package/dist/platform/plugin-registry.d.ts +0 -31
- package/dist/platform/plugin-registry.d.ts.map +0 -1
- package/dist/platform/plugin-registry.js +0 -239
- package/dist/platform/plugin-registry.js.map +0 -1
- package/dist/platform/plugin-roots.d.ts +0 -3
- package/dist/platform/plugin-roots.d.ts.map +0 -1
- package/dist/platform/plugin-roots.js +0 -11
- package/dist/platform/plugin-roots.js.map +0 -1
- package/dist/platform/plugins/github/baxian-plugin.json +0 -8
- package/dist/platform/plugins/github/driver.json +0 -153
- package/dist/platform/plugins/github/skills/baxian-cli-gh/SKILL.md +0 -115
- package/dist/platform/plugins/github/skills/baxian-cli-gh/agents/openai.yaml +0 -2
- package/dist/platform/preflight-exec.d.ts +0 -21
- package/dist/platform/preflight-exec.d.ts.map +0 -1
- package/dist/platform/preflight-exec.js +0 -53
- package/dist/platform/preflight-exec.js.map +0 -1
- package/dist/skill/registry.d.ts +0 -37
- package/dist/skill/registry.d.ts.map +0 -1
- package/dist/skill/registry.js +0 -234
- package/dist/skill/registry.js.map +0 -1
- package/dist/skills/baxian-greeting/SKILL.md +0 -15
- package/dist/skills/baxian-greeting/agents/openai.yaml +0 -2
- package/dist/skills/baxian-pr-feedback/SKILL.md +0 -41
- package/dist/skills/baxian-pr-feedback/agents/openai.yaml +0 -2
- package/dist/skills/baxian-pr-recheck/SKILL.md +0 -27
- package/dist/skills/baxian-pr-recheck/agents/openai.yaml +0 -2
- package/dist/skills/baxian-pr-review/SKILL.md +0 -33
- package/dist/skills/baxian-pr-review/agents/openai.yaml +0 -2
- package/dist/skills/baxian-signals/SKILL.md +0 -86
- package/dist/skills/baxian-signals/agents/openai.yaml +0 -2
- package/dist/skills/baxian-task-check/SKILL.md +0 -52
- package/dist/skills/baxian-task-check/agents/openai.yaml +0 -2
- package/dist/web/assets/index-CzVzThuT.js +0 -15
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { buildDriverRunContext, GitDriver } from './git-driver.js';
|
|
1
|
+
import { GITHUB_AGENT_PROMPTS, buildGitHubRunContext, GitHubDriver, } from './github-driver.js';
|
|
3
2
|
export function makeDriverExec(runner) {
|
|
4
3
|
return (command, opts) => opts.stdin === undefined
|
|
5
4
|
? runner.exec(command, { timeout: opts.timeout, maxBuffer: opts.maxBuffer })
|
|
6
5
|
: runner.execWithStdin(command, opts.stdin, { timeout: opts.timeout, maxBuffer: opts.maxBuffer });
|
|
7
6
|
}
|
|
8
|
-
export function buildProjectDriver(project,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
export function buildProjectDriver(project, exec) {
|
|
8
|
+
return buildRepoDriver(project.repo, exec);
|
|
9
|
+
}
|
|
10
|
+
export function buildRepoDriver(repo, exec) {
|
|
11
|
+
return new GitHubDriver(buildGitHubRunContext(repo), exec);
|
|
12
|
+
}
|
|
13
|
+
export function buildProjectPromptContext(project) {
|
|
14
|
+
return {
|
|
15
|
+
repo: buildGitHubRunContext(project.repo).repoPath,
|
|
16
|
+
prompts: GITHUB_AGENT_PROMPTS,
|
|
17
|
+
};
|
|
17
18
|
}
|
|
18
19
|
//# sourceMappingURL=driver-host.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver-host.js","sourceRoot":"","sources":["../../src/platform/driver-host.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"driver-host.js","sourceRoot":"","sources":["../../src/platform/driver-host.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAG5B,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS;QAChD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5E,CAAC,CAAC,MAAM,CAAC,aAAa,CAClB,OAAO,EACP,IAAI,CAAC,KAAK,EACV,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CACrD,CAAC;AACR,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAsB,EACtB,IAAgB;IAEhB,OAAO,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAgB;IAC5D,OAAO,IAAI,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAsB;IAC9D,OAAO;QACL,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ;QAClD,OAAO,EAAE,oBAAoB;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { type AckActorContext, type AckCarrierRow, type AckCollection
|
|
1
|
+
import { type AckActorContext, type AckCarrierRow, type AckCollection } from './markers.js';
|
|
2
2
|
import { type NormalizedRow } from './row-schema.js';
|
|
3
|
-
import type {
|
|
4
|
-
import type { OpVars } from './git-driver.js';
|
|
3
|
+
import type { CommentSource, CommentSourceClass } from './types.js';
|
|
5
4
|
import { type VerdictSourceScan } from './verdict-engine.js';
|
|
6
5
|
export interface FeedbackSourceScan {
|
|
7
6
|
key: string;
|
|
@@ -18,11 +17,11 @@ export interface PendingFeedbackResult {
|
|
|
18
17
|
}>;
|
|
19
18
|
}
|
|
20
19
|
export interface CommentSourceReader {
|
|
21
|
-
commentSources:
|
|
22
|
-
|
|
20
|
+
readonly commentSources: readonly CommentSource[];
|
|
21
|
+
listComments(source: CommentSource, prNumber: number, projectPage?: (pageRows: NormalizedRow[]) => NormalizedRow[]): Promise<NormalizedRow[]>;
|
|
23
22
|
}
|
|
24
23
|
export interface ScanRowCollector {
|
|
25
|
-
admitPage(source:
|
|
24
|
+
admitPage(source: CommentSource, pageRows: readonly NormalizedRow[]): void;
|
|
26
25
|
noteFailure(sourceKey: string, error: unknown): void;
|
|
27
26
|
}
|
|
28
27
|
export declare function scanCommentSourcesOnce(driver: CommentSourceReader, prNumber: number, now: () => number, onFailure?: (key: string, error: unknown) => void, collector?: ScanRowCollector): Promise<VerdictSourceScan[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/platform/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/platform/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAC7D,MAAM,cAAc,CAAC;AACtB,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,kBAAkB,CAAC;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,YAAY,CACV,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,GAC3D,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,CAAC;IAC3E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACtD;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,MAAM,EACjB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,EACjD,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqB9B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,GAAG,aAAa,EAAE,CAUzF;AAgBD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,GAClB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAG5C;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,GAAG,EAAE,eAAe,GACnB,qBAAqB,CAiBvB"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { ackCarrierKey, ackRevisionKey,
|
|
1
|
+
import { ackCarrierKey, ackRevisionKey, collectValidAcks, projectCommentRow, rowAcks, rowBodyDigest, rowHasBody, rowTokens, } from './markers.js';
|
|
2
2
|
import { versionTimeOf } from './row-schema.js';
|
|
3
3
|
import { deadTokens } from './verdict-engine.js';
|
|
4
4
|
export async function scanCommentSourcesOnce(driver, prNumber, now, onFailure, collector) {
|
|
5
5
|
const scans = [];
|
|
6
6
|
for (const source of driver.commentSources) {
|
|
7
|
-
const sourceClass = classifyCommentSource(source);
|
|
8
7
|
const scanStartedAt = now();
|
|
9
8
|
try {
|
|
10
9
|
let pagedInline = false;
|
|
11
|
-
const rows = await driver.
|
|
10
|
+
const rows = await driver.listComments(source, prNumber, pageRows => {
|
|
12
11
|
pagedInline = true;
|
|
13
12
|
collector?.admitPage(source, pageRows);
|
|
14
13
|
for (const row of pageRows)
|
|
@@ -17,10 +16,10 @@ export async function scanCommentSourcesOnce(driver, prNumber, now, onFailure, c
|
|
|
17
16
|
});
|
|
18
17
|
if (!pagedInline && collector !== undefined)
|
|
19
18
|
collector.admitPage(source, rows);
|
|
20
|
-
scans.push({ key: source.key, sourceClass, ok: true, scanStartedAt, rows
|
|
19
|
+
scans.push({ key: source.key, sourceClass: source.category, ok: true, scanStartedAt, rows });
|
|
21
20
|
}
|
|
22
21
|
catch (error) {
|
|
23
|
-
scans.push({ key: source.key, sourceClass, ok: false, scanStartedAt, rows: [] });
|
|
22
|
+
scans.push({ key: source.key, sourceClass: source.category, ok: false, scanStartedAt, rows: [] });
|
|
24
23
|
collector?.noteFailure(source.key, error);
|
|
25
24
|
onFailure?.(source.key, error);
|
|
26
25
|
}
|
|
@@ -39,8 +38,6 @@ export function buildAckCarrierRows(scans) {
|
|
|
39
38
|
})));
|
|
40
39
|
}
|
|
41
40
|
function unackedRevision(row, sourceKey, acks) {
|
|
42
|
-
if (row.system === true)
|
|
43
|
-
return undefined;
|
|
44
41
|
if (versionTimeOf(row) === undefined)
|
|
45
42
|
return undefined;
|
|
46
43
|
if (!rowHasBody(row))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/platform/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/platform/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type NormalizedRow } from './row-schema.js';
|
|
2
|
+
import { type CommentSource, type DriverExec, type PlatformAgentPrompts, type PlatformDriver } from './types.js';
|
|
3
|
+
export declare const GITHUB_AGENT_PROMPTS: PlatformAgentPrompts;
|
|
4
|
+
export interface GitHubRunContext {
|
|
5
|
+
repoPath: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildGitHubRunContext(repoUrl: string): GitHubRunContext;
|
|
8
|
+
export declare class GitHubDriver implements PlatformDriver {
|
|
9
|
+
private readonly ctx;
|
|
10
|
+
private readonly exec;
|
|
11
|
+
readonly visibilityLagMs = 5000;
|
|
12
|
+
readonly commentSources: readonly CommentSource[];
|
|
13
|
+
constructor(ctx: GitHubRunContext, exec: DriverExec);
|
|
14
|
+
private classify;
|
|
15
|
+
runPreflightSteps(): Promise<Array<{
|
|
16
|
+
step: string;
|
|
17
|
+
ok: boolean;
|
|
18
|
+
message: string;
|
|
19
|
+
}>>;
|
|
20
|
+
prView(prNumber: number): Promise<NormalizedRow>;
|
|
21
|
+
projectView(): Promise<NormalizedRow>;
|
|
22
|
+
branchView(remoteProjectId: string, branch: string): Promise<NormalizedRow>;
|
|
23
|
+
postComment(prNumber: number, body: string): Promise<void>;
|
|
24
|
+
mergePr(prNumber: number, expectedHeadSha: string): Promise<void>;
|
|
25
|
+
closePr(prNumber: number): Promise<void>;
|
|
26
|
+
deleteBranch(remoteProjectId: string, branch: string, expectedHeadSha: string): Promise<void>;
|
|
27
|
+
listPrs(shouldStop?: (pageRows: NormalizedRow[], page: number) => boolean): Promise<NormalizedRow[]>;
|
|
28
|
+
listComments(source: CommentSource, prNumber: number, projectPage?: (pageRows: NormalizedRow[]) => NormalizedRow[], shouldStop?: (pageRows: NormalizedRow[], page: number) => boolean): Promise<NormalizedRow[]>;
|
|
29
|
+
private preflightStep;
|
|
30
|
+
private single;
|
|
31
|
+
private command;
|
|
32
|
+
private execGitHub;
|
|
33
|
+
private assertGraphqlEnvelope;
|
|
34
|
+
private runPaged;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=github-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-driver.d.ts","sourceRoot":"","sources":["../../src/platform/github-driver.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,UAAU,EAEf,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAkBpB,eAAO,MAAM,oBAAoB,EAAE,oBAiBlC,CAAC;AASF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAIvE;AAkID,qBAAa,YAAa,YAAW,cAAc;IAK/C,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,QAAQ,CAAC,eAAe,QAAqB;IAC7C,QAAQ,CAAC,cAAc,2BAAmB;gBAGvB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,UAAU;IAGnC,OAAO,CAAC,QAAQ;IAOV,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAWnF,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAMhD,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IAKrC,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAY3E,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjE,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnG,OAAO,CACL,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAChE,OAAO,CAAC,aAAa,EAAE,CAAC;IAS3B,YAAY,CACV,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,EAC5D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAChE,OAAO,CAAC,aAAa,EAAE,CAAC;YAuBb,aAAa;IAiC3B,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,OAAO;YAID,UAAU;IAuBxB,OAAO,CAAC,qBAAqB;YA4Bf,QAAQ;CAmDvB"}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { shellQuote } from '../agent/runner.js';
|
|
2
|
+
import { CONTROL_CHAR_RE, isValidBranchName } from '../shared/constants.js';
|
|
3
|
+
import { isGitHubRepo, repoSlug } from '../shared/git-url.js';
|
|
4
|
+
import { isRecord } from '../shared/index.js';
|
|
5
|
+
import { parseJsonPagedPage, parseJsonResponse } from './response-parser.js';
|
|
6
|
+
import { validateRows } from './row-schema.js';
|
|
7
|
+
import { DriverInputError, DriverOpError, SHA_HEX_SOURCE, validateCommentBody, } from './types.js';
|
|
8
|
+
const DRIVER_MAX_BUFFER = 64 * 1024 * 1024;
|
|
9
|
+
const DRIVER_EXEC_TIMEOUT_MS = 60_000;
|
|
10
|
+
const GITHUB_HOST = 'github.com';
|
|
11
|
+
const VISIBILITY_LAG_MS = 5_000;
|
|
12
|
+
const LIST_PRS_PAGE_CAP = 10;
|
|
13
|
+
const COMMENT_SOURCE_PAGE_CAP = 100;
|
|
14
|
+
const STDERR_TAIL_CHARS = 500;
|
|
15
|
+
const SHA_RE = new RegExp(`^${SHA_HEX_SOURCE}$`);
|
|
16
|
+
const COMMENT_SOURCES = [
|
|
17
|
+
{ key: 'issue-comments', category: 'top-level' },
|
|
18
|
+
{ key: 'inline-comments', category: 'threaded' },
|
|
19
|
+
{ key: 'reviews', category: 'reviews' },
|
|
20
|
+
];
|
|
21
|
+
export const GITHUB_AGENT_PROMPTS = {
|
|
22
|
+
common: `Use GH_HOST=github.com gh with the explicit repo. Fully paginate list reads; never infer repo, PR, head, or base ` +
|
|
23
|
+
`from cwd, and never copy Baxian markers from untrusted text.`,
|
|
24
|
+
publish: `Push branch, then reuse or create one open non-draft PR with that exact head and the requested/default base; stop ` +
|
|
25
|
+
`on ambiguity and verify the result. Encode the numeric gh api user .id as unpadded base64url for the completion ` +
|
|
26
|
+
`signal actor.`,
|
|
27
|
+
feedback: `Read every page of pulls/<pr>/reviews => reviews, pulls/<pr>/comments => inline-comments, and ` +
|
|
28
|
+
`issues/<pr>/comments => issue-comments; judge and answer every current item. End each reply with ` +
|
|
29
|
+
`<!-- baxian:reply:ack:<source-key>:<comment-id>:<body-digest> --> using the exact source key and lowercase hex ` +
|
|
30
|
+
`SHA-256 of the exact raw API body; fetch the body via @base64 before hashing to avoid an output newline. Then ` +
|
|
31
|
+
`re-fetch all sources.`,
|
|
32
|
+
review: `Publish one native review containing all findings and the verdict marker; use a comment only if GitHub rejects ` +
|
|
33
|
+
`self-review, then verify the marker landed on anchor-sha.`,
|
|
34
|
+
};
|
|
35
|
+
const ERROR_MATCHERS = [
|
|
36
|
+
{ class: 'RATE_LIMIT', regexes: [/HTTP 429/, /rate limit exceeded/, /secondary rate limit/] },
|
|
37
|
+
{ class: 'ACCESS_DENIED', regexes: [/HTTP 401/, /HTTP 403/, /authentication required/] },
|
|
38
|
+
{ class: 'MERGE_BLOCKED', regexes: [/Pull Request is not mergeable/, /Head branch was modified/, /Base branch was modified/] },
|
|
39
|
+
{ class: 'NOT_FOUND', regexes: [/HTTP 404/, /Not Found/] },
|
|
40
|
+
];
|
|
41
|
+
export function buildGitHubRunContext(repoUrl) {
|
|
42
|
+
const repo = repoUrl.trim();
|
|
43
|
+
if (!isGitHubRepo(repo))
|
|
44
|
+
throw new Error(`GitHub driver requires a github.com repository URL: ${repo}`);
|
|
45
|
+
return { repoPath: repoSlug(repo) };
|
|
46
|
+
}
|
|
47
|
+
const PR_LIST_FIELDS = {
|
|
48
|
+
prNumber: 'number',
|
|
49
|
+
prUrl: 'html_url',
|
|
50
|
+
branch: 'head.ref',
|
|
51
|
+
headSha: 'head.sha',
|
|
52
|
+
state: 'state',
|
|
53
|
+
draft: 'draft',
|
|
54
|
+
mergedAt: 'merged_at',
|
|
55
|
+
updatedAt: 'updated_at',
|
|
56
|
+
title: 'title',
|
|
57
|
+
sourceProjectId: 'head.repo.id',
|
|
58
|
+
targetProjectId: 'base.repo.id',
|
|
59
|
+
targetBranch: 'base.ref',
|
|
60
|
+
prAuthor: 'user.login',
|
|
61
|
+
prAuthorId: 'user.id',
|
|
62
|
+
};
|
|
63
|
+
const PR_VIEW_FIELDS = {
|
|
64
|
+
headSha: 'head.sha',
|
|
65
|
+
branch: 'head.ref',
|
|
66
|
+
state: 'state',
|
|
67
|
+
draft: 'draft',
|
|
68
|
+
mergedAt: 'merged_at',
|
|
69
|
+
prUrl: 'html_url',
|
|
70
|
+
sourceProjectId: 'head.repo.id',
|
|
71
|
+
targetProjectId: 'base.repo.id',
|
|
72
|
+
targetBranch: 'base.ref',
|
|
73
|
+
prAuthor: 'user.login',
|
|
74
|
+
prAuthorId: 'user.id',
|
|
75
|
+
detailedMergeStatus: 'mergeable_state',
|
|
76
|
+
};
|
|
77
|
+
const PROJECT_FIELDS = {
|
|
78
|
+
defaultBranch: 'default_branch',
|
|
79
|
+
remoteProjectId: 'node_id',
|
|
80
|
+
pushPermitted: 'permissions.push',
|
|
81
|
+
};
|
|
82
|
+
const BRANCH_FIELDS = {
|
|
83
|
+
remoteProjectId: 'data.node.id',
|
|
84
|
+
headSha: 'data.node.ref.target.oid',
|
|
85
|
+
};
|
|
86
|
+
const COMMENT_FIELDS = {
|
|
87
|
+
'issue-comments': {
|
|
88
|
+
id: 'id', body: 'body', author: 'user.login', authorId: 'user.id',
|
|
89
|
+
createdAt: 'created_at', updatedAt: 'updated_at',
|
|
90
|
+
},
|
|
91
|
+
'inline-comments': {
|
|
92
|
+
id: 'id', body: 'body', author: 'user.login', authorId: 'user.id',
|
|
93
|
+
createdAt: 'created_at', updatedAt: 'updated_at', discussionId: 'in_reply_to_id',
|
|
94
|
+
parentId: 'in_reply_to_id', path: 'path', line: 'line', originalLine: 'original_line',
|
|
95
|
+
},
|
|
96
|
+
reviews: {
|
|
97
|
+
id: 'id', body: 'body', author: 'user.login', authorId: 'user.id',
|
|
98
|
+
createdAt: 'submitted_at', updatedAt: 'submitted_at', reviewState: 'state', commitSha: 'commit_id',
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
const BRANCH_VIEW_QUERY = 'query($repositoryId:ID!,$refName:String!){node(id:$repositoryId){... on Repository{id ref(qualifiedName:$refName){target{oid}}}}}';
|
|
102
|
+
const DELETE_BRANCH_QUERY = 'mutation($repositoryId:ID!,$refName:GitRefname!,$beforeOid:GitObjectID!,$afterOid:GitObjectID!){updateRefs(input:{repositoryId:$repositoryId,refUpdates:[{name:$refName,beforeOid:$beforeOid,afterOid:$afterOid}]}){clientMutationId}}';
|
|
103
|
+
function tail(value) {
|
|
104
|
+
return value.length > STDERR_TAIL_CHARS ? value.slice(-STDERR_TAIL_CHARS) : value;
|
|
105
|
+
}
|
|
106
|
+
function pathValue(value, path) {
|
|
107
|
+
let current = value;
|
|
108
|
+
for (const segment of path.split('.')) {
|
|
109
|
+
if (!isRecord(current) || !Object.hasOwn(current, segment))
|
|
110
|
+
return undefined;
|
|
111
|
+
current = current[segment];
|
|
112
|
+
}
|
|
113
|
+
return current;
|
|
114
|
+
}
|
|
115
|
+
function projectPayload(payload, fields) {
|
|
116
|
+
if (payload === null || typeof payload !== 'object')
|
|
117
|
+
return [];
|
|
118
|
+
const items = Array.isArray(payload) ? payload : [payload];
|
|
119
|
+
return items.map(item => Object.fromEntries(Object.entries(fields).map(([target, source]) => [target, pathValue(item, source)])));
|
|
120
|
+
}
|
|
121
|
+
function requirePrNumber(value) {
|
|
122
|
+
if (value === undefined || !Number.isSafeInteger(value) || value <= 0) {
|
|
123
|
+
throw new DriverInputError(`prNumber must be a positive safe integer (got ${value})`);
|
|
124
|
+
}
|
|
125
|
+
return value;
|
|
126
|
+
}
|
|
127
|
+
function requireSha(value) {
|
|
128
|
+
if (value === undefined || !SHA_RE.test(value)) {
|
|
129
|
+
throw new DriverInputError(`expectedHeadSha must be a hex sha (got ${value})`);
|
|
130
|
+
}
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
function requireRemoteProjectId(value) {
|
|
134
|
+
if (value === undefined
|
|
135
|
+
|| value.trim() !== value
|
|
136
|
+
|| value.length === 0
|
|
137
|
+
|| value.length > 512
|
|
138
|
+
|| CONTROL_CHAR_RE.test(value)) {
|
|
139
|
+
throw new DriverInputError(`remoteProjectId must be a bounded platform id (got ${value})`);
|
|
140
|
+
}
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
function requireBranch(value) {
|
|
144
|
+
if (value === undefined || !isValidBranchName(value)) {
|
|
145
|
+
throw new DriverInputError(`branch has invalid shape (got ${value})`);
|
|
146
|
+
}
|
|
147
|
+
return value;
|
|
148
|
+
}
|
|
149
|
+
export class GitHubDriver {
|
|
150
|
+
ctx;
|
|
151
|
+
exec;
|
|
152
|
+
visibilityLagMs = VISIBILITY_LAG_MS;
|
|
153
|
+
commentSources = COMMENT_SOURCES;
|
|
154
|
+
constructor(ctx, exec) {
|
|
155
|
+
this.ctx = ctx;
|
|
156
|
+
this.exec = exec;
|
|
157
|
+
}
|
|
158
|
+
classify(text) {
|
|
159
|
+
for (const matcher of ERROR_MATCHERS) {
|
|
160
|
+
if (matcher.regexes.some(regex => regex.test(text)))
|
|
161
|
+
return matcher.class;
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
async runPreflightSteps() {
|
|
166
|
+
const auth = await this.preflightStep('github-auth', ['gh', 'api', 'user']);
|
|
167
|
+
return [auth.ok
|
|
168
|
+
? { step: auth.step, ok: true, message: 'GitHub CLI authenticated' }
|
|
169
|
+
: {
|
|
170
|
+
step: auth.step,
|
|
171
|
+
ok: false,
|
|
172
|
+
message: 'Run "gh auth login --hostname github.com" or set GITHUB_TOKEN',
|
|
173
|
+
}];
|
|
174
|
+
}
|
|
175
|
+
async prView(prNumber) {
|
|
176
|
+
requirePrNumber(prNumber);
|
|
177
|
+
const result = await this.execGitHub('prView', ['gh', 'api', `repos/${this.ctx.repoPath}/pulls/${prNumber}`]);
|
|
178
|
+
return this.single('prView', projectPayload(parseJsonResponse(result.stdout), PR_VIEW_FIELDS));
|
|
179
|
+
}
|
|
180
|
+
async projectView() {
|
|
181
|
+
const result = await this.execGitHub('projectView', ['gh', 'api', `repos/${this.ctx.repoPath}`]);
|
|
182
|
+
return this.single('projectView', projectPayload(parseJsonResponse(result.stdout), PROJECT_FIELDS));
|
|
183
|
+
}
|
|
184
|
+
async branchView(remoteProjectId, branch) {
|
|
185
|
+
requireRemoteProjectId(remoteProjectId);
|
|
186
|
+
requireBranch(branch);
|
|
187
|
+
const result = await this.execGitHub('branchView', [
|
|
188
|
+
'gh', 'api', 'graphql',
|
|
189
|
+
'-f', `repositoryId=${remoteProjectId}`,
|
|
190
|
+
'-f', `refName=refs/heads/${branch}`,
|
|
191
|
+
'-f', `query=${BRANCH_VIEW_QUERY}`,
|
|
192
|
+
], undefined, true);
|
|
193
|
+
return this.single('branchView', projectPayload(parseJsonResponse(result.stdout), BRANCH_FIELDS));
|
|
194
|
+
}
|
|
195
|
+
async postComment(prNumber, body) {
|
|
196
|
+
requirePrNumber(prNumber);
|
|
197
|
+
validateCommentBody(body);
|
|
198
|
+
await this.execGitHub('comment', ['gh', 'api', '-X', 'POST', `repos/${this.ctx.repoPath}/issues/${prNumber}/comments`, '-F', 'body=@-'], Buffer.from(body, 'utf8'));
|
|
199
|
+
}
|
|
200
|
+
async mergePr(prNumber, expectedHeadSha) {
|
|
201
|
+
requirePrNumber(prNumber);
|
|
202
|
+
requireSha(expectedHeadSha);
|
|
203
|
+
await this.execGitHub('merge', [
|
|
204
|
+
'gh', 'api', '-X', 'PUT', `repos/${this.ctx.repoPath}/pulls/${prNumber}/merge`,
|
|
205
|
+
'-f', 'merge_method=squash', '-f', `sha=${expectedHeadSha}`,
|
|
206
|
+
]);
|
|
207
|
+
}
|
|
208
|
+
async closePr(prNumber) {
|
|
209
|
+
requirePrNumber(prNumber);
|
|
210
|
+
await this.execGitHub('close', [
|
|
211
|
+
'gh', 'api', '-X', 'PATCH', `repos/${this.ctx.repoPath}/pulls/${prNumber}`, '-f', 'state=closed',
|
|
212
|
+
]);
|
|
213
|
+
}
|
|
214
|
+
async deleteBranch(remoteProjectId, branch, expectedHeadSha) {
|
|
215
|
+
requireRemoteProjectId(remoteProjectId);
|
|
216
|
+
requireBranch(branch);
|
|
217
|
+
requireSha(expectedHeadSha);
|
|
218
|
+
await this.execGitHub('deleteBranch', [
|
|
219
|
+
'gh', 'api', 'graphql',
|
|
220
|
+
'-f', `repositoryId=${remoteProjectId}`,
|
|
221
|
+
'-f', `refName=refs/heads/${branch}`,
|
|
222
|
+
'-f', `beforeOid=${expectedHeadSha}`,
|
|
223
|
+
'-f', 'afterOid=0000000000000000000000000000000000000000',
|
|
224
|
+
'-f', `query=${DELETE_BRANCH_QUERY}`,
|
|
225
|
+
], undefined, true);
|
|
226
|
+
}
|
|
227
|
+
listPrs(shouldStop) {
|
|
228
|
+
return this.runPaged('listPrs', page => ['gh', 'api', `repos/${this.ctx.repoPath}/pulls?state=all&sort=updated&direction=desc&per_page=10&page=${page}`], PR_LIST_FIELDS, { pageCap: LIST_PRS_PAGE_CAP, capBehavior: 'stop', idField: 'prNumber', shouldStop });
|
|
229
|
+
}
|
|
230
|
+
listComments(source, prNumber, projectPage, shouldStop) {
|
|
231
|
+
const fields = COMMENT_FIELDS[source.key];
|
|
232
|
+
if (fields === undefined) {
|
|
233
|
+
throw new DriverOpError(`unknown GitHub comment source '${source.key}'`, { opName: `listComments[${source.key}]` });
|
|
234
|
+
}
|
|
235
|
+
requirePrNumber(prNumber);
|
|
236
|
+
const collection = source.key === 'issue-comments' ? 'issues' : 'pulls';
|
|
237
|
+
const suffix = source.key === 'issue-comments' ? 'comments' : source.key === 'inline-comments' ? 'comments' : 'reviews';
|
|
238
|
+
return this.runPaged('listComments', page => ['gh', 'api', `repos/${this.ctx.repoPath}/${collection}/${prNumber}/${suffix}?per_page=100&page=${page}`], fields, {
|
|
239
|
+
pageCap: COMMENT_SOURCE_PAGE_CAP,
|
|
240
|
+
capBehavior: 'fail',
|
|
241
|
+
idField: 'id',
|
|
242
|
+
sourceKey: source.key,
|
|
243
|
+
projectPage,
|
|
244
|
+
shouldStop,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
async preflightStep(step, argv) {
|
|
248
|
+
try {
|
|
249
|
+
const result = await this.exec(this.command(argv), {
|
|
250
|
+
timeout: DRIVER_EXEC_TIMEOUT_MS,
|
|
251
|
+
maxBuffer: DRIVER_MAX_BUFFER,
|
|
252
|
+
});
|
|
253
|
+
const output = `${result.stdout}\n${result.stderr}`;
|
|
254
|
+
if (result.exitCode !== 0 && this.classify(output) === 'RATE_LIMIT') {
|
|
255
|
+
throw new DriverOpError(`preflight ${step} failed (class RATE_LIMIT)`, {
|
|
256
|
+
opName: step,
|
|
257
|
+
errorClass: 'RATE_LIMIT',
|
|
258
|
+
exitCode: result.exitCode,
|
|
259
|
+
stderrTail: tail(output.trim()),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return { step, ok: result.exitCode === 0, output };
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (error instanceof DriverOpError)
|
|
266
|
+
throw error;
|
|
267
|
+
const output = error instanceof Error ? error.message : String(error);
|
|
268
|
+
if (this.classify(output) === 'RATE_LIMIT') {
|
|
269
|
+
throw new DriverOpError(`preflight ${step} failed (class RATE_LIMIT)`, {
|
|
270
|
+
opName: step,
|
|
271
|
+
errorClass: 'RATE_LIMIT',
|
|
272
|
+
stderrTail: tail(output),
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
return { step, ok: false, output };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
single(opName, rows) {
|
|
279
|
+
const validated = validateRows(opName, rows);
|
|
280
|
+
if (validated.length !== 1) {
|
|
281
|
+
throw new DriverOpError(`op ${opName} must yield exactly one row (got ${validated.length})`, { opName });
|
|
282
|
+
}
|
|
283
|
+
return validated[0];
|
|
284
|
+
}
|
|
285
|
+
command(argv) {
|
|
286
|
+
return `GH_HOST=${shellQuote(GITHUB_HOST)} ${argv.map(shellQuote).join(' ')}`;
|
|
287
|
+
}
|
|
288
|
+
async execGitHub(opName, argv, stdin, graphql = false) {
|
|
289
|
+
const result = await this.exec(this.command(argv), {
|
|
290
|
+
timeout: DRIVER_EXEC_TIMEOUT_MS,
|
|
291
|
+
maxBuffer: DRIVER_MAX_BUFFER,
|
|
292
|
+
...(stdin === undefined ? {} : { stdin }),
|
|
293
|
+
});
|
|
294
|
+
if (result.exitCode !== 0) {
|
|
295
|
+
const output = `${result.stderr}\n${result.stdout}`;
|
|
296
|
+
const errorClass = this.classify(output);
|
|
297
|
+
throw new DriverOpError(`op ${opName} failed (exit ${result.exitCode}${errorClass ? `, class ${errorClass}` : ''}): ${tail(output.trim())}`, { opName, errorClass, exitCode: result.exitCode, stderrTail: tail(output.trim()) });
|
|
298
|
+
}
|
|
299
|
+
if (graphql)
|
|
300
|
+
this.assertGraphqlEnvelope(opName, result);
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
assertGraphqlEnvelope(opName, result) {
|
|
304
|
+
const errorInfo = () => ({
|
|
305
|
+
opName,
|
|
306
|
+
errorClass: this.classify(`${result.stderr}\n${result.stdout}`),
|
|
307
|
+
exitCode: 0,
|
|
308
|
+
stderrTail: tail(result.stdout),
|
|
309
|
+
});
|
|
310
|
+
let payload;
|
|
311
|
+
try {
|
|
312
|
+
payload = parseJsonResponse(result.stdout);
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
316
|
+
throw new DriverOpError(`op ${opName} returned an invalid GraphQL envelope: ${message}`, errorInfo());
|
|
317
|
+
}
|
|
318
|
+
if (!isRecord(payload)) {
|
|
319
|
+
throw new DriverOpError(`op ${opName} returned a malformed GraphQL envelope`, errorInfo());
|
|
320
|
+
}
|
|
321
|
+
if (payload.errors !== undefined && !Array.isArray(payload.errors)) {
|
|
322
|
+
throw new DriverOpError(`op ${opName} returned malformed GraphQL errors`, errorInfo());
|
|
323
|
+
}
|
|
324
|
+
if (Array.isArray(payload.errors) && payload.errors.length > 0) {
|
|
325
|
+
throw new DriverOpError(`op ${opName} failed with GraphQL errors: ${tail(JSON.stringify(payload.errors))}`, errorInfo());
|
|
326
|
+
}
|
|
327
|
+
if (!Object.hasOwn(payload, 'data')) {
|
|
328
|
+
throw new DriverOpError(`op ${opName} returned a GraphQL envelope without data`, errorInfo());
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
async runPaged(rowOp, argvForPage, fields, options) {
|
|
332
|
+
const label = options.sourceKey === undefined ? rowOp : `${rowOp}[${options.sourceKey}]`;
|
|
333
|
+
const all = [];
|
|
334
|
+
const seen = new Map();
|
|
335
|
+
let previousIds;
|
|
336
|
+
for (let page = 1; page <= options.pageCap; page++) {
|
|
337
|
+
const result = await this.execGitHub(label, argvForPage(page));
|
|
338
|
+
const rawPage = parseJsonPagedPage(result.stdout);
|
|
339
|
+
if (rawPage.length === 0)
|
|
340
|
+
return all;
|
|
341
|
+
const rows = validateRows(rowOp, projectPayload(rawPage, fields), options.sourceKey === undefined ? undefined : { sourceKey: options.sourceKey });
|
|
342
|
+
const projected = options.projectPage === undefined ? rows : options.projectPage(rows);
|
|
343
|
+
const ids = new Set(projected.map(row => String(row[options.idField])));
|
|
344
|
+
if (previousIds !== undefined
|
|
345
|
+
&& previousIds.size > 0
|
|
346
|
+
&& ids.size === previousIds.size
|
|
347
|
+
&& [...ids].every(id => previousIds.has(id))) {
|
|
348
|
+
throw new DriverOpError(`op ${label}: pagination did not advance at page ${page}`, { opName: label });
|
|
349
|
+
}
|
|
350
|
+
previousIds = ids;
|
|
351
|
+
for (const row of projected) {
|
|
352
|
+
const key = String(row[options.idField]);
|
|
353
|
+
const fingerprint = JSON.stringify(row);
|
|
354
|
+
const prior = seen.get(key);
|
|
355
|
+
if (prior === undefined) {
|
|
356
|
+
seen.set(key, fingerprint);
|
|
357
|
+
all.push(row);
|
|
358
|
+
}
|
|
359
|
+
else if (prior !== fingerprint) {
|
|
360
|
+
throw new DriverOpError(`op ${label}: conflicting duplicate row for ${options.idField}=${key} across pages`, { opName: label });
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (options.shouldStop?.(projected, page) === true)
|
|
364
|
+
return all;
|
|
365
|
+
}
|
|
366
|
+
if (options.capBehavior === 'fail') {
|
|
367
|
+
throw new DriverOpError(`op ${label}: exceeded page cap ${options.pageCap} (refusing silent truncation)`, {
|
|
368
|
+
opName: label,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
return all;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=github-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-driver.js","sourceRoot":"","sources":["../../src/platform/github-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type CommentSourceClass } from './types.js';
|
|
1
2
|
import { type NormalizedRow } from './row-schema.js';
|
|
2
3
|
export interface ReviewTokenMarker {
|
|
3
4
|
kind: 'pass' | 'fail';
|
|
@@ -19,10 +20,6 @@ export declare function rowBodyDigest(row: NormalizedRow): string;
|
|
|
19
20
|
export declare function rowTokens(row: NormalizedRow): ReviewTokenMarker[];
|
|
20
21
|
export declare function rowAcks(row: NormalizedRow): AckMarker[];
|
|
21
22
|
export declare function rowHasBody(row: NormalizedRow): boolean;
|
|
22
|
-
export type CommentSourceClass = 'reviews' | 'threaded' | 'top-level';
|
|
23
|
-
export declare function classifyCommentSource(source: {
|
|
24
|
-
map?: Record<string, unknown>;
|
|
25
|
-
}): CommentSourceClass;
|
|
26
23
|
export interface AckActorContext {
|
|
27
24
|
replyActorId?: string;
|
|
28
25
|
replyActorStatus?: 'verified' | 'provisional';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../src/platform/markers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../src/platform/markers.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAkC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAMrE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAEnD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAE3D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK3D;AAID,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAU1D;AAOD,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAExD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,iBAAiB,EAAE,CAEjE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAEtD;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;CAC/C;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,kBAAkB,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,EAAE,IAAI,MAAM,EAAE,QAAQ,MAAM,WAAmC,CAAC;AAChH,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,EAAE,IAAI,MAAM,WAAyB,CAAC;AAErF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,eAAe,GAAG,aAAa,CA0B3F"}
|
package/dist/platform/markers.js
CHANGED
|
@@ -54,14 +54,6 @@ export function rowAcks(row) {
|
|
|
54
54
|
export function rowHasBody(row) {
|
|
55
55
|
return isProjected(row) ? row.hasBody === true : rawBody(row) !== '';
|
|
56
56
|
}
|
|
57
|
-
export function classifyCommentSource(source) {
|
|
58
|
-
const map = source.map ?? {};
|
|
59
|
-
if ('reviewState' in map)
|
|
60
|
-
return 'reviews';
|
|
61
|
-
if ('discussionId' in map)
|
|
62
|
-
return 'threaded';
|
|
63
|
-
return 'top-level';
|
|
64
|
-
}
|
|
65
57
|
export const ackRevisionKey = (sourceKey, id, digest) => `${sourceKey}:${id}:${digest}`;
|
|
66
58
|
export const ackCarrierKey = (sourceKey, id) => `${sourceKey}:${id}`;
|
|
67
59
|
export function collectValidAcks(rows, ctx) {
|