@peac/control 0.10.13 → 0.11.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.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/validators.d.ts +37 -651
- package/dist/validators.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -145,7 +145,7 @@ var ConstraintSchema = zod.z.discriminatedUnion("type", [
|
|
|
145
145
|
var ControlBlockSchema2 = zod.z.object({
|
|
146
146
|
mandate: ConstraintSchema,
|
|
147
147
|
scope: zod.z.string().url().optional(),
|
|
148
|
-
metadata: zod.z.record(zod.z.unknown()).optional()
|
|
148
|
+
metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
|
|
149
149
|
});
|
|
150
150
|
var ControlStateSchema = zod.z.object({
|
|
151
151
|
receipt_id: zod.z.string().uuid(),
|
|
@@ -154,7 +154,7 @@ var ControlStateSchema = zod.z.object({
|
|
|
154
154
|
spent_amount: zod.z.number().int().nonnegative().optional(),
|
|
155
155
|
first_use: zod.z.number().int().positive().optional(),
|
|
156
156
|
last_use: zod.z.number().int().positive().optional(),
|
|
157
|
-
metadata: zod.z.record(zod.z.unknown()).optional()
|
|
157
|
+
metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
|
|
158
158
|
});
|
|
159
159
|
|
|
160
160
|
// src/enforcement.ts
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["z","ControlBlockSchema"],"mappings":";;;;;;AA4HO,IAAM,wBAAN,MAA4B;AAAA,EACzB,OAAA,uBAAc,GAAA,EAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxD,SAAS,MAAA,EAAoC;AAC3C,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,QAAA,EAAwC;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAA,EAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,GAAiB;AACf,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,EACvC;AACF;AClKA,IAAM,4BAAA,GAA+BA,MAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,UAAA,EAAYA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACjD,WAAA,EAAaA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAClD,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AACxC,CAAC,CAAA;AAKD,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EACvB,UAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EACpC,YAAA,EAAcA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EACtD,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AACtC,CAAC,CAAA;AAKD,IAAM,0BAAA,GAA6BA,MAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,YAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EACtC,cAAA,EAAgBA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EACxD,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC7C,UAAUA,KAAA,CAAE,MAAA,GAAS,MAAA,CAAO,CAAC,EAAE,WAAA;AACjC,CAAC,CAAA;AAKD,IAAM,4BAAA,GAA+BA,MAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,KAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,QAAA,EAAUA,MACP,MAAA,CAAO;AAAA,IACN,UAAA,EAAYA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,IACjD,WAAA,EAAaA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,IAClD,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AAAS,GAChD,EACA,QAAA,EAAS;AAAA,EACZ,KAAA,EAAOA,MACJ,MAAA,CAAO;AAAA,IACN,UAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,IACpC,YAAA,EAAcA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,IACtD,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA;AAAS,GAC9C,EACA,QAAA,EAAS;AAAA,EACZ,MAAA,EAAQA,MACL,MAAA,CAAO;AAAA,IACN,YAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,IACtC,cAAA,EAAgBA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,IACxD,MAAA,EAAQA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,IAC7C,UAAUA,KAAA,CAAE,MAAA,GAAS,MAAA,CAAO,CAAC,EAAE,WAAA;AAAY,GAC5C,EACA,QAAA;AACL,CAAC,CAAA;AAKM,IAAM,2BAA2B,4BAAA,CAA6B,MAAA;AAAA,EACnE,CAAC,IAAA,KAAS;AAER,IAAA,OACE,KAAK,UAAA,KAAe,MAAA,IAAa,KAAK,WAAA,KAAgB,MAAA,IAAa,KAAK,QAAA,KAAa,MAAA;AAAA,EAEzF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EACE;AAAA;AAEN,CAAA,CAAE,MAAA;AAAA,EACA,CAAC,IAAA,KAAS;AAER,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,IAAA,CAAK,gBAAgB,MAAA,EAAW;AACnE,MAAA,OAAO,IAAA,CAAK,cAAc,IAAA,CAAK,UAAA;AAAA,IACjC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb;AAKO,IAAM,wBAAwB,yBAAA,CAA0B,MAAA;AAAA,EAC7D,CAAC,IAAA,KAAS;AAER,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,CAAK,QAAA;AAAA,IACnC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb;AAKO,IAAM,yBAAyB,0BAAA,CAA2B,MAAA;AAAA,EAC/D,CAAC,IAAA,KAAS;AAER,IAAA,IAAI,IAAA,CAAK,mBAAmB,MAAA,EAAW;AACrC,MAAA,OAAO,IAAA,CAAK,kBAAkB,IAAA,CAAK,UAAA;AAAA,IACrC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb;AAKO,IAAM,2BAA2B,4BAAA,CAA6B,MAAA;AAAA,EACnE,CAAC,IAAA,KAAS;AAER,IAAA,OAAO,KAAK,QAAA,KAAa,MAAA,IAAa,KAAK,KAAA,KAAU,MAAA,IAAa,KAAK,MAAA,KAAW,MAAA;AAAA,EACpF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAEb;AAKO,IAAM,gBAAA,GAAmBA,KAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EAC3D,4BAAA;AAAA,EACA,yBAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAC;AAKM,IAAMC,mBAAAA,GAAqBD,MAAE,MAAA,CAAO;AAAA,EACzC,OAAA,EAAS,gBAAA;AAAA,EACT,OAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EACjC,UAAUA,KAAA,CAAE,MAAA,CAAOA,MAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK;AAAA,EAC5B,UAAA,EAAY,gBAAA;AAAA,EACZ,WAAA,EAAaA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EACrD,YAAA,EAAcA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EACtD,SAAA,EAAWA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAChD,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC/C,UAAUA,KAAA,CAAE,MAAA,CAAOA,MAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;;;ACrJM,SAAS,yBAAA,CACd,SACA,WAAA,GAAsB,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,EAC/B;AAEnB,EAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,IAAa,WAAA,GAAc,QAAQ,UAAA,EAAY;AACxE,IAAA,MAAM,SAAA,GAAY,QAAQ,UAAA,GAAa,WAAA;AACvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,mCAAmC,SAAS,CAAA,EAAA,CAAA;AAAA,MACpD,SAAA,EAAW,EAAE,OAAA,EAAS,SAAA;AAAU,KAClC;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,IAAa,WAAA,GAAc,QAAQ,WAAA,EAAa;AAC1E,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,oBAAA;AAAA,MACR,SAAA,EAAW,EAAE,OAAA,EAAS,CAAA;AAAE,KAC1B;AAAA,EACF;AAGA,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,IAAA,gBAAA,GAAmB,QAAQ,WAAA,GAAc,WAAA;AAAA,EAC3C,WAAW,OAAA,CAAQ,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,eAAe,MAAA,EAAW;AAC7E,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,GAAa,OAAA,CAAQ,QAAA;AAC/C,IAAA,gBAAA,GAAmB,SAAA,GAAY,WAAA;AAAA,EACjC;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,WAAW,gBAAA,KAAqB,MAAA,GAAY,EAAE,OAAA,EAAS,kBAAiB,GAAI;AAAA,GAC9E;AACF;AAKO,SAAS,sBAAA,CACd,SACA,KAAA,EACmB;AACnB,EAAA,MAAM,WAAA,GAAc,KAAA,EAAO,WAAA,IAAe,OAAA,CAAQ,YAAA,IAAgB,CAAA;AAGlE,EAAA,IAAI,WAAA,IAAe,QAAQ,QAAA,EAAU;AACnC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAA,sBAAA,EAAyB,WAAW,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA,CAAA,CAAA;AAAA,MAChE,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA;AAAE,KACvB;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,IAAa,KAAA,EAAO,cAAc,MAAA,EAAW;AAClE,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,MAAA;AAE/C,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,sBAAA;AAAA,QACR,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA;AAAE,OACvB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,QAAQ,QAAA,GAAW,WAAA;AAEzC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,EAAE,IAAA,EAAM,aAAA;AAAc,GACnC;AACF;AAKO,SAAS,uBAAA,CACd,OAAA,EACA,KAAA,EACA,eAAA,EACmB;AACnB,EAAA,MAAM,aAAA,GAAgB,KAAA,EAAO,YAAA,IAAgB,OAAA,CAAQ,cAAA,IAAkB,CAAA;AAGvE,EAAA,IAAI,aAAA,IAAiB,QAAQ,UAAA,EAAY;AACvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,0BAA0B,aAAa,CAAA,CAAA,EAAI,QAAQ,UAAU,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA,CAAA,CAAA;AAAA,MACzF,SAAA,EAAW,EAAE,MAAA,EAAQ,CAAA;AAAE,KACzB;AAAA,EACF;AAGA,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,IAAA,IAAI,aAAA,GAAgB,eAAA,GAAkB,OAAA,CAAQ,UAAA,EAAY;AACxD,MAAA,MAAM,SAAA,GAAY,QAAQ,UAAA,GAAa,aAAA;AACvC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAQ,CAAA,sCAAA,EAAyC,eAAe,MAAM,SAAS,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA,WAAA,CAAA;AAAA,QACnG,SAAA,EAAW,EAAE,MAAA,EAAQ,SAAA;AAAU,OACjC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,IAAa,KAAA,EAAO,cAAc,MAAA,EAAW;AAClE,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,MAAA;AAE/C,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,uBAAA;AAAA,QACR,SAAA,EAAW,EAAE,MAAA,EAAQ,CAAA;AAAE,OACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,QAAQ,UAAA,GAAa,aAAA;AAE7C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,EAAE,MAAA,EAAQ,eAAA;AAAgB,GACvC;AACF;AAKO,SAAS,yBAAA,CACd,OAAA,EACA,KAAA,EACA,eAAA,EACA,WAAA,EACmB;AACnB,EAAA,MAAM,UAA+B,EAAC;AAGtC,EAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,IAAA,MAAM,kBAAA,GAAyC;AAAA,MAE7C,GAAG,OAAA,CAAQ;AAAA,KACb;AACA,IAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,kBAAA,EAAoB,WAAW,CAAA;AACxE,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EACrB;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,IAAA,MAAM,eAAA,GAAmC;AAAA,MAEvC,GAAG,OAAA,CAAQ;AAAA,KACb;AACA,IAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,eAAA,EAAiB,KAAK,CAAA;AAC5D,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EACrB;AAGA,EAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,IAAA,MAAM,gBAAA,GAAqC;AAAA,MAEzC,GAAG,OAAA,CAAQ;AAAA,KACb;AACA,IAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,gBAAA,EAAkB,KAAA,EAAO,eAAe,CAAA;AAC/E,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EACrB;AAGA,EAAA,MAAM,eAAe,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AACnD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,MAAM,YAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,GAAS,IAAI,SAAA,GAAY;AAAA,GAC7D;AACF;AAKO,SAAS,iBAAA,CACd,OAAA,EACA,KAAA,EACA,eAAA,EACA,WAAA,EACmB;AACnB,EAAA,QAAQ,QAAQ,IAAA;AAAM,IACpB,KAAK,UAAA;AACH,MAAA,OAAO,yBAAA,CAA0B,SAAS,WAAW,CAAA;AAAA,IAEvD,KAAK,OAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,SAAS,KAAK,CAAA;AAAA,IAE9C,KAAK,QAAA;AACH,MAAA,OAAO,uBAAA,CAAwB,OAAA,EAAS,KAAA,EAAO,eAAe,CAAA;AAAA,IAEhE,KAAK,UAAA;AACH,MAAA,OAAO,yBAAA,CAA0B,OAAA,EAAS,KAAA,EAAO,eAAA,EAAiB,WAAW,CAAA;AAAA,IAE/E,SAAS;AAEP,MAAA,MAAM,WAAA,GAAqB,OAAA;AAC3B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,sBAAA,EAA0B,WAAA,CAAoB,IAAI,CAAA;AAAA,OAC5D;AAAA,IACF;AAAA;AAEJ;AAOO,SAAS,mBAAA,CACd,UAAA,EACA,KAAA,EACA,eAAA,EACA,WAAA,EACmB;AACnB,EAAA,OAAO,iBAAA,CAAkB,UAAA,EAAY,KAAA,EAAO,eAAA,EAAiB,WAAW,CAAA;AAC1E;;;ACvPO,SAAS,kBAAA,CAAmB,WAAmB,UAAA,EAAsC;AAC1F,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,SAAA;AAAA,IACZ,UAAA;AAAA,IACA,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,UAAU;AAAC,GACb;AACF;AAKO,SAAS,mBAAA,CAAoB,OAAqB,MAAA,EAA+B;AACtF,EAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAChD,EAAA,MAAM,UAAA,GAAA,CAAc,KAAA,CAAM,WAAA,IAAe,CAAA,IAAK,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAA,CAAe,KAAA,CAAM,YAAA,IAAgB,CAAA,KAAM,MAAA,IAAU,CAAA,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,WAAA,EAAa,UAAA;AAAA,IACb,YAAA,EAAc,WAAA;AAAA,IACd,SAAA,EAAW,MAAM,SAAA,IAAa,WAAA;AAAA,IAC9B,QAAA,EAAU;AAAA,GACZ;AACF;AAKO,SAAS,eAAe,KAAA,EAA8B;AAC3D,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,KAAA;AAChC,EAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAGhD,EAAA,IAAI,OAAA,CAAQ,SAAS,UAAA,EAAY;AAC/B,IAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,IAAa,WAAA,GAAc,QAAQ,WAAA,EAAa;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,IAAa,KAAA,CAAM,cAAc,MAAA,EAAW;AACnE,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,QAAA;AAC5C,MAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,QAAA,EAAU;AACnD,IAAA,IAAI,QAAQ,QAAA,CAAS,WAAA,KAAgB,UAAa,WAAA,GAAc,OAAA,CAAQ,SAAS,WAAA,EAAa;AAC5F,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAQ,QAAA,CAAS,QAAA,KAAa,MAAA,IAAa,KAAA,CAAM,cAAc,MAAA,EAAW;AAC5E,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,QAAA;AACrD,MAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,SAAS,OAAA,IAAW,OAAA,CAAQ,WAAW,MAAA,IAAa,KAAA,CAAM,cAAc,MAAA,EAAW;AAC7F,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,MAAA;AAC/C,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,IAAY,OAAA,CAAQ,WAAW,MAAA,IAAa,KAAA,CAAM,cAAc,MAAA,EAAW;AAC9F,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,MAAA;AAC/C,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,SAAS,UAAA,EAAY;AAC/B,IAAA,IAAI,QAAQ,KAAA,EAAO,MAAA,KAAW,MAAA,IAAa,KAAA,CAAM,cAAc,MAAA,EAAW;AACxE,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,MAAA;AACrD,MAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,KAAW,MAAA,IAAa,KAAA,CAAM,cAAc,MAAA,EAAW;AACzE,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,MAAA;AACtD,MAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW,MAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AACF;AAKO,SAAS,gBAAgB,KAAA,EAA6B;AAC3D,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,IAAa,KAAA,CAAM,cAAc,CAAA,EAAG;AAC5D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,IAAa,KAAA,CAAM,eAAe,CAAA,EAAG;AAC9D,IAAA,MAAM,WACJ,KAAA,CAAM,UAAA,CAAW,SAAS,QAAA,GACtB,KAAA,CAAM,WAAW,QAAA,GACjB,KAAA,CAAM,UAAA,CAAW,IAAA,KAAS,cAAc,KAAA,CAAM,UAAA,CAAW,SACvD,KAAA,CAAM,UAAA,CAAW,OAAO,QAAA,GACxB,OAAA;AACR,IAAA,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,IAAA,MAAM,OAAO,IAAI,IAAA,CAAK,MAAM,SAAA,GAAY,GAAI,EAAE,WAAA,EAAY;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,MAAM,OAAO,IAAI,IAAA,CAAK,MAAM,QAAA,GAAW,GAAI,EAAE,WAAA,EAAY;AACzD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB","file":"index.cjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["z","ControlBlockSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -143,7 +143,7 @@ var ConstraintSchema = z.discriminatedUnion("type", [
|
|
|
143
143
|
var ControlBlockSchema2 = z.object({
|
|
144
144
|
mandate: ConstraintSchema,
|
|
145
145
|
scope: z.string().url().optional(),
|
|
146
|
-
metadata: z.record(z.unknown()).optional()
|
|
146
|
+
metadata: z.record(z.string(), z.unknown()).optional()
|
|
147
147
|
});
|
|
148
148
|
var ControlStateSchema = z.object({
|
|
149
149
|
receipt_id: z.string().uuid(),
|
|
@@ -152,7 +152,7 @@ var ControlStateSchema = z.object({
|
|
|
152
152
|
spent_amount: z.number().int().nonnegative().optional(),
|
|
153
153
|
first_use: z.number().int().positive().optional(),
|
|
154
154
|
last_use: z.number().int().positive().optional(),
|
|
155
|
-
metadata: z.record(z.unknown()).optional()
|
|
155
|
+
metadata: z.record(z.string(), z.unknown()).optional()
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
// src/enforcement.ts
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["ControlBlockSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["ControlBlockSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
|
package/dist/validators.d.ts
CHANGED
|
@@ -7,792 +7,178 @@ import { z } from 'zod';
|
|
|
7
7
|
/**
|
|
8
8
|
* Temporal mandate schema (with validation)
|
|
9
9
|
*/
|
|
10
|
-
export declare const TemporalConstraintSchema: z.
|
|
10
|
+
export declare const TemporalConstraintSchema: z.ZodObject<{
|
|
11
11
|
type: z.ZodLiteral<"temporal">;
|
|
12
12
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
13
13
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
14
14
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
15
|
-
},
|
|
16
|
-
type: "temporal";
|
|
17
|
-
valid_from?: number | undefined;
|
|
18
|
-
valid_until?: number | undefined;
|
|
19
|
-
duration?: number | undefined;
|
|
20
|
-
}, {
|
|
21
|
-
type: "temporal";
|
|
22
|
-
valid_from?: number | undefined;
|
|
23
|
-
valid_until?: number | undefined;
|
|
24
|
-
duration?: number | undefined;
|
|
25
|
-
}>, {
|
|
26
|
-
type: "temporal";
|
|
27
|
-
valid_from?: number | undefined;
|
|
28
|
-
valid_until?: number | undefined;
|
|
29
|
-
duration?: number | undefined;
|
|
30
|
-
}, {
|
|
31
|
-
type: "temporal";
|
|
32
|
-
valid_from?: number | undefined;
|
|
33
|
-
valid_until?: number | undefined;
|
|
34
|
-
duration?: number | undefined;
|
|
35
|
-
}>, {
|
|
36
|
-
type: "temporal";
|
|
37
|
-
valid_from?: number | undefined;
|
|
38
|
-
valid_until?: number | undefined;
|
|
39
|
-
duration?: number | undefined;
|
|
40
|
-
}, {
|
|
41
|
-
type: "temporal";
|
|
42
|
-
valid_from?: number | undefined;
|
|
43
|
-
valid_until?: number | undefined;
|
|
44
|
-
duration?: number | undefined;
|
|
45
|
-
}>;
|
|
15
|
+
}, z.core.$strip>;
|
|
46
16
|
/**
|
|
47
17
|
* Usage mandate schema (with validation)
|
|
48
18
|
*/
|
|
49
|
-
export declare const UsageConstraintSchema: z.
|
|
19
|
+
export declare const UsageConstraintSchema: z.ZodObject<{
|
|
50
20
|
type: z.ZodLiteral<"usage">;
|
|
51
21
|
max_uses: z.ZodNumber;
|
|
52
22
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
53
23
|
window: z.ZodOptional<z.ZodNumber>;
|
|
54
|
-
},
|
|
55
|
-
type: "usage";
|
|
56
|
-
max_uses: number;
|
|
57
|
-
current_uses?: number | undefined;
|
|
58
|
-
window?: number | undefined;
|
|
59
|
-
}, {
|
|
60
|
-
type: "usage";
|
|
61
|
-
max_uses: number;
|
|
62
|
-
current_uses?: number | undefined;
|
|
63
|
-
window?: number | undefined;
|
|
64
|
-
}>, {
|
|
65
|
-
type: "usage";
|
|
66
|
-
max_uses: number;
|
|
67
|
-
current_uses?: number | undefined;
|
|
68
|
-
window?: number | undefined;
|
|
69
|
-
}, {
|
|
70
|
-
type: "usage";
|
|
71
|
-
max_uses: number;
|
|
72
|
-
current_uses?: number | undefined;
|
|
73
|
-
window?: number | undefined;
|
|
74
|
-
}>;
|
|
24
|
+
}, z.core.$strip>;
|
|
75
25
|
/**
|
|
76
26
|
* Budget mandate schema (with validation)
|
|
77
27
|
*/
|
|
78
|
-
export declare const BudgetConstraintSchema: z.
|
|
28
|
+
export declare const BudgetConstraintSchema: z.ZodObject<{
|
|
79
29
|
type: z.ZodLiteral<"budget">;
|
|
80
30
|
max_amount: z.ZodNumber;
|
|
81
31
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
82
32
|
window: z.ZodOptional<z.ZodNumber>;
|
|
83
33
|
currency: z.ZodString;
|
|
84
|
-
},
|
|
85
|
-
currency: string;
|
|
86
|
-
type: "budget";
|
|
87
|
-
max_amount: number;
|
|
88
|
-
window?: number | undefined;
|
|
89
|
-
current_amount?: number | undefined;
|
|
90
|
-
}, {
|
|
91
|
-
currency: string;
|
|
92
|
-
type: "budget";
|
|
93
|
-
max_amount: number;
|
|
94
|
-
window?: number | undefined;
|
|
95
|
-
current_amount?: number | undefined;
|
|
96
|
-
}>, {
|
|
97
|
-
currency: string;
|
|
98
|
-
type: "budget";
|
|
99
|
-
max_amount: number;
|
|
100
|
-
window?: number | undefined;
|
|
101
|
-
current_amount?: number | undefined;
|
|
102
|
-
}, {
|
|
103
|
-
currency: string;
|
|
104
|
-
type: "budget";
|
|
105
|
-
max_amount: number;
|
|
106
|
-
window?: number | undefined;
|
|
107
|
-
current_amount?: number | undefined;
|
|
108
|
-
}>;
|
|
34
|
+
}, z.core.$strip>;
|
|
109
35
|
/**
|
|
110
36
|
* Combined mandate schema (with validation)
|
|
111
37
|
*/
|
|
112
|
-
export declare const CombinedConstraintSchema: z.
|
|
38
|
+
export declare const CombinedConstraintSchema: z.ZodObject<{
|
|
113
39
|
type: z.ZodLiteral<"combined">;
|
|
114
40
|
temporal: z.ZodOptional<z.ZodObject<{
|
|
115
41
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
116
42
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
117
43
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
118
|
-
},
|
|
119
|
-
valid_from?: number | undefined;
|
|
120
|
-
valid_until?: number | undefined;
|
|
121
|
-
duration?: number | undefined;
|
|
122
|
-
}, {
|
|
123
|
-
valid_from?: number | undefined;
|
|
124
|
-
valid_until?: number | undefined;
|
|
125
|
-
duration?: number | undefined;
|
|
126
|
-
}>>;
|
|
44
|
+
}, z.core.$strip>>;
|
|
127
45
|
usage: z.ZodOptional<z.ZodObject<{
|
|
128
46
|
max_uses: z.ZodNumber;
|
|
129
47
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
130
48
|
window: z.ZodOptional<z.ZodNumber>;
|
|
131
|
-
},
|
|
132
|
-
max_uses: number;
|
|
133
|
-
current_uses?: number | undefined;
|
|
134
|
-
window?: number | undefined;
|
|
135
|
-
}, {
|
|
136
|
-
max_uses: number;
|
|
137
|
-
current_uses?: number | undefined;
|
|
138
|
-
window?: number | undefined;
|
|
139
|
-
}>>;
|
|
49
|
+
}, z.core.$strip>>;
|
|
140
50
|
budget: z.ZodOptional<z.ZodObject<{
|
|
141
51
|
max_amount: z.ZodNumber;
|
|
142
52
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
143
53
|
window: z.ZodOptional<z.ZodNumber>;
|
|
144
54
|
currency: z.ZodString;
|
|
145
|
-
},
|
|
146
|
-
|
|
147
|
-
max_amount: number;
|
|
148
|
-
window?: number | undefined;
|
|
149
|
-
current_amount?: number | undefined;
|
|
150
|
-
}, {
|
|
151
|
-
currency: string;
|
|
152
|
-
max_amount: number;
|
|
153
|
-
window?: number | undefined;
|
|
154
|
-
current_amount?: number | undefined;
|
|
155
|
-
}>>;
|
|
156
|
-
}, "strip", z.ZodTypeAny, {
|
|
157
|
-
type: "combined";
|
|
158
|
-
temporal?: {
|
|
159
|
-
valid_from?: number | undefined;
|
|
160
|
-
valid_until?: number | undefined;
|
|
161
|
-
duration?: number | undefined;
|
|
162
|
-
} | undefined;
|
|
163
|
-
usage?: {
|
|
164
|
-
max_uses: number;
|
|
165
|
-
current_uses?: number | undefined;
|
|
166
|
-
window?: number | undefined;
|
|
167
|
-
} | undefined;
|
|
168
|
-
budget?: {
|
|
169
|
-
currency: string;
|
|
170
|
-
max_amount: number;
|
|
171
|
-
window?: number | undefined;
|
|
172
|
-
current_amount?: number | undefined;
|
|
173
|
-
} | undefined;
|
|
174
|
-
}, {
|
|
175
|
-
type: "combined";
|
|
176
|
-
temporal?: {
|
|
177
|
-
valid_from?: number | undefined;
|
|
178
|
-
valid_until?: number | undefined;
|
|
179
|
-
duration?: number | undefined;
|
|
180
|
-
} | undefined;
|
|
181
|
-
usage?: {
|
|
182
|
-
max_uses: number;
|
|
183
|
-
current_uses?: number | undefined;
|
|
184
|
-
window?: number | undefined;
|
|
185
|
-
} | undefined;
|
|
186
|
-
budget?: {
|
|
187
|
-
currency: string;
|
|
188
|
-
max_amount: number;
|
|
189
|
-
window?: number | undefined;
|
|
190
|
-
current_amount?: number | undefined;
|
|
191
|
-
} | undefined;
|
|
192
|
-
}>, {
|
|
193
|
-
type: "combined";
|
|
194
|
-
temporal?: {
|
|
195
|
-
valid_from?: number | undefined;
|
|
196
|
-
valid_until?: number | undefined;
|
|
197
|
-
duration?: number | undefined;
|
|
198
|
-
} | undefined;
|
|
199
|
-
usage?: {
|
|
200
|
-
max_uses: number;
|
|
201
|
-
current_uses?: number | undefined;
|
|
202
|
-
window?: number | undefined;
|
|
203
|
-
} | undefined;
|
|
204
|
-
budget?: {
|
|
205
|
-
currency: string;
|
|
206
|
-
max_amount: number;
|
|
207
|
-
window?: number | undefined;
|
|
208
|
-
current_amount?: number | undefined;
|
|
209
|
-
} | undefined;
|
|
210
|
-
}, {
|
|
211
|
-
type: "combined";
|
|
212
|
-
temporal?: {
|
|
213
|
-
valid_from?: number | undefined;
|
|
214
|
-
valid_until?: number | undefined;
|
|
215
|
-
duration?: number | undefined;
|
|
216
|
-
} | undefined;
|
|
217
|
-
usage?: {
|
|
218
|
-
max_uses: number;
|
|
219
|
-
current_uses?: number | undefined;
|
|
220
|
-
window?: number | undefined;
|
|
221
|
-
} | undefined;
|
|
222
|
-
budget?: {
|
|
223
|
-
currency: string;
|
|
224
|
-
max_amount: number;
|
|
225
|
-
window?: number | undefined;
|
|
226
|
-
current_amount?: number | undefined;
|
|
227
|
-
} | undefined;
|
|
228
|
-
}>;
|
|
55
|
+
}, z.core.$strip>>;
|
|
56
|
+
}, z.core.$strip>;
|
|
229
57
|
/**
|
|
230
58
|
* Constraint schema (discriminated union using base schemas)
|
|
231
59
|
*/
|
|
232
|
-
export declare const ConstraintSchema: z.ZodDiscriminatedUnion<
|
|
60
|
+
export declare const ConstraintSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
233
61
|
type: z.ZodLiteral<"temporal">;
|
|
234
62
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
235
63
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
236
64
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
237
|
-
},
|
|
238
|
-
type: "temporal";
|
|
239
|
-
valid_from?: number | undefined;
|
|
240
|
-
valid_until?: number | undefined;
|
|
241
|
-
duration?: number | undefined;
|
|
242
|
-
}, {
|
|
243
|
-
type: "temporal";
|
|
244
|
-
valid_from?: number | undefined;
|
|
245
|
-
valid_until?: number | undefined;
|
|
246
|
-
duration?: number | undefined;
|
|
247
|
-
}>, z.ZodObject<{
|
|
65
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
248
66
|
type: z.ZodLiteral<"usage">;
|
|
249
67
|
max_uses: z.ZodNumber;
|
|
250
68
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
251
69
|
window: z.ZodOptional<z.ZodNumber>;
|
|
252
|
-
},
|
|
253
|
-
type: "usage";
|
|
254
|
-
max_uses: number;
|
|
255
|
-
current_uses?: number | undefined;
|
|
256
|
-
window?: number | undefined;
|
|
257
|
-
}, {
|
|
258
|
-
type: "usage";
|
|
259
|
-
max_uses: number;
|
|
260
|
-
current_uses?: number | undefined;
|
|
261
|
-
window?: number | undefined;
|
|
262
|
-
}>, z.ZodObject<{
|
|
70
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
263
71
|
type: z.ZodLiteral<"budget">;
|
|
264
72
|
max_amount: z.ZodNumber;
|
|
265
73
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
266
74
|
window: z.ZodOptional<z.ZodNumber>;
|
|
267
75
|
currency: z.ZodString;
|
|
268
|
-
},
|
|
269
|
-
currency: string;
|
|
270
|
-
type: "budget";
|
|
271
|
-
max_amount: number;
|
|
272
|
-
window?: number | undefined;
|
|
273
|
-
current_amount?: number | undefined;
|
|
274
|
-
}, {
|
|
275
|
-
currency: string;
|
|
276
|
-
type: "budget";
|
|
277
|
-
max_amount: number;
|
|
278
|
-
window?: number | undefined;
|
|
279
|
-
current_amount?: number | undefined;
|
|
280
|
-
}>, z.ZodObject<{
|
|
76
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
281
77
|
type: z.ZodLiteral<"combined">;
|
|
282
78
|
temporal: z.ZodOptional<z.ZodObject<{
|
|
283
79
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
284
80
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
285
81
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
286
|
-
},
|
|
287
|
-
valid_from?: number | undefined;
|
|
288
|
-
valid_until?: number | undefined;
|
|
289
|
-
duration?: number | undefined;
|
|
290
|
-
}, {
|
|
291
|
-
valid_from?: number | undefined;
|
|
292
|
-
valid_until?: number | undefined;
|
|
293
|
-
duration?: number | undefined;
|
|
294
|
-
}>>;
|
|
82
|
+
}, z.core.$strip>>;
|
|
295
83
|
usage: z.ZodOptional<z.ZodObject<{
|
|
296
84
|
max_uses: z.ZodNumber;
|
|
297
85
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
298
86
|
window: z.ZodOptional<z.ZodNumber>;
|
|
299
|
-
},
|
|
300
|
-
max_uses: number;
|
|
301
|
-
current_uses?: number | undefined;
|
|
302
|
-
window?: number | undefined;
|
|
303
|
-
}, {
|
|
304
|
-
max_uses: number;
|
|
305
|
-
current_uses?: number | undefined;
|
|
306
|
-
window?: number | undefined;
|
|
307
|
-
}>>;
|
|
87
|
+
}, z.core.$strip>>;
|
|
308
88
|
budget: z.ZodOptional<z.ZodObject<{
|
|
309
89
|
max_amount: z.ZodNumber;
|
|
310
90
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
311
91
|
window: z.ZodOptional<z.ZodNumber>;
|
|
312
92
|
currency: z.ZodString;
|
|
313
|
-
},
|
|
314
|
-
|
|
315
|
-
max_amount: number;
|
|
316
|
-
window?: number | undefined;
|
|
317
|
-
current_amount?: number | undefined;
|
|
318
|
-
}, {
|
|
319
|
-
currency: string;
|
|
320
|
-
max_amount: number;
|
|
321
|
-
window?: number | undefined;
|
|
322
|
-
current_amount?: number | undefined;
|
|
323
|
-
}>>;
|
|
324
|
-
}, "strip", z.ZodTypeAny, {
|
|
325
|
-
type: "combined";
|
|
326
|
-
temporal?: {
|
|
327
|
-
valid_from?: number | undefined;
|
|
328
|
-
valid_until?: number | undefined;
|
|
329
|
-
duration?: number | undefined;
|
|
330
|
-
} | undefined;
|
|
331
|
-
usage?: {
|
|
332
|
-
max_uses: number;
|
|
333
|
-
current_uses?: number | undefined;
|
|
334
|
-
window?: number | undefined;
|
|
335
|
-
} | undefined;
|
|
336
|
-
budget?: {
|
|
337
|
-
currency: string;
|
|
338
|
-
max_amount: number;
|
|
339
|
-
window?: number | undefined;
|
|
340
|
-
current_amount?: number | undefined;
|
|
341
|
-
} | undefined;
|
|
342
|
-
}, {
|
|
343
|
-
type: "combined";
|
|
344
|
-
temporal?: {
|
|
345
|
-
valid_from?: number | undefined;
|
|
346
|
-
valid_until?: number | undefined;
|
|
347
|
-
duration?: number | undefined;
|
|
348
|
-
} | undefined;
|
|
349
|
-
usage?: {
|
|
350
|
-
max_uses: number;
|
|
351
|
-
current_uses?: number | undefined;
|
|
352
|
-
window?: number | undefined;
|
|
353
|
-
} | undefined;
|
|
354
|
-
budget?: {
|
|
355
|
-
currency: string;
|
|
356
|
-
max_amount: number;
|
|
357
|
-
window?: number | undefined;
|
|
358
|
-
current_amount?: number | undefined;
|
|
359
|
-
} | undefined;
|
|
360
|
-
}>]>;
|
|
93
|
+
}, z.core.$strip>>;
|
|
94
|
+
}, z.core.$strip>], "type">;
|
|
361
95
|
/**
|
|
362
96
|
* Control block schema
|
|
363
97
|
*/
|
|
364
98
|
export declare const ControlBlockSchema: z.ZodObject<{
|
|
365
|
-
mandate: z.ZodDiscriminatedUnion<
|
|
99
|
+
mandate: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
366
100
|
type: z.ZodLiteral<"temporal">;
|
|
367
101
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
368
102
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
369
103
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
370
|
-
},
|
|
371
|
-
type: "temporal";
|
|
372
|
-
valid_from?: number | undefined;
|
|
373
|
-
valid_until?: number | undefined;
|
|
374
|
-
duration?: number | undefined;
|
|
375
|
-
}, {
|
|
376
|
-
type: "temporal";
|
|
377
|
-
valid_from?: number | undefined;
|
|
378
|
-
valid_until?: number | undefined;
|
|
379
|
-
duration?: number | undefined;
|
|
380
|
-
}>, z.ZodObject<{
|
|
104
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
381
105
|
type: z.ZodLiteral<"usage">;
|
|
382
106
|
max_uses: z.ZodNumber;
|
|
383
107
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
384
108
|
window: z.ZodOptional<z.ZodNumber>;
|
|
385
|
-
},
|
|
386
|
-
type: "usage";
|
|
387
|
-
max_uses: number;
|
|
388
|
-
current_uses?: number | undefined;
|
|
389
|
-
window?: number | undefined;
|
|
390
|
-
}, {
|
|
391
|
-
type: "usage";
|
|
392
|
-
max_uses: number;
|
|
393
|
-
current_uses?: number | undefined;
|
|
394
|
-
window?: number | undefined;
|
|
395
|
-
}>, z.ZodObject<{
|
|
109
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
396
110
|
type: z.ZodLiteral<"budget">;
|
|
397
111
|
max_amount: z.ZodNumber;
|
|
398
112
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
399
113
|
window: z.ZodOptional<z.ZodNumber>;
|
|
400
114
|
currency: z.ZodString;
|
|
401
|
-
},
|
|
402
|
-
currency: string;
|
|
403
|
-
type: "budget";
|
|
404
|
-
max_amount: number;
|
|
405
|
-
window?: number | undefined;
|
|
406
|
-
current_amount?: number | undefined;
|
|
407
|
-
}, {
|
|
408
|
-
currency: string;
|
|
409
|
-
type: "budget";
|
|
410
|
-
max_amount: number;
|
|
411
|
-
window?: number | undefined;
|
|
412
|
-
current_amount?: number | undefined;
|
|
413
|
-
}>, z.ZodObject<{
|
|
115
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
414
116
|
type: z.ZodLiteral<"combined">;
|
|
415
117
|
temporal: z.ZodOptional<z.ZodObject<{
|
|
416
118
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
417
119
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
418
120
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
419
|
-
},
|
|
420
|
-
valid_from?: number | undefined;
|
|
421
|
-
valid_until?: number | undefined;
|
|
422
|
-
duration?: number | undefined;
|
|
423
|
-
}, {
|
|
424
|
-
valid_from?: number | undefined;
|
|
425
|
-
valid_until?: number | undefined;
|
|
426
|
-
duration?: number | undefined;
|
|
427
|
-
}>>;
|
|
121
|
+
}, z.core.$strip>>;
|
|
428
122
|
usage: z.ZodOptional<z.ZodObject<{
|
|
429
123
|
max_uses: z.ZodNumber;
|
|
430
124
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
431
125
|
window: z.ZodOptional<z.ZodNumber>;
|
|
432
|
-
},
|
|
433
|
-
max_uses: number;
|
|
434
|
-
current_uses?: number | undefined;
|
|
435
|
-
window?: number | undefined;
|
|
436
|
-
}, {
|
|
437
|
-
max_uses: number;
|
|
438
|
-
current_uses?: number | undefined;
|
|
439
|
-
window?: number | undefined;
|
|
440
|
-
}>>;
|
|
126
|
+
}, z.core.$strip>>;
|
|
441
127
|
budget: z.ZodOptional<z.ZodObject<{
|
|
442
128
|
max_amount: z.ZodNumber;
|
|
443
129
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
444
130
|
window: z.ZodOptional<z.ZodNumber>;
|
|
445
131
|
currency: z.ZodString;
|
|
446
|
-
},
|
|
447
|
-
|
|
448
|
-
max_amount: number;
|
|
449
|
-
window?: number | undefined;
|
|
450
|
-
current_amount?: number | undefined;
|
|
451
|
-
}, {
|
|
452
|
-
currency: string;
|
|
453
|
-
max_amount: number;
|
|
454
|
-
window?: number | undefined;
|
|
455
|
-
current_amount?: number | undefined;
|
|
456
|
-
}>>;
|
|
457
|
-
}, "strip", z.ZodTypeAny, {
|
|
458
|
-
type: "combined";
|
|
459
|
-
temporal?: {
|
|
460
|
-
valid_from?: number | undefined;
|
|
461
|
-
valid_until?: number | undefined;
|
|
462
|
-
duration?: number | undefined;
|
|
463
|
-
} | undefined;
|
|
464
|
-
usage?: {
|
|
465
|
-
max_uses: number;
|
|
466
|
-
current_uses?: number | undefined;
|
|
467
|
-
window?: number | undefined;
|
|
468
|
-
} | undefined;
|
|
469
|
-
budget?: {
|
|
470
|
-
currency: string;
|
|
471
|
-
max_amount: number;
|
|
472
|
-
window?: number | undefined;
|
|
473
|
-
current_amount?: number | undefined;
|
|
474
|
-
} | undefined;
|
|
475
|
-
}, {
|
|
476
|
-
type: "combined";
|
|
477
|
-
temporal?: {
|
|
478
|
-
valid_from?: number | undefined;
|
|
479
|
-
valid_until?: number | undefined;
|
|
480
|
-
duration?: number | undefined;
|
|
481
|
-
} | undefined;
|
|
482
|
-
usage?: {
|
|
483
|
-
max_uses: number;
|
|
484
|
-
current_uses?: number | undefined;
|
|
485
|
-
window?: number | undefined;
|
|
486
|
-
} | undefined;
|
|
487
|
-
budget?: {
|
|
488
|
-
currency: string;
|
|
489
|
-
max_amount: number;
|
|
490
|
-
window?: number | undefined;
|
|
491
|
-
current_amount?: number | undefined;
|
|
492
|
-
} | undefined;
|
|
493
|
-
}>]>;
|
|
132
|
+
}, z.core.$strip>>;
|
|
133
|
+
}, z.core.$strip>], "type">;
|
|
494
134
|
scope: z.ZodOptional<z.ZodString>;
|
|
495
135
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
496
|
-
},
|
|
497
|
-
mandate: {
|
|
498
|
-
type: "temporal";
|
|
499
|
-
valid_from?: number | undefined;
|
|
500
|
-
valid_until?: number | undefined;
|
|
501
|
-
duration?: number | undefined;
|
|
502
|
-
} | {
|
|
503
|
-
type: "usage";
|
|
504
|
-
max_uses: number;
|
|
505
|
-
current_uses?: number | undefined;
|
|
506
|
-
window?: number | undefined;
|
|
507
|
-
} | {
|
|
508
|
-
currency: string;
|
|
509
|
-
type: "budget";
|
|
510
|
-
max_amount: number;
|
|
511
|
-
window?: number | undefined;
|
|
512
|
-
current_amount?: number | undefined;
|
|
513
|
-
} | {
|
|
514
|
-
type: "combined";
|
|
515
|
-
temporal?: {
|
|
516
|
-
valid_from?: number | undefined;
|
|
517
|
-
valid_until?: number | undefined;
|
|
518
|
-
duration?: number | undefined;
|
|
519
|
-
} | undefined;
|
|
520
|
-
usage?: {
|
|
521
|
-
max_uses: number;
|
|
522
|
-
current_uses?: number | undefined;
|
|
523
|
-
window?: number | undefined;
|
|
524
|
-
} | undefined;
|
|
525
|
-
budget?: {
|
|
526
|
-
currency: string;
|
|
527
|
-
max_amount: number;
|
|
528
|
-
window?: number | undefined;
|
|
529
|
-
current_amount?: number | undefined;
|
|
530
|
-
} | undefined;
|
|
531
|
-
};
|
|
532
|
-
scope?: string | undefined;
|
|
533
|
-
metadata?: Record<string, unknown> | undefined;
|
|
534
|
-
}, {
|
|
535
|
-
mandate: {
|
|
536
|
-
type: "temporal";
|
|
537
|
-
valid_from?: number | undefined;
|
|
538
|
-
valid_until?: number | undefined;
|
|
539
|
-
duration?: number | undefined;
|
|
540
|
-
} | {
|
|
541
|
-
type: "usage";
|
|
542
|
-
max_uses: number;
|
|
543
|
-
current_uses?: number | undefined;
|
|
544
|
-
window?: number | undefined;
|
|
545
|
-
} | {
|
|
546
|
-
currency: string;
|
|
547
|
-
type: "budget";
|
|
548
|
-
max_amount: number;
|
|
549
|
-
window?: number | undefined;
|
|
550
|
-
current_amount?: number | undefined;
|
|
551
|
-
} | {
|
|
552
|
-
type: "combined";
|
|
553
|
-
temporal?: {
|
|
554
|
-
valid_from?: number | undefined;
|
|
555
|
-
valid_until?: number | undefined;
|
|
556
|
-
duration?: number | undefined;
|
|
557
|
-
} | undefined;
|
|
558
|
-
usage?: {
|
|
559
|
-
max_uses: number;
|
|
560
|
-
current_uses?: number | undefined;
|
|
561
|
-
window?: number | undefined;
|
|
562
|
-
} | undefined;
|
|
563
|
-
budget?: {
|
|
564
|
-
currency: string;
|
|
565
|
-
max_amount: number;
|
|
566
|
-
window?: number | undefined;
|
|
567
|
-
current_amount?: number | undefined;
|
|
568
|
-
} | undefined;
|
|
569
|
-
};
|
|
570
|
-
scope?: string | undefined;
|
|
571
|
-
metadata?: Record<string, unknown> | undefined;
|
|
572
|
-
}>;
|
|
136
|
+
}, z.core.$strip>;
|
|
573
137
|
/**
|
|
574
138
|
* Control state schema
|
|
575
139
|
*/
|
|
576
140
|
export declare const ControlStateSchema: z.ZodObject<{
|
|
577
141
|
receipt_id: z.ZodString;
|
|
578
|
-
constraint: z.ZodDiscriminatedUnion<
|
|
142
|
+
constraint: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
579
143
|
type: z.ZodLiteral<"temporal">;
|
|
580
144
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
581
145
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
582
146
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
583
|
-
},
|
|
584
|
-
type: "temporal";
|
|
585
|
-
valid_from?: number | undefined;
|
|
586
|
-
valid_until?: number | undefined;
|
|
587
|
-
duration?: number | undefined;
|
|
588
|
-
}, {
|
|
589
|
-
type: "temporal";
|
|
590
|
-
valid_from?: number | undefined;
|
|
591
|
-
valid_until?: number | undefined;
|
|
592
|
-
duration?: number | undefined;
|
|
593
|
-
}>, z.ZodObject<{
|
|
147
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
594
148
|
type: z.ZodLiteral<"usage">;
|
|
595
149
|
max_uses: z.ZodNumber;
|
|
596
150
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
597
151
|
window: z.ZodOptional<z.ZodNumber>;
|
|
598
|
-
},
|
|
599
|
-
type: "usage";
|
|
600
|
-
max_uses: number;
|
|
601
|
-
current_uses?: number | undefined;
|
|
602
|
-
window?: number | undefined;
|
|
603
|
-
}, {
|
|
604
|
-
type: "usage";
|
|
605
|
-
max_uses: number;
|
|
606
|
-
current_uses?: number | undefined;
|
|
607
|
-
window?: number | undefined;
|
|
608
|
-
}>, z.ZodObject<{
|
|
152
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
609
153
|
type: z.ZodLiteral<"budget">;
|
|
610
154
|
max_amount: z.ZodNumber;
|
|
611
155
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
612
156
|
window: z.ZodOptional<z.ZodNumber>;
|
|
613
157
|
currency: z.ZodString;
|
|
614
|
-
},
|
|
615
|
-
currency: string;
|
|
616
|
-
type: "budget";
|
|
617
|
-
max_amount: number;
|
|
618
|
-
window?: number | undefined;
|
|
619
|
-
current_amount?: number | undefined;
|
|
620
|
-
}, {
|
|
621
|
-
currency: string;
|
|
622
|
-
type: "budget";
|
|
623
|
-
max_amount: number;
|
|
624
|
-
window?: number | undefined;
|
|
625
|
-
current_amount?: number | undefined;
|
|
626
|
-
}>, z.ZodObject<{
|
|
158
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
627
159
|
type: z.ZodLiteral<"combined">;
|
|
628
160
|
temporal: z.ZodOptional<z.ZodObject<{
|
|
629
161
|
valid_from: z.ZodOptional<z.ZodNumber>;
|
|
630
162
|
valid_until: z.ZodOptional<z.ZodNumber>;
|
|
631
163
|
duration: z.ZodOptional<z.ZodNumber>;
|
|
632
|
-
},
|
|
633
|
-
valid_from?: number | undefined;
|
|
634
|
-
valid_until?: number | undefined;
|
|
635
|
-
duration?: number | undefined;
|
|
636
|
-
}, {
|
|
637
|
-
valid_from?: number | undefined;
|
|
638
|
-
valid_until?: number | undefined;
|
|
639
|
-
duration?: number | undefined;
|
|
640
|
-
}>>;
|
|
164
|
+
}, z.core.$strip>>;
|
|
641
165
|
usage: z.ZodOptional<z.ZodObject<{
|
|
642
166
|
max_uses: z.ZodNumber;
|
|
643
167
|
current_uses: z.ZodOptional<z.ZodNumber>;
|
|
644
168
|
window: z.ZodOptional<z.ZodNumber>;
|
|
645
|
-
},
|
|
646
|
-
max_uses: number;
|
|
647
|
-
current_uses?: number | undefined;
|
|
648
|
-
window?: number | undefined;
|
|
649
|
-
}, {
|
|
650
|
-
max_uses: number;
|
|
651
|
-
current_uses?: number | undefined;
|
|
652
|
-
window?: number | undefined;
|
|
653
|
-
}>>;
|
|
169
|
+
}, z.core.$strip>>;
|
|
654
170
|
budget: z.ZodOptional<z.ZodObject<{
|
|
655
171
|
max_amount: z.ZodNumber;
|
|
656
172
|
current_amount: z.ZodOptional<z.ZodNumber>;
|
|
657
173
|
window: z.ZodOptional<z.ZodNumber>;
|
|
658
174
|
currency: z.ZodString;
|
|
659
|
-
},
|
|
660
|
-
|
|
661
|
-
max_amount: number;
|
|
662
|
-
window?: number | undefined;
|
|
663
|
-
current_amount?: number | undefined;
|
|
664
|
-
}, {
|
|
665
|
-
currency: string;
|
|
666
|
-
max_amount: number;
|
|
667
|
-
window?: number | undefined;
|
|
668
|
-
current_amount?: number | undefined;
|
|
669
|
-
}>>;
|
|
670
|
-
}, "strip", z.ZodTypeAny, {
|
|
671
|
-
type: "combined";
|
|
672
|
-
temporal?: {
|
|
673
|
-
valid_from?: number | undefined;
|
|
674
|
-
valid_until?: number | undefined;
|
|
675
|
-
duration?: number | undefined;
|
|
676
|
-
} | undefined;
|
|
677
|
-
usage?: {
|
|
678
|
-
max_uses: number;
|
|
679
|
-
current_uses?: number | undefined;
|
|
680
|
-
window?: number | undefined;
|
|
681
|
-
} | undefined;
|
|
682
|
-
budget?: {
|
|
683
|
-
currency: string;
|
|
684
|
-
max_amount: number;
|
|
685
|
-
window?: number | undefined;
|
|
686
|
-
current_amount?: number | undefined;
|
|
687
|
-
} | undefined;
|
|
688
|
-
}, {
|
|
689
|
-
type: "combined";
|
|
690
|
-
temporal?: {
|
|
691
|
-
valid_from?: number | undefined;
|
|
692
|
-
valid_until?: number | undefined;
|
|
693
|
-
duration?: number | undefined;
|
|
694
|
-
} | undefined;
|
|
695
|
-
usage?: {
|
|
696
|
-
max_uses: number;
|
|
697
|
-
current_uses?: number | undefined;
|
|
698
|
-
window?: number | undefined;
|
|
699
|
-
} | undefined;
|
|
700
|
-
budget?: {
|
|
701
|
-
currency: string;
|
|
702
|
-
max_amount: number;
|
|
703
|
-
window?: number | undefined;
|
|
704
|
-
current_amount?: number | undefined;
|
|
705
|
-
} | undefined;
|
|
706
|
-
}>]>;
|
|
175
|
+
}, z.core.$strip>>;
|
|
176
|
+
}, z.core.$strip>], "type">;
|
|
707
177
|
usage_count: z.ZodOptional<z.ZodNumber>;
|
|
708
178
|
spent_amount: z.ZodOptional<z.ZodNumber>;
|
|
709
179
|
first_use: z.ZodOptional<z.ZodNumber>;
|
|
710
180
|
last_use: z.ZodOptional<z.ZodNumber>;
|
|
711
181
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
712
|
-
},
|
|
713
|
-
receipt_id: string;
|
|
714
|
-
constraint: {
|
|
715
|
-
type: "temporal";
|
|
716
|
-
valid_from?: number | undefined;
|
|
717
|
-
valid_until?: number | undefined;
|
|
718
|
-
duration?: number | undefined;
|
|
719
|
-
} | {
|
|
720
|
-
type: "usage";
|
|
721
|
-
max_uses: number;
|
|
722
|
-
current_uses?: number | undefined;
|
|
723
|
-
window?: number | undefined;
|
|
724
|
-
} | {
|
|
725
|
-
currency: string;
|
|
726
|
-
type: "budget";
|
|
727
|
-
max_amount: number;
|
|
728
|
-
window?: number | undefined;
|
|
729
|
-
current_amount?: number | undefined;
|
|
730
|
-
} | {
|
|
731
|
-
type: "combined";
|
|
732
|
-
temporal?: {
|
|
733
|
-
valid_from?: number | undefined;
|
|
734
|
-
valid_until?: number | undefined;
|
|
735
|
-
duration?: number | undefined;
|
|
736
|
-
} | undefined;
|
|
737
|
-
usage?: {
|
|
738
|
-
max_uses: number;
|
|
739
|
-
current_uses?: number | undefined;
|
|
740
|
-
window?: number | undefined;
|
|
741
|
-
} | undefined;
|
|
742
|
-
budget?: {
|
|
743
|
-
currency: string;
|
|
744
|
-
max_amount: number;
|
|
745
|
-
window?: number | undefined;
|
|
746
|
-
current_amount?: number | undefined;
|
|
747
|
-
} | undefined;
|
|
748
|
-
};
|
|
749
|
-
first_use?: number | undefined;
|
|
750
|
-
metadata?: Record<string, unknown> | undefined;
|
|
751
|
-
usage_count?: number | undefined;
|
|
752
|
-
spent_amount?: number | undefined;
|
|
753
|
-
last_use?: number | undefined;
|
|
754
|
-
}, {
|
|
755
|
-
receipt_id: string;
|
|
756
|
-
constraint: {
|
|
757
|
-
type: "temporal";
|
|
758
|
-
valid_from?: number | undefined;
|
|
759
|
-
valid_until?: number | undefined;
|
|
760
|
-
duration?: number | undefined;
|
|
761
|
-
} | {
|
|
762
|
-
type: "usage";
|
|
763
|
-
max_uses: number;
|
|
764
|
-
current_uses?: number | undefined;
|
|
765
|
-
window?: number | undefined;
|
|
766
|
-
} | {
|
|
767
|
-
currency: string;
|
|
768
|
-
type: "budget";
|
|
769
|
-
max_amount: number;
|
|
770
|
-
window?: number | undefined;
|
|
771
|
-
current_amount?: number | undefined;
|
|
772
|
-
} | {
|
|
773
|
-
type: "combined";
|
|
774
|
-
temporal?: {
|
|
775
|
-
valid_from?: number | undefined;
|
|
776
|
-
valid_until?: number | undefined;
|
|
777
|
-
duration?: number | undefined;
|
|
778
|
-
} | undefined;
|
|
779
|
-
usage?: {
|
|
780
|
-
max_uses: number;
|
|
781
|
-
current_uses?: number | undefined;
|
|
782
|
-
window?: number | undefined;
|
|
783
|
-
} | undefined;
|
|
784
|
-
budget?: {
|
|
785
|
-
currency: string;
|
|
786
|
-
max_amount: number;
|
|
787
|
-
window?: number | undefined;
|
|
788
|
-
current_amount?: number | undefined;
|
|
789
|
-
} | undefined;
|
|
790
|
-
};
|
|
791
|
-
first_use?: number | undefined;
|
|
792
|
-
metadata?: Record<string, unknown> | undefined;
|
|
793
|
-
usage_count?: number | undefined;
|
|
794
|
-
spent_amount?: number | undefined;
|
|
795
|
-
last_use?: number | undefined;
|
|
796
|
-
}>;
|
|
182
|
+
}, z.core.$strip>;
|
|
797
183
|
export { ControlPurposeSchema, ControlLicensingModeSchema, ControlDecisionSchema, ControlStepSchema, ControlBlockSchema as ChainControlBlockSchema, } from '@peac/schema';
|
|
798
184
|
//# sourceMappingURL=validators.d.ts.map
|
package/dist/validators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8DxB;;GAEG;AACH,eAAO,MAAM,wBAAwB
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8DxB;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;iBAsBpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;iBAWjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;iBAWlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;iBAQpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAK3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ7B,CAAC;AAOH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EAKjB,kBAAkB,IAAI,uBAAuB,GAC9C,MAAM,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peac/control",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "PEAC Protocol Control - control engine interfaces and validation",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"zod": "^3.
|
|
23
|
-
"@peac/schema": "0.
|
|
22
|
+
"zod": "^4.3.6",
|
|
23
|
+
"@peac/schema": "0.11.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@types/node": "^
|
|
26
|
+
"@types/node": "^22.19.11",
|
|
27
27
|
"typescript": "^5.3.3",
|
|
28
28
|
"vitest": "^4.0.0",
|
|
29
29
|
"tsup": "^8.0.0"
|