chainlesschain 0.145.0 → 0.152.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/activitypub.js +207 -0
- package/src/commands/agent-network.js +217 -0
- package/src/commands/automation.js +201 -0
- package/src/commands/bi.js +203 -0
- package/src/commands/browse.js +213 -0
- package/src/commands/codegen.js +207 -0
- package/src/commands/collab.js +211 -0
- package/src/commands/compliance.js +410 -0
- package/src/commands/cowork.js +203 -0
- package/src/commands/dbevo.js +227 -0
- package/src/commands/dev.js +207 -0
- package/src/commands/did-v2.js +217 -0
- package/src/commands/did.js +221 -0
- package/src/commands/dlp.js +213 -0
- package/src/commands/evomap.js +205 -0
- package/src/commands/export.js +213 -0
- package/src/commands/federation.js +209 -0
- package/src/commands/fusion.js +205 -0
- package/src/commands/governance.js +209 -0
- package/src/commands/hook.js +209 -0
- package/src/commands/import.js +209 -0
- package/src/commands/infra.js +203 -0
- package/src/commands/instinct.js +209 -0
- package/src/commands/ipfs.js +207 -0
- package/src/commands/llm.js +217 -0
- package/src/commands/matrix.js +207 -0
- package/src/commands/mcp.js +217 -0
- package/src/commands/memory.js +209 -0
- package/src/commands/multimodal.js +203 -0
- package/src/commands/nlprog.js +225 -0
- package/src/commands/nostr.js +209 -0
- package/src/commands/note.js +205 -0
- package/src/commands/ops.js +219 -0
- package/src/commands/org.js +209 -0
- package/src/commands/p2p.js +209 -0
- package/src/commands/perception.js +209 -0
- package/src/commands/permmem.js +203 -0
- package/src/commands/plugin-ecosystem.js +209 -0
- package/src/commands/pqc.js +213 -0
- package/src/commands/quantization.js +207 -0
- package/src/commands/rcache.js +205 -0
- package/src/commands/recommend.js +233 -0
- package/src/commands/runtime.js +205 -0
- package/src/commands/scim.js +209 -0
- package/src/commands/session.js +209 -0
- package/src/commands/skill.js +207 -0
- package/src/commands/social.js +201 -0
- package/src/commands/sso.js +209 -0
- package/src/commands/sync.js +209 -0
- package/src/commands/tech.js +209 -0
- package/src/commands/tenant.js +217 -0
- package/src/commands/tokens.js +209 -0
- package/src/commands/trust.js +217 -0
- package/src/commands/wallet.js +209 -0
- package/src/commands/workflow.js +203 -0
- package/src/index.js +140 -0
- package/src/lib/activitypub-bridge.js +334 -0
- package/src/lib/agent-network.js +341 -0
- package/src/lib/aiops.js +346 -0
- package/src/lib/automation-engine.js +335 -0
- package/src/lib/autonomous-developer.js +332 -0
- package/src/lib/bi-engine.js +333 -0
- package/src/lib/browser-automation.js +334 -0
- package/src/lib/code-agent.js +339 -0
- package/src/lib/collaboration-governance.js +334 -0
- package/src/lib/community-governance.js +346 -0
- package/src/lib/content-recommendation.js +351 -0
- package/src/lib/cowork-share.js +338 -0
- package/src/lib/dbevo.js +351 -0
- package/src/lib/decentral-infra.js +330 -0
- package/src/lib/did-manager.js +341 -0
- package/src/lib/did-v2-manager.js +341 -0
- package/src/lib/dlp-engine.js +339 -0
- package/src/lib/evomap-governance.js +334 -0
- package/src/lib/federation-hardening.js +340 -0
- package/src/lib/hook-manager.js +341 -0
- package/src/lib/instinct-manager.js +346 -0
- package/src/lib/ipfs-storage.js +334 -0
- package/src/lib/knowledge-exporter.js +341 -0
- package/src/lib/knowledge-importer.js +341 -0
- package/src/lib/llm-providers.js +346 -0
- package/src/lib/matrix-bridge.js +339 -0
- package/src/lib/mcp-registry.js +346 -0
- package/src/lib/memory-manager.js +336 -0
- package/src/lib/multimodal.js +330 -0
- package/src/lib/nl-programming.js +341 -0
- package/src/lib/nostr-bridge.js +336 -0
- package/src/lib/note-versioning.js +339 -0
- package/src/lib/org-manager.js +336 -0
- package/src/lib/p2p-manager.js +341 -0
- package/src/lib/perception.js +346 -0
- package/src/lib/permanent-memory.js +327 -0
- package/src/lib/plugin-ecosystem.js +346 -0
- package/src/lib/pqc-manager.js +346 -0
- package/src/lib/protocol-fusion.js +338 -0
- package/src/lib/quantization.js +337 -0
- package/src/lib/response-cache.js +333 -0
- package/src/lib/scim-manager.js +346 -0
- package/src/lib/session-manager.js +334 -0
- package/src/lib/skill-loader.js +334 -0
- package/src/lib/social-manager.js +330 -0
- package/src/lib/sso-manager.js +340 -0
- package/src/lib/sync-manager.js +336 -0
- package/src/lib/tech-learning-engine.js +341 -0
- package/src/lib/tenant-saas.js +341 -0
- package/src/lib/threat-intel.js +330 -0
- package/src/lib/token-tracker.js +336 -0
- package/src/lib/trust-security.js +343 -0
- package/src/lib/ueba.js +340 -0
- package/src/lib/universal-runtime.js +330 -0
- package/src/lib/wallet-manager.js +336 -0
- package/src/lib/workflow-engine.js +330 -0
|
@@ -591,3 +591,337 @@ export function _resetStateSessionManagerV2() {
|
|
|
591
591
|
_convIdleMsV2 = SESSION_DEFAULT_CONV_IDLE_MS;
|
|
592
592
|
_turnStuckMsV2 = SESSION_DEFAULT_TURN_STUCK_MS;
|
|
593
593
|
}
|
|
594
|
+
|
|
595
|
+
// =====================================================================
|
|
596
|
+
// session-manager V2 governance overlay (iter21)
|
|
597
|
+
// =====================================================================
|
|
598
|
+
export const SESGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
599
|
+
PENDING: "pending",
|
|
600
|
+
ACTIVE: "active",
|
|
601
|
+
PAUSED: "paused",
|
|
602
|
+
ARCHIVED: "archived",
|
|
603
|
+
});
|
|
604
|
+
export const SESGOV_TURN_LIFECYCLE_V2 = Object.freeze({
|
|
605
|
+
QUEUED: "queued",
|
|
606
|
+
ADVANCING: "advancing",
|
|
607
|
+
ADVANCED: "advanced",
|
|
608
|
+
FAILED: "failed",
|
|
609
|
+
CANCELLED: "cancelled",
|
|
610
|
+
});
|
|
611
|
+
const _sesgovPTrans = new Map([
|
|
612
|
+
[
|
|
613
|
+
SESGOV_PROFILE_MATURITY_V2.PENDING,
|
|
614
|
+
new Set([
|
|
615
|
+
SESGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
616
|
+
SESGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
617
|
+
]),
|
|
618
|
+
],
|
|
619
|
+
[
|
|
620
|
+
SESGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
621
|
+
new Set([
|
|
622
|
+
SESGOV_PROFILE_MATURITY_V2.PAUSED,
|
|
623
|
+
SESGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
624
|
+
]),
|
|
625
|
+
],
|
|
626
|
+
[
|
|
627
|
+
SESGOV_PROFILE_MATURITY_V2.PAUSED,
|
|
628
|
+
new Set([
|
|
629
|
+
SESGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
630
|
+
SESGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
631
|
+
]),
|
|
632
|
+
],
|
|
633
|
+
[SESGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
634
|
+
]);
|
|
635
|
+
const _sesgovPTerminal = new Set([SESGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
636
|
+
const _sesgovJTrans = new Map([
|
|
637
|
+
[
|
|
638
|
+
SESGOV_TURN_LIFECYCLE_V2.QUEUED,
|
|
639
|
+
new Set([
|
|
640
|
+
SESGOV_TURN_LIFECYCLE_V2.ADVANCING,
|
|
641
|
+
SESGOV_TURN_LIFECYCLE_V2.CANCELLED,
|
|
642
|
+
]),
|
|
643
|
+
],
|
|
644
|
+
[
|
|
645
|
+
SESGOV_TURN_LIFECYCLE_V2.ADVANCING,
|
|
646
|
+
new Set([
|
|
647
|
+
SESGOV_TURN_LIFECYCLE_V2.ADVANCED,
|
|
648
|
+
SESGOV_TURN_LIFECYCLE_V2.FAILED,
|
|
649
|
+
SESGOV_TURN_LIFECYCLE_V2.CANCELLED,
|
|
650
|
+
]),
|
|
651
|
+
],
|
|
652
|
+
[SESGOV_TURN_LIFECYCLE_V2.ADVANCED, new Set()],
|
|
653
|
+
[SESGOV_TURN_LIFECYCLE_V2.FAILED, new Set()],
|
|
654
|
+
[SESGOV_TURN_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
655
|
+
]);
|
|
656
|
+
const _sesgovPsV2 = new Map();
|
|
657
|
+
const _sesgovJsV2 = new Map();
|
|
658
|
+
let _sesgovMaxActive = 8,
|
|
659
|
+
_sesgovMaxPending = 20,
|
|
660
|
+
_sesgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
661
|
+
_sesgovStuckMs = 60 * 1000;
|
|
662
|
+
function _sesgovPos(n, label) {
|
|
663
|
+
const v = Math.floor(Number(n));
|
|
664
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
665
|
+
throw new Error(`${label} must be positive integer`);
|
|
666
|
+
return v;
|
|
667
|
+
}
|
|
668
|
+
function _sesgovCheckP(from, to) {
|
|
669
|
+
const a = _sesgovPTrans.get(from);
|
|
670
|
+
if (!a || !a.has(to))
|
|
671
|
+
throw new Error(`invalid sesgov profile transition ${from} → ${to}`);
|
|
672
|
+
}
|
|
673
|
+
function _sesgovCheckJ(from, to) {
|
|
674
|
+
const a = _sesgovJTrans.get(from);
|
|
675
|
+
if (!a || !a.has(to))
|
|
676
|
+
throw new Error(`invalid sesgov turn transition ${from} → ${to}`);
|
|
677
|
+
}
|
|
678
|
+
function _sesgovCountActive(owner) {
|
|
679
|
+
let c = 0;
|
|
680
|
+
for (const p of _sesgovPsV2.values())
|
|
681
|
+
if (p.owner === owner && p.status === SESGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
682
|
+
c++;
|
|
683
|
+
return c;
|
|
684
|
+
}
|
|
685
|
+
function _sesgovCountPending(profileId) {
|
|
686
|
+
let c = 0;
|
|
687
|
+
for (const j of _sesgovJsV2.values())
|
|
688
|
+
if (
|
|
689
|
+
j.profileId === profileId &&
|
|
690
|
+
(j.status === SESGOV_TURN_LIFECYCLE_V2.QUEUED ||
|
|
691
|
+
j.status === SESGOV_TURN_LIFECYCLE_V2.ADVANCING)
|
|
692
|
+
)
|
|
693
|
+
c++;
|
|
694
|
+
return c;
|
|
695
|
+
}
|
|
696
|
+
export function setMaxActiveSesgovProfilesPerOwnerV2(n) {
|
|
697
|
+
_sesgovMaxActive = _sesgovPos(n, "maxActiveSesgovProfilesPerOwner");
|
|
698
|
+
}
|
|
699
|
+
export function getMaxActiveSesgovProfilesPerOwnerV2() {
|
|
700
|
+
return _sesgovMaxActive;
|
|
701
|
+
}
|
|
702
|
+
export function setMaxPendingSesgovTurnsPerProfileV2(n) {
|
|
703
|
+
_sesgovMaxPending = _sesgovPos(n, "maxPendingSesgovTurnsPerProfile");
|
|
704
|
+
}
|
|
705
|
+
export function getMaxPendingSesgovTurnsPerProfileV2() {
|
|
706
|
+
return _sesgovMaxPending;
|
|
707
|
+
}
|
|
708
|
+
export function setSesgovProfileIdleMsV2(n) {
|
|
709
|
+
_sesgovIdleMs = _sesgovPos(n, "sesgovProfileIdleMs");
|
|
710
|
+
}
|
|
711
|
+
export function getSesgovProfileIdleMsV2() {
|
|
712
|
+
return _sesgovIdleMs;
|
|
713
|
+
}
|
|
714
|
+
export function setSesgovTurnStuckMsV2(n) {
|
|
715
|
+
_sesgovStuckMs = _sesgovPos(n, "sesgovTurnStuckMs");
|
|
716
|
+
}
|
|
717
|
+
export function getSesgovTurnStuckMsV2() {
|
|
718
|
+
return _sesgovStuckMs;
|
|
719
|
+
}
|
|
720
|
+
export function _resetStateSessionManagerGovV2() {
|
|
721
|
+
_sesgovPsV2.clear();
|
|
722
|
+
_sesgovJsV2.clear();
|
|
723
|
+
_sesgovMaxActive = 8;
|
|
724
|
+
_sesgovMaxPending = 20;
|
|
725
|
+
_sesgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
726
|
+
_sesgovStuckMs = 60 * 1000;
|
|
727
|
+
}
|
|
728
|
+
export function registerSesgovProfileV2({ id, owner, channel, metadata } = {}) {
|
|
729
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
730
|
+
if (_sesgovPsV2.has(id))
|
|
731
|
+
throw new Error(`sesgov profile ${id} already exists`);
|
|
732
|
+
const now = Date.now();
|
|
733
|
+
const p = {
|
|
734
|
+
id,
|
|
735
|
+
owner,
|
|
736
|
+
channel: channel || "default",
|
|
737
|
+
status: SESGOV_PROFILE_MATURITY_V2.PENDING,
|
|
738
|
+
createdAt: now,
|
|
739
|
+
updatedAt: now,
|
|
740
|
+
lastTouchedAt: now,
|
|
741
|
+
activatedAt: null,
|
|
742
|
+
archivedAt: null,
|
|
743
|
+
metadata: { ...(metadata || {}) },
|
|
744
|
+
};
|
|
745
|
+
_sesgovPsV2.set(id, p);
|
|
746
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
747
|
+
}
|
|
748
|
+
export function activateSesgovProfileV2(id) {
|
|
749
|
+
const p = _sesgovPsV2.get(id);
|
|
750
|
+
if (!p) throw new Error(`sesgov profile ${id} not found`);
|
|
751
|
+
const isInitial = p.status === SESGOV_PROFILE_MATURITY_V2.PENDING;
|
|
752
|
+
_sesgovCheckP(p.status, SESGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
753
|
+
if (isInitial && _sesgovCountActive(p.owner) >= _sesgovMaxActive)
|
|
754
|
+
throw new Error(`max active sesgov profiles for owner ${p.owner} reached`);
|
|
755
|
+
const now = Date.now();
|
|
756
|
+
p.status = SESGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
757
|
+
p.updatedAt = now;
|
|
758
|
+
p.lastTouchedAt = now;
|
|
759
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
760
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
761
|
+
}
|
|
762
|
+
export function pauseSesgovProfileV2(id) {
|
|
763
|
+
const p = _sesgovPsV2.get(id);
|
|
764
|
+
if (!p) throw new Error(`sesgov profile ${id} not found`);
|
|
765
|
+
_sesgovCheckP(p.status, SESGOV_PROFILE_MATURITY_V2.PAUSED);
|
|
766
|
+
p.status = SESGOV_PROFILE_MATURITY_V2.PAUSED;
|
|
767
|
+
p.updatedAt = Date.now();
|
|
768
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
769
|
+
}
|
|
770
|
+
export function archiveSesgovProfileV2(id) {
|
|
771
|
+
const p = _sesgovPsV2.get(id);
|
|
772
|
+
if (!p) throw new Error(`sesgov profile ${id} not found`);
|
|
773
|
+
_sesgovCheckP(p.status, SESGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
774
|
+
const now = Date.now();
|
|
775
|
+
p.status = SESGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
776
|
+
p.updatedAt = now;
|
|
777
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
778
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
779
|
+
}
|
|
780
|
+
export function touchSesgovProfileV2(id) {
|
|
781
|
+
const p = _sesgovPsV2.get(id);
|
|
782
|
+
if (!p) throw new Error(`sesgov profile ${id} not found`);
|
|
783
|
+
if (_sesgovPTerminal.has(p.status))
|
|
784
|
+
throw new Error(`cannot touch terminal sesgov profile ${id}`);
|
|
785
|
+
const now = Date.now();
|
|
786
|
+
p.lastTouchedAt = now;
|
|
787
|
+
p.updatedAt = now;
|
|
788
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
789
|
+
}
|
|
790
|
+
export function getSesgovProfileV2(id) {
|
|
791
|
+
const p = _sesgovPsV2.get(id);
|
|
792
|
+
if (!p) return null;
|
|
793
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
794
|
+
}
|
|
795
|
+
export function listSesgovProfilesV2() {
|
|
796
|
+
return [..._sesgovPsV2.values()].map((p) => ({
|
|
797
|
+
...p,
|
|
798
|
+
metadata: { ...p.metadata },
|
|
799
|
+
}));
|
|
800
|
+
}
|
|
801
|
+
export function createSesgovTurnV2({ id, profileId, topic, metadata } = {}) {
|
|
802
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
803
|
+
if (_sesgovJsV2.has(id)) throw new Error(`sesgov turn ${id} already exists`);
|
|
804
|
+
if (!_sesgovPsV2.has(profileId))
|
|
805
|
+
throw new Error(`sesgov profile ${profileId} not found`);
|
|
806
|
+
if (_sesgovCountPending(profileId) >= _sesgovMaxPending)
|
|
807
|
+
throw new Error(
|
|
808
|
+
`max pending sesgov turns for profile ${profileId} reached`,
|
|
809
|
+
);
|
|
810
|
+
const now = Date.now();
|
|
811
|
+
const j = {
|
|
812
|
+
id,
|
|
813
|
+
profileId,
|
|
814
|
+
topic: topic || "",
|
|
815
|
+
status: SESGOV_TURN_LIFECYCLE_V2.QUEUED,
|
|
816
|
+
createdAt: now,
|
|
817
|
+
updatedAt: now,
|
|
818
|
+
startedAt: null,
|
|
819
|
+
settledAt: null,
|
|
820
|
+
metadata: { ...(metadata || {}) },
|
|
821
|
+
};
|
|
822
|
+
_sesgovJsV2.set(id, j);
|
|
823
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
824
|
+
}
|
|
825
|
+
export function advancingSesgovTurnV2(id) {
|
|
826
|
+
const j = _sesgovJsV2.get(id);
|
|
827
|
+
if (!j) throw new Error(`sesgov turn ${id} not found`);
|
|
828
|
+
_sesgovCheckJ(j.status, SESGOV_TURN_LIFECYCLE_V2.ADVANCING);
|
|
829
|
+
const now = Date.now();
|
|
830
|
+
j.status = SESGOV_TURN_LIFECYCLE_V2.ADVANCING;
|
|
831
|
+
j.updatedAt = now;
|
|
832
|
+
if (!j.startedAt) j.startedAt = now;
|
|
833
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
834
|
+
}
|
|
835
|
+
export function completeTurnSesgovV2(id) {
|
|
836
|
+
const j = _sesgovJsV2.get(id);
|
|
837
|
+
if (!j) throw new Error(`sesgov turn ${id} not found`);
|
|
838
|
+
_sesgovCheckJ(j.status, SESGOV_TURN_LIFECYCLE_V2.ADVANCED);
|
|
839
|
+
const now = Date.now();
|
|
840
|
+
j.status = SESGOV_TURN_LIFECYCLE_V2.ADVANCED;
|
|
841
|
+
j.updatedAt = now;
|
|
842
|
+
if (!j.settledAt) j.settledAt = now;
|
|
843
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
844
|
+
}
|
|
845
|
+
export function failSesgovTurnV2(id, reason) {
|
|
846
|
+
const j = _sesgovJsV2.get(id);
|
|
847
|
+
if (!j) throw new Error(`sesgov turn ${id} not found`);
|
|
848
|
+
_sesgovCheckJ(j.status, SESGOV_TURN_LIFECYCLE_V2.FAILED);
|
|
849
|
+
const now = Date.now();
|
|
850
|
+
j.status = SESGOV_TURN_LIFECYCLE_V2.FAILED;
|
|
851
|
+
j.updatedAt = now;
|
|
852
|
+
if (!j.settledAt) j.settledAt = now;
|
|
853
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
854
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
855
|
+
}
|
|
856
|
+
export function cancelSesgovTurnV2(id, reason) {
|
|
857
|
+
const j = _sesgovJsV2.get(id);
|
|
858
|
+
if (!j) throw new Error(`sesgov turn ${id} not found`);
|
|
859
|
+
_sesgovCheckJ(j.status, SESGOV_TURN_LIFECYCLE_V2.CANCELLED);
|
|
860
|
+
const now = Date.now();
|
|
861
|
+
j.status = SESGOV_TURN_LIFECYCLE_V2.CANCELLED;
|
|
862
|
+
j.updatedAt = now;
|
|
863
|
+
if (!j.settledAt) j.settledAt = now;
|
|
864
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
865
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
866
|
+
}
|
|
867
|
+
export function getSesgovTurnV2(id) {
|
|
868
|
+
const j = _sesgovJsV2.get(id);
|
|
869
|
+
if (!j) return null;
|
|
870
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
871
|
+
}
|
|
872
|
+
export function listSesgovTurnsV2() {
|
|
873
|
+
return [..._sesgovJsV2.values()].map((j) => ({
|
|
874
|
+
...j,
|
|
875
|
+
metadata: { ...j.metadata },
|
|
876
|
+
}));
|
|
877
|
+
}
|
|
878
|
+
export function autoPauseIdleSesgovProfilesV2({ now } = {}) {
|
|
879
|
+
const t = now ?? Date.now();
|
|
880
|
+
const flipped = [];
|
|
881
|
+
for (const p of _sesgovPsV2.values())
|
|
882
|
+
if (
|
|
883
|
+
p.status === SESGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
884
|
+
t - p.lastTouchedAt >= _sesgovIdleMs
|
|
885
|
+
) {
|
|
886
|
+
p.status = SESGOV_PROFILE_MATURITY_V2.PAUSED;
|
|
887
|
+
p.updatedAt = t;
|
|
888
|
+
flipped.push(p.id);
|
|
889
|
+
}
|
|
890
|
+
return { flipped, count: flipped.length };
|
|
891
|
+
}
|
|
892
|
+
export function autoFailStuckSesgovTurnsV2({ now } = {}) {
|
|
893
|
+
const t = now ?? Date.now();
|
|
894
|
+
const flipped = [];
|
|
895
|
+
for (const j of _sesgovJsV2.values())
|
|
896
|
+
if (
|
|
897
|
+
j.status === SESGOV_TURN_LIFECYCLE_V2.ADVANCING &&
|
|
898
|
+
j.startedAt != null &&
|
|
899
|
+
t - j.startedAt >= _sesgovStuckMs
|
|
900
|
+
) {
|
|
901
|
+
j.status = SESGOV_TURN_LIFECYCLE_V2.FAILED;
|
|
902
|
+
j.updatedAt = t;
|
|
903
|
+
if (!j.settledAt) j.settledAt = t;
|
|
904
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
905
|
+
flipped.push(j.id);
|
|
906
|
+
}
|
|
907
|
+
return { flipped, count: flipped.length };
|
|
908
|
+
}
|
|
909
|
+
export function getSessionManagerGovStatsV2() {
|
|
910
|
+
const profilesByStatus = {};
|
|
911
|
+
for (const v of Object.values(SESGOV_PROFILE_MATURITY_V2))
|
|
912
|
+
profilesByStatus[v] = 0;
|
|
913
|
+
for (const p of _sesgovPsV2.values()) profilesByStatus[p.status]++;
|
|
914
|
+
const turnsByStatus = {};
|
|
915
|
+
for (const v of Object.values(SESGOV_TURN_LIFECYCLE_V2)) turnsByStatus[v] = 0;
|
|
916
|
+
for (const j of _sesgovJsV2.values()) turnsByStatus[j.status]++;
|
|
917
|
+
return {
|
|
918
|
+
totalSesgovProfilesV2: _sesgovPsV2.size,
|
|
919
|
+
totalSesgovTurnsV2: _sesgovJsV2.size,
|
|
920
|
+
maxActiveSesgovProfilesPerOwner: _sesgovMaxActive,
|
|
921
|
+
maxPendingSesgovTurnsPerProfile: _sesgovMaxPending,
|
|
922
|
+
sesgovProfileIdleMs: _sesgovIdleMs,
|
|
923
|
+
sesgovTurnStuckMs: _sesgovStuckMs,
|
|
924
|
+
profilesByStatus,
|
|
925
|
+
turnsByStatus,
|
|
926
|
+
};
|
|
927
|
+
}
|
package/src/lib/skill-loader.js
CHANGED
|
@@ -733,3 +733,337 @@ export function _resetStateSkillLoaderV2() {
|
|
|
733
733
|
_stateV2.skillIdleMs = SKILL_DEFAULT_SKILL_IDLE_MS;
|
|
734
734
|
_stateV2.execStuckMs = SKILL_DEFAULT_EXEC_STUCK_MS;
|
|
735
735
|
}
|
|
736
|
+
|
|
737
|
+
// =====================================================================
|
|
738
|
+
// skill-loader V2 governance overlay (iter24)
|
|
739
|
+
// =====================================================================
|
|
740
|
+
export const SKLGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
741
|
+
PENDING: "pending",
|
|
742
|
+
ACTIVE: "active",
|
|
743
|
+
STALE: "stale",
|
|
744
|
+
ARCHIVED: "archived",
|
|
745
|
+
});
|
|
746
|
+
export const SKLGOV_LOAD_LIFECYCLE_V2 = Object.freeze({
|
|
747
|
+
QUEUED: "queued",
|
|
748
|
+
LOADING: "loading",
|
|
749
|
+
LOADED: "loaded",
|
|
750
|
+
FAILED: "failed",
|
|
751
|
+
CANCELLED: "cancelled",
|
|
752
|
+
});
|
|
753
|
+
const _sklgovPTrans = new Map([
|
|
754
|
+
[
|
|
755
|
+
SKLGOV_PROFILE_MATURITY_V2.PENDING,
|
|
756
|
+
new Set([
|
|
757
|
+
SKLGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
758
|
+
SKLGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
759
|
+
]),
|
|
760
|
+
],
|
|
761
|
+
[
|
|
762
|
+
SKLGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
763
|
+
new Set([
|
|
764
|
+
SKLGOV_PROFILE_MATURITY_V2.STALE,
|
|
765
|
+
SKLGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
766
|
+
]),
|
|
767
|
+
],
|
|
768
|
+
[
|
|
769
|
+
SKLGOV_PROFILE_MATURITY_V2.STALE,
|
|
770
|
+
new Set([
|
|
771
|
+
SKLGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
772
|
+
SKLGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
773
|
+
]),
|
|
774
|
+
],
|
|
775
|
+
[SKLGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
776
|
+
]);
|
|
777
|
+
const _sklgovPTerminal = new Set([SKLGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
778
|
+
const _sklgovJTrans = new Map([
|
|
779
|
+
[
|
|
780
|
+
SKLGOV_LOAD_LIFECYCLE_V2.QUEUED,
|
|
781
|
+
new Set([
|
|
782
|
+
SKLGOV_LOAD_LIFECYCLE_V2.LOADING,
|
|
783
|
+
SKLGOV_LOAD_LIFECYCLE_V2.CANCELLED,
|
|
784
|
+
]),
|
|
785
|
+
],
|
|
786
|
+
[
|
|
787
|
+
SKLGOV_LOAD_LIFECYCLE_V2.LOADING,
|
|
788
|
+
new Set([
|
|
789
|
+
SKLGOV_LOAD_LIFECYCLE_V2.LOADED,
|
|
790
|
+
SKLGOV_LOAD_LIFECYCLE_V2.FAILED,
|
|
791
|
+
SKLGOV_LOAD_LIFECYCLE_V2.CANCELLED,
|
|
792
|
+
]),
|
|
793
|
+
],
|
|
794
|
+
[SKLGOV_LOAD_LIFECYCLE_V2.LOADED, new Set()],
|
|
795
|
+
[SKLGOV_LOAD_LIFECYCLE_V2.FAILED, new Set()],
|
|
796
|
+
[SKLGOV_LOAD_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
797
|
+
]);
|
|
798
|
+
const _sklgovPsV2 = new Map();
|
|
799
|
+
const _sklgovJsV2 = new Map();
|
|
800
|
+
let _sklgovMaxActive = 10,
|
|
801
|
+
_sklgovMaxPending = 25,
|
|
802
|
+
_sklgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
803
|
+
_sklgovStuckMs = 60 * 1000;
|
|
804
|
+
function _sklgovPos(n, label) {
|
|
805
|
+
const v = Math.floor(Number(n));
|
|
806
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
807
|
+
throw new Error(`${label} must be positive integer`);
|
|
808
|
+
return v;
|
|
809
|
+
}
|
|
810
|
+
function _sklgovCheckP(from, to) {
|
|
811
|
+
const a = _sklgovPTrans.get(from);
|
|
812
|
+
if (!a || !a.has(to))
|
|
813
|
+
throw new Error(`invalid sklgov profile transition ${from} → ${to}`);
|
|
814
|
+
}
|
|
815
|
+
function _sklgovCheckJ(from, to) {
|
|
816
|
+
const a = _sklgovJTrans.get(from);
|
|
817
|
+
if (!a || !a.has(to))
|
|
818
|
+
throw new Error(`invalid sklgov load transition ${from} → ${to}`);
|
|
819
|
+
}
|
|
820
|
+
function _sklgovCountActive(owner) {
|
|
821
|
+
let c = 0;
|
|
822
|
+
for (const p of _sklgovPsV2.values())
|
|
823
|
+
if (p.owner === owner && p.status === SKLGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
824
|
+
c++;
|
|
825
|
+
return c;
|
|
826
|
+
}
|
|
827
|
+
function _sklgovCountPending(profileId) {
|
|
828
|
+
let c = 0;
|
|
829
|
+
for (const j of _sklgovJsV2.values())
|
|
830
|
+
if (
|
|
831
|
+
j.profileId === profileId &&
|
|
832
|
+
(j.status === SKLGOV_LOAD_LIFECYCLE_V2.QUEUED ||
|
|
833
|
+
j.status === SKLGOV_LOAD_LIFECYCLE_V2.LOADING)
|
|
834
|
+
)
|
|
835
|
+
c++;
|
|
836
|
+
return c;
|
|
837
|
+
}
|
|
838
|
+
export function setMaxActiveSklgovProfilesPerOwnerV2(n) {
|
|
839
|
+
_sklgovMaxActive = _sklgovPos(n, "maxActiveSklgovProfilesPerOwner");
|
|
840
|
+
}
|
|
841
|
+
export function getMaxActiveSklgovProfilesPerOwnerV2() {
|
|
842
|
+
return _sklgovMaxActive;
|
|
843
|
+
}
|
|
844
|
+
export function setMaxPendingSklgovLoadsPerProfileV2(n) {
|
|
845
|
+
_sklgovMaxPending = _sklgovPos(n, "maxPendingSklgovLoadsPerProfile");
|
|
846
|
+
}
|
|
847
|
+
export function getMaxPendingSklgovLoadsPerProfileV2() {
|
|
848
|
+
return _sklgovMaxPending;
|
|
849
|
+
}
|
|
850
|
+
export function setSklgovProfileIdleMsV2(n) {
|
|
851
|
+
_sklgovIdleMs = _sklgovPos(n, "sklgovProfileIdleMs");
|
|
852
|
+
}
|
|
853
|
+
export function getSklgovProfileIdleMsV2() {
|
|
854
|
+
return _sklgovIdleMs;
|
|
855
|
+
}
|
|
856
|
+
export function setSklgovLoadStuckMsV2(n) {
|
|
857
|
+
_sklgovStuckMs = _sklgovPos(n, "sklgovLoadStuckMs");
|
|
858
|
+
}
|
|
859
|
+
export function getSklgovLoadStuckMsV2() {
|
|
860
|
+
return _sklgovStuckMs;
|
|
861
|
+
}
|
|
862
|
+
export function _resetStateSkillLoaderGovV2() {
|
|
863
|
+
_sklgovPsV2.clear();
|
|
864
|
+
_sklgovJsV2.clear();
|
|
865
|
+
_sklgovMaxActive = 10;
|
|
866
|
+
_sklgovMaxPending = 25;
|
|
867
|
+
_sklgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
868
|
+
_sklgovStuckMs = 60 * 1000;
|
|
869
|
+
}
|
|
870
|
+
export function registerSklgovProfileV2({ id, owner, source, metadata } = {}) {
|
|
871
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
872
|
+
if (_sklgovPsV2.has(id))
|
|
873
|
+
throw new Error(`sklgov profile ${id} already exists`);
|
|
874
|
+
const now = Date.now();
|
|
875
|
+
const p = {
|
|
876
|
+
id,
|
|
877
|
+
owner,
|
|
878
|
+
source: source || "local",
|
|
879
|
+
status: SKLGOV_PROFILE_MATURITY_V2.PENDING,
|
|
880
|
+
createdAt: now,
|
|
881
|
+
updatedAt: now,
|
|
882
|
+
lastTouchedAt: now,
|
|
883
|
+
activatedAt: null,
|
|
884
|
+
archivedAt: null,
|
|
885
|
+
metadata: { ...(metadata || {}) },
|
|
886
|
+
};
|
|
887
|
+
_sklgovPsV2.set(id, p);
|
|
888
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
889
|
+
}
|
|
890
|
+
export function activateSklgovProfileV2(id) {
|
|
891
|
+
const p = _sklgovPsV2.get(id);
|
|
892
|
+
if (!p) throw new Error(`sklgov profile ${id} not found`);
|
|
893
|
+
const isInitial = p.status === SKLGOV_PROFILE_MATURITY_V2.PENDING;
|
|
894
|
+
_sklgovCheckP(p.status, SKLGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
895
|
+
if (isInitial && _sklgovCountActive(p.owner) >= _sklgovMaxActive)
|
|
896
|
+
throw new Error(`max active sklgov profiles for owner ${p.owner} reached`);
|
|
897
|
+
const now = Date.now();
|
|
898
|
+
p.status = SKLGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
899
|
+
p.updatedAt = now;
|
|
900
|
+
p.lastTouchedAt = now;
|
|
901
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
902
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
903
|
+
}
|
|
904
|
+
export function staleSklgovProfileV2(id) {
|
|
905
|
+
const p = _sklgovPsV2.get(id);
|
|
906
|
+
if (!p) throw new Error(`sklgov profile ${id} not found`);
|
|
907
|
+
_sklgovCheckP(p.status, SKLGOV_PROFILE_MATURITY_V2.STALE);
|
|
908
|
+
p.status = SKLGOV_PROFILE_MATURITY_V2.STALE;
|
|
909
|
+
p.updatedAt = Date.now();
|
|
910
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
911
|
+
}
|
|
912
|
+
export function archiveSklgovProfileV2(id) {
|
|
913
|
+
const p = _sklgovPsV2.get(id);
|
|
914
|
+
if (!p) throw new Error(`sklgov profile ${id} not found`);
|
|
915
|
+
_sklgovCheckP(p.status, SKLGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
916
|
+
const now = Date.now();
|
|
917
|
+
p.status = SKLGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
918
|
+
p.updatedAt = now;
|
|
919
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
920
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
921
|
+
}
|
|
922
|
+
export function touchSklgovProfileV2(id) {
|
|
923
|
+
const p = _sklgovPsV2.get(id);
|
|
924
|
+
if (!p) throw new Error(`sklgov profile ${id} not found`);
|
|
925
|
+
if (_sklgovPTerminal.has(p.status))
|
|
926
|
+
throw new Error(`cannot touch terminal sklgov profile ${id}`);
|
|
927
|
+
const now = Date.now();
|
|
928
|
+
p.lastTouchedAt = now;
|
|
929
|
+
p.updatedAt = now;
|
|
930
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
931
|
+
}
|
|
932
|
+
export function getSklgovProfileV2(id) {
|
|
933
|
+
const p = _sklgovPsV2.get(id);
|
|
934
|
+
if (!p) return null;
|
|
935
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
936
|
+
}
|
|
937
|
+
export function listSklgovProfilesV2() {
|
|
938
|
+
return [..._sklgovPsV2.values()].map((p) => ({
|
|
939
|
+
...p,
|
|
940
|
+
metadata: { ...p.metadata },
|
|
941
|
+
}));
|
|
942
|
+
}
|
|
943
|
+
export function createSklgovLoadV2({ id, profileId, skillId, metadata } = {}) {
|
|
944
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
945
|
+
if (_sklgovJsV2.has(id)) throw new Error(`sklgov load ${id} already exists`);
|
|
946
|
+
if (!_sklgovPsV2.has(profileId))
|
|
947
|
+
throw new Error(`sklgov profile ${profileId} not found`);
|
|
948
|
+
if (_sklgovCountPending(profileId) >= _sklgovMaxPending)
|
|
949
|
+
throw new Error(
|
|
950
|
+
`max pending sklgov loads for profile ${profileId} reached`,
|
|
951
|
+
);
|
|
952
|
+
const now = Date.now();
|
|
953
|
+
const j = {
|
|
954
|
+
id,
|
|
955
|
+
profileId,
|
|
956
|
+
skillId: skillId || "",
|
|
957
|
+
status: SKLGOV_LOAD_LIFECYCLE_V2.QUEUED,
|
|
958
|
+
createdAt: now,
|
|
959
|
+
updatedAt: now,
|
|
960
|
+
startedAt: null,
|
|
961
|
+
settledAt: null,
|
|
962
|
+
metadata: { ...(metadata || {}) },
|
|
963
|
+
};
|
|
964
|
+
_sklgovJsV2.set(id, j);
|
|
965
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
966
|
+
}
|
|
967
|
+
export function loadingSklgovLoadV2(id) {
|
|
968
|
+
const j = _sklgovJsV2.get(id);
|
|
969
|
+
if (!j) throw new Error(`sklgov load ${id} not found`);
|
|
970
|
+
_sklgovCheckJ(j.status, SKLGOV_LOAD_LIFECYCLE_V2.LOADING);
|
|
971
|
+
const now = Date.now();
|
|
972
|
+
j.status = SKLGOV_LOAD_LIFECYCLE_V2.LOADING;
|
|
973
|
+
j.updatedAt = now;
|
|
974
|
+
if (!j.startedAt) j.startedAt = now;
|
|
975
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
976
|
+
}
|
|
977
|
+
export function completeLoadSklgovV2(id) {
|
|
978
|
+
const j = _sklgovJsV2.get(id);
|
|
979
|
+
if (!j) throw new Error(`sklgov load ${id} not found`);
|
|
980
|
+
_sklgovCheckJ(j.status, SKLGOV_LOAD_LIFECYCLE_V2.LOADED);
|
|
981
|
+
const now = Date.now();
|
|
982
|
+
j.status = SKLGOV_LOAD_LIFECYCLE_V2.LOADED;
|
|
983
|
+
j.updatedAt = now;
|
|
984
|
+
if (!j.settledAt) j.settledAt = now;
|
|
985
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
986
|
+
}
|
|
987
|
+
export function failSklgovLoadV2(id, reason) {
|
|
988
|
+
const j = _sklgovJsV2.get(id);
|
|
989
|
+
if (!j) throw new Error(`sklgov load ${id} not found`);
|
|
990
|
+
_sklgovCheckJ(j.status, SKLGOV_LOAD_LIFECYCLE_V2.FAILED);
|
|
991
|
+
const now = Date.now();
|
|
992
|
+
j.status = SKLGOV_LOAD_LIFECYCLE_V2.FAILED;
|
|
993
|
+
j.updatedAt = now;
|
|
994
|
+
if (!j.settledAt) j.settledAt = now;
|
|
995
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
996
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
997
|
+
}
|
|
998
|
+
export function cancelSklgovLoadV2(id, reason) {
|
|
999
|
+
const j = _sklgovJsV2.get(id);
|
|
1000
|
+
if (!j) throw new Error(`sklgov load ${id} not found`);
|
|
1001
|
+
_sklgovCheckJ(j.status, SKLGOV_LOAD_LIFECYCLE_V2.CANCELLED);
|
|
1002
|
+
const now = Date.now();
|
|
1003
|
+
j.status = SKLGOV_LOAD_LIFECYCLE_V2.CANCELLED;
|
|
1004
|
+
j.updatedAt = now;
|
|
1005
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1006
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1007
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1008
|
+
}
|
|
1009
|
+
export function getSklgovLoadV2(id) {
|
|
1010
|
+
const j = _sklgovJsV2.get(id);
|
|
1011
|
+
if (!j) return null;
|
|
1012
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1013
|
+
}
|
|
1014
|
+
export function listSklgovLoadsV2() {
|
|
1015
|
+
return [..._sklgovJsV2.values()].map((j) => ({
|
|
1016
|
+
...j,
|
|
1017
|
+
metadata: { ...j.metadata },
|
|
1018
|
+
}));
|
|
1019
|
+
}
|
|
1020
|
+
export function autoStaleIdleSklgovProfilesV2({ now } = {}) {
|
|
1021
|
+
const t = now ?? Date.now();
|
|
1022
|
+
const flipped = [];
|
|
1023
|
+
for (const p of _sklgovPsV2.values())
|
|
1024
|
+
if (
|
|
1025
|
+
p.status === SKLGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1026
|
+
t - p.lastTouchedAt >= _sklgovIdleMs
|
|
1027
|
+
) {
|
|
1028
|
+
p.status = SKLGOV_PROFILE_MATURITY_V2.STALE;
|
|
1029
|
+
p.updatedAt = t;
|
|
1030
|
+
flipped.push(p.id);
|
|
1031
|
+
}
|
|
1032
|
+
return { flipped, count: flipped.length };
|
|
1033
|
+
}
|
|
1034
|
+
export function autoFailStuckSklgovLoadsV2({ now } = {}) {
|
|
1035
|
+
const t = now ?? Date.now();
|
|
1036
|
+
const flipped = [];
|
|
1037
|
+
for (const j of _sklgovJsV2.values())
|
|
1038
|
+
if (
|
|
1039
|
+
j.status === SKLGOV_LOAD_LIFECYCLE_V2.LOADING &&
|
|
1040
|
+
j.startedAt != null &&
|
|
1041
|
+
t - j.startedAt >= _sklgovStuckMs
|
|
1042
|
+
) {
|
|
1043
|
+
j.status = SKLGOV_LOAD_LIFECYCLE_V2.FAILED;
|
|
1044
|
+
j.updatedAt = t;
|
|
1045
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1046
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1047
|
+
flipped.push(j.id);
|
|
1048
|
+
}
|
|
1049
|
+
return { flipped, count: flipped.length };
|
|
1050
|
+
}
|
|
1051
|
+
export function getSkillLoaderGovStatsV2() {
|
|
1052
|
+
const profilesByStatus = {};
|
|
1053
|
+
for (const v of Object.values(SKLGOV_PROFILE_MATURITY_V2))
|
|
1054
|
+
profilesByStatus[v] = 0;
|
|
1055
|
+
for (const p of _sklgovPsV2.values()) profilesByStatus[p.status]++;
|
|
1056
|
+
const loadsByStatus = {};
|
|
1057
|
+
for (const v of Object.values(SKLGOV_LOAD_LIFECYCLE_V2)) loadsByStatus[v] = 0;
|
|
1058
|
+
for (const j of _sklgovJsV2.values()) loadsByStatus[j.status]++;
|
|
1059
|
+
return {
|
|
1060
|
+
totalSklgovProfilesV2: _sklgovPsV2.size,
|
|
1061
|
+
totalSklgovLoadsV2: _sklgovJsV2.size,
|
|
1062
|
+
maxActiveSklgovProfilesPerOwner: _sklgovMaxActive,
|
|
1063
|
+
maxPendingSklgovLoadsPerProfile: _sklgovMaxPending,
|
|
1064
|
+
sklgovProfileIdleMs: _sklgovIdleMs,
|
|
1065
|
+
sklgovLoadStuckMs: _sklgovStuckMs,
|
|
1066
|
+
profilesByStatus,
|
|
1067
|
+
loadsByStatus,
|
|
1068
|
+
};
|
|
1069
|
+
}
|