Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Changelog

All notable changes to this project are documented in this file.

The format is based on Keep a Changelog, and this project will adhere to Semantic Versioning from its first stable release. Until 1.0, minor versions may contain breaking changes.

Unreleased

Added

  • Project setup with init --targets and a project-aware doctor --strict; browser targets automatically include their sibling TypeScript SDK.

  • Browser registration lifecycle controller for route and framework cleanup, cancellation of stale dynamic imports, and scoped loading.

  • Opt-in bounded streaming and binary WebMCP results; response byte limits and stream reader cancellation in the TypeScript runtime.

  • diff --migration upgrade actions, deprecation reporting and recorded runtime requirements. API surface snapshots use format 3 and read format 2.

  • A transport-neutral, versioned tool catalogue with JSON Schema, scoped groups and external emitter conformance helpers (schema tool-catalog).

  • Runtime tarball installation checks and gated npm trusted publishing for the TypeScript, MCP and WebMCP packages.

  • Built-in webmcp target: a browser ESM package with a shared tool manifest and an explicit registration helper backed by the generated TypeScript SDK and the new Apache-2.0 @elysra/tungsten-webmcp runtime. Registration defaults to read-only operations, supports scoped opt-in writes and macros, confirmation previews, cancellation and disposal. The runtime adapts the experimental document.modelContext API and the legacy navigator.modelContext shape; generated-package browser smoke passed in Chromium 154.0.8037.57 with WebMCPTesting enabled. Full cross-browser conformance remains a follow-up.

  • The language-neutral foundation of the coming Java, C#, Kotlin, Swift, PHP, Ruby and Dart SDKs in tungsten-emit (sdk): one SDK plan per API (types, operations, resource tree, macros), naming profiles for the seven languages in tungsten-ir, and the SDK descriptor document their runtimes read (tungsten schema sdk-descriptors). The repository guard knows the seven runtime directories. No target is added yet and existing output is unchanged.

  • Resumable event streams in the TypeScript, Python and Rust runtimes and the MCP server: a dropped stream reconnects with Last-Event-ID, honouring the server's retry under a cap (maxReconnects, default 3), without repeating delivered events; an idle timeout ends or reconnects a silent stream (STREAM_IDLE); on, collect, reduce, first and cancel helpers. tungsten mock continues a stream after Last-Event-ID and can drop or stall one for testing.

  • tungsten lsp: a Language Server Protocol server over stdio for tungsten.yml, agent.yml and overlay files. It reports the same diagnostics as tungsten check on the YAML lines they belong to, completes keys, values and operation ids, documents fields and operations on hover, jumps from an operation id to its place in the OpenAPI document and outlines the manifests. See the README for editor setup.

  • External emitters: a target of tungsten.yml with external: true (or a command) is generated by a separate tungsten-emit-<name> executable that speaks a small JSON protocol (the IR on standard input, files and diagnostics on standard output). The compiler writes the files, so generate --check, the output manifest and the API surface diff work unchanged. New: tungsten emitters, tungsten schema external-emitter, diagnostics TG0801 to TG0806 and the example examples/external-emitter-markdown.

  • Optional embedding index for the MCP server's search_tools, off by default and with no model shipped. targets.mcp.search.embeddings names a provider (a command speaking a small JSON protocol, or a plain http:// /embeddings endpoint); tungsten generate writes index.embeddings.bin and index.embeddings.json next to manifest.json, caching vectors by content hash. @elysra/tungsten-mcp ranks hybrid (BM25 and cosine, reciprocal rank fusion) when search.embeddings is set, and falls back to BM25 with the reason in the result when the query embedder fails. Diagnostics TG0570 to TG0574.

Changed

  • Rust runtime: StreamEvent has a new public field reconnects; code that builds or destructures StreamEvent with a struct literal must add it (or use ..).

  • Go SDKs through the external emitter interface: emitters/go builds tungsten-emit-go (enable it with go: { out: ..., external: true, module: ..., package: ... }), which generates a Go package with models, resources, a typed client, operation descriptors, pagination and stream helpers, macros and a README. The SDKs use the new Go runtime github.com/pboachie/tungsten/runtimes/go (standard library only, Go 1.22 or later), with the same error envelope, retries, idempotency, previews, confirmation tokens, auth handling and resumable event streams as the other runtimes.

0.1.0 - Unreleased

First release. The compiler, the three SDK runtimes (@elysra/tungsten-runtime, tungsten-runtime on PyPI and tungsten-runtime on crates.io), the MCP runtime (@elysra/tungsten-mcp) and the installers ship together at 0.1.0.

Added

  • Compiler: OpenAPI 3.0 and 3.1 frontend, tungsten.yml and agent.yml manifests, a versioned intermediate representation (tungsten ir dump, tungsten schema) and diagnostics with stable codes (tungsten check, tungsten explain).
  • Commands: init, check, generate (with --check for stale output), diff, report (text, JSON and a self-contained HTML report), doctor, ir dump, schema, explain and mock.
  • TypeScript SDK emitter and the @elysra/tungsten-runtime client runtime (Apache-2.0): Result values, Zod validation, the diagnostic error envelope, safety tiers, previews with confirmation tokens, idempotency keys, unknown-outcome reporting and retries.
  • Python SDK emitter (sync and async clients, strict Pydantic v2 models or plain dataclasses) and the tungsten-runtime Python package (Apache-2.0).
  • Rust SDK emitter (async client, a blocking client and typed macro outputs) and the tungsten-runtime crate (Apache-2.0).
  • Generated command-line interface for the Rust SDK, built on tungsten-cli-kit, with a stable output contract, exit codes, confirmation for destructive operations (--yes, --i-understand), configuration and pagination.
  • MCP server emitter and the @elysra/tungsten-mcp runtime: discrete or token-budgeted progressive tool surfaces, an automatic mode chosen from the tool count, stdio and Streamable HTTP transports, a sandboxed script tool and confirmation of destructive operations.
  • Streaming: server-sent events and JSON Lines responses in all three SDK runtimes (stream() and <method>_stream methods) and in the MCP server, which returns the collected events.
  • Pagination: opaque string cursors and after_id / has_more styles are inferred from the OpenAPI description.
  • Documentation emitter: llms.txt, llms-full.txt, tools.json and a README for each generated SDK.
  • tungsten mock: a mock server generated from the OpenAPI description, for trying a generated SDK, CLI or MCP server without a live API.
  • Behaviour that is identical across the TypeScript, Python and Rust runtimes, checked by a shared contract suite.
  • Release pipeline: prebuilt archives for Linux (x86_64, aarch64), macOS (x86_64, aarch64) and Windows (x86_64) with a checksum file, a CycloneDX SBOM and build provenance attestations, plus install.sh and install.ps1 installers that verify checksums.
  • OAuth2 authorization-code helpers in the TypeScript, Python and Rust runtimes: PKCE (S256), the authorization URL, the code exchange, refresh with a single flight and a pluggable token store. A call sends the stored token, refreshes it before it expires and once after a 401. Generated clients expose the helpers only when the specification declares an authorizationCode flow.
  • Repository guard and community files (contributing guide, security policy, code of conduct, issue forms and pull request template).

Changed

  • tungsten init writes a default targets block.
  • Documents that omit info.version, use query-style path keys, or leave out an API title now compile, with a warning where the result is inferred.
  • Types no operation reaches are pruned from the generated models.
  • Required constant headers and API-key environment variables are carried into the generated clients.
  • Error codes are found through tagged unions, and unknown-outcome messages describe what the caller should verify.
  • The compiler warns when a gates entry in agent.yml matches no operation.