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
58 changes: 58 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
32 changes: 28 additions & 4 deletions documentation/upgrading.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
```

Expand All @@ -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
Expand Down Expand Up @@ -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`**.
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

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

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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.",
Expand Down
2 changes: 1 addition & 1 deletion scripts/check-package.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
);

Expand Down
2 changes: 1 addition & 1 deletion src/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
2 changes: 1 addition & 1 deletion templates/node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@zackbart/connecta": "0.19.0",
"@zackbart/connecta": "0.20.0",
"quickjs-emscripten": "0.32.0"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion test/upgrade-guide.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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} |`);
});

Expand Down