@agents-ensemble/core 0.4.0 → 0.5.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.
Files changed (119) hide show
  1. package/dist/acp/acp-preset-bins.d.ts +10 -0
  2. package/dist/acp/acp-preset-bins.d.ts.map +1 -0
  3. package/dist/acp/acp-preset-bins.js +27 -0
  4. package/dist/acp/acp-preset-bins.js.map +1 -0
  5. package/dist/acp/index.d.ts +3 -0
  6. package/dist/acp/index.d.ts.map +1 -1
  7. package/dist/acp/index.js +3 -0
  8. package/dist/acp/index.js.map +1 -1
  9. package/dist/acp/resolve-acp-spawn.d.ts +2 -0
  10. package/dist/acp/resolve-acp-spawn.d.ts.map +1 -1
  11. package/dist/acp/resolve-acp-spawn.js +10 -6
  12. package/dist/acp/resolve-acp-spawn.js.map +1 -1
  13. package/dist/acp/resolve-bundled-acp-bin.d.ts +11 -0
  14. package/dist/acp/resolve-bundled-acp-bin.d.ts.map +1 -0
  15. package/dist/acp/resolve-bundled-acp-bin.js +60 -0
  16. package/dist/acp/resolve-bundled-acp-bin.js.map +1 -0
  17. package/dist/acp/validate-acp-preset-prerequisites.d.ts +24 -0
  18. package/dist/acp/validate-acp-preset-prerequisites.d.ts.map +1 -0
  19. package/dist/acp/validate-acp-preset-prerequisites.js +121 -0
  20. package/dist/acp/validate-acp-preset-prerequisites.js.map +1 -0
  21. package/dist/conductor/conductor-session-driver.d.ts +2 -0
  22. package/dist/conductor/conductor-session-driver.d.ts.map +1 -1
  23. package/dist/conductor/conductor-session-driver.js +16 -7
  24. package/dist/conductor/conductor-session-driver.js.map +1 -1
  25. package/dist/conductor/conductor-session.d.ts +3 -0
  26. package/dist/conductor/conductor-session.d.ts.map +1 -1
  27. package/dist/conductor/conductor-session.js +149 -62
  28. package/dist/conductor/conductor-session.js.map +1 -1
  29. package/dist/conductor/resolve-conductor-model-id.d.ts +7 -3
  30. package/dist/conductor/resolve-conductor-model-id.d.ts.map +1 -1
  31. package/dist/conductor/resolve-conductor-model-id.js +9 -11
  32. package/dist/conductor/resolve-conductor-model-id.js.map +1 -1
  33. package/dist/conductor/session/events/session-log-event-groups.d.ts +2 -2
  34. package/dist/conductor/session/events/session-log-event-groups.d.ts.map +1 -1
  35. package/dist/conductor/session/events/session-log-event-groups.js +1 -0
  36. package/dist/conductor/session/events/session-log-event-groups.js.map +1 -1
  37. package/dist/conductor/session/events/session-log-event.d.ts +9 -1
  38. package/dist/conductor/session/events/session-log-event.d.ts.map +1 -1
  39. package/dist/conductor/session/session-logger.d.ts.map +1 -1
  40. package/dist/conductor/session/session-logger.js +1 -0
  41. package/dist/conductor/session/session-logger.js.map +1 -1
  42. package/dist/config/deep-merge.d.ts +3 -0
  43. package/dist/config/deep-merge.d.ts.map +1 -0
  44. package/dist/config/deep-merge.js +20 -0
  45. package/dist/config/deep-merge.js.map +1 -0
  46. package/dist/config/defaults.d.ts +5 -0
  47. package/dist/config/defaults.d.ts.map +1 -0
  48. package/dist/config/defaults.js +35 -0
  49. package/dist/config/defaults.js.map +1 -0
  50. package/dist/config/index.d.ts +9 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +6 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/config/load-ensemble-config.d.ts +12 -0
  55. package/dist/config/load-ensemble-config.d.ts.map +1 -0
  56. package/dist/config/load-ensemble-config.js +44 -0
  57. package/dist/config/load-ensemble-config.js.map +1 -0
  58. package/dist/config/parse-config.d.ts +7 -0
  59. package/dist/config/parse-config.d.ts.map +1 -0
  60. package/dist/config/parse-config.js +179 -0
  61. package/dist/config/parse-config.js.map +1 -0
  62. package/dist/config/resolve-settings.d.ts +78 -0
  63. package/dist/config/resolve-settings.d.ts.map +1 -0
  64. package/dist/config/resolve-settings.js +141 -0
  65. package/dist/config/resolve-settings.js.map +1 -0
  66. package/dist/config/types.d.ts +52 -0
  67. package/dist/config/types.d.ts.map +1 -0
  68. package/dist/config/types.js +2 -0
  69. package/dist/config/types.js.map +1 -0
  70. package/dist/github/fetch-github-updates.d.ts +17 -3
  71. package/dist/github/fetch-github-updates.d.ts.map +1 -1
  72. package/dist/github/fetch-github-updates.js +97 -97
  73. package/dist/github/fetch-github-updates.js.map +1 -1
  74. package/dist/github/github-auth.d.ts +15 -0
  75. package/dist/github/github-auth.d.ts.map +1 -0
  76. package/dist/github/github-auth.js +44 -0
  77. package/dist/github/github-auth.js.map +1 -0
  78. package/dist/github/github-client.d.ts +76 -0
  79. package/dist/github/github-client.d.ts.map +1 -0
  80. package/dist/github/github-client.js +198 -0
  81. package/dist/github/github-client.js.map +1 -0
  82. package/dist/github/github-monitor-error.d.ts +24 -0
  83. package/dist/github/github-monitor-error.d.ts.map +1 -0
  84. package/dist/github/github-monitor-error.js +75 -0
  85. package/dist/github/github-monitor-error.js.map +1 -0
  86. package/dist/github/github-monitor.d.ts +9 -3
  87. package/dist/github/github-monitor.d.ts.map +1 -1
  88. package/dist/github/github-monitor.js +41 -3
  89. package/dist/github/github-monitor.js.map +1 -1
  90. package/dist/github/github-test-fixtures.d.ts +52 -0
  91. package/dist/github/github-test-fixtures.d.ts.map +1 -1
  92. package/dist/github/github-test-fixtures.js +42 -0
  93. package/dist/github/github-test-fixtures.js.map +1 -1
  94. package/dist/github/index.d.ts +11 -2
  95. package/dist/github/index.d.ts.map +1 -1
  96. package/dist/github/index.js +6 -2
  97. package/dist/github/index.js.map +1 -1
  98. package/dist/github/issue-context.d.ts +8 -1
  99. package/dist/github/issue-context.d.ts.map +1 -1
  100. package/dist/github/issue-context.js +13 -12
  101. package/dist/github/issue-context.js.map +1 -1
  102. package/dist/github/resolve-github-auth-token.d.ts +19 -0
  103. package/dist/github/resolve-github-auth-token.d.ts.map +1 -0
  104. package/dist/github/resolve-github-auth-token.js +32 -0
  105. package/dist/github/resolve-github-auth-token.js.map +1 -0
  106. package/dist/github/run-gh.d.ts +24 -2
  107. package/dist/github/run-gh.d.ts.map +1 -1
  108. package/dist/github/run-gh.js +62 -9
  109. package/dist/github/run-gh.js.map +1 -1
  110. package/dist/index.d.ts +1 -0
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +1 -0
  113. package/dist/index.js.map +1 -1
  114. package/dist/profile/load-profile.d.ts +5 -2
  115. package/dist/profile/load-profile.d.ts.map +1 -1
  116. package/dist/profile/load-profile.js +9 -7
  117. package/dist/profile/load-profile.js.map +1 -1
  118. package/dist/profiles/implementer-and-reviewer/team.md +11 -3
  119. package/package.json +6 -1
@@ -0,0 +1,198 @@
1
+ import { resolveGitHubAuthToken } from './resolve-github-auth-token.js';
2
+ const GITHUB_REST_BASE = 'https://api.github.com';
3
+ const GITHUB_GRAPHQL_URL = 'https://api.github.com/graphql';
4
+ const USER_AGENT = 'agents-ensemble';
5
+ export class GitHubApiError extends Error {
6
+ status;
7
+ retryable;
8
+ constructor(message, options) {
9
+ super(message);
10
+ this.name = 'GitHubApiError';
11
+ this.status = options.status;
12
+ this.retryable = options.retryable ?? false;
13
+ }
14
+ }
15
+ export async function createGitHubClient(options) {
16
+ const resolveTokenFn = options.resolveTokenFn ?? resolveGitHubAuthToken;
17
+ const auth = await resolveTokenFn({
18
+ config: options.config,
19
+ env: options.env,
20
+ });
21
+ if (!auth.token) {
22
+ throw new GitHubApiError('GitHub authentication token not found', {
23
+ status: 401,
24
+ retryable: false,
25
+ });
26
+ }
27
+ return buildGitHubClient({
28
+ token: auth.token,
29
+ fetchFn: options.fetchFn,
30
+ signal: options.signal,
31
+ });
32
+ }
33
+ export function buildGitHubClient(options) {
34
+ const fetchFn = options.fetchFn ?? fetch;
35
+ const restRequest = async (path, init = {}) => {
36
+ const url = path.startsWith('http') ? path : `${GITHUB_REST_BASE}${path}`;
37
+ const response = await fetchFn(url, {
38
+ ...init,
39
+ signal: options.signal,
40
+ headers: {
41
+ Accept: 'application/vnd.github+json',
42
+ Authorization: `Bearer ${options.token}`,
43
+ 'User-Agent': USER_AGENT,
44
+ 'X-GitHub-Api-Version': '2022-11-28',
45
+ ...(init.headers ?? {}),
46
+ },
47
+ });
48
+ if (!response.ok) {
49
+ throw await createRestError(response);
50
+ }
51
+ return (await response.json());
52
+ };
53
+ const restPaginate = async (path) => {
54
+ const items = [];
55
+ let nextUrl = path;
56
+ while (nextUrl) {
57
+ const url = nextUrl.startsWith('http') ? nextUrl : `${GITHUB_REST_BASE}${nextUrl}`;
58
+ const response = await fetchFn(url, {
59
+ signal: options.signal,
60
+ headers: {
61
+ Accept: 'application/vnd.github+json',
62
+ Authorization: `Bearer ${options.token}`,
63
+ 'User-Agent': USER_AGENT,
64
+ 'X-GitHub-Api-Version': '2022-11-28',
65
+ },
66
+ });
67
+ if (!response.ok) {
68
+ throw await createRestError(response);
69
+ }
70
+ const page = (await response.json());
71
+ items.push(...page);
72
+ nextUrl = parseLinkHeader(response.headers.get('link')).next;
73
+ }
74
+ return items;
75
+ };
76
+ const graphqlRequest = async (query, variables) => {
77
+ const response = await fetchFn(GITHUB_GRAPHQL_URL, {
78
+ method: 'POST',
79
+ signal: options.signal,
80
+ headers: {
81
+ Accept: 'application/vnd.github+json',
82
+ Authorization: `Bearer ${options.token}`,
83
+ 'Content-Type': 'application/json',
84
+ 'User-Agent': USER_AGENT,
85
+ },
86
+ body: JSON.stringify({ query, variables }),
87
+ });
88
+ if (!response.ok) {
89
+ throw await createRestError(response);
90
+ }
91
+ const payload = (await response.json());
92
+ if (payload.errors?.length) {
93
+ const message = payload.errors.map((error) => error.message).join('; ');
94
+ throw new GitHubApiError(`GitHub GraphQL error: ${message}`, {
95
+ status: response.status,
96
+ retryable: response.status === 429 || response.status >= 500,
97
+ });
98
+ }
99
+ if (!payload.data) {
100
+ throw new GitHubApiError('GitHub GraphQL response missing data', {
101
+ status: response.status,
102
+ retryable: false,
103
+ });
104
+ }
105
+ return payload.data;
106
+ };
107
+ return {
108
+ async getIssue(owner, repo, issueNumber) {
109
+ return restRequest(`/repos/${owner}/${repo}/issues/${issueNumber}`);
110
+ },
111
+ async listIssueComments(owner, repo, issueNumber) {
112
+ return restPaginate(`/repos/${owner}/${repo}/issues/${issueNumber}/comments?per_page=100`);
113
+ },
114
+ async searchLinkedPullRequests(owner, repo, issueNumber) {
115
+ const query = encodeURIComponent(`${issueNumber} repo:${owner}/${repo} type:pr`);
116
+ const data = await restRequest(`/search/issues?q=${query}&per_page=20`);
117
+ return data.items.filter((pr) => pr.state === 'OPEN' || pr.state === 'open');
118
+ },
119
+ async listPullRequestReviews(owner, repo, prNumber) {
120
+ return restPaginate(`/repos/${owner}/${repo}/pulls/${prNumber}/reviews?per_page=100`);
121
+ },
122
+ async listPullRequestReviewComments(owner, repo, prNumber) {
123
+ return restPaginate(`/repos/${owner}/${repo}/pulls/${prNumber}/comments?per_page=100`);
124
+ },
125
+ async getStatusCheckRollup(owner, repo, prNumber) {
126
+ const query = `
127
+ query($owner: String!, $name: String!, $number: Int!) {
128
+ repository(owner: $owner, name: $name) {
129
+ pullRequest(number: $number) {
130
+ statusCheckRollup {
131
+ contexts(first: 100) {
132
+ pageInfo {
133
+ hasNextPage
134
+ endCursor
135
+ }
136
+ nodes {
137
+ __typename
138
+ ... on CheckRun {
139
+ name
140
+ status
141
+ conclusion
142
+ detailsUrl
143
+ }
144
+ ... on StatusContext {
145
+ context
146
+ state
147
+ targetUrl
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ `;
156
+ const data = await graphqlRequest(query, {
157
+ owner,
158
+ name: repo,
159
+ number: prNumber,
160
+ });
161
+ const rollup = data.repository?.pullRequest?.statusCheckRollup;
162
+ if (!rollup) {
163
+ return [];
164
+ }
165
+ return rollup.contexts.nodes ?? [];
166
+ },
167
+ };
168
+ }
169
+ async function createRestError(response) {
170
+ let detail = response.statusText;
171
+ try {
172
+ const body = (await response.json());
173
+ if (body.message) {
174
+ detail = body.message;
175
+ }
176
+ }
177
+ catch {
178
+ // ignore JSON parse errors
179
+ }
180
+ const remaining = response.headers.get('x-ratelimit-remaining');
181
+ const retryable = response.status === 429 ||
182
+ response.status >= 500 ||
183
+ (response.status === 403 && remaining === '0');
184
+ return new GitHubApiError(`GitHub API ${response.status}: ${detail}`, { status: response.status, retryable });
185
+ }
186
+ function parseLinkHeader(header) {
187
+ if (!header) {
188
+ return {};
189
+ }
190
+ for (const part of header.split(',')) {
191
+ const match = part.match(/<([^>]+)>;\s*rel="([^"]+)"/);
192
+ if (match?.[2] === 'next') {
193
+ return { next: match[1] };
194
+ }
195
+ }
196
+ return {};
197
+ }
198
+ //# sourceMappingURL=github-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/github/github-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** GitHub 監視 poll のフェーズ(`monitor_error` 用)。 */
2
+ export type GitHubMonitorErrorPhase = 'issue_comments' | 'pr_search' | 'pr_reviews' | 'pr_review_comments' | 'pr_status_checks';
3
+ export type GitHubMonitorErrorCause = 'parse' | 'gh_cli' | 'auth' | 'unknown';
4
+ export interface GitHubMonitorPhaseError {
5
+ phase: GitHubMonitorErrorPhase;
6
+ prNumber?: number;
7
+ cause: GitHubMonitorErrorCause;
8
+ retryable: boolean;
9
+ message: string;
10
+ /** `formatGitHubErrorMessage` 用の元エラー。 */
11
+ sourceError?: unknown;
12
+ }
13
+ /** poll フェーズ失敗を harness へ伝えるエラー。 */
14
+ export declare class GitHubMonitorError extends Error {
15
+ readonly phase: GitHubMonitorErrorPhase;
16
+ readonly prNumber?: number;
17
+ readonly cause: GitHubMonitorErrorCause;
18
+ readonly retryable: boolean;
19
+ constructor(options: GitHubMonitorPhaseError);
20
+ }
21
+ export declare function safeUpperString(value: unknown, fallback: string): string;
22
+ export declare function classifyGitHubMonitorError(error: unknown): Pick<GitHubMonitorPhaseError, 'cause' | 'retryable' | 'message'>;
23
+ export declare function createGitHubMonitorPhaseError(phase: GitHubMonitorErrorPhase, error: unknown, prNumber?: number): GitHubMonitorPhaseError;
24
+ //# sourceMappingURL=github-monitor-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-monitor-error.d.ts","sourceRoot":"","sources":["../../src/github/github-monitor-error.ts"],"names":[],"mappings":"AAGA,+CAA+C;AAC/C,MAAM,MAAM,uBAAuB,GAC/B,gBAAgB,GAChB,WAAW,GACX,YAAY,GACZ,oBAAoB,GACpB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,uBAAuB,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,uBAAuB,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,oCAAoC;AACpC,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,EAAE,uBAAuB;CAQ7C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKxE;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC,CA8ClE;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,uBAAuB,EAC9B,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,uBAAuB,CAQzB"}
@@ -0,0 +1,75 @@
1
+ import { GitHubApiError } from './github-client.js';
2
+ import { RunGhError } from './run-gh.js';
3
+ /** poll フェーズ失敗を harness へ伝えるエラー。 */
4
+ export class GitHubMonitorError extends Error {
5
+ phase;
6
+ prNumber;
7
+ cause;
8
+ retryable;
9
+ constructor(options) {
10
+ super(options.message);
11
+ this.name = 'GitHubMonitorError';
12
+ this.phase = options.phase;
13
+ this.prNumber = options.prNumber;
14
+ this.cause = options.cause;
15
+ this.retryable = options.retryable;
16
+ }
17
+ }
18
+ export function safeUpperString(value, fallback) {
19
+ if (typeof value === 'string' && value.length > 0) {
20
+ return value.toUpperCase();
21
+ }
22
+ return fallback;
23
+ }
24
+ export function classifyGitHubMonitorError(error) {
25
+ if (error instanceof GitHubMonitorError) {
26
+ return {
27
+ cause: error.cause,
28
+ retryable: error.retryable,
29
+ message: error.message,
30
+ };
31
+ }
32
+ if (error instanceof RunGhError) {
33
+ return {
34
+ cause: error.cause === 'auth' ? 'auth' : 'gh_cli',
35
+ retryable: error.retryable,
36
+ message: error.message,
37
+ };
38
+ }
39
+ if (error instanceof GitHubApiError) {
40
+ return {
41
+ cause: error.status === 401 || error.status === 403 ? 'auth' : 'gh_cli',
42
+ retryable: error.retryable,
43
+ message: error.message,
44
+ };
45
+ }
46
+ if (error instanceof TypeError) {
47
+ return {
48
+ cause: 'parse',
49
+ retryable: false,
50
+ message: error.message,
51
+ };
52
+ }
53
+ if (error instanceof Error) {
54
+ return {
55
+ cause: 'unknown',
56
+ retryable: false,
57
+ message: error.message,
58
+ };
59
+ }
60
+ return {
61
+ cause: 'unknown',
62
+ retryable: false,
63
+ message: String(error),
64
+ };
65
+ }
66
+ export function createGitHubMonitorPhaseError(phase, error, prNumber) {
67
+ const classified = classifyGitHubMonitorError(error);
68
+ return {
69
+ phase,
70
+ prNumber,
71
+ ...classified,
72
+ sourceError: error,
73
+ };
74
+ }
75
+ //# sourceMappingURL=github-monitor-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-monitor-error.js","sourceRoot":"","sources":["../../src/github/github-monitor-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsBzC,oCAAoC;AACpC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,KAAK,CAA0B;IAC/B,QAAQ,CAAU;IAClB,KAAK,CAA0B;IAC/B,SAAS,CAAU;IAE5B,YAAY,OAAgC;QAC1C,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,QAAgB;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;QACxC,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YACjD,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YACvE,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,KAA8B,EAC9B,KAAc,EACd,QAAiB;IAEjB,MAAM,UAAU,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO;QACL,KAAK;QACL,QAAQ;QACR,GAAG,UAAU;QACb,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC"}
@@ -1,21 +1,27 @@
1
+ import type { EnsembleConfig } from '../config/types.js';
2
+ import type { GitHubClient } from './github-client.js';
1
3
  import { type GitHubMonitorCursor } from './github-monitor-cursor.js';
2
4
  import type { GitHubUpdatePayload } from './github-update-types.js';
3
- import { runGh } from './run-gh.js';
4
5
  export declare const DEFAULT_GITHUB_MONITOR_DEBOUNCE_MS = 30000;
5
6
  export declare const DEFAULT_GITHUB_MONITOR_POLL_INTERVAL_MS = 60000;
6
7
  export declare const DEFAULT_GITHUB_MONITOR_ACTIVE_POLL_INTERVAL_MS = 15000;
8
+ /** `stop()` が進行中 poll の完了を待つ上限(ms)。超過時は poll を abort する(#209)。 */
9
+ export declare const DEFAULT_GITHUB_MONITOR_STOP_POLL_WAIT_MS = 5000;
7
10
  export interface GitHubMonitorOptions {
8
11
  issueUrl: string;
9
- cwd?: string;
12
+ /** harness 設定。GitHub API 認証解決で参照する。 */
13
+ ensembleConfig: EnsembleConfig;
10
14
  cursor?: GitHubMonitorCursor;
11
15
  debounceMs?: number;
12
16
  pollIntervalMs?: number;
13
17
  activePollIntervalMs?: number;
18
+ /** `stop()` が `pollInFlight` を待つ上限(ms)。デフォルト 5s。 */
19
+ stopPollWaitMs?: number;
14
20
  onUpdate: (payload: GitHubUpdatePayload) => void;
15
21
  onCursorChange?: (cursor: GitHubMonitorCursor) => void;
16
22
  onPollError?: (error: unknown) => void;
17
23
  shutdownSignal?: AbortSignal;
18
- runGhFn?: typeof runGh;
24
+ githubClient?: GitHubClient;
19
25
  }
20
26
  export interface GitHubMonitor {
21
27
  start(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"github-monitor.d.ts","sourceRoot":"","sources":["../../src/github/github-monitor.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAoB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,eAAO,MAAM,kCAAkC,QAAS,CAAC;AACzD,eAAO,MAAM,uCAAuC,QAAS,CAAC;AAC9D,eAAO,MAAM,8CAA8C,QAAS,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACvD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,IAAI,mBAAmB,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA+FhF"}
1
+ {"version":3,"file":"github-monitor.d.ts","sourceRoot":"","sources":["../../src/github/github-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAoB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,eAAO,MAAM,kCAAkC,QAAS,CAAC;AACzD,eAAO,MAAM,uCAAuC,QAAS,CAAC;AAC9D,eAAO,MAAM,8CAA8C,QAAS,CAAC;AACrE,kEAAkE;AAClE,eAAO,MAAM,wCAAwC,OAAQ,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACvD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,IAAI,mBAAmB,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAoIhF"}
@@ -1,18 +1,24 @@
1
1
  import { DebounceBuffer } from './debounce-buffer.js';
2
2
  import { fetchGitHubUpdates, } from './fetch-github-updates.js';
3
+ import { formatGitHubErrorMessage } from './github-auth.js';
4
+ import { GitHubMonitorError } from './github-monitor-error.js';
3
5
  import { emptyGitHubMonitorCursor, isEmptyGitHubMonitorCursor, normalizeGitHubMonitorCursor, } from './github-monitor-cursor.js';
4
6
  export const DEFAULT_GITHUB_MONITOR_DEBOUNCE_MS = 30_000;
5
7
  export const DEFAULT_GITHUB_MONITOR_POLL_INTERVAL_MS = 60_000;
6
8
  export const DEFAULT_GITHUB_MONITOR_ACTIVE_POLL_INTERVAL_MS = 15_000;
9
+ /** `stop()` が進行中 poll の完了を待つ上限(ms)。超過時は poll を abort する(#209)。 */
10
+ export const DEFAULT_GITHUB_MONITOR_STOP_POLL_WAIT_MS = 5_000;
7
11
  export function createGitHubMonitor(options) {
8
12
  const debounceMs = options.debounceMs ?? DEFAULT_GITHUB_MONITOR_DEBOUNCE_MS;
9
13
  const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_GITHUB_MONITOR_POLL_INTERVAL_MS;
10
14
  const activePollIntervalMs = options.activePollIntervalMs ?? DEFAULT_GITHUB_MONITOR_ACTIVE_POLL_INTERVAL_MS;
15
+ const stopPollWaitMs = options.stopPollWaitMs ?? DEFAULT_GITHUB_MONITOR_STOP_POLL_WAIT_MS;
11
16
  let cursor = normalizeGitHubMonitorCursor(options.cursor ?? emptyGitHubMonitorCursor());
12
17
  let started = false;
13
18
  let stopped = false;
14
19
  let pollTimer;
15
20
  let pollInFlight = false;
21
+ let pollAbortController;
16
22
  let hasPendingCi = false;
17
23
  let needsBootstrapPoll = isEmptyGitHubMonitorCursor(cursor);
18
24
  const buffer = new DebounceBuffer({
@@ -39,13 +45,15 @@ export function createGitHubMonitor(options) {
39
45
  if (stopped || pollInFlight)
40
46
  return;
41
47
  pollInFlight = true;
48
+ pollAbortController = new AbortController();
42
49
  try {
43
50
  const input = {
44
51
  issueUrl: options.issueUrl,
45
52
  cursor,
46
- cwd: options.cwd,
47
- runGhFn: options.runGhFn,
53
+ ensembleConfig: options.ensembleConfig,
54
+ githubClient: options.githubClient,
48
55
  initialCursorPoll: needsBootstrapPoll,
56
+ abortSignal: pollAbortController.signal,
49
57
  };
50
58
  const result = await fetchGitHubUpdates(input);
51
59
  cursor = result.cursor;
@@ -55,11 +63,24 @@ export function createGitHubMonitor(options) {
55
63
  if (result.updates.length > 0) {
56
64
  buffer.pushMany(result.updates);
57
65
  }
66
+ for (const phaseError of result.errors) {
67
+ const source = phaseError.sourceError ?? new Error(phaseError.message);
68
+ options.onPollError?.(new GitHubMonitorError({
69
+ phase: phaseError.phase,
70
+ prNumber: phaseError.prNumber,
71
+ cause: phaseError.cause,
72
+ retryable: phaseError.retryable,
73
+ message: formatGitHubErrorMessage(source, options.ensembleConfig),
74
+ }));
75
+ }
58
76
  }
59
77
  catch (error) {
60
- options.onPollError?.(error);
78
+ if (!isAbortError(error)) {
79
+ options.onPollError?.(new Error(formatGitHubErrorMessage(error, options.ensembleConfig)));
80
+ }
61
81
  }
62
82
  finally {
83
+ pollAbortController = undefined;
63
84
  pollInFlight = false;
64
85
  if (!stopped && started) {
65
86
  const nextDelay = hasPendingCi ? activePollIntervalMs : pollIntervalMs;
@@ -67,6 +88,9 @@ export function createGitHubMonitor(options) {
67
88
  }
68
89
  }
69
90
  };
91
+ const abortInFlightPoll = () => {
92
+ pollAbortController?.abort();
93
+ };
70
94
  return {
71
95
  start() {
72
96
  if (started || stopped)
@@ -83,9 +107,20 @@ export function createGitHubMonitor(options) {
83
107
  pollTimer = undefined;
84
108
  }
85
109
  buffer.stop();
110
+ const deadline = Date.now() + stopPollWaitMs;
86
111
  while (pollInFlight) {
112
+ if (Date.now() >= deadline) {
113
+ abortInFlightPoll();
114
+ break;
115
+ }
87
116
  await new Promise((resolve) => setTimeout(resolve, 10));
88
117
  }
118
+ if (pollInFlight) {
119
+ const graceDeadline = Date.now() + 500;
120
+ while (pollInFlight && Date.now() < graceDeadline) {
121
+ await new Promise((resolve) => setTimeout(resolve, 10));
122
+ }
123
+ }
89
124
  },
90
125
  flush() {
91
126
  buffer.flush();
@@ -95,4 +130,7 @@ export function createGitHubMonitor(options) {
95
130
  },
96
131
  };
97
132
  }
133
+ function isAbortError(error) {
134
+ return error instanceof Error && error.name === 'AbortError';
135
+ }
98
136
  //# sourceMappingURL=github-monitor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-monitor.js","sourceRoot":"","sources":["../../src/github/github-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-monitor.js","sourceRoot":"","sources":["../../src/github/github-monitor.ts"],"names":[],"mappings":"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"}
@@ -26,5 +26,57 @@ export declare const GH_STATUS_CHECK_ROLLUP_STATUS_CONTEXT_SUCCESS: readonly [{
26
26
  readonly state: "SUCCESS";
27
27
  readonly targetUrl: "https://github.com/org/repo/actions/runs/2";
28
28
  }];
29
+ /**
30
+ * Issue #185 再現: `__typename` 欠落の StatusContext(gap A)。
31
+ * 実環境の GraphQL レスポンスで `__typename` が省略されるケース。
32
+ */
33
+ export declare const GH_STATUS_CHECK_ROLLUP_STATUS_CONTEXT_NO_TYPENAME: readonly [{
34
+ readonly context: "ci/legacy-no-typename";
35
+ readonly state: "PENDING";
36
+ readonly targetUrl: "https://github.com/org/repo/actions/runs/3";
37
+ }];
38
+ /**
39
+ * Issue #185 再現: `conclusion` が非 string(gap B)。
40
+ * `(check.conclusion ?? 'UNKNOWN').toUpperCase()` が落ちるパターン。
41
+ */
42
+ export declare const GH_STATUS_CHECK_ROLLUP_NON_STRING_CONCLUSION: readonly [{
43
+ readonly __typename: "CheckRun";
44
+ readonly name: "ci/broken-conclusion";
45
+ readonly status: "COMPLETED";
46
+ readonly conclusion: 0;
47
+ readonly detailsUrl: "https://github.com/org/repo/actions/runs/4";
48
+ }];
49
+ /**
50
+ * Issue #185 再現: 未知 `__typename`(gap C — WorkflowRun)。
51
+ */
52
+ export declare const GH_STATUS_CHECK_ROLLUP_WORKFLOW_RUN: readonly [{
53
+ readonly __typename: "WorkflowRun";
54
+ readonly name: "ci/workflow";
55
+ readonly status: "COMPLETED";
56
+ readonly conclusion: "SUCCESS";
57
+ }];
58
+ /** Issue #185 再現: 複合 rollup(正常 + 異常エントリ混在)。 */
59
+ export declare const GH_STATUS_CHECK_ROLLUP_MIXED_ISSUE_185: readonly [{
60
+ readonly context: "ci/legacy-no-typename";
61
+ readonly state: "PENDING";
62
+ readonly targetUrl: "https://github.com/org/repo/actions/runs/3";
63
+ }, {
64
+ readonly __typename: "CheckRun";
65
+ readonly name: "ci/broken-conclusion";
66
+ readonly status: "COMPLETED";
67
+ readonly conclusion: 0;
68
+ readonly detailsUrl: "https://github.com/org/repo/actions/runs/4";
69
+ }, {
70
+ readonly __typename: "WorkflowRun";
71
+ readonly name: "ci/workflow";
72
+ readonly status: "COMPLETED";
73
+ readonly conclusion: "SUCCESS";
74
+ }, {
75
+ readonly __typename: "CheckRun";
76
+ readonly name: "ci/test";
77
+ readonly status: "COMPLETED";
78
+ readonly conclusion: "SUCCESS";
79
+ readonly detailsUrl: "https://github.com/org/repo/actions/runs/1";
80
+ }];
29
81
  export declare function ghPrViewStatusCheckRollupJson(checkRuns: readonly object[]): string;
30
82
  //# sourceMappingURL=github-test-fixtures.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-test-fixtures.d.ts","sourceRoot":"","sources":["../../src/github/github-test-fixtures.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,eAAO,MAAM,wCAAwC;;;;;;EAQ3C,CAAC;AAEX,eAAO,MAAM,kCAAkC;;;;;;EAQrC,CAAC;AAEX,6DAA6D;AAC7D,eAAO,MAAM,6CAA6C;;;;;EAOhD,CAAC;AAEX,eAAO,MAAM,6CAA6C;;;;;EAOhD,CAAC;AAEX,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAElF"}
1
+ {"version":3,"file":"github-test-fixtures.d.ts","sourceRoot":"","sources":["../../src/github/github-test-fixtures.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,eAAO,MAAM,wCAAwC;;;;;;EAQ3C,CAAC;AAEX,eAAO,MAAM,kCAAkC;;;;;;EAQrC,CAAC;AAEX,6DAA6D;AAC7D,eAAO,MAAM,6CAA6C;;;;;EAOhD,CAAC;AAEX,eAAO,MAAM,6CAA6C;;;;;EAOhD,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,iDAAiD;;;;EAMpD,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,4CAA4C;;;;;;EAQ/C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mCAAmC;;;;;EAOtC,CAAC;AAEX,+CAA+C;AAC/C,eAAO,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;EAKzC,CAAC;AAEX,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAElF"}
@@ -34,6 +34,48 @@ export const GH_STATUS_CHECK_ROLLUP_STATUS_CONTEXT_SUCCESS = [
34
34
  targetUrl: 'https://github.com/org/repo/actions/runs/2',
35
35
  },
36
36
  ];
37
+ /**
38
+ * Issue #185 再現: `__typename` 欠落の StatusContext(gap A)。
39
+ * 実環境の GraphQL レスポンスで `__typename` が省略されるケース。
40
+ */
41
+ export const GH_STATUS_CHECK_ROLLUP_STATUS_CONTEXT_NO_TYPENAME = [
42
+ {
43
+ context: 'ci/legacy-no-typename',
44
+ state: 'PENDING',
45
+ targetUrl: 'https://github.com/org/repo/actions/runs/3',
46
+ },
47
+ ];
48
+ /**
49
+ * Issue #185 再現: `conclusion` が非 string(gap B)。
50
+ * `(check.conclusion ?? 'UNKNOWN').toUpperCase()` が落ちるパターン。
51
+ */
52
+ export const GH_STATUS_CHECK_ROLLUP_NON_STRING_CONCLUSION = [
53
+ {
54
+ __typename: 'CheckRun',
55
+ name: 'ci/broken-conclusion',
56
+ status: 'COMPLETED',
57
+ conclusion: 0,
58
+ detailsUrl: 'https://github.com/org/repo/actions/runs/4',
59
+ },
60
+ ];
61
+ /**
62
+ * Issue #185 再現: 未知 `__typename`(gap C — WorkflowRun)。
63
+ */
64
+ export const GH_STATUS_CHECK_ROLLUP_WORKFLOW_RUN = [
65
+ {
66
+ __typename: 'WorkflowRun',
67
+ name: 'ci/workflow',
68
+ status: 'COMPLETED',
69
+ conclusion: 'SUCCESS',
70
+ },
71
+ ];
72
+ /** Issue #185 再現: 複合 rollup(正常 + 異常エントリ混在)。 */
73
+ export const GH_STATUS_CHECK_ROLLUP_MIXED_ISSUE_185 = [
74
+ ...GH_STATUS_CHECK_ROLLUP_STATUS_CONTEXT_NO_TYPENAME,
75
+ ...GH_STATUS_CHECK_ROLLUP_NON_STRING_CONCLUSION,
76
+ ...GH_STATUS_CHECK_ROLLUP_WORKFLOW_RUN,
77
+ ...GH_STATUS_CHECK_ROLLUP_COMPLETED_SUCCESS,
78
+ ];
37
79
  export function ghPrViewStatusCheckRollupJson(checkRuns) {
38
80
  return JSON.stringify({ statusCheckRollup: checkRuns });
39
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"github-test-fixtures.js","sourceRoot":"","sources":["../../src/github/github-test-fixtures.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,wCAAwC,GAAG;IACtD;QACE,UAAU,EAAE,UAAU;QACtB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,4CAA4C;KACzD;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD;QACE,UAAU,EAAE,UAAU;QACtB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,4CAA4C;KACzD;CACO,CAAC;AAEX,6DAA6D;AAC7D,MAAM,CAAC,MAAM,6CAA6C,GAAG;IAC3D;QACE,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,4CAA4C;KACxD;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,6CAA6C,GAAG;IAC3D;QACE,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,4CAA4C;KACxD;CACO,CAAC;AAEX,MAAM,UAAU,6BAA6B,CAAC,SAA4B;IACxE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"github-test-fixtures.js","sourceRoot":"","sources":["../../src/github/github-test-fixtures.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,wCAAwC,GAAG;IACtD;QACE,UAAU,EAAE,UAAU;QACtB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,4CAA4C;KACzD;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD;QACE,UAAU,EAAE,UAAU;QACtB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,4CAA4C;KACzD;CACO,CAAC;AAEX,6DAA6D;AAC7D,MAAM,CAAC,MAAM,6CAA6C,GAAG;IAC3D;QACE,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,4CAA4C;KACxD;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,6CAA6C,GAAG;IAC3D;QACE,UAAU,EAAE,eAAe;QAC3B,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,4CAA4C;KACxD;CACO,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,iDAAiD,GAAG;IAC/D;QACE,OAAO,EAAE,uBAAuB;QAChC,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,4CAA4C;KACxD;CACO,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,4CAA4C,GAAG;IAC1D;QACE,UAAU,EAAE,UAAU;QACtB,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,4CAA4C;KACzD;CACO,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG;IACjD;QACE,UAAU,EAAE,aAAa;QACzB,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,SAAS;KACtB;CACO,CAAC;AAEX,+CAA+C;AAC/C,MAAM,CAAC,MAAM,sCAAsC,GAAG;IACpD,GAAG,iDAAiD;IACpD,GAAG,4CAA4C;IAC/C,GAAG,mCAAmC;IACtC,GAAG,wCAAwC;CACnC,CAAC;AAEX,MAAM,UAAU,6BAA6B,CAAC,SAA4B;IACxE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,5 +1,12 @@
1
- export { runGh } from './run-gh.js';
1
+ export { runGh, RunGhError } from './run-gh.js';
2
+ export type { RunGhErrorCause } from './run-gh.js';
3
+ export { resolveGitHubAuthToken } from './resolve-github-auth-token.js';
4
+ export type { GitHubAuthTokenSource, ResolveGitHubAuthTokenOptions, ResolveGitHubAuthTokenResult, } from './resolve-github-auth-token.js';
5
+ export { buildGitHubClient, createGitHubClient, GitHubApiError, } from './github-client.js';
6
+ export type { CreateGitHubClientOptions, GitHubClient, GitHubClientOptions, GitHubIssueComment, GitHubPullRequestRef, GitHubPullRequestReview, GitHubPullRequestReviewComment, GitHubRestIssue, } from './github-client.js';
7
+ export { formatGitHubAuthRecoveryHint, formatGitHubErrorMessage, GITHUB_AUTH_HINT, hasGitHubAuth, isGitHubAuthError, } from './github-auth.js';
2
8
  export { fetchIssueContext, } from './issue-context.js';
9
+ export type { FetchIssueContextOptions } from './issue-context.js';
3
10
  export { formatIssueContextForPrompt, formatIssueContextYaml, } from './format-issue-context-prompt.js';
4
11
  export type { IssueContext, IssueComment, } from './issue-context.js';
5
12
  export { createGitHubMonitor, DEFAULT_GITHUB_MONITOR_DEBOUNCE_MS, DEFAULT_GITHUB_MONITOR_POLL_INTERVAL_MS, DEFAULT_GITHUB_MONITOR_ACTIVE_POLL_INTERVAL_MS, } from './github-monitor.js';
@@ -7,6 +14,8 @@ export type { GitHubMonitor, GitHubMonitorOptions } from './github-monitor.js';
7
14
  export { emptyGitHubMonitorCursor, isEmptyGitHubMonitorCursor, normalizeGitHubMonitorCursor, } from './github-monitor-cursor.js';
8
15
  export type { GitHubMonitorCursor, PullRequestMonitorCursor, } from './github-monitor-cursor.js';
9
16
  export type { GitHubUpdateItem, GitHubUpdateKind, GitHubUpdatePayload, } from './github-update-types.js';
10
- export { fetchGitHubUpdates } from './fetch-github-updates.js';
17
+ export { fetchGitHubUpdates, normalizeStatusCheckRollup } from './fetch-github-updates.js';
11
18
  export type { FetchGitHubUpdatesInput, FetchGitHubUpdatesResult, } from './fetch-github-updates.js';
19
+ export { GitHubMonitorError, safeUpperString, classifyGitHubMonitorError, createGitHubMonitorPhaseError, } from './github-monitor-error.js';
20
+ export type { GitHubMonitorErrorPhase, GitHubMonitorErrorCause, GitHubMonitorPhaseError, } from './github-monitor-error.js';
12
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/github/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,uCAAuC,EACvC,8CAA8C,GAC/C,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EACV,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/github/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,YAAY,EACV,qBAAqB,EACrB,6BAA6B,EAC7B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,yBAAyB,EACzB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,8BAA8B,EAC9B,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,YAAY,EACZ,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,kCAAkC,EAClC,uCAAuC,EACvC,8CAA8C,GAC/C,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAC3F,YAAY,EACV,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,2BAA2B,CAAC"}