@hyperscale0/udl 3.2.0 → 4.1.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +1 -1
  3. package/dist/diagnostics.d.ts +1 -1
  4. package/dist/diagnostics.d.ts.map +1 -1
  5. package/dist/diagnostics.js +11 -1
  6. package/dist/diagnostics.js.map +1 -1
  7. package/dist/evolution.d.ts.map +1 -1
  8. package/dist/evolution.js +5 -0
  9. package/dist/evolution.js.map +1 -1
  10. package/dist/index.d.ts +2 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/instrument-references.d.ts.map +1 -1
  15. package/dist/instrument-references.js +21 -1
  16. package/dist/instrument-references.js.map +1 -1
  17. package/dist/object-contract.d.ts +144 -0
  18. package/dist/object-contract.d.ts.map +1 -0
  19. package/dist/object-contract.js +279 -0
  20. package/dist/object-contract.js.map +1 -0
  21. package/dist/reporting.d.ts +0 -1
  22. package/dist/reporting.d.ts.map +1 -1
  23. package/dist/reporting.js +0 -1
  24. package/dist/reporting.js.map +1 -1
  25. package/dist/schema.d.ts +1815 -126
  26. package/dist/schema.d.ts.map +1 -1
  27. package/dist/schema.js +100 -33
  28. package/dist/schema.js.map +1 -1
  29. package/dist/validation.d.ts +5 -2
  30. package/dist/validation.d.ts.map +1 -1
  31. package/dist/validation.js +403 -146
  32. package/dist/validation.js.map +1 -1
  33. package/docs/README.md +66 -17
  34. package/package.json +4 -4
  35. package/spec/README.md +66 -17
  36. package/spec/{darb.udl.json → cars.udl.json} +7 -7
  37. package/spec/udl.schema.json +2876 -6516
  38. package/src/diagnostics.ts +27 -1
  39. package/src/evolution.ts +8 -0
  40. package/src/index.ts +3 -0
  41. package/src/instrument-references.ts +25 -1
  42. package/src/object-contract.ts +464 -0
  43. package/src/reporting.ts +0 -1
  44. package/src/schema.ts +155 -33
  45. package/src/validation.ts +635 -174
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # UDL 4.1.0
2
+
3
+ Second-person approval is deleted: approval requirements, distinct-member rules and their diagnostics leave the schema, the object contract and validation. A document that still declares them is rejected. Permissions are unchanged. Recreate development estates.
4
+
5
+ # UDL 4.0.0
6
+
7
+ UDL 4 adds objects, attachment role bindings, action subject requirements, frozen adapter snapshots and typed object references. UDL 3 is rejected, the vehicles header is deleted from HSX, and public instrument create actions are gone. Object creation accepts optional metadata without entering an agreement; exposed attachment actions collect requirements when invoked. Recreate development estates; there is no migration reader.
8
+
1
9
  # UDL 3.2.0
2
10
 
3
11
  UDL adds a state-preserving transition target (`to: preserve`), an invoke comparison guard (`guard: { kind: compare, ... }`), an optional per-action `expansionLimit` of 8192 actions, reporting definitions, and a clock `localDay` clause (days, direction, hour, timezone).
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # UDL 3
1
+ # UDL 4
2
2
 
3
3
  Read the [language reference](docs/README.md).
4
4
 
@@ -1,4 +1,4 @@
1
- export type UdlIssueCode = "UDL1001" | "UDL1002" | "UDL1003" | "UDL1004" | "UDL2001" | "UDL2002" | "UDL2010" | "UDL3001" | "UDL4001" | "UDL5001" | "UDL7001" | "UDL7002";
1
+ export type UdlIssueCode = "subject_field_conflict" | "subject_field_unknown" | "subject_requirement_missing" | "subject_adapter_unbound" | "subject_party_unbound" | "party_name_reserved" | "party_kind_mismatch" | "staff_role_unknown" | "product_party_unbound" | "product_party_invalid" | "UDL1001" | "UDL1002" | "UDL1003" | "UDL1004" | "UDL2001" | "UDL2002" | "UDL2010" | "UDL3001" | "UDL4001" | "UDL5001" | "UDL7001" | "UDL7002";
2
2
  export interface UdlIssue {
3
3
  code: UdlIssueCode;
4
4
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AACd,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgBD,wBAAgB,KAAK,CACnB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAaV;AACD,eAAO,MAAM,cAAc;;;;;;GAMxB,CAAC;AACJ,eAAO,MAAM,aAAa,SAAU,MAAM;;;;;;aACG,CAAC"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,wBAAwB,GACxB,uBAAuB,GACvB,6BAA6B,GAC7B,yBAAyB,GACzB,uBAAuB,GACvB,qBAAqB,GACrB,qBAAqB,GACrB,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AACd,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgCD,wBAAgB,KAAK,CACnB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAaV;AACD,eAAO,MAAM,cAAc;;;;;;GAMxB,CAAC;AACJ,eAAO,MAAM,aAAa,SAAU,MAAM;;;;;;aACG,CAAC"}
@@ -1,7 +1,17 @@
1
1
  const fixes = {
2
+ subject_field_conflict: "Rename the field or use matching types and constraints.",
3
+ subject_field_unknown: "Name a declared subject requirement or object field.",
4
+ subject_requirement_missing: "Supply the required action field.",
5
+ subject_adapter_unbound: "Bind the required adapter declaration.",
6
+ subject_party_unbound: "Bind the parameter to a subject role or declared party.",
7
+ party_name_reserved: "Choose a party name other than owner, actor or operator.",
8
+ party_kind_mismatch: "Use a business or subject role for money.",
9
+ staff_role_unknown: "Use a registered staff permission role.",
10
+ product_party_unbound: "Supply the consumed business in the Build party bindings.",
11
+ product_party_invalid: "Bind a business participant in the same tenant and environment.",
2
12
  UDL1001: "Encode the source as UTF-8.",
3
13
  UDL1002: "Repair JSON syntax.",
4
- UDL1003: "Use the UDL 3 typed grammar.",
14
+ UDL1003: "Use the UDL 4 typed grammar.",
5
15
  UDL1004: "Reduce the declared structure or expansion.",
6
16
  UDL2001: "Give each declaration a distinct name.",
7
17
  UDL2002: "Repair the named type or declaration.",
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAoBA,MAAM,KAAK,GAAiC;IAC1C,OAAO,EAAE,6BAA6B;IACtC,OAAO,EAAE,qBAAqB;IAC9B,OAAO,EAAE,8BAA8B;IACvC,OAAO,EAAE,6CAA6C;IACtD,OAAO,EAAE,wCAAwC;IACjD,OAAO,EAAE,uCAAuC;IAChD,OAAO,EAAE,sDAAsD;IAC/D,OAAO,EAAE,yDAAyD;IAClE,OAAO,EACL,wEAAwE;IAC1E,OAAO,EAAE,gDAAgD;IACzD,OAAO,EAAE,4DAA4D;IACrE,OAAO,EAAE,gCAAgC;CAC1C,CAAC;AACF,MAAM,UAAU,KAAK,CACnB,IAAkB,EAClB,IAAY,EACZ,OAAe;IAEf,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC;QAChB,QAAQ,EACN,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,mBAAmB;KAC5B,CAAC;AACJ,CAAC;AACD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI;IACJ,GAAG;IACH,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,mBAAmB;IAC7B,MAAM,EAAE,UAAU;CACnB,CAAC,CAAC,CAAC;AACJ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAC5C,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AA8BA,MAAM,KAAK,GAAiC;IAC1C,sBAAsB,EACpB,yDAAyD;IAC3D,qBAAqB,EAAE,sDAAsD;IAC7E,2BAA2B,EAAE,mCAAmC;IAChE,uBAAuB,EAAE,wCAAwC;IACjE,qBAAqB,EACnB,yDAAyD;IAC3D,mBAAmB,EACjB,0DAA0D;IAC5D,mBAAmB,EAAE,2CAA2C;IAChE,kBAAkB,EAAE,yCAAyC;IAC7D,qBAAqB,EACnB,2DAA2D;IAC7D,qBAAqB,EACnB,iEAAiE;IAEnE,OAAO,EAAE,6BAA6B;IACtC,OAAO,EAAE,qBAAqB;IAC9B,OAAO,EAAE,8BAA8B;IACvC,OAAO,EAAE,6CAA6C;IACtD,OAAO,EAAE,wCAAwC;IACjD,OAAO,EAAE,uCAAuC;IAChD,OAAO,EAAE,sDAAsD;IAC/D,OAAO,EAAE,yDAAyD;IAClE,OAAO,EACL,wEAAwE;IAC1E,OAAO,EAAE,gDAAgD;IACzD,OAAO,EAAE,4DAA4D;IACrE,OAAO,EAAE,gCAAgC;CAC1C,CAAC;AACF,MAAM,UAAU,KAAK,CACnB,IAAkB,EAClB,IAAY,EACZ,OAAe;IAEf,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC;QAChB,QAAQ,EACN,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,mBAAmB;KAC5B,CAAC;AACJ,CAAC;AACD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI;IACJ,GAAG;IACH,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,mBAAmB;IAC7B,MAAM,EAAE,UAAU;CACnB,CAAC,CAAC,CAAC;AACJ,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAC5C,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"evolution.d.ts","sourceRoot":"","sources":["../src/evolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAgBxD,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,GAChB,QAAQ,EAAE,CA0BZ"}
1
+ {"version":3,"file":"evolution.d.ts","sourceRoot":"","sources":["../src/evolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAgBxD,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,GAChB,QAAQ,EAAE,CAkCZ"}
package/dist/evolution.js CHANGED
@@ -20,6 +20,11 @@ export function diffValidatedUdlEvolution(live, next) {
20
20
  for (const [name, party] of Object.entries(live.parties))
21
21
  if (stable(party) !== stable(next.parties[name]))
22
22
  refuse(`$.parties.${name}`, "a live party cannot change or disappear");
23
+ for (const object of live.objects) {
24
+ const updated = next.objects.find((o) => o.id === object.id);
25
+ if (!updated || stable(object) !== stable(updated))
26
+ refuse(`$.objects.${object.id}`, "a live object kind cannot change or disappear; recreate development estates");
27
+ }
23
28
  for (const instrument of live.instruments) {
24
29
  const updated = next.instruments.find((i) => i.id === instrument.id);
25
30
  if (!updated || stable(instrument) !== stable(updated))
@@ -1 +1 @@
1
- {"version":3,"file":"evolution.js","sourceRoot":"","sources":["../src/evolution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAiB,MAAM,kBAAkB,CAAC;AAExD,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACzE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QACpC,OAAO,CACL,GAAG;YACH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;iBAClB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;iBAChE,IAAI,CAAC,GAAG,CAAC;YACZ,GAAG,CACJ,CAAC;IACJ,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC;AAC9C,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,yBAAyB,CACvC,IAAiB,EACjB,IAAiB;IAEjB,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE,CAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;QAClE,MAAM,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACtD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,yCAAyC,CAAC,CAAC;IAC3E,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC;YACpD,MAAM,CACJ,iBAAiB,UAAU,CAAC,EAAE,EAAE,EAChC,4EAA4E,CAC7E,CAAC;IACN,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;QAC/D,MAAM,CAAC,IAAI,CACT,KAAK,CACH,SAAS,EACT,WAAW,EACX,2CAA2C,CAC5C,CACF,CAAC;IACJ,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"evolution.js","sourceRoot":"","sources":["../src/evolution.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export * from "./schema.js";
2
2
  export { parseUdl, canonicalizeUdl } from "./parser.js";
3
3
  export { serializeUdl, canonicalDigest } from "./canonical.js";
4
- export { validateUdl, assertValidUdl, resolveField, UdlError, type UdlValidationResult, } from "./validation.js";
4
+ export { validateUdl, RESERVED_OBJECT_NAMES, assertValidUdl, resolveField, resolveSubjectRequirement, UdlError, type UdlValidationResult, } from "./validation.js";
5
5
  export { issue, udlDiagnostic, udlDiagnostics, type UdlIssue, type UdlIssueCode, } from "./diagnostics.js";
6
6
  export { analyzeInstrumentFinance, type FinanceIssue } from "./finance.js";
7
7
  export { mapUdlInstrumentReferences, referencedUdlInstrumentIds, } from "./instrument-references.js";
@@ -9,4 +9,5 @@ export { diffValidatedUdlEvolution } from "./evolution.js";
9
9
  export { fixedIsoDurationMs } from "./duration.js";
10
10
  export * from "./reporting.js";
11
11
  export { validateReportDefinition, reportExpressionTypes, } from "./reporting-validation.js";
12
+ export * from "./object-contract.js";
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,EACL,aAAa,EACb,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,yBAAyB,EACzB,QAAQ,EACR,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,EACL,aAAa,EACb,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export * from "./schema.js";
2
2
  export { parseUdl, canonicalizeUdl } from "./parser.js";
3
3
  export { serializeUdl, canonicalDigest } from "./canonical.js";
4
- export { validateUdl, assertValidUdl, resolveField, UdlError, } from "./validation.js";
4
+ export { validateUdl, RESERVED_OBJECT_NAMES, assertValidUdl, resolveField, resolveSubjectRequirement, UdlError, } from "./validation.js";
5
5
  export { issue, udlDiagnostic, udlDiagnostics, } from "./diagnostics.js";
6
6
  export { analyzeInstrumentFinance } from "./finance.js";
7
7
  export { mapUdlInstrumentReferences, referencedUdlInstrumentIds, } from "./instrument-references.js";
@@ -9,4 +9,5 @@ export { diffValidatedUdlEvolution } from "./evolution.js";
9
9
  export { fixedIsoDurationMs } from "./duration.js";
10
10
  export * from "./reporting.js";
11
11
  export { validateReportDefinition, reportExpressionTypes, } from "./reporting-validation.js";
12
+ export * from "./object-contract.js";
12
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,QAAQ,GAET,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,EACL,aAAa,EACb,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAqB,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,yBAAyB,EACzB,QAAQ,GAET,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,EACL,aAAa,EACb,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAqB,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"instrument-references.d.ts","sourceRoot":"","sources":["../src/instrument-references.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAOrB,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAC1B,WAAW,CA2Db;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,GACxB,SAAS,MAAM,EAAE,CAmBnB"}
1
+ {"version":3,"file":"instrument-references.d.ts","sourceRoot":"","sources":["../src/instrument-references.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAOrB,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAC1B,WAAW,CAkFb;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,GACxB,SAAS,MAAM,EAAE,CAoBnB"}
@@ -33,6 +33,25 @@ export function mapUdlInstrumentReferences(document, map) {
33
33
  }
34
34
  else if (object(value)) {
35
35
  const properties = object(schema.properties) ? schema.properties : {};
36
+ const discriminator = object(properties.type)
37
+ ? properties.type.const
38
+ : undefined;
39
+ if ((discriminator === "ref" || discriminator === "list") &&
40
+ value.type === discriminator &&
41
+ value.targetKind === "instrument") {
42
+ if (typeof value.target === "string")
43
+ locations.set(JSON.stringify([...path, "target"]), {
44
+ parent: value,
45
+ key: "target",
46
+ kind: "instrument",
47
+ });
48
+ else if (Array.isArray(value.target))
49
+ value.target.forEach((_, index) => locations.set(JSON.stringify([...path, "target", index]), {
50
+ parent: value.target,
51
+ key: index,
52
+ kind: "instrument",
53
+ }));
54
+ }
36
55
  for (const [name, entry] of Object.entries(value))
37
56
  visit(properties[name] ?? schema.additionalProperties, entry, value, name, [...path, name]);
38
57
  }
@@ -53,12 +72,13 @@ export function mapUdlInstrumentReferences(document, map) {
53
72
  export function referencedUdlInstrumentIds(instrument) {
54
73
  const found = new Set();
55
74
  mapUdlInstrumentReferences({
56
- udl: 3,
75
+ udl: 4,
57
76
  version: 1,
58
77
  product: "references",
59
78
  title: "References",
60
79
  currency: "SAR",
61
80
  parties: {},
81
+ objects: [],
62
82
  instruments: [instrument],
63
83
  }, (id) => {
64
84
  found.add(id);
@@ -1 +1 @@
1
- {"version":3,"file":"instrument-references.js","sourceRoot":"","sources":["../src/instrument-references.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EACL,iBAAiB,GAGlB,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,GAAG,CAAC,KAAc,EAAmB,EAAE,CACjD,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvE,IAAI,cAAkC,CAAC;AAEvC,iFAAiF;AACjF,MAAM,UAAU,0BAA0B,CACxC,QAAqB,EACrB,GAA2B;IAE3B,MAAM,IAAI,GAAG,CAAC,cAAc,KAAK,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAGtB,CAAC;IACJ,SAAS,KAAK,CACZ,MAAe,EACf,KAAc,EACd,MAA0B,EAC1B,GAAoB,EACpB,IAAkC;QAElC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO;QAC5B,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,IAAI,MAAM,GAAY,IAAI,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBACrB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC1D,CAAC,CAAC,SAAS,CAAC;YAChB,CAAC;YACD,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YACvD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACtB,KAAK,MAAM,MAAM,IAAI,KAAK;oBAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACxE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAC7B,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAC3D,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC/C,KAAK,CACH,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,oBAAoB,EAC/C,KAAK,EACL,KAAK,EACL,IAAI,EACJ,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAChB,CAAC;QACN,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,MAA0C,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAW,CAAC;QACpC,IAAI,IAAI,KAAK,YAAY;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;aAC/C,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,UAAyB;IAEzB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,0BAA0B,CACxB;QACE,GAAG,EAAE,CAAC;QACN,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,CAAC,UAAU,CAAC;KAC1B,EACD,CAAC,EAAE,EAAE,EAAE;QACL,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC,CACF,CAAC;IACF,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"instrument-references.js","sourceRoot":"","sources":["../src/instrument-references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import * as z from "zod";
2
+ import { type UdlDocument, type UdlField, type UdlObjectField, type UdlObjectKind } from "./schema.js";
3
+ export declare const requestAttributionSchema: z.ZodUnion<readonly [z.ZodObject<{
4
+ kind: z.ZodLiteral<"human">;
5
+ principalId: z.ZodString;
6
+ humanId: z.ZodString;
7
+ source: z.ZodEnum<{
8
+ customer_session: "customer_session";
9
+ staff_session: "staff_session";
10
+ }>;
11
+ }, z.core.$strict>, z.ZodObject<{
12
+ kind: z.ZodLiteral<"machine">;
13
+ principalId: z.ZodString;
14
+ source: z.ZodEnum<{
15
+ api_key: "api_key";
16
+ system: "system";
17
+ }>;
18
+ }, z.core.$strict>, z.ZodObject<{
19
+ kind: z.ZodLiteral<"machine">;
20
+ principalId: z.ZodString;
21
+ humanId: z.ZodString;
22
+ source: z.ZodLiteral<"api_key_delegate">;
23
+ }, z.core.$strict>]>;
24
+ export type RequestAttribution = z.infer<typeof requestAttributionSchema>;
25
+ export type JsonSchemaDocument = z.core.JSONSchema.BaseSchema;
26
+ export interface ObjectKindDiscovery {
27
+ creation: true;
28
+ kind: string;
29
+ title: string;
30
+ fields: readonly UdlObjectField[];
31
+ authoredFields: readonly string[];
32
+ columns: readonly string[];
33
+ createSchema: JsonSchemaDocument;
34
+ actions: readonly ObjectActionDiscovery[];
35
+ }
36
+ export type ObjectActionTarget = {
37
+ kind: "attachment";
38
+ attachment: string;
39
+ } | {
40
+ kind: "instance";
41
+ attachment: string;
42
+ instanceId: string;
43
+ };
44
+ export interface ObjectActionContext {
45
+ productBuildId: string;
46
+ digest: string;
47
+ target: ObjectActionTarget;
48
+ }
49
+ export interface ObjectActionDiscovery extends ObjectActionContext {
50
+ name: string;
51
+ title: string;
52
+ instrument: string;
53
+ action: string;
54
+ requirements: readonly UdlObjectField[];
55
+ creationRequirements?: readonly UdlObjectField[];
56
+ creationOnlyNames?: readonly string[];
57
+ inputSchema: JsonSchemaDocument;
58
+ fieldsSchema: JsonSchemaDocument;
59
+ availability: {
60
+ status: "available";
61
+ } | {
62
+ status: "unavailable";
63
+ code: string;
64
+ message: string;
65
+ };
66
+ }
67
+ export type EvidenceState = "missing" | "pending" | "satisfied" | "refused" | "stale";
68
+ export interface ObjectEvidenceSummary {
69
+ requirementId: string;
70
+ subjectId: string;
71
+ protectedInputDigest: string;
72
+ adapter: string;
73
+ declarationDigest: string;
74
+ productBuildId: string;
75
+ state: EvidenceState;
76
+ reference?: string;
77
+ observedAt?: string;
78
+ reasonCode?: string;
79
+ }
80
+ export interface ObjectActionState extends ObjectActionDiscovery {
81
+ requiredNow: readonly string[];
82
+ evidence?: readonly ObjectEvidenceSummary[];
83
+ }
84
+ /** GET /v1/products/{productId}/objects. Core supplies the frozen Build identity. */
85
+ export type RetainedObjectKind = Pick<ObjectKindDiscovery, "kind" | "title" | "fields" | "authoredFields" | "columns"> & {
86
+ productBuildId: string;
87
+ digest: string;
88
+ creation: false;
89
+ };
90
+ export interface ObjectDiscovery {
91
+ retainedKinds: readonly RetainedObjectKind[];
92
+ productBuildId: string;
93
+ digest: string;
94
+ kinds: readonly ObjectKindDiscovery[];
95
+ }
96
+ export interface ObjectActionsResponse {
97
+ objectId: string;
98
+ revision: number;
99
+ actions: readonly ObjectActionState[];
100
+ evidence: readonly ObjectEvidenceSummary[];
101
+ }
102
+ export interface ObjectInstance {
103
+ objectId: string;
104
+ kind: string;
105
+ revision: number;
106
+ externalId?: string;
107
+ fields: Record<string, unknown>;
108
+ productBuildId: string;
109
+ }
110
+ export interface ObjectListResponse {
111
+ items: ObjectInstance[];
112
+ nextCursor?: string;
113
+ }
114
+ export interface ObjectActionResponse {
115
+ object: ObjectInstance;
116
+ outcome: {
117
+ instrument: string;
118
+ instanceId: string;
119
+ state: string;
120
+ } | null;
121
+ evidence: readonly ObjectEvidenceSummary[];
122
+ }
123
+ /** Values, rather than declarations. The same validator feeds forms and admission. */
124
+ export declare function udlFieldValueSchema(field: UdlField): z.ZodType;
125
+ /** Creation accepts the full metadata union, with every value optional. */
126
+ export declare function objectCreateSchema(kind: UdlObjectKind): z.ZodObject;
127
+ /** Canonical UDL supplies meaning; core adds authority, lifecycle and readiness. */
128
+ export declare function projectObjectDiscovery(document: UdlDocument, build: Pick<ObjectDiscovery, "productBuildId" | "digest">): ObjectDiscovery;
129
+ /** Object-specific values determine missing fields; global discovery cannot. */
130
+ export declare function objectActionState(action: ObjectActionDiscovery, fields: Readonly<Record<string, unknown>>, options?: {
131
+ attached?: boolean;
132
+ } | boolean): ObjectActionState;
133
+ export interface SubjectRequirementIssue {
134
+ code: "subject_requirement_missing" | "subject_field_unknown" | "subject_adapter_unbound";
135
+ action: string;
136
+ field?: string;
137
+ origin: string;
138
+ message: string;
139
+ }
140
+ /** Check merged metadata before dispatch. Runtime guards add their active child requirements. */
141
+ export declare function validateObjectActionSubject(action: ObjectActionDiscovery, storedFields: Readonly<Record<string, unknown>>, submittedFields: Readonly<Record<string, unknown>>, options?: {
142
+ attached?: boolean;
143
+ } | boolean): readonly SubjectRequirementIssue[];
144
+ //# sourceMappingURL=object-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-contract.d.ts","sourceRoot":"","sources":["../src/object-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ import * as z from "zod";
2
+ import { udlExternalIdSchema, udlObjectIdSchema, } from "./schema.js";
3
+ export const requestAttributionSchema = z.union([
4
+ z.strictObject({
5
+ kind: z.literal("human"),
6
+ principalId: z.string().min(1),
7
+ humanId: z.string().min(1),
8
+ source: z.enum(["staff_session", "customer_session"]),
9
+ }),
10
+ z.strictObject({
11
+ kind: z.literal("machine"),
12
+ principalId: z.string().min(1),
13
+ source: z.enum(["api_key", "system"]),
14
+ }),
15
+ z.strictObject({
16
+ kind: z.literal("machine"),
17
+ principalId: z.string().min(1),
18
+ humanId: z.string().min(1),
19
+ source: z.literal("api_key_delegate"),
20
+ }),
21
+ ]);
22
+ const amount = z.string().regex(/^(0|[1-9][0-9]{0,17})$/);
23
+ const text = z.string().min(1).max(2048);
24
+ /** Values, rather than declarations. The same validator feeds forms and admission. */
25
+ export function udlFieldValueSchema(field) {
26
+ let schema;
27
+ switch (field.type) {
28
+ case "money":
29
+ schema = amount
30
+ .refine((value) => /^(0|[1-9][0-9]{0,17})$/.test(value) &&
31
+ (field.minimum === undefined ||
32
+ BigInt(value) >= BigInt(field.minimum)) &&
33
+ (field.maximum === undefined ||
34
+ BigInt(value) <= BigInt(field.maximum)), "Money is outside its declared bounds")
35
+ .meta({
36
+ ...(field.minimum !== undefined
37
+ ? { "x-udl-minimum": field.minimum }
38
+ : {}),
39
+ ...(field.maximum !== undefined
40
+ ? { "x-udl-maximum": field.maximum }
41
+ : {}),
42
+ });
43
+ break;
44
+ case "account":
45
+ schema = text;
46
+ break;
47
+ case "ref":
48
+ schema = field.targetKind === "object" ? udlObjectIdSchema : text;
49
+ break;
50
+ case "date":
51
+ schema = z.iso.datetime({ offset: true });
52
+ break;
53
+ case "duration":
54
+ schema = z.number().int().safe().positive();
55
+ break;
56
+ case "text": {
57
+ let value = z
58
+ .string()
59
+ .min(field.minLength ?? 1)
60
+ .max(field.maxLength ?? 2048);
61
+ if (field.pattern)
62
+ value = value.regex(new RegExp(field.pattern));
63
+ schema = value;
64
+ break;
65
+ }
66
+ case "integer": {
67
+ let value = z.number().int().safe();
68
+ if (field.minimum !== undefined)
69
+ value = value.min(field.minimum);
70
+ if (field.maximum !== undefined)
71
+ value = value.max(field.maximum);
72
+ schema = value;
73
+ break;
74
+ }
75
+ case "percent":
76
+ schema = z.number().int().min(0).max(10000);
77
+ break;
78
+ case "boolean":
79
+ schema = z.boolean();
80
+ break;
81
+ case "enum":
82
+ schema = z.enum(field.values);
83
+ break;
84
+ case "list": {
85
+ const item = field.item === "money"
86
+ ? amount
87
+ : field.item === "date"
88
+ ? z.iso.datetime({ offset: true })
89
+ : field.item === "integer"
90
+ ? z.number().int().safe()
91
+ : field.item === "ref" && field.targetKind === "object"
92
+ ? udlObjectIdSchema
93
+ : text;
94
+ schema = z.array(item).max(field.maxItems);
95
+ break;
96
+ }
97
+ }
98
+ if ("value" in field && field.value !== undefined)
99
+ schema = z.literal(field.value);
100
+ if (field.description)
101
+ schema = schema.describe(field.description);
102
+ return schema;
103
+ }
104
+ /** Creation accepts the full metadata union, with every value optional. */
105
+ export function objectCreateSchema(kind) {
106
+ return z.strictObject({
107
+ externalId: udlExternalIdSchema.optional(),
108
+ fields: z
109
+ .strictObject(Object.fromEntries(kind.fields.map((field) => [
110
+ field.name,
111
+ udlFieldValueSchema(field).optional(),
112
+ ])))
113
+ .optional(),
114
+ });
115
+ }
116
+ /** Canonical UDL supplies meaning; core adds authority, lifecycle and readiness. */
117
+ export function projectObjectDiscovery(document, build) {
118
+ return {
119
+ ...build,
120
+ retainedKinds: [],
121
+ kinds: document.objects.map((kind) => ({
122
+ creation: true,
123
+ kind: kind.id,
124
+ title: kind.title,
125
+ fields: kind.fields,
126
+ authoredFields: kind.authoredFields,
127
+ columns: kind.columns,
128
+ createSchema: z.toJSONSchema(objectCreateSchema(kind), { io: "input" }),
129
+ actions: document.instruments
130
+ .filter((instrument) => instrument.subject === kind.id)
131
+ .flatMap((instrument) => {
132
+ const createHidden = !!instrument.actions.create &&
133
+ !instrument.actions.create.publicAction;
134
+ const attachmentRefListFields = instrument.fields.filter((field) => field.type === "list" &&
135
+ field.item === "ref" &&
136
+ field.targetKind !== "object");
137
+ return instrument.actionOrder.flatMap((name) => {
138
+ const action = instrument.actions[name];
139
+ if (!action.publicAction)
140
+ return [];
141
+ const transition = instrument.lifecycle.transitions[name];
142
+ const canStartFromInitial = Boolean(transition?.from.includes(instrument.lifecycle.initial));
143
+ const isCreationAction = name === "create" || (createHidden && canStartFromInitial);
144
+ const rawCreateReqs = isCreationAction
145
+ ? [
146
+ ...(instrument.actions.create?.subject?.requirements ?? []),
147
+ ...attachmentRefListFields.map((field) => ({ field })),
148
+ ]
149
+ : [];
150
+ const actionReqs = action.subject?.requirements ?? [];
151
+ const actionReqNames = new Set(actionReqs.map((r) => r.objectField ?? r.field.name));
152
+ const mergedReqs = [...actionReqs];
153
+ for (const req of rawCreateReqs) {
154
+ const reqName = req.objectField ?? req.field.name;
155
+ if (!mergedReqs.some((r) => (r.objectField ?? r.field.name) === reqName)) {
156
+ mergedReqs.push(req);
157
+ }
158
+ }
159
+ const unbound = [
160
+ ...(action.subject?.adapters ?? []),
161
+ ...(isCreationAction
162
+ ? (instrument.actions.create?.subject?.adapters ?? [])
163
+ : []),
164
+ ].find((adapter) => adapter.snapshot === null);
165
+ const seenCreation = new Set();
166
+ const creationRequirements = [];
167
+ for (const requirement of rawCreateReqs) {
168
+ const name = requirement.objectField ?? requirement.field.name;
169
+ if (!seenCreation.has(name)) {
170
+ seenCreation.add(name);
171
+ creationRequirements.push({
172
+ ...requirement.field,
173
+ name,
174
+ });
175
+ }
176
+ }
177
+ const creationOnlyNames = creationRequirements
178
+ .map((field) => field.name)
179
+ .filter((name) => !actionReqNames.has(name));
180
+ return [
181
+ {
182
+ ...build,
183
+ target: {
184
+ kind: "attachment",
185
+ attachment: kind.attachments.find((attachment) => attachment.instrument === instrument.id).name,
186
+ },
187
+ name: action.publicAction,
188
+ title: action.summary,
189
+ instrument: instrument.id,
190
+ action: name,
191
+ requirements: mergedReqs.map((requirement) => ({
192
+ ...requirement.field,
193
+ name: requirement.objectField ?? requirement.field.name,
194
+ })),
195
+ ...(creationRequirements.length > 0
196
+ ? { creationRequirements }
197
+ : {}),
198
+ ...(creationRequirements.length > 0
199
+ ? { creationOnlyNames }
200
+ : {}),
201
+ fieldsSchema: z.toJSONSchema(z.strictObject(Object.fromEntries(mergedReqs.map((requirement) => [
202
+ requirement.objectField ?? requirement.field.name,
203
+ udlFieldValueSchema(requirement.field).optional(),
204
+ ]))), { io: "input" }),
205
+ inputSchema: z.toJSONSchema(z.strictObject(Object.fromEntries(action.input.map((field) => [
206
+ field.name,
207
+ field.optional
208
+ ? udlFieldValueSchema(field).optional()
209
+ : udlFieldValueSchema(field),
210
+ ]))), { io: "input" }),
211
+ availability: unbound
212
+ ? {
213
+ status: "unavailable",
214
+ code: "subject_adapter_unbound",
215
+ message: `Adapter declaration ${unbound.binding} is unavailable`,
216
+ }
217
+ : { status: "available" },
218
+ },
219
+ ];
220
+ });
221
+ }),
222
+ })),
223
+ };
224
+ }
225
+ /** Object-specific values determine missing fields; global discovery cannot. */
226
+ export function objectActionState(action, fields, options) {
227
+ const attached = typeof options === "boolean" ? options : (options?.attached ?? false);
228
+ const creationFilter = new Set(action.creationOnlyNames ?? []);
229
+ return {
230
+ ...action,
231
+ requiredNow: action.requirements
232
+ .filter((field) => {
233
+ const value = fields[field.name];
234
+ const optional = field.optional || (attached && creationFilter.has(field.name));
235
+ return (!(optional && value === undefined) &&
236
+ !udlFieldValueSchema(field).safeParse(value).success);
237
+ })
238
+ .map((field) => field.name),
239
+ };
240
+ }
241
+ /** Check merged metadata before dispatch. Runtime guards add their active child requirements. */
242
+ export function validateObjectActionSubject(action, storedFields, submittedFields, options) {
243
+ const origin = `${action.instrument}.${action.action}.subject`;
244
+ const issues = [];
245
+ if (action.availability.status === "unavailable" &&
246
+ action.availability.code === "subject_adapter_unbound") {
247
+ issues.push({
248
+ code: "subject_adapter_unbound",
249
+ action: action.name,
250
+ origin,
251
+ message: action.availability.message,
252
+ });
253
+ }
254
+ const admitted = new Set(action.requirements.map((field) => field.name));
255
+ for (const field of Object.keys(submittedFields)) {
256
+ if (!admitted.has(field))
257
+ issues.push({
258
+ code: "subject_field_unknown",
259
+ action: action.name,
260
+ field,
261
+ origin,
262
+ message: `${field} is not admitted by ${action.name}`,
263
+ });
264
+ }
265
+ for (const field of objectActionState(action, {
266
+ ...storedFields,
267
+ ...submittedFields,
268
+ }, options).requiredNow) {
269
+ issues.push({
270
+ code: "subject_requirement_missing",
271
+ action: action.name,
272
+ field,
273
+ origin: `${origin}.${field}`,
274
+ message: `${action.name} requires a valid ${field}`,
275
+ });
276
+ }
277
+ return issues;
278
+ }
279
+ //# sourceMappingURL=object-contract.js.map