@sentropic/llm-mesh 0.28.0 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +92 -0
  2. package/dist/capabilities.d.ts +3 -0
  3. package/dist/capabilities.d.ts.map +1 -1
  4. package/dist/capabilities.js.map +1 -1
  5. package/dist/catalog.d.ts +134 -1
  6. package/dist/catalog.d.ts.map +1 -1
  7. package/dist/catalog.js +15 -0
  8. package/dist/catalog.js.map +1 -1
  9. package/dist/decision/adapter-result.d.ts +6 -0
  10. package/dist/decision/adapter-result.d.ts.map +1 -0
  11. package/dist/decision/adapter-result.js +148 -0
  12. package/dist/decision/adapter-result.js.map +1 -0
  13. package/dist/decision/adapter.d.ts +58 -0
  14. package/dist/decision/adapter.d.ts.map +1 -0
  15. package/dist/decision/adapter.js +70 -0
  16. package/dist/decision/adapter.js.map +1 -0
  17. package/dist/decision/admission.d.ts +23 -0
  18. package/dist/decision/admission.d.ts.map +1 -0
  19. package/dist/decision/admission.js +115 -0
  20. package/dist/decision/admission.js.map +1 -0
  21. package/dist/decision/budget.d.ts +60 -0
  22. package/dist/decision/budget.d.ts.map +1 -0
  23. package/dist/decision/budget.js +2 -0
  24. package/dist/decision/budget.js.map +1 -0
  25. package/dist/decision/client.d.ts +23 -0
  26. package/dist/decision/client.d.ts.map +1 -0
  27. package/dist/decision/client.js +836 -0
  28. package/dist/decision/client.js.map +1 -0
  29. package/dist/decision/criterion.d.ts +5 -0
  30. package/dist/decision/criterion.d.ts.map +1 -0
  31. package/dist/decision/criterion.js +54 -0
  32. package/dist/decision/criterion.js.map +1 -0
  33. package/dist/decision/deadline.d.ts +8 -0
  34. package/dist/decision/deadline.d.ts.map +1 -0
  35. package/dist/decision/deadline.js +56 -0
  36. package/dist/decision/deadline.js.map +1 -0
  37. package/dist/decision/descriptor-validation.d.ts +5 -0
  38. package/dist/decision/descriptor-validation.d.ts.map +1 -0
  39. package/dist/decision/descriptor-validation.js +99 -0
  40. package/dist/decision/descriptor-validation.js.map +1 -0
  41. package/dist/decision/descriptor.d.ts +81 -0
  42. package/dist/decision/descriptor.d.ts.map +1 -0
  43. package/dist/decision/descriptor.js +36 -0
  44. package/dist/decision/descriptor.js.map +1 -0
  45. package/dist/decision/dispatch.d.ts +11 -0
  46. package/dist/decision/dispatch.d.ts.map +1 -0
  47. package/dist/decision/dispatch.js +56 -0
  48. package/dist/decision/dispatch.js.map +1 -0
  49. package/dist/decision/errors.d.ts +43 -0
  50. package/dist/decision/errors.d.ts.map +1 -0
  51. package/dist/decision/errors.js +47 -0
  52. package/dist/decision/errors.js.map +1 -0
  53. package/dist/decision/execution.d.ts +31 -0
  54. package/dist/decision/execution.d.ts.map +1 -0
  55. package/dist/decision/execution.js +79 -0
  56. package/dist/decision/execution.js.map +1 -0
  57. package/dist/decision/host-options.d.ts +26 -0
  58. package/dist/decision/host-options.d.ts.map +1 -0
  59. package/dist/decision/host-options.js +2 -0
  60. package/dist/decision/host-options.js.map +1 -0
  61. package/dist/decision/host.d.ts +14 -0
  62. package/dist/decision/host.d.ts.map +1 -0
  63. package/dist/decision/host.js +6 -0
  64. package/dist/decision/host.js.map +1 -0
  65. package/dist/decision/index.d.ts +12 -0
  66. package/dist/decision/index.d.ts.map +1 -0
  67. package/dist/decision/index.js +3 -0
  68. package/dist/decision/index.js.map +1 -0
  69. package/dist/decision/jev-codec.d.ts +30 -0
  70. package/dist/decision/jev-codec.d.ts.map +1 -0
  71. package/dist/decision/jev-codec.js +51 -0
  72. package/dist/decision/jev-codec.js.map +1 -0
  73. package/dist/decision/jev-response.d.ts +7 -0
  74. package/dist/decision/jev-response.d.ts.map +1 -0
  75. package/dist/decision/jev-response.js +42 -0
  76. package/dist/decision/jev-response.js.map +1 -0
  77. package/dist/decision/jev-verdict.d.ts +14 -0
  78. package/dist/decision/jev-verdict.d.ts.map +1 -0
  79. package/dist/decision/jev-verdict.js +71 -0
  80. package/dist/decision/jev-verdict.js.map +1 -0
  81. package/dist/decision/policy.d.ts +11 -0
  82. package/dist/decision/policy.d.ts.map +1 -0
  83. package/dist/decision/policy.js +33 -0
  84. package/dist/decision/policy.js.map +1 -0
  85. package/dist/decision/pricing.d.ts +40 -0
  86. package/dist/decision/pricing.d.ts.map +1 -0
  87. package/dist/decision/pricing.js +65 -0
  88. package/dist/decision/pricing.js.map +1 -0
  89. package/dist/decision/raw.d.ts +7 -0
  90. package/dist/decision/raw.d.ts.map +1 -0
  91. package/dist/decision/raw.js +53 -0
  92. package/dist/decision/raw.js.map +1 -0
  93. package/dist/decision/receipt.d.ts +120 -0
  94. package/dist/decision/receipt.d.ts.map +1 -0
  95. package/dist/decision/receipt.js +58 -0
  96. package/dist/decision/receipt.js.map +1 -0
  97. package/dist/decision/request-policy.d.ts +3 -0
  98. package/dist/decision/request-policy.d.ts.map +1 -0
  99. package/dist/decision/request-policy.js +19 -0
  100. package/dist/decision/request-policy.js.map +1 -0
  101. package/dist/decision/request.d.ts +85 -0
  102. package/dist/decision/request.d.ts.map +1 -0
  103. package/dist/decision/request.js +49 -0
  104. package/dist/decision/request.js.map +1 -0
  105. package/dist/decision/service.d.ts +39 -0
  106. package/dist/decision/service.d.ts.map +1 -0
  107. package/dist/decision/service.js +138 -0
  108. package/dist/decision/service.js.map +1 -0
  109. package/dist/decision/structured.d.ts +125 -0
  110. package/dist/decision/structured.d.ts.map +1 -0
  111. package/dist/decision/structured.js +250 -0
  112. package/dist/decision/structured.js.map +1 -0
  113. package/dist/decision/validate-result.d.ts +8 -0
  114. package/dist/decision/validate-result.d.ts.map +1 -0
  115. package/dist/decision/validate-result.js +91 -0
  116. package/dist/decision/validate-result.js.map +1 -0
  117. package/dist/decision/validation-context.d.ts +55 -0
  118. package/dist/decision/validation-context.d.ts.map +1 -0
  119. package/dist/decision/validation-context.js +134 -0
  120. package/dist/decision/validation-context.js.map +1 -0
  121. package/dist/decision/validation.d.ts +19 -0
  122. package/dist/decision/validation.d.ts.map +1 -0
  123. package/dist/decision/validation.js +86 -0
  124. package/dist/decision/validation.js.map +1 -0
  125. package/dist/decision/verdict.d.ts +81 -0
  126. package/dist/decision/verdict.d.ts.map +1 -0
  127. package/dist/decision/verdict.js +140 -0
  128. package/dist/decision/verdict.js.map +1 -0
  129. package/dist/providers.d.ts +4 -3
  130. package/dist/providers.d.ts.map +1 -1
  131. package/dist/providers.js +2 -1
  132. package/dist/providers.js.map +1 -1
  133. package/dist/registry.d.ts +6 -0
  134. package/dist/registry.d.ts.map +1 -1
  135. package/dist/registry.js.map +1 -1
  136. package/dist/transport/jev.d.ts +23 -0
  137. package/dist/transport/jev.d.ts.map +1 -0
  138. package/dist/transport/jev.js +107 -0
  139. package/dist/transport/jev.js.map +1 -0
  140. package/package.json +13 -1
@@ -0,0 +1,43 @@
1
+ declare const messages: {
2
+ readonly REQUEST_INVALID: "Invalid decision request.";
3
+ readonly PROVIDER_UNKNOWN: "Unknown decision provider.";
4
+ readonly EVALUATOR_UNKNOWN: "Unknown evaluator.";
5
+ readonly CAPABILITY_UNSUPPORTED: "Requested decision capability is unsupported.";
6
+ readonly PROVIDER_UNAVAILABLE: "Decision provider is unavailable.";
7
+ readonly REVISION_MISMATCH: "Evaluator revision does not match.";
8
+ readonly CREDENTIAL_MISSING: "Decision credential is missing.";
9
+ readonly AUTHENTICATION_FAILED: "Authentication failed.";
10
+ readonly AUTHORIZATION_DENIED: "Decision authorization denied.";
11
+ readonly PRICING_UNAVAILABLE: "Decision pricing is unavailable.";
12
+ readonly BUDGET_BOUND_UNAVAILABLE: "A finite decision liability bound is unavailable.";
13
+ readonly BUDGET_EXHAUSTED: "Decision budget is exhausted.";
14
+ readonly BUDGET_UNAVAILABLE: "Decision budget authority is unavailable.";
15
+ readonly SETTLEMENT_UNAVAILABLE: "Decision settlement is unavailable.";
16
+ readonly RATE_LIMITED: "Decision provider rate limit reached.";
17
+ readonly PROVIDER_OVERLOADED: "Decision provider is overloaded.";
18
+ readonly PROVIDER_REJECTED: "Decision provider rejected the request.";
19
+ readonly TIMEOUT: "Decision deadline exceeded.";
20
+ readonly CANCELLED: "Decision invocation cancelled.";
21
+ readonly TRANSPORT_FAILED: "Decision transport failed.";
22
+ readonly VERDICT_INVALID: "Invalid decision verdict.";
23
+ readonly SERVED_IDENTITY_MISMATCH: "Served evaluator identity does not match.";
24
+ readonly USAGE_INVALID: "Invalid decision usage.";
25
+ readonly RESPONSE_TOO_LARGE: "Decision response exceeds its size limit.";
26
+ readonly RECEIPT_UNAVAILABLE: "Decision receipt persistence is unavailable.";
27
+ readonly MESH_UNAVAILABLE: "Decision mesh is unavailable.";
28
+ };
29
+ export type DecisionErrorCode = keyof typeof messages;
30
+ export interface DecisionError {
31
+ code: DecisionErrorCode;
32
+ message: string;
33
+ phase: 'preflight' | 'admission' | 'dispatch' | 'parse' | 'settlement';
34
+ retryable: boolean;
35
+ retryAfterMs?: number;
36
+ }
37
+ export declare const isDecisionErrorCode: (value: unknown) => value is "REQUEST_INVALID" | "CAPABILITY_UNSUPPORTED" | "PROVIDER_UNKNOWN" | "EVALUATOR_UNKNOWN" | "PROVIDER_UNAVAILABLE" | "REVISION_MISMATCH" | "CREDENTIAL_MISSING" | "AUTHENTICATION_FAILED" | "AUTHORIZATION_DENIED" | "PRICING_UNAVAILABLE" | "BUDGET_BOUND_UNAVAILABLE" | "BUDGET_EXHAUSTED" | "BUDGET_UNAVAILABLE" | "SETTLEMENT_UNAVAILABLE" | "RATE_LIMITED" | "PROVIDER_OVERLOADED" | "PROVIDER_REJECTED" | "TIMEOUT" | "CANCELLED" | "TRANSPORT_FAILED" | "VERDICT_INVALID" | "SERVED_IDENTITY_MISMATCH" | "USAGE_INVALID" | "RESPONSE_TOO_LARGE" | "RECEIPT_UNAVAILABLE" | "MESH_UNAVAILABLE";
38
+ /** Static wording only. Retry hints never authorize replay or evaluator substitution. */
39
+ export declare function createDecisionError(code: DecisionErrorCode, phase: DecisionError['phase'], options?: {
40
+ retryAfterMs?: number;
41
+ }): DecisionError;
42
+ export {};
43
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/decision/errors.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BJ,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,QAAQ,CAAC;AACtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;IACvE,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,mBAAmB,UAAW,OAAO,+kBACC,CAAC;AAKpD,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EACxF,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,aAAa,CAYxD"}
@@ -0,0 +1,47 @@
1
+ import { has } from './validation.js';
2
+ const messages = {
3
+ REQUEST_INVALID: 'Invalid decision request.',
4
+ PROVIDER_UNKNOWN: 'Unknown decision provider.',
5
+ EVALUATOR_UNKNOWN: 'Unknown evaluator.',
6
+ CAPABILITY_UNSUPPORTED: 'Requested decision capability is unsupported.',
7
+ PROVIDER_UNAVAILABLE: 'Decision provider is unavailable.',
8
+ REVISION_MISMATCH: 'Evaluator revision does not match.',
9
+ CREDENTIAL_MISSING: 'Decision credential is missing.',
10
+ AUTHENTICATION_FAILED: 'Authentication failed.',
11
+ AUTHORIZATION_DENIED: 'Decision authorization denied.',
12
+ PRICING_UNAVAILABLE: 'Decision pricing is unavailable.',
13
+ BUDGET_BOUND_UNAVAILABLE: 'A finite decision liability bound is unavailable.',
14
+ BUDGET_EXHAUSTED: 'Decision budget is exhausted.',
15
+ BUDGET_UNAVAILABLE: 'Decision budget authority is unavailable.',
16
+ SETTLEMENT_UNAVAILABLE: 'Decision settlement is unavailable.',
17
+ RATE_LIMITED: 'Decision provider rate limit reached.',
18
+ PROVIDER_OVERLOADED: 'Decision provider is overloaded.',
19
+ PROVIDER_REJECTED: 'Decision provider rejected the request.',
20
+ TIMEOUT: 'Decision deadline exceeded.',
21
+ CANCELLED: 'Decision invocation cancelled.',
22
+ TRANSPORT_FAILED: 'Decision transport failed.',
23
+ VERDICT_INVALID: 'Invalid decision verdict.',
24
+ SERVED_IDENTITY_MISMATCH: 'Served evaluator identity does not match.',
25
+ USAGE_INVALID: 'Invalid decision usage.',
26
+ RESPONSE_TOO_LARGE: 'Decision response exceeds its size limit.',
27
+ RECEIPT_UNAVAILABLE: 'Decision receipt persistence is unavailable.',
28
+ MESH_UNAVAILABLE: 'Decision mesh is unavailable.',
29
+ };
30
+ export const isDecisionErrorCode = (value) => typeof value === 'string' && has(messages, value);
31
+ // Advisory delay ceiling matches the maximum decision request deadline.
32
+ const maxRetryAfterMs = 60_000;
33
+ /** Static wording only. Retry hints never authorize replay or evaluator substitution. */
34
+ export function createDecisionError(code, phase, options = {}) {
35
+ const safeCode = isDecisionErrorCode(code) ? code : 'REQUEST_INVALID';
36
+ const safePhase = ['preflight', 'admission', 'dispatch', 'parse', 'settlement'].includes(phase) ? phase : 'preflight';
37
+ const financialUnavailable = ['BUDGET_UNAVAILABLE', 'SETTLEMENT_UNAVAILABLE', 'RECEIPT_UNAVAILABLE'].includes(safeCode);
38
+ const retryable = phase === safePhase && safePhase !== 'settlement' && (financialUnavailable
39
+ ? safePhase === 'preflight' || safePhase === 'admission'
40
+ : ['PROVIDER_UNAVAILABLE', 'RATE_LIMITED', 'PROVIDER_OVERLOADED', 'TIMEOUT', 'TRANSPORT_FAILED', 'MESH_UNAVAILABLE'].includes(safeCode));
41
+ const hint = options.retryAfterMs;
42
+ return { code: safeCode, message: messages[safeCode],
43
+ phase: safePhase, retryable,
44
+ ...(retryable && typeof hint === 'number' && Number.isSafeInteger(hint) && hint >= 0
45
+ && hint <= maxRetryAfterMs ? { retryAfterMs: hint } : {}) };
46
+ }
47
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/decision/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,QAAQ,GAAG;IACf,eAAe,EAAE,2BAA2B;IAC5C,gBAAgB,EAAE,4BAA4B;IAC9C,iBAAiB,EAAE,oBAAoB;IACvC,sBAAsB,EAAE,+CAA+C;IACvE,oBAAoB,EAAE,mCAAmC;IACzD,iBAAiB,EAAE,oCAAoC;IACvD,kBAAkB,EAAE,iCAAiC;IACrD,qBAAqB,EAAE,wBAAwB;IAC/C,oBAAoB,EAAE,gCAAgC;IACtD,mBAAmB,EAAE,kCAAkC;IACvD,wBAAwB,EAAE,mDAAmD;IAC7E,gBAAgB,EAAE,+BAA+B;IACjD,kBAAkB,EAAE,2CAA2C;IAC/D,sBAAsB,EAAE,qCAAqC;IAC7D,YAAY,EAAE,uCAAuC;IACrD,mBAAmB,EAAE,kCAAkC;IACvD,iBAAiB,EAAE,yCAAyC;IAC5D,OAAO,EAAE,6BAA6B;IACtC,SAAS,EAAE,gCAAgC;IAC3C,gBAAgB,EAAE,4BAA4B;IAC9C,eAAe,EAAE,2BAA2B;IAC5C,wBAAwB,EAAE,2CAA2C;IACrE,aAAa,EAAE,yBAAyB;IACxC,kBAAkB,EAAE,2CAA2C;IAC/D,mBAAmB,EAAE,8CAA8C;IACnE,gBAAgB,EAAE,+BAA+B;CACzC,CAAC;AAWX,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAA8B,EAAE,CAChF,OAAO,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAEpD,wEAAwE;AACxE,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,yFAAyF;AACzF,MAAM,UAAU,mBAAmB,CAAC,IAAuB,EAAE,KAA6B,EACxF,UAAqC,EAAE;IACvC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACtE,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;IACtH,MAAM,oBAAoB,GAAG,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxH,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,YAAY,IAAI,CAAC,oBAAoB;QAC1F,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,WAAW;QACxD,CAAC,CAAC,CAAC,sBAAsB,EAAE,cAAc,EAAE,qBAAqB,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3I,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAClD,KAAK,EAAE,SAAS,EAAE,SAAS;QAC3B,GAAG,CAAC,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;eAC/E,IAAI,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { DecisionError } from './errors.js';
2
+ import type { DecisionReceipt, DecisionResult } from './receipt.js';
3
+ import type { DecisionVerdict } from './verdict.js';
4
+ import type { DecisionReceiptSink } from './budget.js';
5
+ export interface DecisionClock {
6
+ wall(): number;
7
+ monotonic(): number;
8
+ }
9
+ export interface DecisionExecution {
10
+ receipt: DecisionReceipt;
11
+ clock: DecisionClock;
12
+ start: number;
13
+ deadline: number;
14
+ signal?: AbortSignal;
15
+ idError: boolean;
16
+ phase: DecisionError['phase'];
17
+ expired: boolean;
18
+ }
19
+ export declare const defaultDecisionClock: DecisionClock;
20
+ export declare function beginDecisionExecution(candidate: unknown, options: {
21
+ clock?: DecisionClock;
22
+ generateId?: () => string;
23
+ signal?: AbortSignal;
24
+ timeoutMs?: number;
25
+ }): DecisionExecution;
26
+ export declare function decisionInterruption(execution: DecisionExecution, phase: DecisionError['phase']): DecisionError | null;
27
+ export declare function closeDecisionReceipt(execution: DecisionExecution, error?: DecisionError): void;
28
+ /** Copies before crossing host boundaries: no live provider envelope or caller content. */
29
+ export declare function copyDecisionReceipt(receipt: DecisionReceipt): DecisionReceipt;
30
+ export declare function persistDecisionResult(execution: DecisionExecution, sink: DecisionReceiptSink, error?: DecisionError, verdict?: DecisionVerdict): Promise<DecisionResult>;
31
+ //# sourceMappingURL=execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/decision/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAKpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,aAAa;IAAG,IAAI,IAAI,MAAM,CAAC;IAAC,SAAS,IAAI,MAAM,CAAA;CAAE;AACtE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IACxH,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;CACjD;AACD,eAAO,MAAM,oBAAoB,EAAE,aAA8E,CAAC;AAElH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,aAAa,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;IACrH,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CAoB/D;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG,IAAI,CAItH;AACD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAO9F;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe,CAAyD;AACvI,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,mBAAmB,EACjG,KAAK,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAyB3E"}
@@ -0,0 +1,79 @@
1
+ import { createDecisionError } from './errors.js';
2
+ import { resolveDecisionCorrelationId, unreportedDecisionUsage } from './receipt.js';
3
+ import { parseDecisionRequest } from './request.js';
4
+ import { isCorrelationId } from './validation.js';
5
+ import { freezeDecisionData } from './descriptor-validation.js';
6
+ export const defaultDecisionClock = { wall: () => Date.now(), monotonic: () => performance.now() };
7
+ export function beginDecisionExecution(candidate, options) {
8
+ const clock = options.clock ?? defaultDecisionClock;
9
+ const start = clock.monotonic();
10
+ const parsed = parseDecisionRequest(candidate);
11
+ const generate = options.generateId ?? (() => globalThis.crypto.randomUUID());
12
+ let callId = null;
13
+ let correlationId = null;
14
+ try {
15
+ callId = generate();
16
+ correlationId = resolveDecisionCorrelationId(parsed.ok ? parsed.request.correlationId : undefined, generate);
17
+ }
18
+ catch { /* Failed metadata generation is a typed refusal, with safe mandatory IDs. */ }
19
+ const idError = !isCorrelationId(callId) || correlationId === null;
20
+ const receipt = { schemaVersion: 1,
21
+ callId: isCorrelationId(callId) ? callId : globalThis.crypto.randomUUID(),
22
+ correlationId: correlationId ?? globalThis.crypto.randomUUID(), evaluator: parsed.ok ? parsed.request.evaluator : null,
23
+ servedEvaluator: null, servedModelId: null, startedAt: new Date(clock.wall()).toISOString(),
24
+ finishedAt: new Date(clock.wall()).toISOString(), latencyMs: 0, dispatch: 'not-started', attempts: 0,
25
+ usage: unreportedDecisionUsage('not-dispatched'), cost: { status: 'not-incurred', amountMicroUsd: '0', source: 'no-dispatch' },
26
+ retention: { status: 'not-evaluated', basis: 'none', evidenceRefs: [], retentionDays: null },
27
+ budget: { state: 'not-admitted', overrun: false }, outcome: 'error' };
28
+ const timeout = Math.min(parsed.ok ? parsed.request.policy?.timeoutMs ?? 10000 : 10000, options.timeoutMs ?? 60000);
29
+ return { receipt, clock, start, deadline: start + timeout, signal: options.signal, idError, phase: 'preflight', expired: false };
30
+ }
31
+ export function decisionInterruption(execution, phase) {
32
+ return (execution.expired || execution.clock.monotonic() >= execution.deadline)
33
+ ? createDecisionError('TIMEOUT', phase)
34
+ : execution.signal?.aborted ? createDecisionError('CANCELLED', phase) : null;
35
+ }
36
+ export function closeDecisionReceipt(execution, error) {
37
+ const receipt = execution.receipt;
38
+ receipt.finishedAt = new Date(execution.clock.wall()).toISOString();
39
+ receipt.latencyMs = Math.max(0, execution.clock.monotonic() - execution.start);
40
+ receipt.outcome = error ? 'error' : 'verdict';
41
+ if (error)
42
+ receipt.errorCode = error.code;
43
+ else
44
+ delete receipt.errorCode;
45
+ }
46
+ /** Copies before crossing host boundaries: no live provider envelope or caller content. */
47
+ export function copyDecisionReceipt(receipt) { return freezeDecisionData(structuredClone(receipt)); }
48
+ export async function persistDecisionResult(execution, sink, error, verdict) {
49
+ execution.phase = 'settlement';
50
+ if (error)
51
+ closeDecisionReceipt(execution, error);
52
+ try {
53
+ await sink.persist(copyDecisionReceipt(execution.receipt));
54
+ }
55
+ catch {
56
+ error = createDecisionError('RECEIPT_UNAVAILABLE', 'settlement');
57
+ if (execution.receipt.attempts)
58
+ execution.receipt.budget.state = 'pending-reconciliation';
59
+ closeDecisionReceipt(execution, error);
60
+ }
61
+ // Persistence can complete after the caller's deadline; accounting is never replayed.
62
+ const interrupted = !error ? decisionInterruption(execution, execution.receipt.attempts ? 'settlement' : 'preflight') : null;
63
+ if (interrupted) {
64
+ error = interrupted;
65
+ if (execution.receipt.budget.state !== 'not-admitted' && execution.receipt.budget.state !== 'released') {
66
+ execution.receipt.budget.state = 'pending-reconciliation';
67
+ error.retryable = false;
68
+ delete error.retryAfterMs;
69
+ }
70
+ }
71
+ if (error) {
72
+ closeDecisionReceipt(execution, error);
73
+ return { kind: 'error', ok: false, error, receipt: copyDecisionReceipt(execution.receipt) };
74
+ }
75
+ if (!verdict)
76
+ throw new Error('Decision result requires validated evidence.');
77
+ return { kind: 'verdict', ok: true, verdict, receipt: copyDecisionReceipt(execution.receipt) };
78
+ }
79
+ //# sourceMappingURL=execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/decision/execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { AuthResolver } from '../auth.js';
2
+ import type { DecisionSelectionOptions } from './service.js';
3
+ import type { DecisionBudgetPort, DecisionReceiptSink } from './budget.js';
4
+ import type { DecisionClock } from './execution.js';
5
+ import type { EvaluatorRef } from './request.js';
6
+ export interface DecisionPriceLookupKey {
7
+ providerId: string;
8
+ modelId: string;
9
+ /** Backend protocol, price authority and protocol-specific revision carried
10
+ * from the authoritative descriptor, so one revision cannot silently serve
11
+ * two authorities or protocols. */
12
+ protocol: string;
13
+ authority: string;
14
+ priceRevision: string;
15
+ }
16
+ export interface DecisionServiceOptions extends DecisionSelectionOptions {
17
+ resolveAuth: AuthResolver;
18
+ resolvePrice(key: DecisionPriceLookupKey): unknown | Promise<unknown>;
19
+ /** Closed over verified caller identity; request JSON never selects financial ownership. */
20
+ authorize(evaluator: EvaluatorRef): boolean | Promise<boolean>;
21
+ budget: DecisionBudgetPort;
22
+ receipts: DecisionReceiptSink;
23
+ clock?: DecisionClock;
24
+ generateId?: () => string;
25
+ }
26
+ //# sourceMappingURL=host-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-options.d.ts","sourceRoot":"","sources":["../../src/decision/host-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IACpC;;uCAEmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;CAC5D;AAED,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACtE,WAAW,EAAE,YAAY,CAAC;IAC1B,YAAY,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,4FAA4F;IAC5F,SAAS,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=host-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-options.js","sourceRoot":"","sources":["../../src/decision/host-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ /** Host custody and financial authority. Never import this surface into a consumer. */
2
+ export { createDecisionService } from './service.js';
3
+ export { createJevAdapter } from './adapter.js';
4
+ export { createStructuredDecisionAdapter, STRUCTURED_CONTRACT_REVISION, STRUCTURED_SCORE_MEANING } from './structured.js';
5
+ export { jevDescriptor } from './descriptor.js';
6
+ export type { JevAdapterOptions } from './adapter.js';
7
+ export type { StructuredDecisionTransport, StructuredProviderEnvelope, StructuredDecisionPayload, StructuredDecisionAdapterOptions, DecisionBackend } from './structured.js';
8
+ export type { DecisionServiceOptions, DecisionPriceLookupKey } from './host-options.js';
9
+ export type { DecisionHostPolicy } from './policy.js';
10
+ export type { DecisionEvaluatorDescriptor, ResolvedDecisionCriterion } from './descriptor.js';
11
+ export type { DecisionBudgetPort, DecisionReceiptSink, DecisionAdmission, DecisionAdmissionResult, DecisionDispatchResult, DecisionSettlement } from './budget.js';
12
+ export type { DecisionPrice, DecisionQuote } from './pricing.js';
13
+ export type { DecisionClock } from './execution.js';
14
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/decision/host.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC1H,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,gCAAgC,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7K,YAAY,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxF,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,uBAAuB,EAC/F,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Host custody and financial authority. Never import this surface into a consumer. */
2
+ export { createDecisionService } from './service.js';
3
+ export { createJevAdapter } from './adapter.js';
4
+ export { createStructuredDecisionAdapter, STRUCTURED_CONTRACT_REVISION, STRUCTURED_SCORE_MEANING } from './structured.js';
5
+ export { jevDescriptor } from './descriptor.js';
6
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/decision/host.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,+BAA+B,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC1H,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Consumer contracts and portable remote mesh client. */
2
+ export type { EvaluatorRef, DecisionRequest, DecisionInputs, DecisionCriterion, DecisionRule, Json, MicroUsd } from './request.js';
3
+ export type { DecisionVerdict, DecisionScore, ScoreScale } from './verdict.js';
4
+ export type { DecisionAdapterResult } from './adapter.js';
5
+ export type { DecisionError, DecisionErrorCode } from './errors.js';
6
+ export type { DecisionClient, DecisionResult, DecisionReceipt, DecisionUsage, DecisionCost, RetentionReceipt, TokenCounter, TotalTokenCounter, DecisionConnectionFailure, RemoteDecisionClient } from './receipt.js';
7
+ export { createRemoteDecisionClient } from './client.js';
8
+ export { validateDecisionResult } from './validate-result.js';
9
+ export type { RemoteDecisionClientOptions } from './client.js';
10
+ export type { ResolvedDecisionCriterion } from './descriptor.js';
11
+ export type { DecisionValidationContext, DecisionValidationProfile, DecisionValidationSemantics, DecisionValidationScoreSemantics, DecisionValidationConfidenceSemantics, DecisionRegisteredResolution, DirectDecisionCriterion, DecisionValidationContextResolver } from './validation-context.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decision/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnI,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/E,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAC1G,YAAY,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzG,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,2BAA2B,EAC7F,gCAAgC,EAAE,qCAAqC,EAAE,4BAA4B,EACrG,uBAAuB,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createRemoteDecisionClient } from './client.js';
2
+ export { validateDecisionResult } from './validate-result.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decision/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { DecisionRequest } from './request.js';
2
+ import type { DecisionEvaluatorDescriptor, ResolvedDecisionCriterion } from './descriptor.js';
3
+ import type { DecisionErrorCode } from './errors.js';
4
+ export interface JevRequestBody {
5
+ model: string;
6
+ state: DecisionRequest['inputs'];
7
+ questions: {
8
+ verdict: {
9
+ type: 'noul' | 'score' | 'choice';
10
+ instructions: string;
11
+ criteria?: {
12
+ true: string;
13
+ false: string;
14
+ } | readonly string[] | Record<string, string>;
15
+ };
16
+ };
17
+ }
18
+ export type JevEncoding = {
19
+ ok: true;
20
+ body: JevRequestBody;
21
+ bodyJson: string;
22
+ request: DecisionRequest;
23
+ criterion: ResolvedDecisionCriterion;
24
+ } | {
25
+ ok: false;
26
+ code: DecisionErrorCode;
27
+ };
28
+ /** One question, no instruction/content concatenation, coercion or omitted significant fields. */
29
+ export declare function encodeJevRequest(candidate: unknown, descriptor: DecisionEvaluatorDescriptor): JevEncoding;
30
+ //# sourceMappingURL=jev-codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev-codec.d.ts","sourceRoot":"","sources":["../../src/decision/jev-codec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAG9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,EAAE;QAAE,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAC9E,QAAQ,CAAC,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/F;AACD,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,yBAAyB,CAAA;CAAE,GAC1I;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAE3C,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,2BAA2B,GAAG,WAAW,CAoCzG"}
@@ -0,0 +1,51 @@
1
+ import { parseDecisionRequest } from './request.js';
2
+ import { isDecisionCriterion } from './criterion.js';
3
+ import { snapshotBoundedJson } from './validation.js';
4
+ /** One question, no instruction/content concatenation, coercion or omitted significant fields. */
5
+ export function encodeJevRequest(candidate, descriptor) {
6
+ const parsed = parseDecisionRequest(candidate);
7
+ if (!parsed.ok)
8
+ return parsed;
9
+ const request = parsed.request;
10
+ if (request.evaluator.providerId !== descriptor.evaluator.providerId
11
+ || request.evaluator.evaluatorId !== descriptor.evaluator.evaluatorId)
12
+ return { ok: false, code: 'EVALUATOR_UNKNOWN' };
13
+ if (request.evaluator.revision !== descriptor.evaluator.revision)
14
+ return { ok: false, code: 'REVISION_MISMATCH' };
15
+ let criterion;
16
+ if (request.criterion.kind === 'registered') {
17
+ const ref = request.criterion;
18
+ const found = descriptor.registeredCriteria.find((entry) => entry.criteriaId === ref.criteriaId && entry.revision === ref.revision);
19
+ const snapshot = snapshotBoundedJson(found?.criterion);
20
+ if (!snapshot.ok || !isDecisionCriterion(snapshot.value) || snapshot.value.kind === 'registered') {
21
+ return { ok: false, code: 'CAPABILITY_UNSUPPORTED' };
22
+ }
23
+ criterion = snapshot.value;
24
+ }
25
+ else
26
+ criterion = request.criterion;
27
+ if ((criterion.kind === 'graded' && (criterion.levels.length < 2 || criterion.levels.length > 10))
28
+ || (criterion.kind === 'choice' && criterion.options.length > 255))
29
+ return { ok: false, code: 'CAPABILITY_UNSUPPORTED' };
30
+ const question = { type: criterion.kind === 'binary' ? 'noul'
31
+ : criterion.kind === 'graded' ? 'score' : 'choice', instructions: criterion.instructions };
32
+ if (criterion.kind === 'binary' && criterion.criteria)
33
+ question.criteria = { ...criterion.criteria };
34
+ if (criterion.kind === 'graded')
35
+ question.criteria = criterion.levels.map((level) => level.description);
36
+ if (criterion.kind === 'choice')
37
+ question.criteria = Object.fromEntries(criterion.options.map((option) => [option.id, option.description]));
38
+ const body = { model: descriptor.wireModel, state: request.inputs, questions: { verdict: question } };
39
+ // JSON.stringify reorders integer-like map keys; serialize choice entries in caller order.
40
+ const questionJson = criterion.kind !== 'choice' ? JSON.stringify(question)
41
+ : JSON.stringify({ type: question.type, instructions: question.instructions }).slice(0, -1)
42
+ + ',"criteria":{' + criterion.options.map((option) => JSON.stringify(option.id) + ':' + JSON.stringify(option.description)).join(',') + '}}';
43
+ const stateJson = JSON.stringify(body.state);
44
+ const bodyJson = '{"model":' + JSON.stringify(body.model) + ',"state":' + stateJson + ',"questions":{"verdict":' + questionJson + '}}';
45
+ const bytes = (value) => new TextEncoder().encode(value).byteLength;
46
+ if (bytes(bodyJson) > descriptor.maxRequestBytes || bytes(stateJson) + bytes(questionJson) > descriptor.maxStateQuestionBytes) {
47
+ return { ok: false, code: 'REQUEST_INVALID' };
48
+ }
49
+ return { ok: true, body, bodyJson, request, criterion };
50
+ }
51
+ //# sourceMappingURL=jev-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev-codec.js","sourceRoot":"","sources":["../../src/decision/jev-codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DecisionAdapterResult } from './adapter.js';
2
+ import type { DecisionEvaluatorDescriptor } from './descriptor.js';
3
+ import type { DecisionRequest } from './request.js';
4
+ export declare const sanitizeJevId: (value: unknown) => string | null;
5
+ /** Validate identity, counters and verdict separately; refusal never discards valid counters. */
6
+ export declare function decodeJevResponse(candidate: unknown, request: DecisionRequest, descriptor: DecisionEvaluatorDescriptor, requestId?: unknown): DecisionAdapterResult;
7
+ //# sourceMappingURL=jev-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev-response.d.ts","sourceRoot":"","sources":["../../src/decision/jev-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,MAAM,GAAG,IACc,CAAC;AAGvE,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,2BAA2B,EACrH,SAAS,CAAC,EAAE,OAAO,GAAG,qBAAqB,CA6B5C"}
@@ -0,0 +1,42 @@
1
+ import { createDecisionError } from './errors.js';
2
+ import { parseDecisionUsage, unreportedDecisionUsage } from './receipt.js';
3
+ import { decodeJevVerdict } from './jev-verdict.js';
4
+ import { has, hasOnlyKeys, isRecord, snapshotBoundedJson } from './validation.js';
5
+ export const sanitizeJevId = (value) => typeof value === 'string'
6
+ && /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/.test(value) ? value : null;
7
+ const count = (value) => typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
8
+ /** Validate identity, counters and verdict separately; refusal never discards valid counters. */
9
+ export function decodeJevResponse(candidate, request, descriptor, requestId) {
10
+ const snapshot = snapshotBoundedJson(candidate);
11
+ const body = snapshot.ok && isRecord(snapshot.value) ? snapshot.value : null;
12
+ const servedModelId = sanitizeJevId(body?.model);
13
+ const providerRequestId = sanitizeJevId(requestId);
14
+ const answered = body && isRecord(body.answers) && Object.keys(body.answers).length === 1
15
+ && has(body.answers, 'verdict') && isRecord(body.answers.verdict);
16
+ const nativeUsage = body && isRecord(body.usage) ? body.usage : {};
17
+ const input = count(nativeUsage.input_tokens) ? nativeUsage.input_tokens : null;
18
+ const output = count(nativeUsage.output_tokens) ? nativeUsage.output_tokens : null;
19
+ const total = input !== null && output !== null && count(input + output) ? input + output : null;
20
+ const token = (value) => value === null ? { value: null, source: 'not-reported' }
21
+ : { value, source: 'provider' };
22
+ const usage = parseDecisionUsage({ tokens: { input: token(input), output: token(output),
23
+ total: total === null ? token(null) : { value: total, source: 'derived-sum' } },
24
+ evaluatorCalls: answered ? 1 : null, explanations: answered ? 0 : null }) ?? unreportedDecisionUsage('unknown');
25
+ const identityMatches = servedModelId !== null && descriptor.qualification.servedIdentity === 'qualified'
26
+ && descriptor.acceptedServedModelIds.includes(servedModelId);
27
+ const evidence = { usage, servedModelId, servedEvaluator: identityMatches ? { ...descriptor.evaluator } : null,
28
+ ...(providerRequestId === null ? {} : { providerRequestId }) };
29
+ if (!body)
30
+ return { ok: false, error: createDecisionError('VERDICT_INVALID', 'parse'), ...evidence };
31
+ if (!identityMatches)
32
+ return { ok: false, error: createDecisionError('SERVED_IDENTITY_MISMATCH', 'parse'), ...evidence };
33
+ if (input === null || output === null || total === null || !hasOnlyKeys(nativeUsage, ['input_tokens', 'output_tokens'])) {
34
+ return { ok: false, error: createDecisionError('USAGE_INVALID', 'parse'), ...evidence };
35
+ }
36
+ if (!answered)
37
+ return { ok: false, error: createDecisionError('VERDICT_INVALID', 'parse'), ...evidence };
38
+ const verdict = decodeJevVerdict(body.answers.verdict, request, descriptor);
39
+ return verdict.ok ? { ok: true, verdict: verdict.verdict, ...evidence }
40
+ : { ok: false, error: createDecisionError(verdict.code, 'parse'), ...evidence };
41
+ }
42
+ //# sourceMappingURL=jev-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev-response.js","sourceRoot":"","sources":["../../src/decision/jev-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DecisionEvaluatorDescriptor } from './descriptor.js';
2
+ import type { DecisionRequest } from './request.js';
3
+ import type { DecisionErrorCode } from './errors.js';
4
+ import type { DecisionVerdict } from './verdict.js';
5
+ export type JevVerdictResult = {
6
+ ok: true;
7
+ verdict: DecisionVerdict;
8
+ } | {
9
+ ok: false;
10
+ code: DecisionErrorCode;
11
+ };
12
+ /** Build a fresh typed envelope only from validated request and native-value snapshots. */
13
+ export declare function decodeJevVerdict(candidate: unknown, request: DecisionRequest, descriptor: DecisionEvaluatorDescriptor): JevVerdictResult;
14
+ //# sourceMappingURL=jev-verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev-verdict.d.ts","sourceRoot":"","sources":["../../src/decision/jev-verdict.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAC/G,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,2BAA2B,GAAG,gBAAgB,CAiDxI"}
@@ -0,0 +1,71 @@
1
+ import { encodeJevRequest } from './jev-codec.js';
2
+ import { deriveDecision, mapDecisionDistribution, parseDecisionConfidence, parseDecisionScore } from './verdict.js';
3
+ import { hasOnlyKeys, isRecord, snapshotBoundedJson } from './validation.js';
4
+ /** Build a fresh typed envelope only from validated request and native-value snapshots. */
5
+ export function decodeJevVerdict(candidate, request, descriptor) {
6
+ const encoded = encodeJevRequest(request, descriptor);
7
+ if (!encoded.ok)
8
+ return encoded;
9
+ const snapshot = snapshotBoundedJson(candidate);
10
+ const invalid = { ok: false, code: 'VERDICT_INVALID' };
11
+ if (!snapshot.ok || !isRecord(snapshot.value))
12
+ return invalid;
13
+ const answer = snapshot.value;
14
+ const { criterion } = encoded;
15
+ let score = null;
16
+ let label = null;
17
+ let confidence = null;
18
+ let distribution = null;
19
+ let declaredLabels = [];
20
+ if (criterion.kind === 'binary') {
21
+ if (!hasOnlyKeys(answer, ['noul']))
22
+ return invalid;
23
+ score = parseDecisionScore({ value: answer.noul, meaning: 'probability-true',
24
+ scale: { kind: 'bounded', min: 0, max: 1, direction: 'unordered' } });
25
+ if (!score)
26
+ return invalid;
27
+ }
28
+ else if (criterion.kind === 'choice') {
29
+ if (!hasOnlyKeys(answer, ['choice', 'probabilities', 'confidence']))
30
+ return invalid;
31
+ declaredLabels = criterion.options.map((option) => option.id);
32
+ distribution = mapDecisionDistribution(answer.probabilities, declaredLabels.map((outcome) => ({ outcome, nativeOutcome: outcome })));
33
+ if (!distribution || typeof answer.choice !== 'string')
34
+ return invalid;
35
+ const selected = distribution.find((entry) => entry.outcome === answer.choice);
36
+ if (!selected || selected.probability !== Math.max(...distribution.map((entry) => entry.probability)))
37
+ return invalid;
38
+ label = { value: selected.outcome, origin: 'provider' };
39
+ confidence = parseDecisionConfidence({ value: answer.confidence, ...descriptor.confidence, origin: 'provider' });
40
+ if (!confidence || confidence.meaning !== 'provider-confidence')
41
+ return invalid;
42
+ }
43
+ else {
44
+ if (!hasOnlyKeys(answer, ['score', 'probabilities', 'legend', 'confidence']) || !isRecord(answer.legend)
45
+ || Object.keys(answer.legend).length !== criterion.levels.length)
46
+ return invalid;
47
+ const outcomes = criterion.levels.map((level, index) => ({ outcome: level.label, nativeOutcome: String(index) }));
48
+ const legend = answer.legend;
49
+ if (!outcomes.every((entry, index) => legend[entry.nativeOutcome] === criterion.levels[index].description))
50
+ return invalid;
51
+ distribution = mapDecisionDistribution(answer.probabilities, outcomes);
52
+ score = parseDecisionScore({ value: answer.score, meaning: 'rubric-grade',
53
+ scale: { kind: 'bounded', min: 0, max: criterion.levels.length - 1, direction: criterion.direction } });
54
+ confidence = parseDecisionConfidence({ value: answer.confidence, ...descriptor.confidence, origin: 'provider' });
55
+ if (!distribution || !score || !confidence || confidence.meaning !== 'provider-confidence')
56
+ return invalid;
57
+ const weighted = distribution.reduce((sum, entry, index) => sum + index * entry.probability, 0);
58
+ if (Math.abs(weighted - score.value) > descriptor.probabilityTolerance)
59
+ return invalid;
60
+ }
61
+ if (distribution && Math.abs(distribution.reduce((sum, entry) => sum + entry.probability, 0) - 1)
62
+ > descriptor.probabilityTolerance)
63
+ return invalid;
64
+ const decision = deriveDecision({ rule: encoded.request.decision, score, label: label?.value ?? null,
65
+ providerDecision: null, declaredLabels });
66
+ if (!decision.ok)
67
+ return decision;
68
+ return { ok: true, verdict: { criterionKind: encoded.request.criterion.kind, resolvedCriterionKind: criterion.kind,
69
+ score, label, decision: decision.decision, rationale: null, confidence, distribution } };
70
+ }
71
+ //# sourceMappingURL=jev-verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev-verdict.js","sourceRoot":"","sources":["../../src/decision/jev-verdict.ts"],"names":[],"mappings":"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"}