diff --git a/integration-proxy/CHANGELOG.md b/integration-proxy/CHANGELOG.md index 727c5c4b..eed8688c 100644 --- a/integration-proxy/CHANGELOG.md +++ b/integration-proxy/CHANGELOG.md @@ -3,7 +3,7 @@ Releases of the `atomic-integration-proxy` crate. Earlier releases are described in the README ("Deploying 0.2", and the "0.2.1 and later" notes). -## Unreleased: SyncD / IAP management +## 0.4.2 (2026-11-09) - Explicit device permissions for selected-connection delegation/disconnection, account-wide owner session management, and selected-connection notification diff --git a/integration-proxy/Cargo.lock b/integration-proxy/Cargo.lock index 7ed7558d..1805f5c5 100644 --- a/integration-proxy/Cargo.lock +++ b/integration-proxy/Cargo.lock @@ -59,7 +59,7 @@ dependencies = [ [[package]] name = "atomic-integration-proxy" -version = "0.4.1" +version = "0.4.2" dependencies = [ "axum", "axum-extra", diff --git a/integration-proxy/Cargo.toml b/integration-proxy/Cargo.toml index 352336ba..0e40661b 100644 --- a/integration-proxy/Cargo.toml +++ b/integration-proxy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "atomic-integration-proxy" -version = "0.4.1" +version = "0.4.2" edition = "2021" description = "OAuth/catalog integration proxy (pinned OpenAPI catalog, connections owned by Atomic agents, Atomic v2 request signatures, delegations and frame capabilities) used by Atomic Server and LocalThought" license = "MIT" diff --git a/syncables/README.md b/syncables/README.md index f3fc370f..2f3e6fd9 100644 --- a/syncables/README.md +++ b/syncables/README.md @@ -2239,6 +2239,100 @@ Not verified against a real provider: no overlay declares `x-produces` yet. ## Changelog +- **0.27.0**: SyncD control panel for IAP grants and change notifications. + - **Behaviour change:** Align the experimental native Atomic companion with the Atomic plugins + candidate23 host and browser pin, including batched SYNC_PUSH persistence. + The peer advertises the full-sync protocol supported by that candidate; + sparse-sync is not advertised. Use a fresh peer directory when upgrading + from the recursive prototype, as required by projection version 2. + - **Behaviour change:** Experimental Atomic table schema keys now follow the pinned OAD's declared + CRUD resource, so several collections or operations can share one Class. + Existing row and table keys remain stable. Consumers that saved references + to the earlier operation-scoped experimental Classes should migrate those + references explicitly; relation Properties use new identities when their + datatype changes from JSON to a resource link. + - **Behaviour change:** Generated Atomic schemas now use the pinned OAD and response operation, + rather than the account/collection alias. Accounts using the same operation + share declared Classes and Properties; observed records do not change the + declared Class. Tables and rows retain their account-specific identities. + Existing native peers retain superseded schema resources as previous members + when their import keys change. + - **Behaviour change:** The experimental Atomic peer now generates one owner-scoped drive with account + folders and a native table for each selected API collection. All configured + collections are selected by default; use --collections or --collection for a + subset. Typed fields and linked nested resources replace JSON wrappers; + original responses and history stay in PostgreSQL. Preserve unsafe numbers as + exact text and use a new projection directory when upgrading from the original + single-collection wrapper prototype. + - **Behaviour change:** The experimental Atomic table projection uses one resource per API record, + with nested objects, arrays and comments kept as inline native JSON. Use a new + projection directory when upgrading from the recursive-resource format. API + identity columns have distinct labels, imported permissions remain source + metadata, and declared compound-field schemas stay on their Properties. The + Keep daemon example retains the complete pinned upstream OAD. Prepare the full + GitHub example with examples/daemon/prepare-github-issues.mjs before using the + demo config; generated large contracts stay outside Git. The daemon still + selects read-only GET collections. + - **Added:** Atomic table projections can turn explicitly declared embedded API objects + into named resource links and resource lists, with account-scoped referenced + tables. Source-hash-bound projection overlays support offline reprojection + without changing accepted snapshot provenance or making provider requests. + Unresolved fields retain their complete JSON value with diagnostics. + - **Added:** Project a selected accepted API record into typed owned Note, List and ListItem + resources through a separate consumer profile, preserving its complete original + body JSON and other typed fields. Ordered links, explicit parentage, optional + checked state and snapshot-bound item identities make the result queryable + without changing the API contract or inferring item identity across refreshes. + - **Added:** Experimental `atomic-peer` serves one accepted PostgreSQL collection as a + read-only native Atomic drive through an optional Rust companion. Persistent + signed Loro documents retain record/schema identities across updates, + absence/reappearance and restart; a durable projection journal gates + publication and recovery. Source JSON and numbers remain lossless text. + Explicit owner signing authority and reader agents are required; see + `docs/atomic-peer.md`. Replication destination definitions remain configuration + only, and no provider writes, service installation or public listener is added. + - **Added:** CRUD Causality 0.8.0 `committedErrors` (§4.3.3): a create answered with a + `5xx` that a Committed Error Object matches (a listed status and a usable + id at its `identity` path in the JSON error body, as Notion's `503` with + `additional_data.committed_resource_id`) is applied, bound to that id and + never sent again. Before, a `503` took the ordinary retry path, so such a + create was sent twice. A listed status whose body names no usable id is + an unknown outcome (uncertain without an idempotency key). A match that + does not name the record's id leaves the create applied but unbound, + which `matchUnboundCreates` can bind. Documents without + `committedErrors` read as before. `committedIdentity` ports the + reference `committed_identity()`, sharing the path-segment validation used + by other identity bindings, including rejection of malformed Unicode. + - **Added:** The browser-safe `syncables/graphql` subpath reads a validated GraphQL + collection description through an injected operation-ID executor. Cursor + and explicit empty-page offset traversals enforce identity, progress and + read limits; partial GraphQL errors leave the read incomplete. A finished + traversal supplies no absence/deletion evidence. This does not add GraphQL + support to the REST replica or integration-proxy authorization routes. + - **Added:** The SyncD UI now lists remote connections approved for its device grant, + including connections not configured for local syncing. It shows per-collection + sync state, last successful sync and attempt times, next due time, and distinct + auth, sync and working-folder errors. Local snapshots remain browsable when + login or remote discovery fails. Existing records without timestamp tracking + are shown as unknown; new successful unchanged reads update the sync time. + - **Added:** SyncD now has a local read-only data browser: `syncables ui --config FILE` + prints a browser link for configured collections, searchable paginated records + and exact source JSON details. It reads accepted PostgreSQL snapshots without + provider requests and keeps paging on one saved revision until refreshed. + - **Added:** SyncD can embed IAP's reusable access-management page in its local control + panel. Start ui with --manage for a separate, foreground-only approval to + manage selected provider connections and account-wide client sessions. + Optional collection notifications subscribe to IAP's notification-only + webhook inbox, schedule durable local work before acknowledgement, and + perform full bootstrap reconciliation after a gap. Provider credentials + remain in IAP and imported data remains in local PostgreSQL. + - **Fixed:** The mock server's next link and `currentPage` count page numbers from + the scheme's `start` (Pagination Schemes §4.3.1, default 1). Before, + they used `+ 1` whatever the start: with `start: 0` the next link + skipped a page, and with `start: 2` it pointed back at the first page. + - **Other:** Document the native Atomic companion's certified-genesis and read-only session + boundaries and its independent Cargo lockfile compatibility procedure. The + validated core pin and replication permissions are unchanged. - **0.26.0**: Experimental SyncD with PostgreSQL history, offline browsing, Git import/export, read-only Braid and explicit provider writes; check migration and API changes before upgrading. - **Behaviour change:** The supported Node range is now 22.11 or newer, with CI on Node 22, 24 and 26; the inherited Node 22-only upper limit is removed. Volta still defaults to diff --git a/syncables/changes/atomic-embedded-resources.added.md b/syncables/changes/atomic-embedded-resources.added.md deleted file mode 100644 index 9cffa8ab..00000000 --- a/syncables/changes/atomic-embedded-resources.added.md +++ /dev/null @@ -1,5 +0,0 @@ -Atomic table projections can turn explicitly declared embedded API objects -into named resource links and resource lists, with account-scoped referenced -tables. Source-hash-bound projection overlays support offline reprojection -without changing accepted snapshot provenance or making provider requests. -Unresolved fields retain their complete JSON value with diagnostics. diff --git a/syncables/changes/atomic-owned-list-components.added.md b/syncables/changes/atomic-owned-list-components.added.md deleted file mode 100644 index b9fec4f7..00000000 --- a/syncables/changes/atomic-owned-list-components.added.md +++ /dev/null @@ -1,5 +0,0 @@ -Project a selected accepted API record into typed owned Note, List and ListItem -resources through a separate consumer profile, preserving its complete original -body JSON and other typed fields. Ordered links, explicit parentage, optional -checked state and snapshot-bound item identities make the result queryable -without changing the API contract or inferring item identity across refreshes. diff --git a/syncables/changes/atomic-peer-candidate23.behaviour.md b/syncables/changes/atomic-peer-candidate23.behaviour.md deleted file mode 100644 index 651bd010..00000000 --- a/syncables/changes/atomic-peer-candidate23.behaviour.md +++ /dev/null @@ -1,5 +0,0 @@ -Align the experimental native Atomic companion with the Atomic plugins -candidate23 host and browser pin, including batched SYNC_PUSH persistence. -The peer advertises the full-sync protocol supported by that candidate; -sparse-sync is not advertised. Use a fresh peer directory when upgrading -from the recursive prototype, as required by projection version 2. diff --git a/syncables/changes/atomic-peer-genesis.other.md b/syncables/changes/atomic-peer-genesis.other.md deleted file mode 100644 index bf5b1f19..00000000 --- a/syncables/changes/atomic-peer-genesis.other.md +++ /dev/null @@ -1,3 +0,0 @@ -Document the native Atomic companion's certified-genesis and read-only session -boundaries and its independent Cargo lockfile compatibility procedure. The -validated core pin and replication permissions are unchanged. diff --git a/syncables/changes/atomic-peer.added.md b/syncables/changes/atomic-peer.added.md deleted file mode 100644 index 1731a420..00000000 --- a/syncables/changes/atomic-peer.added.md +++ /dev/null @@ -1,8 +0,0 @@ -Experimental `atomic-peer` serves one accepted PostgreSQL collection as a -read-only native Atomic drive through an optional Rust companion. Persistent -signed Loro documents retain record/schema identities across updates, -absence/reappearance and restart; a durable projection journal gates -publication and recovery. Source JSON and numbers remain lossless text. -Explicit owner signing authority and reader agents are required; see -`docs/atomic-peer.md`. Replication destination definitions remain configuration -only, and no provider writes, service installation or public listener is added. diff --git a/syncables/changes/atomic-resource-schema-identities.behaviour.md b/syncables/changes/atomic-resource-schema-identities.behaviour.md deleted file mode 100644 index 8323ac72..00000000 --- a/syncables/changes/atomic-resource-schema-identities.behaviour.md +++ /dev/null @@ -1,6 +0,0 @@ -Experimental Atomic table schema keys now follow the pinned OAD's declared -CRUD resource, so several collections or operations can share one Class. -Existing row and table keys remain stable. Consumers that saved references -to the earlier operation-scoped experimental Classes should migrate those -references explicitly; relation Properties use new identities when their -datatype changes from JSON to a resource link. diff --git a/syncables/changes/atomic-schema-operation-identity.behaviour.md b/syncables/changes/atomic-schema-operation-identity.behaviour.md deleted file mode 100644 index b4ed1776..00000000 --- a/syncables/changes/atomic-schema-operation-identity.behaviour.md +++ /dev/null @@ -1,6 +0,0 @@ -Generated Atomic schemas now use the pinned OAD and response operation, -rather than the account/collection alias. Accounts using the same operation -share declared Classes and Properties; observed records do not change the -declared Class. Tables and rows retain their account-specific identities. -Existing native peers retain superseded schema resources as previous members -when their import keys change. diff --git a/syncables/changes/atomic-tables.behaviour.md b/syncables/changes/atomic-tables.behaviour.md deleted file mode 100644 index 859f644a..00000000 --- a/syncables/changes/atomic-tables.behaviour.md +++ /dev/null @@ -1,7 +0,0 @@ -The experimental Atomic peer now generates one owner-scoped drive with account -folders and a native table for each selected API collection. All configured -collections are selected by default; use --collections or --collection for a -subset. Typed fields and linked nested resources replace JSON wrappers; -original responses and history stay in PostgreSQL. Preserve unsafe numbers as -exact text and use a new projection directory when upgrading from the original -single-collection wrapper prototype. diff --git a/syncables/changes/committed-errors.added.md b/syncables/changes/committed-errors.added.md deleted file mode 100644 index 2a0458cf..00000000 --- a/syncables/changes/committed-errors.added.md +++ /dev/null @@ -1,12 +0,0 @@ -CRUD Causality 0.8.0 `committedErrors` (§4.3.3): a create answered with a -`5xx` that a Committed Error Object matches (a listed status and a usable -id at its `identity` path in the JSON error body, as Notion's `503` with -`additional_data.committed_resource_id`) is applied, bound to that id and -never sent again. Before, a `503` took the ordinary retry path, so such a -create was sent twice. A listed status whose body names no usable id is -an unknown outcome (uncertain without an idempotency key). A match that -does not name the record's id leaves the create applied but unbound, -which `matchUnboundCreates` can bind. Documents without -`committedErrors` read as before. `committedIdentity` ports the -reference `committed_identity()`, sharing the path-segment validation used -by other identity bindings, including rejection of malformed Unicode. diff --git a/syncables/changes/compact-atomic-tables.behaviour.md b/syncables/changes/compact-atomic-tables.behaviour.md deleted file mode 100644 index 9a18ab44..00000000 --- a/syncables/changes/compact-atomic-tables.behaviour.md +++ /dev/null @@ -1,9 +0,0 @@ -The experimental Atomic table projection uses one resource per API record, -with nested objects, arrays and comments kept as inline native JSON. Use a new -projection directory when upgrading from the recursive-resource format. API -identity columns have distinct labels, imported permissions remain source -metadata, and declared compound-field schemas stay on their Properties. The -Keep daemon example retains the complete pinned upstream OAD. Prepare the full -GitHub example with examples/daemon/prepare-github-issues.mjs before using the -demo config; generated large contracts stay outside Git. The daemon still -selects read-only GET collections. diff --git a/syncables/changes/graphql-collection-reader.added.md b/syncables/changes/graphql-collection-reader.added.md deleted file mode 100644 index f9848b03..00000000 --- a/syncables/changes/graphql-collection-reader.added.md +++ /dev/null @@ -1,6 +0,0 @@ -The browser-safe `syncables/graphql` subpath reads a validated GraphQL -collection description through an injected operation-ID executor. Cursor -and explicit empty-page offset traversals enforce identity, progress and -read limits; partial GraphQL errors leave the read incomplete. A finished -traversal supplies no absence/deletion evidence. This does not add GraphQL -support to the REST replica or integration-proxy authorization routes. diff --git a/syncables/changes/mock-page-start.fixed.md b/syncables/changes/mock-page-start.fixed.md deleted file mode 100644 index 8620018b..00000000 --- a/syncables/changes/mock-page-start.fixed.md +++ /dev/null @@ -1,4 +0,0 @@ -The mock server's next link and `currentPage` count page numbers from -the scheme's `start` (Pagination Schemes §4.3.1, default 1). Before, -they used `+ 1` whatever the start: with `start: 0` the next link -skipped a page, and with `start: 2` it pointed back at the first page. diff --git a/syncables/changes/syncd-connection-status.added.md b/syncables/changes/syncd-connection-status.added.md deleted file mode 100644 index d8391c35..00000000 --- a/syncables/changes/syncd-connection-status.added.md +++ /dev/null @@ -1,6 +0,0 @@ -The SyncD UI now lists remote connections approved for its device grant, -including connections not configured for local syncing. It shows per-collection -sync state, last successful sync and attempt times, next due time, and distinct -auth, sync and working-folder errors. Local snapshots remain browsable when -login or remote discovery fails. Existing records without timestamp tracking -are shown as unknown; new successful unchanged reads update the sync time. diff --git a/syncables/changes/syncd-data-browser.added.md b/syncables/changes/syncd-data-browser.added.md deleted file mode 100644 index 8a750013..00000000 --- a/syncables/changes/syncd-data-browser.added.md +++ /dev/null @@ -1,4 +0,0 @@ -SyncD now has a local read-only data browser: `syncables ui --config FILE` -prints a browser link for configured collections, searchable paginated records -and exact source JSON details. It reads accepted PostgreSQL snapshots without -provider requests and keeps paging on one saved revision until refreshed. diff --git a/syncables/changes/syncd-iap.added.md b/syncables/changes/syncd-iap.added.md deleted file mode 100644 index 601c2833..00000000 --- a/syncables/changes/syncd-iap.added.md +++ /dev/null @@ -1,7 +0,0 @@ -SyncD can embed IAP's reusable access-management page in its local control -panel. Start ui with --manage for a separate, foreground-only approval to -manage selected provider connections and account-wide client sessions. -Optional collection notifications subscribe to IAP's notification-only -webhook inbox, schedule durable local work before acknowledgement, and -perform full bootstrap reconciliation after a gap. Provider credentials -remain in IAP and imported data remains in local PostgreSQL. diff --git a/syncables/docs/ai-logs/sessions/2026-11-06-syncd-iap.md b/syncables/docs/ai-logs/sessions/2026-11-06-syncd-iap.md index e1fd730c..59de17ac 100644 --- a/syncables/docs/ai-logs/sessions/2026-11-06-syncd-iap.md +++ b/syncables/docs/ai-logs/sessions/2026-11-06-syncd-iap.md @@ -63,3 +63,7 @@ skipped before the final added bootstrap regression; targeted final checks and Rust results are recorded in the PR. Rust device and webhook tests run against isolated local PostgreSQL with invented credentials. Browser previews have no page errors and screenshots are shared outside the repository. + +## 2026-11-09 release + +User authorized merging #725 and deploying localthought.io; atomic-saas #159 must remain unmerged. Prepare proxy 0.4.2 and Syncables 0.27.0 from merged #725. Consume all pending Syncables changelog fragments using the release script. Preserve production catalog and runtime configuration. diff --git a/syncables/package-lock.json b/syncables/package-lock.json index 121a070b..d5a52b56 100644 --- a/syncables/package-lock.json +++ b/syncables/package-lock.json @@ -1,12 +1,12 @@ { "name": "syncables", - "version": "0.26.0", + "version": "0.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "syncables", - "version": "0.26.0", + "version": "0.27.0", "license": "Apache-2.0", "dependencies": { "@bokuweb/zstd-wasm": "0.0.27", diff --git a/syncables/package.json b/syncables/package.json index 9b629186..26458a2a 100644 --- a/syncables/package.json +++ b/syncables/package.json @@ -1,6 +1,6 @@ { "name": "syncables", - "version": "0.26.0", + "version": "0.27.0", "repository": { "type": "git", "url": "git+https://github.com/ontola/atomic-plugins.git",