@empressaio/atom-contract 1.18.0 → 1.20.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.
@@ -0,0 +1,119 @@
1
+ import { z } from "zod";
2
+ import { REASONING_CHAIN_OBSERVED_SCHEMA } from "../reasoning-chain.js";
3
+ import { PARCEL_NODE_ID_PATTERN, PROPERTY_ACCESS_POLICY_SCHEMA, PROPERTY_ATOM_TIER, PROPERTY_DEFAULT_ACCESS_POLICY, PROPERTY_QUALITY_GATE_FIELDS, PROPERTY_READ_CONTRACT_SCHEMA, SITE_LAYER_PROVENANCE_FIELDS, SITE_LAYER_VERIFIED_ABSENCE_SCHEMA, SPECIAL_DISTRICT_ABSENCE_SCHEMA, SPECIAL_DISTRICT_MEMBERSHIP_BASIS_SCHEMA, SPECIAL_DISTRICT_SOURCE_TIER_SCHEMA, SPECIAL_DISTRICT_TAX_RATE_SCHEMA, } from "./common.js";
4
+ export const SPECIAL_DISTRICT_FACT_SCHEMA = z
5
+ .object({
6
+ entityType: z.literal("special-district-fact"),
7
+ atomDid: z
8
+ .string()
9
+ .min(1)
10
+ .refine((val) => /^sdfact_[0-9a-f]{16}$/.test(val), {
11
+ message: "atomDid must be in format sdfact_<16-hex-chars>",
12
+ }),
13
+ parcelNodeId: z
14
+ .string()
15
+ .min(1)
16
+ .refine((val) => PARCEL_NODE_ID_PATTERN.test(val), {
17
+ message: "parcelNodeId must match {county_fips}:{prop_id}",
18
+ }),
19
+ reasoningChain: REASONING_CHAIN_OBSERVED_SCHEMA,
20
+ sourceTier: SPECIAL_DISTRICT_SOURCE_TIER_SCHEMA,
21
+ districtName: z.string().min(1).optional(),
22
+ districtId: z.string().min(1).optional(),
23
+ districtType: z.string().min(1).optional(),
24
+ countyFips: z
25
+ .string()
26
+ .min(5)
27
+ .max(5)
28
+ .regex(/^\d{5}$/)
29
+ .optional(),
30
+ membershipBasis: SPECIAL_DISTRICT_MEMBERSHIP_BASIS_SCHEMA.optional(),
31
+ taxRate: SPECIAL_DISTRICT_TAX_RATE_SCHEMA.optional(),
32
+ absence: SPECIAL_DISTRICT_ABSENCE_SCHEMA.optional(),
33
+ verifiedAbsence: SITE_LAYER_VERIFIED_ABSENCE_SCHEMA.optional(),
34
+ accessPolicy: PROPERTY_ACCESS_POLICY_SCHEMA,
35
+ ...PROPERTY_QUALITY_GATE_FIELDS,
36
+ ...SITE_LAYER_PROVENANCE_FIELDS,
37
+ atomTier: z.literal(PROPERTY_ATOM_TIER),
38
+ readContract: PROPERTY_READ_CONTRACT_SCHEMA.optional(),
39
+ })
40
+ .superRefine((data, ctx) => {
41
+ const hasAbsence = data.absence !== undefined;
42
+ const isAbsentTier = data.sourceTier === "absent";
43
+ const hasDistrictClaim = data.districtName !== undefined ||
44
+ data.districtId !== undefined ||
45
+ data.districtType !== undefined;
46
+ if (data.accessPolicy !== PROPERTY_DEFAULT_ACCESS_POLICY) {
47
+ ctx.addIssue({
48
+ code: z.ZodIssueCode.custom,
49
+ message: "special-district-fact must use accessPolicy public-free",
50
+ path: ["accessPolicy"],
51
+ });
52
+ }
53
+ if (hasDistrictClaim && hasAbsence) {
54
+ ctx.addIssue({
55
+ code: z.ZodIssueCode.custom,
56
+ message: "district fields and absence are mutually exclusive",
57
+ path: ["absence"],
58
+ });
59
+ }
60
+ if (isAbsentTier) {
61
+ if (!data.verifiedAbsence) {
62
+ ctx.addIssue({
63
+ code: z.ZodIssueCode.custom,
64
+ message: "sourceTier absent requires verifiedAbsence (evaluated + provenanceScope)",
65
+ path: ["verifiedAbsence"],
66
+ });
67
+ }
68
+ if (hasDistrictClaim || data.membershipBasis !== undefined) {
69
+ ctx.addIssue({
70
+ code: z.ZodIssueCode.custom,
71
+ message: "sourceTier absent must not carry district membership fields",
72
+ path: ["sourceTier"],
73
+ });
74
+ }
75
+ }
76
+ else if (hasAbsence) {
77
+ if (hasDistrictClaim || data.membershipBasis !== undefined) {
78
+ ctx.addIssue({
79
+ code: z.ZodIssueCode.custom,
80
+ message: "absence must not coexist with district membership fields",
81
+ path: ["absence"],
82
+ });
83
+ }
84
+ if (data.taxRate !== undefined) {
85
+ ctx.addIssue({
86
+ code: z.ZodIssueCode.custom,
87
+ message: "absence must not carry taxRate enrichment",
88
+ path: ["taxRate"],
89
+ });
90
+ }
91
+ }
92
+ else {
93
+ if (!data.districtId || !data.districtName || !data.districtType) {
94
+ ctx.addIssue({
95
+ code: z.ZodIssueCode.custom,
96
+ message: "present tier requires districtId, districtName, and districtType",
97
+ path: ["districtId"],
98
+ });
99
+ }
100
+ if (data.membershipBasis !== "point-in-polygon") {
101
+ ctx.addIssue({
102
+ code: z.ZodIssueCode.custom,
103
+ message: "present tier requires membershipBasis point-in-polygon (binary PIP only — no proximity)",
104
+ path: ["membershipBasis"],
105
+ });
106
+ }
107
+ if (!data.countyFips) {
108
+ ctx.addIssue({
109
+ code: z.ZodIssueCode.custom,
110
+ message: "present tier requires countyFips",
111
+ path: ["countyFips"],
112
+ });
113
+ }
114
+ }
115
+ });
116
+ export function createSpecialDistrictFact(input) {
117
+ return SPECIAL_DISTRICT_FACT_SCHEMA.parse(input);
118
+ }
119
+ //# sourceMappingURL=special-district-fact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"special-district-fact.js","sourceRoot":"","sources":["../../src/property/special-district-fact.ts"],"names":[],"mappings":"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"}
@@ -422,9 +422,9 @@ export declare const WELL_FACT_SCHEMA: z.ZodEffects<z.ZodObject<{
422
422
  provenanceScope: string[];
423
423
  } | undefined;
424
424
  sourceVintage?: string | undefined;
425
+ operatorName?: string | undefined;
425
426
  wellStatus?: "dry" | "producing" | "permitted" | "plugged-abandoned" | undefined;
426
427
  orphaned?: boolean | undefined;
427
- operatorName?: string | undefined;
428
428
  parcelRelation?: "on-parcel" | "near-parcel" | undefined;
429
429
  proximityRadiusMeters?: number | undefined;
430
430
  proximityDistanceMeters?: number | undefined;
@@ -501,9 +501,9 @@ export declare const WELL_FACT_SCHEMA: z.ZodEffects<z.ZodObject<{
501
501
  provenanceScope: string[];
502
502
  } | undefined;
503
503
  sourceVintage?: string | undefined;
504
+ operatorName?: string | undefined;
504
505
  wellStatus?: "dry" | "producing" | "permitted" | "plugged-abandoned" | undefined;
505
506
  orphaned?: boolean | undefined;
506
- operatorName?: string | undefined;
507
507
  parcelRelation?: "on-parcel" | "near-parcel" | undefined;
508
508
  proximityRadiusMeters?: number | undefined;
509
509
  proximityDistanceMeters?: number | undefined;
@@ -580,9 +580,9 @@ export declare const WELL_FACT_SCHEMA: z.ZodEffects<z.ZodObject<{
580
580
  provenanceScope: string[];
581
581
  } | undefined;
582
582
  sourceVintage?: string | undefined;
583
+ operatorName?: string | undefined;
583
584
  wellStatus?: "dry" | "producing" | "permitted" | "plugged-abandoned" | undefined;
584
585
  orphaned?: boolean | undefined;
585
- operatorName?: string | undefined;
586
586
  parcelRelation?: "on-parcel" | "near-parcel" | undefined;
587
587
  proximityRadiusMeters?: number | undefined;
588
588
  proximityDistanceMeters?: number | undefined;
@@ -659,9 +659,9 @@ export declare const WELL_FACT_SCHEMA: z.ZodEffects<z.ZodObject<{
659
659
  provenanceScope: string[];
660
660
  } | undefined;
661
661
  sourceVintage?: string | undefined;
662
+ operatorName?: string | undefined;
662
663
  wellStatus?: "dry" | "producing" | "permitted" | "plugged-abandoned" | undefined;
663
664
  orphaned?: boolean | undefined;
664
- operatorName?: string | undefined;
665
665
  parcelRelation?: "on-parcel" | "near-parcel" | undefined;
666
666
  proximityRadiusMeters?: number | undefined;
667
667
  proximityDistanceMeters?: number | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empressaio/atom-contract",
3
- "version": "1.18.0",
3
+ "version": "1.20.0",
4
4
  "description": "The typed-data substrate every Empressa atom satisfies: identity, context interface, composition declaration, and history anchoring. Peer to the Hauska SDK (`@hauska-sdk/*`); consumed directly by every product surface and MCP server.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",