@aicalas/loopy 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.
Files changed (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/dist/adapters.d.ts +111 -0
  4. package/dist/adapters.d.ts.map +1 -0
  5. package/dist/adapters.js +27 -0
  6. package/dist/adapters.js.map +1 -0
  7. package/dist/attention/github.d.ts +57 -0
  8. package/dist/attention/github.d.ts.map +1 -0
  9. package/dist/attention/github.js +162 -0
  10. package/dist/attention/github.js.map +1 -0
  11. package/dist/authoring/attention-config.d.ts +16 -0
  12. package/dist/authoring/attention-config.d.ts.map +1 -0
  13. package/dist/authoring/attention-config.js +19 -0
  14. package/dist/authoring/attention-config.js.map +1 -0
  15. package/dist/authoring/channel-config.d.ts +16 -0
  16. package/dist/authoring/channel-config.d.ts.map +1 -0
  17. package/dist/authoring/channel-config.js +16 -0
  18. package/dist/authoring/channel-config.js.map +1 -0
  19. package/dist/authoring/define.d.ts +13 -0
  20. package/dist/authoring/define.d.ts.map +1 -0
  21. package/dist/authoring/define.js +13 -0
  22. package/dist/authoring/define.js.map +1 -0
  23. package/dist/authoring/effect-config.d.ts +16 -0
  24. package/dist/authoring/effect-config.d.ts.map +1 -0
  25. package/dist/authoring/effect-config.js +17 -0
  26. package/dist/authoring/effect-config.js.map +1 -0
  27. package/dist/authoring/harness-config.d.ts +30 -0
  28. package/dist/authoring/harness-config.d.ts.map +1 -0
  29. package/dist/authoring/harness-config.js +36 -0
  30. package/dist/authoring/harness-config.js.map +1 -0
  31. package/dist/authoring/index.d.ts +10 -0
  32. package/dist/authoring/index.d.ts.map +1 -0
  33. package/dist/authoring/index.js +9 -0
  34. package/dist/authoring/index.js.map +1 -0
  35. package/dist/authoring/schema.d.ts +9 -0
  36. package/dist/authoring/schema.d.ts.map +1 -0
  37. package/dist/authoring/schema.js +28 -0
  38. package/dist/authoring/schema.js.map +1 -0
  39. package/dist/authoring/types.d.ts +115 -0
  40. package/dist/authoring/types.d.ts.map +1 -0
  41. package/dist/authoring/types.js +2 -0
  42. package/dist/authoring/types.js.map +1 -0
  43. package/dist/authoring/watcher-config.d.ts +33 -0
  44. package/dist/authoring/watcher-config.d.ts.map +1 -0
  45. package/dist/authoring/watcher-config.js +61 -0
  46. package/dist/authoring/watcher-config.js.map +1 -0
  47. package/dist/build/discover.d.ts +34 -0
  48. package/dist/build/discover.d.ts.map +1 -0
  49. package/dist/build/discover.js +165 -0
  50. package/dist/build/discover.js.map +1 -0
  51. package/dist/build/identity.d.ts +9 -0
  52. package/dist/build/identity.d.ts.map +1 -0
  53. package/dist/build/identity.js +0 -0
  54. package/dist/build/identity.js.map +1 -0
  55. package/dist/channels/github.d.ts +14 -0
  56. package/dist/channels/github.d.ts.map +1 -0
  57. package/dist/channels/github.js +118 -0
  58. package/dist/channels/github.js.map +1 -0
  59. package/dist/channels/index.d.ts +2 -0
  60. package/dist/channels/index.d.ts.map +1 -0
  61. package/dist/channels/index.js +2 -0
  62. package/dist/channels/index.js.map +1 -0
  63. package/dist/cli-help.d.ts +23 -0
  64. package/dist/cli-help.d.ts.map +1 -0
  65. package/dist/cli-help.js +186 -0
  66. package/dist/cli-help.js.map +1 -0
  67. package/dist/cli.d.ts +37 -0
  68. package/dist/cli.d.ts.map +1 -0
  69. package/dist/cli.js +385 -0
  70. package/dist/cli.js.map +1 -0
  71. package/dist/config.d.ts +71 -0
  72. package/dist/config.d.ts.map +1 -0
  73. package/dist/config.js +426 -0
  74. package/dist/config.js.map +1 -0
  75. package/dist/core/calls.d.ts +67 -0
  76. package/dist/core/calls.d.ts.map +1 -0
  77. package/dist/core/calls.js +109 -0
  78. package/dist/core/calls.js.map +1 -0
  79. package/dist/core/identifiers.d.ts +24 -0
  80. package/dist/core/identifiers.d.ts.map +1 -0
  81. package/dist/core/identifiers.js +129 -0
  82. package/dist/core/identifiers.js.map +1 -0
  83. package/dist/core/prompt.d.ts +5 -0
  84. package/dist/core/prompt.d.ts.map +1 -0
  85. package/dist/core/prompt.js +47 -0
  86. package/dist/core/prompt.js.map +1 -0
  87. package/dist/core/reconcile.d.ts +27 -0
  88. package/dist/core/reconcile.d.ts.map +1 -0
  89. package/dist/core/reconcile.js +36 -0
  90. package/dist/core/reconcile.js.map +1 -0
  91. package/dist/core/wire.d.ts +332 -0
  92. package/dist/core/wire.d.ts.map +1 -0
  93. package/dist/core/wire.js +543 -0
  94. package/dist/core/wire.js.map +1 -0
  95. package/dist/emitters/github.d.ts +15 -0
  96. package/dist/emitters/github.d.ts.map +1 -0
  97. package/dist/emitters/github.js +43 -0
  98. package/dist/emitters/github.js.map +1 -0
  99. package/dist/emitters/index.d.ts +2 -0
  100. package/dist/emitters/index.d.ts.map +1 -0
  101. package/dist/emitters/index.js +2 -0
  102. package/dist/emitters/index.js.map +1 -0
  103. package/dist/git.d.ts +17 -0
  104. package/dist/git.d.ts.map +1 -0
  105. package/dist/git.js +122 -0
  106. package/dist/git.js.map +1 -0
  107. package/dist/github/client.d.ts +53 -0
  108. package/dist/github/client.d.ts.map +1 -0
  109. package/dist/github/client.js +169 -0
  110. package/dist/github/client.js.map +1 -0
  111. package/dist/github/trigger.d.ts +12 -0
  112. package/dist/github/trigger.d.ts.map +1 -0
  113. package/dist/github/trigger.js +21 -0
  114. package/dist/github/trigger.js.map +1 -0
  115. package/dist/github/writes.d.ts +4 -0
  116. package/dist/github/writes.d.ts.map +1 -0
  117. package/dist/github/writes.js +21 -0
  118. package/dist/github/writes.js.map +1 -0
  119. package/dist/harnesses/base.d.ts +41 -0
  120. package/dist/harnesses/base.d.ts.map +1 -0
  121. package/dist/harnesses/base.js +182 -0
  122. package/dist/harnesses/base.js.map +1 -0
  123. package/dist/harnesses/claude-executable.d.ts +42 -0
  124. package/dist/harnesses/claude-executable.d.ts.map +1 -0
  125. package/dist/harnesses/claude-executable.js +138 -0
  126. package/dist/harnesses/claude-executable.js.map +1 -0
  127. package/dist/harnesses/claude.d.ts +35 -0
  128. package/dist/harnesses/claude.d.ts.map +1 -0
  129. package/dist/harnesses/claude.js +160 -0
  130. package/dist/harnesses/claude.js.map +1 -0
  131. package/dist/harnesses/codex.d.ts +40 -0
  132. package/dist/harnesses/codex.d.ts.map +1 -0
  133. package/dist/harnesses/codex.js +118 -0
  134. package/dist/harnesses/codex.js.map +1 -0
  135. package/dist/harnesses/index.d.ts +2 -0
  136. package/dist/harnesses/index.d.ts.map +1 -0
  137. package/dist/harnesses/index.js +2 -0
  138. package/dist/harnesses/index.js.map +1 -0
  139. package/dist/harnesses/opencode.d.ts +33 -0
  140. package/dist/harnesses/opencode.d.ts.map +1 -0
  141. package/dist/harnesses/opencode.js +203 -0
  142. package/dist/harnesses/opencode.js.map +1 -0
  143. package/dist/identifiers.d.ts +26 -0
  144. package/dist/identifiers.d.ts.map +1 -0
  145. package/dist/identifiers.js +62 -0
  146. package/dist/identifiers.js.map +1 -0
  147. package/dist/index.d.ts +10 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +10 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/log.d.ts +10 -0
  152. package/dist/log.d.ts.map +1 -0
  153. package/dist/log.js +44 -0
  154. package/dist/log.js.map +1 -0
  155. package/dist/settings.d.ts +43 -0
  156. package/dist/settings.d.ts.map +1 -0
  157. package/dist/settings.js +128 -0
  158. package/dist/settings.js.map +1 -0
  159. package/dist/temporal/activities.d.ts +57 -0
  160. package/dist/temporal/activities.d.ts.map +1 -0
  161. package/dist/temporal/activities.js +366 -0
  162. package/dist/temporal/activities.js.map +1 -0
  163. package/dist/temporal/answers.d.ts +48 -0
  164. package/dist/temporal/answers.d.ts.map +1 -0
  165. package/dist/temporal/answers.js +78 -0
  166. package/dist/temporal/answers.js.map +1 -0
  167. package/dist/temporal/client.d.ts +13 -0
  168. package/dist/temporal/client.d.ts.map +1 -0
  169. package/dist/temporal/client.js +20 -0
  170. package/dist/temporal/client.js.map +1 -0
  171. package/dist/temporal/contracts.d.ts +19 -0
  172. package/dist/temporal/contracts.d.ts.map +1 -0
  173. package/dist/temporal/contracts.js +22 -0
  174. package/dist/temporal/contracts.js.map +1 -0
  175. package/dist/temporal/drain.d.ts +19 -0
  176. package/dist/temporal/drain.d.ts.map +1 -0
  177. package/dist/temporal/drain.js +109 -0
  178. package/dist/temporal/drain.js.map +1 -0
  179. package/dist/temporal/executions.d.ts +18 -0
  180. package/dist/temporal/executions.d.ts.map +1 -0
  181. package/dist/temporal/executions.js +15 -0
  182. package/dist/temporal/executions.js.map +1 -0
  183. package/dist/temporal/handle.d.ts +39 -0
  184. package/dist/temporal/handle.d.ts.map +1 -0
  185. package/dist/temporal/handle.js +95 -0
  186. package/dist/temporal/handle.js.map +1 -0
  187. package/dist/temporal/history.d.ts +75 -0
  188. package/dist/temporal/history.d.ts.map +1 -0
  189. package/dist/temporal/history.js +310 -0
  190. package/dist/temporal/history.js.map +1 -0
  191. package/dist/temporal/observe.d.ts +85 -0
  192. package/dist/temporal/observe.d.ts.map +1 -0
  193. package/dist/temporal/observe.js +110 -0
  194. package/dist/temporal/observe.js.map +1 -0
  195. package/dist/temporal/schedules.d.ts +26 -0
  196. package/dist/temporal/schedules.d.ts.map +1 -0
  197. package/dist/temporal/schedules.js +200 -0
  198. package/dist/temporal/schedules.js.map +1 -0
  199. package/dist/temporal/status.d.ts +63 -0
  200. package/dist/temporal/status.d.ts.map +1 -0
  201. package/dist/temporal/status.js +153 -0
  202. package/dist/temporal/status.js.map +1 -0
  203. package/dist/temporal/stuck.d.ts +58 -0
  204. package/dist/temporal/stuck.d.ts.map +1 -0
  205. package/dist/temporal/stuck.js +53 -0
  206. package/dist/temporal/stuck.js.map +1 -0
  207. package/dist/temporal/supervisor.d.ts +11 -0
  208. package/dist/temporal/supervisor.d.ts.map +1 -0
  209. package/dist/temporal/supervisor.js +506 -0
  210. package/dist/temporal/supervisor.js.map +1 -0
  211. package/dist/temporal/worker.d.ts +21 -0
  212. package/dist/temporal/worker.d.ts.map +1 -0
  213. package/dist/temporal/worker.js +82 -0
  214. package/dist/temporal/worker.js.map +1 -0
  215. package/dist/temporal/workflow-bundle.js +12742 -0
  216. package/dist/temporal/workflows.d.ts +9 -0
  217. package/dist/temporal/workflows.d.ts.map +1 -0
  218. package/dist/temporal/workflows.js +144 -0
  219. package/dist/temporal/workflows.js.map +1 -0
  220. package/dist/version.d.ts +2 -0
  221. package/dist/version.d.ts.map +1 -0
  222. package/dist/version.js +2 -0
  223. package/dist/version.js.map +1 -0
  224. package/dist/watchers/base.d.ts +4 -0
  225. package/dist/watchers/base.d.ts.map +1 -0
  226. package/dist/watchers/base.js +7 -0
  227. package/dist/watchers/base.js.map +1 -0
  228. package/dist/watchers/github/client.d.ts +52 -0
  229. package/dist/watchers/github/client.d.ts.map +1 -0
  230. package/dist/watchers/github/client.js +165 -0
  231. package/dist/watchers/github/client.js.map +1 -0
  232. package/dist/watchers/github/index.d.ts +19 -0
  233. package/dist/watchers/github/index.d.ts.map +1 -0
  234. package/dist/watchers/github/index.js +83 -0
  235. package/dist/watchers/github/index.js.map +1 -0
  236. package/dist/watchers/index.d.ts +2 -0
  237. package/dist/watchers/index.d.ts.map +1 -0
  238. package/dist/watchers/index.js +2 -0
  239. package/dist/watchers/index.js.map +1 -0
  240. package/dist/worker-lock.d.ts +11 -0
  241. package/dist/worker-lock.d.ts.map +1 -0
  242. package/dist/worker-lock.js +53 -0
  243. package/dist/worker-lock.js.map +1 -0
  244. package/package.json +92 -0
@@ -0,0 +1,9 @@
1
+ import { type PollResult } from "../core/wire.js";
2
+ /**
3
+ * One polling tick. Instance children inherit this Workflow Execution's Task Queue, which keeps a
4
+ * run on the control queue without the poll having to name it. Pinning a run to the build it
5
+ * started on is the drain's job, not the queue's - the queue name is fixed configuration, so it is
6
+ * the same string across restarts.
7
+ */
8
+ export declare function PollWorkflow(input: unknown): Promise<PollResult>;
9
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/temporal/workflows.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,UAAU,EAKhB,MAAM,iBAAiB,CAAC;AAiBzB;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CA4EtE"}
@@ -0,0 +1,144 @@
1
+ import { ActivityFailure, ApplicationFailure, isCancellation, ParentClosePolicy, proxyActivities, startChild, } from "@temporalio/workflow";
2
+ import { parseObserveInstancesResult, parsePollWorkflowInput, parseTriggerCandidates, } from "../core/wire.js";
3
+ const CONTROL_ACTIVITY_TIMEOUT_MS = 30_000;
4
+ const REPEATABLE_RETRY_POLICY = {
5
+ maximumAttempts: 3,
6
+ initialInterval: 1_000,
7
+ backoffCoefficient: 2,
8
+ };
9
+ /**
10
+ * One polling tick. Instance children inherit this Workflow Execution's Task Queue, which keeps a
11
+ * run on the control queue without the poll having to name it. Pinning a run to the build it
12
+ * started on is the drain's job, not the queue's - the queue name is fixed configuration, so it is
13
+ * the same string across restarts.
14
+ */
15
+ export async function PollWorkflow(input) {
16
+ const request = parsePollWorkflowInput(input);
17
+ // Started before intake and awaited on every exit: a stuck instance's only reporter is this
18
+ // observer, so a broken watcher must not silence it.
19
+ const observed = observeInstances(request);
20
+ if (request.watcher === undefined) {
21
+ return { status: "completed", started: [], skipped: [], ...(await observed) };
22
+ }
23
+ const activities = proxyActivities({
24
+ activityId: "watcher",
25
+ startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
26
+ retry: REPEATABLE_RETRY_POLICY,
27
+ });
28
+ let watcherResult;
29
+ try {
30
+ watcherResult = await activities.run_watcher({
31
+ repository: request.repository,
32
+ watcher: request.watcher,
33
+ });
34
+ }
35
+ catch (error) {
36
+ if (!(error instanceof ActivityFailure))
37
+ throw error;
38
+ return {
39
+ status: "failed",
40
+ started: [],
41
+ skipped: [],
42
+ ...(await observed),
43
+ reason: `watcher-activity-failed:${failureType(error.cause)}`,
44
+ };
45
+ }
46
+ let candidates;
47
+ try {
48
+ candidates = parseTriggerCandidates(watcherResult);
49
+ }
50
+ catch (error) {
51
+ return {
52
+ status: "failed",
53
+ started: [],
54
+ skipped: [],
55
+ ...(await observed),
56
+ reason: `watcher-result-invalid:${errorMessage(error)}`,
57
+ };
58
+ }
59
+ const started = [];
60
+ const skipped = [];
61
+ const seen = new Set();
62
+ for (const trigger of candidates) {
63
+ const workflowId = `${request.instanceIdPrefix}${request.workflow}:${trigger.digest}`;
64
+ if (seen.has(workflowId))
65
+ continue;
66
+ seen.add(workflowId);
67
+ const instanceInput = {
68
+ workflow: request.workflow,
69
+ repository: request.repository,
70
+ defaultBranch: request.defaultBranch,
71
+ trigger,
72
+ agentTaskQueue: request.agentTaskQueue,
73
+ ...(request.attention === undefined ? {} : { attention: request.attention }),
74
+ };
75
+ try {
76
+ await startChild(request.workflow, {
77
+ args: [instanceInput],
78
+ workflowId,
79
+ workflowIdReusePolicy: "ALLOW_DUPLICATE",
80
+ parentClosePolicy: ParentClosePolicy.ABANDON,
81
+ });
82
+ started.push(workflowId);
83
+ }
84
+ catch (error) {
85
+ if (isOpenWorkflowConflict(error))
86
+ skipped.push(workflowId);
87
+ else
88
+ throw error;
89
+ }
90
+ }
91
+ return {
92
+ status: "completed",
93
+ started,
94
+ skipped,
95
+ ...(await observed),
96
+ };
97
+ }
98
+ /**
99
+ * The control-side observer: one scan reports `stuck` instances - whose own code fails every
100
+ * Workflow Task and so cannot reach the attention port - and collects ask replies for instances
101
+ * parked in `awaiting_answer`. Best-effort - both conditions are level-triggered and the next tick
102
+ * re-observes them, so a failed scan is swallowed rather than failing the poll.
103
+ */
104
+ async function observeInstances(request) {
105
+ const activities = proxyActivities({
106
+ activityId: "observe-instances",
107
+ startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
108
+ retry: REPEATABLE_RETRY_POLICY,
109
+ });
110
+ try {
111
+ const result = await activities.observe_instances({
112
+ repository: request.repository,
113
+ workflow: request.workflow,
114
+ });
115
+ return parseObserveInstancesResult(result);
116
+ }
117
+ catch (error) {
118
+ if (isCancellation(error))
119
+ throw error;
120
+ if (!(error instanceof ActivityFailure))
121
+ throw error;
122
+ return { stuck: [], answered: [] };
123
+ }
124
+ }
125
+ function failureType(cause) {
126
+ return cause instanceof ApplicationFailure
127
+ ? cause.type && cause.type !== "Error"
128
+ ? cause.type
129
+ : "ApplicationFailure"
130
+ : (cause?.constructor.name ?? "Error");
131
+ }
132
+ function errorMessage(error) {
133
+ return error instanceof Error ? error.message : String(error);
134
+ }
135
+ function isOpenWorkflowConflict(error) {
136
+ let current = error;
137
+ while (current instanceof Error) {
138
+ if (current.name === "WorkflowExecutionAlreadyStartedError")
139
+ return true;
140
+ current = current.cause;
141
+ }
142
+ return false;
143
+ }
144
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/temporal/workflows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const LOOPY_VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const LOOPY_VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare class FetchUnavailableError extends Error {
2
+ constructor(message: string, options?: ErrorOptions);
3
+ }
4
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/watchers/base.ts"],"names":[],"mappings":"AAAA,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACF"}
@@ -0,0 +1,7 @@
1
+ export class FetchUnavailableError extends Error {
2
+ constructor(message, options) {
3
+ super(message, options);
4
+ this.name = new.target.name;
5
+ }
6
+ }
7
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/watchers/base.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,52 @@
1
+ import { Octokit } from "octokit";
2
+ import type { JsonObject, JsonValue } from "../../core/wire.js";
3
+ import { FetchUnavailableError } from "../base.js";
4
+ export interface PullInfo extends JsonObject {
5
+ number: number;
6
+ head_ref: string;
7
+ head_sha: string;
8
+ base_ref: string;
9
+ html_url: string;
10
+ labels: string[];
11
+ title: string;
12
+ body: string;
13
+ }
14
+ export interface IssueInfo extends JsonObject {
15
+ number: number;
16
+ title: string;
17
+ body: string;
18
+ html_url: string;
19
+ labels: string[];
20
+ }
21
+ /** `owner/name`: the shape every GitHub port validates a declared repository against. */
22
+ export declare const REPOSITORY_PATTERN: RegExp;
23
+ export declare class GitHubAuthenticationError extends Error {
24
+ }
25
+ export declare class GitHubUnavailableError extends FetchUnavailableError {
26
+ }
27
+ export declare function authenticationDiagnostic(environment?: NodeJS.ProcessEnv): string | undefined;
28
+ export declare class GitHubClient {
29
+ private readonly octokit;
30
+ private readonly owner;
31
+ private readonly repo;
32
+ readonly repository: string;
33
+ constructor(token: string, repository: string, octokit?: Octokit);
34
+ static fromEnvironment(repository: string, environment?: NodeJS.ProcessEnv): GitHubClient;
35
+ openPullsWithLabel(label: string): Promise<PullInfo[]>;
36
+ openIssuesWithLabel(label: string): Promise<IssueInfo[]>;
37
+ getPull(number: number): Promise<PullInfo>;
38
+ labels(number: number): Promise<string[]>;
39
+ commentBodies(number: number): Promise<string[]>;
40
+ createComment(number: number, body: string): Promise<void>;
41
+ setLabels(number: number, labels: readonly string[]): Promise<void>;
42
+ /**
43
+ * Create the repository-level label if it is absent. Issue-label writes require the label to
44
+ * exist in the repository first; creation answers 422 `already_exists` for a label that does,
45
+ * which is this method's success case. The inputs are fixed application constants, so no other
46
+ * validation failure shares that status here.
47
+ */
48
+ ensureLabel(name: string, color: string, description: string): Promise<void>;
49
+ private request;
50
+ }
51
+ export declare function asJsonValue(value: unknown): JsonValue;
52
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/watchers/github/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,QAAuB,CAAC;AAEvD,qBAAa,yBAA0B,SAAQ,KAAK;CAAG;AACvD,qBAAa,sBAAuB,SAAQ,qBAAqB;CAAG;AAEpE,wBAAgB,wBAAwB,CAEtC,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,MAAM,GAAG,SAAS,CAIpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAS/D;IAED,MAAM,CAAC,eAAe,CACpB,UAAU,EAAE,MAAM,EAElB,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,YAAY,CAQd;IAEK,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAe3D;IAEK,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAmB7D;IAEK,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAe/C;IAEK,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAU9C;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUrD;IAEK,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/D;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE;IAED;;;;;OAKG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAejF;YAEa,OAAO;CAOtB;AAeD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAErD"}
@@ -0,0 +1,165 @@
1
+ import { Octokit } from "octokit";
2
+ import { FetchUnavailableError } from "../base.js";
3
+ /** `owner/name`: the shape every GitHub port validates a declared repository against. */
4
+ export const REPOSITORY_PATTERN = /^[^/\s]+\/[^/\s]+$/;
5
+ export class GitHubAuthenticationError extends Error {
6
+ }
7
+ export class GitHubUnavailableError extends FetchUnavailableError {
8
+ }
9
+ export function authenticationDiagnostic(
10
+ /* istanbul ignore next -- production environment boundary */
11
+ environment = process.env) {
12
+ return environment.GITHUB_TOKEN || environment.GH_TOKEN
13
+ ? undefined
14
+ : "set GITHUB_TOKEN or GH_TOKEN to authenticate with GitHub";
15
+ }
16
+ export class GitHubClient {
17
+ octokit;
18
+ owner;
19
+ repo;
20
+ repository;
21
+ constructor(token, repository, octokit) {
22
+ this.repository = repository;
23
+ this.octokit = octokit ?? new Octokit({ auth: token });
24
+ const separator = repository.indexOf("/");
25
+ if (separator <= 0 || separator === repository.length - 1) {
26
+ throw new Error(`invalid GitHub repository: ${repository}`);
27
+ }
28
+ this.owner = repository.slice(0, separator);
29
+ this.repo = repository.slice(separator + 1);
30
+ }
31
+ static fromEnvironment(repository,
32
+ /* istanbul ignore next -- production environment boundary */
33
+ environment = process.env) {
34
+ const token = environment.GITHUB_TOKEN || environment.GH_TOKEN;
35
+ if (!token) {
36
+ throw new GitHubAuthenticationError("set GITHUB_TOKEN or GH_TOKEN to authenticate with GitHub");
37
+ }
38
+ return new GitHubClient(token, repository);
39
+ }
40
+ async openPullsWithLabel(label) {
41
+ const issues = await this.request(`list pulls labelled ${JSON.stringify(label)}`, () => this.octokit.paginate(this.octokit.rest.issues.listForRepo, {
42
+ owner: this.owner,
43
+ repo: this.repo,
44
+ labels: label,
45
+ state: "open",
46
+ per_page: 100,
47
+ }));
48
+ const pulls = [];
49
+ for (const issue of issues) {
50
+ if (issue.pull_request !== undefined)
51
+ pulls.push(await this.getPull(issue.number));
52
+ }
53
+ return pulls;
54
+ }
55
+ async openIssuesWithLabel(label) {
56
+ const issues = await this.request(`list issues labelled ${JSON.stringify(label)}`, () => this.octokit.paginate(this.octokit.rest.issues.listForRepo, {
57
+ owner: this.owner,
58
+ repo: this.repo,
59
+ labels: label,
60
+ state: "open",
61
+ per_page: 100,
62
+ }));
63
+ return issues
64
+ .filter((issue) => issue.pull_request === undefined)
65
+ .map((issue) => ({
66
+ number: issue.number,
67
+ title: issue.title ?? "",
68
+ body: issue.body ?? "",
69
+ html_url: issue.html_url,
70
+ labels: issue.labels.map(labelName),
71
+ }));
72
+ }
73
+ async getPull(number) {
74
+ const response = await this.request(`get pull #${number}`, () => this.octokit.rest.pulls.get({ owner: this.owner, repo: this.repo, pull_number: number }));
75
+ const pull = response.data;
76
+ return {
77
+ number: pull.number,
78
+ head_ref: pull.head.ref,
79
+ head_sha: pull.head.sha,
80
+ base_ref: pull.base.ref,
81
+ html_url: pull.html_url,
82
+ labels: pull.labels.map(labelName),
83
+ title: pull.title ?? "",
84
+ body: pull.body ?? "",
85
+ };
86
+ }
87
+ async labels(number) {
88
+ const response = await this.request(`get labels for #${number}`, () => this.octokit.rest.issues.listLabelsOnIssue({
89
+ owner: this.owner,
90
+ repo: this.repo,
91
+ issue_number: number,
92
+ per_page: 100,
93
+ }));
94
+ return response.data.map(labelName);
95
+ }
96
+ async commentBodies(number) {
97
+ const comments = await this.request(`list comments for #${number}`, () => this.octokit.paginate(this.octokit.rest.issues.listComments, {
98
+ owner: this.owner,
99
+ repo: this.repo,
100
+ issue_number: number,
101
+ per_page: 100,
102
+ }));
103
+ return comments.map((comment) => comment.body ?? "");
104
+ }
105
+ async createComment(number, body) {
106
+ await this.request(`comment on #${number}`, () => this.octokit.rest.issues.createComment({
107
+ owner: this.owner,
108
+ repo: this.repo,
109
+ issue_number: number,
110
+ body,
111
+ }));
112
+ }
113
+ async setLabels(number, labels) {
114
+ await this.request(`set labels for #${number}`, () => this.octokit.rest.issues.setLabels({
115
+ owner: this.owner,
116
+ repo: this.repo,
117
+ issue_number: number,
118
+ labels: [...labels],
119
+ }));
120
+ }
121
+ /**
122
+ * Create the repository-level label if it is absent. Issue-label writes require the label to
123
+ * exist in the repository first; creation answers 422 `already_exists` for a label that does,
124
+ * which is this method's success case. The inputs are fixed application constants, so no other
125
+ * validation failure shares that status here.
126
+ */
127
+ async ensureLabel(name, color, description) {
128
+ try {
129
+ await this.request(`create label ${JSON.stringify(name)}`, () => this.octokit.rest.issues.createLabel({
130
+ owner: this.owner,
131
+ repo: this.repo,
132
+ name,
133
+ color,
134
+ description,
135
+ }));
136
+ }
137
+ catch (error) {
138
+ if (error instanceof GitHubUnavailableError && causeStatus(error) === 422)
139
+ return;
140
+ throw error;
141
+ }
142
+ }
143
+ async request(what, operation) {
144
+ try {
145
+ return await operation();
146
+ }
147
+ catch (error) {
148
+ throw new GitHubUnavailableError(`${what}: ${errorMessage(error)}`, { cause: error });
149
+ }
150
+ }
151
+ }
152
+ function causeStatus(error) {
153
+ const status = error.cause?.status;
154
+ return typeof status === "number" ? status : undefined;
155
+ }
156
+ function labelName(label) {
157
+ return typeof label === "string" ? label : (label.name ?? "");
158
+ }
159
+ function errorMessage(error) {
160
+ return error instanceof Error ? error.message : String(error);
161
+ }
162
+ export function asJsonValue(value) {
163
+ return JSON.parse(JSON.stringify(value));
164
+ }
165
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/watchers/github/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ import type { FetchContext, WatcherCandidate, WatcherSpec } from "../../adapters.js";
3
+ import { GitHubClient } from "../../github/client.js";
4
+ export declare const gitHubPullRequestOptionsSchema: z.ZodObject<{
5
+ repository: z.ZodString;
6
+ label: z.ZodString;
7
+ credentials: z.ZodDefault<z.ZodLiteral<"env">>;
8
+ }, z.core.$strict>;
9
+ export declare const gitHubIssueOptionsSchema: z.ZodObject<{
10
+ repository: z.ZodString;
11
+ label: z.ZodString;
12
+ credentials: z.ZodDefault<z.ZodLiteral<"env">>;
13
+ }, z.core.$strict>;
14
+ export type GitHubClientFactory = (repository: string, credentials: "env") => GitHubClient;
15
+ export declare function githubPullRequest(context: FetchContext, clientFactory?: GitHubClientFactory): Promise<WatcherCandidate[]>;
16
+ export declare function githubIssue(context: FetchContext, clientFactory?: GitHubClientFactory): Promise<WatcherCandidate[]>;
17
+ export declare const gitHubPullRequestWatcher: WatcherSpec;
18
+ export declare const gitHubIssueWatcher: WatcherSpec;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/watchers/github/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAA4B,YAAY,EAAsB,MAAM,wBAAwB,CAAC;AAGpG,eAAO,MAAM,8BAA8B;;;;kBAMhC,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;kBAM1B,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,KAAK,YAAY,CAAC;AAI3F,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EAErB,aAAa,GAAE,mBAA0C,GACxD,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB7B;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,YAAY,EAErB,aAAa,GAAE,mBAA0C,GACxD,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED,eAAO,MAAM,wBAAwB,EAAE,WAMtC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,WAMhC,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ import { authenticationDiagnostic, GitHubClient, REPOSITORY_PATTERN } from "../../github/client.js";
3
+ import { log } from "../../log.js";
4
+ export const gitHubPullRequestOptionsSchema = z
5
+ .object({
6
+ repository: z.string().regex(REPOSITORY_PATTERN),
7
+ label: z.string().min(1),
8
+ credentials: z.literal("env").default("env"),
9
+ })
10
+ .strict();
11
+ export const gitHubIssueOptionsSchema = z
12
+ .object({
13
+ repository: z.string().regex(REPOSITORY_PATTERN),
14
+ label: z.string().min(1),
15
+ credentials: z.literal("env").default("env"),
16
+ })
17
+ .strict();
18
+ const defaultClientFactory = (repository) => GitHubClient.fromEnvironment(repository);
19
+ export async function githubPullRequest(context,
20
+ /* istanbul ignore next -- production authentication boundary */
21
+ clientFactory = defaultClientFactory) {
22
+ const options = gitHubPullRequestOptionsSchema.parse(context.options);
23
+ const client = clientFactory(options.repository, options.credentials);
24
+ const output = [];
25
+ for (const info of await client.openPullsWithLabel(options.label)) {
26
+ output.push({
27
+ repository: options.repository,
28
+ kind: "pull_request",
29
+ id: String(info.number),
30
+ baseBranch: info.base_ref,
31
+ targetBranch: info.head_ref,
32
+ data: {
33
+ number: info.number,
34
+ url: info.html_url,
35
+ title: info.title,
36
+ body: info.body,
37
+ head_ref: info.head_ref,
38
+ head_sha: info.head_sha,
39
+ labels: info.labels,
40
+ },
41
+ });
42
+ log.info(`polled PR #${info.number} @ ${info.head_sha.slice(0, 12)}`);
43
+ }
44
+ return output;
45
+ }
46
+ export async function githubIssue(context,
47
+ /* istanbul ignore next -- production authentication boundary */
48
+ clientFactory = defaultClientFactory) {
49
+ const options = gitHubIssueOptionsSchema.parse(context.options);
50
+ const client = clientFactory(options.repository, options.credentials);
51
+ const output = [];
52
+ for (const info of await client.openIssuesWithLabel(options.label)) {
53
+ output.push({
54
+ repository: options.repository,
55
+ kind: "issue",
56
+ id: String(info.number),
57
+ data: {
58
+ number: info.number,
59
+ url: info.html_url,
60
+ title: info.title,
61
+ body: info.body,
62
+ labels: info.labels,
63
+ },
64
+ });
65
+ log.info(`polled issue #${info.number} (${info.title})`);
66
+ }
67
+ return output;
68
+ }
69
+ export const gitHubPullRequestWatcher = {
70
+ name: "github_pull_request",
71
+ source: "github",
72
+ optionsSchema: gitHubPullRequestOptionsSchema,
73
+ fetch: githubPullRequest,
74
+ checkStartup: authenticationDiagnostic,
75
+ };
76
+ export const gitHubIssueWatcher = {
77
+ name: "github_issue",
78
+ source: "github",
79
+ optionsSchema: gitHubIssueOptionsSchema,
80
+ fetch: githubIssue,
81
+ checkStartup: authenticationDiagnostic,
82
+ };
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/watchers/github/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./base.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watchers/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./base.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watchers/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare class WorkerLockError extends Error {
2
+ constructor(message: string, options?: ErrorOptions);
3
+ }
4
+ export declare class WorkerProcessLock {
5
+ readonly path: string;
6
+ private descriptor;
7
+ constructor(path: string);
8
+ acquire(): void;
9
+ release(): void;
10
+ }
11
+ //# sourceMappingURL=worker-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-lock.d.ts","sourceRoot":"","sources":["../src/worker-lock.ts"],"names":[],"mappings":"AAKA,qBAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACF;AAED,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,UAAU,CAAqB;IAEvC,YAAY,IAAI,EAAE,MAAM,EAEvB;IAED,OAAO,IAAI,IAAI,CAgBd;IAED,OAAO,IAAI,IAAI,CASd;CACF"}
@@ -0,0 +1,53 @@
1
+ import { closeSync, mkdirSync, openSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { flockSync } from "fs-ext";
4
+ export class WorkerLockError extends Error {
5
+ constructor(message, options) {
6
+ super(message, options);
7
+ this.name = "WorkerLockError";
8
+ }
9
+ }
10
+ export class WorkerProcessLock {
11
+ path;
12
+ descriptor;
13
+ constructor(path) {
14
+ this.path = path;
15
+ }
16
+ acquire() {
17
+ if (this.descriptor !== undefined)
18
+ return;
19
+ mkdirSync(dirname(this.path), { recursive: true });
20
+ const descriptor = openSync(this.path, "a+");
21
+ try {
22
+ flockSync(descriptor, "exnb");
23
+ }
24
+ catch (error) {
25
+ closeSync(descriptor);
26
+ if (isLockContention(error)) {
27
+ throw new WorkerLockError(`another loopy Worker Process holds ${this.path}`, {
28
+ cause: error,
29
+ });
30
+ }
31
+ throw error;
32
+ }
33
+ this.descriptor = descriptor;
34
+ }
35
+ release() {
36
+ if (this.descriptor === undefined)
37
+ return;
38
+ const descriptor = this.descriptor;
39
+ this.descriptor = undefined;
40
+ try {
41
+ flockSync(descriptor, "un");
42
+ }
43
+ finally {
44
+ closeSync(descriptor);
45
+ }
46
+ }
47
+ }
48
+ function isLockContention(error) {
49
+ if (!(error instanceof Error) || !("code" in error))
50
+ return false;
51
+ return error.code === "EAGAIN" || error.code === "EWOULDBLOCK";
52
+ }
53
+ //# sourceMappingURL=worker-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-lock.js","sourceRoot":"","sources":["../src/worker-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IACnB,IAAI,CAAS;IACd,UAAU,CAAqB;IAEvC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO;QAC1C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,UAAU,CAAC,CAAC;YACtB,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,eAAe,CAAC,sCAAsC,IAAI,CAAC,IAAI,EAAE,EAAE;oBAC3E,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC;YACH,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC;AACjE,CAAC"}