jevascript 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +447 -0
  3. package/dist/cache.d.ts +18 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +58 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/collections.d.ts +52 -0
  8. package/dist/collections.d.ts.map +1 -0
  9. package/dist/collections.js +206 -0
  10. package/dist/collections.js.map +1 -0
  11. package/dist/config.d.ts +57 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +75 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/context.d.ts +73 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +251 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/define.d.ts +52 -0
  20. package/dist/define.d.ts.map +1 -0
  21. package/dist/define.js +59 -0
  22. package/dist/define.js.map +1 -0
  23. package/dist/errors.d.ts +28 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +56 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/evaluate.d.ts +31 -0
  28. package/dist/evaluate.d.ts.map +1 -0
  29. package/dist/evaluate.js +142 -0
  30. package/dist/evaluate.js.map +1 -0
  31. package/dist/factory.d.ts +6 -0
  32. package/dist/factory.d.ts.map +1 -0
  33. package/dist/factory.js +7 -0
  34. package/dist/factory.js.map +1 -0
  35. package/dist/index.d.ts +68 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +53 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/internal.d.ts +3 -0
  40. package/dist/internal.d.ts.map +1 -0
  41. package/dist/internal.js +6 -0
  42. package/dist/internal.js.map +1 -0
  43. package/dist/outputs.d.ts +40 -0
  44. package/dist/outputs.d.ts.map +1 -0
  45. package/dist/outputs.js +20 -0
  46. package/dist/outputs.js.map +1 -0
  47. package/dist/providers/jev.d.ts +21 -0
  48. package/dist/providers/jev.d.ts.map +1 -0
  49. package/dist/providers/jev.js +175 -0
  50. package/dist/providers/jev.js.map +1 -0
  51. package/dist/questions.d.ts +98 -0
  52. package/dist/questions.d.ts.map +1 -0
  53. package/dist/questions.js +57 -0
  54. package/dist/questions.js.map +1 -0
  55. package/dist/runner.d.ts +52 -0
  56. package/dist/runner.d.ts.map +1 -0
  57. package/dist/runner.js +208 -0
  58. package/dist/runner.js.map +1 -0
  59. package/dist/schema.d.ts +49 -0
  60. package/dist/schema.d.ts.map +1 -0
  61. package/dist/schema.js +30 -0
  62. package/dist/schema.js.map +1 -0
  63. package/dist/testing.d.ts +34 -0
  64. package/dist/testing.d.ts.map +1 -0
  65. package/dist/testing.js +68 -0
  66. package/dist/testing.js.map +1 -0
  67. package/dist/types.d.ts +152 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +8 -0
  70. package/dist/types.js.map +1 -0
  71. package/package.json +29 -0
@@ -0,0 +1,251 @@
1
+ import { BUILTIN_DEFAULTS, globalRuntime, shouldWarnUnbatched } from "./config.js";
2
+ import { LowConfidenceError } from "./errors.js";
3
+ import { emit, runPlan } from "./runner.js";
4
+ import { bindCollections } from "./collections.js";
5
+ import { parseTtlOrUndefined } from "./internal.js";
6
+ import { DEFAULT_SCORE_FRAME, buildChoose, buildIs, buildScore, } from "./questions.js";
7
+ function scoreFrame(config) {
8
+ return config.defaults?.scoreFrame ?? DEFAULT_SCORE_FRAME;
9
+ }
10
+ /** Rounds needed for this question. `minConfidence` implies measurement. */
11
+ function resolveSamples(kind, options, config) {
12
+ if (options.samples !== undefined)
13
+ return Math.max(1, options.samples);
14
+ const needsMeasurement = options.minConfidence !== undefined && kind === "truth";
15
+ if (!needsMeasurement)
16
+ return 1;
17
+ return config.defaults?.samples ?? BUILTIN_DEFAULTS.samples;
18
+ }
19
+ async function applyFallback(confidence, minConfidence, value, fallback) {
20
+ if (minConfidence === undefined)
21
+ return value;
22
+ if (confidence !== undefined && confidence >= minConfidence)
23
+ return value;
24
+ if (fallback === undefined)
25
+ throw new LowConfidenceError(confidence ?? 0, minConfidence, value);
26
+ return typeof fallback === "function" ? await fallback() : fallback;
27
+ }
28
+ export class SemanticContext {
29
+ #state;
30
+ #pending = [];
31
+ #scheduled = false;
32
+ #flushes = 0;
33
+ #warned = false;
34
+ #counter = 0;
35
+ #runtime;
36
+ constructor(state, runtime = globalRuntime) {
37
+ this.#state = state;
38
+ this.#runtime = runtime;
39
+ }
40
+ get #config() {
41
+ return this.#runtime.config;
42
+ }
43
+ /**
44
+ * Queues a question and returns its answer.
45
+ *
46
+ * Nothing is sent until the current synchronous turn ends, so every question
47
+ * created in the same turn — `Promise.all([...])` or `batch({...})` — travels
48
+ * in one request. Sequentially awaited calls cannot be merged: the second
49
+ * call does not exist until the first has resolved.
50
+ */
51
+ #enqueue(provider, question, options) {
52
+ const key = `q${this.#counter++}`;
53
+ const ttl = parseTtlOrUndefined(options.cache ?? this.#config.defaults?.cache);
54
+ const planned = {
55
+ key,
56
+ question,
57
+ samples: resolveSamples(question.kind, options, this.#config),
58
+ ...(ttl !== undefined ? { cacheTtlMs: ttl } : {}),
59
+ };
60
+ return new Promise((resolve, reject) => {
61
+ this.#pending.push({
62
+ key,
63
+ provider,
64
+ planned,
65
+ timeoutMs: options.timeoutMs ?? this.#config.defaults?.timeoutMs,
66
+ metric: options.metric,
67
+ settle: (answer, measured, cached) => resolve({ answer, measured, cached }),
68
+ fail: reject,
69
+ });
70
+ this.#schedule();
71
+ });
72
+ }
73
+ #schedule() {
74
+ if (this.#scheduled)
75
+ return;
76
+ this.#scheduled = true;
77
+ queueMicrotask(() => {
78
+ this.#scheduled = false;
79
+ void this.#flush();
80
+ });
81
+ }
82
+ async #flush() {
83
+ const batch = this.#pending;
84
+ this.#pending = [];
85
+ if (batch.length === 0)
86
+ return;
87
+ this.#flushes++;
88
+ if (this.#flushes === 2 && !this.#warned && shouldWarnUnbatched(this.#config)) {
89
+ this.#warned = true;
90
+ const info = { context: "semantic(state)", flushCount: this.#flushes };
91
+ const hook = this.#config.observability?.onUnbatched;
92
+ if (hook)
93
+ hook(info);
94
+ else
95
+ console.warn("[semantic] This context issued a second provider request. Questions awaited one " +
96
+ "at a time cannot share a request. Use `batch({...})` or `Promise.all([...])` to " +
97
+ "send them together — batching is dramatically cheaper and no slower.");
98
+ }
99
+ const byProvider = new Map();
100
+ for (const item of batch) {
101
+ const list = byProvider.get(item.provider);
102
+ if (list)
103
+ list.push(item);
104
+ else
105
+ byProvider.set(item.provider, [item]);
106
+ }
107
+ await Promise.all([...byProvider].map(async ([provider, items]) => {
108
+ const timeouts = items.map((i) => i.timeoutMs).filter((t) => t !== undefined);
109
+ try {
110
+ const result = await runPlan(provider, this.#state, items.map((i) => i.planned), { store: this.#runtime.store, ...(timeouts.length > 0 ? { timeoutMs: Math.max(...timeouts) } : {}) });
111
+ // Only name the batch when every question came from the same
112
+ // definition; a mixed batch has no single identity to report.
113
+ const names = new Set(items.map((i) => (i.metric ? `${i.metric.name}@${i.metric.version ?? ""}` : "")));
114
+ const metric = names.size === 1 ? items[0].metric : undefined;
115
+ emit({
116
+ operation: items.length > 1 ? "batch" : "evaluate",
117
+ keys: items.map((i) => i.key),
118
+ provider: provider.name,
119
+ model: provider.model,
120
+ latencyMs: result.latencyMs,
121
+ cached: result.cachedKeys.size === items.length,
122
+ batched: items.length > 1,
123
+ questionCount: items.length,
124
+ requestCount: result.requestCount,
125
+ samples: Math.max(...items.map((i) => i.planned.samples)),
126
+ usage: result.usage,
127
+ ...(metric ? { metric } : {}),
128
+ }, this.#config);
129
+ for (const item of items) {
130
+ item.settle(result.answers[item.key], result.measured[item.key], result.cachedKeys.has(item.key));
131
+ }
132
+ }
133
+ catch (error) {
134
+ for (const item of items)
135
+ item.fail(error);
136
+ }
137
+ }));
138
+ }
139
+ async is(condition, options = {}) {
140
+ const provider = this.#runtime.provider(options.provider);
141
+ const built = buildIs(condition, options);
142
+ const { answer, measured } = await this.#enqueue(provider, built.question, options);
143
+ const probability = answer.probability;
144
+ const defaults = this.#config.defaults;
145
+ if (options.allowUnknown) {
146
+ const [low, high] = options.uncertaintyBand ?? defaults?.uncertaintyBand ?? BUILTIN_DEFAULTS.uncertaintyBand;
147
+ if (probability >= low && probability <= high)
148
+ return "unknown";
149
+ }
150
+ const threshold = options.threshold ?? defaults?.threshold ?? BUILTIN_DEFAULTS.threshold;
151
+ const raw = probability > threshold;
152
+ const value = await applyFallback(measured, options.minConfidence ?? defaults?.minConfidence, raw, options.fallback);
153
+ if (options.detailed) {
154
+ return { value, probability, ...(measured !== undefined ? { confidence: measured } : {}) };
155
+ }
156
+ return value;
157
+ }
158
+ async score(criterion, options = {}) {
159
+ const provider = this.#runtime.provider(options.provider);
160
+ const built = buildScore(criterion, options, scoreFrame(this.#config));
161
+ const { answer, measured } = await this.#enqueue(provider, built.question, options);
162
+ const [min, max] = built.range;
163
+ const defaults = this.#config.defaults;
164
+ let raw;
165
+ let detail;
166
+ if (answer.kind === "level") {
167
+ const levels = answer.probabilities.length;
168
+ const position = levels > 1 ? answer.level / (levels - 1) : 0;
169
+ raw = min + position * (max - min);
170
+ detail = { value: raw, level: answer.level, confidence: answer.confidence };
171
+ }
172
+ else {
173
+ const probability = answer.probability;
174
+ raw = min + probability * (max - min);
175
+ detail = { value: raw, probability, ...(measured !== undefined ? { confidence: measured } : {}) };
176
+ }
177
+ const value = await applyFallback(detail.confidence, options.minConfidence ?? defaults?.minConfidence, raw, options.fallback);
178
+ return options.detailed ? { ...detail, value } : value;
179
+ }
180
+ async choose(input, extra = {}) {
181
+ const provider = this.#runtime.provider(extra.provider);
182
+ const built = buildChoose(input, extra);
183
+ const { answer } = await this.#enqueue(provider, built.question, extra);
184
+ const choice = answer;
185
+ const value = await applyFallback(choice.confidence, extra.minConfidence ?? this.#config.defaults?.minConfidence, choice.choice, extra.fallback);
186
+ return extra.detailed
187
+ ? { value, confidence: choice.confidence, probabilities: { ...choice.probabilities } }
188
+ : value;
189
+ }
190
+ // -------------------------------------------------------------------------
191
+ // rank()
192
+ // -------------------------------------------------------------------------
193
+ /**
194
+ * Orders items by how well they fit this state.
195
+ *
196
+ * Each candidate is judged against the state in its own request, so this
197
+ * costs one call per item. When you only need the winner, `semantic.find`
198
+ * answers in a single call instead.
199
+ */
200
+ async rank(items, options) {
201
+ return bindCollections(this.#runtime).rank(items, { ...options, context: this.#state });
202
+ }
203
+ // -------------------------------------------------------------------------
204
+ // batch()
205
+ // -------------------------------------------------------------------------
206
+ /**
207
+ * Evaluates every question against this state in a single request.
208
+ *
209
+ * Equivalent to creating the same questions in one turn and awaiting them
210
+ * together; this form just makes the intent explicit and names the results.
211
+ */
212
+ async batch(spec) {
213
+ const frame = scoreFrame(this.#config);
214
+ const entries = Object.entries(spec);
215
+ const results = await Promise.all(entries.map(async ([, questionSpec]) => {
216
+ const built = questionSpec.build(frame);
217
+ const provider = this.#runtime.provider(built.options.provider);
218
+ const { answer, measured } = await this.#enqueue(provider, built.question, built.options);
219
+ return this.#interpret(built, answer, measured);
220
+ }));
221
+ const output = {};
222
+ entries.forEach(([key], index) => {
223
+ output[key] = results[index];
224
+ });
225
+ return output;
226
+ }
227
+ #interpret(built, answer, measured) {
228
+ const defaults = this.#config.defaults;
229
+ if (built.operation === "choose")
230
+ return answer.choice;
231
+ if (built.operation === "is") {
232
+ const options = built.options;
233
+ const probability = answer.probability;
234
+ if (options.allowUnknown) {
235
+ const [low, high] = options.uncertaintyBand ?? defaults?.uncertaintyBand ?? BUILTIN_DEFAULTS.uncertaintyBand;
236
+ if (probability >= low && probability <= high)
237
+ return "unknown";
238
+ }
239
+ return probability > (options.threshold ?? defaults?.threshold ?? BUILTIN_DEFAULTS.threshold);
240
+ }
241
+ const [min, max] = built.range ?? [0, 100];
242
+ if (answer.kind === "level") {
243
+ const levels = answer.probabilities.length;
244
+ const position = levels > 1 ? answer.level / (levels - 1) : 0;
245
+ return min + position * (max - min);
246
+ }
247
+ void measured;
248
+ return min + answer.probability * (max - min);
249
+ }
250
+ }
251
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type Runtime } from "./config.ts";
2
+ import type { IsOptions, QuestionSpec, ScoreOptions, SharedOptions } from "./questions.ts";
3
+ import type { JsonValue, State } from "./types.ts";
4
+ import type { NumberOutput } from "./outputs.ts";
5
+ export interface MetricDefinition {
6
+ name: string;
7
+ /** Bump whenever the wording changes. Logged alongside results so old evaluations stay interpretable. */
8
+ version?: string;
9
+ /**
10
+ * The proposition, written out in full. This is the explicit path: unlike the
11
+ * shorthand `score("urgency")`, nothing is inferred or reframed on your behalf.
12
+ */
13
+ description: string;
14
+ /** What clearly counts as true. */
15
+ trueWhen?: string | JsonValue;
16
+ /** What clearly does not count, even when it looks close — the near-misses. */
17
+ falseWhen?: string | JsonValue;
18
+ output?: NumberOutput;
19
+ defaults?: Omit<ScoreOptions, "range" | "levels">;
20
+ }
21
+ export interface Metric {
22
+ (state: State, options?: ScoreOptions): Promise<number>;
23
+ readonly name: string;
24
+ readonly version: string | undefined;
25
+ readonly definition: MetricDefinition;
26
+ /** Use inside `batch()` to share a request with other questions. */
27
+ question(options?: ScoreOptions): QuestionSpec<number>;
28
+ }
29
+ export declare function defineMetric(definition: MetricDefinition): Metric;
30
+ export declare function defineMetricWith(runtime: Runtime, definition: MetricDefinition): Metric;
31
+ export interface RuleDefinition {
32
+ name: string;
33
+ version?: string;
34
+ /** The condition, written as a complete proposition. */
35
+ condition: string;
36
+ trueWhen?: string | JsonValue;
37
+ falseWhen?: string | JsonValue;
38
+ defaults?: SharedOptions & {
39
+ threshold?: number;
40
+ allowUnknown?: boolean;
41
+ };
42
+ }
43
+ export interface Rule {
44
+ (state: State, options?: IsOptions): Promise<boolean>;
45
+ readonly name: string;
46
+ readonly version: string | undefined;
47
+ readonly definition: RuleDefinition;
48
+ question(options?: IsOptions): QuestionSpec<boolean>;
49
+ }
50
+ export declare function defineRule(definition: RuleDefinition): Rule;
51
+ export declare function defineRuleWith(runtime: Runtime, definition: RuleDefinition): Rule;
52
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE1F,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,yGAAyG;IACzG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,QAAQ,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,MAAM;IACrB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAA;IACrC,oEAAoE;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;CACvD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAkCvF;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,QAAQ,CAAC,EAAE,aAAa,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAC1E;AAED,MAAM,WAAW,IAAI;IACnB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAA;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;CACrD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAE3D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI,CA4BjF"}
package/dist/define.js ADDED
@@ -0,0 +1,59 @@
1
+ import { semanticContext } from "./factory.js";
2
+ import { globalRuntime } from "./config.js";
3
+ import { buildIs, buildScore, DEFAULT_SCORE_FRAME } from "./questions.js";
4
+ export function defineMetric(definition) {
5
+ return defineMetricWith(globalRuntime, definition);
6
+ }
7
+ export function defineMetricWith(runtime, definition) {
8
+ const range = [definition.output?.min ?? 0, definition.output?.max ?? 100];
9
+ const levels = definition.output?.levels;
10
+ const identity = { name: definition.name, ...(definition.version ? { version: definition.version } : {}) };
11
+ const baseOptions = (override = {}) => ({
12
+ ...definition.defaults,
13
+ ...override,
14
+ metric: identity,
15
+ range,
16
+ asProposition: true,
17
+ ...(levels ? { levels } : {}),
18
+ ...(definition.trueWhen !== undefined ? { trueWhen: definition.trueWhen } : {}),
19
+ ...(definition.falseWhen !== undefined ? { falseWhen: definition.falseWhen } : {}),
20
+ });
21
+ const call = (state, options = {}) => semanticContext(state, runtime).score(definition.description, baseOptions(options));
22
+ const metric = call;
23
+ Object.defineProperty(metric, "name", { value: definition.name, configurable: true });
24
+ Object.defineProperty(metric, "version", { value: definition.version, configurable: true });
25
+ Object.defineProperty(metric, "definition", { value: definition, configurable: true });
26
+ Object.defineProperty(metric, "question", {
27
+ value: (options = {}) => ({
28
+ build: (frame) => buildScore(definition.description, baseOptions(options), frame ?? DEFAULT_SCORE_FRAME),
29
+ }),
30
+ configurable: true,
31
+ });
32
+ return metric;
33
+ }
34
+ export function defineRule(definition) {
35
+ return defineRuleWith(globalRuntime, definition);
36
+ }
37
+ export function defineRuleWith(runtime, definition) {
38
+ const identity = { name: definition.name, ...(definition.version ? { version: definition.version } : {}) };
39
+ const baseOptions = (override = {}) => ({
40
+ ...definition.defaults,
41
+ ...override,
42
+ metric: identity,
43
+ ...(definition.trueWhen !== undefined ? { trueWhen: definition.trueWhen } : {}),
44
+ ...(definition.falseWhen !== undefined ? { falseWhen: definition.falseWhen } : {}),
45
+ });
46
+ const call = (state, options = {}) => semanticContext(state, runtime).is(definition.condition, baseOptions(options));
47
+ const rule = call;
48
+ Object.defineProperty(rule, "name", { value: definition.name, configurable: true });
49
+ Object.defineProperty(rule, "version", { value: definition.version, configurable: true });
50
+ Object.defineProperty(rule, "definition", { value: definition, configurable: true });
51
+ Object.defineProperty(rule, "question", {
52
+ value: (options = {}) => ({
53
+ build: () => buildIs(definition.condition, baseOptions(options)),
54
+ }),
55
+ configurable: true,
56
+ });
57
+ return rule;
58
+ }
59
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export declare class SemanticError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class NotConfiguredError extends SemanticError {
5
+ constructor();
6
+ }
7
+ /** The request cannot be expressed by this provider. Thrown before any network call. */
8
+ export declare class UnsupportedByProviderError extends SemanticError {
9
+ readonly provider: string;
10
+ readonly feature: string;
11
+ constructor(provider: string, feature: string, hint: string);
12
+ }
13
+ export declare class LowConfidenceError extends SemanticError {
14
+ readonly confidence: number;
15
+ readonly minConfidence: number;
16
+ readonly value: unknown;
17
+ constructor(confidence: number, minConfidence: number, value: unknown);
18
+ }
19
+ export declare class SemanticValidationError extends SemanticError {
20
+ readonly condition: string;
21
+ readonly probability: number;
22
+ constructor(condition: string, probability: number);
23
+ }
24
+ export declare class ProviderError extends SemanticError {
25
+ readonly status?: number | undefined;
26
+ constructor(message: string, status?: number | undefined);
27
+ }
28
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,aAAa;;CAQpD;AAED,wFAAwF;AACxF,qBAAa,0BAA2B,SAAQ,aAAa;IAEzD,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM;gBADf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM;CAKf;AAED,qBAAa,kBAAmB,SAAQ,aAAa;IAEjD,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO;gBAFd,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,OAAO;CAQ1B;AAED,qBAAa,uBAAwB,SAAQ,aAAa;IAEtD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM;gBADnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;CAK/B;AAED,qBAAa,aAAc,SAAQ,aAAa;IAG5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBADxB,OAAO,EAAE,MAAM,EACN,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B"}
package/dist/errors.js ADDED
@@ -0,0 +1,56 @@
1
+ export class SemanticError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "SemanticError";
5
+ }
6
+ }
7
+ export class NotConfiguredError extends SemanticError {
8
+ constructor() {
9
+ super("No provider configured. Set JEV_API_KEY in the environment, or call " +
10
+ "configureSemantic({ provider: jev({ apiKey }) }) before evaluating.");
11
+ this.name = "NotConfiguredError";
12
+ }
13
+ }
14
+ /** The request cannot be expressed by this provider. Thrown before any network call. */
15
+ export class UnsupportedByProviderError extends SemanticError {
16
+ provider;
17
+ feature;
18
+ constructor(provider, feature, hint) {
19
+ super(`Provider "${provider}" cannot do ${feature}. ${hint}`);
20
+ this.provider = provider;
21
+ this.feature = feature;
22
+ this.name = "UnsupportedByProviderError";
23
+ }
24
+ }
25
+ export class LowConfidenceError extends SemanticError {
26
+ confidence;
27
+ minConfidence;
28
+ value;
29
+ constructor(confidence, minConfidence, value) {
30
+ super(`Confidence ${confidence.toFixed(3)} is below minConfidence ${minConfidence}. ` +
31
+ "Supply `fallback` to degrade gracefully, or lower the threshold.");
32
+ this.confidence = confidence;
33
+ this.minConfidence = minConfidence;
34
+ this.value = value;
35
+ this.name = "LowConfidenceError";
36
+ }
37
+ }
38
+ export class SemanticValidationError extends SemanticError {
39
+ condition;
40
+ probability;
41
+ constructor(condition, probability) {
42
+ super(`Value failed semantic condition ${JSON.stringify(condition)} (p=${probability.toFixed(3)}).`);
43
+ this.condition = condition;
44
+ this.probability = probability;
45
+ this.name = "SemanticValidationError";
46
+ }
47
+ }
48
+ export class ProviderError extends SemanticError {
49
+ status;
50
+ constructor(message, status) {
51
+ super(message);
52
+ this.status = status;
53
+ this.name = "ProviderError";
54
+ }
55
+ }
56
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACnD;QACE,KAAK,CACH,sEAAsE;YACpE,qEAAqE,CACxE,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED,wFAAwF;AACxF,MAAM,OAAO,0BAA2B,SAAQ,aAAa;IAEhD;IACA;IAFX,YACW,QAAgB,EAChB,OAAe,EACxB,IAAY;QAEZ,KAAK,CAAC,aAAa,QAAQ,eAAe,OAAO,KAAK,IAAI,EAAE,CAAC,CAAA;QAJpD,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAAQ;QAIxB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAExC;IACA;IACA;IAHX,YACW,UAAkB,EAClB,aAAqB,EACrB,KAAc;QAEvB,KAAK,CACH,cAAc,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,aAAa,IAAI;YAC7E,kEAAkE,CACrE,CAAA;QAPQ,eAAU,GAAV,UAAU,CAAQ;QAClB,kBAAa,GAAb,aAAa,CAAQ;QACrB,UAAK,GAAL,KAAK,CAAS;QAMvB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IAE7C;IACA;IAFX,YACW,SAAiB,EACjB,WAAmB;QAE5B,KAAK,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAH3F,cAAS,GAAT,SAAS,CAAQ;QACjB,gBAAW,GAAX,WAAW,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAGnC;IAFX,YACE,OAAe,EACN,MAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAA;QAFL,WAAM,GAAN,MAAM,CAAS;QAGxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ import { type Runtime } from "./config.ts";
2
+ import type { AnyOutput, OutputValue } from "./outputs.ts";
3
+ import type { SemanticProvider, State } from "./types.ts";
4
+ export interface EvaluateRequest<O extends AnyOutput> {
5
+ data: State;
6
+ /**
7
+ * The frame every field is judged in — what the data is, what your words
8
+ * mean. Carried once in the state rather than repeated in every question.
9
+ */
10
+ question: string;
11
+ /** Background merged into the state: a policy, a tier list, a price table. */
12
+ context?: Record<string, unknown>;
13
+ output: O;
14
+ provider?: SemanticProvider;
15
+ timeoutMs?: number;
16
+ cache?: string | number;
17
+ samples?: number;
18
+ /** Identity of the definition this came from, for logs. */
19
+ metric?: {
20
+ name: string;
21
+ version?: string;
22
+ };
23
+ }
24
+ /**
25
+ * The low-level entry point. One request regardless of how many fields the
26
+ * output describes.
27
+ */
28
+ export declare function evaluate<O extends AnyOutput>(request: EvaluateRequest<O>): Promise<OutputValue<O>>;
29
+ /** `evaluate` against a specific runtime. `createSemantic()` binds this. */
30
+ export declare function evaluateWith<O extends AnyOutput>(runtime: Runtime, request: EvaluateRequest<O>): Promise<OutputValue<O>>;
31
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,aAAa,CAAA;AAI3E,OAAO,KAAK,EAAE,SAAS,EAAgB,WAAW,EAAE,MAAM,cAAc,CAAA;AACxE,OAAO,KAAK,EAA6B,gBAAgB,EAAoB,KAAK,EAAe,MAAM,YAAY,CAAA;AAEnH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,SAAS;IAClD,IAAI,EAAE,KAAK,CAAA;IACX;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,MAAM,EAAE,CAAC,CAAA;IACT,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5C;AAwED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAExG;AAED,4EAA4E;AAC5E,wBAAsB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAwE9H"}