@action-llama/action-llama 0.14.1 → 0.16.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 (193) hide show
  1. package/dist/agents/feedback-monitor.d.ts +56 -0
  2. package/dist/agents/feedback-monitor.d.ts.map +1 -0
  3. package/dist/agents/feedback-monitor.js +176 -0
  4. package/dist/agents/feedback-monitor.js.map +1 -0
  5. package/dist/agents/feedback-runner.d.ts +28 -0
  6. package/dist/agents/feedback-runner.d.ts.map +1 -0
  7. package/dist/agents/feedback-runner.js +138 -0
  8. package/dist/agents/feedback-runner.js.map +1 -0
  9. package/dist/agents/runner.d.ts +4 -0
  10. package/dist/agents/runner.d.ts.map +1 -1
  11. package/dist/agents/runner.js +11 -0
  12. package/dist/agents/runner.js.map +1 -1
  13. package/dist/build-info.json +1 -1
  14. package/dist/cli/commands/agent.d.ts.map +1 -1
  15. package/dist/cli/commands/agent.js +46 -0
  16. package/dist/cli/commands/agent.js.map +1 -1
  17. package/dist/cli/commands/doctor.d.ts +1 -0
  18. package/dist/cli/commands/doctor.d.ts.map +1 -1
  19. package/dist/cli/commands/doctor.js +101 -4
  20. package/dist/cli/commands/doctor.js.map +1 -1
  21. package/dist/cli/commands/start.js +1 -1
  22. package/dist/cli/commands/start.js.map +1 -1
  23. package/dist/cli/commands/webhook.d.ts +11 -0
  24. package/dist/cli/commands/webhook.d.ts.map +1 -0
  25. package/dist/cli/commands/webhook.js +271 -0
  26. package/dist/cli/commands/webhook.js.map +1 -0
  27. package/dist/cli/main.js +17 -0
  28. package/dist/cli/main.js.map +1 -1
  29. package/dist/docker/local-runtime.d.ts.map +1 -1
  30. package/dist/docker/local-runtime.js +36 -7
  31. package/dist/docker/local-runtime.js.map +1 -1
  32. package/dist/docker/runtime.d.ts +4 -0
  33. package/dist/docker/runtime.d.ts.map +1 -1
  34. package/dist/gateway/index.d.ts +2 -0
  35. package/dist/gateway/index.d.ts.map +1 -1
  36. package/dist/gateway/index.js +1 -1
  37. package/dist/gateway/index.js.map +1 -1
  38. package/dist/gateway/routes/control.d.ts +2 -0
  39. package/dist/gateway/routes/control.d.ts.map +1 -1
  40. package/dist/gateway/routes/control.js +56 -0
  41. package/dist/gateway/routes/control.js.map +1 -1
  42. package/dist/gateway/routes/dashboard.d.ts.map +1 -1
  43. package/dist/gateway/routes/dashboard.js +89 -3
  44. package/dist/gateway/routes/dashboard.js.map +1 -1
  45. package/dist/gateway/routes/webhooks.d.ts +2 -1
  46. package/dist/gateway/routes/webhooks.d.ts.map +1 -1
  47. package/dist/gateway/routes/webhooks.js +3 -2
  48. package/dist/gateway/routes/webhooks.js.map +1 -1
  49. package/dist/gateway/views/agent-detail-page.d.ts +2 -0
  50. package/dist/gateway/views/agent-detail-page.d.ts.map +1 -1
  51. package/dist/gateway/views/agent-detail-page.js +115 -2
  52. package/dist/gateway/views/agent-detail-page.js.map +1 -1
  53. package/dist/gateway/views/dashboard-page.d.ts.map +1 -1
  54. package/dist/gateway/views/dashboard-page.js +36 -2
  55. package/dist/gateway/views/dashboard-page.js.map +1 -1
  56. package/dist/gateway/views/instance-detail-page.d.ts +6 -0
  57. package/dist/gateway/views/instance-detail-page.d.ts.map +1 -1
  58. package/dist/gateway/views/instance-detail-page.js +95 -12
  59. package/dist/gateway/views/instance-detail-page.js.map +1 -1
  60. package/dist/gateway/views/project-config-page.d.ts +12 -0
  61. package/dist/gateway/views/project-config-page.d.ts.map +1 -0
  62. package/dist/gateway/views/project-config-page.js +199 -0
  63. package/dist/gateway/views/project-config-page.js.map +1 -0
  64. package/dist/remote/push.d.ts.map +1 -1
  65. package/dist/remote/push.js +11 -2
  66. package/dist/remote/push.js.map +1 -1
  67. package/dist/scheduler/event-queue-unified.d.ts +50 -0
  68. package/dist/scheduler/event-queue-unified.d.ts.map +1 -0
  69. package/dist/scheduler/event-queue-unified.js +280 -0
  70. package/dist/scheduler/event-queue-unified.js.map +1 -0
  71. package/dist/scheduler/execution.d.ts +2 -1
  72. package/dist/scheduler/execution.d.ts.map +1 -1
  73. package/dist/scheduler/execution.js +48 -8
  74. package/dist/scheduler/execution.js.map +1 -1
  75. package/dist/scheduler/gateway-setup.d.ts +2 -1
  76. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  77. package/dist/scheduler/gateway-setup.js +20 -1
  78. package/dist/scheduler/gateway-setup.js.map +1 -1
  79. package/dist/scheduler/index.d.ts.map +1 -1
  80. package/dist/scheduler/index.js +75 -1
  81. package/dist/scheduler/index.js.map +1 -1
  82. package/dist/scheduler/lifecycle/agent-lifecycle.d.ts +114 -0
  83. package/dist/scheduler/lifecycle/agent-lifecycle.d.ts.map +1 -0
  84. package/dist/scheduler/lifecycle/agent-lifecycle.js +236 -0
  85. package/dist/scheduler/lifecycle/agent-lifecycle.js.map +1 -0
  86. package/dist/scheduler/lifecycle/index.d.ts +60 -0
  87. package/dist/scheduler/lifecycle/index.d.ts.map +1 -0
  88. package/dist/scheduler/lifecycle/index.js +103 -0
  89. package/dist/scheduler/lifecycle/index.js.map +1 -0
  90. package/dist/scheduler/lifecycle/instance-lifecycle.d.ts +88 -0
  91. package/dist/scheduler/lifecycle/instance-lifecycle.d.ts.map +1 -0
  92. package/dist/scheduler/lifecycle/instance-lifecycle.js +142 -0
  93. package/dist/scheduler/lifecycle/instance-lifecycle.js.map +1 -0
  94. package/dist/scheduler/types.d.ts +2 -0
  95. package/dist/scheduler/types.d.ts.map +1 -1
  96. package/dist/scheduler/webhook-setup.d.ts +1 -0
  97. package/dist/scheduler/webhook-setup.d.ts.map +1 -1
  98. package/dist/scheduler/webhook-setup.js +14 -2
  99. package/dist/scheduler/webhook-setup.js.map +1 -1
  100. package/dist/shared/config.d.ts +27 -0
  101. package/dist/shared/config.d.ts.map +1 -1
  102. package/dist/shared/config.js +51 -2
  103. package/dist/shared/config.js.map +1 -1
  104. package/dist/shared/constants.d.ts +16 -0
  105. package/dist/shared/constants.d.ts.map +1 -1
  106. package/dist/shared/constants.js +54 -0
  107. package/dist/shared/constants.js.map +1 -1
  108. package/dist/shared/default-feedback-agent.d.ts +10 -0
  109. package/dist/shared/default-feedback-agent.d.ts.map +1 -0
  110. package/dist/shared/default-feedback-agent.js +114 -0
  111. package/dist/shared/default-feedback-agent.js.map +1 -0
  112. package/dist/shared/persistence/adapters/state-store.d.ts +24 -0
  113. package/dist/shared/persistence/adapters/state-store.d.ts.map +1 -0
  114. package/dist/shared/persistence/adapters/state-store.js +32 -0
  115. package/dist/shared/persistence/adapters/state-store.js.map +1 -0
  116. package/dist/shared/persistence/adapters/stats-store.d.ts +49 -0
  117. package/dist/shared/persistence/adapters/stats-store.d.ts.map +1 -0
  118. package/dist/shared/persistence/adapters/stats-store.js +213 -0
  119. package/dist/shared/persistence/adapters/stats-store.js.map +1 -0
  120. package/dist/shared/persistence/backends/memory.d.ts +39 -0
  121. package/dist/shared/persistence/backends/memory.d.ts.map +1 -0
  122. package/dist/shared/persistence/backends/memory.js +214 -0
  123. package/dist/shared/persistence/backends/memory.js.map +1 -0
  124. package/dist/shared/persistence/backends/sqlite.d.ts +38 -0
  125. package/dist/shared/persistence/backends/sqlite.d.ts.map +1 -0
  126. package/dist/shared/persistence/backends/sqlite.js +250 -0
  127. package/dist/shared/persistence/backends/sqlite.js.map +1 -0
  128. package/dist/shared/persistence/event-store.d.ts +77 -0
  129. package/dist/shared/persistence/event-store.d.ts.map +1 -0
  130. package/dist/shared/persistence/event-store.js +139 -0
  131. package/dist/shared/persistence/event-store.js.map +1 -0
  132. package/dist/shared/persistence/index.d.ts +119 -0
  133. package/dist/shared/persistence/index.d.ts.map +1 -0
  134. package/dist/shared/persistence/index.js +93 -0
  135. package/dist/shared/persistence/index.js.map +1 -0
  136. package/dist/shared/persistence/migration.d.ts +47 -0
  137. package/dist/shared/persistence/migration.d.ts.map +1 -0
  138. package/dist/shared/persistence/migration.js +297 -0
  139. package/dist/shared/persistence/migration.js.map +1 -0
  140. package/dist/shared/usage.d.ts.map +1 -1
  141. package/dist/shared/usage.js +52 -7
  142. package/dist/shared/usage.js.map +1 -1
  143. package/dist/shared/validation.d.ts +61 -0
  144. package/dist/shared/validation.d.ts.map +1 -0
  145. package/dist/shared/validation.js +280 -0
  146. package/dist/shared/validation.js.map +1 -0
  147. package/dist/stats/event-store.d.ts +37 -0
  148. package/dist/stats/event-store.d.ts.map +1 -0
  149. package/dist/stats/event-store.js +366 -0
  150. package/dist/stats/event-store.js.map +1 -0
  151. package/dist/tui/App.d.ts +2 -1
  152. package/dist/tui/App.d.ts.map +1 -1
  153. package/dist/tui/App.js +132 -5
  154. package/dist/tui/App.js.map +1 -1
  155. package/dist/tui/render.d.ts +1 -1
  156. package/dist/tui/render.d.ts.map +1 -1
  157. package/dist/tui/render.js +2 -2
  158. package/dist/tui/render.js.map +1 -1
  159. package/dist/tui/status-tracker.d.ts +31 -0
  160. package/dist/tui/status-tracker.d.ts.map +1 -1
  161. package/dist/tui/status-tracker.js +117 -1
  162. package/dist/tui/status-tracker.js.map +1 -1
  163. package/dist/webhooks/providers/github.d.ts +1 -1
  164. package/dist/webhooks/providers/github.d.ts.map +1 -1
  165. package/dist/webhooks/providers/github.js +2 -2
  166. package/dist/webhooks/providers/github.js.map +1 -1
  167. package/dist/webhooks/providers/linear.d.ts +1 -1
  168. package/dist/webhooks/providers/linear.d.ts.map +1 -1
  169. package/dist/webhooks/providers/linear.js +2 -2
  170. package/dist/webhooks/providers/linear.js.map +1 -1
  171. package/dist/webhooks/providers/mintlify.d.ts +1 -1
  172. package/dist/webhooks/providers/mintlify.d.ts.map +1 -1
  173. package/dist/webhooks/providers/mintlify.js +2 -2
  174. package/dist/webhooks/providers/mintlify.js.map +1 -1
  175. package/dist/webhooks/providers/sentry.d.ts +1 -1
  176. package/dist/webhooks/providers/sentry.d.ts.map +1 -1
  177. package/dist/webhooks/providers/sentry.js +2 -2
  178. package/dist/webhooks/providers/sentry.js.map +1 -1
  179. package/dist/webhooks/providers/test.d.ts +1 -1
  180. package/dist/webhooks/providers/test.d.ts.map +1 -1
  181. package/dist/webhooks/providers/test.js +1 -1
  182. package/dist/webhooks/providers/test.js.map +1 -1
  183. package/dist/webhooks/registry.d.ts +8 -2
  184. package/dist/webhooks/registry.d.ts.map +1 -1
  185. package/dist/webhooks/registry.js +155 -3
  186. package/dist/webhooks/registry.js.map +1 -1
  187. package/dist/webhooks/types.d.ts +28 -1
  188. package/dist/webhooks/types.d.ts.map +1 -1
  189. package/dist/webhooks/validation.d.ts +7 -6
  190. package/dist/webhooks/validation.d.ts.map +1 -1
  191. package/dist/webhooks/validation.js +11 -9
  192. package/dist/webhooks/validation.js.map +1 -1
  193. package/package.json +1 -1
@@ -0,0 +1,236 @@
1
+ import { BaseStateMachine, getValidAgentTransitions, } from "./index.js";
2
+ /**
3
+ * AgentLifecycle manages the state of an agent type across all its instances.
4
+ *
5
+ * State transitions:
6
+ * - idle ⟷ running (based on instance count)
7
+ * - idle → building (via startBuild())
8
+ * - building → idle (via completeBuild())
9
+ * - any → error (via setError())
10
+ * - error → any (via recovery methods)
11
+ *
12
+ * The 'running' state is automatically managed based on the count of running instances.
13
+ */
14
+ export class AgentLifecycle extends BaseStateMachine {
15
+ info;
16
+ buildStartedAt = null;
17
+ instances = new Map();
18
+ constructor(agentName) {
19
+ super("idle", getValidAgentTransitions());
20
+ this.info = {
21
+ name: agentName,
22
+ runningInstanceCount: 0,
23
+ totalInstanceCount: 0,
24
+ lastRunAt: null,
25
+ lastBuildAt: null,
26
+ };
27
+ }
28
+ /**
29
+ * Get agent information
30
+ */
31
+ getInfo() {
32
+ return { ...this.info };
33
+ }
34
+ /**
35
+ * Get agent name
36
+ */
37
+ get agentName() {
38
+ return this.info.name;
39
+ }
40
+ /**
41
+ * Get running instance count
42
+ */
43
+ get runningInstanceCount() {
44
+ return this.info.runningInstanceCount;
45
+ }
46
+ /**
47
+ * Get total instance count
48
+ */
49
+ get totalInstanceCount() {
50
+ return this.info.totalInstanceCount;
51
+ }
52
+ /**
53
+ * Get all managed instances
54
+ */
55
+ getInstances() {
56
+ return this.instances;
57
+ }
58
+ /**
59
+ * Start building process (e.g., Docker image build)
60
+ * @param reason Optional reason for the build
61
+ */
62
+ startBuild(reason) {
63
+ this.buildStartedAt = new Date();
64
+ this.transition("building", "agent:build-start", {
65
+ agentName: this.info.name,
66
+ reason,
67
+ });
68
+ }
69
+ /**
70
+ * Complete building process
71
+ */
72
+ completeBuild() {
73
+ if (this.currentState !== "building") {
74
+ throw new Error(`Cannot complete build in state '${this.currentState}'. Must be 'building'.`);
75
+ }
76
+ this.info.lastBuildAt = new Date();
77
+ const durationMs = this.buildStartedAt
78
+ ? this.info.lastBuildAt.getTime() - this.buildStartedAt.getTime()
79
+ : 0;
80
+ this.buildStartedAt = null;
81
+ // Transition to idle if no instances running, otherwise to running
82
+ const targetState = this.info.runningInstanceCount > 0 ? "running" : "idle";
83
+ this.transition(targetState, "agent:build-complete", {
84
+ agentName: this.info.name,
85
+ durationMs,
86
+ });
87
+ }
88
+ /**
89
+ * Register a new instance and update state accordingly
90
+ * @param instance The instance lifecycle to track
91
+ */
92
+ addInstance(instance) {
93
+ this.instances.set(instance.instanceId, instance);
94
+ this.info.totalInstanceCount++;
95
+ // Listen to instance state changes
96
+ instance.on("instance:start", () => {
97
+ this._handleInstanceStart(instance);
98
+ });
99
+ instance.on("instance:complete", () => {
100
+ this._handleInstanceEnd(instance, "completed");
101
+ });
102
+ instance.on("instance:error", () => {
103
+ this._handleInstanceEnd(instance, "error");
104
+ });
105
+ instance.on("instance:kill", () => {
106
+ this._handleInstanceEnd(instance, "killed");
107
+ });
108
+ }
109
+ /**
110
+ * Remove an instance from tracking
111
+ * @param instanceId The instance ID to remove
112
+ */
113
+ removeInstance(instanceId) {
114
+ const instance = this.instances.get(instanceId);
115
+ if (!instance)
116
+ return false;
117
+ // Remove all listeners
118
+ instance.removeAllListeners();
119
+ this.instances.delete(instanceId);
120
+ // Update running count if it was running
121
+ if (instance.isRunning()) {
122
+ this.info.runningInstanceCount = Math.max(0, this.info.runningInstanceCount - 1);
123
+ this._updateStateFromInstanceCount();
124
+ }
125
+ return true;
126
+ }
127
+ /**
128
+ * Set agent to error state
129
+ * @param error Error message
130
+ */
131
+ setError(error) {
132
+ this.info.error = error;
133
+ this.transition("error", "agent:error", {
134
+ agentName: this.info.name,
135
+ error,
136
+ });
137
+ }
138
+ /**
139
+ * Clear error state and return to appropriate state based on running instances
140
+ */
141
+ clearError() {
142
+ if (this.currentState !== "error") {
143
+ throw new Error(`Cannot clear error in state '${this.currentState}'. Must be 'error'.`);
144
+ }
145
+ this.info.error = undefined;
146
+ const targetState = this.info.runningInstanceCount > 0 ? "running" : "idle";
147
+ this.forceTransition(targetState, "agent:error-cleared", {
148
+ agentName: this.info.name,
149
+ });
150
+ }
151
+ /**
152
+ * Get current error (if any)
153
+ */
154
+ getError() {
155
+ return this.info.error;
156
+ }
157
+ /**
158
+ * Check if agent has any running instances
159
+ */
160
+ hasRunningInstances() {
161
+ return this.info.runningInstanceCount > 0;
162
+ }
163
+ /**
164
+ * Check if agent is currently building
165
+ */
166
+ isBuilding() {
167
+ return this.currentState === "building";
168
+ }
169
+ /**
170
+ * Check if agent is in error state
171
+ */
172
+ hasError() {
173
+ return this.currentState === "error";
174
+ }
175
+ _handleInstanceStart(instance) {
176
+ this.info.runningInstanceCount++;
177
+ this.info.lastRunAt = new Date();
178
+ // Only transition to running if not in error or building state
179
+ if (this.currentState === "idle") {
180
+ this.transition("running", "agent:instance-start", {
181
+ agentName: this.info.name,
182
+ instanceId: instance.instanceId,
183
+ runningCount: this.info.runningInstanceCount,
184
+ });
185
+ }
186
+ else {
187
+ // Emit event without state transition for other states
188
+ this.emit("agent:instance-start", {
189
+ agentName: this.info.name,
190
+ instanceId: instance.instanceId,
191
+ runningCount: this.info.runningInstanceCount,
192
+ fromState: this.currentState,
193
+ toState: this.currentState,
194
+ timestamp: new Date(),
195
+ });
196
+ }
197
+ }
198
+ _handleInstanceEnd(instance, reason) {
199
+ this.info.runningInstanceCount = Math.max(0, this.info.runningInstanceCount - 1);
200
+ // Only transition states if not in error or building state
201
+ if (this.currentState === "running") {
202
+ const targetState = this.info.runningInstanceCount > 0 ? "running" : "idle";
203
+ this.transition(targetState, "agent:instance-end", {
204
+ agentName: this.info.name,
205
+ instanceId: instance.instanceId,
206
+ runningCount: this.info.runningInstanceCount,
207
+ reason,
208
+ });
209
+ }
210
+ else {
211
+ // Emit event without state transition for other states
212
+ this.emit("agent:instance-end", {
213
+ agentName: this.info.name,
214
+ instanceId: instance.instanceId,
215
+ runningCount: this.info.runningInstanceCount,
216
+ reason,
217
+ fromState: this.currentState,
218
+ toState: this.currentState,
219
+ timestamp: new Date(),
220
+ });
221
+ }
222
+ }
223
+ _updateStateFromInstanceCount() {
224
+ // Only update if we're not in building or error state
225
+ if (this.currentState === "building" || this.currentState === "error") {
226
+ return;
227
+ }
228
+ const targetState = this.info.runningInstanceCount > 0 ? "running" : "idle";
229
+ if (targetState !== this.currentState) {
230
+ this.forceTransition(targetState, "agent:auto-transition", {
231
+ agentName: this.info.name,
232
+ });
233
+ }
234
+ }
235
+ }
236
+ //# sourceMappingURL=agent-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-lifecycle.js","sourceRoot":"","sources":["../../../src/scheduler/lifecycle/agent-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { EventEmitter } from "events";
2
+ export type InstanceState = "queued" | "running" | "completed" | "error" | "killed";
3
+ export type AgentState = "idle" | "running" | "building" | "error";
4
+ export interface StateTransitionEvent<T extends string> {
5
+ fromState: T;
6
+ toState: T;
7
+ timestamp: Date;
8
+ }
9
+ export interface InstanceTransitionEvent extends StateTransitionEvent<InstanceState> {
10
+ instanceId: string;
11
+ agentName: string;
12
+ }
13
+ export interface AgentTransitionEvent extends StateTransitionEvent<AgentState> {
14
+ agentName: string;
15
+ }
16
+ /**
17
+ * Base state machine class with transition validation logic.
18
+ * Emits events on state transitions for external listeners.
19
+ */
20
+ export declare abstract class BaseStateMachine<T extends string> extends EventEmitter {
21
+ protected currentState: T;
22
+ protected validTransitions: Record<T, T[]>;
23
+ constructor(initialState: T, validTransitions: Record<T, T[]>);
24
+ /**
25
+ * Get the current state
26
+ */
27
+ getState(): T;
28
+ /**
29
+ * Check if a transition from current state to target state is valid
30
+ */
31
+ canTransitionTo(targetState: T): boolean;
32
+ /**
33
+ * Transition to a new state with validation
34
+ * @param targetState The state to transition to
35
+ * @param eventType The event type to emit
36
+ * @param eventData Additional data to include in the event
37
+ */
38
+ protected transition<E extends StateTransitionEvent<T>>(targetState: T, eventType: string, eventData: Omit<E, 'fromState' | 'toState' | 'timestamp'>): void;
39
+ /**
40
+ * Force transition to a state without validation (for error recovery)
41
+ */
42
+ protected forceTransition<E extends StateTransitionEvent<T>>(targetState: T, eventType: string, eventData: Omit<E, 'fromState' | 'toState' | 'timestamp'>): void;
43
+ }
44
+ /**
45
+ * Get the valid instance state transitions map
46
+ */
47
+ export declare function getValidInstanceTransitions(): Record<InstanceState, InstanceState[]>;
48
+ /**
49
+ * Get the valid agent state transitions map
50
+ */
51
+ export declare function getValidAgentTransitions(): Record<AgentState, AgentState[]>;
52
+ /**
53
+ * Check if an instance state is terminal (no further transitions allowed)
54
+ */
55
+ export declare function isTerminalInstanceState(state: InstanceState): boolean;
56
+ /**
57
+ * Check if an agent state is terminal (no further transitions allowed)
58
+ */
59
+ export declare function isTerminalAgentState(state: AgentState): boolean;
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scheduler/lifecycle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAGpF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAGnE,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM;IACpD,SAAS,EAAE,CAAC,CAAC;IACb,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;CACjB;AAGD,MAAM,WAAW,uBAAwB,SAAQ,oBAAoB,CAAC,aAAa,CAAC;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB,CAAC,UAAU,CAAC;IAC5E,SAAS,EAAE,MAAM,CAAC;CACnB;AAkBD;;;GAGG;AACH,8BAAsB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,YAAY;IAC3E,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1B,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAE/B,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAM7D;;OAEG;IACH,QAAQ,IAAI,CAAC;IAIb;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,CAAC,GAAG,OAAO;IAKxC;;;;;OAKG;IACH,SAAS,CAAC,UAAU,CAAC,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EACpD,WAAW,EAAE,CAAC,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAAC,GACxD,IAAI;IAsBP;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,CAAC,SAAS,oBAAoB,CAAC,CAAC,CAAC,EACzD,WAAW,EAAE,CAAC,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAAC,GACxD,IAAI;CAcR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC,CAEpF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAErE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE/D"}
@@ -0,0 +1,103 @@
1
+ import { EventEmitter } from "events";
2
+ // Validation for valid state transitions
3
+ const VALID_INSTANCE_TRANSITIONS = {
4
+ queued: ["running", "killed"], // can start running or be killed while queued
5
+ running: ["completed", "error", "killed"], // can complete, error, or be killed
6
+ completed: [], // terminal state
7
+ error: [], // terminal state
8
+ killed: [], // terminal state
9
+ };
10
+ const VALID_AGENT_TRANSITIONS = {
11
+ idle: ["running", "building", "error"], // can start running, start building, or error
12
+ running: ["idle", "running", "error"], // can return to idle, stay running (multiple instances), or error
13
+ building: ["idle", "running", "error"], // build can complete (idle/running) or fail (error)
14
+ error: ["idle", "building", "running"], // can recover to any other state
15
+ };
16
+ /**
17
+ * Base state machine class with transition validation logic.
18
+ * Emits events on state transitions for external listeners.
19
+ */
20
+ export class BaseStateMachine extends EventEmitter {
21
+ currentState;
22
+ validTransitions;
23
+ constructor(initialState, validTransitions) {
24
+ super();
25
+ this.currentState = initialState;
26
+ this.validTransitions = validTransitions;
27
+ }
28
+ /**
29
+ * Get the current state
30
+ */
31
+ getState() {
32
+ return this.currentState;
33
+ }
34
+ /**
35
+ * Check if a transition from current state to target state is valid
36
+ */
37
+ canTransitionTo(targetState) {
38
+ const allowedStates = this.validTransitions[this.currentState];
39
+ return allowedStates.includes(targetState);
40
+ }
41
+ /**
42
+ * Transition to a new state with validation
43
+ * @param targetState The state to transition to
44
+ * @param eventType The event type to emit
45
+ * @param eventData Additional data to include in the event
46
+ */
47
+ transition(targetState, eventType, eventData) {
48
+ if (!this.canTransitionTo(targetState)) {
49
+ throw new Error(`Invalid state transition from '${this.currentState}' to '${targetState}'. ` +
50
+ `Valid transitions are: ${this.validTransitions[this.currentState].join(', ')}`);
51
+ }
52
+ const fromState = this.currentState;
53
+ this.currentState = targetState;
54
+ const event = {
55
+ ...eventData,
56
+ fromState,
57
+ toState: targetState,
58
+ timestamp: new Date(),
59
+ };
60
+ this.emit(eventType, event);
61
+ this.emit('transition', event);
62
+ }
63
+ /**
64
+ * Force transition to a state without validation (for error recovery)
65
+ */
66
+ forceTransition(targetState, eventType, eventData) {
67
+ const fromState = this.currentState;
68
+ this.currentState = targetState;
69
+ const event = {
70
+ ...eventData,
71
+ fromState,
72
+ toState: targetState,
73
+ timestamp: new Date(),
74
+ };
75
+ this.emit(eventType, event);
76
+ this.emit('transition', event);
77
+ }
78
+ }
79
+ /**
80
+ * Get the valid instance state transitions map
81
+ */
82
+ export function getValidInstanceTransitions() {
83
+ return { ...VALID_INSTANCE_TRANSITIONS };
84
+ }
85
+ /**
86
+ * Get the valid agent state transitions map
87
+ */
88
+ export function getValidAgentTransitions() {
89
+ return { ...VALID_AGENT_TRANSITIONS };
90
+ }
91
+ /**
92
+ * Check if an instance state is terminal (no further transitions allowed)
93
+ */
94
+ export function isTerminalInstanceState(state) {
95
+ return VALID_INSTANCE_TRANSITIONS[state].length === 0;
96
+ }
97
+ /**
98
+ * Check if an agent state is terminal (no further transitions allowed)
99
+ */
100
+ export function isTerminalAgentState(state) {
101
+ return VALID_AGENT_TRANSITIONS[state].length === 0;
102
+ }
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scheduler/lifecycle/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { BaseStateMachine, type InstanceState, type InstanceTransitionEvent } from "./index.js";
2
+ export interface InstanceInfo {
3
+ instanceId: string;
4
+ agentName: string;
5
+ startedAt: Date | null;
6
+ endedAt: Date | null;
7
+ trigger: string;
8
+ error?: string;
9
+ }
10
+ export interface InstanceStartEvent extends InstanceTransitionEvent {
11
+ trigger: string;
12
+ }
13
+ export interface InstanceCompleteEvent extends InstanceTransitionEvent {
14
+ durationMs: number;
15
+ }
16
+ export interface InstanceErrorEvent extends InstanceTransitionEvent {
17
+ error: string;
18
+ durationMs: number;
19
+ }
20
+ export interface InstanceKillEvent extends InstanceTransitionEvent {
21
+ reason?: string;
22
+ durationMs?: number;
23
+ }
24
+ /**
25
+ * InstanceLifecycle manages the state of a single agent instance run.
26
+ *
27
+ * State transitions:
28
+ * - queued → running (via start())
29
+ * - queued → killed (via kill())
30
+ * - running → completed (via complete())
31
+ * - running → error (via fail())
32
+ * - running → killed (via kill())
33
+ */
34
+ export declare class InstanceLifecycle extends BaseStateMachine<InstanceState> {
35
+ private info;
36
+ constructor(instanceId: string, agentName: string, trigger: string);
37
+ /**
38
+ * Get instance information
39
+ */
40
+ getInfo(): Readonly<InstanceInfo>;
41
+ /**
42
+ * Get instance ID
43
+ */
44
+ get instanceId(): string;
45
+ /**
46
+ * Get agent name
47
+ */
48
+ get agentName(): string;
49
+ /**
50
+ * Get trigger information
51
+ */
52
+ get trigger(): string;
53
+ /**
54
+ * Get duration in milliseconds (only available after completion)
55
+ */
56
+ get durationMs(): number | null;
57
+ /**
58
+ * Transition from queued to running
59
+ */
60
+ start(): void;
61
+ /**
62
+ * Transition from running to completed
63
+ */
64
+ complete(): void;
65
+ /**
66
+ * Transition from running to error
67
+ * @param error Error message or reason for failure
68
+ */
69
+ fail(error: string): void;
70
+ /**
71
+ * Transition to killed from any non-terminal state
72
+ * @param reason Optional reason for killing
73
+ */
74
+ kill(reason?: string): void;
75
+ /**
76
+ * Check if the instance is in a terminal state
77
+ */
78
+ isTerminal(): boolean;
79
+ /**
80
+ * Check if the instance is currently running
81
+ */
82
+ isRunning(): boolean;
83
+ /**
84
+ * Check if the instance is queued
85
+ */
86
+ isQueued(): boolean;
87
+ }
88
+ //# sourceMappingURL=instance-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/scheduler/lifecycle/instance-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAE7B,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IACjE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAkB,SAAQ,uBAAuB;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,SAAQ,gBAAgB,CAAC,aAAa,CAAC;IACpE,OAAO,CAAC,IAAI,CAAe;gBAEf,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAWlE;;OAEG;IACH,OAAO,IAAI,QAAQ,CAAC,YAAY,CAAC;IAIjC;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAG9B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAab;;OAEG;IACH,QAAQ,IAAI,IAAI;IAmBhB;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAqBzB;;;OAGG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IA6B3B;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB"}
@@ -0,0 +1,142 @@
1
+ import { BaseStateMachine, getValidInstanceTransitions, } from "./index.js";
2
+ /**
3
+ * InstanceLifecycle manages the state of a single agent instance run.
4
+ *
5
+ * State transitions:
6
+ * - queued → running (via start())
7
+ * - queued → killed (via kill())
8
+ * - running → completed (via complete())
9
+ * - running → error (via fail())
10
+ * - running → killed (via kill())
11
+ */
12
+ export class InstanceLifecycle extends BaseStateMachine {
13
+ info;
14
+ constructor(instanceId, agentName, trigger) {
15
+ super("queued", getValidInstanceTransitions());
16
+ this.info = {
17
+ instanceId,
18
+ agentName,
19
+ startedAt: null,
20
+ endedAt: null,
21
+ trigger,
22
+ };
23
+ }
24
+ /**
25
+ * Get instance information
26
+ */
27
+ getInfo() {
28
+ return { ...this.info };
29
+ }
30
+ /**
31
+ * Get instance ID
32
+ */
33
+ get instanceId() {
34
+ return this.info.instanceId;
35
+ }
36
+ /**
37
+ * Get agent name
38
+ */
39
+ get agentName() {
40
+ return this.info.agentName;
41
+ }
42
+ /**
43
+ * Get trigger information
44
+ */
45
+ get trigger() {
46
+ return this.info.trigger;
47
+ }
48
+ /**
49
+ * Get duration in milliseconds (only available after completion)
50
+ */
51
+ get durationMs() {
52
+ if (!this.info.startedAt || !this.info.endedAt)
53
+ return null;
54
+ return this.info.endedAt.getTime() - this.info.startedAt.getTime();
55
+ }
56
+ /**
57
+ * Transition from queued to running
58
+ */
59
+ start() {
60
+ this.info.startedAt = new Date();
61
+ this.transition("running", "instance:start", {
62
+ instanceId: this.info.instanceId,
63
+ agentName: this.info.agentName,
64
+ trigger: this.info.trigger,
65
+ });
66
+ }
67
+ /**
68
+ * Transition from running to completed
69
+ */
70
+ complete() {
71
+ if (this.currentState !== "running") {
72
+ throw new Error(`Cannot complete instance in state '${this.currentState}'. Must be 'running'.`);
73
+ }
74
+ this.info.endedAt = new Date();
75
+ const durationMs = this.durationMs;
76
+ this.transition("completed", "instance:complete", {
77
+ instanceId: this.info.instanceId,
78
+ agentName: this.info.agentName,
79
+ durationMs,
80
+ });
81
+ }
82
+ /**
83
+ * Transition from running to error
84
+ * @param error Error message or reason for failure
85
+ */
86
+ fail(error) {
87
+ if (this.currentState !== "running") {
88
+ throw new Error(`Cannot fail instance in state '${this.currentState}'. Must be 'running'.`);
89
+ }
90
+ this.info.endedAt = new Date();
91
+ this.info.error = error;
92
+ const durationMs = this.durationMs;
93
+ this.transition("error", "instance:error", {
94
+ instanceId: this.info.instanceId,
95
+ agentName: this.info.agentName,
96
+ error,
97
+ durationMs,
98
+ });
99
+ }
100
+ /**
101
+ * Transition to killed from any non-terminal state
102
+ * @param reason Optional reason for killing
103
+ */
104
+ kill(reason) {
105
+ const validKillStates = ["queued", "running"];
106
+ if (!validKillStates.includes(this.currentState)) {
107
+ throw new Error(`Cannot kill instance in terminal state '${this.currentState}'. ` +
108
+ `Can only kill from: ${validKillStates.join(', ')}`);
109
+ }
110
+ // Set endedAt if not already set (for running instances)
111
+ if (!this.info.endedAt) {
112
+ this.info.endedAt = new Date();
113
+ }
114
+ // Only calculate duration if the instance was actually started
115
+ const durationMs = this.info.startedAt ? this.durationMs ?? undefined : undefined;
116
+ this.transition("killed", "instance:kill", {
117
+ instanceId: this.info.instanceId,
118
+ agentName: this.info.agentName,
119
+ reason,
120
+ durationMs,
121
+ });
122
+ }
123
+ /**
124
+ * Check if the instance is in a terminal state
125
+ */
126
+ isTerminal() {
127
+ return ["completed", "error", "killed"].includes(this.currentState);
128
+ }
129
+ /**
130
+ * Check if the instance is currently running
131
+ */
132
+ isRunning() {
133
+ return this.currentState === "running";
134
+ }
135
+ /**
136
+ * Check if the instance is queued
137
+ */
138
+ isQueued() {
139
+ return this.currentState === "queued";
140
+ }
141
+ }
142
+ //# sourceMappingURL=instance-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance-lifecycle.js","sourceRoot":"","sources":["../../../src/scheduler/lifecycle/instance-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAGhB,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AA6BpB;;;;;;;;;GASG;AACH,MAAM,OAAO,iBAAkB,SAAQ,gBAA+B;IAC5D,IAAI,CAAe;IAE3B,YAAY,UAAkB,EAAE,SAAiB,EAAE,OAAe;QAChE,KAAK,CAAC,QAAQ,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG;YACV,UAAU;YACV,SAAS;YACT,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CACb,SAAS,EACT,gBAAgB,EAChB;YACE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAChC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAC9B,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;SAC3B,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,YAAY,uBAAuB,CAAC,CAAC;QAClG,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAW,CAAC;QAEpC,IAAI,CAAC,UAAU,CACb,WAAW,EACX,mBAAmB,EACnB;YACE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAChC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAC9B,UAAU;SACX,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,KAAa;QAChB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,YAAY,uBAAuB,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAW,CAAC;QAEpC,IAAI,CAAC,UAAU,CACb,OAAO,EACP,gBAAgB,EAChB;YACE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAChC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAC9B,KAAK;YACL,UAAU;SACX,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,MAAe;QAClB,MAAM,eAAe,GAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC/D,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CACb,2CAA2C,IAAI,CAAC,YAAY,KAAK;gBACjE,uBAAuB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpD,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QACjC,CAAC;QAED,+DAA+D;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAElF,IAAI,CAAC,UAAU,CACb,QAAQ,EACR,eAAe,EACf;YACE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAChC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAC9B,MAAM;YACN,UAAU;SACX,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC;IACxC,CAAC;CACF"}