chainlesschain 0.132.0 → 0.145.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.
- package/package.json +1 -1
- package/src/commands/a2a.js +230 -0
- package/src/commands/activitypub.js +191 -0
- package/src/commands/agent.js +601 -0
- package/src/commands/audit.js +206 -0
- package/src/commands/bi.js +186 -0
- package/src/commands/bm25.js +162 -0
- package/src/commands/browse.js +225 -0
- package/src/commands/ccron.js +178 -0
- package/src/commands/chat.js +207 -0
- package/src/commands/compliance.js +420 -0
- package/src/commands/compt.js +176 -0
- package/src/commands/consol.js +237 -0
- package/src/commands/cowork.js +588 -0
- package/src/commands/crosschain.js +216 -0
- package/src/commands/dao.js +216 -0
- package/src/commands/dlp.js +206 -0
- package/src/commands/economy.js +211 -0
- package/src/commands/evolution.js +209 -0
- package/src/commands/evomap.js +216 -0
- package/src/commands/fflag.js +230 -0
- package/src/commands/git.js +185 -0
- package/src/commands/hardening.js +209 -0
- package/src/commands/hmemory.js +210 -0
- package/src/commands/incentive.js +209 -0
- package/src/commands/inference.js +178 -0
- package/src/commands/itbudget.js +161 -0
- package/src/commands/kg.js +206 -0
- package/src/commands/lowcode.js +201 -0
- package/src/commands/marketplace.js +206 -0
- package/src/commands/matrix.js +214 -0
- package/src/commands/mcpscaf.js +153 -0
- package/src/commands/meminj.js +153 -0
- package/src/commands/nostr.js +213 -0
- package/src/commands/orchestrate.js +217 -0
- package/src/commands/orchgov.js +156 -0
- package/src/commands/pdfp.js +160 -0
- package/src/commands/perf.js +176 -0
- package/src/commands/perm.js +156 -0
- package/src/commands/pipeline.js +211 -0
- package/src/commands/planmode.js +154 -0
- package/src/commands/privacy.js +203 -0
- package/src/commands/promcomp.js +166 -0
- package/src/commands/recommend.js +185 -0
- package/src/commands/reputation.js +208 -0
- package/src/commands/sandbox.js +206 -0
- package/src/commands/seshhook.js +153 -0
- package/src/commands/seshsearch.js +149 -0
- package/src/commands/seshtail.js +152 -0
- package/src/commands/seshu.js +160 -0
- package/src/commands/sganal.js +172 -0
- package/src/commands/siem.js +207 -0
- package/src/commands/sla.js +212 -0
- package/src/commands/slotfill.js +154 -0
- package/src/commands/social.js +159 -0
- package/src/commands/stress.js +206 -0
- package/src/commands/svccont.js +157 -0
- package/src/commands/terraform.js +206 -0
- package/src/commands/tms.js +183 -0
- package/src/commands/topiccls.js +158 -0
- package/src/commands/uprof.js +154 -0
- package/src/commands/vcheck.js +172 -0
- package/src/commands/webfetch.js +150 -0
- package/src/commands/zkp.js +218 -0
- package/src/harness/prompt-compressor.js +331 -0
- package/src/index.js +101 -1
- package/src/lib/a2a-protocol.js +373 -0
- package/src/lib/activitypub-bridge.js +343 -0
- package/src/lib/agent-economy.js +358 -0
- package/src/lib/app-builder.js +338 -0
- package/src/lib/audit-logger.js +321 -0
- package/src/lib/autonomous-agent.js +341 -0
- package/src/lib/bi-engine.js +339 -0
- package/src/lib/bm25-search.js +333 -0
- package/src/lib/browser-automation.js +352 -0
- package/src/lib/chat-core.js +336 -0
- package/src/lib/claude-code-bridge.js +341 -0
- package/src/lib/compliance-framework-reporter.js +359 -0
- package/src/lib/compliance-manager.js +330 -0
- package/src/lib/compression-telemetry.js +333 -0
- package/src/lib/content-recommender.js +370 -0
- package/src/lib/cowork-cron.js +330 -0
- package/src/lib/cowork-learning.js +333 -0
- package/src/lib/cowork-task-runner.js +362 -0
- package/src/lib/cowork-workflow.js +327 -0
- package/src/lib/cross-chain.js +365 -0
- package/src/lib/dao-governance.js +339 -0
- package/src/lib/dlp-engine.js +343 -0
- package/src/lib/evolution-system.js +336 -0
- package/src/lib/evomap-manager.js +339 -0
- package/src/lib/execution-backend.js +351 -0
- package/src/lib/feature-flags.js +330 -0
- package/src/lib/git-integration.js +343 -0
- package/src/lib/hardening-manager.js +341 -0
- package/src/lib/hierarchical-memory.js +341 -0
- package/src/lib/inference-network.js +362 -0
- package/src/lib/iteration-budget.js +357 -0
- package/src/lib/knowledge-graph.js +333 -0
- package/src/lib/matrix-bridge.js +339 -0
- package/src/lib/mcp-scaffold.js +345 -0
- package/src/lib/memory-injection.js +320 -0
- package/src/lib/nostr-bridge.js +342 -0
- package/src/lib/orchestrator.js +350 -0
- package/src/lib/pdf-parser.js +330 -0
- package/src/lib/perf-tuning.js +364 -0
- package/src/lib/permission-engine.js +319 -0
- package/src/lib/pipeline-orchestrator.js +345 -0
- package/src/lib/plan-mode.js +328 -0
- package/src/lib/privacy-computing.js +335 -0
- package/src/lib/prompt-compressor.js +1 -10
- package/src/lib/reputation-optimizer.js +340 -0
- package/src/lib/sandbox-v2.js +327 -0
- package/src/lib/service-container.js +342 -0
- package/src/lib/session-consolidator.js +352 -0
- package/src/lib/session-hooks.js +340 -0
- package/src/lib/session-search.js +334 -0
- package/src/lib/session-tail.js +320 -0
- package/src/lib/session-usage.js +329 -0
- package/src/lib/siem-exporter.js +352 -0
- package/src/lib/skill-marketplace.js +345 -0
- package/src/lib/sla-manager.js +341 -0
- package/src/lib/slot-filler.js +333 -0
- package/src/lib/social-graph-analytics.js +327 -0
- package/src/lib/social-graph.js +304 -0
- package/src/lib/stress-tester.js +342 -0
- package/src/lib/sub-agent-registry.js +359 -0
- package/src/lib/task-model-selector.js +333 -0
- package/src/lib/terraform-manager.js +333 -0
- package/src/lib/todo-manager.js +339 -0
- package/src/lib/token-incentive.js +341 -0
- package/src/lib/topic-classifier.js +353 -0
- package/src/lib/user-profile.js +325 -0
- package/src/lib/version-checker.js +335 -0
- package/src/lib/web-fetch.js +322 -0
- package/src/lib/zkp-engine.js +342 -0
package/src/lib/web-fetch.js
CHANGED
|
@@ -222,3 +222,325 @@ export async function webFetch(url, options = {}) {
|
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
export const _deps = { http, https };
|
|
225
|
+
|
|
226
|
+
// ===== V2 Surface: Web Fetch governance overlay (CLI v0.142.0) =====
|
|
227
|
+
export const WFET_TARGET_MATURITY_V2 = Object.freeze({
|
|
228
|
+
PENDING: "pending",
|
|
229
|
+
ACTIVE: "active",
|
|
230
|
+
DEGRADED: "degraded",
|
|
231
|
+
RETIRED: "retired",
|
|
232
|
+
});
|
|
233
|
+
export const WFET_JOB_LIFECYCLE_V2 = Object.freeze({
|
|
234
|
+
QUEUED: "queued",
|
|
235
|
+
FETCHING: "fetching",
|
|
236
|
+
SUCCEEDED: "succeeded",
|
|
237
|
+
FAILED: "failed",
|
|
238
|
+
CANCELLED: "cancelled",
|
|
239
|
+
});
|
|
240
|
+
const _wfetTTrans = new Map([
|
|
241
|
+
[
|
|
242
|
+
WFET_TARGET_MATURITY_V2.PENDING,
|
|
243
|
+
new Set([WFET_TARGET_MATURITY_V2.ACTIVE, WFET_TARGET_MATURITY_V2.RETIRED]),
|
|
244
|
+
],
|
|
245
|
+
[
|
|
246
|
+
WFET_TARGET_MATURITY_V2.ACTIVE,
|
|
247
|
+
new Set([
|
|
248
|
+
WFET_TARGET_MATURITY_V2.DEGRADED,
|
|
249
|
+
WFET_TARGET_MATURITY_V2.RETIRED,
|
|
250
|
+
]),
|
|
251
|
+
],
|
|
252
|
+
[
|
|
253
|
+
WFET_TARGET_MATURITY_V2.DEGRADED,
|
|
254
|
+
new Set([WFET_TARGET_MATURITY_V2.ACTIVE, WFET_TARGET_MATURITY_V2.RETIRED]),
|
|
255
|
+
],
|
|
256
|
+
[WFET_TARGET_MATURITY_V2.RETIRED, new Set()],
|
|
257
|
+
]);
|
|
258
|
+
const _wfetTTerminal = new Set([WFET_TARGET_MATURITY_V2.RETIRED]);
|
|
259
|
+
const _wfetJTrans = new Map([
|
|
260
|
+
[
|
|
261
|
+
WFET_JOB_LIFECYCLE_V2.QUEUED,
|
|
262
|
+
new Set([WFET_JOB_LIFECYCLE_V2.FETCHING, WFET_JOB_LIFECYCLE_V2.CANCELLED]),
|
|
263
|
+
],
|
|
264
|
+
[
|
|
265
|
+
WFET_JOB_LIFECYCLE_V2.FETCHING,
|
|
266
|
+
new Set([
|
|
267
|
+
WFET_JOB_LIFECYCLE_V2.SUCCEEDED,
|
|
268
|
+
WFET_JOB_LIFECYCLE_V2.FAILED,
|
|
269
|
+
WFET_JOB_LIFECYCLE_V2.CANCELLED,
|
|
270
|
+
]),
|
|
271
|
+
],
|
|
272
|
+
[WFET_JOB_LIFECYCLE_V2.SUCCEEDED, new Set()],
|
|
273
|
+
[WFET_JOB_LIFECYCLE_V2.FAILED, new Set()],
|
|
274
|
+
[WFET_JOB_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
275
|
+
]);
|
|
276
|
+
const _wfetTsV2 = new Map();
|
|
277
|
+
const _wfetJsV2 = new Map();
|
|
278
|
+
let _wfetMaxActive = 12,
|
|
279
|
+
_wfetMaxPending = 30,
|
|
280
|
+
_wfetIdleMs = 7 * 24 * 60 * 60 * 1000,
|
|
281
|
+
_wfetStuckMs = 60 * 1000;
|
|
282
|
+
function _wfetPos(n, label) {
|
|
283
|
+
const v = Math.floor(Number(n));
|
|
284
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
285
|
+
throw new Error(`${label} must be positive integer`);
|
|
286
|
+
return v;
|
|
287
|
+
}
|
|
288
|
+
function _wfetCheckT(from, to) {
|
|
289
|
+
const a = _wfetTTrans.get(from);
|
|
290
|
+
if (!a || !a.has(to))
|
|
291
|
+
throw new Error(`invalid wfet target transition ${from} → ${to}`);
|
|
292
|
+
}
|
|
293
|
+
function _wfetCheckJ(from, to) {
|
|
294
|
+
const a = _wfetJTrans.get(from);
|
|
295
|
+
if (!a || !a.has(to))
|
|
296
|
+
throw new Error(`invalid wfet job transition ${from} → ${to}`);
|
|
297
|
+
}
|
|
298
|
+
export function setMaxActiveWfetTargetsPerOwnerV2(n) {
|
|
299
|
+
_wfetMaxActive = _wfetPos(n, "maxActiveWfetTargetsPerOwner");
|
|
300
|
+
}
|
|
301
|
+
export function getMaxActiveWfetTargetsPerOwnerV2() {
|
|
302
|
+
return _wfetMaxActive;
|
|
303
|
+
}
|
|
304
|
+
export function setMaxPendingWfetJobsPerTargetV2(n) {
|
|
305
|
+
_wfetMaxPending = _wfetPos(n, "maxPendingWfetJobsPerTarget");
|
|
306
|
+
}
|
|
307
|
+
export function getMaxPendingWfetJobsPerTargetV2() {
|
|
308
|
+
return _wfetMaxPending;
|
|
309
|
+
}
|
|
310
|
+
export function setWfetTargetIdleMsV2(n) {
|
|
311
|
+
_wfetIdleMs = _wfetPos(n, "wfetTargetIdleMs");
|
|
312
|
+
}
|
|
313
|
+
export function getWfetTargetIdleMsV2() {
|
|
314
|
+
return _wfetIdleMs;
|
|
315
|
+
}
|
|
316
|
+
export function setWfetJobStuckMsV2(n) {
|
|
317
|
+
_wfetStuckMs = _wfetPos(n, "wfetJobStuckMs");
|
|
318
|
+
}
|
|
319
|
+
export function getWfetJobStuckMsV2() {
|
|
320
|
+
return _wfetStuckMs;
|
|
321
|
+
}
|
|
322
|
+
export function _resetStateWebFetchV2() {
|
|
323
|
+
_wfetTsV2.clear();
|
|
324
|
+
_wfetJsV2.clear();
|
|
325
|
+
_wfetMaxActive = 12;
|
|
326
|
+
_wfetMaxPending = 30;
|
|
327
|
+
_wfetIdleMs = 7 * 24 * 60 * 60 * 1000;
|
|
328
|
+
_wfetStuckMs = 60 * 1000;
|
|
329
|
+
}
|
|
330
|
+
export function registerWfetTargetV2({ id, owner, baseUrl, metadata } = {}) {
|
|
331
|
+
if (!id) throw new Error("wfet target id required");
|
|
332
|
+
if (!owner) throw new Error("wfet target owner required");
|
|
333
|
+
if (_wfetTsV2.has(id))
|
|
334
|
+
throw new Error(`wfet target ${id} already registered`);
|
|
335
|
+
const now = Date.now();
|
|
336
|
+
const t = {
|
|
337
|
+
id,
|
|
338
|
+
owner,
|
|
339
|
+
baseUrl: baseUrl || "",
|
|
340
|
+
status: WFET_TARGET_MATURITY_V2.PENDING,
|
|
341
|
+
createdAt: now,
|
|
342
|
+
updatedAt: now,
|
|
343
|
+
activatedAt: null,
|
|
344
|
+
retiredAt: null,
|
|
345
|
+
lastTouchedAt: now,
|
|
346
|
+
metadata: { ...(metadata || {}) },
|
|
347
|
+
};
|
|
348
|
+
_wfetTsV2.set(id, t);
|
|
349
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
350
|
+
}
|
|
351
|
+
function _wfetCountActive(owner) {
|
|
352
|
+
let n = 0;
|
|
353
|
+
for (const t of _wfetTsV2.values())
|
|
354
|
+
if (t.owner === owner && t.status === WFET_TARGET_MATURITY_V2.ACTIVE) n++;
|
|
355
|
+
return n;
|
|
356
|
+
}
|
|
357
|
+
export function activateWfetTargetV2(id) {
|
|
358
|
+
const t = _wfetTsV2.get(id);
|
|
359
|
+
if (!t) throw new Error(`wfet target ${id} not found`);
|
|
360
|
+
_wfetCheckT(t.status, WFET_TARGET_MATURITY_V2.ACTIVE);
|
|
361
|
+
const recovery = t.status === WFET_TARGET_MATURITY_V2.DEGRADED;
|
|
362
|
+
if (!recovery && _wfetCountActive(t.owner) >= _wfetMaxActive)
|
|
363
|
+
throw new Error(`max active wfet targets for owner ${t.owner} reached`);
|
|
364
|
+
const now = Date.now();
|
|
365
|
+
t.status = WFET_TARGET_MATURITY_V2.ACTIVE;
|
|
366
|
+
t.updatedAt = now;
|
|
367
|
+
t.lastTouchedAt = now;
|
|
368
|
+
if (!t.activatedAt) t.activatedAt = now;
|
|
369
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
370
|
+
}
|
|
371
|
+
export function degradeWfetTargetV2(id) {
|
|
372
|
+
const t = _wfetTsV2.get(id);
|
|
373
|
+
if (!t) throw new Error(`wfet target ${id} not found`);
|
|
374
|
+
_wfetCheckT(t.status, WFET_TARGET_MATURITY_V2.DEGRADED);
|
|
375
|
+
t.status = WFET_TARGET_MATURITY_V2.DEGRADED;
|
|
376
|
+
t.updatedAt = Date.now();
|
|
377
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
378
|
+
}
|
|
379
|
+
export function retireWfetTargetV2(id) {
|
|
380
|
+
const t = _wfetTsV2.get(id);
|
|
381
|
+
if (!t) throw new Error(`wfet target ${id} not found`);
|
|
382
|
+
_wfetCheckT(t.status, WFET_TARGET_MATURITY_V2.RETIRED);
|
|
383
|
+
const now = Date.now();
|
|
384
|
+
t.status = WFET_TARGET_MATURITY_V2.RETIRED;
|
|
385
|
+
t.updatedAt = now;
|
|
386
|
+
if (!t.retiredAt) t.retiredAt = now;
|
|
387
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
388
|
+
}
|
|
389
|
+
export function touchWfetTargetV2(id) {
|
|
390
|
+
const t = _wfetTsV2.get(id);
|
|
391
|
+
if (!t) throw new Error(`wfet target ${id} not found`);
|
|
392
|
+
if (_wfetTTerminal.has(t.status))
|
|
393
|
+
throw new Error(`cannot touch terminal wfet target ${id}`);
|
|
394
|
+
const now = Date.now();
|
|
395
|
+
t.lastTouchedAt = now;
|
|
396
|
+
t.updatedAt = now;
|
|
397
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
398
|
+
}
|
|
399
|
+
export function getWfetTargetV2(id) {
|
|
400
|
+
const t = _wfetTsV2.get(id);
|
|
401
|
+
if (!t) return null;
|
|
402
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
403
|
+
}
|
|
404
|
+
export function listWfetTargetsV2() {
|
|
405
|
+
return [..._wfetTsV2.values()].map((t) => ({
|
|
406
|
+
...t,
|
|
407
|
+
metadata: { ...t.metadata },
|
|
408
|
+
}));
|
|
409
|
+
}
|
|
410
|
+
function _wfetCountPending(targetId) {
|
|
411
|
+
let n = 0;
|
|
412
|
+
for (const j of _wfetJsV2.values())
|
|
413
|
+
if (
|
|
414
|
+
j.targetId === targetId &&
|
|
415
|
+
(j.status === WFET_JOB_LIFECYCLE_V2.QUEUED ||
|
|
416
|
+
j.status === WFET_JOB_LIFECYCLE_V2.FETCHING)
|
|
417
|
+
)
|
|
418
|
+
n++;
|
|
419
|
+
return n;
|
|
420
|
+
}
|
|
421
|
+
export function createWfetJobV2({ id, targetId, kind, metadata } = {}) {
|
|
422
|
+
if (!id) throw new Error("wfet job id required");
|
|
423
|
+
if (!targetId) throw new Error("wfet job targetId required");
|
|
424
|
+
if (_wfetJsV2.has(id)) throw new Error(`wfet job ${id} already exists`);
|
|
425
|
+
if (!_wfetTsV2.has(targetId))
|
|
426
|
+
throw new Error(`wfet target ${targetId} not found`);
|
|
427
|
+
if (_wfetCountPending(targetId) >= _wfetMaxPending)
|
|
428
|
+
throw new Error(`max pending wfet jobs for target ${targetId} reached`);
|
|
429
|
+
const now = Date.now();
|
|
430
|
+
const j = {
|
|
431
|
+
id,
|
|
432
|
+
targetId,
|
|
433
|
+
kind: kind || "GET",
|
|
434
|
+
status: WFET_JOB_LIFECYCLE_V2.QUEUED,
|
|
435
|
+
createdAt: now,
|
|
436
|
+
updatedAt: now,
|
|
437
|
+
startedAt: null,
|
|
438
|
+
settledAt: null,
|
|
439
|
+
metadata: { ...(metadata || {}) },
|
|
440
|
+
};
|
|
441
|
+
_wfetJsV2.set(id, j);
|
|
442
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
443
|
+
}
|
|
444
|
+
export function fetchingWfetJobV2(id) {
|
|
445
|
+
const j = _wfetJsV2.get(id);
|
|
446
|
+
if (!j) throw new Error(`wfet job ${id} not found`);
|
|
447
|
+
_wfetCheckJ(j.status, WFET_JOB_LIFECYCLE_V2.FETCHING);
|
|
448
|
+
const now = Date.now();
|
|
449
|
+
j.status = WFET_JOB_LIFECYCLE_V2.FETCHING;
|
|
450
|
+
j.updatedAt = now;
|
|
451
|
+
if (!j.startedAt) j.startedAt = now;
|
|
452
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
453
|
+
}
|
|
454
|
+
export function succeedWfetJobV2(id) {
|
|
455
|
+
const j = _wfetJsV2.get(id);
|
|
456
|
+
if (!j) throw new Error(`wfet job ${id} not found`);
|
|
457
|
+
_wfetCheckJ(j.status, WFET_JOB_LIFECYCLE_V2.SUCCEEDED);
|
|
458
|
+
const now = Date.now();
|
|
459
|
+
j.status = WFET_JOB_LIFECYCLE_V2.SUCCEEDED;
|
|
460
|
+
j.updatedAt = now;
|
|
461
|
+
if (!j.settledAt) j.settledAt = now;
|
|
462
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
463
|
+
}
|
|
464
|
+
export function failWfetJobV2(id, reason) {
|
|
465
|
+
const j = _wfetJsV2.get(id);
|
|
466
|
+
if (!j) throw new Error(`wfet job ${id} not found`);
|
|
467
|
+
_wfetCheckJ(j.status, WFET_JOB_LIFECYCLE_V2.FAILED);
|
|
468
|
+
const now = Date.now();
|
|
469
|
+
j.status = WFET_JOB_LIFECYCLE_V2.FAILED;
|
|
470
|
+
j.updatedAt = now;
|
|
471
|
+
if (!j.settledAt) j.settledAt = now;
|
|
472
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
473
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
474
|
+
}
|
|
475
|
+
export function cancelWfetJobV2(id, reason) {
|
|
476
|
+
const j = _wfetJsV2.get(id);
|
|
477
|
+
if (!j) throw new Error(`wfet job ${id} not found`);
|
|
478
|
+
_wfetCheckJ(j.status, WFET_JOB_LIFECYCLE_V2.CANCELLED);
|
|
479
|
+
const now = Date.now();
|
|
480
|
+
j.status = WFET_JOB_LIFECYCLE_V2.CANCELLED;
|
|
481
|
+
j.updatedAt = now;
|
|
482
|
+
if (!j.settledAt) j.settledAt = now;
|
|
483
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
484
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
485
|
+
}
|
|
486
|
+
export function getWfetJobV2(id) {
|
|
487
|
+
const j = _wfetJsV2.get(id);
|
|
488
|
+
if (!j) return null;
|
|
489
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
490
|
+
}
|
|
491
|
+
export function listWfetJobsV2() {
|
|
492
|
+
return [..._wfetJsV2.values()].map((j) => ({
|
|
493
|
+
...j,
|
|
494
|
+
metadata: { ...j.metadata },
|
|
495
|
+
}));
|
|
496
|
+
}
|
|
497
|
+
export function autoDegradeIdleWfetTargetsV2({ now } = {}) {
|
|
498
|
+
const t = now ?? Date.now();
|
|
499
|
+
const flipped = [];
|
|
500
|
+
for (const x of _wfetTsV2.values())
|
|
501
|
+
if (
|
|
502
|
+
x.status === WFET_TARGET_MATURITY_V2.ACTIVE &&
|
|
503
|
+
t - x.lastTouchedAt >= _wfetIdleMs
|
|
504
|
+
) {
|
|
505
|
+
x.status = WFET_TARGET_MATURITY_V2.DEGRADED;
|
|
506
|
+
x.updatedAt = t;
|
|
507
|
+
flipped.push(x.id);
|
|
508
|
+
}
|
|
509
|
+
return { flipped, count: flipped.length };
|
|
510
|
+
}
|
|
511
|
+
export function autoFailStuckWfetJobsV2({ now } = {}) {
|
|
512
|
+
const t = now ?? Date.now();
|
|
513
|
+
const flipped = [];
|
|
514
|
+
for (const j of _wfetJsV2.values())
|
|
515
|
+
if (
|
|
516
|
+
j.status === WFET_JOB_LIFECYCLE_V2.FETCHING &&
|
|
517
|
+
j.startedAt != null &&
|
|
518
|
+
t - j.startedAt >= _wfetStuckMs
|
|
519
|
+
) {
|
|
520
|
+
j.status = WFET_JOB_LIFECYCLE_V2.FAILED;
|
|
521
|
+
j.updatedAt = t;
|
|
522
|
+
if (!j.settledAt) j.settledAt = t;
|
|
523
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
524
|
+
flipped.push(j.id);
|
|
525
|
+
}
|
|
526
|
+
return { flipped, count: flipped.length };
|
|
527
|
+
}
|
|
528
|
+
export function getWebFetchGovStatsV2() {
|
|
529
|
+
const targetsByStatus = {};
|
|
530
|
+
for (const v of Object.values(WFET_TARGET_MATURITY_V2))
|
|
531
|
+
targetsByStatus[v] = 0;
|
|
532
|
+
for (const t of _wfetTsV2.values()) targetsByStatus[t.status]++;
|
|
533
|
+
const jobsByStatus = {};
|
|
534
|
+
for (const v of Object.values(WFET_JOB_LIFECYCLE_V2)) jobsByStatus[v] = 0;
|
|
535
|
+
for (const j of _wfetJsV2.values()) jobsByStatus[j.status]++;
|
|
536
|
+
return {
|
|
537
|
+
totalWfetTargetsV2: _wfetTsV2.size,
|
|
538
|
+
totalWfetJobsV2: _wfetJsV2.size,
|
|
539
|
+
maxActiveWfetTargetsPerOwner: _wfetMaxActive,
|
|
540
|
+
maxPendingWfetJobsPerTarget: _wfetMaxPending,
|
|
541
|
+
wfetTargetIdleMs: _wfetIdleMs,
|
|
542
|
+
wfetJobStuckMs: _wfetStuckMs,
|
|
543
|
+
targetsByStatus,
|
|
544
|
+
jobsByStatus,
|
|
545
|
+
};
|
|
546
|
+
}
|
package/src/lib/zkp-engine.js
CHANGED
|
@@ -742,3 +742,345 @@ export function getZKPStatsV2() {
|
|
|
742
742
|
credentialsByDid,
|
|
743
743
|
};
|
|
744
744
|
}
|
|
745
|
+
|
|
746
|
+
// ===== V2 Surface: ZKP Engine governance overlay (CLI v0.136.0) =====
|
|
747
|
+
export const ZKP_CIRCUIT_MATURITY_V2 = Object.freeze({
|
|
748
|
+
PENDING: "pending",
|
|
749
|
+
ACTIVE: "active",
|
|
750
|
+
DEPRECATED: "deprecated",
|
|
751
|
+
ARCHIVED: "archived",
|
|
752
|
+
});
|
|
753
|
+
export const ZKP_PROOF_LIFECYCLE_V2 = Object.freeze({
|
|
754
|
+
QUEUED: "queued",
|
|
755
|
+
PROVING: "proving",
|
|
756
|
+
VERIFIED: "verified",
|
|
757
|
+
FAILED: "failed",
|
|
758
|
+
CANCELLED: "cancelled",
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
const _zkpCircTrans = new Map([
|
|
762
|
+
[
|
|
763
|
+
ZKP_CIRCUIT_MATURITY_V2.PENDING,
|
|
764
|
+
new Set([ZKP_CIRCUIT_MATURITY_V2.ACTIVE, ZKP_CIRCUIT_MATURITY_V2.ARCHIVED]),
|
|
765
|
+
],
|
|
766
|
+
[
|
|
767
|
+
ZKP_CIRCUIT_MATURITY_V2.ACTIVE,
|
|
768
|
+
new Set([
|
|
769
|
+
ZKP_CIRCUIT_MATURITY_V2.DEPRECATED,
|
|
770
|
+
ZKP_CIRCUIT_MATURITY_V2.ARCHIVED,
|
|
771
|
+
]),
|
|
772
|
+
],
|
|
773
|
+
[
|
|
774
|
+
ZKP_CIRCUIT_MATURITY_V2.DEPRECATED,
|
|
775
|
+
new Set([ZKP_CIRCUIT_MATURITY_V2.ACTIVE, ZKP_CIRCUIT_MATURITY_V2.ARCHIVED]),
|
|
776
|
+
],
|
|
777
|
+
[ZKP_CIRCUIT_MATURITY_V2.ARCHIVED, new Set()],
|
|
778
|
+
]);
|
|
779
|
+
const _zkpCircTerminal = new Set([ZKP_CIRCUIT_MATURITY_V2.ARCHIVED]);
|
|
780
|
+
const _zkpProofTrans = new Map([
|
|
781
|
+
[
|
|
782
|
+
ZKP_PROOF_LIFECYCLE_V2.QUEUED,
|
|
783
|
+
new Set([ZKP_PROOF_LIFECYCLE_V2.PROVING, ZKP_PROOF_LIFECYCLE_V2.CANCELLED]),
|
|
784
|
+
],
|
|
785
|
+
[
|
|
786
|
+
ZKP_PROOF_LIFECYCLE_V2.PROVING,
|
|
787
|
+
new Set([
|
|
788
|
+
ZKP_PROOF_LIFECYCLE_V2.VERIFIED,
|
|
789
|
+
ZKP_PROOF_LIFECYCLE_V2.FAILED,
|
|
790
|
+
ZKP_PROOF_LIFECYCLE_V2.CANCELLED,
|
|
791
|
+
]),
|
|
792
|
+
],
|
|
793
|
+
[ZKP_PROOF_LIFECYCLE_V2.VERIFIED, new Set()],
|
|
794
|
+
[ZKP_PROOF_LIFECYCLE_V2.FAILED, new Set()],
|
|
795
|
+
[ZKP_PROOF_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
796
|
+
]);
|
|
797
|
+
|
|
798
|
+
const _zkpCircs = new Map();
|
|
799
|
+
const _zkpProofs = new Map();
|
|
800
|
+
let _zkpMaxActivePerOwner = 10;
|
|
801
|
+
let _zkpMaxPendingPerCircuit = 15;
|
|
802
|
+
let _zkpCircuitIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
803
|
+
let _zkpProofStuckMs = 10 * 60 * 1000;
|
|
804
|
+
|
|
805
|
+
function _zkpPos(n, lbl) {
|
|
806
|
+
const v = Math.floor(Number(n));
|
|
807
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
808
|
+
throw new Error(`${lbl} must be positive integer`);
|
|
809
|
+
return v;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
export function setMaxActiveZkpCircuitsPerOwnerV2(n) {
|
|
813
|
+
_zkpMaxActivePerOwner = _zkpPos(n, "maxActiveZkpCircuitsPerOwner");
|
|
814
|
+
}
|
|
815
|
+
export function getMaxActiveZkpCircuitsPerOwnerV2() {
|
|
816
|
+
return _zkpMaxActivePerOwner;
|
|
817
|
+
}
|
|
818
|
+
export function setMaxPendingZkpProofsPerCircuitV2(n) {
|
|
819
|
+
_zkpMaxPendingPerCircuit = _zkpPos(n, "maxPendingZkpProofsPerCircuit");
|
|
820
|
+
}
|
|
821
|
+
export function getMaxPendingZkpProofsPerCircuitV2() {
|
|
822
|
+
return _zkpMaxPendingPerCircuit;
|
|
823
|
+
}
|
|
824
|
+
export function setZkpCircuitIdleMsV2(n) {
|
|
825
|
+
_zkpCircuitIdleMs = _zkpPos(n, "zkpCircuitIdleMs");
|
|
826
|
+
}
|
|
827
|
+
export function getZkpCircuitIdleMsV2() {
|
|
828
|
+
return _zkpCircuitIdleMs;
|
|
829
|
+
}
|
|
830
|
+
export function setZkpProofStuckMsV2(n) {
|
|
831
|
+
_zkpProofStuckMs = _zkpPos(n, "zkpProofStuckMs");
|
|
832
|
+
}
|
|
833
|
+
export function getZkpProofStuckMsV2() {
|
|
834
|
+
return _zkpProofStuckMs;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
export function _resetStateZkpEngineV2() {
|
|
838
|
+
_zkpCircs.clear();
|
|
839
|
+
_zkpProofs.clear();
|
|
840
|
+
_zkpMaxActivePerOwner = 10;
|
|
841
|
+
_zkpMaxPendingPerCircuit = 15;
|
|
842
|
+
_zkpCircuitIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
843
|
+
_zkpProofStuckMs = 10 * 60 * 1000;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
export function registerZkpCircuitV2({ id, owner, scheme, metadata } = {}) {
|
|
847
|
+
if (!id || typeof id !== "string") throw new Error("id is required");
|
|
848
|
+
if (!owner || typeof owner !== "string") throw new Error("owner is required");
|
|
849
|
+
if (_zkpCircs.has(id))
|
|
850
|
+
throw new Error(`zkp circuit ${id} already registered`);
|
|
851
|
+
const now = Date.now();
|
|
852
|
+
const c = {
|
|
853
|
+
id,
|
|
854
|
+
owner,
|
|
855
|
+
scheme: scheme || "groth16",
|
|
856
|
+
status: ZKP_CIRCUIT_MATURITY_V2.PENDING,
|
|
857
|
+
createdAt: now,
|
|
858
|
+
updatedAt: now,
|
|
859
|
+
activatedAt: null,
|
|
860
|
+
archivedAt: null,
|
|
861
|
+
lastTouchedAt: now,
|
|
862
|
+
metadata: { ...(metadata || {}) },
|
|
863
|
+
};
|
|
864
|
+
_zkpCircs.set(id, c);
|
|
865
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
866
|
+
}
|
|
867
|
+
function _zkpCheckC(from, to) {
|
|
868
|
+
const a = _zkpCircTrans.get(from);
|
|
869
|
+
if (!a || !a.has(to))
|
|
870
|
+
throw new Error(`invalid zkp circuit transition ${from} → ${to}`);
|
|
871
|
+
}
|
|
872
|
+
function _zkpCountActive(owner) {
|
|
873
|
+
let n = 0;
|
|
874
|
+
for (const c of _zkpCircs.values())
|
|
875
|
+
if (c.owner === owner && c.status === ZKP_CIRCUIT_MATURITY_V2.ACTIVE) n++;
|
|
876
|
+
return n;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
export function activateZkpCircuitV2(id) {
|
|
880
|
+
const c = _zkpCircs.get(id);
|
|
881
|
+
if (!c) throw new Error(`zkp circuit ${id} not found`);
|
|
882
|
+
_zkpCheckC(c.status, ZKP_CIRCUIT_MATURITY_V2.ACTIVE);
|
|
883
|
+
const recovery = c.status === ZKP_CIRCUIT_MATURITY_V2.DEPRECATED;
|
|
884
|
+
if (!recovery) {
|
|
885
|
+
const a = _zkpCountActive(c.owner);
|
|
886
|
+
if (a >= _zkpMaxActivePerOwner)
|
|
887
|
+
throw new Error(
|
|
888
|
+
`max active zkp circuits per owner (${_zkpMaxActivePerOwner}) reached for ${c.owner}`,
|
|
889
|
+
);
|
|
890
|
+
}
|
|
891
|
+
const now = Date.now();
|
|
892
|
+
c.status = ZKP_CIRCUIT_MATURITY_V2.ACTIVE;
|
|
893
|
+
c.updatedAt = now;
|
|
894
|
+
c.lastTouchedAt = now;
|
|
895
|
+
if (!c.activatedAt) c.activatedAt = now;
|
|
896
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
897
|
+
}
|
|
898
|
+
export function deprecateZkpCircuitV2(id) {
|
|
899
|
+
const c = _zkpCircs.get(id);
|
|
900
|
+
if (!c) throw new Error(`zkp circuit ${id} not found`);
|
|
901
|
+
_zkpCheckC(c.status, ZKP_CIRCUIT_MATURITY_V2.DEPRECATED);
|
|
902
|
+
c.status = ZKP_CIRCUIT_MATURITY_V2.DEPRECATED;
|
|
903
|
+
c.updatedAt = Date.now();
|
|
904
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
905
|
+
}
|
|
906
|
+
export function archiveZkpCircuitV2(id) {
|
|
907
|
+
const c = _zkpCircs.get(id);
|
|
908
|
+
if (!c) throw new Error(`zkp circuit ${id} not found`);
|
|
909
|
+
_zkpCheckC(c.status, ZKP_CIRCUIT_MATURITY_V2.ARCHIVED);
|
|
910
|
+
const now = Date.now();
|
|
911
|
+
c.status = ZKP_CIRCUIT_MATURITY_V2.ARCHIVED;
|
|
912
|
+
c.updatedAt = now;
|
|
913
|
+
if (!c.archivedAt) c.archivedAt = now;
|
|
914
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
915
|
+
}
|
|
916
|
+
export function touchZkpCircuitV2(id) {
|
|
917
|
+
const c = _zkpCircs.get(id);
|
|
918
|
+
if (!c) throw new Error(`zkp circuit ${id} not found`);
|
|
919
|
+
if (_zkpCircTerminal.has(c.status))
|
|
920
|
+
throw new Error(`cannot touch terminal zkp circuit ${id}`);
|
|
921
|
+
const now = Date.now();
|
|
922
|
+
c.lastTouchedAt = now;
|
|
923
|
+
c.updatedAt = now;
|
|
924
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
925
|
+
}
|
|
926
|
+
export function getZkpCircuitV2(id) {
|
|
927
|
+
const c = _zkpCircs.get(id);
|
|
928
|
+
if (!c) return null;
|
|
929
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
930
|
+
}
|
|
931
|
+
export function listZkpCircuitsV2() {
|
|
932
|
+
return [..._zkpCircs.values()].map((c) => ({
|
|
933
|
+
...c,
|
|
934
|
+
metadata: { ...c.metadata },
|
|
935
|
+
}));
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
function _zkpCountPending(cid) {
|
|
939
|
+
let n = 0;
|
|
940
|
+
for (const p of _zkpProofs.values())
|
|
941
|
+
if (
|
|
942
|
+
p.circuitId === cid &&
|
|
943
|
+
(p.status === ZKP_PROOF_LIFECYCLE_V2.QUEUED ||
|
|
944
|
+
p.status === ZKP_PROOF_LIFECYCLE_V2.PROVING)
|
|
945
|
+
)
|
|
946
|
+
n++;
|
|
947
|
+
return n;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
export function createZkpProofV2({ id, circuitId, inputs, metadata } = {}) {
|
|
951
|
+
if (!id || typeof id !== "string") throw new Error("id is required");
|
|
952
|
+
if (!circuitId || typeof circuitId !== "string")
|
|
953
|
+
throw new Error("circuitId is required");
|
|
954
|
+
if (_zkpProofs.has(id)) throw new Error(`zkp proof ${id} already exists`);
|
|
955
|
+
if (!_zkpCircs.has(circuitId))
|
|
956
|
+
throw new Error(`zkp circuit ${circuitId} not found`);
|
|
957
|
+
const pending = _zkpCountPending(circuitId);
|
|
958
|
+
if (pending >= _zkpMaxPendingPerCircuit)
|
|
959
|
+
throw new Error(
|
|
960
|
+
`max pending zkp proofs per circuit (${_zkpMaxPendingPerCircuit}) reached for ${circuitId}`,
|
|
961
|
+
);
|
|
962
|
+
const now = Date.now();
|
|
963
|
+
const p = {
|
|
964
|
+
id,
|
|
965
|
+
circuitId,
|
|
966
|
+
inputs: inputs || "",
|
|
967
|
+
status: ZKP_PROOF_LIFECYCLE_V2.QUEUED,
|
|
968
|
+
createdAt: now,
|
|
969
|
+
updatedAt: now,
|
|
970
|
+
startedAt: null,
|
|
971
|
+
settledAt: null,
|
|
972
|
+
metadata: { ...(metadata || {}) },
|
|
973
|
+
};
|
|
974
|
+
_zkpProofs.set(id, p);
|
|
975
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
976
|
+
}
|
|
977
|
+
function _zkpCheckP(from, to) {
|
|
978
|
+
const a = _zkpProofTrans.get(from);
|
|
979
|
+
if (!a || !a.has(to))
|
|
980
|
+
throw new Error(`invalid zkp proof transition ${from} → ${to}`);
|
|
981
|
+
}
|
|
982
|
+
export function startZkpProofV2(id) {
|
|
983
|
+
const p = _zkpProofs.get(id);
|
|
984
|
+
if (!p) throw new Error(`zkp proof ${id} not found`);
|
|
985
|
+
_zkpCheckP(p.status, ZKP_PROOF_LIFECYCLE_V2.PROVING);
|
|
986
|
+
const now = Date.now();
|
|
987
|
+
p.status = ZKP_PROOF_LIFECYCLE_V2.PROVING;
|
|
988
|
+
p.updatedAt = now;
|
|
989
|
+
if (!p.startedAt) p.startedAt = now;
|
|
990
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
991
|
+
}
|
|
992
|
+
export function verifyZkpProofV2(id) {
|
|
993
|
+
const p = _zkpProofs.get(id);
|
|
994
|
+
if (!p) throw new Error(`zkp proof ${id} not found`);
|
|
995
|
+
_zkpCheckP(p.status, ZKP_PROOF_LIFECYCLE_V2.VERIFIED);
|
|
996
|
+
const now = Date.now();
|
|
997
|
+
p.status = ZKP_PROOF_LIFECYCLE_V2.VERIFIED;
|
|
998
|
+
p.updatedAt = now;
|
|
999
|
+
if (!p.settledAt) p.settledAt = now;
|
|
1000
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1001
|
+
}
|
|
1002
|
+
export function failZkpProofV2(id, reason) {
|
|
1003
|
+
const p = _zkpProofs.get(id);
|
|
1004
|
+
if (!p) throw new Error(`zkp proof ${id} not found`);
|
|
1005
|
+
_zkpCheckP(p.status, ZKP_PROOF_LIFECYCLE_V2.FAILED);
|
|
1006
|
+
const now = Date.now();
|
|
1007
|
+
p.status = ZKP_PROOF_LIFECYCLE_V2.FAILED;
|
|
1008
|
+
p.updatedAt = now;
|
|
1009
|
+
if (!p.settledAt) p.settledAt = now;
|
|
1010
|
+
if (reason) p.metadata.failReason = String(reason);
|
|
1011
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1012
|
+
}
|
|
1013
|
+
export function cancelZkpProofV2(id, reason) {
|
|
1014
|
+
const p = _zkpProofs.get(id);
|
|
1015
|
+
if (!p) throw new Error(`zkp proof ${id} not found`);
|
|
1016
|
+
_zkpCheckP(p.status, ZKP_PROOF_LIFECYCLE_V2.CANCELLED);
|
|
1017
|
+
const now = Date.now();
|
|
1018
|
+
p.status = ZKP_PROOF_LIFECYCLE_V2.CANCELLED;
|
|
1019
|
+
p.updatedAt = now;
|
|
1020
|
+
if (!p.settledAt) p.settledAt = now;
|
|
1021
|
+
if (reason) p.metadata.cancelReason = String(reason);
|
|
1022
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1023
|
+
}
|
|
1024
|
+
export function getZkpProofV2(id) {
|
|
1025
|
+
const p = _zkpProofs.get(id);
|
|
1026
|
+
if (!p) return null;
|
|
1027
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1028
|
+
}
|
|
1029
|
+
export function listZkpProofsV2() {
|
|
1030
|
+
return [..._zkpProofs.values()].map((p) => ({
|
|
1031
|
+
...p,
|
|
1032
|
+
metadata: { ...p.metadata },
|
|
1033
|
+
}));
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
export function autoDeprecateIdleZkpCircuitsV2({ now } = {}) {
|
|
1037
|
+
const t = now ?? Date.now();
|
|
1038
|
+
const flipped = [];
|
|
1039
|
+
for (const c of _zkpCircs.values())
|
|
1040
|
+
if (
|
|
1041
|
+
c.status === ZKP_CIRCUIT_MATURITY_V2.ACTIVE &&
|
|
1042
|
+
t - c.lastTouchedAt >= _zkpCircuitIdleMs
|
|
1043
|
+
) {
|
|
1044
|
+
c.status = ZKP_CIRCUIT_MATURITY_V2.DEPRECATED;
|
|
1045
|
+
c.updatedAt = t;
|
|
1046
|
+
flipped.push(c.id);
|
|
1047
|
+
}
|
|
1048
|
+
return { flipped, count: flipped.length };
|
|
1049
|
+
}
|
|
1050
|
+
export function autoFailStuckZkpProofsV2({ now } = {}) {
|
|
1051
|
+
const t = now ?? Date.now();
|
|
1052
|
+
const flipped = [];
|
|
1053
|
+
for (const p of _zkpProofs.values())
|
|
1054
|
+
if (
|
|
1055
|
+
p.status === ZKP_PROOF_LIFECYCLE_V2.PROVING &&
|
|
1056
|
+
p.startedAt != null &&
|
|
1057
|
+
t - p.startedAt >= _zkpProofStuckMs
|
|
1058
|
+
) {
|
|
1059
|
+
p.status = ZKP_PROOF_LIFECYCLE_V2.FAILED;
|
|
1060
|
+
p.updatedAt = t;
|
|
1061
|
+
if (!p.settledAt) p.settledAt = t;
|
|
1062
|
+
p.metadata.failReason = "auto-fail-stuck";
|
|
1063
|
+
flipped.push(p.id);
|
|
1064
|
+
}
|
|
1065
|
+
return { flipped, count: flipped.length };
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
export function getZkpEngineGovStatsV2() {
|
|
1069
|
+
const circuitsByStatus = {};
|
|
1070
|
+
for (const s of Object.values(ZKP_CIRCUIT_MATURITY_V2))
|
|
1071
|
+
circuitsByStatus[s] = 0;
|
|
1072
|
+
for (const c of _zkpCircs.values()) circuitsByStatus[c.status]++;
|
|
1073
|
+
const proofsByStatus = {};
|
|
1074
|
+
for (const s of Object.values(ZKP_PROOF_LIFECYCLE_V2)) proofsByStatus[s] = 0;
|
|
1075
|
+
for (const p of _zkpProofs.values()) proofsByStatus[p.status]++;
|
|
1076
|
+
return {
|
|
1077
|
+
totalCircuitsV2: _zkpCircs.size,
|
|
1078
|
+
totalProofsV2: _zkpProofs.size,
|
|
1079
|
+
maxActiveZkpCircuitsPerOwner: _zkpMaxActivePerOwner,
|
|
1080
|
+
maxPendingZkpProofsPerCircuit: _zkpMaxPendingPerCircuit,
|
|
1081
|
+
zkpCircuitIdleMs: _zkpCircuitIdleMs,
|
|
1082
|
+
zkpProofStuckMs: _zkpProofStuckMs,
|
|
1083
|
+
circuitsByStatus,
|
|
1084
|
+
proofsByStatus,
|
|
1085
|
+
};
|
|
1086
|
+
}
|