@creatornader/agent-bridge 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +150 -1
- package/README.md +239 -5
- package/ROADMAP.md +59 -7
- package/SECURITY.md +55 -5
- package/SKILL.md +103 -0
- package/dist/archive.d.ts +2 -2
- package/dist/archive.js +2 -2
- package/dist/{bridge-service-hX1ZQp4W.d.ts → bridge-service-YTjGr91A.d.ts} +1 -1
- package/dist/{bridge-store-DPVSCwfs.d.ts → bridge-store-Boaj-ZbO.d.ts} +2 -0
- package/dist/bridge.d.ts +17 -7
- package/dist/bridge.js +15 -7
- package/dist/{chunk-WAI2IYIQ.js → chunk-3YHVUPU2.js} +48 -5
- package/dist/chunk-3YHVUPU2.js.map +1 -0
- package/dist/{chunk-45BZGB77.js → chunk-6BTJE6D4.js} +168 -7
- package/dist/chunk-6BTJE6D4.js.map +1 -0
- package/dist/{chunk-5GMB3A77.js → chunk-DQOZJJZ2.js} +22 -10
- package/dist/chunk-DQOZJJZ2.js.map +1 -0
- package/dist/{chunk-NCO7RLBM.js → chunk-GTK4KOED.js} +108 -8
- package/dist/chunk-GTK4KOED.js.map +1 -0
- package/dist/{chunk-GADH244D.js → chunk-IHZFI7TH.js} +12 -4
- package/dist/chunk-IHZFI7TH.js.map +1 -0
- package/dist/{chunk-CEXBMOI5.js → chunk-LAHNQZDN.js} +2 -2
- package/dist/{chunk-UAHMP6GC.js → chunk-MCKKVNCE.js} +9 -6
- package/dist/chunk-MCKKVNCE.js.map +1 -0
- package/dist/{chunk-MBPZXTJA.js → chunk-PDIHDBP3.js} +173 -20
- package/dist/chunk-PDIHDBP3.js.map +1 -0
- package/dist/{chunk-Q6PPMXJC.js → chunk-SV3SVBYS.js} +377 -21
- package/dist/chunk-SV3SVBYS.js.map +1 -0
- package/dist/{chunk-SPSMZOCJ.js → chunk-SYGONYMM.js} +4 -4
- package/dist/{chunk-A6W4QALF.js → chunk-TC6A7GMF.js} +2 -2
- package/dist/cli.js +5865 -436
- package/dist/cli.js.map +1 -1
- package/dist/client-runtime.d.ts +4 -2
- package/dist/client-runtime.js +6 -6
- package/dist/contracts/generate.js +1 -1
- package/dist/dr.d.ts +9 -2
- package/dist/dr.js +6 -4
- package/dist/{gateway-CggQ8vTC.d.ts → gateway-BQHpV-MZ.d.ts} +27 -3
- package/dist/gateway-main.js +69 -5
- package/dist/gateway-main.js.map +1 -1
- package/dist/gateway.d.ts +3 -3
- package/dist/gateway.js +2 -2
- package/dist/index.js +7 -7
- package/dist/{postgres-bridge-store-Bfd3hRId.d.ts → postgres-bridge-store-WASumj26.d.ts} +1 -1
- package/dist/server.js +7 -7
- package/dist/sqlite-edge-store-Bc15DvpX.d.ts +148 -0
- package/dist/sqlite.d.ts +19 -80
- package/dist/sqlite.js +11 -3
- package/docs/architecture-v2.md +256 -10
- package/docs/decisions/0004-client-lifecycle-and-endpoint-migration.md +204 -0
- package/docs/deployment.md +205 -0
- package/docs/troubleshooting.md +23 -0
- package/llms.txt +67 -0
- package/openapi/agent-bridge-v2.openapi.json +1023 -0
- package/package.json +6 -2
- package/schemas/agent-bridge-v2.capabilities.json +24 -0
- package/schemas/agent-bridge-v2.mcp.json +6 -0
- package/schemas/agent-bridge-v2.schema.json +163 -0
- package/sql/migrations/017_gateway_authority_binding.sql +99 -0
- package/sql/migrations/018_endpoint_migration_challenges.sql +1028 -0
- package/sql/migrations/019_endpoint_migration_same_successor.sql +324 -0
- package/dist/chunk-45BZGB77.js.map +0 -1
- package/dist/chunk-5GMB3A77.js.map +0 -1
- package/dist/chunk-GADH244D.js.map +0 -1
- package/dist/chunk-MBPZXTJA.js.map +0 -1
- package/dist/chunk-NCO7RLBM.js.map +0 -1
- package/dist/chunk-Q6PPMXJC.js.map +0 -1
- package/dist/chunk-UAHMP6GC.js.map +0 -1
- package/dist/chunk-WAI2IYIQ.js.map +0 -1
- /package/dist/{chunk-CEXBMOI5.js.map → chunk-LAHNQZDN.js.map} +0 -0
- /package/dist/{chunk-SPSMZOCJ.js.map → chunk-SYGONYMM.js.map} +0 -0
- /package/dist/{chunk-A6W4QALF.js.map → chunk-TC6A7GMF.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,154 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.4.0] - 2026-07-19
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Add v6 managed-client endpoint cutover and finalization commands. A
|
|
14
|
+
committed v5 stage authorizes a credential-free v6 journal only after both live
|
|
15
|
+
gateways negotiate HTTP 2.1, bind the recorded principal and credential IDs, report
|
|
16
|
+
one immutable authority ID, and complete a route challenge. Cutover drains the
|
|
17
|
+
source edge under an exclusive lease before changing a host registration. The initial
|
|
18
|
+
proof uses the predecessor and successor. Once a journal exists, every proof and
|
|
19
|
+
replay uses the successor credential at both URLs, then drains the source edge
|
|
20
|
+
through the target gateway. Finalization retires the source only after the
|
|
21
|
+
predecessor grace cutoff. Dry runs inspect edge state without opening SQLite for
|
|
22
|
+
write access or contacting a gateway. Resume classifies durable before and after
|
|
23
|
+
proofs and cannot take over a live lease.
|
|
24
|
+
|
|
25
|
+
- Add migration 019 for successor-only endpoint-migration challenges. A challenge now
|
|
26
|
+
accepts either a direct predecessor-to-successor pair or the same active successor
|
|
27
|
+
credential on both endpoints. The migration preserves the migration 018 challenge
|
|
28
|
+
records and readiness controls, adds v2 endpoint and v6 owner attestations, and does
|
|
29
|
+
not grant cutover authority. Authenticated HTTP 2.1 capabilities now return the
|
|
30
|
+
credential's `grantedScopes`.
|
|
31
|
+
|
|
32
|
+
- Add migration 017 with an immutable PostgreSQL gateway authority UUID. Production
|
|
33
|
+
request authority now uses a bound opener without changing the released opener's
|
|
34
|
+
return shape. Authenticated gateway status adds optional `gatewayAuthorityId` and
|
|
35
|
+
`credentialId` fields under HTTP 2.1. Native DR preserves the UUID as logical
|
|
36
|
+
authority continuity, not live-clone fencing. Deployments must drain old gateway
|
|
37
|
+
instances before the migration.
|
|
38
|
+
|
|
39
|
+
- Add `clients migrate stage <runtime>` for inert gateway-client migration
|
|
40
|
+
preparation. The command probes the active and successor bearer credentials, records
|
|
41
|
+
enrollment credential IDs and credential-free source and target bindings, and
|
|
42
|
+
prepares a private successor backend without changing the active registration or
|
|
43
|
+
backend. It does not authorize cutover. The source SQLite edge gate prevents new
|
|
44
|
+
outbox inserts once a later drain starts, including from a client that opened the
|
|
45
|
+
database before the gate changed. Staging requires an absolute, normalized source
|
|
46
|
+
edge database path and rejects in-memory edge state.
|
|
47
|
+
|
|
48
|
+
- Add explicit, plan-first `clients rollback <update-operation-id> --identity <name>`
|
|
49
|
+
for committed same-host v4 updates. `--apply` creates a separate reverse journal.
|
|
50
|
+
It verifies the source inverse contract and current forward metadata and
|
|
51
|
+
registration before it removes the forward native entry, restores the prior entry,
|
|
52
|
+
and writes prior metadata last. Claude Desktop replaces only its Agent Bridge entry.
|
|
53
|
+
Generic `clients resume` also resumes a reverse journal. The v4 source completion
|
|
54
|
+
keeps only a bounded credential-free inverse contract. Repair remains monotonic and
|
|
55
|
+
uninstall stays forward-only. Managed operation summaries preserve the durable
|
|
56
|
+
manifest version and include the `rollback` kind.
|
|
57
|
+
|
|
58
|
+
- Add forward-only `clients uninstall` for metadata-owned Codex, Claude Code, and
|
|
59
|
+
Claude Desktop registrations. Uninstall proves and removes the managed
|
|
60
|
+
registration, deletes an already private backend file, then deletes management
|
|
61
|
+
metadata. It never snapshots backend bytes or reverses a completed step. POSIX
|
|
62
|
+
deletion syncs the private parent directory. Windows verifies deletion and records
|
|
63
|
+
unavailable directory durability. Native and Desktop writes retain their documented
|
|
64
|
+
same-user advisory race boundaries.
|
|
65
|
+
Add `clients resume <operation-id> [--recover-lock]`, which derives repair and
|
|
66
|
+
uninstall authority from recorded v3 requests, and update or rollback authority
|
|
67
|
+
from recorded v4 requests. It also accepts pre-v4 update journals. It accepts no
|
|
68
|
+
replacement identity, runtime, instance, launch, or file locator. Version 2
|
|
69
|
+
journals remain inspectable only. Generic resume also completes an uninstall
|
|
70
|
+
interrupted after its final metadata deletion.
|
|
71
|
+
|
|
72
|
+
- Add plan-first `clients repair` and `clients update` for metadata-owned Codex,
|
|
73
|
+
Claude Code, and Claude Desktop registrations. Runtime and stable instance locate
|
|
74
|
+
strict owner-private metadata. Identity binds the record and immutable repair or
|
|
75
|
+
update request. Repair restores the stored launch contract, while update journals a
|
|
76
|
+
normalized credential-free launch request.
|
|
77
|
+
Applied native changes prove remove, absence, add, and exact target before a
|
|
78
|
+
metadata-last launch update. Desktop replaces only the Agent Bridge entry and
|
|
79
|
+
preserves unrelated JSON values. Backend privacy repair records only policy proofs
|
|
80
|
+
and tightens permissions without reading or snapshotting backend content. Full
|
|
81
|
+
metadata and bounded registration proofs prevent drifted state from advancing a
|
|
82
|
+
prior journal. Unknown environment keys and unsafe registration fields stop before
|
|
83
|
+
journal creation. Native update commands reject argument, credential, and URL-like
|
|
84
|
+
surfaces. Desktop publication uses a private operation-scoped temporary file and
|
|
85
|
+
detects the checked races that Node can observe, but it cannot provide an OS
|
|
86
|
+
transaction with Claude Desktop. Same-action same-host resume and stale-lock recovery
|
|
87
|
+
use the existing operation substrate.
|
|
88
|
+
New journals use operation format version 3. Version 2 journals remain inspectable,
|
|
89
|
+
but incomplete records cannot resume without an identity-bound request.
|
|
90
|
+
|
|
91
|
+
- Give local and edge SQLite initialization a 15-second minimum busy-retry window
|
|
92
|
+
for concurrent first-start schema work. Normal database operations retain their
|
|
93
|
+
configured timeout. Concurrency tests also terminate hung child processes before
|
|
94
|
+
temporary-directory cleanup.
|
|
95
|
+
|
|
96
|
+
- Add the crash-safe managed-client operation substrate and read-only `clients
|
|
97
|
+
operations [<operation-id>]` inspection. Owner-private revisioned manifests,
|
|
98
|
+
immutable ordered step plans, snapshot artifacts, pinned directory identities,
|
|
99
|
+
per-client locks, and same-host stale-lock proof keep private contents out of JSON
|
|
100
|
+
and errors. Restart classification distinguishes exact before-state retries,
|
|
101
|
+
verified after-state advancement, and blocked ambiguity. Snapshot publication never
|
|
102
|
+
replaces residue, every step requires a verified before-state snapshot, and bounded
|
|
103
|
+
manifests reject contradictory state. Typed credential-agnostic requests,
|
|
104
|
+
no-replace before/after artifacts, lock-covered begin, and same-host resume now feed
|
|
105
|
+
distinct resumable, classification-required, blocked, and complete inspection.
|
|
106
|
+
Crash-restartable per-artifact cleanup advances `applied` through `cleaning` to a
|
|
107
|
+
`committed` manifest after verified unlink and POSIX directory sync, or an explicit
|
|
108
|
+
Windows unavailable-durability result. Exact after-publication and post-intent unlink
|
|
109
|
+
residue can resume; every other missing or extra artifact blocks. Terminal manifests
|
|
110
|
+
retain a bounded credential-free completion record. Windows mutations reuse native
|
|
111
|
+
ACL results only within one held lock and for the same verified directory path
|
|
112
|
+
identity. File checks, new or resumed locks, and passive inspection recheck the
|
|
113
|
+
policy. POSIX checks remain per-access. Repair, update, and uninstall use this substrate.
|
|
114
|
+
|
|
115
|
+
- Add read-only `clients inspect` and plan-first `clients adopt` for Codex, Claude
|
|
116
|
+
Code, and Claude Desktop. Exact unmanaged registrations can be adopted only with
|
|
117
|
+
`--apply`, which writes owner-only credential-free management metadata. Inspection
|
|
118
|
+
reports absent, unmanaged, managed, or drifted state without reading backend values
|
|
119
|
+
or contacting a gateway. Registration comparison is structural and health-neutral,
|
|
120
|
+
backend paths enforce the owner-only no-link policy, Desktop inspection shares the
|
|
121
|
+
installer launch resolver, and apply re-inspects its postcondition. Enrollment-based
|
|
122
|
+
provision collision behavior is unchanged. Managed metadata also binds Desktop to
|
|
123
|
+
its normalized config path, Codex to its active profile config, and Claude Code
|
|
124
|
+
local or project scope to its invocation directory so later operations cannot guess
|
|
125
|
+
at a registration target.
|
|
126
|
+
|
|
127
|
+
- Add a pinned, non-root gateway image and a loopback-only Compose development stack.
|
|
128
|
+
The stack runs migrations separately, creates a restricted runtime login, reads
|
|
129
|
+
database passwords from private secret files, and retains PostgreSQL data in a named
|
|
130
|
+
volume.
|
|
131
|
+
- Add a Linux Compose acceptance test for credential-bound identity, targeted delivery,
|
|
132
|
+
lease settlement, denied runtime access to credential hashes, and PostgreSQL
|
|
133
|
+
persistence across a full stack restart.
|
|
134
|
+
- Add a deployment guide for production TLS, network isolation, secret handling,
|
|
135
|
+
backup, upgrade order, and rollback.
|
|
136
|
+
|
|
137
|
+
### Fixed
|
|
138
|
+
|
|
139
|
+
- Defer Windows SQLite sidecar ACL application until the opened connection establishes
|
|
140
|
+
WAL and completes its serialized schema transaction. Concurrent first-open processes
|
|
141
|
+
no longer race a transient sidecar before their own connection holds it. Replacement
|
|
142
|
+
during one ACL validation still fails.
|
|
143
|
+
- Treat a Windows SQLite sidecar that disappears during ACL validation as an expected
|
|
144
|
+
race only when the path remains absent. A replacement or reparse object still fails
|
|
145
|
+
validation.
|
|
146
|
+
- Handle `-h` and `--help` before command parsing and dispatch so help never opens a
|
|
147
|
+
backend or performs a command side effect.
|
|
148
|
+
|
|
149
|
+
### Changed
|
|
150
|
+
|
|
151
|
+
- Require the exact release commit to pass the full `test.yml` matrix on `main` before
|
|
152
|
+
release packaging begins. Pin GitHub Actions and reusable workflows to verified
|
|
153
|
+
commit SHAs.
|
|
154
|
+
- Keep Dependabot's grouped npm updates to patch and minor versions. Major updates now
|
|
155
|
+
require separate review.
|
|
156
|
+
|
|
9
157
|
## [0.3.1] - 2026-07-15
|
|
10
158
|
|
|
11
159
|
### Added
|
|
@@ -136,7 +284,8 @@ First tagged release. Marks the point where agent-bridge has shipped its initial
|
|
|
136
284
|
- Narrative-leak detection in CI + on commit via `creatornader/textleaks@v0.2.0` (renamed from leakguard).
|
|
137
285
|
|
|
138
286
|
[0.1.0]: https://github.com/creatornader/agent-bridge/releases/tag/v0.1.0
|
|
139
|
-
[Unreleased]: https://github.com/creatornader/agent-bridge/compare/v0.
|
|
287
|
+
[Unreleased]: https://github.com/creatornader/agent-bridge/compare/v0.4.0...HEAD
|
|
288
|
+
[0.4.0]: https://github.com/creatornader/agent-bridge/compare/v0.3.1...v0.4.0
|
|
140
289
|
[0.3.1]: https://github.com/creatornader/agent-bridge/compare/v0.3.0...v0.3.1
|
|
141
290
|
[0.3.0]: https://github.com/creatornader/agent-bridge/compare/v0.2.0...v0.3.0
|
|
142
291
|
[0.2.0]: https://github.com/creatornader/agent-bridge/compare/v0.1.0...v0.2.0
|
package/README.md
CHANGED
|
@@ -43,6 +43,26 @@ Restart the client, then run `agent-bridge doctor --json` if the MCP server does
|
|
|
43
43
|
attach. The [troubleshooting guide](docs/troubleshooting.md) covers executable paths,
|
|
44
44
|
client configuration, and recovery steps.
|
|
45
45
|
|
|
46
|
+
## Run the gateway with Compose
|
|
47
|
+
|
|
48
|
+
The repository includes a loopback-only Compose stack for development and evaluation.
|
|
49
|
+
It starts PostgreSQL 16, runs the ordered migrations, creates a restricted runtime
|
|
50
|
+
login, and starts the authenticated gateway.
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
mkdir -m 700 .secrets
|
|
54
|
+
node -e "process.stdout.write(require('node:crypto').randomBytes(32).toString('hex'))" > .secrets/postgres_password
|
|
55
|
+
node -e "process.stdout.write(require('node:crypto').randomBytes(32).toString('hex'))" > .secrets/runtime_password
|
|
56
|
+
chmod 600 .secrets/*
|
|
57
|
+
docker compose up --build --wait gateway
|
|
58
|
+
curl --fail http://127.0.0.1:8787/readyz
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The checked-in stack publishes the gateway and PostgreSQL only on loopback. It is not
|
|
62
|
+
a production TLS deployment. Read [the deployment guide](docs/deployment.md) before
|
|
63
|
+
exposing a gateway, changing network bindings, upgrading the schema, or relying on the
|
|
64
|
+
named volume for persistent data.
|
|
65
|
+
|
|
46
66
|
## What v2 provides
|
|
47
67
|
|
|
48
68
|
- Immutable messages with UUIDv7 IDs and opaque server cursors.
|
|
@@ -67,6 +87,8 @@ The canonical v2 operation registry generates [JSON Schema](schemas/agent-bridge
|
|
|
67
87
|
|
|
68
88
|
Protocol 2.1 uses a gateway-first rollout. An upgraded gateway continues to serve released 2.0 clients, including headerless requests and their direct or null delivery results. A 2.1 client probes before mutation and proceeds only when complete, consistent response headers select 2.1 and advertise 2.1 support. It rejects mutation against a headerless or 2.0 gateway instead of downgrading. Upgrade the gateway before installing or starting 2.1 clients.
|
|
69
89
|
|
|
90
|
+
Two gateway-only HTTP 2.1 operations establish a short-lived endpoint-migration challenge. Initial preflight uses a direct predecessor and successor. After a cutover journal exists, the same active successor credential can issue at the retained source URL and consume at the target URL. Both calls require active transaction-bound authority and use the canonical credential and operation rate buckets. PostgreSQL stores only a domain-separated SHA-256 commitment. A challenge expires within 60 seconds and does not authorize endpoint cutover. Authenticated HTTP 2.1 capabilities include the credential's `grantedScopes`.
|
|
91
|
+
|
|
70
92
|
The OpenAPI paths describe protocol 2.1. The embedded `x-agent-bridge-protocol-2.0` and `x-agent-bridge-schemas-2.0` vendor extensions contain frozen compatibility schema metadata for released 2.0 clients. They are not a second OpenAPI description. Gateway credentials enforce the operation scopes declared by the canonical registry. Local mode uses process identity, and legacy mode uses its configured key. Provider-neutral artifacts report this difference instead of claiming one authorization model for every backend.
|
|
71
93
|
|
|
72
94
|
## Architecture
|
|
@@ -149,6 +171,8 @@ for its relationship to MCP, A2A, agmsg, brokers, and agent runtimes.
|
|
|
149
171
|
|
|
150
172
|
- Node.js 22.23.1 or newer.
|
|
151
173
|
- SQLite 3.51.3 or newer for local and edge storage. The supported Node version includes it.
|
|
174
|
+
- Concurrent local and edge initialization may wait up to 15 seconds for schema work;
|
|
175
|
+
normal database operations retain their configured busy timeout.
|
|
152
176
|
- PostgreSQL 15, 16, 17, or 18 for gateway mode. New PostgreSQL majors fail the
|
|
153
177
|
migration prerequisite and live readiness checks until their catalog digest is
|
|
154
178
|
certified.
|
|
@@ -304,7 +328,8 @@ agent-bridge dr restore \
|
|
|
304
328
|
PostgreSQL backup takes a repeatable-read snapshot while holding the native DR fence.
|
|
305
329
|
It stores the `agent_bridge` schema dump plus a canonical inventory of required roles,
|
|
306
330
|
memberships, and default privileges. The backup excludes transient data from agent
|
|
307
|
-
instances, rate-limit buckets, request authority,
|
|
331
|
+
instances, rate-limit buckets, request authority, endpoint-migration challenge rows, and
|
|
332
|
+
archive transaction authority.
|
|
308
333
|
Restore turns claimed deliveries into immediately retryable work because a database
|
|
309
334
|
restore cannot preserve a live lease.
|
|
310
335
|
|
|
@@ -385,12 +410,200 @@ Claude Code installation uses its native MCP command. Claude Desktop installatio
|
|
|
385
410
|
merges the `agent-bridge` server into its JSON config with an atomic write. Restart the
|
|
386
411
|
client after installation.
|
|
387
412
|
|
|
413
|
+
Inspect an existing registration before making Agent Bridge its lifecycle owner:
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
agent-bridge clients inspect codex --identity codex --instance <stable-key> \
|
|
417
|
+
--backend-config <absolute-client-backend-path>
|
|
418
|
+
agent-bridge clients adopt codex --identity codex --instance <stable-key> \
|
|
419
|
+
--backend-config <absolute-client-backend-path>
|
|
420
|
+
agent-bridge clients adopt codex --identity codex --instance <stable-key> \
|
|
421
|
+
--backend-config <absolute-client-backend-path> --apply
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
`inspect` is local, read-only, and does not return backend values or credentials. It
|
|
425
|
+
classifies the requested registration as `absent`, `unmanaged`, `managed`, or
|
|
426
|
+
`drifted`. `adopt` is plan-only unless `--apply` is explicit, and application writes
|
|
427
|
+
only owner-private, credential-free management metadata after the identity, instance,
|
|
428
|
+
backend path, scope, launch contract, and registration locator match exactly. Adoption
|
|
429
|
+
never rewrites the host registration or backend file. Enrollment-based first-time
|
|
430
|
+
provisioning still refuses registration and backend-file collisions.
|
|
431
|
+
Claude Code inspection accepts the installed `--scope`; Claude Desktop accepts an
|
|
432
|
+
explicit validated `--command` and, when needed, `--config-path`; its default contract
|
|
433
|
+
is absolute Node plus the absolute server entry. Other adapters reject these
|
|
434
|
+
runtime-specific options. Managed metadata binds Desktop to that normalized config
|
|
435
|
+
path and Codex to its active profile config. Claude Code local and project adoption
|
|
436
|
+
bind to the current directory because the native CLI exposes no stronger locator, so
|
|
437
|
+
run those operations from the project context that later lifecycle commands should
|
|
438
|
+
use. Backend files and their immediate parents must satisfy the owner-only no-link
|
|
439
|
+
policy. Registration state is independent of connectivity health, and applied
|
|
440
|
+
adoption re-inspects before reporting success.
|
|
441
|
+
|
|
442
|
+
Once adopted, repair, update, and uninstall locate the registration from owner-private managed
|
|
443
|
+
metadata. The runtime and stable instance select that record. `--identity` must match
|
|
444
|
+
the recorded identity and the immutable request. These commands reject backend-path, scope, and host
|
|
445
|
+
config locator flags, so a caller cannot redirect a managed mutation.
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
agent-bridge clients repair codex --identity codex --instance <stable-key>
|
|
449
|
+
agent-bridge clients repair codex --identity codex --instance <stable-key> --apply
|
|
450
|
+
agent-bridge clients update codex --identity codex --instance <stable-key> \
|
|
451
|
+
--command agent-bridge-mcp --apply
|
|
452
|
+
agent-bridge clients repair codex --identity codex --instance <stable-key> \
|
|
453
|
+
--apply --resume <operation-uuid>
|
|
454
|
+
agent-bridge clients uninstall codex --identity codex --instance <stable-key> --apply
|
|
455
|
+
agent-bridge clients rollback <update-operation-uuid> --identity codex
|
|
456
|
+
agent-bridge clients rollback <update-operation-uuid> --identity codex --apply
|
|
457
|
+
agent-bridge clients resume <operation-uuid>
|
|
458
|
+
agent-bridge clients migrate stage codex --identity codex --instance <stable-key> \\
|
|
459
|
+
--enrollment-file <private-path>
|
|
460
|
+
agent-bridge clients migrate cutover <stage-operation-uuid> --exclusive-edge
|
|
461
|
+
agent-bridge clients migrate cutover <stage-operation-uuid> --exclusive-edge --apply
|
|
462
|
+
agent-bridge clients migrate finalize <cutover-operation-uuid> --exclusive-edge --apply
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
These commands return a plan by default. A managed registration that is already exact
|
|
466
|
+
and has a private backend file produces no operation. Repair restores the recorded
|
|
467
|
+
launch contract. Update validates and records a new credential-free launch contract
|
|
468
|
+
before it creates a journal. A native `--command` is one executable contract. Bare
|
|
469
|
+
commands cannot contain arguments or URL-like selectors. Absolute paths must resolve
|
|
470
|
+
to executable files. Native adapters remove, verify absence, add, and verify
|
|
471
|
+
the target registration. Claude Desktop replaces only `mcpServers.agent-bridge`,
|
|
472
|
+
preserves unrelated JSON values in memory, publishes through a private operation-scoped
|
|
473
|
+
temporary file, and verifies the new entry. Node cannot provide an OS transaction with
|
|
474
|
+
an uncooperative same-user Desktop writer. The pre-rename identity checks make this an
|
|
475
|
+
advisory race boundary rather than a guarantee.
|
|
476
|
+
|
|
477
|
+
Uninstall is forward-only. It removes the managed registration and verifies its
|
|
478
|
+
absence, deletes the private backend file, then deletes the management metadata. It
|
|
479
|
+
does not repair an unsafe backend before deletion. If the backend is not already
|
|
480
|
+
private, uninstall stops without changing the registration. It does not restore a
|
|
481
|
+
registration, backend, or metadata file after a later step fails. Desktop removes only
|
|
482
|
+
`mcpServers.agent-bridge` and preserves other JSON values. Backend and metadata removal
|
|
483
|
+
check the file and private parent identities before unlink. POSIX then syncs the parent
|
|
484
|
+
directory. Windows verifies the result but records unavailable directory durability.
|
|
485
|
+
Node cannot make pathname-based deletion atomic against an uncooperative same-user
|
|
486
|
+
writer, so that boundary remains advisory.
|
|
487
|
+
|
|
488
|
+
Rollback is explicit and update-only. A committed v4 update retains a bounded
|
|
489
|
+
credential-free inverse contract: its prior managed metadata, prior exact
|
|
490
|
+
registration contract, and digests for the forward metadata and registration state.
|
|
491
|
+
`clients rollback` uses only the source operation UUID and matching identity. It first
|
|
492
|
+
returns a plan. With `--apply`, it creates a separate reverse journal after it proves
|
|
493
|
+
the source is same-host, the source is a committed v4 update, and the current state
|
|
494
|
+
still matches the recorded forward state. Native reversal removes the forward entry,
|
|
495
|
+
adds the prior entry, then writes prior metadata. Claude Desktop replaces only its
|
|
496
|
+
Agent Bridge entry and writes prior metadata last. A reverse journal can resume with
|
|
497
|
+
`clients resume`; a second rollback fails because the forward state is no longer
|
|
498
|
+
present. Repair remains monotonic. Uninstall recovery requires re-enrollment.
|
|
499
|
+
|
|
500
|
+
`--resume` must name an unfinished operation for the same action, runtime, instance,
|
|
501
|
+
and identity. It uses the recorded request instead of new flags. `--recover-lock`
|
|
502
|
+
requires `--apply` and only removes an old same-host lock after the process-death
|
|
503
|
+
proof succeeds. Never delete a lock manually.
|
|
504
|
+
|
|
505
|
+
`clients resume <operation-uuid>` takes only recorded v3, supported v4, v5
|
|
506
|
+
migration-stage, or v6 endpoint-migration operation authority and an optional
|
|
507
|
+
`--recover-lock`. It does not accept a replacement action, runtime,
|
|
508
|
+
instance, identity, command, backend path, scope, or config locator. Use it for every
|
|
509
|
+
generic resume. It is also required when an uninstall has already deleted its final
|
|
510
|
+
metadata file, because the action-specific command has no metadata record left to
|
|
511
|
+
assert.
|
|
512
|
+
|
|
513
|
+
Repair and uninstall create v3 journals. New update and reverse rollback journals use
|
|
514
|
+
v4. Existing v2 journals remain inspectable. A non-terminal v2 journal lacks the
|
|
515
|
+
required identity-bound request, so it is blocked rather than resumed by these commands.
|
|
516
|
+
|
|
517
|
+
Managed-client operations now have a crash-safe local substrate under the owner-only
|
|
518
|
+
`~/.agent-bridge/operations/` directory. `agent-bridge clients operations` lists safe
|
|
519
|
+
operation summaries, and appending an operation UUID inspects one manifest. Output
|
|
520
|
+
never includes artifact contents or backend values. Update requests retain only a
|
|
521
|
+
normalized launch command, arguments, scope, and the fixed Agent Bridge environment
|
|
522
|
+
key names. Each immutable ordered plan names
|
|
523
|
+
registration, backend, and management-metadata targets with non-sensitive locators,
|
|
524
|
+
no-replace before and after artifacts, and expected digests. Registration artifacts
|
|
525
|
+
contain only bounded Agent Bridge fields and the full nonsecret target contract. An
|
|
526
|
+
unknown environment key, malformed field, unsafe argument, or wrong scope stops before
|
|
527
|
+
the journal is created. Begin holds the
|
|
528
|
+
runtime-plus-instance lock and refuses another unfinished operation. Any corrupt or
|
|
529
|
+
blocked journal fences new mutations and resume until an operator resolves it. Resume is
|
|
530
|
+
same-host only. Intent is durable before an
|
|
531
|
+
external write; observed-applied is durable only after the after-state is verified.
|
|
532
|
+
On restart, the exact pending step is retryable only at its before-state, advances only
|
|
533
|
+
at its after-state, and otherwise blocks as ambiguous. Sensitive file access checks and
|
|
534
|
+
pins its immediate directory. Stale-lock recovery separately pins the operation root
|
|
535
|
+
and locks directory for the full recovery sequence. Creation and destructive cleanup
|
|
536
|
+
also keep the operation root and target directories pinned through their writes. The
|
|
537
|
+
full metadata record is rechecked after the lock and before every non-metadata step.
|
|
538
|
+
|
|
539
|
+
On Windows, a held mutation lock can reuse a native ACL result only for the same
|
|
540
|
+
directory path identity. File checks, every new or resumed lock, and each passive
|
|
541
|
+
inspection check the ACL again. POSIX mode checks remain per-access. This cache does
|
|
542
|
+
not change local mode's trust in the current OS user.
|
|
543
|
+
|
|
544
|
+
The journal states are `prepared`, `snapshotted`, `in-progress`, `applied`, `cleaning`,
|
|
545
|
+
and `committed`; inspection separately reports `resumable`,
|
|
546
|
+
`classification-required`, `blocked`, or `complete`. `committed` means every write was
|
|
547
|
+
verified and every artifact was removed. Cleanup records durable intent per artifact,
|
|
548
|
+
pins and verifies it, unlinks it, and syncs the directory on POSIX; Windows explicitly
|
|
549
|
+
records unavailable directory durability. A missing artifact is safe to resume only
|
|
550
|
+
when cleanup intent predated the attempt. Inspection accepts only two exact crash
|
|
551
|
+
residues: that authorized absence, or the verified after artifact for the current
|
|
552
|
+
intent-recorded step. A terminal manifest removes request, step, digest, locator, and
|
|
553
|
+
artifact metadata. A v4 update retains only its explicit credential-free inverse
|
|
554
|
+
contract. A committed v5 stage retains its credential-free stage contract. A committed
|
|
555
|
+
v6 phase retains its credential-free cutover contract. Completed records remain
|
|
556
|
+
readable across hosts. Repair, update, rollback, uninstall, and endpoint migration use
|
|
557
|
+
this journal. Agent Bridge cannot promise physical erasure
|
|
558
|
+
on SSDs or journaled filesystems, so future commands must minimize credential-bearing
|
|
559
|
+
snapshots and rotate credentials when retained copies contained them. Inspection
|
|
560
|
+
changes no registration, backend, metadata, or snapshot file.
|
|
561
|
+
|
|
388
562
|
The v1 host-adapter manifests are under [`clients/`](clients/). Their compatibility
|
|
389
563
|
field is named `runtime`, but its value identifies the installation target, not a
|
|
390
564
|
unique process. OpenClaw and generic MCP manifests declare the required environment
|
|
391
565
|
variables and command but leave config mutation to the operator because their host
|
|
392
566
|
config shapes vary.
|
|
393
567
|
|
|
568
|
+
The lifecycle ownership boundary and deferred endpoint-migration constraints are
|
|
569
|
+
recorded in [ADR 0004](docs/decisions/0004-client-lifecycle-and-endpoint-migration.md).
|
|
570
|
+
|
|
571
|
+
`clients migrate stage <runtime> --identity <name> --instance <key>
|
|
572
|
+
--enrollment-file <path> --apply` prepares a private gateway successor from a rotation
|
|
573
|
+
enrollment. It does not change the active registration or backend. Staging records
|
|
574
|
+
endpoint digests, credential IDs, the source edge path and scope key, and the
|
|
575
|
+
predecessor grace cutoff without recording tokens or raw gateway URLs.
|
|
576
|
+
|
|
577
|
+
`clients migrate cutover <stage-operation-uuid> --exclusive-edge --apply` consumes a
|
|
578
|
+
committed v5 stage. Before it creates a journal, it verifies both live gateways under
|
|
579
|
+
HTTP 2.1, including the recorded workspace, principal, credential ID, immutable gateway
|
|
580
|
+
authority ID, and the successor credential's `status:read` and `messages:write` grants.
|
|
581
|
+
The endpoints then exchange a direct predecessor-to-successor route challenge. The
|
|
582
|
+
durable journal retains the normalized source gateway URL without a token. Every later
|
|
583
|
+
route challenge uses the successor credential at both URLs, and it drains the source
|
|
584
|
+
edge through the target gateway. The source edge changes to `draining`, receives an
|
|
585
|
+
exclusive lease, and must reach an exact zero-work outbox before any host registration
|
|
586
|
+
changes. The command removes and adds native registrations, or replaces the Claude
|
|
587
|
+
Desktop entry, then changes managed metadata last. It rechecks the authority and lease
|
|
588
|
+
before every host write.
|
|
589
|
+
|
|
590
|
+
Every cutover phase requires `--exclusive-edge`. Agent Bridge can enumerate managed
|
|
591
|
+
registrations that share an edge file, including hardlink aliases, but it cannot see
|
|
592
|
+
unmanaged publishers. The flag records the operator's assertion for that remaining
|
|
593
|
+
cohort. The forward phase also requires an active source edge and an active, empty
|
|
594
|
+
target edge.
|
|
595
|
+
|
|
596
|
+
`clients migrate finalize <cutover-operation-uuid> --exclusive-edge --apply` works
|
|
597
|
+
only after the predecessor grace cutoff and retires the retained source edge. To return
|
|
598
|
+
to an earlier endpoint, first rotate a new owner credential for that endpoint, then run
|
|
599
|
+
an ordinary forward cutover with it as the successor. Use `clients resume
|
|
600
|
+
<operation-uuid>` after a crash. Resume waits for a live drain lease to expire before
|
|
601
|
+
another worker can take it. Dry inspection refuses an edge with live WAL sidecars rather
|
|
602
|
+
than opening it in a mode that could miss uncheckpointed outbox state.
|
|
603
|
+
Moving to an independent database needs a separate owner-mediated process.
|
|
604
|
+
The source backend must name an absolute, normalized edge database file. Relative and
|
|
605
|
+
in-memory edge paths cannot identify one durable outbox and are rejected.
|
|
606
|
+
|
|
394
607
|
[`SKILL.md`](SKILL.md) provides concise runtime-neutral operating instructions for agents. [`llms.txt`](llms.txt) gives tools and model crawlers a compact map of the package, modes, commands, and identity rules.
|
|
395
608
|
|
|
396
609
|
## Gateway setup
|
|
@@ -631,6 +844,7 @@ Normal inbox and pending reads fall back to the local cache when the gateway is
|
|
|
631
844
|
|
|
632
845
|
```bash
|
|
633
846
|
agent-bridge --version
|
|
847
|
+
agent-bridge --help
|
|
634
848
|
agent-bridge init --provider local
|
|
635
849
|
agent-bridge doctor
|
|
636
850
|
agent-bridge status
|
|
@@ -658,6 +872,10 @@ agent-bridge sync
|
|
|
658
872
|
agent-bridge watch
|
|
659
873
|
```
|
|
660
874
|
|
|
875
|
+
`-h` and `--help` print help before Agent Bridge loads backend configuration or
|
|
876
|
+
dispatches a command. They are safe to use after a command name, including `archive`
|
|
877
|
+
and `dr` commands.
|
|
878
|
+
|
|
661
879
|
`--project` adds an optional immutable label to a message. It never selects a workspace or changes the active identity. Omit it on reads to include every project and unlabeled messages in the credential-bound workspace. Pass it to `get`, `inbox`, `history`, `pending`, or `watch` for an exact label match. Gateway callers may use `--workspace` only as an assertion. The CLI rejects a mismatch before sending a request. Local mode permits a per-command workspace override. The global legacy Supabase schema has no tenant workspace, so legacy mode fixes workspace to `*` and rejects other `--workspace` values.
|
|
662
880
|
|
|
663
881
|
History defaults to mailbox `inbox`: broadcasts plus messages targeted to the configured principal, exactly as prior releases did. `sent` selects messages whose source is that principal, and `all` is the union. `--receipt-state any|unread|read` is caller-relative and valid only with `inbox`. The deprecated `--unacked-by` option remains an identity assertion. The CLI rejects a mismatch before opening storage or contacting a gateway. Server surfaces reject it before querying message storage. Cursors bind workspace, principal, mailbox, and normalized filters. Version 1 cursors are temporarily accepted, while all new cursors are version 2.
|
|
@@ -773,6 +991,8 @@ Each gateway operation checks the scopes in the canonical registry. `capabilitie
|
|
|
773
991
|
|
|
774
992
|
Migration 012 makes PostgreSQL the authority for each production gateway request that passes credential preflight. Node hashes the bearer credential before PostgreSQL receives it. The gateway checks out one connection, opens one explicit transaction, matches the credential ID and hash inside a narrow security-definer function, and derives the workspace, principal, and scopes from current database state. Security accounting and domain work share that transaction and backend. Delivery claim, cancel, and requeue reuse it without nested `BEGIN`. Runtime logins cannot read credential hashes, agent records, workspace records, or request-authority records.
|
|
775
993
|
|
|
994
|
+
Migration 017 adds one immutable PostgreSQL authority UUID. The released request-authority opener keeps its return shape. Production gateway requests use a bound opener that returns the authority UUID with the database-derived credential. Authenticated gateway `/v2/status` replies include `gatewayAuthorityId` and `credentialId` when transaction-bound request authority is active. Authenticated HTTP 2.1 capabilities return `grantedScopes` for that credential. Migration 018 uses the same bound authority to issue and consume an expiring challenge for a direct credential successor. Migration 019 also permits the same active successor credential at both endpoints after a cutover journal begins. Neither challenge proves a database migration or authorizes endpoint cutover.
|
|
995
|
+
|
|
776
996
|
Migration 013 enables and forces row-level security on messages, receipts, deliveries, delivery events, and presence. Policies read workspace and principal from the transaction-bound request authority. The runtime role cannot set that authority through session variables, inherit a table-owner role, or bypass RLS. Separate no-login roles own domain tables, read request context, and write delivery audit events. Delivery identity and publisher bindings are immutable. A trigger lets recipients perform recipient lifecycle actions and reserves cancel and requeue for publishers.
|
|
777
997
|
|
|
778
998
|
The migration records a catalog attestation after it creates the policies, constraints, triggers, and security functions. `/readyz` fails if the current catalog no longer matches that owner-created baseline. Gateway capabilities report `rowIsolation: true` only when request authority is enabled and the migration, catalog attestation, ownership, policy, privilege, and function checks all pass. An owner-approved schema change must update the attestation in its migration.
|
|
@@ -813,14 +1033,27 @@ The runtime role owns no schema objects. PostgreSQL keeps roles after a database
|
|
|
813
1033
|
```bash
|
|
814
1034
|
npm run typecheck
|
|
815
1035
|
npm test
|
|
1036
|
+
npm run test:postgres:preflight
|
|
816
1037
|
npm run build
|
|
817
1038
|
npm pack
|
|
818
1039
|
```
|
|
819
1040
|
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
1041
|
+
The PostgreSQL preflight starts a fresh Docker container for each supported major,
|
|
1042
|
+
assigns a free loopback port, and runs the live contract. Normal completion removes
|
|
1043
|
+
each container. A later run removes labeled preflight containers older than two hours,
|
|
1044
|
+
which bounds residue after a process or machine stops before cleanup can run. Use
|
|
1045
|
+
`npm run test:postgres:preflight -- --major 16` for one major, or
|
|
1046
|
+
`npm run test:postgres:preflight:full` for the full suite on every major. The command
|
|
1047
|
+
requires a running Docker engine and never reuses a database from an earlier run.
|
|
1048
|
+
|
|
1049
|
+
Set `AGENT_BRIDGE_TEST_DATABASE_URL` when an existing disposable PostgreSQL database is
|
|
1050
|
+
more convenient. CI runs one PostgreSQL 16 contract before starting the 15 through 18
|
|
1051
|
+
jobs. Each version then runs the live contract and matching native DR proof. The package
|
|
1052
|
+
job builds and installs the npm tarball separately.
|
|
1053
|
+
|
|
1054
|
+
CI runs Node 22 and 24 on Linux, macOS, and Windows. One native Windows contract checks
|
|
1055
|
+
private paths, managed uninstall path identity, and recovery before the two Windows jobs
|
|
1056
|
+
start. Before applying a Windows DACL,
|
|
824
1057
|
private paths must be owned by the current account SID or the active token's default
|
|
825
1058
|
owner SID. The final owner and sole protected FullControl rule must use the account SID.
|
|
826
1059
|
Verification-only paths must already satisfy that final policy. Node file identity
|
|
@@ -835,6 +1068,7 @@ durability behavior has not yet been proved on a dedicated Windows host.
|
|
|
835
1068
|
- [SECURITY.md](SECURITY.md): supported versions, release integrity, private vulnerability reporting, and security boundaries.
|
|
836
1069
|
- [docs/ecosystem.md](docs/ecosystem.md): product boundary, adjacent systems, and interoperability direction.
|
|
837
1070
|
- [docs/troubleshooting.md](docs/troubleshooting.md): MCP startup, identity, backend, and client recovery.
|
|
1071
|
+
- [docs/deployment.md](docs/deployment.md): Compose development setup, production constraints, upgrades, backup, and rollback.
|
|
838
1072
|
- [ADR-0001](docs/decisions/0001-protocol-layers-and-acknowledgment-semantics.md): protocol layers and acknowledgment semantics.
|
|
839
1073
|
- [ADR-0002](docs/decisions/0002-canonical-operation-contract-registry.md): canonical contracts, generated artifacts, discovery, and version negotiation.
|
|
840
1074
|
- [ADR-0003](docs/decisions/0003-host-adapters-and-consumer-instance-keys.md): host layers and consumer instance-key semantics.
|
package/ROADMAP.md
CHANGED
|
@@ -9,7 +9,7 @@ published and the supported clients pass a fresh end-to-end check.
|
|
|
9
9
|
|
|
10
10
|
## Status
|
|
11
11
|
|
|
12
|
-
### Released by 0.3.
|
|
12
|
+
### Released by 0.3.1
|
|
13
13
|
|
|
14
14
|
- Local SQLite and shared PostgreSQL storage behind provider-neutral interfaces.
|
|
15
15
|
- An authenticated HTTPS gateway and a named legacy Supabase adapter.
|
|
@@ -17,6 +17,7 @@ published and the supported clients pass a fresh end-to-end check.
|
|
|
17
17
|
presence.
|
|
18
18
|
- Durable SQLite edge outbox and inbox cache for gateway clients.
|
|
19
19
|
- CLI, MCP, HTTPS, and Node library access surfaces.
|
|
20
|
+
- Installed-package version reporting through `agent-bridge --version` and `-V`.
|
|
20
21
|
- Automated host adapters for Codex, Claude Code, and Claude Desktop. The Codex
|
|
21
22
|
adapter configures the profile shared by the Codex CLI and the Codex surface in the
|
|
22
23
|
ChatGPT desktop app.
|
|
@@ -34,14 +35,68 @@ published and the supported clients pass a fresh end-to-end check.
|
|
|
34
35
|
- Portable workspace archives across canonical SQLite and PostgreSQL stores.
|
|
35
36
|
- Native SQLite and PostgreSQL backup, verification, and restore.
|
|
36
37
|
|
|
38
|
+
### 0.4.0 package contents
|
|
39
|
+
|
|
40
|
+
The published npm version is the authority for whether this package line has shipped.
|
|
41
|
+
|
|
42
|
+
- Read-only lifecycle inspection and explicit, plan-first adoption for the Codex,
|
|
43
|
+
Claude Code, and Claude Desktop adapters, backed by owner-only credential-free
|
|
44
|
+
managed metadata, private backend-path verification, health-neutral exact
|
|
45
|
+
registration comparison, immutable nonsecret host locators, and a re-inspected
|
|
46
|
+
adoption postcondition.
|
|
47
|
+
|
|
48
|
+
- Plan-first managed-client repair, update, and forward-only uninstall for Codex, Claude Code, and Claude
|
|
49
|
+
Desktop. Mutation authority comes only from strict private metadata selected by
|
|
50
|
+
runtime and instance, then bound to the exact managed identity. Applied work uses
|
|
51
|
+
the crash-safe journal, fixed-key credential-free update requests, full metadata and
|
|
52
|
+
bounded registration proofs, exact restart classification, monotonic POSIX backend
|
|
53
|
+
privacy repair, and metadata-last launch updates. Windows accepts only an already
|
|
54
|
+
private backend path. Uninstall removes the registration, backend, and metadata in
|
|
55
|
+
that order without rollback. It refuses a backend that still needs privacy repair.
|
|
56
|
+
Desktop publication and deletion have a documented same-user advisory race.
|
|
57
|
+
New updates use v4 journals and retain a bounded credential-free inverse contract.
|
|
58
|
+
`clients rollback <update-operation-id> --identity <name>` is plan-first and, with
|
|
59
|
+
`--apply`, creates a separate reverse journal after it proves the recorded forward
|
|
60
|
+
state. Generic `clients resume` derives authority from recorded v3, supported v4,
|
|
61
|
+
v5 migration-stage, and v6 endpoint-migration requests. Repair remains monotonic
|
|
62
|
+
and uninstall recovery is re-enrollment.
|
|
63
|
+
|
|
64
|
+
- Gateway-client migration staging, cutover, and finalization for managed
|
|
65
|
+
clients. A v5 stage creates a private successor backend without changing the active
|
|
66
|
+
host registration. A v6 cutover verifies one live gateway authority and a route
|
|
67
|
+
challenge, drains the source SQLite edge under a lease, changes the host registration
|
|
68
|
+
and metadata, and preserves credential-free contracts for restart classification.
|
|
69
|
+
After journal creation, cutover proves both routes with the successor credential and
|
|
70
|
+
drains the source edge through the target gateway. Finalize retires the retained
|
|
71
|
+
source after the predecessor grace cutoff. Return to an earlier endpoint requires a
|
|
72
|
+
new owner rotation and a new forward cutover. Each phase requires a fresh
|
|
73
|
+
`--exclusive-edge` assertion because unmanaged publishers cannot be enumerated.
|
|
74
|
+
|
|
75
|
+
- Gateway-only HTTP 2.1 endpoint-migration challenge operations. An active issuer and
|
|
76
|
+
direct active successor use a 64-character challenge bound to the immutable gateway
|
|
77
|
+
authority UUID. PostgreSQL stores only a domain-separated commitment for at most 60
|
|
78
|
+
seconds. A consumed cross-route challenge proves that both live routes share its
|
|
79
|
+
short-lived database state. It does not authorize endpoint cutover or prove a
|
|
80
|
+
historical database move.
|
|
81
|
+
|
|
82
|
+
- A pinned, non-root gateway image and a Compose development stack with ordered
|
|
83
|
+
migration, restricted runtime-role bootstrap, health checks, private secret files,
|
|
84
|
+
and a persistent PostgreSQL volume.
|
|
85
|
+
- A Linux Compose acceptance test that provisions two temporary principals and proves
|
|
86
|
+
authority binding, delivery settlement, denied runtime access to credential hashes,
|
|
87
|
+
idempotent restart, and PostgreSQL volume persistence.
|
|
88
|
+
- A production deployment guide covering TLS, network exposure, secret separation,
|
|
89
|
+
backups, upgrade order, and schema rollback limits.
|
|
90
|
+
|
|
37
91
|
### Post-release validation and adoption
|
|
38
92
|
|
|
39
93
|
- Move the project's own normal traffic to the authenticated gateway while retaining a
|
|
40
94
|
tested legacy rollback path.
|
|
41
95
|
- Prove cross-machine claim, settlement, offline replay, and restart behavior against
|
|
42
|
-
the published package and a deployed v2 gateway. The 0.3.0 live release
|
|
43
|
-
startup, private mailbox sends, caller-scoped history, receipts, and
|
|
44
|
-
through the legacy compatibility backend
|
|
96
|
+
the published package and a deployed v2 gateway. The historical 0.3.0 live release
|
|
97
|
+
check covered startup, private mailbox sends, caller-scoped history, receipts, and
|
|
98
|
+
client restart through the legacy compatibility backend. It did not prove
|
|
99
|
+
gateway-only behavior.
|
|
45
100
|
- Replace remaining direct legacy table pollers with the v2 cursor protocol.
|
|
46
101
|
- Confirm the README, npm metadata, GitHub metadata, release notes, and package contents
|
|
47
102
|
match the released artifact.
|
|
@@ -50,9 +105,6 @@ published and the supported clients pass a fresh end-to-end check.
|
|
|
50
105
|
|
|
51
106
|
### Installation and operations
|
|
52
107
|
|
|
53
|
-
- Add client repair, update, uninstall, and registration diagnostics.
|
|
54
|
-
- Provide a Compose-based development deployment and a production deployment guide.
|
|
55
|
-
- Add endpoint migration tooling that does not strand an existing SQLite outbox.
|
|
56
108
|
- Publish a maintained client compatibility matrix.
|
|
57
109
|
|
|
58
110
|
### Storage lifecycle and observability
|