chainlesschain 0.66.0 → 0.132.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/bin/chainlesschain.js +0 -0
- package/package.json +1 -1
- package/src/commands/a2a.js +380 -0
- package/src/commands/agent-network.js +254 -1
- package/src/commands/audit.js +302 -0
- package/src/commands/automation.js +271 -1
- package/src/commands/bi.js +348 -0
- package/src/commands/codegen.js +224 -0
- package/src/commands/collab.js +341 -0
- package/src/commands/compliance.js +1035 -0
- package/src/commands/cowork.js +221 -0
- package/src/commands/crosschain.js +218 -0
- package/src/commands/dbevo.js +284 -0
- package/src/commands/dev.js +252 -0
- package/src/commands/did.js +358 -0
- package/src/commands/dlp.js +341 -0
- package/src/commands/encrypt.js +341 -0
- package/src/commands/evomap.js +394 -0
- package/src/commands/export.js +256 -1
- package/src/commands/federation.js +283 -0
- package/src/commands/fusion.js +258 -0
- package/src/commands/governance.js +325 -0
- package/src/commands/hardening.js +411 -0
- package/src/commands/hook.js +148 -0
- package/src/commands/import.js +252 -0
- package/src/commands/incentive.js +322 -0
- package/src/commands/inference.js +318 -0
- package/src/commands/infra.js +244 -0
- package/src/commands/instinct.js +260 -0
- package/src/commands/ipfs.js +318 -0
- package/src/commands/kg.js +387 -0
- package/src/commands/llm.js +263 -0
- package/src/commands/lowcode.js +356 -0
- package/src/commands/marketplace.js +256 -0
- package/src/commands/mcp.js +221 -0
- package/src/commands/memory.js +248 -0
- package/src/commands/multimodal.js +296 -0
- package/src/commands/nlprog.js +356 -0
- package/src/commands/note.js +244 -0
- package/src/commands/ops.js +354 -0
- package/src/commands/orchestrate.js +166 -0
- package/src/commands/org.js +277 -0
- package/src/commands/p2p.js +390 -0
- package/src/commands/perception.js +290 -0
- package/src/commands/permmem.js +251 -0
- package/src/commands/plugin-ecosystem.js +273 -0
- package/src/commands/pqc.js +393 -0
- package/src/commands/privacy.js +321 -0
- package/src/commands/quantization.js +351 -0
- package/src/commands/rcache.js +271 -0
- package/src/commands/recommend.js +340 -0
- package/src/commands/reputation.js +261 -0
- package/src/commands/runtime.js +307 -0
- package/src/commands/scim.js +262 -0
- package/src/commands/session.js +258 -0
- package/src/commands/siem.js +246 -0
- package/src/commands/skill.js +267 -1
- package/src/commands/sla.js +259 -0
- package/src/commands/social.js +256 -0
- package/src/commands/sso.js +186 -1
- package/src/commands/stress.js +230 -0
- package/src/commands/sync.js +256 -0
- package/src/commands/tech.js +338 -0
- package/src/commands/tenant.js +351 -0
- package/src/commands/terraform.js +245 -0
- package/src/commands/tokens.js +269 -0
- package/src/commands/trust.js +249 -0
- package/src/commands/wallet.js +277 -0
- package/src/commands/workflow.js +171 -0
- package/src/commands/zkp.js +335 -0
- package/src/index.js +4 -0
- package/src/lib/a2a-protocol.js +451 -0
- package/src/lib/agent-coordinator.js +325 -0
- package/src/lib/agent-network.js +387 -0
- package/src/lib/agent-router.js +395 -0
- package/src/lib/aiops.js +478 -0
- package/src/lib/app-builder.js +239 -0
- package/src/lib/audit-logger.js +379 -0
- package/src/lib/automation-engine.js +330 -0
- package/src/lib/autonomous-developer.js +350 -0
- package/src/lib/bi-engine.js +338 -0
- package/src/lib/code-agent.js +323 -0
- package/src/lib/collaboration-governance.js +364 -0
- package/src/lib/community-governance.js +436 -0
- package/src/lib/compliance-manager.js +434 -0
- package/src/lib/content-recommendation.js +469 -0
- package/src/lib/cross-chain.js +345 -0
- package/src/lib/crypto-manager.js +350 -0
- package/src/lib/dbevo.js +338 -0
- package/src/lib/decentral-infra.js +340 -0
- package/src/lib/did-manager.js +367 -0
- package/src/lib/dlp-engine.js +389 -0
- package/src/lib/evomap-federation.js +177 -0
- package/src/lib/evomap-governance.js +276 -0
- package/src/lib/federation-hardening.js +259 -0
- package/src/lib/hardening-manager.js +348 -0
- package/src/lib/hook-manager.js +380 -0
- package/src/lib/inference-network.js +330 -0
- package/src/lib/instinct-manager.js +332 -0
- package/src/lib/ipfs-storage.js +334 -0
- package/src/lib/knowledge-exporter.js +381 -0
- package/src/lib/knowledge-graph.js +432 -0
- package/src/lib/knowledge-importer.js +379 -0
- package/src/lib/llm-providers.js +391 -0
- package/src/lib/mcp-registry.js +333 -0
- package/src/lib/memory-manager.js +330 -0
- package/src/lib/multimodal.js +346 -0
- package/src/lib/nl-programming.js +343 -0
- package/src/lib/note-versioning.js +327 -0
- package/src/lib/org-manager.js +323 -0
- package/src/lib/p2p-manager.js +387 -0
- package/src/lib/perception.js +346 -0
- package/src/lib/perf-tuning.js +4 -1
- package/src/lib/permanent-memory.js +320 -0
- package/src/lib/plugin-ecosystem.js +377 -0
- package/src/lib/pqc-manager.js +368 -0
- package/src/lib/privacy-computing.js +427 -0
- package/src/lib/protocol-fusion.js +417 -0
- package/src/lib/quantization.js +325 -0
- package/src/lib/reputation-optimizer.js +299 -0
- package/src/lib/response-cache.js +327 -0
- package/src/lib/scim-manager.js +329 -0
- package/src/lib/session-manager.js +329 -0
- package/src/lib/siem-exporter.js +333 -0
- package/src/lib/skill-loader.js +377 -0
- package/src/lib/skill-marketplace.js +325 -0
- package/src/lib/sla-manager.js +275 -0
- package/src/lib/social-manager.js +326 -0
- package/src/lib/sso-manager.js +332 -0
- package/src/lib/stress-tester.js +330 -0
- package/src/lib/sync-manager.js +326 -0
- package/src/lib/tech-learning-engine.js +369 -0
- package/src/lib/tenant-saas.js +460 -0
- package/src/lib/terraform-manager.js +363 -0
- package/src/lib/threat-intel.js +335 -0
- package/src/lib/token-incentive.js +293 -0
- package/src/lib/token-tracker.js +329 -0
- package/src/lib/trust-security.js +390 -0
- package/src/lib/ueba.js +389 -0
- package/src/lib/universal-runtime.js +325 -0
- package/src/lib/wallet-manager.js +326 -0
- package/src/lib/workflow-engine.js +322 -0
- package/src/lib/zkp-engine.js +274 -0
|
@@ -471,3 +471,393 @@ export function _resetState() {
|
|
|
471
471
|
_satMessages.clear();
|
|
472
472
|
_hsmDevices.clear();
|
|
473
473
|
}
|
|
474
|
+
|
|
475
|
+
/* ── V2 Surface (Phase 68-71) ─────────────────────────────
|
|
476
|
+
* Strictly additive. Two parallel state machines:
|
|
477
|
+
* - HSM device maturity (4 states, retired terminal)
|
|
478
|
+
* - Satellite transmission lifecycle (5 states, 3 terminals)
|
|
479
|
+
* Per-operator active-device cap + per-device pending-transmission cap.
|
|
480
|
+
* Auto-flip: stale devices → retired; stuck sending transmissions → failed.
|
|
481
|
+
*/
|
|
482
|
+
|
|
483
|
+
export const HSM_MATURITY_V2 = Object.freeze({
|
|
484
|
+
PROVISIONAL: "provisional",
|
|
485
|
+
ACTIVE: "active",
|
|
486
|
+
DEGRADED: "degraded",
|
|
487
|
+
RETIRED: "retired",
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
export const TRANSMISSION_V2 = Object.freeze({
|
|
491
|
+
QUEUED: "queued",
|
|
492
|
+
SENDING: "sending",
|
|
493
|
+
CONFIRMED: "confirmed",
|
|
494
|
+
FAILED: "failed",
|
|
495
|
+
CANCELED: "canceled",
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
const _HSM_TRANSITIONS_V2 = new Map([
|
|
499
|
+
[
|
|
500
|
+
HSM_MATURITY_V2.PROVISIONAL,
|
|
501
|
+
new Set([HSM_MATURITY_V2.ACTIVE, HSM_MATURITY_V2.RETIRED]),
|
|
502
|
+
],
|
|
503
|
+
[
|
|
504
|
+
HSM_MATURITY_V2.ACTIVE,
|
|
505
|
+
new Set([HSM_MATURITY_V2.DEGRADED, HSM_MATURITY_V2.RETIRED]),
|
|
506
|
+
],
|
|
507
|
+
[
|
|
508
|
+
HSM_MATURITY_V2.DEGRADED,
|
|
509
|
+
new Set([HSM_MATURITY_V2.ACTIVE, HSM_MATURITY_V2.RETIRED]),
|
|
510
|
+
],
|
|
511
|
+
]);
|
|
512
|
+
const _HSM_TERMINAL_V2 = new Set([HSM_MATURITY_V2.RETIRED]);
|
|
513
|
+
|
|
514
|
+
const _TRANSMISSION_TRANSITIONS_V2 = new Map([
|
|
515
|
+
[
|
|
516
|
+
TRANSMISSION_V2.QUEUED,
|
|
517
|
+
new Set([
|
|
518
|
+
TRANSMISSION_V2.SENDING,
|
|
519
|
+
TRANSMISSION_V2.CANCELED,
|
|
520
|
+
TRANSMISSION_V2.FAILED,
|
|
521
|
+
]),
|
|
522
|
+
],
|
|
523
|
+
[
|
|
524
|
+
TRANSMISSION_V2.SENDING,
|
|
525
|
+
new Set([
|
|
526
|
+
TRANSMISSION_V2.CONFIRMED,
|
|
527
|
+
TRANSMISSION_V2.FAILED,
|
|
528
|
+
TRANSMISSION_V2.CANCELED,
|
|
529
|
+
]),
|
|
530
|
+
],
|
|
531
|
+
]);
|
|
532
|
+
const _TRANSMISSION_TERMINAL_V2 = new Set([
|
|
533
|
+
TRANSMISSION_V2.CONFIRMED,
|
|
534
|
+
TRANSMISSION_V2.FAILED,
|
|
535
|
+
TRANSMISSION_V2.CANCELED,
|
|
536
|
+
]);
|
|
537
|
+
|
|
538
|
+
export const TS_DEFAULT_MAX_ACTIVE_DEVICES_PER_OPERATOR = 8;
|
|
539
|
+
export const TS_DEFAULT_MAX_PENDING_TRANSMISSIONS_PER_DEVICE = 20;
|
|
540
|
+
export const TS_DEFAULT_DEVICE_IDLE_MS = 30 * 86400000;
|
|
541
|
+
export const TS_DEFAULT_TRANSMISSION_STUCK_MS = 2 * 60000;
|
|
542
|
+
|
|
543
|
+
let _tsMaxActiveDevicesPerOperator = TS_DEFAULT_MAX_ACTIVE_DEVICES_PER_OPERATOR;
|
|
544
|
+
let _tsMaxPendingTransmissionsPerDevice =
|
|
545
|
+
TS_DEFAULT_MAX_PENDING_TRANSMISSIONS_PER_DEVICE;
|
|
546
|
+
let _tsDeviceIdleMs = TS_DEFAULT_DEVICE_IDLE_MS;
|
|
547
|
+
let _tsTransmissionStuckMs = TS_DEFAULT_TRANSMISSION_STUCK_MS;
|
|
548
|
+
|
|
549
|
+
const _devicesV2 = new Map();
|
|
550
|
+
const _transmissionsV2 = new Map();
|
|
551
|
+
|
|
552
|
+
function _positiveIntV2(n, label) {
|
|
553
|
+
const f = Math.floor(n);
|
|
554
|
+
if (!Number.isFinite(f) || f <= 0)
|
|
555
|
+
throw new Error(`${label} must be a positive integer`);
|
|
556
|
+
return f;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
export function getMaxActiveDevicesPerOperator() {
|
|
560
|
+
return _tsMaxActiveDevicesPerOperator;
|
|
561
|
+
}
|
|
562
|
+
export function setMaxActiveDevicesPerOperator(n) {
|
|
563
|
+
_tsMaxActiveDevicesPerOperator = _positiveIntV2(
|
|
564
|
+
n,
|
|
565
|
+
"maxActiveDevicesPerOperator",
|
|
566
|
+
);
|
|
567
|
+
return _tsMaxActiveDevicesPerOperator;
|
|
568
|
+
}
|
|
569
|
+
export function getMaxPendingTransmissionsPerDevice() {
|
|
570
|
+
return _tsMaxPendingTransmissionsPerDevice;
|
|
571
|
+
}
|
|
572
|
+
export function setMaxPendingTransmissionsPerDevice(n) {
|
|
573
|
+
_tsMaxPendingTransmissionsPerDevice = _positiveIntV2(
|
|
574
|
+
n,
|
|
575
|
+
"maxPendingTransmissionsPerDevice",
|
|
576
|
+
);
|
|
577
|
+
return _tsMaxPendingTransmissionsPerDevice;
|
|
578
|
+
}
|
|
579
|
+
export function getDeviceIdleMs() {
|
|
580
|
+
return _tsDeviceIdleMs;
|
|
581
|
+
}
|
|
582
|
+
export function setDeviceIdleMs(n) {
|
|
583
|
+
_tsDeviceIdleMs = _positiveIntV2(n, "deviceIdleMs");
|
|
584
|
+
return _tsDeviceIdleMs;
|
|
585
|
+
}
|
|
586
|
+
export function getTransmissionStuckMs() {
|
|
587
|
+
return _tsTransmissionStuckMs;
|
|
588
|
+
}
|
|
589
|
+
export function setTransmissionStuckMs(n) {
|
|
590
|
+
_tsTransmissionStuckMs = _positiveIntV2(n, "transmissionStuckMs");
|
|
591
|
+
return _tsTransmissionStuckMs;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
export function getActiveDeviceCount(operator) {
|
|
595
|
+
let c = 0;
|
|
596
|
+
for (const d of _devicesV2.values()) {
|
|
597
|
+
if (d.status === HSM_MATURITY_V2.RETIRED) continue;
|
|
598
|
+
if (d.status === HSM_MATURITY_V2.PROVISIONAL) continue;
|
|
599
|
+
if (operator !== undefined && d.operator !== operator) continue;
|
|
600
|
+
c++;
|
|
601
|
+
}
|
|
602
|
+
return c;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
export function getPendingTransmissionCount(deviceId) {
|
|
606
|
+
let c = 0;
|
|
607
|
+
for (const t of _transmissionsV2.values()) {
|
|
608
|
+
if (_TRANSMISSION_TERMINAL_V2.has(t.status)) continue;
|
|
609
|
+
if (deviceId !== undefined && t.deviceId !== deviceId) continue;
|
|
610
|
+
c++;
|
|
611
|
+
}
|
|
612
|
+
return c;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
const _VALID_VENDORS = new Set(Object.values(HSM_VENDOR));
|
|
616
|
+
|
|
617
|
+
export function registerDeviceV2({
|
|
618
|
+
id,
|
|
619
|
+
operator,
|
|
620
|
+
vendor,
|
|
621
|
+
initialStatus,
|
|
622
|
+
metadata,
|
|
623
|
+
} = {}) {
|
|
624
|
+
if (!id) throw new Error("id required");
|
|
625
|
+
if (!operator) throw new Error("operator required");
|
|
626
|
+
if (!vendor || !_VALID_VENDORS.has(vendor)) throw new Error("invalid vendor");
|
|
627
|
+
if (_devicesV2.has(id)) throw new Error(`device ${id} already exists`);
|
|
628
|
+
const status = initialStatus ?? HSM_MATURITY_V2.PROVISIONAL;
|
|
629
|
+
if (!Object.values(HSM_MATURITY_V2).includes(status))
|
|
630
|
+
throw new Error(`invalid initial status ${status}`);
|
|
631
|
+
const countsActive =
|
|
632
|
+
status !== HSM_MATURITY_V2.RETIRED &&
|
|
633
|
+
status !== HSM_MATURITY_V2.PROVISIONAL;
|
|
634
|
+
if (
|
|
635
|
+
countsActive &&
|
|
636
|
+
getActiveDeviceCount(operator) >= _tsMaxActiveDevicesPerOperator
|
|
637
|
+
)
|
|
638
|
+
throw new Error(`operator ${operator} active device cap reached`);
|
|
639
|
+
const now = _now();
|
|
640
|
+
const d = {
|
|
641
|
+
id,
|
|
642
|
+
operator,
|
|
643
|
+
vendor,
|
|
644
|
+
status,
|
|
645
|
+
metadata: metadata ? { ...metadata } : {},
|
|
646
|
+
createdAt: now,
|
|
647
|
+
updatedAt: now,
|
|
648
|
+
activatedAt: status === HSM_MATURITY_V2.ACTIVE ? now : null,
|
|
649
|
+
lastUsedAt: now,
|
|
650
|
+
};
|
|
651
|
+
_devicesV2.set(id, d);
|
|
652
|
+
return { ...d, metadata: { ...d.metadata } };
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
export function getDeviceV2(id) {
|
|
656
|
+
const d = _devicesV2.get(id);
|
|
657
|
+
return d ? { ...d, metadata: { ...d.metadata } } : null;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
export function listDevicesV2({ operator, status } = {}) {
|
|
661
|
+
const out = [];
|
|
662
|
+
for (const d of _devicesV2.values()) {
|
|
663
|
+
if (operator !== undefined && d.operator !== operator) continue;
|
|
664
|
+
if (status !== undefined && d.status !== status) continue;
|
|
665
|
+
out.push({ ...d, metadata: { ...d.metadata } });
|
|
666
|
+
}
|
|
667
|
+
return out;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
export function setDeviceMaturityV2(id, nextStatus, { reason, metadata } = {}) {
|
|
671
|
+
const d = _devicesV2.get(id);
|
|
672
|
+
if (!d) throw new Error(`device ${id} not found`);
|
|
673
|
+
if (_HSM_TERMINAL_V2.has(d.status))
|
|
674
|
+
throw new Error(`device ${id} is terminal (${d.status})`);
|
|
675
|
+
const allowed = _HSM_TRANSITIONS_V2.get(d.status);
|
|
676
|
+
if (!allowed || !allowed.has(nextStatus))
|
|
677
|
+
throw new Error(`illegal transition ${d.status} → ${nextStatus}`);
|
|
678
|
+
const wasActive =
|
|
679
|
+
d.status !== HSM_MATURITY_V2.PROVISIONAL &&
|
|
680
|
+
d.status !== HSM_MATURITY_V2.RETIRED;
|
|
681
|
+
const willBeActive =
|
|
682
|
+
nextStatus !== HSM_MATURITY_V2.PROVISIONAL &&
|
|
683
|
+
nextStatus !== HSM_MATURITY_V2.RETIRED;
|
|
684
|
+
if (!wasActive && willBeActive) {
|
|
685
|
+
if (getActiveDeviceCount(d.operator) >= _tsMaxActiveDevicesPerOperator)
|
|
686
|
+
throw new Error(`operator ${d.operator} active device cap reached`);
|
|
687
|
+
}
|
|
688
|
+
d.status = nextStatus;
|
|
689
|
+
d.updatedAt = _now();
|
|
690
|
+
if (reason !== undefined) d.reason = reason;
|
|
691
|
+
if (metadata) d.metadata = { ...d.metadata, ...metadata };
|
|
692
|
+
if (nextStatus === HSM_MATURITY_V2.ACTIVE && !d.activatedAt)
|
|
693
|
+
d.activatedAt = d.updatedAt;
|
|
694
|
+
return { ...d, metadata: { ...d.metadata } };
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
export function activateDevice(id, opts) {
|
|
698
|
+
return setDeviceMaturityV2(id, HSM_MATURITY_V2.ACTIVE, opts);
|
|
699
|
+
}
|
|
700
|
+
export function degradeDevice(id, opts) {
|
|
701
|
+
return setDeviceMaturityV2(id, HSM_MATURITY_V2.DEGRADED, opts);
|
|
702
|
+
}
|
|
703
|
+
export function retireDevice(id, opts) {
|
|
704
|
+
return setDeviceMaturityV2(id, HSM_MATURITY_V2.RETIRED, opts);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
export function touchDeviceUsage(id) {
|
|
708
|
+
const d = _devicesV2.get(id);
|
|
709
|
+
if (!d) throw new Error(`device ${id} not found`);
|
|
710
|
+
d.lastUsedAt = _now();
|
|
711
|
+
return { ...d, metadata: { ...d.metadata } };
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
export function enqueueTransmissionV2({
|
|
715
|
+
id,
|
|
716
|
+
deviceId,
|
|
717
|
+
provider,
|
|
718
|
+
payload,
|
|
719
|
+
metadata,
|
|
720
|
+
} = {}) {
|
|
721
|
+
if (!id) throw new Error("id required");
|
|
722
|
+
if (!deviceId) throw new Error("deviceId required");
|
|
723
|
+
if (!provider) throw new Error("provider required");
|
|
724
|
+
if (!payload) throw new Error("payload required");
|
|
725
|
+
const d = _devicesV2.get(deviceId);
|
|
726
|
+
if (!d) throw new Error(`device ${deviceId} not found`);
|
|
727
|
+
if (_transmissionsV2.has(id))
|
|
728
|
+
throw new Error(`transmission ${id} already exists`);
|
|
729
|
+
if (
|
|
730
|
+
getPendingTransmissionCount(deviceId) >= _tsMaxPendingTransmissionsPerDevice
|
|
731
|
+
)
|
|
732
|
+
throw new Error(`device ${deviceId} pending transmission cap reached`);
|
|
733
|
+
const now = _now();
|
|
734
|
+
const t = {
|
|
735
|
+
id,
|
|
736
|
+
deviceId,
|
|
737
|
+
provider,
|
|
738
|
+
payload,
|
|
739
|
+
status: TRANSMISSION_V2.QUEUED,
|
|
740
|
+
metadata: metadata ? { ...metadata } : {},
|
|
741
|
+
createdAt: now,
|
|
742
|
+
updatedAt: now,
|
|
743
|
+
startedAt: null,
|
|
744
|
+
};
|
|
745
|
+
_transmissionsV2.set(id, t);
|
|
746
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
export function getTransmissionV2(id) {
|
|
750
|
+
const t = _transmissionsV2.get(id);
|
|
751
|
+
return t ? { ...t, metadata: { ...t.metadata } } : null;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
export function listTransmissionsV2({ deviceId, status } = {}) {
|
|
755
|
+
const out = [];
|
|
756
|
+
for (const t of _transmissionsV2.values()) {
|
|
757
|
+
if (deviceId !== undefined && t.deviceId !== deviceId) continue;
|
|
758
|
+
if (status !== undefined && t.status !== status) continue;
|
|
759
|
+
out.push({ ...t, metadata: { ...t.metadata } });
|
|
760
|
+
}
|
|
761
|
+
return out;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
export function setTransmissionStatusV2(
|
|
765
|
+
id,
|
|
766
|
+
nextStatus,
|
|
767
|
+
{ reason, metadata } = {},
|
|
768
|
+
) {
|
|
769
|
+
const t = _transmissionsV2.get(id);
|
|
770
|
+
if (!t) throw new Error(`transmission ${id} not found`);
|
|
771
|
+
if (_TRANSMISSION_TERMINAL_V2.has(t.status))
|
|
772
|
+
throw new Error(`transmission ${id} is terminal (${t.status})`);
|
|
773
|
+
const allowed = _TRANSMISSION_TRANSITIONS_V2.get(t.status);
|
|
774
|
+
if (!allowed || !allowed.has(nextStatus))
|
|
775
|
+
throw new Error(`illegal transition ${t.status} → ${nextStatus}`);
|
|
776
|
+
t.status = nextStatus;
|
|
777
|
+
t.updatedAt = _now();
|
|
778
|
+
if (reason !== undefined) t.reason = reason;
|
|
779
|
+
if (metadata) t.metadata = { ...t.metadata, ...metadata };
|
|
780
|
+
if (nextStatus === TRANSMISSION_V2.SENDING && !t.startedAt)
|
|
781
|
+
t.startedAt = t.updatedAt;
|
|
782
|
+
return { ...t, metadata: { ...t.metadata } };
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
export function startTransmission(id, opts) {
|
|
786
|
+
return setTransmissionStatusV2(id, TRANSMISSION_V2.SENDING, opts);
|
|
787
|
+
}
|
|
788
|
+
export function confirmTransmission(id, opts) {
|
|
789
|
+
return setTransmissionStatusV2(id, TRANSMISSION_V2.CONFIRMED, opts);
|
|
790
|
+
}
|
|
791
|
+
export function failTransmission(id, opts) {
|
|
792
|
+
return setTransmissionStatusV2(id, TRANSMISSION_V2.FAILED, opts);
|
|
793
|
+
}
|
|
794
|
+
export function cancelTransmission(id, opts) {
|
|
795
|
+
return setTransmissionStatusV2(id, TRANSMISSION_V2.CANCELED, opts);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
export function autoRetireIdleDevices({ now } = {}) {
|
|
799
|
+
const cutoff = (now ?? _now()) - _tsDeviceIdleMs;
|
|
800
|
+
const flipped = [];
|
|
801
|
+
for (const d of _devicesV2.values()) {
|
|
802
|
+
if (
|
|
803
|
+
d.status !== HSM_MATURITY_V2.ACTIVE &&
|
|
804
|
+
d.status !== HSM_MATURITY_V2.DEGRADED
|
|
805
|
+
)
|
|
806
|
+
continue;
|
|
807
|
+
if ((d.lastUsedAt ?? d.createdAt) > cutoff) continue;
|
|
808
|
+
d.status = HSM_MATURITY_V2.RETIRED;
|
|
809
|
+
d.updatedAt = now ?? _now();
|
|
810
|
+
d.reason = "auto_retire_idle";
|
|
811
|
+
flipped.push(d.id);
|
|
812
|
+
}
|
|
813
|
+
return flipped;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
export function autoFailStuckTransmissions({ now } = {}) {
|
|
817
|
+
const cutoff = (now ?? _now()) - _tsTransmissionStuckMs;
|
|
818
|
+
const flipped = [];
|
|
819
|
+
for (const t of _transmissionsV2.values()) {
|
|
820
|
+
if (t.status !== TRANSMISSION_V2.SENDING) continue;
|
|
821
|
+
if (!t.startedAt || t.startedAt > cutoff) continue;
|
|
822
|
+
t.status = TRANSMISSION_V2.FAILED;
|
|
823
|
+
t.updatedAt = now ?? _now();
|
|
824
|
+
t.reason = "auto_fail_stuck";
|
|
825
|
+
flipped.push(t.id);
|
|
826
|
+
}
|
|
827
|
+
return flipped;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
function _zeroByEnum(enumObj) {
|
|
831
|
+
const out = {};
|
|
832
|
+
for (const v of Object.values(enumObj)) out[v] = 0;
|
|
833
|
+
return out;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
export function getTrustSecurityStatsV2() {
|
|
837
|
+
const devices = [..._devicesV2.values()];
|
|
838
|
+
const transmissions = [..._transmissionsV2.values()];
|
|
839
|
+
const devicesByStatus = _zeroByEnum(HSM_MATURITY_V2);
|
|
840
|
+
for (const d of devices) devicesByStatus[d.status]++;
|
|
841
|
+
const transmissionsByStatus = _zeroByEnum(TRANSMISSION_V2);
|
|
842
|
+
for (const t of transmissions) transmissionsByStatus[t.status]++;
|
|
843
|
+
return {
|
|
844
|
+
totalDevicesV2: devices.length,
|
|
845
|
+
totalTransmissionsV2: transmissions.length,
|
|
846
|
+
maxActiveDevicesPerOperator: _tsMaxActiveDevicesPerOperator,
|
|
847
|
+
maxPendingTransmissionsPerDevice: _tsMaxPendingTransmissionsPerDevice,
|
|
848
|
+
deviceIdleMs: _tsDeviceIdleMs,
|
|
849
|
+
transmissionStuckMs: _tsTransmissionStuckMs,
|
|
850
|
+
devicesByStatus,
|
|
851
|
+
transmissionsByStatus,
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
export function _resetStateV2() {
|
|
856
|
+
_devicesV2.clear();
|
|
857
|
+
_transmissionsV2.clear();
|
|
858
|
+
_tsMaxActiveDevicesPerOperator = TS_DEFAULT_MAX_ACTIVE_DEVICES_PER_OPERATOR;
|
|
859
|
+
_tsMaxPendingTransmissionsPerDevice =
|
|
860
|
+
TS_DEFAULT_MAX_PENDING_TRANSMISSIONS_PER_DEVICE;
|
|
861
|
+
_tsDeviceIdleMs = TS_DEFAULT_DEVICE_IDLE_MS;
|
|
862
|
+
_tsTransmissionStuckMs = TS_DEFAULT_TRANSMISSION_STUCK_MS;
|
|
863
|
+
}
|