@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.
- package/dist/agents/feedback-monitor.d.ts +56 -0
- package/dist/agents/feedback-monitor.d.ts.map +1 -0
- package/dist/agents/feedback-monitor.js +176 -0
- package/dist/agents/feedback-monitor.js.map +1 -0
- package/dist/agents/feedback-runner.d.ts +28 -0
- package/dist/agents/feedback-runner.d.ts.map +1 -0
- package/dist/agents/feedback-runner.js +138 -0
- package/dist/agents/feedback-runner.js.map +1 -0
- package/dist/agents/runner.d.ts +4 -0
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +11 -0
- package/dist/agents/runner.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/cli/commands/agent.d.ts.map +1 -1
- package/dist/cli/commands/agent.js +46 -0
- package/dist/cli/commands/agent.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +1 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +101 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/start.js +1 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/webhook.d.ts +11 -0
- package/dist/cli/commands/webhook.d.ts.map +1 -0
- package/dist/cli/commands/webhook.js +271 -0
- package/dist/cli/commands/webhook.js.map +1 -0
- package/dist/cli/main.js +17 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/docker/local-runtime.d.ts.map +1 -1
- package/dist/docker/local-runtime.js +36 -7
- package/dist/docker/local-runtime.js.map +1 -1
- package/dist/docker/runtime.d.ts +4 -0
- package/dist/docker/runtime.d.ts.map +1 -1
- package/dist/gateway/index.d.ts +2 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +1 -1
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/routes/control.d.ts +2 -0
- package/dist/gateway/routes/control.d.ts.map +1 -1
- package/dist/gateway/routes/control.js +56 -0
- package/dist/gateway/routes/control.js.map +1 -1
- package/dist/gateway/routes/dashboard.d.ts.map +1 -1
- package/dist/gateway/routes/dashboard.js +89 -3
- package/dist/gateway/routes/dashboard.js.map +1 -1
- package/dist/gateway/routes/webhooks.d.ts +2 -1
- package/dist/gateway/routes/webhooks.d.ts.map +1 -1
- package/dist/gateway/routes/webhooks.js +3 -2
- package/dist/gateway/routes/webhooks.js.map +1 -1
- package/dist/gateway/views/agent-detail-page.d.ts +2 -0
- package/dist/gateway/views/agent-detail-page.d.ts.map +1 -1
- package/dist/gateway/views/agent-detail-page.js +115 -2
- package/dist/gateway/views/agent-detail-page.js.map +1 -1
- package/dist/gateway/views/dashboard-page.d.ts.map +1 -1
- package/dist/gateway/views/dashboard-page.js +36 -2
- package/dist/gateway/views/dashboard-page.js.map +1 -1
- package/dist/gateway/views/instance-detail-page.d.ts +6 -0
- package/dist/gateway/views/instance-detail-page.d.ts.map +1 -1
- package/dist/gateway/views/instance-detail-page.js +95 -12
- package/dist/gateway/views/instance-detail-page.js.map +1 -1
- package/dist/gateway/views/project-config-page.d.ts +12 -0
- package/dist/gateway/views/project-config-page.d.ts.map +1 -0
- package/dist/gateway/views/project-config-page.js +199 -0
- package/dist/gateway/views/project-config-page.js.map +1 -0
- package/dist/remote/push.d.ts.map +1 -1
- package/dist/remote/push.js +11 -2
- package/dist/remote/push.js.map +1 -1
- package/dist/scheduler/event-queue-unified.d.ts +50 -0
- package/dist/scheduler/event-queue-unified.d.ts.map +1 -0
- package/dist/scheduler/event-queue-unified.js +280 -0
- package/dist/scheduler/event-queue-unified.js.map +1 -0
- package/dist/scheduler/execution.d.ts +2 -1
- package/dist/scheduler/execution.d.ts.map +1 -1
- package/dist/scheduler/execution.js +48 -8
- package/dist/scheduler/execution.js.map +1 -1
- package/dist/scheduler/gateway-setup.d.ts +2 -1
- package/dist/scheduler/gateway-setup.d.ts.map +1 -1
- package/dist/scheduler/gateway-setup.js +20 -1
- package/dist/scheduler/gateway-setup.js.map +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +75 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/lifecycle/agent-lifecycle.d.ts +114 -0
- package/dist/scheduler/lifecycle/agent-lifecycle.d.ts.map +1 -0
- package/dist/scheduler/lifecycle/agent-lifecycle.js +236 -0
- package/dist/scheduler/lifecycle/agent-lifecycle.js.map +1 -0
- package/dist/scheduler/lifecycle/index.d.ts +60 -0
- package/dist/scheduler/lifecycle/index.d.ts.map +1 -0
- package/dist/scheduler/lifecycle/index.js +103 -0
- package/dist/scheduler/lifecycle/index.js.map +1 -0
- package/dist/scheduler/lifecycle/instance-lifecycle.d.ts +88 -0
- package/dist/scheduler/lifecycle/instance-lifecycle.d.ts.map +1 -0
- package/dist/scheduler/lifecycle/instance-lifecycle.js +142 -0
- package/dist/scheduler/lifecycle/instance-lifecycle.js.map +1 -0
- package/dist/scheduler/types.d.ts +2 -0
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/scheduler/webhook-setup.d.ts +1 -0
- package/dist/scheduler/webhook-setup.d.ts.map +1 -1
- package/dist/scheduler/webhook-setup.js +14 -2
- package/dist/scheduler/webhook-setup.js.map +1 -1
- package/dist/shared/config.d.ts +27 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +51 -2
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/constants.d.ts +16 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +54 -0
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/default-feedback-agent.d.ts +10 -0
- package/dist/shared/default-feedback-agent.d.ts.map +1 -0
- package/dist/shared/default-feedback-agent.js +114 -0
- package/dist/shared/default-feedback-agent.js.map +1 -0
- package/dist/shared/persistence/adapters/state-store.d.ts +24 -0
- package/dist/shared/persistence/adapters/state-store.d.ts.map +1 -0
- package/dist/shared/persistence/adapters/state-store.js +32 -0
- package/dist/shared/persistence/adapters/state-store.js.map +1 -0
- package/dist/shared/persistence/adapters/stats-store.d.ts +49 -0
- package/dist/shared/persistence/adapters/stats-store.d.ts.map +1 -0
- package/dist/shared/persistence/adapters/stats-store.js +213 -0
- package/dist/shared/persistence/adapters/stats-store.js.map +1 -0
- package/dist/shared/persistence/backends/memory.d.ts +39 -0
- package/dist/shared/persistence/backends/memory.d.ts.map +1 -0
- package/dist/shared/persistence/backends/memory.js +214 -0
- package/dist/shared/persistence/backends/memory.js.map +1 -0
- package/dist/shared/persistence/backends/sqlite.d.ts +38 -0
- package/dist/shared/persistence/backends/sqlite.d.ts.map +1 -0
- package/dist/shared/persistence/backends/sqlite.js +250 -0
- package/dist/shared/persistence/backends/sqlite.js.map +1 -0
- package/dist/shared/persistence/event-store.d.ts +77 -0
- package/dist/shared/persistence/event-store.d.ts.map +1 -0
- package/dist/shared/persistence/event-store.js +139 -0
- package/dist/shared/persistence/event-store.js.map +1 -0
- package/dist/shared/persistence/index.d.ts +119 -0
- package/dist/shared/persistence/index.d.ts.map +1 -0
- package/dist/shared/persistence/index.js +93 -0
- package/dist/shared/persistence/index.js.map +1 -0
- package/dist/shared/persistence/migration.d.ts +47 -0
- package/dist/shared/persistence/migration.d.ts.map +1 -0
- package/dist/shared/persistence/migration.js +297 -0
- package/dist/shared/persistence/migration.js.map +1 -0
- package/dist/shared/usage.d.ts.map +1 -1
- package/dist/shared/usage.js +52 -7
- package/dist/shared/usage.js.map +1 -1
- package/dist/shared/validation.d.ts +61 -0
- package/dist/shared/validation.d.ts.map +1 -0
- package/dist/shared/validation.js +280 -0
- package/dist/shared/validation.js.map +1 -0
- package/dist/stats/event-store.d.ts +37 -0
- package/dist/stats/event-store.d.ts.map +1 -0
- package/dist/stats/event-store.js +366 -0
- package/dist/stats/event-store.js.map +1 -0
- package/dist/tui/App.d.ts +2 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +132 -5
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/render.d.ts +1 -1
- package/dist/tui/render.d.ts.map +1 -1
- package/dist/tui/render.js +2 -2
- package/dist/tui/render.js.map +1 -1
- package/dist/tui/status-tracker.d.ts +31 -0
- package/dist/tui/status-tracker.d.ts.map +1 -1
- package/dist/tui/status-tracker.js +117 -1
- package/dist/tui/status-tracker.js.map +1 -1
- package/dist/webhooks/providers/github.d.ts +1 -1
- package/dist/webhooks/providers/github.d.ts.map +1 -1
- package/dist/webhooks/providers/github.js +2 -2
- package/dist/webhooks/providers/github.js.map +1 -1
- package/dist/webhooks/providers/linear.d.ts +1 -1
- package/dist/webhooks/providers/linear.d.ts.map +1 -1
- package/dist/webhooks/providers/linear.js +2 -2
- package/dist/webhooks/providers/linear.js.map +1 -1
- package/dist/webhooks/providers/mintlify.d.ts +1 -1
- package/dist/webhooks/providers/mintlify.d.ts.map +1 -1
- package/dist/webhooks/providers/mintlify.js +2 -2
- package/dist/webhooks/providers/mintlify.js.map +1 -1
- package/dist/webhooks/providers/sentry.d.ts +1 -1
- package/dist/webhooks/providers/sentry.d.ts.map +1 -1
- package/dist/webhooks/providers/sentry.js +2 -2
- package/dist/webhooks/providers/sentry.js.map +1 -1
- package/dist/webhooks/providers/test.d.ts +1 -1
- package/dist/webhooks/providers/test.d.ts.map +1 -1
- package/dist/webhooks/providers/test.js +1 -1
- package/dist/webhooks/providers/test.js.map +1 -1
- package/dist/webhooks/registry.d.ts +8 -2
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/registry.js +155 -3
- package/dist/webhooks/registry.js.map +1 -1
- package/dist/webhooks/types.d.ts +28 -1
- package/dist/webhooks/types.d.ts.map +1 -1
- package/dist/webhooks/validation.d.ts +7 -6
- package/dist/webhooks/validation.d.ts.map +1 -1
- package/dist/webhooks/validation.js +11 -9
- package/dist/webhooks/validation.js.map +1 -1
- 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":"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"}
|