Aller au contenu
English

Fixer des délais et annuler une tâche

Limitez la durée d’exécution de l’agent, réglez les passages successifs et annulez depuis votre code.

Définissez les délais à côté du brief si la tâche demande des limites plus strictes que celles par défaut. Vous pouvez limiter la durée totale d’un échange et le temps pendant lequel l’agent peut rester silencieux.

import { reportValue } from "./reporter.ts";
import { dispatch } from "@elie-laloum/outpost";
import { coder, repository, sandboxProvider } from "./outpost.config.ts";

const result = await dispatch({
  repository,
  sandboxProvider,
  agent: coder,
  branch: { mode: "named", name: "outpost/parser-fix" },
  brief: { text: "Fix the parser and commit the change." },
  deadlineMs: 20 * 60_000,
  idleMs: 5 * 60_000,
});
reportValue(result.text);
// Example output: Fixed the failing tests and committed the change.

Si l’agent tourne plus de 20 minutes, ou reste muet pendant 5, la promesse est rejetée avec une OutpostError de code timeout. La sandbox est libérée ; la branche garde ce que l’agent a commité.

Référence API : DispatchOptions.

Votre fonction de rappel observe reçoit un événement stopped dont le champ reason indique ce qui a arrêté le processus : deadline, idle-timeout, completion ou aborted.

Passez un AbortSignal. Ici, Ctrl+C arrête l’agent au lieu de le laisser tourner dans la sandbox.

import { dispatch, recoveryDetails } from "@elie-laloum/outpost";
import { coder, repository, sandboxProvider } from "./outpost.config.ts";

const controller = new AbortController();
process.once("SIGINT", () => controller.abort("cancelled by user"));

try {
  await dispatch({
    repository,
    sandboxProvider,
    agent: coder,
    branch: { mode: "named", name: "outpost/refactor" },
    brief: { text: "Refactor the auth module and commit the change." },
    signal: controller.signal,
  });
} catch (error) {
  console.error(error, recoveryDetails(error));
}

La promesse est rejetée avec la valeur passée à abort(), ici "cancelled by user". AbortSignal.timeout(ms) fonctionne de la même façon pour un délai qui couvre toutes les passes.

Après un arrêtdispatch()sandbox.dispatch() dans une session
Processus d’agentSon groupe de processus et ses descendants terminésIdem
SandboxLibéréeToujours active, prête pour le dispatch suivant
Worktree, brancheConservés ; recoveryDetails(error) les donneConservés

Pour changer la direction de l’agent sans l’arrêter, réorientez-le plutôt.

Relancer le brief jusqu’à ce que l’agent le déclare terminé

Section intitulée « Relancer le brief jusqu’à ce que l’agent le déclare terminé »

passes renvoie le brief quand une passe se termine sans marqueur de fin. Demandez le marqueur dans le brief : Outpost ne l’ajoute pas.

import { reportValue } from "./reporter.ts";
import { dispatch } from "@elie-laloum/outpost";
import { coder, repository, sandboxProvider } from "./outpost.config.ts";

const result = await dispatch({
  repository,
  sandboxProvider,
  agent: coder,
  branch: { mode: "named", name: "outpost/flaky-tests" },
  brief: {
    text: "Fix the flaky tests and commit. When every test passes, end your answer with READY_FOR_REVIEW.",
  },
  passes: 3,
  until: "READY_FOR_REVIEW",
});
reportValue(result.completed, result.completion);
// Example output: true READY_FOR_REVIEW

Chaque passe démarre une nouvelle conversation sur la même branche : elle voit donc les commits précédents. Outpost s’arrête à la première passe dont la réponse contient un marqueur. until accepte aussi une liste ; until: [] désactive la recherche et exécute toutes les passes.

Référence API : DispatchResult.

Si l’agent écrit son marqueur mais continue de tourner, Outpost l’arrête settleMs après sa dernière sortie. Le résultat est conservé et warn reçoit un message.

limits fixe des délais aux étapes Git et fichiers qui entourent l’agent. Passez-le à dispatch(), createWorkspace() ou createSandbox().

import { dispatch } from "@elie-laloum/outpost";
import { coder, repository, sandboxProvider } from "./outpost.config.ts";

await dispatch({
  repository,
  sandboxProvider,
  agent: coder,
  branch: { mode: "integrate" },
  brief: { text: "Update the lockfile and commit the change." },
  limits: { gitMs: 120_000, mergeMs: 120_000 },
});

Référence API : StageLimits.

  • Chaque durée doit être un nombre positif : 0 ne désactive pas une limite.
  • passes supérieur à 1 ne se combine ni avec response ni avec continuation.
  • Arrêter un agent n’annule rien. Les commits et fichiers déjà écrits restent sur la branche.

API : dispatch · DispatchOptions · DispatchResult · StageLimits · recoveryDetails · AgentObservation.