Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
785 changes: 785 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion crates/taskito-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "taskito-core"
version = "0.16.3"
version = "0.16.4"
edition = "2021"

[features]
Expand Down
2 changes: 1 addition & 1 deletion crates/taskito-mesh/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "taskito-mesh"
version = "0.16.3"
version = "0.16.4"
edition = "2021"

[dependencies]
Expand Down
2 changes: 1 addition & 1 deletion crates/taskito-node/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "taskito-node"
version = "0.16.3"
version = "0.16.4"
edition = "2021"
description = "Node.js (napi-rs) bindings for the Taskito task-queue core"
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion crates/taskito-python/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "taskito-python"
version = "0.16.3"
version = "0.16.4"
edition = "2021"

[features]
Expand Down
2 changes: 1 addition & 1 deletion crates/taskito-workflows/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "taskito-workflows"
version = "0.16.3"
version = "0.16.4"
edition = "2021"

[features]
Expand Down
28 changes: 25 additions & 3 deletions docs/content/docs/resources/changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,28 @@ title: Changelog
description: "Release history for taskito — every notable change, fix, and feature."
---

All notable changes to taskito are documented here.
{/* AUTO-GENERATED from /CHANGELOG.md by scripts/sync-changelog.mjs — do not edit directly. */}

All notable changes to taskito are documented here. The format is based on
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); the project follows
[Semantic Versioning](https://semver.org/spec/v2.0.0.html). All SDKs (Python, Node) and the
underlying Rust crates are released together, in lock-step.

## 0.16.4

Maintenance release. Upgrades the Rust↔Python binding layer and refreshes project docs; no
public API changes.

### Changed

- **PyO3 0.29.** Upgraded the PyO3 binding layer from 0.22 to 0.29 (and `pyo3-log` to 0.13).
Internal only — no Python API change. Migrates to the `Bound` / `IntoPyObject` APIs and
declares `gil_used`, laying the groundwork for Python 3.14 and free-threaded builds.
- **Node SDK default SQLite settings.** Opening a SQLite-backed queue now applies sensible
defaults out of the box (#292).
- **Documentation.** Restructured the READMEs into a project-level root README plus
self-contained per-SDK pages, and introduced this root `CHANGELOG.md` — now also rendered on
the documentation site.

## 0.16.3

Expand Down Expand Up @@ -183,7 +204,7 @@ Security-hardening release. No breaking changes.

## 0.15.0

See the <SdkLink to="guides/operations/upgrading-0.15">Upgrading to 0.15</SdkLink> guide for
See the [Upgrading to 0.15](https://docs.byteveda.org/taskito/guides/operations/upgrading-0.15) guide for
migration steps, rolling-upgrade notes, and the downgrade floor.

### Breaking
Expand Down Expand Up @@ -245,7 +266,7 @@ migration steps, rolling-upgrade notes, and the downgrade floor.

### Added

- **Bare-metal autoscaler.** `taskito.autoscale` provides an in-process HPA-style control loop that spawns and drains `taskito worker` subprocesses based on queue depth and utilisation. Mirrors the Kubernetes HPA dual-signal formula (`depth_desired` + `util_desired`). Configurable stabilisation windows (default: scale-up immediate, scale-down 5 minutes), tolerance band (10%), overload override, and crash recovery. Use `serve_autoscaler(queue, AutoscaleConfig(...))` as the entry point. See the <SdkLink to="guides/operations/autoscaler">Bare-Metal Autoscaler guide</SdkLink>.
- **Bare-metal autoscaler.** `taskito.autoscale` provides an in-process HPA-style control loop that spawns and drains `taskito worker` subprocesses based on queue depth and utilisation. Mirrors the Kubernetes HPA dual-signal formula (`depth_desired` + `util_desired`). Configurable stabilisation windows (default: scale-up immediate, scale-down 5 minutes), tolerance band (10%), overload override, and crash recovery. Use `serve_autoscaler(queue, AutoscaleConfig(...))` as the entry point. See the [Bare-Metal Autoscaler guide](https://docs.byteveda.org/taskito/guides/operations/autoscaler).
- **Dashboard `/api/workflows` backend.** Four new REST endpoints expose workflow run data: `GET /api/workflows/runs` (paginated list, filterable by definition name and state), `GET /api/workflows/runs/{id}` (run header + per-node detail with compensation fields), `GET /api/workflows/runs/{id}/dag` (DAG JSON), and `GET /api/workflows/runs/{id}/children` (sub-workflow runs). All timestamps are Unix milliseconds.
- **Canvas saga compensation.** `chain`, `group`, and `chord` support `.with_compensation([...])`. On failure, compensators for completed steps are enqueued with a deterministic `canvas_compensation:{run_id}:{slot}` idempotency key. Dispatch order: chain → reverse-sequential, group → parallel, chord → callback compensator first then group members. `Signature.with_compensation(compensator)` lets individual signatures carry their own compensator.
- **Per-item batch results.** `@queue.task(batch={"per_item_results": True})` enables per-item tracking for batched tasks. The task returns `list[BatchItemResult]`; each caller's `BatchedJobResult.result()` returns **only that caller's value**. `BatchItemResult.success(item_index, result)` and `BatchItemResult.failure(item_index, error)` are the constructors. `partial_failures()` returns failed items after a successful batch. `BatchPartialFailureError` and `BatchResultTypeError` are the new exception types. Cannot be combined with `idempotent=True`.
Expand Down Expand Up @@ -767,3 +788,4 @@ Re-release of 0.2.0 — PyPI does not allow re-uploads of deleted versions.
- cloudpickle serialization for arguments and results

</details>

5 changes: 3 additions & 2 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
"private": true,
"type": "module",
"scripts": {
"build": "react-router build",
"dev": "react-router dev",
"sync:changelog": "node ../scripts/sync-changelog.mjs",
"build": "pnpm sync:changelog && react-router build",
"dev": "pnpm sync:changelog && react-router dev",
"start": "serve build/client",
"typecheck": "react-router typegen && tsc --noEmit",
"lint": "biome check",
Expand Down
30 changes: 30 additions & 0 deletions scripts/sync-changelog.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env node
// Generate the docs changelog page from the canonical root CHANGELOG.md.
//
// CHANGELOG.md (Keep a Changelog) is the single source of truth — edit it there.
// This script wraps its body in the frontmatter the docs site needs and writes
// docs/content/docs/resources/changelog.mdx. Run automatically before `docs` dev/build.
import { readFileSync, writeFileSync } from "node:fs";
import { fileURLToPath } from "node:url";

const repoRoot = new URL("../", import.meta.url);
const source = fileURLToPath(new URL("CHANGELOG.md", repoRoot));
const target = fileURLToPath(
new URL("docs/content/docs/resources/changelog.mdx", repoRoot),
);

// Drop the top-level "# Changelog" heading — the frontmatter title renders it.
const body = readFileSync(source, "utf8").replace(/^#\s+Changelog\s*\n/, "").trimStart();

const frontmatter = [
"---",
"title: Changelog",
'description: "Release history for taskito — every notable change, fix, and feature."',
"---",
"",
"{/* AUTO-GENERATED from /CHANGELOG.md by scripts/sync-changelog.mjs — do not edit directly. */}",
"",
].join("\n");

writeFileSync(target, `${frontmatter}\n${body}\n`);
console.log(`synced ${target} from CHANGELOG.md`);
2 changes: 1 addition & 1 deletion sdks/node/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@byteveda/taskito",
"version": "0.16.3",
"version": "0.16.4",
"description": "Rust-powered task queue for Node.js — no broker required.",
"license": "MIT",
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion sdks/python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "maturin"

[project]
name = "taskito"
version = "0.16.3"
version = "0.16.4"
description = "Rust-powered task queue for Python. No broker required."
requires-python = ">=3.10"
license = { file = "LICENSE" }
Expand Down
2 changes: 1 addition & 1 deletion sdks/python/taskito/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,4 @@

__version__ = _get_version("taskito")
except PackageNotFoundError:
__version__ = "0.16.3"
__version__ = "0.16.4"
Loading