@axiom-lattice/protocols 4.5.0 → 4.6.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @axiom-lattice/protocols@4.5.0 build /home/runner/work/agentic/agentic/packages/protocols
2
+ > @axiom-lattice/protocols@4.6.0 build /home/runner/work/agentic/agentic/packages/protocols
3
3
  > tsup src/index.ts --format cjs,esm --dts --sourcemap
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -8,13 +8,13 @@
8
8
  CLI Target: es2020
9
9
  CJS Build start
10
10
  ESM Build start
11
- CJS dist/index.js 45.77 KB
12
- CJS dist/index.js.map 166.43 KB
13
- CJS ⚡️ Build success in 496ms
14
- ESM dist/index.mjs 41.17 KB
15
- ESM dist/index.mjs.map 162.75 KB
16
- ESM ⚡️ Build success in 519ms
11
+ CJS dist/index.js 46.24 KB
12
+ CJS dist/index.js.map 187.63 KB
13
+ CJS ⚡️ Build success in 270ms
14
+ ESM dist/index.mjs 41.58 KB
15
+ ESM dist/index.mjs.map 183.90 KB
16
+ ESM ⚡️ Build success in 270ms
17
17
  DTS Build start
18
- DTS ⚡️ Build success in 12748ms
19
- DTS dist/index.d.ts 221.93 KB
20
- DTS dist/index.d.mts 221.93 KB
18
+ DTS ⚡️ Build success in 7655ms
19
+ DTS dist/index.d.ts 243.17 KB
20
+ DTS dist/index.d.mts 243.17 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # @axiom-lattice/protocols
2
2
 
3
+ ## 4.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6e07f01: Add a tenant-scoped model provider catalog.
8
+
9
+ Model lists were a process-wide in-memory registry: every model lived under
10
+ `models:default:{key}`, nothing was persisted, and `GET /api/models` returned
11
+ each model's `apiKey` in plaintext to any caller.
12
+
13
+ A tenant owner/admin can now register an upstream provider (base URL + API key),
14
+ run discovery against `{baseURL}/v1/models`, and see a tenant-isolated model
15
+ catalog. See ADR-138 for the full decision record.
16
+
17
+ Key points:
18
+
19
+ - **`modelKey` is `${providerId}/${modelId}`.** The same upstream model id
20
+ offered by two providers is two independent models — the real case being a
21
+ tenant running OpenAI direct and Azure OpenAI side by side. The provider id is
22
+ immutable, so renaming a provider never invalidates a key already stored in
23
+ agent or eval configuration.
24
+ - **Credentials never leave the server.** The API key is stored AES-256-GCM
25
+ encrypted and responses carry only `hasApiKey` / `apiKeyHint`. An omitted or
26
+ empty `apiKey` on update keeps the stored value.
27
+ - **Tenant scope comes from the authenticated session only**, never from the
28
+ request body, and writes require a tenant owner/admin role. A provider
29
+ belonging to another tenant is indistinguishable from a missing one (404).
30
+ - **Upstream URLs are validated** before any outbound request: http(s) only, no
31
+ embedded credentials, and private/loopback/link-local/CGNAT addresses are
32
+ rejected. Discovery does not follow redirects, times out after 8s, and never
33
+ echoes the upstream body in an error.
34
+ - **Discovery is explicit.** `POST /api/model-providers/:id/discover` refreshes a
35
+ persisted snapshot; the catalog endpoints never make outbound calls, so an
36
+ upstream outage leaves the list intact.
37
+
38
+ Phase 1 registers discovered models for execution only for the `default` tenant,
39
+ whose registry keys are byte-identical to the previous key-only API. Other
40
+ tenants get the catalog but their models report `executable: false`. Registering
41
+ them would let one tenant's model silently overwrite another's, sending the
42
+ second tenant's agents to the first tenant's upstream with the first tenant's
43
+ credentials.
44
+
45
+ **Contract changes on the legacy endpoints** (breaking for any consumer of
46
+ `GET /api/models`):
47
+
48
+ - `GET /api/models` no longer returns `apiKey`; it returns `hasApiKey` instead,
49
+ and is now scoped to the `default` tenant rather than enumerating all of them.
50
+ - `PUT /api/models` treats an empty `apiKey` as "keep the existing key". Without
51
+ this, the first save after the change above would clear every stored key.
52
+
53
+ The console UI ships the matching change, so a react-sdk built from this version
54
+ must be deployed together with this gateway.
55
+
3
56
  ## 4.5.0
4
57
 
5
58
  ### Minor Changes