@sentropic/llm-mesh 0.27.1 → 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 (160) hide show
  1. package/README.md +143 -0
  2. package/dist/capabilities.d.ts +4 -1
  3. package/dist/capabilities.d.ts.map +1 -1
  4. package/dist/capabilities.js.map +1 -1
  5. package/dist/catalog.d.ts +135 -1
  6. package/dist/catalog.d.ts.map +1 -1
  7. package/dist/catalog.js +16 -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/index.d.ts +1 -0
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +1 -0
  132. package/dist/index.js.map +1 -1
  133. package/dist/providers.d.ts +4 -3
  134. package/dist/providers.d.ts.map +1 -1
  135. package/dist/providers.js +2 -1
  136. package/dist/providers.js.map +1 -1
  137. package/dist/registry.d.ts +6 -0
  138. package/dist/registry.d.ts.map +1 -1
  139. package/dist/registry.js.map +1 -1
  140. package/dist/speech/capabilities.d.ts +48 -0
  141. package/dist/speech/capabilities.d.ts.map +1 -0
  142. package/dist/speech/capabilities.js +41 -0
  143. package/dist/speech/capabilities.js.map +1 -0
  144. package/dist/speech/catalog.d.ts +8 -0
  145. package/dist/speech/catalog.d.ts.map +1 -0
  146. package/dist/speech/catalog.js +5 -0
  147. package/dist/speech/catalog.js.map +1 -0
  148. package/dist/speech/contracts.d.ts +196 -0
  149. package/dist/speech/contracts.d.ts.map +1 -0
  150. package/dist/speech/contracts.js +39 -0
  151. package/dist/speech/contracts.js.map +1 -0
  152. package/dist/speech/index.d.ts +4 -0
  153. package/dist/speech/index.d.ts.map +1 -0
  154. package/dist/speech/index.js +4 -0
  155. package/dist/speech/index.js.map +1 -0
  156. package/dist/transport/jev.d.ts +23 -0
  157. package/dist/transport/jev.d.ts.map +1 -0
  158. package/dist/transport/jev.js +107 -0
  159. package/dist/transport/jev.js.map +1 -0
  160. package/package.json +17 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/decision/request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { ProviderAdapter, ProviderRegistry } from '../registry.js';
2
+ import type { EvaluatorRef, DecisionRequest } from './request.js';
3
+ import type { DecisionEvaluatorDescriptor } from './descriptor.js';
4
+ import type { DecisionErrorCode } from './errors.js';
5
+ import type { DecisionHostPolicy } from './policy.js';
6
+ import type { AuthResolution, AuthResolver } from '../auth.js';
7
+ import type { DecisionClient } from './receipt.js';
8
+ import type { DecisionServiceOptions } from './host-options.js';
9
+ export interface DecisionSelectionOptions {
10
+ registry: ProviderRegistry;
11
+ resolveEvaluator(ref: EvaluatorRef): DecisionEvaluatorDescriptor | null | Promise<DecisionEvaluatorDescriptor | null>;
12
+ policy?: DecisionHostPolicy;
13
+ /** Explicit evaluator allowlist (P28): only exactly listed evaluator
14
+ * references are admitted. Absent or unlisted refuses before provider egress. */
15
+ evaluatorAllowlist: readonly EvaluatorRef[];
16
+ }
17
+ export type DecisionSelection = {
18
+ ok: true;
19
+ request: DecisionRequest;
20
+ descriptor: DecisionEvaluatorDescriptor;
21
+ adapter: ProviderAdapter;
22
+ } | {
23
+ ok: false;
24
+ code: DecisionErrorCode;
25
+ };
26
+ /** The significant-input snapshot stays service-owned through every asynchronous phase. */
27
+ export declare function preflightDecisionRequest(candidate: unknown, options: DecisionSelectionOptions): Promise<DecisionSelection>;
28
+ export type DecisionAuthResolution = {
29
+ ok: true;
30
+ auth: AuthResolution;
31
+ } | {
32
+ ok: false;
33
+ code: 'CREDENTIAL_MISSING';
34
+ };
35
+ /** Host custody only: no request credential, caller-selected owner or key fallback. */
36
+ export declare function resolveDecisionAuth(descriptor: DecisionEvaluatorDescriptor, resolver: AuthResolver): Promise<DecisionAuthResolution>;
37
+ /** Trusted composition only. Construction performs no discovery, key resolution or I/O. */
38
+ export declare function createDecisionService(supplied: DecisionServiceOptions): DecisionClient;
39
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/decision/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAShE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,2BAA2B,GAAG,IAAI,GAAG,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAAC;IACtH,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B;qFACiF;IACjF,kBAAkB,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C;AACD,MAAM,MAAM,iBAAiB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,2BAA2B,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACrI;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAuB3C,2FAA2F;AAC3F,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+BhI;AAED,MAAM,MAAM,sBAAsB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAC;AACpH,uFAAuF;AACvF,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,2BAA2B,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkB1I;AAUD,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,cAAc,CA8BtF"}
@@ -0,0 +1,138 @@
1
+ import { parseDecisionRequest } from './request.js';
2
+ import { freezeDecisionData, parseDecisionEvaluatorDescriptor } from './descriptor-validation.js';
3
+ import { validateDecisionPolicy } from './policy.js';
4
+ import { isRecord, snapshotBoundedJson } from './validation.js';
5
+ import { beginDecisionExecution, decisionInterruption, persistDecisionResult } from './execution.js';
6
+ import { createDecisionError } from './errors.js';
7
+ import { admitDecision } from './admission.js';
8
+ import { dispatchDecision } from './dispatch.js';
9
+ import { hasOnlyKeys } from './validation.js';
10
+ import { isMicroUsd } from './pricing.js';
11
+ import { runWithDecisionDeadline } from './deadline.js';
12
+ /** Order-insensitive snapshot comparison for descriptor records. */
13
+ function canonicalDecisionJson(value) {
14
+ if (Array.isArray(value))
15
+ return `[${value.map(canonicalDecisionJson).join(',')}]`;
16
+ if (value !== null && typeof value === 'object') {
17
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalDecisionJson(value[key])}`).join(',')}}`;
18
+ }
19
+ return JSON.stringify(value) ?? 'null';
20
+ }
21
+ /** An allowlist entry admits one exact evaluator reference; nothing else matches. */
22
+ const allowlistsEvaluator = (allowlist, ref) => allowlist !== undefined && allowlist.some((entry) => isRecord(entry)
23
+ && entry.providerId === ref.providerId && entry.evaluatorId === ref.evaluatorId && entry.revision === ref.revision);
24
+ /** Preflight binds one authoritative descriptor: the complete validated canonical
25
+ * definition must match exactly. Any execution-affecting disagreement refuses
26
+ * before credentials or spend; adding a field never removes it from equality. */
27
+ function sameDecisionDescriptor(left, right) {
28
+ return canonicalDecisionJson(left) === canonicalDecisionJson(right);
29
+ }
30
+ /** The significant-input snapshot stays service-owned through every asynchronous phase. */
31
+ export async function preflightDecisionRequest(candidate, options) {
32
+ const parsed = parseDecisionRequest(candidate);
33
+ if (!parsed.ok)
34
+ return parsed;
35
+ const request = freezeDecisionData(parsed.request);
36
+ // P28: an explicit allowlist refuses before provider lookup; a general
37
+ // catalogue entry never implies admission and no provider route is touched.
38
+ if (!allowlistsEvaluator(options.evaluatorAllowlist, request.evaluator)) {
39
+ return { ok: false, code: 'EVALUATOR_UNKNOWN' };
40
+ }
41
+ try {
42
+ const adapter = options.registry.getProvider(request.evaluator.providerId);
43
+ if (!adapter || adapter.provider.providerId !== request.evaluator.providerId)
44
+ return { ok: false, code: 'PROVIDER_UNAVAILABLE' };
45
+ if (!adapter.decision || !adapter.listEvaluators)
46
+ return { ok: false, code: 'CAPABILITY_UNSUPPORTED' };
47
+ const inventory = snapshotBoundedJson(adapter.listEvaluators());
48
+ if (!inventory.ok || !Array.isArray(inventory.value))
49
+ return { ok: false, code: 'PROVIDER_UNAVAILABLE' };
50
+ const refs = inventory.value.filter((ref) => isRecord(ref) && ref.providerId === request.evaluator.providerId
51
+ && ref.evaluatorId === request.evaluator.evaluatorId);
52
+ if (!refs.length)
53
+ return { ok: false, code: 'EVALUATOR_UNKNOWN' };
54
+ if (!refs.some((ref) => ref.revision === request.evaluator.revision))
55
+ return { ok: false, code: 'REVISION_MISMATCH' };
56
+ const descriptor = parseDecisionEvaluatorDescriptor(await options.resolveEvaluator({ ...request.evaluator }));
57
+ if (!descriptor || descriptor.evaluator.providerId !== request.evaluator.providerId
58
+ || descriptor.evaluator.evaluatorId !== request.evaluator.evaluatorId
59
+ || descriptor.evaluator.revision !== request.evaluator.revision)
60
+ return { ok: false, code: 'PROVIDER_UNAVAILABLE' };
61
+ const adapterDescriptor = parseDecisionEvaluatorDescriptor(adapter.descriptor);
62
+ if (!adapterDescriptor || !sameDecisionDescriptor(adapterDescriptor, descriptor)) {
63
+ return { ok: false, code: 'PROVIDER_UNAVAILABLE' };
64
+ }
65
+ const code = validateDecisionPolicy(request, descriptor, options.policy);
66
+ return code ? { ok: false, code } : { ok: true, request, descriptor, adapter };
67
+ }
68
+ catch {
69
+ return { ok: false, code: 'PROVIDER_UNAVAILABLE' };
70
+ }
71
+ }
72
+ /** Host custody only: no request credential, caller-selected owner or key fallback. */
73
+ export async function resolveDecisionAuth(descriptor, resolver) {
74
+ try {
75
+ const snapshot = snapshotBoundedJson(await resolver({ providerId: descriptor.evaluator.providerId,
76
+ modelId: descriptor.wireModel, preferredSources: ['environment-token'] }));
77
+ if (!snapshot.ok || !isRecord(snapshot.value) || !isRecord(snapshot.value.material) || !isRecord(snapshot.value.descriptor)) {
78
+ return { ok: false, code: 'CREDENTIAL_MISSING' };
79
+ }
80
+ const { material, descriptor: authDescriptor } = snapshot.value;
81
+ const isJev = (descriptor.protocol ?? 'jev-native') === 'jev-native';
82
+ if (material.type !== 'environment-token' || authDescriptor.sourceType !== 'environment-token'
83
+ || typeof material.token !== 'string'
84
+ || !material.token.trim() || material.token !== material.token.trim() || /[\r\n]/.test(material.token)
85
+ || typeof material.envVar !== 'string' || !material.envVar.trim()
86
+ || (isJev && material.envVar !== 'JEV_API_KEY')) {
87
+ return { ok: false, code: 'CREDENTIAL_MISSING' };
88
+ }
89
+ return { ok: true, auth: freezeDecisionData(snapshot.value) };
90
+ }
91
+ catch {
92
+ return { ok: false, code: 'CREDENTIAL_MISSING' };
93
+ }
94
+ }
95
+ /** An explicit allowlist holds only exact, well-shaped evaluator references. */
96
+ const isEvaluatorAllowlist = (value) => Array.isArray(value) && value.every((entry) => isRecord(entry)
97
+ && hasOnlyKeys(entry, ['providerId', 'evaluatorId', 'revision'])
98
+ && typeof entry.providerId === 'string' && entry.providerId !== ''
99
+ && typeof entry.evaluatorId === 'string' && entry.evaluatorId !== ''
100
+ && typeof entry.revision === 'string' && entry.revision !== '');
101
+ /** Trusted composition only. Construction performs no discovery, key resolution or I/O. */
102
+ export function createDecisionService(supplied) {
103
+ const policy = snapshotBoundedJson(supplied.policy ?? {});
104
+ if (!supplied.registry || ![supplied.resolveEvaluator, supplied.resolveAuth, supplied.resolvePrice, supplied.authorize,
105
+ supplied.budget?.admit, supplied.budget?.markDispatched, supplied.budget?.release, supplied.budget?.settle,
106
+ supplied.receipts?.persist].every((port) => typeof port === 'function')
107
+ || !isEvaluatorAllowlist(supplied.evaluatorAllowlist)
108
+ || !policy.ok || !isRecord(policy.value)
109
+ || !hasOnlyKeys(policy.value, ['timeoutMs', 'maxCostMicroUsd', 'allowRaw'])
110
+ || (policy.value.timeoutMs !== undefined && (!Number.isSafeInteger(policy.value.timeoutMs)
111
+ || typeof policy.value.timeoutMs !== 'number' || policy.value.timeoutMs < 1 || policy.value.timeoutMs > 60000))
112
+ || (policy.value.maxCostMicroUsd !== undefined && !isMicroUsd(policy.value.maxCostMicroUsd))
113
+ || (policy.value.allowRaw !== undefined && typeof policy.value.allowRaw !== 'boolean'))
114
+ throw new Error('Invalid decision host configuration.');
115
+ const options = { ...supplied, policy: freezeDecisionData(policy.value),
116
+ evaluatorAllowlist: freezeDecisionData(supplied.evaluatorAllowlist.map((entry) => ({ ...entry }))) };
117
+ return { async decide(candidate, callOptions) {
118
+ const execution = beginDecisionExecution(candidate, { clock: options.clock, generateId: options.generateId,
119
+ timeoutMs: options.policy.timeoutMs, signal: callOptions?.signal });
120
+ return runWithDecisionDeadline(execution, async () => {
121
+ if (execution.idError)
122
+ return persistDecisionResult(execution, options.receipts, createDecisionError('MESH_UNAVAILABLE', 'preflight'));
123
+ const interrupted = decisionInterruption(execution, 'preflight');
124
+ if (interrupted)
125
+ return persistDecisionResult(execution, options.receipts, interrupted);
126
+ const selection = await preflightDecisionRequest(candidate, options);
127
+ if (!selection.ok)
128
+ return persistDecisionResult(execution, options.receipts, createDecisionError(selection.code, 'preflight'));
129
+ execution.receipt.evaluator = { ...selection.descriptor.evaluator };
130
+ execution.receipt.retention = structuredClone(selection.descriptor.retention);
131
+ const admitted = await admitDecision(execution, selection, options);
132
+ if (!admitted.ok)
133
+ return persistDecisionResult(execution, options.receipts, admitted.error);
134
+ return dispatchDecision(execution, selection, admitted, options);
135
+ });
136
+ } };
137
+ }
138
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/decision/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import type { DecisionEvaluatorDescriptor, ResolvedDecisionCriterion } from './descriptor.js';
2
+ import type { DecisionRequest } from './request.js';
3
+ import type { ProviderAdapter, ProviderRuntimeContext } from '../registry.js';
4
+ import type { GenerateRequest, GenerateResponse, StreamRequest, StreamResult } from '../generation.js';
5
+ import type { ProviderDescriptor } from '../catalog.js';
6
+ import type { DecisionAdapterResult } from './adapter.js';
7
+ /** Revisioned structured output contract served by this backend. */
8
+ export declare const STRUCTURED_CONTRACT_REVISION = "structured-llm-v1";
9
+ /** Scalar meaning asserted by this backend for structured evidence. */
10
+ export declare const STRUCTURED_SCORE_MEANING = "support";
11
+ /** Validation profile this backend implements and enforces. */
12
+ export declare const STRUCTURED_VALIDATION_PROFILE: {
13
+ readonly profile: "structured-llm-v1";
14
+ readonly version: "v1";
15
+ };
16
+ /** Prompt template this backend instantiates; digest-bound to the descriptor. */
17
+ export declare const STRUCTURED_PROMPT_TEMPLATE = "structured-llm-v1 revision={revision} kind={kind} instructions={instructions}";
18
+ /** Closed evidence schema this backend sends for one criterion kind. */
19
+ export declare const structuredSchemaForKind: (kind: string) => Record<string, unknown>;
20
+ /** Readout identity this backend declares for its sampling configuration. */
21
+ export declare const STRUCTURED_READOUT_IDENTITY = "structured-llm-v1";
22
+ /**
23
+ * Mint the digest-bound compilation + definition pair for one effective
24
+ * output budget and readout identity. The family schema digest covers all
25
+ * three criterion schemas; per-kind entries in the definition bind each
26
+ * dispatched schema individually. Fixtures mint through this helper so
27
+ * declared digests always bind the artifacts this backend dispatches.
28
+ */
29
+ export declare const mintStructuredContractDigests: (input: {
30
+ maxOutputTokens: number;
31
+ readout: string;
32
+ }) => {
33
+ templateDigest: string;
34
+ schemaDigest: string;
35
+ definition: {
36
+ validationProfile: {
37
+ profile: string;
38
+ version: string;
39
+ };
40
+ kinds: {
41
+ kind: string;
42
+ schemaDigest: string;
43
+ }[];
44
+ evidenceRequirements: string[];
45
+ executionDigest: string;
46
+ bundleDigest: string;
47
+ };
48
+ };
49
+ /** Provider envelope returned by the injected structured transport: the raw
50
+ * model text plus the provider-side response metadata, delivered separately.
51
+ * Identity and usage come from this envelope only; generated text never
52
+ * supplies them. One send, one envelope, no repair calls, no hidden retries. */
53
+ export interface StructuredProviderEnvelope {
54
+ text: string;
55
+ served: unknown;
56
+ usage: unknown;
57
+ }
58
+ export type StructuredDecisionTransport = {
59
+ send(payload: StructuredDecisionPayload, options?: {
60
+ signal?: AbortSignal;
61
+ }): Promise<StructuredProviderEnvelope>;
62
+ };
63
+ /** Bounded evaluated content for the transport: full resolved criterion plus
64
+ * evaluated inputs. No tool authority travels with the data. */
65
+ export interface StructuredDecisionPayload {
66
+ contractRevision: string;
67
+ prompt: string;
68
+ schema: Record<string, unknown>;
69
+ execution: {
70
+ maxOutputTokens: number;
71
+ };
72
+ compilation: {
73
+ templateDigest: string;
74
+ schemaDigest: string;
75
+ readout: string;
76
+ };
77
+ criterion: ResolvedDecisionCriterion;
78
+ content: {
79
+ input: unknown;
80
+ output: unknown;
81
+ state: unknown;
82
+ reference: unknown;
83
+ context: unknown;
84
+ };
85
+ }
86
+ export interface StructuredDecisionAdapterOptions {
87
+ descriptor: DecisionEvaluatorDescriptor;
88
+ transport: StructuredDecisionTransport;
89
+ }
90
+ /** Generic structured backend: compiles one criterion plus evaluated content
91
+ * into prompt, closed schema and execution settings; parses the generated
92
+ * verdict evidence only, rejects refusal/malformed/extra/missing/prose/
93
+ * clamp/default and any generated identity/usage, and takes served identity
94
+ * and reported counters exclusively from the provider envelope, no retry. */
95
+ export interface DecisionBackend {
96
+ compile(request: DecisionRequest, descriptor: DecisionEvaluatorDescriptor): StructuredDecisionPayload;
97
+ }
98
+ export declare class StructuredDecisionAdapter implements ProviderAdapter {
99
+ private readonly options;
100
+ readonly provider: ProviderDescriptor;
101
+ readonly descriptor: DecisionEvaluatorDescriptor;
102
+ readonly backend: DecisionBackend;
103
+ constructor(options: StructuredDecisionAdapterOptions);
104
+ listModels(): never[];
105
+ listEvaluators(): {
106
+ providerId: "openai" | "gemini" | "anthropic" | "mistral" | "cohere" | "gcp" | "local" | "muse" | "typesafe";
107
+ evaluatorId: string;
108
+ revision: string;
109
+ }[];
110
+ validateAuth(): {
111
+ ok: boolean;
112
+ };
113
+ generate(_request: GenerateRequest): Promise<GenerateResponse>;
114
+ stream(_request: StreamRequest): Promise<StreamResult>;
115
+ normalizeError(_error: unknown): {
116
+ providerId: "openai" | "gemini" | "anthropic" | "mistral" | "cohere" | "gcp" | "local" | "muse" | "typesafe";
117
+ message: string;
118
+ retryable: boolean;
119
+ };
120
+ decision(request: DecisionRequest, context?: ProviderRuntimeContext & {
121
+ signal?: AbortSignal;
122
+ }): Promise<DecisionAdapterResult>;
123
+ }
124
+ export declare const createStructuredDecisionAdapter: (options: StructuredDecisionAdapterOptions) => StructuredDecisionAdapter;
125
+ //# sourceMappingURL=structured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured.d.ts","sourceRoot":"","sources":["../../src/decision/structured.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,250 @@
1
+ import { getProviderProfile } from '../catalog.js';
2
+ import { isProviderId } from '../providers.js';
3
+ import { parseDecisionEvaluatorDescriptor } from './descriptor-validation.js';
4
+ import { createDecisionError } from './errors.js';
5
+ import { deriveDecision } from './verdict.js';
6
+ import { unreportedDecisionUsage } from './receipt.js';
7
+ import { digestStructuredArtifact, hasOnlyKeys, isRecord, isText, snapshotBoundedJson } from './validation.js';
8
+ /** Revisioned structured output contract served by this backend. */
9
+ export const STRUCTURED_CONTRACT_REVISION = 'structured-llm-v1';
10
+ /** Scalar meaning asserted by this backend for structured evidence. */
11
+ export const STRUCTURED_SCORE_MEANING = 'support';
12
+ /** Validation profile this backend implements and enforces. */
13
+ export const STRUCTURED_VALIDATION_PROFILE = { profile: 'structured-llm-v1', version: 'v1' };
14
+ /** Prompt template this backend instantiates; digest-bound to the descriptor. */
15
+ export const STRUCTURED_PROMPT_TEMPLATE = 'structured-llm-v1 revision={revision} kind={kind} instructions={instructions}';
16
+ /** Adapter-local conservative execution default. Service admission enforces
17
+ * the descriptor bound; direct adapter use never invents liability. */
18
+ const STRUCTURED_DEFAULT_MAX_OUTPUT_TOKENS = 4096;
19
+ /** Closed JSON schema fragment (additionalProperties: false throughout). */
20
+ const closedSchema = (required, properties) => ({
21
+ type: 'object', required: [...required], properties, additionalProperties: false,
22
+ });
23
+ /** Closed evidence schema this backend sends for one criterion kind. */
24
+ export const structuredSchemaForKind = (kind) => kind === 'choice'
25
+ ? closedSchema(['label'], { label: { type: 'string' } })
26
+ : closedSchema(['score'], { score: { type: 'number' } });
27
+ /** Readout identity this backend declares for its sampling configuration. */
28
+ export const STRUCTURED_READOUT_IDENTITY = 'structured-llm-v1';
29
+ /**
30
+ * Mint the digest-bound compilation + definition pair for one effective
31
+ * output budget and readout identity. The family schema digest covers all
32
+ * three criterion schemas; per-kind entries in the definition bind each
33
+ * dispatched schema individually. Fixtures mint through this helper so
34
+ * declared digests always bind the artifacts this backend dispatches.
35
+ */
36
+ export const mintStructuredContractDigests = (input) => {
37
+ const templateDigest = digestStructuredArtifact(STRUCTURED_PROMPT_TEMPLATE);
38
+ const schemas = { binary: structuredSchemaForKind('binary'), graded: structuredSchemaForKind('graded'),
39
+ choice: structuredSchemaForKind('choice') };
40
+ const schemaDigest = digestStructuredArtifact(schemas);
41
+ const kinds = Object.keys(schemas).map((kind) => ({
42
+ kind, schemaDigest: digestStructuredArtifact(schemas[kind]),
43
+ }));
44
+ const executionDigest = digestStructuredArtifact({ maxOutputTokens: input.maxOutputTokens });
45
+ const bundleDigest = digestStructuredArtifact({ contractRevision: STRUCTURED_CONTRACT_REVISION, readout: input.readout,
46
+ templateDigest, schemaDigest, executionDigest, validationProfile: { ...STRUCTURED_VALIDATION_PROFILE } });
47
+ return { templateDigest, schemaDigest,
48
+ definition: { validationProfile: { ...STRUCTURED_VALIDATION_PROFILE }, kinds,
49
+ evidenceRequirements: ['served-identity', 'reported-usage'], executionDigest, bundleDigest } };
50
+ };
51
+ const compileStructured = (request, descriptor) => {
52
+ if (request.criterion.kind === 'registered')
53
+ throw new Error('Structured cannot compile a registered criterion.');
54
+ const revision = descriptor.evaluator.revision;
55
+ const kind = request.criterion.kind;
56
+ const instructions = request.criterion.instructions;
57
+ const prompt = STRUCTURED_PROMPT_TEMPLATE.replace('{revision}', revision).replace('{kind}', kind)
58
+ .replace('{instructions}', instructions);
59
+ // The generated-output schema carries the verdict evidence only. Served
60
+ // identity and reported usage travel in the provider envelope, never in
61
+ // model text, so generated fields cannot establish their own provenance.
62
+ const schema = structuredSchemaForKind(kind);
63
+ return {
64
+ contractRevision: STRUCTURED_CONTRACT_REVISION,
65
+ prompt,
66
+ schema,
67
+ execution: { maxOutputTokens: descriptor.maxBillableOutputTokens > 0
68
+ ? descriptor.maxBillableOutputTokens : STRUCTURED_DEFAULT_MAX_OUTPUT_TOKENS },
69
+ compilation: { templateDigest: descriptor.compilation.templateDigest,
70
+ schemaDigest: descriptor.compilation.schemaDigest, readout: descriptor.compilation.readout },
71
+ criterion: structuredClone(request.criterion),
72
+ content: { input: request.inputs.input ?? null, output: request.inputs.output ?? null,
73
+ state: request.inputs.state ?? null, reference: request.inputs.reference ?? null,
74
+ context: request.inputs.context ?? null },
75
+ };
76
+ };
77
+ /** Transport-reported served identity: accepted-set model string, else mismatch. */
78
+ const parseStructuredServedIdentity = (candidate, descriptor) => {
79
+ if (!isRecord(candidate) || !hasOnlyKeys(candidate, ['modelId']) || !isText(candidate.modelId))
80
+ return null;
81
+ return descriptor.acceptedServedModelIds.includes(candidate.modelId) ? candidate.modelId : null;
82
+ };
83
+ /** Transport-reported usage: both counters required (§4.3), never invented. */
84
+ const parseStructuredReportedUsage = (candidate) => {
85
+ if (!isRecord(candidate) || !hasOnlyKeys(candidate, ['inputTokens', 'outputTokens']))
86
+ return null;
87
+ const { inputTokens, outputTokens } = candidate;
88
+ if (typeof inputTokens !== 'number' || !Number.isSafeInteger(inputTokens) || inputTokens < 0)
89
+ return null;
90
+ if (typeof outputTokens !== 'number' || !Number.isSafeInteger(outputTokens) || outputTokens < 0)
91
+ return null;
92
+ return { tokens: { input: { value: inputTokens, source: 'provider' },
93
+ output: { value: outputTokens, source: 'provider' },
94
+ total: { value: inputTokens + outputTokens, source: 'derived-sum' } },
95
+ evaluatorCalls: 1, explanations: 0 };
96
+ };
97
+ export class StructuredDecisionAdapter {
98
+ options;
99
+ provider;
100
+ descriptor;
101
+ backend = { compile: compileStructured };
102
+ constructor(options) {
103
+ this.options = options;
104
+ const descriptor = parseDecisionEvaluatorDescriptor(options.descriptor);
105
+ if (!descriptor || descriptor.protocol !== 'structured-llm')
106
+ throw new Error('Invalid structured descriptor.');
107
+ // Register under the descriptor-selected provider instead of pinning TypeSafe.
108
+ if (!isProviderId(descriptor.evaluator.providerId))
109
+ throw new Error('Invalid structured descriptor.');
110
+ this.provider = getProviderProfile(descriptor.evaluator.providerId);
111
+ this.descriptor = descriptor;
112
+ }
113
+ listModels() { return []; }
114
+ listEvaluators() { return [{ ...this.descriptor.evaluator }]; }
115
+ validateAuth() { return { ok: true }; }
116
+ async generate(_request) { throw new Error('Structured does not support chat.'); }
117
+ async stream(_request) { throw new Error('Structured does not support chat.'); }
118
+ normalizeError(_error) { return { providerId: this.descriptor.evaluator.providerId, message: 'Structured operation failed.', retryable: false }; }
119
+ async decision(request, context) {
120
+ const empty = { usage: unreportedDecisionUsage('not-dispatched'), servedEvaluator: null, servedModelId: null };
121
+ if (request.criterion.kind === 'registered') {
122
+ return { ok: false, error: createDecisionError('CAPABILITY_UNSUPPORTED', 'preflight'), ...empty };
123
+ }
124
+ let payload;
125
+ try {
126
+ payload = compileStructured(request, this.descriptor);
127
+ }
128
+ catch {
129
+ return { ok: false, error: createDecisionError('CAPABILITY_UNSUPPORTED', 'dispatch'),
130
+ ...empty, usage: unreportedDecisionUsage('unknown') };
131
+ }
132
+ const compiled = snapshotBoundedJson(payload);
133
+ if (!compiled.ok) {
134
+ return { ok: false, error: createDecisionError('CAPABILITY_UNSUPPORTED', 'dispatch'),
135
+ ...empty, usage: unreportedDecisionUsage('unknown') };
136
+ }
137
+ // Complete definition binding (§3.2): the declared validation profile,
138
+ // covered kinds, required evidence and digests must match the artifacts
139
+ // actually compiled and dispatched here; anything else is refused before
140
+ // any provider contact.
141
+ const definition = this.descriptor.definition;
142
+ const refuseDefinition = { ok: false, error: createDecisionError('CAPABILITY_UNSUPPORTED', 'dispatch'),
143
+ ...empty, usage: unreportedDecisionUsage('unknown') };
144
+ const compiledPayload = compiled.value;
145
+ const kindEntry = definition.kinds.find((entry) => entry.kind === request.criterion.kind);
146
+ if (definition.validationProfile.profile !== STRUCTURED_VALIDATION_PROFILE.profile
147
+ || definition.validationProfile.version !== STRUCTURED_VALIDATION_PROFILE.version
148
+ || !kindEntry
149
+ || !definition.evidenceRequirements.includes('served-identity')
150
+ || !definition.evidenceRequirements.includes('reported-usage'))
151
+ return { ...refuseDefinition };
152
+ const actualTemplateDigest = digestStructuredArtifact(STRUCTURED_PROMPT_TEMPLATE);
153
+ const actualFamily = { binary: structuredSchemaForKind('binary'), graded: structuredSchemaForKind('graded'),
154
+ choice: structuredSchemaForKind('choice') };
155
+ const actualSchemaDigest = digestStructuredArtifact(actualFamily);
156
+ const actualSchemaKindDigest = digestStructuredArtifact(compiledPayload.schema);
157
+ const actualExecutionDigest = digestStructuredArtifact({ maxOutputTokens: compiledPayload.execution.maxOutputTokens });
158
+ const actualBundleDigest = digestStructuredArtifact({ contractRevision: compiledPayload.contractRevision,
159
+ readout: this.descriptor.compilation.readout, templateDigest: actualTemplateDigest,
160
+ schemaDigest: actualSchemaDigest, executionDigest: actualExecutionDigest,
161
+ validationProfile: { ...STRUCTURED_VALIDATION_PROFILE } });
162
+ if (this.descriptor.compilation.templateDigest !== actualTemplateDigest
163
+ || this.descriptor.compilation.schemaDigest !== actualSchemaDigest
164
+ || kindEntry.schemaDigest !== actualSchemaKindDigest
165
+ || definition.executionDigest !== actualExecutionDigest
166
+ || definition.bundleDigest !== actualBundleDigest)
167
+ return { ...refuseDefinition };
168
+ let envelope;
169
+ try {
170
+ envelope = await this.options.transport.send(compiled.value, { signal: context?.signal });
171
+ }
172
+ catch {
173
+ return { ok: false, error: createDecisionError('TRANSPORT_FAILED', 'dispatch'),
174
+ ...empty, usage: unreportedDecisionUsage('unknown') };
175
+ }
176
+ const envelopeRecord = isRecord(envelope) ? envelope : null;
177
+ const text = envelopeRecord !== null && typeof envelopeRecord.text === 'string' ? envelopeRecord.text : null;
178
+ if (text === null || new TextEncoder().encode(text).byteLength > 16384) {
179
+ return { ok: false, error: createDecisionError('VERDICT_INVALID', 'parse'),
180
+ ...empty, usage: unreportedDecisionUsage('unknown') };
181
+ }
182
+ let parsed;
183
+ try {
184
+ parsed = JSON.parse(text);
185
+ }
186
+ catch {
187
+ return { ok: false, error: createDecisionError('VERDICT_INVALID', 'parse'),
188
+ ...empty, usage: unreportedDecisionUsage('unknown') };
189
+ }
190
+ const snapshot = snapshotBoundedJson(parsed);
191
+ if (!snapshot.ok || !isRecord(snapshot.value)) {
192
+ return { ok: false, error: createDecisionError('VERDICT_INVALID', 'parse'),
193
+ ...empty, usage: unreportedDecisionUsage('unknown') };
194
+ }
195
+ const body = snapshot.value;
196
+ // Identity before accounting: served model and both counters come from
197
+ // the provider envelope only; generated text never supplies them, and
198
+ // missing/substituted envelope evidence refuses, never invents.
199
+ const failIdentity = { ok: false, error: createDecisionError('SERVED_IDENTITY_MISMATCH', 'parse'),
200
+ ...empty, usage: unreportedDecisionUsage('unknown') };
201
+ const failUsage = { ok: false, error: createDecisionError('USAGE_INVALID', 'parse'),
202
+ ...empty, usage: unreportedDecisionUsage('unknown') };
203
+ const failVerdict = { ok: false, error: createDecisionError('VERDICT_INVALID', 'parse'),
204
+ ...empty, usage: unreportedDecisionUsage('unknown') };
205
+ const servedModelId = parseStructuredServedIdentity(envelopeRecord?.served, this.descriptor);
206
+ if (servedModelId === null)
207
+ return { ...failIdentity };
208
+ const usage = parseStructuredReportedUsage(envelopeRecord?.usage);
209
+ if (usage === null)
210
+ return { ...failUsage };
211
+ const evidence = { usage, servedEvaluator: { ...this.descriptor.evaluator }, servedModelId };
212
+ if (request.criterion.kind === 'choice') {
213
+ if (!hasOnlyKeys(body, ['label']) || !isText(body.label)
214
+ || !request.criterion.options.some((option) => option.id === body.label)) {
215
+ return { ...failVerdict };
216
+ }
217
+ const label = { value: body.label, origin: 'provider' };
218
+ const derived = deriveDecision({ rule: request.decision, score: null, label: body.label,
219
+ providerDecision: null, declaredLabels: request.criterion.options.map((option) => option.id) });
220
+ if (!derived.ok)
221
+ return { ok: false, error: createDecisionError(derived.code, 'parse'),
222
+ ...empty, usage: unreportedDecisionUsage('unknown') };
223
+ const decision = derived.decision;
224
+ const verdict = { criterionKind: 'choice', resolvedCriterionKind: 'choice', score: null,
225
+ decision, label, rationale: null, confidence: null, distribution: null };
226
+ return { ok: true, verdict, ...evidence };
227
+ }
228
+ if (!hasOnlyKeys(body, ['score']) || typeof body.score !== 'number' || !Number.isFinite(body.score)) {
229
+ return { ...failVerdict };
230
+ }
231
+ const max = request.criterion.kind === 'graded' ? request.criterion.levels.length - 1 : 1;
232
+ if (body.score < 0 || body.score > max) {
233
+ return { ...failVerdict };
234
+ }
235
+ const direction = request.criterion.kind === 'graded' ? request.criterion.direction : 'unordered';
236
+ const score = { value: body.score, meaning: STRUCTURED_SCORE_MEANING,
237
+ scale: { kind: 'bounded', min: 0, max, direction } };
238
+ const derived = deriveDecision({ rule: request.decision, score: score, label: null, providerDecision: null });
239
+ if (!derived.ok)
240
+ return { ok: false, error: createDecisionError(derived.code, 'parse'),
241
+ ...empty, usage: unreportedDecisionUsage('unknown') };
242
+ const decision = derived.decision;
243
+ const verdict = { criterionKind: request.criterion.kind,
244
+ resolvedCriterionKind: request.criterion.kind, score, decision, label: null,
245
+ rationale: null, confidence: null, distribution: null };
246
+ return { ok: true, verdict, ...evidence };
247
+ }
248
+ }
249
+ export const createStructuredDecisionAdapter = (options) => new StructuredDecisionAdapter(options);
250
+ //# sourceMappingURL=structured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/decision/structured.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DecisionRequest } from './request.js';
2
+ import type { DecisionResult } from './receipt.js';
3
+ import type { DecisionValidationContext } from './validation-context.js';
4
+ /** Pure wire-result validator: no network, provider imports, env reads or credentials.
5
+ * Validates a detached wire envelope against the transmitted request snapshot
6
+ * and trusted context snapshot, rebuilding both branches field by field. */
7
+ export declare function validateDecisionResult(requestSnapshot: DecisionRequest, contextSnapshot: DecisionValidationContext | null, wireValue: unknown): DecisionResult | null;
8
+ //# sourceMappingURL=validate-result.d.ts.map