The run page now has a Cancel button next to the status pill while a pipeline is non-terminal. Clicking it (after a confirm prompt) hits POST /api/reports/:id/cancel, which marks the row as failed with "Cancelled by <email>" and SIGTERMs the spawned tsx child's whole process group — so the Claude CLI subshell, ffmpeg, and Apify-poll loops all stop together rather than orphaning. Implementation notes: - Replaced runningReportId with runningChild that holds the child handle - Removed child.unref() so we can manage it. Pulled both the run and retry spawn paths into a single spawnPipeline() helper to avoid drift - Mark the row before sending the signal so the spawn-exit handler's COALESCE doesn't overwrite "Cancelled by" with "killed by SIGTERM" - Cancel from a different server process (e.g. after a server restart) returns 409 with a hint that the child handle is no longer in scope — the user can mark it failed manually if needed Already-completed stages are preserved on disk via .state sentinels, so "Cancel + edit brief + Force re-run" works without re-spending on finished stages. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| public | ||
| src | ||
| .env.example | ||
| .gitignore | ||
| index.html | ||
| package.json | ||
| postcss.config.js | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||