deepclause-sdk 0.0.88 → 0.0.89

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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/agent.d.ts +2 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +164 -0
  6. package/dist/agent.js.map +1 -1
  7. package/dist/compiler_prompt.d.ts +1 -1
  8. package/dist/compiler_prompt.d.ts.map +1 -1
  9. package/dist/compiler_prompt.js +2 -2
  10. package/dist/index.d.ts +3 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/judge/index.d.ts +9 -0
  15. package/dist/judge/index.d.ts.map +1 -0
  16. package/dist/judge/index.js +6 -0
  17. package/dist/judge/index.js.map +1 -0
  18. package/dist/judge/jev.d.ts +21 -0
  19. package/dist/judge/jev.d.ts.map +1 -0
  20. package/dist/judge/jev.js +218 -0
  21. package/dist/judge/jev.js.map +1 -0
  22. package/dist/judge/llm.d.ts +23 -0
  23. package/dist/judge/llm.d.ts.map +1 -0
  24. package/dist/judge/llm.js +120 -0
  25. package/dist/judge/llm.js.map +1 -0
  26. package/dist/judge/marshal.d.ts +26 -0
  27. package/dist/judge/marshal.d.ts.map +1 -0
  28. package/dist/judge/marshal.js +266 -0
  29. package/dist/judge/marshal.js.map +1 -0
  30. package/dist/judge/mock.d.ts +28 -0
  31. package/dist/judge/mock.d.ts.map +1 -0
  32. package/dist/judge/mock.js +98 -0
  33. package/dist/judge/mock.js.map +1 -0
  34. package/dist/judge/types.d.ts +95 -0
  35. package/dist/judge/types.d.ts.map +1 -0
  36. package/dist/judge/types.js +23 -0
  37. package/dist/judge/types.js.map +1 -0
  38. package/dist/prolog/bridge.d.ts +3 -1
  39. package/dist/prolog/bridge.d.ts.map +1 -1
  40. package/dist/prolog/bridge.js +22 -1
  41. package/dist/prolog/bridge.js.map +1 -1
  42. package/dist/prolog-src/deepclause_mi.pl +204 -4
  43. package/dist/runner.d.ts +14 -1
  44. package/dist/runner.d.ts.map +1 -1
  45. package/dist/runner.js +170 -9
  46. package/dist/runner.js.map +1 -1
  47. package/dist/sdk.d.ts.map +1 -1
  48. package/dist/sdk.js +56 -0
  49. package/dist/sdk.js.map +1 -1
  50. package/dist/system/assets/docs/DML_REFERENCE.md +82 -1
  51. package/dist/types.d.ts +69 -0
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +1 -1
  54. package/src/prolog-src/deepclause_mi.pl +204 -4
  55. package/dist/system/assets/compactors/default-memory-compactor.dml +0 -6
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Marshalling between the Prolog wire shapes and the SDK judge types.
3
+ *
4
+ * The engine payload arrives as swipl-wasm values:
5
+ * - a compound `f(a, b)` -> `{ $t: 't', f: [[a, b]] }`
6
+ * - a pair `K-V` -> `{ $t: 't', '-': [[K, V]] }`
7
+ * - a dict `tag{k: v}` -> `{ $tag: 'tag', k: v }`
8
+ * - a list -> an array
9
+ * - atoms / strings / numbers / booleans arrive as plain JS values.
10
+ */
11
+ function isRawObject(value) {
12
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
13
+ }
14
+ function isCompound(value) {
15
+ return isRawObject(value) && value.$t === 't';
16
+ }
17
+ function compoundParts(value) {
18
+ for (const key of Object.keys(value)) {
19
+ if (key === '$t' || key === 'functor' || key === 'args')
20
+ continue;
21
+ const payload = value[key];
22
+ if (Array.isArray(payload) && payload.length > 0 && Array.isArray(payload[0])) {
23
+ return { functor: key, args: payload[0] };
24
+ }
25
+ }
26
+ return { functor: '', args: [] };
27
+ }
28
+ function isPairCompound(value) {
29
+ return isCompound(value) && compoundParts(value).functor === '-';
30
+ }
31
+ /** Normalize an arbitrary Prolog value into JSON. A list of `Key-Value` pairs becomes an object. */
32
+ export function normalizePrologValue(value) {
33
+ if (value === null || value === undefined)
34
+ return null;
35
+ if (typeof value === 'string') {
36
+ if (value === 'null')
37
+ return null;
38
+ if (value === 'true')
39
+ return true;
40
+ if (value === 'false')
41
+ return false;
42
+ return value;
43
+ }
44
+ if (typeof value === 'number' || typeof value === 'boolean')
45
+ return value;
46
+ if (isRawObject(value) && typeof value.$t === 'string' && value.$t !== 't') {
47
+ const tagged = value;
48
+ switch (tagged.$t) {
49
+ case 's':
50
+ case 'a':
51
+ return tagged.v ?? '';
52
+ case 'n':
53
+ return tagged.v ?? 0;
54
+ default:
55
+ return tagged.v ?? null;
56
+ }
57
+ }
58
+ if (Array.isArray(value)) {
59
+ if (value.length > 0 && value.every(isPairCompound)) {
60
+ const object = {};
61
+ for (const entry of value) {
62
+ const { args } = compoundParts(entry);
63
+ object[String(normalizePrologValue(args[0]))] = normalizePrologValue(args[1]);
64
+ }
65
+ return object;
66
+ }
67
+ return value.map(normalizePrologValue);
68
+ }
69
+ if (isCompound(value)) {
70
+ const { functor, args } = compoundParts(value);
71
+ if (functor === 'arr')
72
+ return normalizePrologValue(args[0] ?? []);
73
+ if (functor === '-') {
74
+ return { [String(normalizePrologValue(args[0]))]: normalizePrologValue(args[1]) };
75
+ }
76
+ return { [functor]: args.map(normalizePrologValue) };
77
+ }
78
+ if (isRawObject(value)) {
79
+ const object = {};
80
+ for (const [key, entry] of Object.entries(value)) {
81
+ if (key === '$tag' || key === '$t')
82
+ continue;
83
+ object[key] = normalizePrologValue(entry);
84
+ }
85
+ return object;
86
+ }
87
+ return null;
88
+ }
89
+ /** The author-facing state term, normalized to JSON. */
90
+ export function normalizeJudgeState(value) {
91
+ return normalizePrologValue(value);
92
+ }
93
+ function parseOptions(raw) {
94
+ const list = Array.isArray(raw) ? raw : [];
95
+ return list.map((entry) => {
96
+ if (isPairCompound(entry)) {
97
+ const { args } = compoundParts(entry);
98
+ return {
99
+ id: String(normalizePrologValue(args[0])),
100
+ description: normalizePrologValue(args[1]),
101
+ };
102
+ }
103
+ return { id: String(normalizePrologValue(entry)) };
104
+ });
105
+ }
106
+ function parseLevels(raw) {
107
+ const list = Array.isArray(raw) ? raw : [];
108
+ return list.map((entry) => {
109
+ if (isCompound(entry) && compoundParts(entry).functor === 'level') {
110
+ const { args } = compoundParts(entry);
111
+ return { what: normalizePrologValue(args[0]), examples: normalizePrologValue(args[1]) };
112
+ }
113
+ return normalizePrologValue(entry);
114
+ });
115
+ }
116
+ function parseCriteria(raw) {
117
+ if (!isCompound(raw))
118
+ return undefined;
119
+ const { functor, args } = compoundParts(raw);
120
+ if (functor !== 'criteria')
121
+ return undefined;
122
+ return { true: normalizePrologValue(args[0]), false: normalizePrologValue(args[1]) };
123
+ }
124
+ /** Parse the `questions` list yielded by the meta-interpreter into `JudgeQuestion[]`. */
125
+ export function parseJudgeQuestions(raw) {
126
+ const list = Array.isArray(raw) ? raw : [];
127
+ return list.map((entry, index) => {
128
+ const dict = isRawObject(entry) ? entry : {};
129
+ const kind = String(normalizePrologValue(dict.kind));
130
+ const question = {
131
+ id: `q${index + 1}`,
132
+ kind: kind,
133
+ instruction: normalizePrologValue(dict.instruction),
134
+ };
135
+ if (kind === 'choose')
136
+ question.options = parseOptions(dict.options);
137
+ else if (kind === 'rate')
138
+ question.levels = parseLevels(dict.levels);
139
+ else if (kind === 'verify')
140
+ question.criteria = parseCriteria(dict.criteria);
141
+ return question;
142
+ });
143
+ }
144
+ function levelId(level, index) {
145
+ if (typeof level === 'string')
146
+ return level;
147
+ if (typeof level === 'number' || typeof level === 'boolean')
148
+ return String(level);
149
+ if (isRawObject(level) && typeof level.what === 'string')
150
+ return level.what;
151
+ return `level_${index}`;
152
+ }
153
+ function validateAnswer(question, answer) {
154
+ const basis = answer.basis ?? 'label';
155
+ if (question.kind === 'choose') {
156
+ const optionIds = (question.options ?? []).map((option) => option.id);
157
+ const value = answer.value;
158
+ if (!value || !optionIds.includes(value)) {
159
+ throw new Error(`judge answer for '${question.id}' selected '${value ?? 'nothing'}', which is not one of: ${optionIds.join(', ')}`);
160
+ }
161
+ return { ...answer, basis, distribution: alignDistribution(optionIds.length, answer.distribution) };
162
+ }
163
+ if (question.kind === 'rate') {
164
+ const levels = question.levels ?? [];
165
+ let value = answer.value;
166
+ if (!value && typeof answer.probability === 'number') {
167
+ value = levelId(levels[argmax(answer.distribution ?? [])] ?? '', 0);
168
+ }
169
+ const labels = levels.map(levelId);
170
+ if (value && !labels.includes(value)) {
171
+ const numeric = Number(value);
172
+ if (Number.isInteger(numeric) && labels[numeric] !== undefined)
173
+ value = labels[numeric];
174
+ else
175
+ throw new Error(`judge answer for '${question.id}' returned unknown level '${value}'`);
176
+ }
177
+ if (!value && labels.length > 0)
178
+ value = labels[0];
179
+ return { ...answer, value, basis, distribution: alignDistribution(levels.length, answer.distribution) };
180
+ }
181
+ if (question.kind === 'verify') {
182
+ if (answer.value !== undefined && !['yes', 'no', 'unknown'].includes(answer.value)) {
183
+ throw new Error(`judge answer for '${question.id}' returned '${answer.value}', expected yes/no/unknown`);
184
+ }
185
+ if (answer.value === undefined) {
186
+ const probability = answer.probability;
187
+ const value = typeof probability === 'number' ? (probability >= 0.5 ? 'yes' : 'no') : 'unknown';
188
+ return { ...answer, value, basis };
189
+ }
190
+ return { ...answer, basis };
191
+ }
192
+ // probability
193
+ if (typeof answer.probability !== 'number') {
194
+ throw new Error(`judge answer for '${question.id}' did not return a probability`);
195
+ }
196
+ return { ...answer, basis };
197
+ }
198
+ function alignDistribution(length, distribution) {
199
+ if (!distribution)
200
+ return undefined;
201
+ if (distribution.length === length)
202
+ return distribution;
203
+ if (distribution.length > length)
204
+ return distribution.slice(0, length);
205
+ return [...distribution, ...Array(length - distribution.length).fill(0)];
206
+ }
207
+ function argmax(values) {
208
+ let best = 0;
209
+ for (let index = 1; index < values.length; index++) {
210
+ if ((values[index] ?? 0) > (values[best] ?? 0))
211
+ best = index;
212
+ }
213
+ return best;
214
+ }
215
+ /** Validate backend answers against the questions and preserve question order. */
216
+ export function validateJudgeAnswers(questions, answers) {
217
+ return questions.map((question, index) => {
218
+ const answer = answers[index] ?? answers.find((candidate) => candidate.id === question.id);
219
+ if (!answer)
220
+ throw new Error(`judge backend returned no answer for question ${question.id}`);
221
+ return validateAnswer(question, answer);
222
+ });
223
+ }
224
+ /** The ordered primary values bound back into DML. */
225
+ export function judgeAnswersToValues(questions, answers) {
226
+ return questions.map((question, index) => {
227
+ const answer = answers[index];
228
+ if (!answer)
229
+ throw new Error(`missing judge answer for ${question.id}`);
230
+ if (question.kind === 'probability') {
231
+ if (typeof answer.probability !== 'number') {
232
+ throw new Error(`judge answer for '${question.id}' did not return a probability`);
233
+ }
234
+ return answer.probability;
235
+ }
236
+ if (question.kind === 'verify')
237
+ return answer.value ?? 'unknown';
238
+ return answer.value ?? '';
239
+ });
240
+ }
241
+ /** Serialize answer values into a Prolog list, using atoms for identifiers. */
242
+ export function valuesToPrologList(values) {
243
+ return `[${values.map(prologValue).join(', ')}]`;
244
+ }
245
+ function prologValue(value) {
246
+ if (typeof value === 'number')
247
+ return String(value);
248
+ if (/^[a-z][a-zA-Z0-9_]*$/.test(value))
249
+ return value;
250
+ return JSON.stringify(value);
251
+ }
252
+ function stableStringify(value) {
253
+ if (value === undefined)
254
+ return 'undefined';
255
+ if (value === null || typeof value !== 'object')
256
+ return JSON.stringify(value);
257
+ if (Array.isArray(value))
258
+ return `[${value.map((entry) => stableStringify(entry)).join(',')}]`;
259
+ const entries = Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
260
+ return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`).join(',')}}`;
261
+ }
262
+ /** Cache key for a judgment: same backend/model/state/questions returns the same answers. */
263
+ export function judgeCacheKey(backendId, model, state, questions) {
264
+ return `${backendId}|${model}|${stableStringify(state)}|${stableStringify(questions)}`;
265
+ }
266
+ //# sourceMappingURL=marshal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marshal.js","sourceRoot":"","sources":["../../src/judge/marshal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Mock judge backend.
3
+ *
4
+ * Useful for development and tests: it returns deterministic, schema-valid
5
+ * answers without any network access. `createMockJevJudgeBackend` configures it
6
+ * with Jev-like calibrated capabilities so the real Jev path can be developed
7
+ * and exercised before an API key is available.
8
+ */
9
+ import { type JudgeAnswer, type JudgeBackend, type JudgeBackendRequest, type JudgeCapabilities } from './types.js';
10
+ export type MockAnswerSource = JudgeAnswer[] | ((request: JudgeBackendRequest) => JudgeAnswer[] | Promise<JudgeAnswer[]>);
11
+ export interface MockJudgeBackendOptions {
12
+ id?: string;
13
+ answers?: MockAnswerSource;
14
+ capabilities?: Partial<JudgeCapabilities>;
15
+ /** Default probability for verify / probability questions. */
16
+ probability?: number;
17
+ /** Which option a choose question selects. */
18
+ choice?: 'first' | 'last';
19
+ /** Simulated latency. */
20
+ delayMs?: number;
21
+ }
22
+ export declare function createMockJudgeBackend(options?: MockJudgeBackendOptions): JudgeBackend;
23
+ /**
24
+ * A mock that behaves like a calibrated Jev backend. Register it under `jev`
25
+ * to exercise the Jev code path without network access or an API key.
26
+ */
27
+ export declare function createMockJevJudgeBackend(options?: MockJudgeBackendOptions): JudgeBackend;
28
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/judge/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAEvB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GACxB,WAAW,EAAE,GACb,CAAC,CAAC,OAAO,EAAE,mBAAmB,KAAK,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1C,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqDD,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,YAAY,CAqB1F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,uBAA4B,GAAG,YAAY,CAc7F"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Mock judge backend.
3
+ *
4
+ * Useful for development and tests: it returns deterministic, schema-valid
5
+ * answers without any network access. `createMockJevJudgeBackend` configures it
6
+ * with Jev-like calibrated capabilities so the real Jev path can be developed
7
+ * and exercised before an API key is available.
8
+ */
9
+ import { withJudgeCapabilities, } from './types.js';
10
+ function levelLabel(question, index) {
11
+ const level = question.levels?.[index];
12
+ if (typeof level === 'string')
13
+ return level;
14
+ if (typeof level === 'number' || typeof level === 'boolean')
15
+ return String(level);
16
+ if (level && typeof level === 'object' && typeof level.what === 'string') {
17
+ return level.what;
18
+ }
19
+ return `level_${index}`;
20
+ }
21
+ function deriveAnswer(question, probability, choice, basis) {
22
+ if (question.kind === 'choose') {
23
+ const optionIds = (question.options ?? []).map((option) => option.id);
24
+ const index = choice === 'last' ? Math.max(optionIds.length - 1, 0) : 0;
25
+ return {
26
+ id: question.id,
27
+ kind: question.kind,
28
+ value: optionIds[index] ?? 'option',
29
+ confidence: 1,
30
+ distribution: optionIds.map((_, position) => (position === index ? 1 : 0)),
31
+ basis,
32
+ };
33
+ }
34
+ if (question.kind === 'rate') {
35
+ const levels = question.levels ?? [];
36
+ return {
37
+ id: question.id,
38
+ kind: question.kind,
39
+ value: levelLabel(question, 0),
40
+ confidence: 1,
41
+ distribution: levels.map((_, position) => (position === 0 ? 1 : 0)),
42
+ basis,
43
+ };
44
+ }
45
+ if (question.kind === 'probability') {
46
+ return { id: question.id, kind: question.kind, probability, basis };
47
+ }
48
+ return {
49
+ id: question.id,
50
+ kind: question.kind,
51
+ value: probability >= 0.5 ? 'yes' : 'no',
52
+ probability,
53
+ basis,
54
+ };
55
+ }
56
+ export function createMockJudgeBackend(options = {}) {
57
+ const capabilities = withJudgeCapabilities(options.capabilities);
58
+ const probability = options.probability ?? 0.5;
59
+ const choice = options.choice ?? 'first';
60
+ const basis = capabilities.calibrated ? 'calibrated' : 'mock';
61
+ return {
62
+ id: options.id ?? 'mock',
63
+ capabilities,
64
+ async complete(request) {
65
+ if (options.delayMs && options.delayMs > 0) {
66
+ await new Promise((resolve) => setTimeout(resolve, options.delayMs));
67
+ }
68
+ if (typeof options.answers === 'function')
69
+ return { answers: await options.answers(request) };
70
+ if (Array.isArray(options.answers))
71
+ return { answers: options.answers };
72
+ return {
73
+ answers: request.questions.map((question) => deriveAnswer(question, probability, choice, basis)),
74
+ model: 'mock',
75
+ };
76
+ },
77
+ };
78
+ }
79
+ /**
80
+ * A mock that behaves like a calibrated Jev backend. Register it under `jev`
81
+ * to exercise the Jev code path without network access or an API key.
82
+ */
83
+ export function createMockJevJudgeBackend(options = {}) {
84
+ return createMockJudgeBackend({
85
+ ...options,
86
+ id: options.id ?? 'jev',
87
+ capabilities: {
88
+ calibrated: true,
89
+ probability: true,
90
+ confidence: true,
91
+ independentQuestions: true,
92
+ batch: true,
93
+ structuredCriteria: true,
94
+ ...(options.capabilities ?? {}),
95
+ },
96
+ });
97
+ }
98
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/judge/mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Public types for the SDK judgment layer.
3
+ *
4
+ * A `JudgeBackend` answers bounded, typed questions about an explicit state.
5
+ * It is the second injectable seam next to `LLMBackend`, and the SDK ships
6
+ * specializations for an LLM, Jev (TypeSafe System One), and a mock.
7
+ */
8
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
9
+ [key: string]: JsonValue;
10
+ };
11
+ /** The three generic judgment kinds. */
12
+ export type JudgeQuestionKind = 'choose' | 'rate' | 'verify' | 'probability';
13
+ /**
14
+ * How a value was produced. Kept explicit so uncalibrated numbers are never
15
+ * mistaken for calibrated probabilities.
16
+ */
17
+ export type JudgeBasis = 'calibrated' | 'self_reported' | 'estimated' | 'label' | 'human' | 'mock';
18
+ export interface JudgeOption {
19
+ id: string;
20
+ description?: JsonValue | null;
21
+ }
22
+ export type JudgeLevel = JsonValue;
23
+ export interface JudgeQuestion {
24
+ /** Stable id used in events and cache keys; generated by the bridge. */
25
+ id: string;
26
+ kind: JudgeQuestionKind;
27
+ instruction: string | JsonValue;
28
+ /** choose */
29
+ options?: JudgeOption[];
30
+ /** rate */
31
+ levels?: JudgeLevel[];
32
+ /** verify */
33
+ criteria?: {
34
+ true?: JsonValue | null;
35
+ false?: JsonValue | null;
36
+ };
37
+ }
38
+ export interface JudgeAnswer {
39
+ id: string;
40
+ kind: JudgeQuestionKind;
41
+ /** choose -> option id; rate -> level id; verify -> 'yes' | 'no' | 'unknown'. */
42
+ value?: string;
43
+ /** verify / probability. */
44
+ probability?: number;
45
+ /** choose / rate. */
46
+ confidence?: number;
47
+ /** Aligned to `options` or `levels`. */
48
+ distribution?: number[];
49
+ basis: JudgeBasis;
50
+ }
51
+ export interface JudgeCapabilities {
52
+ calibrated: boolean;
53
+ probability: boolean;
54
+ confidence: boolean;
55
+ independentQuestions: boolean;
56
+ batch: boolean;
57
+ structuredCriteria: boolean;
58
+ maxQuestions: number;
59
+ maxOptions: number;
60
+ maxLevels: number;
61
+ stateTokenBudget: number;
62
+ }
63
+ export interface JudgeUsage {
64
+ inputTokens: number;
65
+ outputTokens: number;
66
+ totalTokens?: number;
67
+ }
68
+ export interface JudgeBackendRequest {
69
+ state: JsonValue;
70
+ questions: JudgeQuestion[];
71
+ signal?: AbortSignal;
72
+ model?: string;
73
+ requiredCapabilities?: Array<keyof JudgeCapabilities>;
74
+ }
75
+ export interface JudgeBackendResponse {
76
+ answers: JudgeAnswer[];
77
+ model?: string;
78
+ usage?: JudgeUsage;
79
+ }
80
+ export interface JudgeBackend {
81
+ readonly id: string;
82
+ readonly capabilities: JudgeCapabilities;
83
+ complete(request: JudgeBackendRequest): Promise<JudgeBackendResponse>;
84
+ }
85
+ /**
86
+ * Mutable selection shared between the SDK facade and the runner so a backend
87
+ * can be registered or made default after construction.
88
+ */
89
+ export interface JudgeSelection {
90
+ backends: Map<string, JudgeBackend>;
91
+ defaultName: string;
92
+ }
93
+ export declare const DEFAULT_JUDGE_CAPABILITIES: JudgeCapabilities;
94
+ export declare function withJudgeCapabilities(overrides: Partial<JudgeCapabilities> | undefined): JudgeCapabilities;
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/judge/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Public types for the SDK judgment layer.
3
+ *
4
+ * A `JudgeBackend` answers bounded, typed questions about an explicit state.
5
+ * It is the second injectable seam next to `LLMBackend`, and the SDK ships
6
+ * specializations for an LLM, Jev (TypeSafe System One), and a mock.
7
+ */
8
+ export const DEFAULT_JUDGE_CAPABILITIES = {
9
+ calibrated: false,
10
+ probability: false,
11
+ confidence: false,
12
+ independentQuestions: true,
13
+ batch: true,
14
+ structuredCriteria: false,
15
+ maxQuestions: 128,
16
+ maxOptions: 255,
17
+ maxLevels: 10,
18
+ stateTokenBudget: 32_000,
19
+ };
20
+ export function withJudgeCapabilities(overrides) {
21
+ return { ...DEFAULT_JUDGE_CAPABILITIES, ...(overrides ?? {}) };
22
+ }
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/judge/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2GH,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IAC3D,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,oBAAoB,EAAE,IAAI;IAC1B,KAAK,EAAE,IAAI;IACX,kBAAkB,EAAE,KAAK;IACzB,YAAY,EAAE,GAAG;IACjB,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,EAAE;IACb,gBAAgB,EAAE,MAAM;CACzB,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,SAAiD;IAEjD,OAAO,EAAE,GAAG,0BAA0B,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * JavaScript-Prolog Bridge utilities
3
3
  */
4
4
  import type { LanguageModel } from 'ai';
5
- import type { MemoryMessage, LLMUsage } from '../types.js';
5
+ import type { MemoryMessage, LLMBackend, LLMUsage } from '../types.js';
6
6
  export interface RawProviderResponseSnapshot {
7
7
  requestId: string;
8
8
  url: string;
@@ -25,6 +25,7 @@ export interface SampleSingleTokenOptions {
25
25
  signal?: AbortSignal;
26
26
  debugLog?: (...args: unknown[]) => void;
27
27
  onRawResponse?: (snapshot: Promise<RawProviderResponseSnapshot>) => void;
28
+ llmBackend?: LLMBackend;
28
29
  }
29
30
  export interface GenerateLlmReplyOptions {
30
31
  messages: MemoryMessage[];
@@ -39,6 +40,7 @@ export interface GenerateLlmReplyOptions {
39
40
  signal?: AbortSignal;
40
41
  debugLog?: (...args: unknown[]) => void;
41
42
  onRawResponse?: (snapshot: Promise<RawProviderResponseSnapshot>) => void;
43
+ llmBackend?: LLMBackend;
42
44
  }
43
45
  /**
44
46
  * Create a model provider for the Vercel AI SDK
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/prolog/bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,gBAAgB,GAAG,QAAQ,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;KACvD,CAAC;IACF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;KACvD,CAAC;IACF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI,CAAC;CAC1E;AAiSD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EACvC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI,GACvE,aAAa,CA8Mf;AA+DD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC,CA6BvH;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC,CAyBpH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAqCrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CA2CrD;AAgBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CA2D1D"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/prolog/bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,gBAAgB,GAAG,QAAQ,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;KACvD,CAAC;IACF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI,CAAC;IACzE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;KACvD,CAAC;IACF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI,CAAC;IACzE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAiSD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EACvC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI,GACvE,aAAa,CA8Mf;AA+DD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC,CA0CvH;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAC,CAmCpH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAqCrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CA2CrD;AAgBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CA2D1D"}
@@ -393,7 +393,7 @@ export function createModelProvider(provider, model, baseUrl, debugLog, onRawRes
393
393
  const kind = bodyAbortController?.signal.aborted ? 'aborted' : 'errored';
394
394
  debugLog?.(`[fetch] Body ${kind} requestId=${requestId} seq=${proxyRequestSeq} after ${Date.now() - fetchT0}ms: ${describeFetchError(failure)}`);
395
395
  });
396
- // Return a new Response with the instrumented body
396
+ // Return a new Response with the instrumented body
397
397
  return new Response(bodyTap.readable, {
398
398
  status: response.status,
399
399
  statusText: response.statusText,
@@ -512,6 +512,18 @@ function buildSampleTokenPrompt(prompt, allowedTokens) {
512
512
  return `${prompt}\nAllowed tokens: ${JSON.stringify(allowedTokens)}`;
513
513
  }
514
514
  export async function sampleSingleToken(options) {
515
+ if (options.llmBackend) {
516
+ const result = await options.llmBackend.complete({
517
+ messages: [{ role: 'user', content: buildSampleTokenPrompt(options.prompt, options.allowedTokens) }],
518
+ temperature: options.modelOptions.temperature,
519
+ maxTokens: 1,
520
+ signal: options.signal,
521
+ });
522
+ const token = options.allowedTokens && options.allowedTokens.length > 0
523
+ ? chooseAllowedSampleToken(result.text, options.allowedTokens)
524
+ : normalizeSampleTokenResponse(result.text);
525
+ return { token, usage: result.usage };
526
+ }
515
527
  const model = createModelProvider(options.modelOptions.provider, options.modelOptions.model, options.modelOptions.baseUrl, options.debugLog, options.onRawResponse);
516
528
  const result = await generateText({
517
529
  model,
@@ -532,6 +544,15 @@ export async function sampleSingleToken(options) {
532
544
  return { token, usage };
533
545
  }
534
546
  export async function generateLlmReply(options) {
547
+ if (options.llmBackend) {
548
+ const result = await options.llmBackend.complete({
549
+ messages: options.messages,
550
+ temperature: options.modelOptions.temperature,
551
+ maxTokens: options.modelOptions.maxOutputTokens,
552
+ signal: options.signal,
553
+ });
554
+ return { text: result.text, usage: result.usage };
555
+ }
535
556
  const model = createModelProvider(options.modelOptions.provider, options.modelOptions.model, options.modelOptions.baseUrl, options.debugLog, options.onRawResponse);
536
557
  const result = await generateText({
537
558
  model,