diff --git a/CHANGELOG.md b/CHANGELOG.md index e0730b4..0da41ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,64 @@ All notable changes to this package are documented here. +## 0.20.0 — 2026-08-26 + +This release removes the two side languages that had grown around the seven +tools: direct-call field projection and live reads from program-rendered HTML. +Agents now shape data in JavaScript, page a genuinely large direct result with +`get_result`, and render a display-only view. Configuration becomes strict at +the same boundary, so a typo fails at startup instead of surviving as inert +deployment state. Existing deployments using current documented options need +only bump the pin and reconcile generation B; callers that send `fields`, +programs that bind UI reads, and JavaScript deployments carrying retired or +misspelled options must migrate. The implementation stack deletes 2,866 lines +and adds 1,063 before these release notes, while preserving exactly seven MCP +tools and the Node and Worker deployment shapes. + +### Changed + +- **One data-shaping language.** `call_tool` and `call_destructive_tool` no + longer advertise or accept `fields`; the path resolver, schema walker, + projection recovery records, guidance, and tests are gone. `execute_code` + remains the projection surface, while `get_result` still pages oversized + direct reads byte-exactly. The 21-scenario current-version audit passes, fixed + tool definitions fall from 1,625 to 1,587 tokens, and a deterministic + 52,396-byte document succeeds 3/3 through `call_tool` then `get_result` + (#482). +- **Display-only program UI.** `connecta.ui(html)` keeps success-only Apps + delivery, sandboxing, one shared rich-output budget, executor parity, and the + compact mirrored return. Its read manifest, host-call bridge, and second + argument are removed. All seven tools explicitly remain model-only, and only + `execute_code` advertises the cache-busted v3 display resource, so neither a + current nor cached shell can call Connecta tools (#484). +- **Strict configuration.** `createConnecta` rejects unknown own options at + every closed configuration path without reading or quoting their values. + Each closed schema is compile-time exhaustive against its public type; + connector, auth, storage, activity-store, logger, deployment-metadata, and + executor implementations remain open leaves (#485). +- **Smaller package and tests.** Generated operator assets publish explicit + 95-byte string declarations instead of embedding about 95 KB of literals, + with byte-identical runtime output and a packed-package size guard (#486). + The remaining copied UI credential and meta-tool fixtures are shared without + changing any test or assertion count, removing another 127 repository lines + (#479). + +### Removed + +- The direct-call `fields` projection option and its dot/array path language. +- Program UI read bindings, `connecta.read`, and the Apps-to-host tool-call + bridge. + +### Declined with evidence + +- Discovery filtering did not ship: its sealed qualification retained complete + scenario coverage but missed top-1, recall, default-page recall, and negative + false-positive gates. The holdout cases were not inspected or tuned (#481). +- Lean object-result text did not ship: Codex and Claude read ordinary + structured values, but Claude's error route took extra recovery actions and + Cursor was unavailable for the required matrix. The compatibility JSON copy + remains (#483). + ## 0.19.0 — 2026-08-25 This release is a smaller, simpler package with no behavioral change for a diff --git a/documentation/upgrading.md b/documentation/upgrading.md index 3db61a5..a485d5e 100644 --- a/documentation/upgrading.md +++ b/documentation/upgrading.md @@ -57,7 +57,7 @@ exist so far: | --- | --- | --- | | **pre-template** | before 0.10.2 | no `connecta init` existed; hand-written, or copied from the retired `examples/node` | | **A** | 0.10.2 – 0.15.1 | `.env.example`, `.gitignore`, `AGENTS.md`, `CLAUDE.md`, `README.md`, `package.json`, `src/index.ts`, `tsconfig.json` | -| **B** | 0.16.0 – 0.19.0 | adds `.dockerignore`, `Dockerfile`, `docker-compose.yml`, and `src/file-activity.ts`; `src/index.ts` grows the four commented operator blocks; `.env.example` ships `CONNECTA_TOKEN=` empty | +| **B** | 0.16.0 – 0.20.0 | adds `.dockerignore`, `Dockerfile`, `docker-compose.yml`, and `src/file-activity.ts`; `src/index.ts` grows the four commented operator blocks; `.env.example` ships `CONNECTA_TOKEN=` empty | Generation A is a decade in template years and identifying it precisely does not matter, because you are about to reconstruct it exactly rather than guess @@ -106,7 +106,7 @@ know what to preserve, once to know what to re-verify at the end. ### Bump the pin and install ```sh -npm pkg set dependencies.@zackbart/connecta=0.19.0 +npm pkg set dependencies.@zackbart/connecta=0.20.0 npm install ``` @@ -130,7 +130,7 @@ Generate the *current* template beside the base you already made, into the same `$SCRATCH`: ```sh -(cd "$SCRATCH" && npx @zackbart/connecta@0.19.0 init current) +(cd "$SCRATCH" && npx @zackbart/connecta@0.20.0 init current) ``` You now have a three-way merge with a real base: `$SCRATCH/base` is what this @@ -186,7 +186,7 @@ A deployment older than 0.10.2 has no base to diff against. Do not try to manufacture one. Instead: 1. `SCRATCH=$(mktemp -d)`, then - `(cd "$SCRATCH" && npx @zackbart/connecta@0.19.0 init current)` — there is no + `(cd "$SCRATCH" && npx @zackbart/connecta@0.20.0 init current)` — there is no `base` leg here, only the current template to read from. 2. Copy `$SCRATCH/current` into the deployment file by file, **skipping `src/index.ts`**. @@ -207,6 +207,30 @@ first, so cross them bottom-up: start at the oldest one still above this deployment's pin and work back up the page, because each boundary assumes the older ones are already done. +### 0.19.0 → 0.20.0 + +Three intake paths become deliberately strict. None changes storage, the two +deployment shapes, or the exact seven-tool MCP surface. + +- `createConnecta` now rejects every unknown own configuration property by its + complete path. Remove typos and options retired before 0.19, including the + top-level `toolkits`, `credentialHealth`, `surface`, and `maxResultBytes`, + plus `credentials.health` and `calls.maxBatchResultBytes`. Connector, auth, + storage, activity-store, logger, deployment-metadata, and executor + implementations remain open objects; their implementation-specific fields + are not configuration typos. +- `call_tool` and `call_destructive_tool` no longer accept `fields`. Put + projection in one `execute_code` program. For a legitimate oversized direct + read, call without `fields` and follow the returned `get_result` action; that + paging path remains part of the seven-tool surface. +- `connecta.ui` accepts one HTML string and is display-only. Remove its second + read-binding argument and any page calls to `connecta.read`. Fetch and shape + data in the program before rendering, then return the same compact summary + the view initially displays. Views cannot call any Connecta tool. + +The Node template layout remains generation B. Reconcile it as usual after the +version bump; no new deployment file or environment variable is required. + ### 0.18.3 → 0.19.0 Nothing changes for a deployment. Bump the version and reconcile the template diff --git a/package-lock.json b/package-lock.json index 3da4d4c..a1d8269 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@zackbart/connecta", - "version": "0.19.0", + "version": "0.20.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@zackbart/connecta", - "version": "0.19.0", + "version": "0.20.0", "license": "MIT", "dependencies": { "@cfworker/json-schema": "^4.1.1", diff --git a/package.json b/package.json index cacbd6e..24853ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@zackbart/connecta", - "version": "0.19.0", + "version": "0.20.0", "type": "module", "sideEffects": false, "description": "One MCP to rule them all — a single MCP endpoint aggregating many downstream connectors behind a code-first surface of seven meta-tools.", diff --git a/scripts/check-package.mjs b/scripts/check-package.mjs index f492e4a..f664209 100644 --- a/scripts/check-package.mjs +++ b/scripts/check-package.mjs @@ -624,7 +624,7 @@ try { generatedTsx, ["src/removed-surface.ts"], generatedRoot, - "ConnectaConfig.surface was removed in issue #273", + "ConnectaConfig.surface", { CONNECTA_TOKEN: "package-smoke-token" }, ); diff --git a/src/version.ts b/src/version.ts index f53c4ae..ba0d1d0 100644 --- a/src/version.ts +++ b/src/version.ts @@ -4,4 +4,4 @@ * a bump that forgets this file fails the build rather than shipping a stale * version to `/health` and to downstream MCP handshakes. */ -export const CONNECTA_VERSION = "0.19.0"; +export const CONNECTA_VERSION = "0.20.0"; diff --git a/templates/node/package.json b/templates/node/package.json index 455ecbc..2151a71 100644 --- a/templates/node/package.json +++ b/templates/node/package.json @@ -15,7 +15,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@zackbart/connecta": "0.19.0", + "@zackbart/connecta": "0.20.0", "quickjs-emscripten": "0.32.0" }, "devDependencies": { diff --git a/test/upgrade-guide.test.ts b/test/upgrade-guide.test.ts index d65358f..b1bea80 100644 --- a/test/upgrade-guide.test.ts +++ b/test/upgrade-guide.test.ts @@ -148,7 +148,7 @@ describe("the upgrade guide", () => { it("opens the boundary list with this release", () => { const { version } = JSON.parse(read("package.json")) as { version: string }; const first = guide.match(/^### (\d+\.\d+\.\d+) → (\d+\.\d+\.\d+)$/m); - expect(first?.slice(1)).toEqual(["0.18.3", version]); + expect(first?.slice(1)).toEqual(["0.19.0", version]); expect(guide).toContain(`| **B** | 0.16.0 – ${version} |`); });