@integraledger/lcp-placement-visa-tap 0.9.0 → 0.10.1
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 +33 -0
- package/README.md +8 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +9 -1
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +9 -1
- package/dist/manifest.js.map +1 -1
- package/dist/placement.d.ts +2 -1
- package/dist/placement.d.ts.map +1 -1
- package/dist/placement.js +4 -3
- package/dist/placement.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -1
- package/src/manifest.ts +9 -1
- package/src/placement.ts +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# @integraledger/lcp-placement-visa-tap
|
|
2
2
|
|
|
3
|
+
## 0.10.1
|
|
4
|
+
|
|
5
|
+
**0.10.0 was staged and withdrawn before approval; this is that release, re-cut.** The conformance corpus
|
|
6
|
+
was re-sealed after 0.10.0 was staged — its root moved `32fa90a6…` → `28bbf4ef…` when the vector tree was
|
|
7
|
+
brought inside the prose gates — so the staged `lcp-conformance` tarball carried a seal that no longer
|
|
8
|
+
matched the repository. The seal is what proves corpus authenticity to an independent implementer, and a
|
|
9
|
+
published version cannot be replaced, so the whole set was rejected and re-cut rather than shipping one
|
|
10
|
+
package that disagreed with its own source. No version 0.10.0 exists on the registry.
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- 3f2d2e3: **Breaking, two wire identities and one exported name.**
|
|
15
|
+
|
|
16
|
+
`LCP_CAPABILITY_NAME` is now `com.integraledger.legal_context` (was `com.integraledger.legal-context`), and
|
|
17
|
+
`LCP_TERMS_HASH_SUFFIX` is now `lcp_terms_hash` (was `lcp-terms-hash`). Both go on a counterparty's wire, and
|
|
18
|
+
both were hyphenated where the host they are written into spells its own vocabulary with underscores
|
|
19
|
+
throughout — UCP (`dev.ucp.shopping.checkout`, `com.example.policy.price_match`) and Verifiable Intent (all
|
|
20
|
+
eight registered constraint types). Our own UCP `policies[]` carrier already used underscores, so one
|
|
21
|
+
deployment identity was spelled two ways. No host forces either spelling, which is why the house had to rule
|
|
22
|
+
it: **follow the vocabulary you are writing into.** `LEGAL_CONTEXT_WELL_KNOWN_PATH` keeps its hyphen for the
|
|
23
|
+
same reason — RFC 8615 well-known names are hyphenated.
|
|
24
|
+
|
|
25
|
+
`VISA_TAP_PLACEMENT_TIER_A` is renamed `VISA_TAP_PLACEMENT`, matching every sibling placement. The tier is a
|
|
26
|
+
manifest field because it can move; an identifier carrying the answer could only be corrected by a breaking
|
|
27
|
+
rename, which is the hazard `placement-mastercard-vi` states as `tier: "B"` IS A LABEL, NOT A GATE.
|
|
28
|
+
|
|
29
|
+
The conformance corpus is re-sealed: root `32fa90a62eb83930…`, 812/812 across 44 areas, unchanged in size.
|
|
30
|
+
Twenty-two cases pinned the old spellings and were updated; the retired spelling survives deliberately in
|
|
31
|
+
`binding-core`'s kit fixtures, where it is sample input to container-validation cases cut against v1.37
|
|
32
|
+
§C.3's `extensions` shape and asserts nothing about this deployment's identity.
|
|
33
|
+
|
|
34
|
+
`minor` rather than `major` because these packages are pre-1.0, where minor is the breaking increment.
|
|
35
|
+
|
|
3
36
|
## 0.9.0
|
|
4
37
|
|
|
5
38
|
First public release.
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ npm install @integraledger/lcp-placement-visa-tap
|
|
|
24
24
|
## Use
|
|
25
25
|
|
|
26
26
|
```ts
|
|
27
|
-
import {
|
|
27
|
+
import { VISA_TAP_PLACEMENT, visaTapPlacement } from "@integraledger/lcp-placement-visa-tap";
|
|
28
28
|
|
|
29
29
|
declare const request: { headers: Record<string, string> }; // the TAP request, as received
|
|
30
30
|
|
|
@@ -62,7 +62,10 @@ claims were put to the spec, and all three hold:
|
|
|
62
62
|
silently replaceable while *looking* bound to a reader, which is strictly worse than an honestly
|
|
63
63
|
advertised header.
|
|
64
64
|
|
|
65
|
-
**Drift against LCP
|
|
65
|
+
**Drift against LCP §C.6: none material, and v1.38 closed the one wording gap.** v1.37 §C.6 did not name
|
|
66
|
+
TAP's RFC 9421 signature parameters; v1.38 does — `created`, `expires`, `keyid`, `alg`, `nonce`, `tag`,
|
|
67
|
+
noting `keyid` rather than `kid` and what `tag` distinguishes — which is the distinction this package draws
|
|
68
|
+
below. The appendix is an illustration; the host spec is binding
|
|
66
69
|
— the host's live specification is what binds. §C.6's description of the covered components, the body-object quartet and the nonce-match rule all
|
|
67
70
|
survive the live read. Two notes for the record: the covered-component limitation is stated for the agent
|
|
68
71
|
recognition signature in the specification and repeated for the reference implementation, so it is the
|
|
@@ -95,9 +98,9 @@ HTTP-Layer Advisory, which is exactly what an uncovered header is.
|
|
|
95
98
|
|
|
96
99
|
## The surface is deliberately two exports
|
|
97
100
|
|
|
98
|
-
`visaTapPlacement` is `makePlacement(
|
|
101
|
+
`visaTapPlacement` is `makePlacement(VISA_TAP_PLACEMENT)` — `makePlacement` comes from
|
|
99
102
|
[`@integraledger/lcp-binding-core`](../binding-core#readme) — and nothing else — the manifest *is* the
|
|
100
|
-
adapter
|
|
103
|
+
adapter. Both members are total: a refusal is a returned value, never a thrown exception.
|
|
101
104
|
|
|
102
105
|
**There is no helper here that builds an unsigned sibling body object, and a test pins the export set so
|
|
103
106
|
there never is.** That helper is the single worst thing this package could ship: a body sibling carrying the
|
|
@@ -137,7 +140,7 @@ reach and reads with an honest `not-attempted` at settlement-enumeration.
|
|
|
137
140
|
## Provenance
|
|
138
141
|
|
|
139
142
|
Cut against the Visa TAP specification at Visa Developer and RFC 9421, gate discharged **2026-07-30**, and
|
|
140
|
-
reconciled against LCP v1.37 §C.6 the same day.
|
|
143
|
+
reconciled against LCP v1.37 §C.6 the same day, and re-read against **v1.38 §C.6** on 2026-08-12.
|
|
141
144
|
|
|
142
145
|
---
|
|
143
146
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/manifest.d.ts
CHANGED
|
@@ -47,6 +47,14 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
|
|
|
47
47
|
* The container is `header-map`, the only one in the placement set: RFC 9110 field names compare
|
|
48
48
|
* case-insensitively, so the kit folds case on read and reuses an existing key's casing on write. Neither is
|
|
49
49
|
* a heuristic — it is what reading and writing an HTTP field map correctly means.
|
|
50
|
+
*
|
|
51
|
+
* **THE TIER IS NOT IN THE NAME, AND THAT IS DELIBERATE.** This constant was `VISA_TAP_PLACEMENT_TIER_A`.
|
|
52
|
+
* The tier is a manifest FIELD precisely because it can move: Tier A here rests on a specific reading —
|
|
53
|
+
* that TAP's `Signature-Input` covers exactly `"@authority" "@path"`, so a custom header is uncovered and a
|
|
54
|
+
* stock verifier tolerates it. If TAP widens that coverage the field below changes, and an identifier
|
|
55
|
+
* carrying the old answer could only be corrected by a breaking rename. It is the same hazard
|
|
56
|
+
* `placement-mastercard-vi` states in capitals — `tier: "B"` IS A LABEL, NOT A GATE — one level up, at the
|
|
57
|
+
* API. Every sibling placement exports `<PROTOCOL>_PLACEMENT`; this one now does too.
|
|
50
58
|
*/
|
|
51
|
-
export declare const
|
|
59
|
+
export declare const VISA_TAP_PLACEMENT: PlacementManifest;
|
|
52
60
|
//# sourceMappingURL=manifest.d.ts.map
|
package/dist/manifest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,eAAO,MAAM,kBAAkB,EAAE,iBAUhC,CAAC"}
|
package/dist/manifest.js
CHANGED
|
@@ -46,8 +46,16 @@
|
|
|
46
46
|
* The container is `header-map`, the only one in the placement set: RFC 9110 field names compare
|
|
47
47
|
* case-insensitively, so the kit folds case on read and reuses an existing key's casing on write. Neither is
|
|
48
48
|
* a heuristic — it is what reading and writing an HTTP field map correctly means.
|
|
49
|
+
*
|
|
50
|
+
* **THE TIER IS NOT IN THE NAME, AND THAT IS DELIBERATE.** This constant was `VISA_TAP_PLACEMENT_TIER_A`.
|
|
51
|
+
* The tier is a manifest FIELD precisely because it can move: Tier A here rests on a specific reading —
|
|
52
|
+
* that TAP's `Signature-Input` covers exactly `"@authority" "@path"`, so a custom header is uncovered and a
|
|
53
|
+
* stock verifier tolerates it. If TAP widens that coverage the field below changes, and an identifier
|
|
54
|
+
* carrying the old answer could only be corrected by a breaking rename. It is the same hazard
|
|
55
|
+
* `placement-mastercard-vi` states in capitals — `tier: "B"` IS A LABEL, NOT A GATE — one level up, at the
|
|
56
|
+
* API. Every sibling placement exports `<PROTOCOL>_PLACEMENT`; this one now does too.
|
|
49
57
|
*/
|
|
50
|
-
export const
|
|
58
|
+
export const VISA_TAP_PLACEMENT = {
|
|
51
59
|
protocol: "visa-tap",
|
|
52
60
|
pattern: "http-advisory",
|
|
53
61
|
tier: "A",
|
package/dist/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;IACjC,KAAK,EAAE,oBAAoB;IAC3B,YAAY,EAAE,CAAC,QAAQ,CAAC;IACxB,OAAO,EACL,wJAAwJ;CAC3J,CAAC"}
|
package/dist/placement.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ReferencePlacementAdapter } from "@integraledger/lcp-binding-core";
|
|
2
2
|
/**
|
|
3
|
-
* The Visa TAP reference placement. The manifest IS the adapter
|
|
3
|
+
* The Visa TAP reference placement. The manifest IS the adapter — `binding-core`'s kit needs nothing else
|
|
4
|
+
* here, and that
|
|
4
5
|
* is a claim about the protocol, not brevity for its own sake.
|
|
5
6
|
*
|
|
6
7
|
* `header-map` supplies every mechanic this placement needs: the RFC 9110 case fold on read, the
|
package/dist/placement.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,iCAAiC,CAAC;AAGzC
|
|
1
|
+
{"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,iCAAiC,CAAC;AAGzC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gBAAgB,EAAE,yBACI,CAAC"}
|
package/dist/placement.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { makePlacement, } from "@integraledger/lcp-binding-core";
|
|
2
|
-
import {
|
|
2
|
+
import { VISA_TAP_PLACEMENT } from "./manifest.js";
|
|
3
3
|
/**
|
|
4
|
-
* The Visa TAP reference placement. The manifest IS the adapter
|
|
4
|
+
* The Visa TAP reference placement. The manifest IS the adapter — `binding-core`'s kit needs nothing else
|
|
5
|
+
* here, and that
|
|
5
6
|
* is a claim about the protocol, not brevity for its own sake.
|
|
6
7
|
*
|
|
7
8
|
* `header-map` supplies every mechanic this placement needs: the RFC 9110 case fold on read, the
|
|
@@ -17,5 +18,5 @@ import { VISA_TAP_PLACEMENT_TIER_A } from "./manifest.js";
|
|
|
17
18
|
* would make the header any more bound than it is. The export set is pinned by a test for the related
|
|
18
19
|
* reason — no helper here may build an unsigned sibling body object.
|
|
19
20
|
*/
|
|
20
|
-
export const visaTapPlacement = makePlacement(
|
|
21
|
+
export const visaTapPlacement = makePlacement(VISA_TAP_PLACEMENT);
|
|
21
22
|
//# sourceMappingURL=placement.js.map
|
package/dist/placement.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placement.js","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,GAEd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"placement.js","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,GAEd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,aAAa,CAAC,kBAAkB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@integraledger/lcp-placement-visa-tap",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Places an LCP reference into a Visa TAP request. The header sits outside TAP's signature.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lcp",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
},
|
|
42
42
|
"homepage": "https://github.com/IntegraLedger/integra-protocol/tree/main/packages/placement-visa-tap#readme",
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@integraledger/lcp-binding-core": "0.
|
|
44
|
+
"@integraledger/lcp-binding-core": "0.10.1"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@cfworker/json-schema": "4.1.1",
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { VISA_TAP_PLACEMENT } from "./manifest.js";
|
|
2
2
|
export { visaTapPlacement } from "./placement.js";
|
package/src/manifest.ts
CHANGED
|
@@ -48,8 +48,16 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
|
|
|
48
48
|
* The container is `header-map`, the only one in the placement set: RFC 9110 field names compare
|
|
49
49
|
* case-insensitively, so the kit folds case on read and reuses an existing key's casing on write. Neither is
|
|
50
50
|
* a heuristic — it is what reading and writing an HTTP field map correctly means.
|
|
51
|
+
*
|
|
52
|
+
* **THE TIER IS NOT IN THE NAME, AND THAT IS DELIBERATE.** This constant was `VISA_TAP_PLACEMENT_TIER_A`.
|
|
53
|
+
* The tier is a manifest FIELD precisely because it can move: Tier A here rests on a specific reading —
|
|
54
|
+
* that TAP's `Signature-Input` covers exactly `"@authority" "@path"`, so a custom header is uncovered and a
|
|
55
|
+
* stock verifier tolerates it. If TAP widens that coverage the field below changes, and an identifier
|
|
56
|
+
* carrying the old answer could only be corrected by a breaking rename. It is the same hazard
|
|
57
|
+
* `placement-mastercard-vi` states in capitals — `tier: "B"` IS A LABEL, NOT A GATE — one level up, at the
|
|
58
|
+
* API. Every sibling placement exports `<PROTOCOL>_PLACEMENT`; this one now does too.
|
|
51
59
|
*/
|
|
52
|
-
export const
|
|
60
|
+
export const VISA_TAP_PLACEMENT: PlacementManifest = {
|
|
53
61
|
protocol: "visa-tap",
|
|
54
62
|
pattern: "http-advisory",
|
|
55
63
|
tier: "A",
|
package/src/placement.ts
CHANGED
|
@@ -2,10 +2,11 @@ import {
|
|
|
2
2
|
makePlacement,
|
|
3
3
|
type ReferencePlacementAdapter,
|
|
4
4
|
} from "@integraledger/lcp-binding-core";
|
|
5
|
-
import {
|
|
5
|
+
import { VISA_TAP_PLACEMENT } from "./manifest.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* The Visa TAP reference placement. The manifest IS the adapter
|
|
8
|
+
* The Visa TAP reference placement. The manifest IS the adapter — `binding-core`'s kit needs nothing else
|
|
9
|
+
* here, and that
|
|
9
10
|
* is a claim about the protocol, not brevity for its own sake.
|
|
10
11
|
*
|
|
11
12
|
* `header-map` supplies every mechanic this placement needs: the RFC 9110 case fold on read, the
|
|
@@ -21,6 +22,5 @@ import { VISA_TAP_PLACEMENT_TIER_A } from "./manifest.js";
|
|
|
21
22
|
* would make the header any more bound than it is. The export set is pinned by a test for the related
|
|
22
23
|
* reason — no helper here may build an unsigned sibling body object.
|
|
23
24
|
*/
|
|
24
|
-
export const visaTapPlacement: ReferencePlacementAdapter =
|
|
25
|
-
|
|
26
|
-
);
|
|
25
|
+
export const visaTapPlacement: ReferencePlacementAdapter =
|
|
26
|
+
makePlacement(VISA_TAP_PLACEMENT);
|