nexus-agents 2.30.5 → 2.30.7
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/{chunk-3QB7RYPU.js → chunk-23G7NV6B.js} +4 -3
- package/dist/chunk-23G7NV6B.js.map +1 -0
- package/dist/{chunk-WZSC46BL.js → chunk-42FGTDIW.js} +2 -2
- package/dist/{chunk-MBFIXCG3.js → chunk-7GW7ZRJ3.js} +174 -65
- package/dist/chunk-7GW7ZRJ3.js.map +1 -0
- package/dist/{chunk-VIT7VLL5.js → chunk-WGP6G6QU.js} +3 -3
- package/dist/{chunk-5HPIESKY.js → chunk-ZVUNIQLB.js} +4 -2
- package/dist/chunk-ZVUNIQLB.js.map +1 -0
- package/dist/cli.js +28 -17
- package/dist/cli.js.map +1 -1
- package/dist/{consensus-vote-APVO4C5T.js → consensus-vote-MFGKPIAO.js} +2 -2
- package/dist/{expert-bridge-7OFH3ZXI.js → expert-bridge-IKR23WRI.js} +2 -2
- package/dist/index.d.ts +5 -1
- package/dist/index.js +5 -5
- package/dist/{setup-command-JP65RU7R.js → setup-command-SP43B2UM.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-3QB7RYPU.js.map +0 -1
- package/dist/chunk-5HPIESKY.js.map +0 -1
- package/dist/chunk-MBFIXCG3.js.map +0 -1
- /package/dist/{chunk-WZSC46BL.js.map → chunk-42FGTDIW.js.map} +0 -0
- /package/dist/{chunk-VIT7VLL5.js.map → chunk-WGP6G6QU.js.map} +0 -0
- /package/dist/{consensus-vote-APVO4C5T.js.map → consensus-vote-MFGKPIAO.js.map} +0 -0
- /package/dist/{expert-bridge-7OFH3ZXI.js.map → expert-bridge-IKR23WRI.js.map} +0 -0
- /package/dist/{setup-command-JP65RU7R.js.map → setup-command-SP43B2UM.js.map} +0 -0
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "./chunk-CLYZ7FWP.js";
|
|
25
25
|
|
|
26
26
|
// src/version.ts
|
|
27
|
-
var VERSION = true ? "2.30.
|
|
27
|
+
var VERSION = true ? "2.30.7" : "dev";
|
|
28
28
|
|
|
29
29
|
// src/cli/setup-data-dir.ts
|
|
30
30
|
import { mkdirSync, existsSync as existsSync2 } from "fs";
|
|
@@ -758,7 +758,7 @@ async function runDoctorFix(result) {
|
|
|
758
758
|
writeLine2("\u2500".repeat(40));
|
|
759
759
|
let fixCount = 0;
|
|
760
760
|
if (!result.dataDirectory.rootExists || result.dataDirectory.subdirectories.some((d) => !d.exists || !d.writable)) {
|
|
761
|
-
const { runSetup } = await import("./setup-command-
|
|
761
|
+
const { runSetup } = await import("./setup-command-SP43B2UM.js");
|
|
762
762
|
const setupResult = runSetup({
|
|
763
763
|
skipMcp: true,
|
|
764
764
|
skipRules: true,
|
|
@@ -836,4 +836,4 @@ export {
|
|
|
836
836
|
startStdioServer,
|
|
837
837
|
closeServer
|
|
838
838
|
};
|
|
839
|
-
//# sourceMappingURL=chunk-
|
|
839
|
+
//# sourceMappingURL=chunk-WGP6G6QU.js.map
|
|
@@ -31,7 +31,9 @@ async function getRouter() {
|
|
|
31
31
|
try {
|
|
32
32
|
const { createCliCircuitBreakerIntegration } = await import("./cli-circuit-breaker-MBTG6XC7.js");
|
|
33
33
|
cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);
|
|
34
|
-
} catch {
|
|
34
|
+
} catch (error) {
|
|
35
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
36
|
+
logger.debug("Circuit breaker init failed; continuing without it", { error: msg });
|
|
35
37
|
}
|
|
36
38
|
return cachedRouter;
|
|
37
39
|
}
|
|
@@ -119,4 +121,4 @@ ${prompt}`;
|
|
|
119
121
|
export {
|
|
120
122
|
executeExpert
|
|
121
123
|
};
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
124
|
+
//# sourceMappingURL=chunk-ZVUNIQLB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pipeline/expert-bridge.ts"],"sourcesContent":["/**\n * Expert Bridge — Programmatic access to the execute_expert pipeline (#1693)\n *\n * Provides a clean wrapper for calling experts with the full pipeline:\n * timeout, fallback cascade, degradation detection, heartbeat, outcome recording.\n *\n * DRY: reuses createBuiltInExpert + CompositeRouter instead of reimplementing.\n *\n * @module pipeline/expert-bridge\n */\n\nimport { createLogger, getTimeProvider } from '../core/index.js';\nimport type { BuiltInExpertType } from '../agents/experts/expert-config.js';\nimport { isRateLimitText } from '../adapters/rate-limit-detector.js';\n\nconst logger = createLogger({ component: 'expert-bridge' });\n\n/** Base delay for rate limit retry backoff (ms). Scales linearly: 3s, 6s, 9s. */\nconst RATE_LIMIT_BASE_DELAY_MS = 3000;\n\n/** Result of an expert execution. */\nexport interface ExpertBridgeResult {\n readonly success: boolean;\n readonly text: string;\n readonly expertType: BuiltInExpertType;\n readonly durationMs: number;\n readonly error?: string;\n}\n\n/**\n * Execute an expert task with the full nexus-agents expert pipeline.\n *\n * Creates a built-in expert, executes via CompositeRouter (for intelligent\n * CLI routing), and records outcomes. Falls back gracefully on failure.\n *\n * @param expertType - Built-in expert type (code, architecture, security, qa, etc.)\n * @param prompt - Task prompt for the expert\n * @returns Expert result with text output\n */\n/** Minimal router interface for the bridge. */\ninterface RouterLike {\n executeTask(task: {\n content: string;\n options?: Record<string, unknown> | undefined;\n }): Promise<{ ok: boolean; value: { text: string }; error: { message: string } }>;\n}\n\n// Cached router — lazily initialized, reused across calls within a session\nlet cachedRouter: RouterLike | null = null;\n\n// Cached MCP config — generated once, reused across expert calls (#1708)\nlet cachedMcpConfigPath: string | null = null;\n\n/** Get or create cached MCP config path for expert CLI sessions (#1708). */\nasync function getMcpConfigPath(): Promise<string | null> {\n if (cachedMcpConfigPath !== null) return cachedMcpConfigPath;\n try {\n const { generateMcpConfig } = await import('../swe-bench/mcp-config.js');\n const config = await generateMcpConfig();\n cachedMcpConfigPath = config.configPath;\n return cachedMcpConfigPath;\n } catch {\n return null; // MCP config not available — experts run without tools\n }\n}\n\n/** Cached circuit breaker for health monitoring (#1766). */\nlet cachedCircuitBreaker: {\n getHealthStatus(): {\n systemHealthy: boolean;\n healthyCount: number;\n clis: ReadonlyArray<{ name: string; healthy: boolean }>;\n };\n} | null = null;\n\n/** Get or create a cached CompositeRouter with circuit breaker monitoring. */\nasync function getRouter(): Promise<RouterLike | null> {\n if (cachedRouter !== null) return cachedRouter;\n const { createAllAdapters } = await import('../cli-adapters/factory.js');\n const { createCompositeRouter } = await import('../cli-adapters/composite-router.js');\n const adapters = createAllAdapters();\n if (adapters.size === 0) return null;\n cachedRouter = createCompositeRouter(adapters) as unknown as RouterLike;\n\n // Initialize circuit breaker monitoring (#1766)\n try {\n const { createCliCircuitBreakerIntegration } =\n await import('../cli-adapters/cli-circuit-breaker.js');\n cachedCircuitBreaker = createCliCircuitBreakerIntegration([...adapters.values()]);\n } catch (error: unknown) {\n // Circuit breaker not available — continue without it. Log so we can\n // notice if initialization silently stops working (#1913 Class B).\n const msg = error instanceof Error ? error.message : String(error);\n logger.debug('Circuit breaker init failed; continuing without it', { error: msg });\n }\n\n return cachedRouter;\n}\n\n/** Check CLI health before dispatch (#1766). */\nfunction checkCircuitHealth(): { healthy: boolean; message: string } {\n if (cachedCircuitBreaker === null) return { healthy: true, message: '' };\n const status = cachedCircuitBreaker.getHealthStatus();\n if (!status.systemHealthy) {\n return {\n healthy: false,\n message: `All CLI circuits open (${String(status.healthyCount)}/${String(status.clis.length)} healthy)`,\n };\n }\n return { healthy: true, message: '' };\n}\n\n/** Dispatch task to router with rate limit retry (#1802). */\nasync function dispatchWithRateLimitRetry(\n router: RouterLike,\n task: { content: string; options?: Record<string, unknown> | undefined },\n expertType: BuiltInExpertType,\n start: number\n): Promise<ExpertBridgeResult> {\n const maxAttempts = 3;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const result = await router.executeTask(task);\n const durationMs = getTimeProvider().now() - start;\n\n if (result.ok) {\n logger.info('Expert executed successfully', { expertType, durationMs });\n return { success: true, text: result.value.text, expertType, durationMs };\n }\n\n const isRateLimit = isRateLimitText(result.error.message);\n if (isRateLimit && attempt < maxAttempts - 1) {\n const backoffMs = RATE_LIMIT_BASE_DELAY_MS * (attempt + 1);\n logger.warn('Expert rate limited, retrying', { expertType, attempt: attempt + 1, backoffMs });\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n continue;\n }\n\n logger.warn('Expert execution failed', { expertType, error: result.error.message });\n return { success: false, text: '', expertType, durationMs, error: result.error.message };\n }\n\n return {\n success: false,\n text: '',\n expertType,\n durationMs: getTimeProvider().now() - start,\n error: 'Max retry attempts exceeded',\n };\n}\n\nexport async function executeExpert(\n expertType: BuiltInExpertType,\n prompt: string\n): Promise<ExpertBridgeResult> {\n const start = getTimeProvider().now();\n try {\n const { BUILT_IN_EXPERTS } = await import('../agents/experts/expert-config.js');\n const config = BUILT_IN_EXPERTS[expertType];\n const fullPrompt = `${config.systemPrompt}\\n\\n${prompt}`;\n\n const router = await getRouter();\n if (router === null) {\n return {\n success: false,\n text: `[No adapters] ${prompt}`,\n expertType,\n durationMs: getTimeProvider().now() - start,\n error: 'No CLI adapters available',\n };\n }\n\n // Check circuit breaker health before dispatch (#1766)\n const health = checkCircuitHealth();\n if (!health.healthy) {\n logger.warn('Circuit breaker: all CLIs unavailable', { expertType, reason: health.message });\n return {\n success: false,\n text: '',\n expertType,\n durationMs: getTimeProvider().now() - start,\n error: health.message,\n };\n }\n\n // Pass MCP config so CLI experts can call nexus-agents tools (#1708)\n const mcpConfigPath = await getMcpConfigPath();\n const task: { content: string; options?: Record<string, unknown> | undefined } = {\n content: fullPrompt,\n };\n if (mcpConfigPath !== null) task.options = { mcpConfigPath };\n\n return await dispatchWithRateLimitRetry(router, task, expertType, start);\n } catch (error) {\n const durationMs = getTimeProvider().now() - start;\n const msg = error instanceof Error ? error.message : String(error);\n logger.warn('Expert bridge error', { expertType, error: msg });\n return { success: false, text: '', expertType, durationMs, error: msg };\n }\n}\n"],"mappings":";;;;;;;AAeA,IAAM,SAAS,aAAa,EAAE,WAAW,gBAAgB,CAAC;AAG1D,IAAM,2BAA2B;AA8BjC,IAAI,eAAkC;AAGtC,IAAI,sBAAqC;AAGzC,eAAe,mBAA2C;AACxD,MAAI,wBAAwB,KAAM,QAAO;AACzC,MAAI;AACF,UAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,0BAA4B;AACvE,UAAM,SAAS,MAAM,kBAAkB;AACvC,0BAAsB,OAAO;AAC7B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAI,uBAMO;AAGX,eAAe,YAAwC;AACrD,MAAI,iBAAiB,KAAM,QAAO;AAClC,QAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,uBAA4B;AACvE,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,gCAAqC;AACpF,QAAM,WAAW,kBAAkB;AACnC,MAAI,SAAS,SAAS,EAAG,QAAO;AAChC,iBAAe,sBAAsB,QAAQ;AAG7C,MAAI;AACF,UAAM,EAAE,mCAAmC,IACzC,MAAM,OAAO,mCAAwC;AACvD,2BAAuB,mCAAmC,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC;AAAA,EAClF,SAAS,OAAgB;AAGvB,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,WAAO,MAAM,sDAAsD,EAAE,OAAO,IAAI,CAAC;AAAA,EACnF;AAEA,SAAO;AACT;AAGA,SAAS,qBAA4D;AACnE,MAAI,yBAAyB,KAAM,QAAO,EAAE,SAAS,MAAM,SAAS,GAAG;AACvE,QAAM,SAAS,qBAAqB,gBAAgB;AACpD,MAAI,CAAC,OAAO,eAAe;AACzB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,0BAA0B,OAAO,OAAO,YAAY,CAAC,IAAI,OAAO,OAAO,KAAK,MAAM,CAAC;AAAA,IAC9F;AAAA,EACF;AACA,SAAO,EAAE,SAAS,MAAM,SAAS,GAAG;AACtC;AAGA,eAAe,2BACb,QACA,MACA,YACA,OAC6B;AAC7B,QAAM,cAAc;AACpB,WAAS,UAAU,GAAG,UAAU,aAAa,WAAW;AACtD,UAAM,SAAS,MAAM,OAAO,YAAY,IAAI;AAC5C,UAAM,aAAa,gBAAgB,EAAE,IAAI,IAAI;AAE7C,QAAI,OAAO,IAAI;AACb,aAAO,KAAK,gCAAgC,EAAE,YAAY,WAAW,CAAC;AACtE,aAAO,EAAE,SAAS,MAAM,MAAM,OAAO,MAAM,MAAM,YAAY,WAAW;AAAA,IAC1E;AAEA,UAAM,cAAc,gBAAgB,OAAO,MAAM,OAAO;AACxD,QAAI,eAAe,UAAU,cAAc,GAAG;AAC5C,YAAM,YAAY,4BAA4B,UAAU;AACxD,aAAO,KAAK,iCAAiC,EAAE,YAAY,SAAS,UAAU,GAAG,UAAU,CAAC;AAC5F,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,SAAS,CAAC;AAC7D;AAAA,IACF;AAEA,WAAO,KAAK,2BAA2B,EAAE,YAAY,OAAO,OAAO,MAAM,QAAQ,CAAC;AAClF,WAAO,EAAE,SAAS,OAAO,MAAM,IAAI,YAAY,YAAY,OAAO,OAAO,MAAM,QAAQ;AAAA,EACzF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,IACA,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACtC,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,cACpB,YACA,QAC6B;AAC7B,QAAM,QAAQ,gBAAgB,EAAE,IAAI;AACpC,MAAI;AACF,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,6BAAoC;AAC9E,UAAM,SAAS,iBAAiB,UAAU;AAC1C,UAAM,aAAa,GAAG,OAAO,YAAY;AAAA;AAAA,EAAO,MAAM;AAEtD,UAAM,SAAS,MAAM,UAAU;AAC/B,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,iBAAiB,MAAM;AAAA,QAC7B;AAAA,QACA,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,QACtC,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,SAAS,mBAAmB;AAClC,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,yCAAyC,EAAE,YAAY,QAAQ,OAAO,QAAQ,CAAC;AAC3F,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,QACtC,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,gBAAgB,MAAM,iBAAiB;AAC7C,UAAM,OAA2E;AAAA,MAC/E,SAAS;AAAA,IACX;AACA,QAAI,kBAAkB,KAAM,MAAK,UAAU,EAAE,cAAc;AAE3D,WAAO,MAAM,2BAA2B,QAAQ,MAAM,YAAY,KAAK;AAAA,EACzE,SAAS,OAAO;AACd,UAAM,aAAa,gBAAgB,EAAE,IAAI,IAAI;AAC7C,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,WAAO,KAAK,uBAAuB,EAAE,YAAY,OAAO,IAAI,CAAC;AAC7D,WAAO,EAAE,SAAS,OAAO,MAAM,IAAI,YAAY,YAAY,OAAO,IAAI;AAAA,EACxE;AACF;","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import "./chunk-VCYDKMGJ.js";
|
|
16
16
|
import {
|
|
17
17
|
setupCommandAsync
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-42FGTDIW.js";
|
|
19
19
|
import "./chunk-32ZTPL7Q.js";
|
|
20
20
|
import {
|
|
21
21
|
AuthHandler,
|
|
@@ -150,7 +150,7 @@ import {
|
|
|
150
150
|
validateNexusEnv,
|
|
151
151
|
validateWorkflow,
|
|
152
152
|
wrapInMarkdownFence
|
|
153
|
-
} from "./chunk-
|
|
153
|
+
} from "./chunk-7GW7ZRJ3.js";
|
|
154
154
|
import {
|
|
155
155
|
resolveToken
|
|
156
156
|
} from "./chunk-2HAZZAU5.js";
|
|
@@ -169,7 +169,7 @@ import {
|
|
|
169
169
|
registerConsensusVoteTool,
|
|
170
170
|
shutdownToolMemory,
|
|
171
171
|
validateTimeout
|
|
172
|
-
} from "./chunk-
|
|
172
|
+
} from "./chunk-23G7NV6B.js";
|
|
173
173
|
import {
|
|
174
174
|
loadPapersRegistry,
|
|
175
175
|
loadTechniquesRegistry,
|
|
@@ -200,7 +200,7 @@ import {
|
|
|
200
200
|
doctorCommand,
|
|
201
201
|
initDataDirectories,
|
|
202
202
|
runDoctor
|
|
203
|
-
} from "./chunk-
|
|
203
|
+
} from "./chunk-WGP6G6QU.js";
|
|
204
204
|
import "./chunk-ZXIFNJ7Q.js";
|
|
205
205
|
import {
|
|
206
206
|
MemoryError
|
|
@@ -212,7 +212,7 @@ import {
|
|
|
212
212
|
} from "./chunk-633WH2ML.js";
|
|
213
213
|
import "./chunk-GUO4TIIX.js";
|
|
214
214
|
import "./chunk-2L6A7RUZ.js";
|
|
215
|
-
import "./chunk-
|
|
215
|
+
import "./chunk-ZVUNIQLB.js";
|
|
216
216
|
import {
|
|
217
217
|
createAllAdapters,
|
|
218
218
|
getAvailableClis,
|
|
@@ -1671,8 +1671,18 @@ var BaseEvaluator = class {
|
|
|
1671
1671
|
*/
|
|
1672
1672
|
async evaluate(component) {
|
|
1673
1673
|
const startTime = getTimeProvider().now();
|
|
1674
|
+
let timeoutId;
|
|
1675
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
1676
|
+
timeoutId = setTimeout(() => {
|
|
1677
|
+
reject(new Error("Evaluation timeout"));
|
|
1678
|
+
}, this.timeoutMs);
|
|
1679
|
+
});
|
|
1674
1680
|
try {
|
|
1675
|
-
const result = await Promise.race([this.performEvaluation(component),
|
|
1681
|
+
const result = await Promise.race([this.performEvaluation(component), timeoutPromise]).finally(
|
|
1682
|
+
() => {
|
|
1683
|
+
if (timeoutId !== void 0) clearTimeout(timeoutId);
|
|
1684
|
+
}
|
|
1685
|
+
);
|
|
1676
1686
|
this.log.debug("Evaluation complete", {
|
|
1677
1687
|
component: component.path,
|
|
1678
1688
|
recommendation: result.recommendation,
|
|
@@ -1710,16 +1720,6 @@ var BaseEvaluator = class {
|
|
|
1710
1720
|
cite(metric, value, source, threshold) {
|
|
1711
1721
|
return { metric, value, source, ...threshold !== void 0 ? { threshold } : {} };
|
|
1712
1722
|
}
|
|
1713
|
-
/**
|
|
1714
|
-
* Timeout promise.
|
|
1715
|
-
*/
|
|
1716
|
-
timeout() {
|
|
1717
|
-
return new Promise((_, reject) => {
|
|
1718
|
-
setTimeout(() => {
|
|
1719
|
-
reject(new Error("Evaluation timeout"));
|
|
1720
|
-
}, this.timeoutMs);
|
|
1721
|
-
});
|
|
1722
|
-
}
|
|
1723
1723
|
};
|
|
1724
1724
|
|
|
1725
1725
|
// src/self-eval/code-quality-evaluator.ts
|
|
@@ -13584,9 +13584,20 @@ var FitnessScoreCalculator = class {
|
|
|
13584
13584
|
}
|
|
13585
13585
|
const score = Object.values(dimensions).reduce((sum, val) => sum + val, 0);
|
|
13586
13586
|
this.logger.info("Fitness audit complete", { score, version });
|
|
13587
|
+
const safeDim = (k) => dimensions[k] ?? 0;
|
|
13588
|
+
const typedDimensions = {
|
|
13589
|
+
canonicalPaths: safeDim("canonicalPaths"),
|
|
13590
|
+
explicitBehavior: safeDim("explicitBehavior"),
|
|
13591
|
+
determinism: safeDim("determinism"),
|
|
13592
|
+
observability: safeDim("observability"),
|
|
13593
|
+
configSimplicity: safeDim("configSimplicity"),
|
|
13594
|
+
layerSeparation: safeDim("layerSeparation"),
|
|
13595
|
+
operatorErgonomics: safeDim("operatorErgonomics"),
|
|
13596
|
+
governanceIntegration: safeDim("governanceIntegration")
|
|
13597
|
+
};
|
|
13587
13598
|
return {
|
|
13588
13599
|
score,
|
|
13589
|
-
dimensions,
|
|
13600
|
+
dimensions: typedDimensions,
|
|
13590
13601
|
findings,
|
|
13591
13602
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
13592
13603
|
version
|