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 --targetsand a project-awaredoctor --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 --migrationupgrade 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
webmcptarget: 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-webmcpruntime. Registration defaults to read-only operations, supports scoped opt-in writes and macros, confirmation previews, cancellation and disposal. The runtime adapts the experimentaldocument.modelContextAPI and the legacynavigator.modelContextshape; generated-package browser smoke passed in Chromium 154.0.8037.57 withWebMCPTestingenabled. 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 intungsten-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'sretryunder a cap (maxReconnects, default 3), without repeating delivered events; an idle timeout ends or reconnects a silent stream (STREAM_IDLE);on,collect,reduce,firstandcancelhelpers.tungsten mockcontinues a stream afterLast-Event-IDand can drop or stall one for testing. -
tungsten lsp: a Language Server Protocol server over stdio fortungsten.yml,agent.ymland overlay files. It reports the same diagnostics astungsten checkon 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.ymlwithexternal: true(or a command) is generated by a separatetungsten-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, sogenerate --check, the output manifest and the API surface diff work unchanged. New:tungsten emitters,tungsten schema external-emitter, diagnostics TG0801 to TG0806 and the exampleexamples/external-emitter-markdown. -
Optional embedding index for the MCP server's
search_tools, off by default and with no model shipped.targets.mcp.search.embeddingsnames a provider (a command speaking a small JSON protocol, or a plainhttp:///embeddingsendpoint);tungsten generatewritesindex.embeddings.binandindex.embeddings.jsonnext tomanifest.json, caching vectors by content hash.@elysra/tungsten-mcpranks hybrid (BM25 and cosine, reciprocal rank fusion) whensearch.embeddingsis set, and falls back to BM25 with the reason in the result when the query embedder fails. Diagnostics TG0570 to TG0574.
Changed
-
Rust runtime:
StreamEventhas a new public fieldreconnects; code that builds or destructuresStreamEventwith a struct literal must add it (or use..). -
Go SDKs through the external emitter interface:
emitters/gobuildstungsten-emit-go(enable it withgo: { 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 runtimegithub.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.ymlandagent.ymlmanifests, a versioned intermediate representation (tungsten ir dump,tungsten schema) and diagnostics with stable codes (tungsten check,tungsten explain). - Commands:
init,check,generate(with--checkfor stale output),diff,report(text, JSON and a self-contained HTML report),doctor,ir dump,schema,explainandmock. - TypeScript SDK emitter and the
@elysra/tungsten-runtimeclient runtime (Apache-2.0):Resultvalues, 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-runtimePython package (Apache-2.0). - Rust SDK emitter (async client, a blocking client and typed macro outputs)
and the
tungsten-runtimecrate (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-mcpruntime: 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>_streammethods) and in the MCP server, which returns the collected events. - Pagination: opaque string cursors and
after_id/has_morestyles are inferred from the OpenAPI description. - Documentation emitter:
llms.txt,llms-full.txt,tools.jsonand 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.shandinstall.ps1installers 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
authorizationCodeflow. - Repository guard and community files (contributing guide, security policy, code of conduct, issue forms and pull request template).
Changed
tungsten initwrites a defaulttargetsblock.- 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
gatesentry inagent.ymlmatches no operation.