@tradejs/infra 3.1.29-beta.260 → 3.1.29-beta.262

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/jev.d.mts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { JevProviderConfig, JevResponse } from '@tradejs/types';
2
2
 
3
+ /** Provider criteria are zero-based: ten strength levels use raw scores 0–9. */
4
+ declare const jevScoreMaximum: (dimension: string) => 4 | 9;
3
5
  declare const jevStableJson: (value: unknown) => string;
4
6
  declare const jevHash: (value: unknown) => string;
5
7
  declare const jevFileHash: (contents: string) => string;
@@ -13,4 +15,4 @@ declare const requestJev: (provider: JevProviderConfig, apiKey: string, state: u
13
15
  }) => Promise<JevResponse>;
14
16
  declare const validateJevResponse: (body: unknown, expected: string[]) => JevResponse;
15
17
 
16
- export { jevFileHash, jevHash, jevStableJson, readJevArtifact, requestJev, validateJevResponse, writeJevArtifact };
18
+ export { jevFileHash, jevHash, jevScoreMaximum, jevStableJson, readJevArtifact, requestJev, validateJevResponse, writeJevArtifact };
package/dist/jev.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { JevProviderConfig, JevResponse } from '@tradejs/types';
2
2
 
3
+ /** Provider criteria are zero-based: ten strength levels use raw scores 0–9. */
4
+ declare const jevScoreMaximum: (dimension: string) => 4 | 9;
3
5
  declare const jevStableJson: (value: unknown) => string;
4
6
  declare const jevHash: (value: unknown) => string;
5
7
  declare const jevFileHash: (contents: string) => string;
@@ -13,4 +15,4 @@ declare const requestJev: (provider: JevProviderConfig, apiKey: string, state: u
13
15
  }) => Promise<JevResponse>;
14
16
  declare const validateJevResponse: (body: unknown, expected: string[]) => JevResponse;
15
17
 
16
- export { jevFileHash, jevHash, jevStableJson, readJevArtifact, requestJev, validateJevResponse, writeJevArtifact };
18
+ export { jevFileHash, jevHash, jevScoreMaximum, jevStableJson, readJevArtifact, requestJev, validateJevResponse, writeJevArtifact };
package/dist/jev.js CHANGED
@@ -32,6 +32,7 @@ var jev_exports = {};
32
32
  __export(jev_exports, {
33
33
  jevFileHash: () => jevFileHash,
34
34
  jevHash: () => jevHash,
35
+ jevScoreMaximum: () => jevScoreMaximum,
35
36
  jevStableJson: () => jevStableJson,
36
37
  readJevArtifact: () => readJevArtifact,
37
38
  requestJev: () => requestJev,
@@ -42,6 +43,7 @@ module.exports = __toCommonJS(jev_exports);
42
43
  var import_node_crypto = require("crypto");
43
44
  var import_promises = __toESM(require("fs/promises"));
44
45
  var import_node_path = __toESM(require("path"));
46
+ var jevScoreMaximum = (dimension) => dimension === "signalStrength" ? 9 : 4;
45
47
  var jevStableJson = (value) => {
46
48
  if (Array.isArray(value)) return `[${value.map(jevStableJson).join(",")}]`;
47
49
  if (value && typeof value === "object")
@@ -101,6 +103,12 @@ var requestJev = async (provider, apiKey, state, questions, options = {}) => {
101
103
  body: JSON.stringify({ model: provider.model, state, questions })
102
104
  });
103
105
  } catch {
106
+ if (!controller.signal.aborted && attempt < (options.retries ?? 2)) {
107
+ await new Promise(
108
+ (resolve) => setTimeout(resolve, 250 * 2 ** attempt)
109
+ );
110
+ continue;
111
+ }
104
112
  throw new Error(
105
113
  controller.signal.aborted ? "Jev request timed out" : "Jev provider connection failed"
106
114
  );
@@ -148,26 +156,28 @@ var validateJevResponse = (body, expected) => {
148
156
  const result = body;
149
157
  if (!result || typeof result.model !== "string" || !result.model || !result.answers)
150
158
  throw new Error("Invalid Jev response");
151
- if (!expected.length || expected.length > 8 || Object.keys(result.answers).sort().join(",") !== [...expected].sort().join(","))
159
+ if (!expected.length || expected.length > 9 || Object.keys(result.answers).sort().join(",") !== [...expected].sort().join(","))
152
160
  throw new Error("Invalid Jev answer set");
153
161
  for (const key of expected) {
154
162
  const answer = result.answers[key];
155
- if (!answer || answer.type !== "score" || !Number.isFinite(answer.score) || answer.score < 0 || answer.score > 4 || !Number.isFinite(answer.confidence) || answer.confidence < 0 || answer.confidence > 1)
163
+ const maximum = jevScoreMaximum(key);
164
+ const levels = Array.from({ length: maximum + 1 }, (_, index) => index);
165
+ if (!answer || answer.type !== "score" || !Number.isFinite(answer.score) || answer.score < 0 || answer.score > maximum || !Number.isFinite(answer.confidence) || answer.confidence < 0 || answer.confidence > 1)
156
166
  throw new Error(`Invalid Jev ${key} answer`);
157
167
  const probabilities = answer.probabilities;
158
- if (!probabilities || Object.keys(probabilities).length !== 5 || [0, 1, 2, 3, 4].some(
168
+ if (!probabilities || Object.keys(probabilities).length !== levels.length || levels.some(
159
169
  (level) => !Number.isFinite(probabilities[level]) || probabilities[level] < 0 || probabilities[level] > 1
160
170
  ))
161
171
  throw new Error(`Invalid Jev ${key} probabilities`);
162
172
  const roundingHalfUnit = 5e-3;
163
173
  const epsilon = 1e-9;
164
- if (Math.abs(Object.values(probabilities).reduce((a, b) => a + b, 0) - 1) > 5 * roundingHalfUnit + epsilon)
174
+ if (Math.abs(Object.values(probabilities).reduce((a, b) => a + b, 0) - 1) > levels.length * roundingHalfUnit + epsilon)
165
175
  throw new Error("Jev probabilities must sum to one");
166
- const mean = [0, 1, 2, 3, 4].reduce(
176
+ const mean = levels.reduce(
167
177
  (sum, level) => sum + level * probabilities[level],
168
178
  0
169
179
  );
170
- if (Math.abs(mean - answer.score) > (0 + 1 + 2 + 3 + 4 + 1) * roundingHalfUnit + epsilon)
180
+ if (Math.abs(mean - answer.score) > levels.reduce((sum, level) => sum + level, 1) * roundingHalfUnit + epsilon)
171
181
  throw new Error("Jev score disagrees with probabilities");
172
182
  }
173
183
  return result;
@@ -176,6 +186,7 @@ var validateJevResponse = (body, expected) => {
176
186
  0 && (module.exports = {
177
187
  jevFileHash,
178
188
  jevHash,
189
+ jevScoreMaximum,
179
190
  jevStableJson,
180
191
  readJevArtifact,
181
192
  requestJev,
package/dist/jev.mjs CHANGED
@@ -2,6 +2,7 @@
2
2
  import { createHash, randomUUID } from "crypto";
3
3
  import fs from "fs/promises";
4
4
  import path from "path";
5
+ var jevScoreMaximum = (dimension) => dimension === "signalStrength" ? 9 : 4;
5
6
  var jevStableJson = (value) => {
6
7
  if (Array.isArray(value)) return `[${value.map(jevStableJson).join(",")}]`;
7
8
  if (value && typeof value === "object")
@@ -61,6 +62,12 @@ var requestJev = async (provider, apiKey, state, questions, options = {}) => {
61
62
  body: JSON.stringify({ model: provider.model, state, questions })
62
63
  });
63
64
  } catch {
65
+ if (!controller.signal.aborted && attempt < (options.retries ?? 2)) {
66
+ await new Promise(
67
+ (resolve) => setTimeout(resolve, 250 * 2 ** attempt)
68
+ );
69
+ continue;
70
+ }
64
71
  throw new Error(
65
72
  controller.signal.aborted ? "Jev request timed out" : "Jev provider connection failed"
66
73
  );
@@ -108,26 +115,28 @@ var validateJevResponse = (body, expected) => {
108
115
  const result = body;
109
116
  if (!result || typeof result.model !== "string" || !result.model || !result.answers)
110
117
  throw new Error("Invalid Jev response");
111
- if (!expected.length || expected.length > 8 || Object.keys(result.answers).sort().join(",") !== [...expected].sort().join(","))
118
+ if (!expected.length || expected.length > 9 || Object.keys(result.answers).sort().join(",") !== [...expected].sort().join(","))
112
119
  throw new Error("Invalid Jev answer set");
113
120
  for (const key of expected) {
114
121
  const answer = result.answers[key];
115
- if (!answer || answer.type !== "score" || !Number.isFinite(answer.score) || answer.score < 0 || answer.score > 4 || !Number.isFinite(answer.confidence) || answer.confidence < 0 || answer.confidence > 1)
122
+ const maximum = jevScoreMaximum(key);
123
+ const levels = Array.from({ length: maximum + 1 }, (_, index) => index);
124
+ if (!answer || answer.type !== "score" || !Number.isFinite(answer.score) || answer.score < 0 || answer.score > maximum || !Number.isFinite(answer.confidence) || answer.confidence < 0 || answer.confidence > 1)
116
125
  throw new Error(`Invalid Jev ${key} answer`);
117
126
  const probabilities = answer.probabilities;
118
- if (!probabilities || Object.keys(probabilities).length !== 5 || [0, 1, 2, 3, 4].some(
127
+ if (!probabilities || Object.keys(probabilities).length !== levels.length || levels.some(
119
128
  (level) => !Number.isFinite(probabilities[level]) || probabilities[level] < 0 || probabilities[level] > 1
120
129
  ))
121
130
  throw new Error(`Invalid Jev ${key} probabilities`);
122
131
  const roundingHalfUnit = 5e-3;
123
132
  const epsilon = 1e-9;
124
- if (Math.abs(Object.values(probabilities).reduce((a, b) => a + b, 0) - 1) > 5 * roundingHalfUnit + epsilon)
133
+ if (Math.abs(Object.values(probabilities).reduce((a, b) => a + b, 0) - 1) > levels.length * roundingHalfUnit + epsilon)
125
134
  throw new Error("Jev probabilities must sum to one");
126
- const mean = [0, 1, 2, 3, 4].reduce(
135
+ const mean = levels.reduce(
127
136
  (sum, level) => sum + level * probabilities[level],
128
137
  0
129
138
  );
130
- if (Math.abs(mean - answer.score) > (0 + 1 + 2 + 3 + 4 + 1) * roundingHalfUnit + epsilon)
139
+ if (Math.abs(mean - answer.score) > levels.reduce((sum, level) => sum + level, 1) * roundingHalfUnit + epsilon)
131
140
  throw new Error("Jev score disagrees with probabilities");
132
141
  }
133
142
  return result;
@@ -135,6 +144,7 @@ var validateJevResponse = (body, expected) => {
135
144
  export {
136
145
  jevFileHash,
137
146
  jevHash,
147
+ jevScoreMaximum,
138
148
  jevStableJson,
139
149
  readJevArtifact,
140
150
  requestJev,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/infra",
3
- "version": "3.1.29-beta.260",
3
+ "version": "3.1.29-beta.262",
4
4
  "description": "MIT-licensed server infrastructure adapters for TradeJS: Redis, Timescale, ML, logging, and IO.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -16,7 +16,8 @@
16
16
  "coinbase",
17
17
  "ai",
18
18
  "claude",
19
- "codex"
19
+ "codex",
20
+ "jev"
20
21
  ],
21
22
  "repository": {
22
23
  "type": "git",
@@ -140,7 +141,7 @@
140
141
  "dependencies": {
141
142
  "@grpc/grpc-js": "^1.14.4",
142
143
  "@grpc/proto-loader": "^0.8.1",
143
- "@tradejs/types": "^3.1.29-beta.260",
144
+ "@tradejs/types": "^3.1.29-beta.262",
144
145
  "chalk": "4.1.2",
145
146
  "date-fns": "^3.6.0",
146
147
  "ioredis": "5.11.1",