Gluesync release notes and changes

Welcome to the Gluesync release notes. This page provides detailed information about each release, including new features, improvements, and fixes.

πŸ“¬ Stay in the Loop!

Looking forward to keep you updated on Gluesync releases? Subscribe to Gluesync Updates to receive our latest news and updates, including new features, improvements, and fixes right into your inbox. We promise to keep it short and not spammy.

Latest Release: 2.3.0

Status: Preview β€” releasing soon

Gluesync 2.3.0: bring your own brain, pick your own write rules, and let the target fill in its own blanks

Release highlights

Dear data wranglers,

Last time we taught your CDC readers to remember where they were and your Grafana dashboard to stop lying about lag. This time we went after the last place Gluesync was still deciding things on your behalf: the quiet ones. AI now runs on models you own, with your keys and your permissions β€” and every spot in the write path that used to guess for you is now a choice you get to make.

We’ve been busy. Here’s what’s new:

AI Studio β€” build it, route it, run it, govern it

Everybody is shipping an AI assistant this year. Most of them would like you to send your schema to their cloud and trust the invoice. We went the other way.

AI Studio is a workspace inside the Control Plane where you register your own LLM providers, chat with governed Spark agents, and operate a durable agent platform:

  • Bring OpenAI, an OpenAI-compatible endpoint, Anthropic, Azure OpenAI, or a local Ollama box that never leaves your network

  • Provider credentials live in an encrypted vault that only super admins administer β€” with optional token prices, so managers can watch estimated spend before finance does

  • Agents run with the signed-in user’s permissions, so nobody gets an AI-shaped way around your RBAC

  • Per-agent tool allow-lists: an agent can reach exactly what you handed it, and nothing else

  • Publish immutable skills and versioned TEXT agents, then start asynchronous runs with duplicate protection, redacted outcomes, and a durable SSE timeline

  • Route against a canonical model catalog by capability, context, residency, health, price, and weighted quality β€” and preview every inclusion or exclusion before a request runs

  • Govern automation with owner/API-key budgets, scoped one-time gsa_ secrets, rate limits, usage accounting, and an audit trail

  • Integrate through the native /api/ai/v1 contract or the OpenAI-compatible /v1/models and /v1/chat/completions endpoints

  • Managers can publish skills and agent versions β€” super admin is no longer the only role that can freeze a snapshot

Settings β†’ AI agents (MCP) is still there for external MCP clients. AI Studio is for the ones that live inside the product.

Your model, your key, your rules. We just gave it a control room. See AI Studio and AI agent platform.

Query Studio AI helper β€” it read the schema so you don’t have to

You know the ritual: open Query Studio, stare at a table you have never seen before, then go hunting for whichever column holds the customer id this time.

Query Studio now has a chat that already knows your schema, and Tab autocomplete that finishes the statement you started. The autocomplete is suffix-only ghost text β€” it proposes what comes next and never quietly rewrites what you already typed.

Both run on the same bring-your-own vault as AI Studio: same providers, same keys, same permissions. Nothing wanders off to a vendor you did not pick.

PII discovery β€” labels everywhere, values only when you mean it

Query Studio used to be the fastest way to dump a production table into a CSV β€” including the email and card-number columns you forgot were there. The AI helper made that worse: a helpful SELECT * could put those cells in a model prompt.

2.3 classifies columns that look like PII (name first, sample scan when you ask), paints a tag on them in Query Studio and the Fields Editor, and masks the cells in the grid, copies, and exports. The classifier is global rather than English-only: multilingual aliases cover names, addresses, postal codes, tax ids, bank accounts, licences, and secrets, while checksum rules validate identifiers such as CPF, Aadhaar, Chinese resident ID, South African ID, TCKN, NIF/NIE, NIR, and TFN. Managers and super admins can reveal values for one session. Super admins can turn platform-wide Query Studio masking off under Settings β†’ Global settings (it stays on unless they do). AI Studio and MCP execute_sql stay masked either way. Prefer classify_table over fishing with SQL.

AI as SQL β€” ask a question, get a result set

Your BI tool speaks SQL. Your AI stack speaks HTTP. gluesync.ai is the adapter nobody wanted to write.

The Hub owns a virtual catalog that Query Forge serves like any other table, so anything already holding a JDBC connection β€” DataGrip, DBeaver, Tableau, that reporting job from 2019 β€” can run SELECT … FROM gluesync.ai WHERE question = … and get rows back.

Behind it sit your AI providers and the read-only MCP tools. Read-only, so the worst a question can do is cost you tokens.

Insert conflict strategy β€” UPSERT, SKIP, or FAIL. You pick.

Until now, an insert that landed on a row already sitting in the target had exactly one answer: try an upsert and hope. Sometimes that is precisely right. Sometimes it quietly overwrites a row somebody cared about, and you find out weeks later.

Now it is a per-entity setting:

  • UPSERT β€” today’s default behaviour, unchanged

  • SKIP β€” keep the target row you already have and move on

  • FAIL β€” say "duplicate" out loud and stop

Failures that are not duplicates still surface exactly as before. Targets where a duplicate key cannot arise hide the setting or caveat it, rather than handing you a switch that does nothing.

Same write path. Far fewer surprises in it.

Scalar function call β€” let the target database fill in the blank

Some values only exist on the target: a business date that comes out of a package function, a sequence helper, that one piece of logic your DBA will never let you reimplement anywhere else. The workaround used to be a second UPDATE pass, or a source-side change nobody wanted to make.

A new field function writes a target-side scalar function straight into the statement, in place of the bind placeholder β€” Oracle pkg.f_…, and the same shape on the other RDBMS writers that opted in. The engine that owns the value computes the value.

One pass, no round trip, and no arguing with the DBA.

Field functions and UDFs, together at last

It used to be either/or: an entity could carry a mapping UDF or field functions, never both. Which meant one little date conversion was enough to send you back into your Java to reimplement something that already existed as a dropdown.

That gate is gone. The UDF reshapes the row first, then field functions run on its output. Cast mismatches surface at write time instead of being blocked upfront, so the combinations we cannot prove in advance are yours to try.

Heavy lifting in code. One-liners in a dropdown. As it should have been.

UDFs that finally understand arrays and maps

An entity with a single array column used to brick the UDF editor: the mockup generator threw on ARRAY (and the same for maps), the input table stayed empty, and there was no way to write the function at all.

Core Hub now mocks array and map columns β€” inferring an element type from the source’s native name when Gluesync does not carry one β€” and the test run speaks the same Array shape agents use in production. Write it once; run it for real.

Clear Logs β€” a clean baseline before you hit reproduce

Chasing an intermittent bug through a log file carrying three weeks of unrelated history is nobody’s idea of a good afternoon.

Support β€” and you β€” can now empty Core Hub’s own log files and their rolled archives without stopping the process: POST /global-config/support/clear-logs, with an optional sweep of support archives sitting in the logs directory. Agent and Conductor logs stay out of scope; we only truncate what Core Hub owns.

Clear, reproduce, collect. The bundle you send us is finally all signal.

Streaming before-image β€” the old values finally show up

If you consume Gluesync off Kafka, you will have noticed that before arrived empty even when the source knew perfectly well what the old values were. Building an audit trail or a diff out of that required a certain amount of creativity.

Flip includeBeforeImage on the target config and updates carry the prior column values in before; deletes carry the pre-delete image when that is all the source sent. Leave it off and your payloads stay byte-identical to today.

Google Pub/Sub also picks up the shared transaction id that Kafka and Solace already carried, so a consumer reading from more than one broker finds it under the same key everywhere.

IBM i: two entities, one table, no more borrowed metadata

When two entities read the same IBM i physical file, their column attributes shared a per-table map β€” and quietly overwrote each other. One entity could end up decoding rows using a colleague entity’s idea of the same column.

File descriptions now stay keyed by the physical file, and each entity keeps its own column types, precision, and CCSID at decode time.

Two entities, one table, two correct answers.

Smart alerts v2 β€” it now knows the difference between quiet and broken

An entity that sees one change a week is not in trouble. A naive quiet floor has no way of knowing that, so it paged you anyway.

v2 learns each entity’s actual cadence before calling anything inactive: sparse entities stay quiet without inventing incidents, heartbeat liveness stays an independent signal, and the overlapping target-side stall alert is off. Baselines and open incidents survive a Core Hub restart, so bouncing the Hub no longer throws away everything it learned.

Prefer the old behaviour? algorithmVersion: 1 keeps the legacy path. See Smart alerts.

MCP catalog at 112 β€” Chronos, Core Hub webhooks, email, and PII classify

Sixty-three tools was already enough to stand up a pipeline from scratch. Then Chronos asked for a seat, entity authoring wanted mappings, field functions, and UDFs on the same path, and Spark needed a way to report through the same webhook and email channels operators already configure.

The embedded MCP catalog is now 112 built-in tools. Twenty-one of them manage Chronos schedules and webhook / platform-event trigger flows through the connected module’s advertised address (your PAT, Chronos’s own RBAC). Another seventeen cover Core Hub webhook and SMTP email configuration, tests, delivery logs, and custom INFO / WARNING / CRITICAL sends. classify_table and classify_schema return PII labels only β€” never raw cells β€” so an agent can hunt for sensitive columns without SELECT *. create_entity is the short path for ordinary table-to-table work; update_pipeline closes a gap the earlier set left open; search_documentation keeps the agent from inventing docs that are not there.

Same server, same bearer token, a lot more of the product within reach. See PII discovery and masking.

AI Studio remembers the chat β€” and can explain the alert

A helpful answer that vanishes when you close the tab is only half useful. AI Studio now keeps searchable conversations with retention you control, so yesterday’s debugging thread is still there when finance asks what changed.

When a notification lands, you can also ask AI Studio to explain it. The helper gets a read-only tool set scoped to that alert’s pipeline, agent, and entity β€” no write path disguised as a summary.

Confirmed pipeline writes β€” the model proposes, you press go

The pipeline AI helper used to be read-only for every role. That kept things safe, and also kept managers copying suggestions into the UI by hand.

MANAGER and SUPER_ADMIN can now reach the mutation tools. Nothing executes on the first call: the Hub holds a pending action bound to the owner, conversation, and source pipeline, and only an explicit confirmation within five minutes runs the stored name and arguments. Cancel, expire, replay, or identity mismatch all fail closed. Connection credentials stay redacted from responses, traces, and the conversation that led there.

The model can draft the change. You still own the click.

LLM providers β€” park them without deleting the keys

Sometimes you need a provider gone for a week (spend freeze, outage, model swap) without wiping the vault entry and retyping secrets later.

Super admins can now flip a provider off. Credentials stay encrypted in place; chat and helpers reject that provider until you turn it back on.

Same vault. An on/off switch instead of a delete-and-rebuild.

Chronos can run the agent you already published

AI Studio can freeze an agent version. Something still has to fire it when the rest of the workflow says so.

Chronos can call ai_agent_run against that published version. Prompt templates fill the run, a payload allow-list decides which fields may go in, and loop guards stop a chain from spinning the model forever.

Same scheduler. Versioned agent. Guardrails on the payload.

Custom Field Functions β€” write once, bind everywhere

A UDF belongs to one entity. Built-in field functions are a fixed catalog. The gap in the middle β€” the same multi-column Java rule reused across a pipeline β€” meant copy-paste or a heavier UDF than the job needed.

Custom Field Functions are pipeline-level reusable Java functions: publish and install the collection, bind a target column in the Fields Editor (several source columns or fixed values as arguments), share the same function with other entities and UDFs, and try it in the test panel before it touches replicated data.

OIDC logout that also ends the IdP session

Logout used to clear the Gluesync session and leave the Okta / Auth0 / Keycloak session alone. The next "Sign in with SSO" click bounced straight back in.

Core Hub now discovers end_session_endpoint, returns an idpLogoutUrl after local logout, and the UI navigates there (RP-initiated logout). There is no Signout URL field to configure β€” discovery only β€” and post_logout_redirect_uri is always \{CoreHub origin}/ui/v2/login, which the customer must allowlist on the IdP. Local-realm logout still returns a null IdP URL. See Logout flow.

Target column name case β€” the engine folds, Gluesync follows

Some targets quote identifiers, so mixed-case column names work. Others emit unquoted DDL/DML and let the engine fold the name β€” Snowflake, GridGain, and Db2 for i to upper; Cassandra, ScyllaDB, Informix, and CockroachDB to lower β€” and Gluesync used to let you type a case the target would quietly rewrite.

Those nodes now report a single accepted case. Core Hub normalizes target columns and filter clauses on save, CREATE TABLE follows the node’s case, and the Compose UI forces it as you type. Connectors that quote identifiers still report BOTH. Existing configs stay until the next entity save.

Query Studio data access β€” who sees which tables, on which connection

Role alone was a blunt instrument: every Manager with Query Studio could reach every wired connection the Hub knew. Super admins can now set a per-user, per-connection matrix β€” OPEN or RESTRICTED β€” with schema and table ALLOW/DENY rules (deny wins), plus optional PII unmask grants down to a column. The same guard covers Query Studio, AI SQL, and MCP/Spark SQL, without inventing new UserRoles.

Ask Spark reads support knowledge when it explains an alert

Notification explanations already had documentation search. They now also call search_support_knowledge β€” the same anonymized ticket search MCP clients already use β€” so Spark can ground an answer in past support patterns. If support search is empty or unavailable, that is not an error: the explanation continues.

AI platform gateway β€” fallback, cache, capabilities ledger

The OpenAI-compatible surface grows past chat completions: streamed completions, the Responses API format, embeddings, automatic model fallback with circuit breaking, exact response caching (per owner, API key, and model), and redaction-aware Prometheus/OTLP telemetry. Call GET /api/ai/v1/capabilities to see what that node actually runs β€” the ledger lists only executable capabilities.

IBM i β€” stop filling the disk for entities you already stopped

An IBM i journal reader is shared across every entity on that journal. Stopping an entity in Core Hub used to leave it on the fan-out: changes still landed in its arena file, nobody consumed them, and the only ceiling was retention β€” the pattern behind installations that filled hundreds of gigabytes.

Turn on suspendCaptureForInactiveEntities (unset means off, so upgrades change nothing until you opt in). After inactiveEntityCaptureSuspensionDelayMinutes (default 30) with the entity neither syncing nor snapshotting, Gluesync suspends it: the table leaves the journal read when no sibling still needs it, the entity leaves the cache fan-out, and its cache is deleted. Start it again and it catches up straight from the journal to the shared reader’s rejoin point, then rejoins the cache. If the journal can no longer reach its last confirmed position, suspension is refused. Opting in moves recovery from source-change retention to journal-receiver retention β€” IBM i only, and deliberate.

Additional improvements

  • Core Hub:

    • AI Studio + BYO LLM provider vault;

    • Query Studio AI helper chat + Tab autocomplete;

    • PII discovery, labels, Query Studio / MCP result masking, and SUPER_ADMIN platform-wide masking toggle (on by default);

    • AI as SQL virtual catalog gluesync.ai;

    • Insert conflict strategy (UPSERT / SKIP / FAIL) with per-connector support signalling;

    • Scalar function call field function on RDBMS targets that declare the capability;

    • Field functions may run together with a mapping UDF;

    • Mapping UDFs work on entities with array or map columns (editor mockup + production-shaped test run);

    • Custom Field Functions β€” pipeline-level reusable Java functions (publish/install, bind in Fields Editor, shared across entities/UDFs);

    • OIDC RP-initiated logout via discovery end_session_endpoint (local logout first, then IdP idpLogoutUrl; no Signout URL field; allowlist {CoreHub origin}/ui/v2/login);

    • Clear Logs support action β€” truncate Core Hub logs (and optionally support archives) without a restart;

    • Streaming targets (Kafka / Solace / Pub/Sub): optional includeBeforeImage; Pub/Sub payload carries transaction like the other brokers;

    • AS400: column metadata keyed by what it belongs to so multi-entity same-table setups decode with each entity’s attributes;

    • Smart alerts v2 β€” confidence-gated source inactivity (sparse suppression, independent heartbeat; algorithmVersion: 1 keeps legacy);

    • MCP catalog grows to 112 built-in tools (Chronos schedules/triggers, Core Hub webhooks and email notifications, richer create_entity, update_pipeline, documentation search, PII classify_table / classify_schema);

    • AI Studio searchable conversations with retention, plus read-only notification explanations;

    • Confirmed pipeline writes from AI Studio for MANAGER / SUPER_ADMIN (pending action + explicit confirm; credentials redacted);

    • AI Studio: enable or disable a vaulted LLM provider without deleting credentials (disabled providers fail closed at chat time);

    • MANAGER can publish AI Studio skills and agent versions (not only SUPER_ADMIN);

    • Chronos can invoke published agents via ai_agent_run (prompt templates, payload allow-lists, loop guards);

    • Target column name case β€” nodes declare UPPERCASE / LOWERCASE / BOTH; Hub normalizes on save, CREATE TABLE and UI follow;

    • CDC retention purge also covers stopped entities (GSSD-1330) on Sybase, SAP HANA, Oracle triggers legacy, and Db2 LUW CDC/triggers;

    • Query Studio connection-scoped data access β€” per-user/per-connection OPEN/RESTRICTED ACL (deny wins) plus PII unmask grants; enforced on Query Studio, AI SQL, and MCP/Spark;

    • Ask Spark notification explanations also call search_support_knowledge (empty/unavailable results are non-fatal);

    • AI platform gateway β€” streamed chat, Responses API, embeddings, model fallback + circuit break, exact cache, redaction-aware telemetry; GET /api/ai/v1/capabilities;