chainlesschain 0.143.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 +196 -28
- package/src/commands/activitypub.js +157 -27
- package/src/commands/agent.js +587 -103
- package/src/commands/audit.js +206 -0
- package/src/commands/bi.js +152 -27
- package/src/commands/bm25.js +111 -27
- package/src/commands/browse.js +190 -29
- package/src/commands/ccron.js +128 -28
- package/src/commands/chat.js +207 -0
- package/src/commands/compliance.js +414 -34
- package/src/commands/compt.js +127 -29
- package/src/commands/consol.js +8 -2
- package/src/commands/cowork.js +580 -34
- package/src/commands/crosschain.js +182 -28
- package/src/commands/dao.js +182 -28
- package/src/commands/dlp.js +172 -27
- package/src/commands/economy.js +205 -50
- package/src/commands/evolution.js +203 -50
- package/src/commands/evomap.js +182 -27
- package/src/commands/fflag.js +74 -22
- package/src/commands/git.js +177 -37
- package/src/commands/hardening.js +209 -0
- package/src/commands/hmemory.js +204 -50
- package/src/commands/incentive.js +209 -0
- package/src/commands/inference.js +170 -34
- package/src/commands/itbudget.js +149 -33
- package/src/commands/kg.js +206 -0
- package/src/commands/lowcode.js +195 -38
- package/src/commands/marketplace.js +206 -0
- package/src/commands/matrix.js +179 -27
- package/src/commands/mcpscaf.js +145 -33
- package/src/commands/meminj.js +145 -33
- package/src/commands/nostr.js +178 -27
- package/src/commands/orchestrate.js +217 -0
- package/src/commands/orchgov.js +144 -33
- package/src/commands/pdfp.js +109 -27
- package/src/commands/perf.js +169 -32
- package/src/commands/perm.js +144 -33
- package/src/commands/pipeline.js +207 -52
- package/src/commands/planmode.js +141 -32
- package/src/commands/privacy.js +203 -0
- package/src/commands/promcomp.js +111 -27
- package/src/commands/recommend.js +177 -34
- package/src/commands/reputation.js +208 -0
- package/src/commands/sandbox.js +206 -0
- package/src/commands/seshhook.js +145 -33
- package/src/commands/seshsearch.js +141 -33
- package/src/commands/seshtail.js +144 -33
- package/src/commands/seshu.js +152 -33
- package/src/commands/sganal.js +123 -29
- package/src/commands/siem.js +201 -34
- package/src/commands/sla.js +212 -0
- package/src/commands/slotfill.js +146 -33
- package/src/commands/social.js +157 -32
- package/src/commands/stress.js +206 -0
- package/src/commands/svccont.js +145 -33
- package/src/commands/terraform.js +206 -0
- package/src/commands/tms.js +171 -33
- package/src/commands/topiccls.js +146 -33
- package/src/commands/uprof.js +141 -32
- package/src/commands/vcheck.js +122 -28
- package/src/commands/webfetch.js +141 -32
- package/src/commands/zkp.js +184 -28
- package/src/index.js +40 -0
- package/src/lib/a2a-protocol.js +319 -51
- package/src/lib/activitypub-bridge.js +288 -50
- package/src/lib/agent-economy.js +304 -51
- package/src/lib/app-builder.js +279 -46
- package/src/lib/audit-logger.js +321 -0
- package/src/lib/autonomous-agent.js +284 -48
- package/src/lib/bi-engine.js +283 -49
- package/src/lib/bm25-search.js +301 -49
- package/src/lib/browser-automation.js +296 -49
- package/src/lib/chat-core.js +336 -0
- package/src/lib/claude-code-bridge.js +341 -0
- package/src/lib/compliance-framework-reporter.js +305 -51
- package/src/lib/compliance-manager.js +330 -0
- package/src/lib/compression-telemetry.js +301 -49
- package/src/lib/content-recommender.js +317 -52
- package/src/lib/cowork-cron.js +298 -49
- package/src/lib/cowork-learning.js +333 -0
- package/src/lib/cowork-task-runner.js +308 -51
- package/src/lib/cowork-workflow.js +327 -0
- package/src/lib/cross-chain.js +311 -51
- package/src/lib/dao-governance.js +280 -46
- package/src/lib/dlp-engine.js +287 -49
- package/src/lib/evolution-system.js +278 -47
- package/src/lib/evomap-manager.js +280 -46
- package/src/lib/execution-backend.js +294 -48
- package/src/lib/feature-flags.js +294 -49
- package/src/lib/git-integration.js +285 -47
- package/src/lib/hardening-manager.js +341 -0
- package/src/lib/hierarchical-memory.js +284 -48
- package/src/lib/inference-network.js +308 -51
- package/src/lib/iteration-budget.js +302 -50
- package/src/lib/knowledge-graph.js +333 -0
- package/src/lib/matrix-bridge.js +281 -47
- package/src/lib/mcp-scaffold.js +318 -54
- package/src/lib/memory-injection.js +288 -49
- package/src/lib/nostr-bridge.js +286 -49
- package/src/lib/orchestrator.js +293 -48
- package/src/lib/pdf-parser.js +298 -49
- package/src/lib/perf-tuning.js +309 -50
- package/src/lib/permission-engine.js +287 -49
- package/src/lib/pipeline-orchestrator.js +289 -49
- package/src/lib/plan-mode.js +298 -51
- package/src/lib/privacy-computing.js +335 -0
- package/src/lib/reputation-optimizer.js +340 -0
- package/src/lib/sandbox-v2.js +327 -0
- package/src/lib/service-container.js +313 -52
- package/src/lib/session-consolidator.js +296 -49
- package/src/lib/session-hooks.js +312 -53
- package/src/lib/session-search.js +304 -51
- package/src/lib/session-tail.js +288 -49
- package/src/lib/session-usage.js +298 -52
- package/src/lib/siem-exporter.js +298 -51
- package/src/lib/skill-marketplace.js +345 -0
- package/src/lib/sla-manager.js +341 -0
- package/src/lib/slot-filler.js +303 -51
- package/src/lib/social-graph-analytics.js +295 -49
- package/src/lib/social-graph.js +272 -49
- package/src/lib/stress-tester.js +342 -0
- package/src/lib/sub-agent-registry.js +302 -53
- package/src/lib/task-model-selector.js +302 -50
- package/src/lib/terraform-manager.js +333 -0
- package/src/lib/todo-manager.js +281 -47
- package/src/lib/token-incentive.js +341 -0
- package/src/lib/topic-classifier.js +297 -49
- package/src/lib/user-profile.js +294 -50
- package/src/lib/version-checker.js +304 -50
- package/src/lib/web-fetch.js +292 -51
- package/src/lib/zkp-engine.js +286 -49
|
@@ -720,3 +720,348 @@ export function getMarketplaceStatsV2() {
|
|
|
720
720
|
successRate,
|
|
721
721
|
};
|
|
722
722
|
}
|
|
723
|
+
|
|
724
|
+
// =====================================================================
|
|
725
|
+
// skill-marketplace V2 governance overlay (iter16)
|
|
726
|
+
// =====================================================================
|
|
727
|
+
export const MKTGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
728
|
+
PENDING: "pending",
|
|
729
|
+
ACTIVE: "active",
|
|
730
|
+
SUSPENDED: "suspended",
|
|
731
|
+
ARCHIVED: "archived",
|
|
732
|
+
});
|
|
733
|
+
export const MKTGOV_ORDER_LIFECYCLE_V2 = Object.freeze({
|
|
734
|
+
QUEUED: "queued",
|
|
735
|
+
PROCESSING: "processing",
|
|
736
|
+
PROCESSED: "processed",
|
|
737
|
+
FAILED: "failed",
|
|
738
|
+
CANCELLED: "cancelled",
|
|
739
|
+
});
|
|
740
|
+
const _mktgovPTrans = new Map([
|
|
741
|
+
[
|
|
742
|
+
MKTGOV_PROFILE_MATURITY_V2.PENDING,
|
|
743
|
+
new Set([
|
|
744
|
+
MKTGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
745
|
+
MKTGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
746
|
+
]),
|
|
747
|
+
],
|
|
748
|
+
[
|
|
749
|
+
MKTGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
750
|
+
new Set([
|
|
751
|
+
MKTGOV_PROFILE_MATURITY_V2.SUSPENDED,
|
|
752
|
+
MKTGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
753
|
+
]),
|
|
754
|
+
],
|
|
755
|
+
[
|
|
756
|
+
MKTGOV_PROFILE_MATURITY_V2.SUSPENDED,
|
|
757
|
+
new Set([
|
|
758
|
+
MKTGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
759
|
+
MKTGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
760
|
+
]),
|
|
761
|
+
],
|
|
762
|
+
[MKTGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
763
|
+
]);
|
|
764
|
+
const _mktgovPTerminal = new Set([MKTGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
765
|
+
const _mktgovJTrans = new Map([
|
|
766
|
+
[
|
|
767
|
+
MKTGOV_ORDER_LIFECYCLE_V2.QUEUED,
|
|
768
|
+
new Set([
|
|
769
|
+
MKTGOV_ORDER_LIFECYCLE_V2.PROCESSING,
|
|
770
|
+
MKTGOV_ORDER_LIFECYCLE_V2.CANCELLED,
|
|
771
|
+
]),
|
|
772
|
+
],
|
|
773
|
+
[
|
|
774
|
+
MKTGOV_ORDER_LIFECYCLE_V2.PROCESSING,
|
|
775
|
+
new Set([
|
|
776
|
+
MKTGOV_ORDER_LIFECYCLE_V2.PROCESSED,
|
|
777
|
+
MKTGOV_ORDER_LIFECYCLE_V2.FAILED,
|
|
778
|
+
MKTGOV_ORDER_LIFECYCLE_V2.CANCELLED,
|
|
779
|
+
]),
|
|
780
|
+
],
|
|
781
|
+
[MKTGOV_ORDER_LIFECYCLE_V2.PROCESSED, new Set()],
|
|
782
|
+
[MKTGOV_ORDER_LIFECYCLE_V2.FAILED, new Set()],
|
|
783
|
+
[MKTGOV_ORDER_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
784
|
+
]);
|
|
785
|
+
const _mktgovPsV2 = new Map();
|
|
786
|
+
const _mktgovJsV2 = new Map();
|
|
787
|
+
let _mktgovMaxActive = 10,
|
|
788
|
+
_mktgovMaxPending = 25,
|
|
789
|
+
_mktgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
790
|
+
_mktgovStuckMs = 60 * 1000;
|
|
791
|
+
function _mktgovPos(n, label) {
|
|
792
|
+
const v = Math.floor(Number(n));
|
|
793
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
794
|
+
throw new Error(`${label} must be positive integer`);
|
|
795
|
+
return v;
|
|
796
|
+
}
|
|
797
|
+
function _mktgovCheckP(from, to) {
|
|
798
|
+
const a = _mktgovPTrans.get(from);
|
|
799
|
+
if (!a || !a.has(to))
|
|
800
|
+
throw new Error(`invalid mktgov profile transition ${from} → ${to}`);
|
|
801
|
+
}
|
|
802
|
+
function _mktgovCheckJ(from, to) {
|
|
803
|
+
const a = _mktgovJTrans.get(from);
|
|
804
|
+
if (!a || !a.has(to))
|
|
805
|
+
throw new Error(`invalid mktgov order transition ${from} → ${to}`);
|
|
806
|
+
}
|
|
807
|
+
function _mktgovCountActive(owner) {
|
|
808
|
+
let c = 0;
|
|
809
|
+
for (const p of _mktgovPsV2.values())
|
|
810
|
+
if (p.owner === owner && p.status === MKTGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
811
|
+
c++;
|
|
812
|
+
return c;
|
|
813
|
+
}
|
|
814
|
+
function _mktgovCountPending(profileId) {
|
|
815
|
+
let c = 0;
|
|
816
|
+
for (const j of _mktgovJsV2.values())
|
|
817
|
+
if (
|
|
818
|
+
j.profileId === profileId &&
|
|
819
|
+
(j.status === MKTGOV_ORDER_LIFECYCLE_V2.QUEUED ||
|
|
820
|
+
j.status === MKTGOV_ORDER_LIFECYCLE_V2.PROCESSING)
|
|
821
|
+
)
|
|
822
|
+
c++;
|
|
823
|
+
return c;
|
|
824
|
+
}
|
|
825
|
+
export function setMaxActiveMktgovProfilesPerOwnerV2(n) {
|
|
826
|
+
_mktgovMaxActive = _mktgovPos(n, "maxActiveMktgovProfilesPerOwner");
|
|
827
|
+
}
|
|
828
|
+
export function getMaxActiveMktgovProfilesPerOwnerV2() {
|
|
829
|
+
return _mktgovMaxActive;
|
|
830
|
+
}
|
|
831
|
+
export function setMaxPendingMktgovOrdersPerProfileV2(n) {
|
|
832
|
+
_mktgovMaxPending = _mktgovPos(n, "maxPendingMktgovOrdersPerProfile");
|
|
833
|
+
}
|
|
834
|
+
export function getMaxPendingMktgovOrdersPerProfileV2() {
|
|
835
|
+
return _mktgovMaxPending;
|
|
836
|
+
}
|
|
837
|
+
export function setMktgovProfileIdleMsV2(n) {
|
|
838
|
+
_mktgovIdleMs = _mktgovPos(n, "mktgovProfileIdleMs");
|
|
839
|
+
}
|
|
840
|
+
export function getMktgovProfileIdleMsV2() {
|
|
841
|
+
return _mktgovIdleMs;
|
|
842
|
+
}
|
|
843
|
+
export function setMktgovOrderStuckMsV2(n) {
|
|
844
|
+
_mktgovStuckMs = _mktgovPos(n, "mktgovOrderStuckMs");
|
|
845
|
+
}
|
|
846
|
+
export function getMktgovOrderStuckMsV2() {
|
|
847
|
+
return _mktgovStuckMs;
|
|
848
|
+
}
|
|
849
|
+
export function _resetStateSkillMarketplaceV2() {
|
|
850
|
+
_mktgovPsV2.clear();
|
|
851
|
+
_mktgovJsV2.clear();
|
|
852
|
+
_mktgovMaxActive = 10;
|
|
853
|
+
_mktgovMaxPending = 25;
|
|
854
|
+
_mktgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
855
|
+
_mktgovStuckMs = 60 * 1000;
|
|
856
|
+
}
|
|
857
|
+
export function registerMktgovProfileV2({
|
|
858
|
+
id,
|
|
859
|
+
owner,
|
|
860
|
+
category,
|
|
861
|
+
metadata,
|
|
862
|
+
} = {}) {
|
|
863
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
864
|
+
if (_mktgovPsV2.has(id))
|
|
865
|
+
throw new Error(`mktgov profile ${id} already exists`);
|
|
866
|
+
const now = Date.now();
|
|
867
|
+
const p = {
|
|
868
|
+
id,
|
|
869
|
+
owner,
|
|
870
|
+
category: category || "general",
|
|
871
|
+
status: MKTGOV_PROFILE_MATURITY_V2.PENDING,
|
|
872
|
+
createdAt: now,
|
|
873
|
+
updatedAt: now,
|
|
874
|
+
lastTouchedAt: now,
|
|
875
|
+
activatedAt: null,
|
|
876
|
+
archivedAt: null,
|
|
877
|
+
metadata: { ...(metadata || {}) },
|
|
878
|
+
};
|
|
879
|
+
_mktgovPsV2.set(id, p);
|
|
880
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
881
|
+
}
|
|
882
|
+
export function activateMktgovProfileV2(id) {
|
|
883
|
+
const p = _mktgovPsV2.get(id);
|
|
884
|
+
if (!p) throw new Error(`mktgov profile ${id} not found`);
|
|
885
|
+
const isInitial = p.status === MKTGOV_PROFILE_MATURITY_V2.PENDING;
|
|
886
|
+
_mktgovCheckP(p.status, MKTGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
887
|
+
if (isInitial && _mktgovCountActive(p.owner) >= _mktgovMaxActive)
|
|
888
|
+
throw new Error(`max active mktgov profiles for owner ${p.owner} reached`);
|
|
889
|
+
const now = Date.now();
|
|
890
|
+
p.status = MKTGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
891
|
+
p.updatedAt = now;
|
|
892
|
+
p.lastTouchedAt = now;
|
|
893
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
894
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
895
|
+
}
|
|
896
|
+
export function suspendMktgovProfileV2(id) {
|
|
897
|
+
const p = _mktgovPsV2.get(id);
|
|
898
|
+
if (!p) throw new Error(`mktgov profile ${id} not found`);
|
|
899
|
+
_mktgovCheckP(p.status, MKTGOV_PROFILE_MATURITY_V2.SUSPENDED);
|
|
900
|
+
p.status = MKTGOV_PROFILE_MATURITY_V2.SUSPENDED;
|
|
901
|
+
p.updatedAt = Date.now();
|
|
902
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
903
|
+
}
|
|
904
|
+
export function archiveMktgovProfileV2(id) {
|
|
905
|
+
const p = _mktgovPsV2.get(id);
|
|
906
|
+
if (!p) throw new Error(`mktgov profile ${id} not found`);
|
|
907
|
+
_mktgovCheckP(p.status, MKTGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
908
|
+
const now = Date.now();
|
|
909
|
+
p.status = MKTGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
910
|
+
p.updatedAt = now;
|
|
911
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
912
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
913
|
+
}
|
|
914
|
+
export function touchMktgovProfileV2(id) {
|
|
915
|
+
const p = _mktgovPsV2.get(id);
|
|
916
|
+
if (!p) throw new Error(`mktgov profile ${id} not found`);
|
|
917
|
+
if (_mktgovPTerminal.has(p.status))
|
|
918
|
+
throw new Error(`cannot touch terminal mktgov profile ${id}`);
|
|
919
|
+
const now = Date.now();
|
|
920
|
+
p.lastTouchedAt = now;
|
|
921
|
+
p.updatedAt = now;
|
|
922
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
923
|
+
}
|
|
924
|
+
export function getMktgovProfileV2(id) {
|
|
925
|
+
const p = _mktgovPsV2.get(id);
|
|
926
|
+
if (!p) return null;
|
|
927
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
928
|
+
}
|
|
929
|
+
export function listMktgovProfilesV2() {
|
|
930
|
+
return [..._mktgovPsV2.values()].map((p) => ({
|
|
931
|
+
...p,
|
|
932
|
+
metadata: { ...p.metadata },
|
|
933
|
+
}));
|
|
934
|
+
}
|
|
935
|
+
export function createMktgovOrderV2({
|
|
936
|
+
id,
|
|
937
|
+
profileId,
|
|
938
|
+
listingId,
|
|
939
|
+
metadata,
|
|
940
|
+
} = {}) {
|
|
941
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
942
|
+
if (_mktgovJsV2.has(id)) throw new Error(`mktgov order ${id} already exists`);
|
|
943
|
+
if (!_mktgovPsV2.has(profileId))
|
|
944
|
+
throw new Error(`mktgov profile ${profileId} not found`);
|
|
945
|
+
if (_mktgovCountPending(profileId) >= _mktgovMaxPending)
|
|
946
|
+
throw new Error(
|
|
947
|
+
`max pending mktgov orders for profile ${profileId} reached`,
|
|
948
|
+
);
|
|
949
|
+
const now = Date.now();
|
|
950
|
+
const j = {
|
|
951
|
+
id,
|
|
952
|
+
profileId,
|
|
953
|
+
listingId: listingId || "",
|
|
954
|
+
status: MKTGOV_ORDER_LIFECYCLE_V2.QUEUED,
|
|
955
|
+
createdAt: now,
|
|
956
|
+
updatedAt: now,
|
|
957
|
+
startedAt: null,
|
|
958
|
+
settledAt: null,
|
|
959
|
+
metadata: { ...(metadata || {}) },
|
|
960
|
+
};
|
|
961
|
+
_mktgovJsV2.set(id, j);
|
|
962
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
963
|
+
}
|
|
964
|
+
export function processingMktgovOrderV2(id) {
|
|
965
|
+
const j = _mktgovJsV2.get(id);
|
|
966
|
+
if (!j) throw new Error(`mktgov order ${id} not found`);
|
|
967
|
+
_mktgovCheckJ(j.status, MKTGOV_ORDER_LIFECYCLE_V2.PROCESSING);
|
|
968
|
+
const now = Date.now();
|
|
969
|
+
j.status = MKTGOV_ORDER_LIFECYCLE_V2.PROCESSING;
|
|
970
|
+
j.updatedAt = now;
|
|
971
|
+
if (!j.startedAt) j.startedAt = now;
|
|
972
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
973
|
+
}
|
|
974
|
+
export function completeOrderMktgovV2(id) {
|
|
975
|
+
const j = _mktgovJsV2.get(id);
|
|
976
|
+
if (!j) throw new Error(`mktgov order ${id} not found`);
|
|
977
|
+
_mktgovCheckJ(j.status, MKTGOV_ORDER_LIFECYCLE_V2.PROCESSED);
|
|
978
|
+
const now = Date.now();
|
|
979
|
+
j.status = MKTGOV_ORDER_LIFECYCLE_V2.PROCESSED;
|
|
980
|
+
j.updatedAt = now;
|
|
981
|
+
if (!j.settledAt) j.settledAt = now;
|
|
982
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
983
|
+
}
|
|
984
|
+
export function failMktgovOrderV2(id, reason) {
|
|
985
|
+
const j = _mktgovJsV2.get(id);
|
|
986
|
+
if (!j) throw new Error(`mktgov order ${id} not found`);
|
|
987
|
+
_mktgovCheckJ(j.status, MKTGOV_ORDER_LIFECYCLE_V2.FAILED);
|
|
988
|
+
const now = Date.now();
|
|
989
|
+
j.status = MKTGOV_ORDER_LIFECYCLE_V2.FAILED;
|
|
990
|
+
j.updatedAt = now;
|
|
991
|
+
if (!j.settledAt) j.settledAt = now;
|
|
992
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
993
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
994
|
+
}
|
|
995
|
+
export function cancelMktgovOrderV2(id, reason) {
|
|
996
|
+
const j = _mktgovJsV2.get(id);
|
|
997
|
+
if (!j) throw new Error(`mktgov order ${id} not found`);
|
|
998
|
+
_mktgovCheckJ(j.status, MKTGOV_ORDER_LIFECYCLE_V2.CANCELLED);
|
|
999
|
+
const now = Date.now();
|
|
1000
|
+
j.status = MKTGOV_ORDER_LIFECYCLE_V2.CANCELLED;
|
|
1001
|
+
j.updatedAt = now;
|
|
1002
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1003
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1004
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1005
|
+
}
|
|
1006
|
+
export function getMktgovOrderV2(id) {
|
|
1007
|
+
const j = _mktgovJsV2.get(id);
|
|
1008
|
+
if (!j) return null;
|
|
1009
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1010
|
+
}
|
|
1011
|
+
export function listMktgovOrdersV2() {
|
|
1012
|
+
return [..._mktgovJsV2.values()].map((j) => ({
|
|
1013
|
+
...j,
|
|
1014
|
+
metadata: { ...j.metadata },
|
|
1015
|
+
}));
|
|
1016
|
+
}
|
|
1017
|
+
export function autoSuspendIdleMktgovProfilesV2({ now } = {}) {
|
|
1018
|
+
const t = now ?? Date.now();
|
|
1019
|
+
const flipped = [];
|
|
1020
|
+
for (const p of _mktgovPsV2.values())
|
|
1021
|
+
if (
|
|
1022
|
+
p.status === MKTGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1023
|
+
t - p.lastTouchedAt >= _mktgovIdleMs
|
|
1024
|
+
) {
|
|
1025
|
+
p.status = MKTGOV_PROFILE_MATURITY_V2.SUSPENDED;
|
|
1026
|
+
p.updatedAt = t;
|
|
1027
|
+
flipped.push(p.id);
|
|
1028
|
+
}
|
|
1029
|
+
return { flipped, count: flipped.length };
|
|
1030
|
+
}
|
|
1031
|
+
export function autoFailStuckMktgovOrdersV2({ now } = {}) {
|
|
1032
|
+
const t = now ?? Date.now();
|
|
1033
|
+
const flipped = [];
|
|
1034
|
+
for (const j of _mktgovJsV2.values())
|
|
1035
|
+
if (
|
|
1036
|
+
j.status === MKTGOV_ORDER_LIFECYCLE_V2.PROCESSING &&
|
|
1037
|
+
j.startedAt != null &&
|
|
1038
|
+
t - j.startedAt >= _mktgovStuckMs
|
|
1039
|
+
) {
|
|
1040
|
+
j.status = MKTGOV_ORDER_LIFECYCLE_V2.FAILED;
|
|
1041
|
+
j.updatedAt = t;
|
|
1042
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1043
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1044
|
+
flipped.push(j.id);
|
|
1045
|
+
}
|
|
1046
|
+
return { flipped, count: flipped.length };
|
|
1047
|
+
}
|
|
1048
|
+
export function getSkillMarketplaceGovStatsV2() {
|
|
1049
|
+
const profilesByStatus = {};
|
|
1050
|
+
for (const v of Object.values(MKTGOV_PROFILE_MATURITY_V2))
|
|
1051
|
+
profilesByStatus[v] = 0;
|
|
1052
|
+
for (const p of _mktgovPsV2.values()) profilesByStatus[p.status]++;
|
|
1053
|
+
const ordersByStatus = {};
|
|
1054
|
+
for (const v of Object.values(MKTGOV_ORDER_LIFECYCLE_V2))
|
|
1055
|
+
ordersByStatus[v] = 0;
|
|
1056
|
+
for (const j of _mktgovJsV2.values()) ordersByStatus[j.status]++;
|
|
1057
|
+
return {
|
|
1058
|
+
totalMktgovProfilesV2: _mktgovPsV2.size,
|
|
1059
|
+
totalMktgovOrdersV2: _mktgovJsV2.size,
|
|
1060
|
+
maxActiveMktgovProfilesPerOwner: _mktgovMaxActive,
|
|
1061
|
+
maxPendingMktgovOrdersPerProfile: _mktgovMaxPending,
|
|
1062
|
+
mktgovProfileIdleMs: _mktgovIdleMs,
|
|
1063
|
+
mktgovOrderStuckMs: _mktgovStuckMs,
|
|
1064
|
+
profilesByStatus,
|
|
1065
|
+
ordersByStatus,
|
|
1066
|
+
};
|
|
1067
|
+
}
|
package/src/lib/sla-manager.js
CHANGED
|
@@ -757,3 +757,344 @@ export function getSLAStatsV2() {
|
|
|
757
757
|
},
|
|
758
758
|
};
|
|
759
759
|
}
|
|
760
|
+
|
|
761
|
+
// =====================================================================
|
|
762
|
+
// sla-manager V2 governance overlay (iter16)
|
|
763
|
+
// =====================================================================
|
|
764
|
+
export const SLAGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
765
|
+
PENDING: "pending",
|
|
766
|
+
ACTIVE: "active",
|
|
767
|
+
BREACHED: "breached",
|
|
768
|
+
ARCHIVED: "archived",
|
|
769
|
+
});
|
|
770
|
+
export const SLAGOV_MEASUREMENT_LIFECYCLE_V2 = Object.freeze({
|
|
771
|
+
QUEUED: "queued",
|
|
772
|
+
MEASURING: "measuring",
|
|
773
|
+
MEASURED: "measured",
|
|
774
|
+
FAILED: "failed",
|
|
775
|
+
CANCELLED: "cancelled",
|
|
776
|
+
});
|
|
777
|
+
const _slagovPTrans = new Map([
|
|
778
|
+
[
|
|
779
|
+
SLAGOV_PROFILE_MATURITY_V2.PENDING,
|
|
780
|
+
new Set([
|
|
781
|
+
SLAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
782
|
+
SLAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
783
|
+
]),
|
|
784
|
+
],
|
|
785
|
+
[
|
|
786
|
+
SLAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
787
|
+
new Set([
|
|
788
|
+
SLAGOV_PROFILE_MATURITY_V2.BREACHED,
|
|
789
|
+
SLAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
790
|
+
]),
|
|
791
|
+
],
|
|
792
|
+
[
|
|
793
|
+
SLAGOV_PROFILE_MATURITY_V2.BREACHED,
|
|
794
|
+
new Set([
|
|
795
|
+
SLAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
796
|
+
SLAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
797
|
+
]),
|
|
798
|
+
],
|
|
799
|
+
[SLAGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
800
|
+
]);
|
|
801
|
+
const _slagovPTerminal = new Set([SLAGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
802
|
+
const _slagovJTrans = new Map([
|
|
803
|
+
[
|
|
804
|
+
SLAGOV_MEASUREMENT_LIFECYCLE_V2.QUEUED,
|
|
805
|
+
new Set([
|
|
806
|
+
SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURING,
|
|
807
|
+
SLAGOV_MEASUREMENT_LIFECYCLE_V2.CANCELLED,
|
|
808
|
+
]),
|
|
809
|
+
],
|
|
810
|
+
[
|
|
811
|
+
SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURING,
|
|
812
|
+
new Set([
|
|
813
|
+
SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURED,
|
|
814
|
+
SLAGOV_MEASUREMENT_LIFECYCLE_V2.FAILED,
|
|
815
|
+
SLAGOV_MEASUREMENT_LIFECYCLE_V2.CANCELLED,
|
|
816
|
+
]),
|
|
817
|
+
],
|
|
818
|
+
[SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURED, new Set()],
|
|
819
|
+
[SLAGOV_MEASUREMENT_LIFECYCLE_V2.FAILED, new Set()],
|
|
820
|
+
[SLAGOV_MEASUREMENT_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
821
|
+
]);
|
|
822
|
+
const _slagovPsV2 = new Map();
|
|
823
|
+
const _slagovJsV2 = new Map();
|
|
824
|
+
let _slagovMaxActive = 8,
|
|
825
|
+
_slagovMaxPending = 20,
|
|
826
|
+
_slagovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
827
|
+
_slagovStuckMs = 60 * 1000;
|
|
828
|
+
function _slagovPos(n, label) {
|
|
829
|
+
const v = Math.floor(Number(n));
|
|
830
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
831
|
+
throw new Error(`${label} must be positive integer`);
|
|
832
|
+
return v;
|
|
833
|
+
}
|
|
834
|
+
function _slagovCheckP(from, to) {
|
|
835
|
+
const a = _slagovPTrans.get(from);
|
|
836
|
+
if (!a || !a.has(to))
|
|
837
|
+
throw new Error(`invalid slagov profile transition ${from} → ${to}`);
|
|
838
|
+
}
|
|
839
|
+
function _slagovCheckJ(from, to) {
|
|
840
|
+
const a = _slagovJTrans.get(from);
|
|
841
|
+
if (!a || !a.has(to))
|
|
842
|
+
throw new Error(`invalid slagov measurement transition ${from} → ${to}`);
|
|
843
|
+
}
|
|
844
|
+
function _slagovCountActive(owner) {
|
|
845
|
+
let c = 0;
|
|
846
|
+
for (const p of _slagovPsV2.values())
|
|
847
|
+
if (p.owner === owner && p.status === SLAGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
848
|
+
c++;
|
|
849
|
+
return c;
|
|
850
|
+
}
|
|
851
|
+
function _slagovCountPending(profileId) {
|
|
852
|
+
let c = 0;
|
|
853
|
+
for (const j of _slagovJsV2.values())
|
|
854
|
+
if (
|
|
855
|
+
j.profileId === profileId &&
|
|
856
|
+
(j.status === SLAGOV_MEASUREMENT_LIFECYCLE_V2.QUEUED ||
|
|
857
|
+
j.status === SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURING)
|
|
858
|
+
)
|
|
859
|
+
c++;
|
|
860
|
+
return c;
|
|
861
|
+
}
|
|
862
|
+
export function setMaxActiveSlagovProfilesPerOwnerV2(n) {
|
|
863
|
+
_slagovMaxActive = _slagovPos(n, "maxActiveSlagovProfilesPerOwner");
|
|
864
|
+
}
|
|
865
|
+
export function getMaxActiveSlagovProfilesPerOwnerV2() {
|
|
866
|
+
return _slagovMaxActive;
|
|
867
|
+
}
|
|
868
|
+
export function setMaxPendingSlagovMeasurementsPerProfileV2(n) {
|
|
869
|
+
_slagovMaxPending = _slagovPos(n, "maxPendingSlagovMeasurementsPerProfile");
|
|
870
|
+
}
|
|
871
|
+
export function getMaxPendingSlagovMeasurementsPerProfileV2() {
|
|
872
|
+
return _slagovMaxPending;
|
|
873
|
+
}
|
|
874
|
+
export function setSlagovProfileIdleMsV2(n) {
|
|
875
|
+
_slagovIdleMs = _slagovPos(n, "slagovProfileIdleMs");
|
|
876
|
+
}
|
|
877
|
+
export function getSlagovProfileIdleMsV2() {
|
|
878
|
+
return _slagovIdleMs;
|
|
879
|
+
}
|
|
880
|
+
export function setSlagovMeasurementStuckMsV2(n) {
|
|
881
|
+
_slagovStuckMs = _slagovPos(n, "slagovMeasurementStuckMs");
|
|
882
|
+
}
|
|
883
|
+
export function getSlagovMeasurementStuckMsV2() {
|
|
884
|
+
return _slagovStuckMs;
|
|
885
|
+
}
|
|
886
|
+
export function _resetStateSlaManagerV2() {
|
|
887
|
+
_slagovPsV2.clear();
|
|
888
|
+
_slagovJsV2.clear();
|
|
889
|
+
_slagovMaxActive = 8;
|
|
890
|
+
_slagovMaxPending = 20;
|
|
891
|
+
_slagovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
892
|
+
_slagovStuckMs = 60 * 1000;
|
|
893
|
+
}
|
|
894
|
+
export function registerSlagovProfileV2({ id, owner, tier, metadata } = {}) {
|
|
895
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
896
|
+
if (_slagovPsV2.has(id))
|
|
897
|
+
throw new Error(`slagov profile ${id} already exists`);
|
|
898
|
+
const now = Date.now();
|
|
899
|
+
const p = {
|
|
900
|
+
id,
|
|
901
|
+
owner,
|
|
902
|
+
tier: tier || "standard",
|
|
903
|
+
status: SLAGOV_PROFILE_MATURITY_V2.PENDING,
|
|
904
|
+
createdAt: now,
|
|
905
|
+
updatedAt: now,
|
|
906
|
+
lastTouchedAt: now,
|
|
907
|
+
activatedAt: null,
|
|
908
|
+
archivedAt: null,
|
|
909
|
+
metadata: { ...(metadata || {}) },
|
|
910
|
+
};
|
|
911
|
+
_slagovPsV2.set(id, p);
|
|
912
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
913
|
+
}
|
|
914
|
+
export function activateSlagovProfileV2(id) {
|
|
915
|
+
const p = _slagovPsV2.get(id);
|
|
916
|
+
if (!p) throw new Error(`slagov profile ${id} not found`);
|
|
917
|
+
const isInitial = p.status === SLAGOV_PROFILE_MATURITY_V2.PENDING;
|
|
918
|
+
_slagovCheckP(p.status, SLAGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
919
|
+
if (isInitial && _slagovCountActive(p.owner) >= _slagovMaxActive)
|
|
920
|
+
throw new Error(`max active slagov profiles for owner ${p.owner} reached`);
|
|
921
|
+
const now = Date.now();
|
|
922
|
+
p.status = SLAGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
923
|
+
p.updatedAt = now;
|
|
924
|
+
p.lastTouchedAt = now;
|
|
925
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
926
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
927
|
+
}
|
|
928
|
+
export function breachSlagovProfileV2(id) {
|
|
929
|
+
const p = _slagovPsV2.get(id);
|
|
930
|
+
if (!p) throw new Error(`slagov profile ${id} not found`);
|
|
931
|
+
_slagovCheckP(p.status, SLAGOV_PROFILE_MATURITY_V2.BREACHED);
|
|
932
|
+
p.status = SLAGOV_PROFILE_MATURITY_V2.BREACHED;
|
|
933
|
+
p.updatedAt = Date.now();
|
|
934
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
935
|
+
}
|
|
936
|
+
export function archiveSlagovProfileV2(id) {
|
|
937
|
+
const p = _slagovPsV2.get(id);
|
|
938
|
+
if (!p) throw new Error(`slagov profile ${id} not found`);
|
|
939
|
+
_slagovCheckP(p.status, SLAGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
940
|
+
const now = Date.now();
|
|
941
|
+
p.status = SLAGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
942
|
+
p.updatedAt = now;
|
|
943
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
944
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
945
|
+
}
|
|
946
|
+
export function touchSlagovProfileV2(id) {
|
|
947
|
+
const p = _slagovPsV2.get(id);
|
|
948
|
+
if (!p) throw new Error(`slagov profile ${id} not found`);
|
|
949
|
+
if (_slagovPTerminal.has(p.status))
|
|
950
|
+
throw new Error(`cannot touch terminal slagov profile ${id}`);
|
|
951
|
+
const now = Date.now();
|
|
952
|
+
p.lastTouchedAt = now;
|
|
953
|
+
p.updatedAt = now;
|
|
954
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
955
|
+
}
|
|
956
|
+
export function getSlagovProfileV2(id) {
|
|
957
|
+
const p = _slagovPsV2.get(id);
|
|
958
|
+
if (!p) return null;
|
|
959
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
960
|
+
}
|
|
961
|
+
export function listSlagovProfilesV2() {
|
|
962
|
+
return [..._slagovPsV2.values()].map((p) => ({
|
|
963
|
+
...p,
|
|
964
|
+
metadata: { ...p.metadata },
|
|
965
|
+
}));
|
|
966
|
+
}
|
|
967
|
+
export function createSlagovMeasurementV2({
|
|
968
|
+
id,
|
|
969
|
+
profileId,
|
|
970
|
+
metric,
|
|
971
|
+
metadata,
|
|
972
|
+
} = {}) {
|
|
973
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
974
|
+
if (_slagovJsV2.has(id))
|
|
975
|
+
throw new Error(`slagov measurement ${id} already exists`);
|
|
976
|
+
if (!_slagovPsV2.has(profileId))
|
|
977
|
+
throw new Error(`slagov profile ${profileId} not found`);
|
|
978
|
+
if (_slagovCountPending(profileId) >= _slagovMaxPending)
|
|
979
|
+
throw new Error(
|
|
980
|
+
`max pending slagov measurements for profile ${profileId} reached`,
|
|
981
|
+
);
|
|
982
|
+
const now = Date.now();
|
|
983
|
+
const j = {
|
|
984
|
+
id,
|
|
985
|
+
profileId,
|
|
986
|
+
metric: metric || "",
|
|
987
|
+
status: SLAGOV_MEASUREMENT_LIFECYCLE_V2.QUEUED,
|
|
988
|
+
createdAt: now,
|
|
989
|
+
updatedAt: now,
|
|
990
|
+
startedAt: null,
|
|
991
|
+
settledAt: null,
|
|
992
|
+
metadata: { ...(metadata || {}) },
|
|
993
|
+
};
|
|
994
|
+
_slagovJsV2.set(id, j);
|
|
995
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
996
|
+
}
|
|
997
|
+
export function measuringSlagovMeasurementV2(id) {
|
|
998
|
+
const j = _slagovJsV2.get(id);
|
|
999
|
+
if (!j) throw new Error(`slagov measurement ${id} not found`);
|
|
1000
|
+
_slagovCheckJ(j.status, SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURING);
|
|
1001
|
+
const now = Date.now();
|
|
1002
|
+
j.status = SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURING;
|
|
1003
|
+
j.updatedAt = now;
|
|
1004
|
+
if (!j.startedAt) j.startedAt = now;
|
|
1005
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1006
|
+
}
|
|
1007
|
+
export function completeMeasurementSlagovV2(id) {
|
|
1008
|
+
const j = _slagovJsV2.get(id);
|
|
1009
|
+
if (!j) throw new Error(`slagov measurement ${id} not found`);
|
|
1010
|
+
_slagovCheckJ(j.status, SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURED);
|
|
1011
|
+
const now = Date.now();
|
|
1012
|
+
j.status = SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURED;
|
|
1013
|
+
j.updatedAt = now;
|
|
1014
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1015
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1016
|
+
}
|
|
1017
|
+
export function failSlagovMeasurementV2(id, reason) {
|
|
1018
|
+
const j = _slagovJsV2.get(id);
|
|
1019
|
+
if (!j) throw new Error(`slagov measurement ${id} not found`);
|
|
1020
|
+
_slagovCheckJ(j.status, SLAGOV_MEASUREMENT_LIFECYCLE_V2.FAILED);
|
|
1021
|
+
const now = Date.now();
|
|
1022
|
+
j.status = SLAGOV_MEASUREMENT_LIFECYCLE_V2.FAILED;
|
|
1023
|
+
j.updatedAt = now;
|
|
1024
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1025
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
1026
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1027
|
+
}
|
|
1028
|
+
export function cancelSlagovMeasurementV2(id, reason) {
|
|
1029
|
+
const j = _slagovJsV2.get(id);
|
|
1030
|
+
if (!j) throw new Error(`slagov measurement ${id} not found`);
|
|
1031
|
+
_slagovCheckJ(j.status, SLAGOV_MEASUREMENT_LIFECYCLE_V2.CANCELLED);
|
|
1032
|
+
const now = Date.now();
|
|
1033
|
+
j.status = SLAGOV_MEASUREMENT_LIFECYCLE_V2.CANCELLED;
|
|
1034
|
+
j.updatedAt = now;
|
|
1035
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1036
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1037
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1038
|
+
}
|
|
1039
|
+
export function getSlagovMeasurementV2(id) {
|
|
1040
|
+
const j = _slagovJsV2.get(id);
|
|
1041
|
+
if (!j) return null;
|
|
1042
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1043
|
+
}
|
|
1044
|
+
export function listSlagovMeasurementsV2() {
|
|
1045
|
+
return [..._slagovJsV2.values()].map((j) => ({
|
|
1046
|
+
...j,
|
|
1047
|
+
metadata: { ...j.metadata },
|
|
1048
|
+
}));
|
|
1049
|
+
}
|
|
1050
|
+
export function autoBreachIdleSlagovProfilesV2({ now } = {}) {
|
|
1051
|
+
const t = now ?? Date.now();
|
|
1052
|
+
const flipped = [];
|
|
1053
|
+
for (const p of _slagovPsV2.values())
|
|
1054
|
+
if (
|
|
1055
|
+
p.status === SLAGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1056
|
+
t - p.lastTouchedAt >= _slagovIdleMs
|
|
1057
|
+
) {
|
|
1058
|
+
p.status = SLAGOV_PROFILE_MATURITY_V2.BREACHED;
|
|
1059
|
+
p.updatedAt = t;
|
|
1060
|
+
flipped.push(p.id);
|
|
1061
|
+
}
|
|
1062
|
+
return { flipped, count: flipped.length };
|
|
1063
|
+
}
|
|
1064
|
+
export function autoFailStuckSlagovMeasurementsV2({ now } = {}) {
|
|
1065
|
+
const t = now ?? Date.now();
|
|
1066
|
+
const flipped = [];
|
|
1067
|
+
for (const j of _slagovJsV2.values())
|
|
1068
|
+
if (
|
|
1069
|
+
j.status === SLAGOV_MEASUREMENT_LIFECYCLE_V2.MEASURING &&
|
|
1070
|
+
j.startedAt != null &&
|
|
1071
|
+
t - j.startedAt >= _slagovStuckMs
|
|
1072
|
+
) {
|
|
1073
|
+
j.status = SLAGOV_MEASUREMENT_LIFECYCLE_V2.FAILED;
|
|
1074
|
+
j.updatedAt = t;
|
|
1075
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1076
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1077
|
+
flipped.push(j.id);
|
|
1078
|
+
}
|
|
1079
|
+
return { flipped, count: flipped.length };
|
|
1080
|
+
}
|
|
1081
|
+
export function getSlaManagerGovStatsV2() {
|
|
1082
|
+
const profilesByStatus = {};
|
|
1083
|
+
for (const v of Object.values(SLAGOV_PROFILE_MATURITY_V2))
|
|
1084
|
+
profilesByStatus[v] = 0;
|
|
1085
|
+
for (const p of _slagovPsV2.values()) profilesByStatus[p.status]++;
|
|
1086
|
+
const measurementsByStatus = {};
|
|
1087
|
+
for (const v of Object.values(SLAGOV_MEASUREMENT_LIFECYCLE_V2))
|
|
1088
|
+
measurementsByStatus[v] = 0;
|
|
1089
|
+
for (const j of _slagovJsV2.values()) measurementsByStatus[j.status]++;
|
|
1090
|
+
return {
|
|
1091
|
+
totalSlagovProfilesV2: _slagovPsV2.size,
|
|
1092
|
+
totalSlagovMeasurementsV2: _slagovJsV2.size,
|
|
1093
|
+
maxActiveSlagovProfilesPerOwner: _slagovMaxActive,
|
|
1094
|
+
maxPendingSlagovMeasurementsPerProfile: _slagovMaxPending,
|
|
1095
|
+
slagovProfileIdleMs: _slagovIdleMs,
|
|
1096
|
+
slagovMeasurementStuckMs: _slagovStuckMs,
|
|
1097
|
+
profilesByStatus,
|
|
1098
|
+
measurementsByStatus,
|
|
1099
|
+
};
|
|
1100
|
+
}
|