CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
All notable changes to this project will be documented in this file.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [1.2.0] - 2026-08-26
### Added
- **Pipelines** — cron-scheduled, chained job runs with approval and clarify
(HITL) gates, an n8n-style canvas editor, and a definition/activation split:
definitions are personal- or org-scoped templates, activations are the
scheduling unit (N:M against projects). See `docs/concepts/pipelines.md` and
`docs/internals/46-pipeline-scheduling.md`.
- **Organizations (Phase 1)** — team creation, a 3-role ladder, invites, and
domain claims. Cloud identity (auth / org / admin UI) is promoted into the
OSS core, so a self-hosted deployment can run the cloud shape.
- **Universal runtime** — per-intent directories
(`intents/{id}/{infer.md,prompt.md,hooks.yaml}`) replacing injections, a
rendered intent catalog with a default intent for unpinned turns, a `clarify`
tool for blocking questions, org-owned agents (promote + ACL), persisted run
history, and oversized MCP results spooled to the artifacts sandbox.
- **`static-html` tech tier** — manifest-less static sites are first class
across the registry, decompose, verify, and the project wizard; preview and
deploy serve them, including non-`index.html` entry points.
- **Root `docker-compose.yml`** — the full stack (Redis, the four backend
processes, and an nginx gateway serving the UI same-origin at `:4200`) with
only Docker installed: `cp .env.example .env && docker compose up -d`. The
committed `docker/nginx.conf` is compose-only; the cloud deployment keeps
mounting its own config.
- **`pnpm doctor`** — read-only install self-check: Node/pnpm versions, install
state, Redis reachability, the four process health endpoints, a BullMQ
worker heuristic, and provider-key presence. `--live` additionally validates
keys against the provider; `--json` for machines.
- **`ANT_{DEEPSEEK,GLM,KIMI}_BASE_URL`** — endpoint overrides for the
OpenAI-compatible providers, so registered model ids can route through a
self-hosted gateway (LiteLLM / vLLM / OpenRouter). Unset means the previous
hardcoded endpoints, byte-identical behavior.
### Changed
- **`ANT_REDIS_URL` now defaults to `redis://localhost:16379` in local mode**
(SSOT: `core/config/redisUrl.ts`); cloud mode still fails fast when unset.
The root scripts dropped their `ANT_REDIS_URL=...` prefixes, so a value in
`packages/ant-cli/.env` now wins where the prefix used to shadow it.
- **`ANT_ENCRYPTION_KEY` documentation matches the code**: the key is
auto-generated and persisted on first boot; a manually set value must be
64 hex chars (`openssl rand -hex 32` — the previously documented `-base64`
variant was rejected at boot).
- **The visual-processor sidecar publishes host port 4104**; 4103 is reserved
for the ant-preview user-content origin, which must own it to boot.
- **User-attached files outrank the directory allowlist** when a RAC and the
artifact pool are resolved — an attachment is no longer dropped because of
where it lives.
- **`run_command`**: the allowlist matches the workflows actually supported,
and write-target extraction is quote-aware.
- **LLM temperature has one wire owner** (`wireTemperature`); it is omitted on
GLM/DeepSeek thinking rounds, which reject it.
- **`pnpm dev:all` / `start:all` no longer boot the marketing site**; run
`pnpm dev:site` separately. Added a root `pnpm test` entry point.
- **Installs are guarded**: `preinstall` rejects npm/yarn, and
`engine-strict` enforces Node >= 22.13 and pnpm >= 11 (pnpm 10 silently
ignored pnpm-11 workspace keys and skipped native postinstalls).
- README/install docs state the OS position (macOS/Linux; Windows via WSL2,
untested) and the local-model boundary (≈200K-context + native tool-calling
floor, with numbers).
### Fixed
- **NFC/NFD path tolerance** — tool path resolution accepts either Unicode
normalization form, and read-only text channels are NFC-normalized at the
prompt boundary.
- **`packages/ant-cli/Dockerfile` ripgrep sanity checks** were pinned to the
pre-1.18 layout (postinstall-downloaded `@vscode/ripgrep/bin/rg`); since the
1.18 bump the binary ships as a platform-specific optionalDependency, so
every image build failed. Checks now probe `@vscode/ripgrep-<platform>/bin/rg`.
- **`packages/ant-ui/Dockerfile` did not copy `@ant/shared` / `@ant/auth-client`**,
so the vite build could not resolve its workspace imports. (The cloud deploy
builds the UI on CI and syncs to S3, so only image builds were affected.)
- SSE admission is decided before `writeHead`, so the realtime stream survives
a Redis outage instead of hanging half-open.
- Idle local IDEs are reaped by the registry's `lastAccessedAt`, not a stale
in-memory stamp.
- The plan single-shot round is bounded by `PLAN_TOOL_LOOP` (code and design
jobs).
- Cloud test payment: deduped `react-i18next`, seeded the test level.
### Security
- Remediation of internal audits 3–9. Notably: per-tenant containment of file,
session, kanban, and artifact reads and of every enumeration/metadata sink;
origin checks on the IDE proxy and its WebSocket upgrade, with iframe
navigation admitted by a short-lived non-ambient ticket; fail-closed UID
isolation on every user-code spawn; method-aware JWT public-path exemptions;
pipeline activation path + org-membership validation; bounded multipart and
Bridge WebSocket admission; deploy ownership checked before rehydration; an
O(1) preview/deploy label index in place of per-request enumeration; and
session/JSONL bounds with a directive cap.
### Removed
- The HS256 JWT fallback — session auth is ES256-only.
- Dead code and config: `ANT_PREVIEW_WORKERS` (no readers) and the unused
`invokeStructured` LLM port method.
## [1.1.0] - 2026-08-12
### Added
- **Codespace / workspace project kinds.** A project is now either a
*codespace* (`projectType: 'canonical'` — the builtin feature-based jobs) or a
*workspace* (`projectType: 'universal'` — custom agents only), chosen at
creation and fixed thereafter. Absent means codespace, so existing projects
need no migration. The kind is pure policy: it decides which jobs a project
exposes and never the on-disk layout. Documented in
`docs/concepts/spaces.md` (renamed from `docs/concepts/workspace.md`, which
described only the codespace layout while the word had grown a second
meaning).
- **Custom agents and jobs on the `universal` runtime** — *experimental*.
Define an agent (a role) and its jobs (its duties) as files
(`agent.yaml` / `job.yaml` / `base/*.md` / `injections/*.md` /
`intents.yaml`) and run them without a code change or a new job type;
definitions are account-owned and read fresh at every job start. Includes a
two-root tool sandbox, an MCP overlay for capability, per-turn `@intent:` and
`@plan` axes, a fail-closed approval gate, and an agent-authored checklist
board in place of the task kanban. A read-only `assistant` agent ships as the
worked example. See `docs/concepts/custom-agents.md` and
`docs/guides/custom-agent-authoring.md`.
- **Encrypted MCP credential store.** A definition's `env` / `headers` value is
either a literal or a `${secret:KEY}` reference resolved from a per-user
AES-256-GCM store (`/api/account/mcp-credentials`, values write-only).
Resolution never consults `process.env`, and a stdio MCP child receives only
its declared variables plus a minimal exec baseline — so a definition cannot
name and exfiltrate the host's secrets.
- **`examples/` — the custom-agent + MCP example, runnable from the repo root.**
A fixture-only ops incident/SLA MCP server (`examples/mcp-reference-server/`)
and the agent definitions that consume it (`examples/custom-agents/ops-team/`)
ship as workspace members that no image copies. Root scripts drive them —
`build:example:mcp`, `dev:example:mcp`, `start:example:mcp`,
`start:example:mcp:stdio`, `test:example:mcp` — and the server no longer
requires a `.env` to start, so an inline `MCP_AUTH_TOKEN` is enough. The
walkthrough lives in `docs/guides/custom-agent-authoring.md`.
## [1.0.0] - 2026-08-03
### Added
- Initial OSS release scaffolding: `LICENSE` (Apache-2.0), `SECURITY.md`,
`CONTRIBUTING.md`, `AGENTS.md`, `.github/` issue and PR templates.
- `CODE_OF_CONDUCT.md` (Contributor Covenant 2.1).
- `THIRD_PARTY_NOTICES.md` — attribution for the LGPL-3.0 libvips binaries
bundled by `sharp`, the SIL OFL 1.1 fonts self-hosted in the marketing site
build, and MPL-2.0 transitive dependencies.
- Inbound contribution licensing stated explicitly in `CONTRIBUTING.md`
(Apache-2.0 §5 — no CLA, no DCO sign-off).
- `.github/dependabot.yml` — grouped weekly npm and GitHub Actions updates.
- `README.md` / `README.ko.md`: a `Maturity` section giving per-feature status
(stable / beta / experimental / incomplete), and commented image slots with a
capture guide in `docs/assets/README.md`.
### Changed
- Documentation reorganized into a four-tier layout under `docs/`:
`getting-started/`, `concepts/`, `guides/`, `reference/`, and a
contributor-only `internals/` section.
- Corrected documentation that claimed `pnpm build` runs the test suite as a
prebuild gate. No such hook exists — CI is the only gate. This affected
`CONTRIBUTING.md`, the PR template, and six documents.
- Corrected the install docs' Node/pnpm requirements (Node >= 22.13,
pnpm 11.1.0) and replaced `<org>` placeholder clone URLs.
- Workspace packages are marked `private` and carry `repository` / `bugs` /
`homepage` metadata; the root version now reads `1.0.0`.
- `README.md` / `README.ko.md`: `Contributing` rewritten to state that the
project is solo-developed and to name the areas where outside help lands
best. `README.ko.md` gained the `Stack` and `Contributing` sections it was
missing.
### Removed
- Internal-only documentation (`docs/tmp/`, infra migration requests, internal
workspace fixtures) before the public release.
- The point-in-time OSS release audit under `docs/internals/`. Security sweeps
enumerate findings, including unremediated ones, and are tracked privately;
`docs/internals/security-posture.md` remains as the durable standard.
- Dead references to a Discord server that does not exist; GitHub Discussions
is the one community channel.
- `.github/CODEOWNERS`, which routed every path to a team that was never
created. An owner entry that resolves to nobody advertises review coverage
that does not exist; it can come back when there is a real team to name.
[Unreleased]: ../../compare/v1.2.0...HEAD
[1.2.0]: ../../compare/v1.1.0...v1.2.0
[1.1.0]: ../../releases/tag/v1.1.0