akemon 0.2.10 → 0.2.11

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/server.js CHANGED
@@ -342,6 +342,13 @@ export async function serve(options) {
342
342
  // Wait for engine to become free (poll with backoff, max 5 min)
343
343
  const deadline = Date.now() + 5 * 60 * 1000;
344
344
  while (engineBusy) {
345
+ // If engine has been busy for >10 min, it's stuck — force release
346
+ if (engineBusySince && Date.now() - engineBusySince > 10 * 60 * 1000) {
347
+ console.log(`[engine] Force-releasing stuck engine lock (busy for ${Math.round((Date.now() - engineBusySince) / 60000)}min)`);
348
+ engineBusy = false;
349
+ engineBusySince = 0;
350
+ break;
351
+ }
345
352
  if (Date.now() > deadline) {
346
353
  return { success: false, error: "Engine busy timeout (5 min)" };
347
354
  }
@@ -353,7 +360,12 @@ export async function serve(options) {
353
360
  const prompt = req.context
354
361
  ? `${req.context}\n\n---\n\n${req.question}`
355
362
  : req.question;
356
- const response = await runEngine(options.engine || "claude", options.model, options.allowAll, prompt, workdir, req.tools, req.relay);
363
+ // Hard timeout: if engine doesn't respond in 8 min, give up
364
+ const engineTimeout = new Promise((_, reject) => setTimeout(() => reject(new Error("Engine execution timeout (8 min)")), 8 * 60 * 1000));
365
+ const response = await Promise.race([
366
+ runEngine(options.engine || "claude", options.model, options.allowAll, prompt, workdir, req.tools, req.relay),
367
+ engineTimeout,
368
+ ]);
357
369
  // Track token usage via EventBus
358
370
  emitTokenUsage(prompt.length, response.length);
359
371
  return { success: true, response };
@@ -134,10 +134,6 @@ export class TaskModule {
134
134
  const orderAge = Date.now() - new Date(order.created_at || 0).getTime();
135
135
  if (orderAge > 3_600_000) {
136
136
  this.gaveUp.add(order.id);
137
- try {
138
- await relay.cancelOrder(order.id);
139
- }
140
- catch { }
141
137
  continue;
142
138
  }
143
139
  const retry = this.orderRetry.get(order.id);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akemon",
3
- "version": "0.2.10",
3
+ "version": "0.2.11",
4
4
  "description": "Agent work marketplace — train your agent, let it work for others",
5
5
  "type": "module",
6
6
  "license": "MIT",