TODO: Implement task cancellation with AbortController #174

Closed
opened 2026-01-24 10:27:08 +00:00 by jack · 0 comments
Owner

Beschreibung

In packages/worker/src/worker-service.ts gibt es ein TODO für Task-Cancellation:

private handleTaskCancelled(taskId: string, reason?: string): void {
  if (this.currentTaskId === taskId) {
    logger.info(`Task ${taskId} was cancelled: ${reason || 'No reason'}`);
    // TODO: Implement task cancellation (abort controller, etc.)
    this.currentTaskId = null;
  }
}

Aktuell wird bei Task-Cancellation nur die currentTaskId zurückgesetzt, aber laufende Operationen (API-Calls, etc.) werden nicht abgebrochen.

Zu implementieren

1. AbortController pro Task

private currentAbortController: AbortController | null = null;

private async handleTask(taskData: TaskPayload): Promise<void> {
  this.currentTaskId = taskData.id;
  this.currentAbortController = new AbortController();
  
  try {
    await this.processTask(taskData, this.currentAbortController.signal);
  } finally {
    this.currentAbortController = null;
    this.currentTaskId = null;
  }
}

private handleTaskCancelled(taskId: string, reason?: string): void {
  if (this.currentTaskId === taskId && this.currentAbortController) {
    logger.info(`Cancelling task ${taskId}: ${reason || 'No reason'}`);
    this.currentAbortController.abort(reason);
  }
}

2. Signal an Handler weitergeben

// Handler-Interface erweitern
interface TaskHandler {
  handle(task: TaskData, signal?: AbortSignal): Promise<TaskResult>;
}

// In Agents verwenden
async extractObservation(input: string, signal?: AbortSignal): Promise<Observation> {
  const response = await this.client.messages.create({
    // ...
    signal, // AbortSignal an API-Client weitergeben
  });
}

3. Abort-Checks in langen Operationen

async processLargeTask(items: Item[], signal?: AbortSignal): Promise<void> {
  for (const item of items) {
    // Check for cancellation
    if (signal?.aborted) {
      throw new Error('Task cancelled');
    }
    await this.processItem(item);
  }
}

Betroffene Dateien

  • packages/worker/src/worker-service.ts
  • packages/worker/src/handlers/*.ts (alle Handler)
  • packages/worker/src/agents/*.ts (alle Agents)

Abhängigkeiten

  • Anthropic SDK unterstützt AbortSignal
  • Mistral SDK prüfen

Priorität

Mittel - Wichtig für sauberes Ressourcen-Management und User Experience (z.B. wenn User Backend neu startet)

## Beschreibung In `packages/worker/src/worker-service.ts` gibt es ein TODO für Task-Cancellation: ```typescript private handleTaskCancelled(taskId: string, reason?: string): void { if (this.currentTaskId === taskId) { logger.info(`Task ${taskId} was cancelled: ${reason || 'No reason'}`); // TODO: Implement task cancellation (abort controller, etc.) this.currentTaskId = null; } } ``` Aktuell wird bei Task-Cancellation nur die `currentTaskId` zurückgesetzt, aber laufende Operationen (API-Calls, etc.) werden nicht abgebrochen. ## Zu implementieren ### 1. AbortController pro Task ```typescript private currentAbortController: AbortController | null = null; private async handleTask(taskData: TaskPayload): Promise<void> { this.currentTaskId = taskData.id; this.currentAbortController = new AbortController(); try { await this.processTask(taskData, this.currentAbortController.signal); } finally { this.currentAbortController = null; this.currentTaskId = null; } } private handleTaskCancelled(taskId: string, reason?: string): void { if (this.currentTaskId === taskId && this.currentAbortController) { logger.info(`Cancelling task ${taskId}: ${reason || 'No reason'}`); this.currentAbortController.abort(reason); } } ``` ### 2. Signal an Handler weitergeben ```typescript // Handler-Interface erweitern interface TaskHandler { handle(task: TaskData, signal?: AbortSignal): Promise<TaskResult>; } // In Agents verwenden async extractObservation(input: string, signal?: AbortSignal): Promise<Observation> { const response = await this.client.messages.create({ // ... signal, // AbortSignal an API-Client weitergeben }); } ``` ### 3. Abort-Checks in langen Operationen ```typescript async processLargeTask(items: Item[], signal?: AbortSignal): Promise<void> { for (const item of items) { // Check for cancellation if (signal?.aborted) { throw new Error('Task cancelled'); } await this.processItem(item); } } ``` ## Betroffene Dateien - `packages/worker/src/worker-service.ts` - `packages/worker/src/handlers/*.ts` (alle Handler) - `packages/worker/src/agents/*.ts` (alle Agents) ## Abhängigkeiten - Anthropic SDK unterstützt AbortSignal - Mistral SDK prüfen ## Priorität Mittel - Wichtig für sauberes Ressourcen-Management und User Experience (z.B. wenn User Backend neu startet)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
customable/claude-mem#174
No description provided.