inamprotocol 0.8.0 → 0.9.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.
@@ -29,3 +29,21 @@ export interface DisputeCheckable {
29
29
  }
30
30
  export declare function hasUsedDisputeRight(receipt: DisputeCheckable, callerDid: string): boolean;
31
31
  export declare function isDisputeActive(receipt: DisputeCheckable, now?: number): boolean;
32
+ /**
33
+ * SPEC.md §4.3 (v0.31): `dispute.windowClosesAt` is null until a receipt is
34
+ * countersigned. Read it through this helper instead of `new Date(...)`:
35
+ * `new Date(null)` is 1970-01-01, which a caller could mistake for a real,
36
+ * long-closed window. Returns null for null, missing, or unparseable values
37
+ * (including the "" that pre-v0.31 registries returned for drafts).
38
+ */
39
+ export declare function disputeWindowClosesAt(receipt: {
40
+ dispute: {
41
+ windowClosesAt?: string | null;
42
+ };
43
+ }): Date | null;
44
+ /** True only while a dispute window exists and hasn't closed yet. A draft has no window, so it's false. */
45
+ export declare function isDisputeWindowOpen(receipt: {
46
+ dispute: {
47
+ windowClosesAt?: string | null;
48
+ };
49
+ }, now?: number): boolean;
@@ -29,4 +29,23 @@ export function isDisputeActive(receipt, now = Date.now()) {
29
29
  return true;
30
30
  return now < new Date(receipt.dispute.resolutionDeadline).getTime();
31
31
  }
32
+ /**
33
+ * SPEC.md §4.3 (v0.31): `dispute.windowClosesAt` is null until a receipt is
34
+ * countersigned. Read it through this helper instead of `new Date(...)`:
35
+ * `new Date(null)` is 1970-01-01, which a caller could mistake for a real,
36
+ * long-closed window. Returns null for null, missing, or unparseable values
37
+ * (including the "" that pre-v0.31 registries returned for drafts).
38
+ */
39
+ export function disputeWindowClosesAt(receipt) {
40
+ const raw = receipt.dispute.windowClosesAt;
41
+ if (!raw)
42
+ return null;
43
+ const date = new Date(raw);
44
+ return Number.isNaN(date.getTime()) ? null : date;
45
+ }
46
+ /** True only while a dispute window exists and hasn't closed yet. A draft has no window, so it's false. */
47
+ export function isDisputeWindowOpen(receipt, now = Date.now()) {
48
+ const closesAt = disputeWindowClosesAt(receipt);
49
+ return closesAt !== null && now < closesAt.getTime();
50
+ }
32
51
  //# sourceMappingURL=disputeLifecycle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"disputeLifecycle.js","sourceRoot":"","sources":["../../src/core/disputeLifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAWH,MAAM,UAAU,mBAAmB,CAAC,OAAyB,EAAE,SAAiB;IAC9E,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAyB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACjF,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACrF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"disputeLifecycle.js","sourceRoot":"","sources":["../../src/core/disputeLifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAWH,MAAM,UAAU,mBAAmB,CAAC,OAAyB,EAAE,SAAiB;IAC9E,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAyB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACjF,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACrF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAwD;IAC5F,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,mBAAmB,CAAC,OAAwD,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACpH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,QAAQ,KAAK,IAAI,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;AACvD,CAAC"}
@@ -33,7 +33,7 @@ export function buildSignableContent(agentAId, agentBId, input) {
33
33
  result: input.result,
34
34
  settlement: input.settlement,
35
35
  verification: input.verification,
36
- dispute: { status: "none", windowClosesAt: "" }, // placeholder, excluded from signature scope in practice
36
+ dispute: { status: "none", windowClosesAt: null }, // placeholder; every signer and verifier strips `dispute` before signing
37
37
  };
38
38
  }
39
39
  //# sourceMappingURL=receiptContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"receiptContent.js","sourceRoot":"","sources":["../../src/core/receiptContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAkB9C;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,QAAgB,EAAE,KAA0B;IAC7F,MAAM,IAAI,GAAG;QACX,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;IACF,OAAO,UAAU,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,QAAgB,EAChB,KAA0B;IAE1B,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,OAAO;QACL,cAAc,EAAE,KAAK;QACrB,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,yDAAyD;KAC3G,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"receiptContent.js","sourceRoot":"","sources":["../../src/core/receiptContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAkB9C;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,QAAgB,EAAE,KAA0B;IAC7F,MAAM,IAAI,GAAG;QACX,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;IACF,OAAO,UAAU,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,QAAgB,EAChB,KAA0B;IAE1B,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,OAAO;QACL,cAAc,EAAE,KAAK;QACrB,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,yEAAyE;KAC7H,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export { generateP256Keypair, p256Sign, p256Verify, type P256Keypair } from "./c
4
4
  export { generateSecp256k1Keypair, secp256k1Sign, secp256k1Verify, ethAddressFromUncompressedPublicKey, ethPersonalSignDigest, type Secp256k1Keypair, } from "./crypto/secp256k1.js";
5
5
  export { canonicalize } from "./crypto/canonical.js";
6
6
  export { computeReceiptId, buildSignableContent, type ReceiptContentInput } from "./core/receiptContent.js";
7
+ export { disputeWindowClosesAt, isDisputeWindowOpen } from "./core/disputeLifecycle.js";
7
8
  export { computeVerificationId, buildSignableVerificationContent, type VerificationContentInput } from "./core/verificationContent.js";
8
9
  export { verifyInclusion, verifyConsistency } from "./core/merkleLog.js";
9
10
  export { type TransparencyEntryType } from "./core/transparencyLog.js";
package/dist/index.js CHANGED
@@ -4,6 +4,9 @@ export { generateP256Keypair, p256Sign, p256Verify } from "./crypto/p256.js";
4
4
  export { generateSecp256k1Keypair, secp256k1Sign, secp256k1Verify, ethAddressFromUncompressedPublicKey, ethPersonalSignDigest, } from "./crypto/secp256k1.js";
5
5
  export { canonicalize } from "./crypto/canonical.js";
6
6
  export { computeReceiptId, buildSignableContent } from "./core/receiptContent.js";
7
+ // Dispute-window helpers (SPEC.md §4.3, v0.31). Use these instead of
8
+ // new Date(receipt.dispute.windowClosesAt): the field is null on drafts.
9
+ export { disputeWindowClosesAt, isDisputeWindowOpen } from "./core/disputeLifecycle.js";
7
10
  export { computeVerificationId, buildSignableVerificationContent } from "./core/verificationContent.js";
8
11
  // Transparency log (audit round-2 item 6, RFC 6962-style Merkle log): pure
9
12
  // verification functions, so a caller can verify an inclusion/consistency
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,IAAI,EACJ,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,UAAU,EACV,KAAK,EACL,OAAO,GAER,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,mCAAmC,EACnC,qBAAqB,GAEtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAA4B,MAAM,0BAA0B,CAAC;AAE5G,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAiC,MAAM,+BAA+B,CAAC;AAEvI,2EAA2E;AAC3E,0EAA0E;AAC1E,sEAAsE;AACtE,0CAA0C;AAC1C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,4EAA4E;AAC5E,2EAA2E;AAC3E,sEAAsE;AACtE,wEAAwE;AACxE,oEAAoE;AACpE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,IAAI,EACJ,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,UAAU,EACV,KAAK,EACL,OAAO,GAER,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,mCAAmC,EACnC,qBAAqB,GAEtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAA4B,MAAM,0BAA0B,CAAC;AAE5G,qEAAqE;AACrE,yEAAyE;AACzE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAExF,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAiC,MAAM,+BAA+B,CAAC;AAEvI,2EAA2E;AAC3E,0EAA0E;AAC1E,sEAAsE;AACtE,0CAA0C;AAC1C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,4EAA4E;AAC5E,2EAA2E;AAC3E,sEAAsE;AACtE,wEAAwE;AACxE,oEAAoE;AACpE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -113,7 +113,8 @@ export interface ExecutionReceipt {
113
113
  dispute: {
114
114
  status: DisputeStatus;
115
115
  reason?: string;
116
- windowClosesAt: string;
116
+ /** null while the receipt is a draft; set when it is countersigned (SPEC §4.3). */
117
+ windowClosesAt: string | null;
117
118
  openedBy?: string;
118
119
  resolvedAt?: string;
119
120
  resolution?: string;
@@ -141,7 +142,7 @@ export interface ExecutionReceipt {
141
142
  export type SignableReceiptContent = Omit<ExecutionReceipt, "signatures" | "status" | "dispute"> & {
142
143
  dispute: {
143
144
  status: "none";
144
- windowClosesAt: string;
145
+ windowClosesAt: null;
145
146
  };
146
147
  };
147
148
  /** Weighted receipt count/success-rate/volume for one side of an agent's
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inamprotocol",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Reference TypeScript/JavaScript SDK for the INAM Protocol — agent identity, execution receipts, jobs, and reputation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",