chainlesschain 0.132.0 → 0.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/package.json +1 -1
  2. package/src/commands/a2a.js +230 -0
  3. package/src/commands/activitypub.js +191 -0
  4. package/src/commands/agent.js +601 -0
  5. package/src/commands/audit.js +206 -0
  6. package/src/commands/bi.js +186 -0
  7. package/src/commands/bm25.js +162 -0
  8. package/src/commands/browse.js +225 -0
  9. package/src/commands/ccron.js +178 -0
  10. package/src/commands/chat.js +207 -0
  11. package/src/commands/compliance.js +420 -0
  12. package/src/commands/compt.js +176 -0
  13. package/src/commands/consol.js +237 -0
  14. package/src/commands/cowork.js +588 -0
  15. package/src/commands/crosschain.js +216 -0
  16. package/src/commands/dao.js +216 -0
  17. package/src/commands/dlp.js +206 -0
  18. package/src/commands/economy.js +211 -0
  19. package/src/commands/evolution.js +209 -0
  20. package/src/commands/evomap.js +216 -0
  21. package/src/commands/fflag.js +230 -0
  22. package/src/commands/git.js +185 -0
  23. package/src/commands/hardening.js +209 -0
  24. package/src/commands/hmemory.js +210 -0
  25. package/src/commands/incentive.js +209 -0
  26. package/src/commands/inference.js +178 -0
  27. package/src/commands/itbudget.js +161 -0
  28. package/src/commands/kg.js +206 -0
  29. package/src/commands/lowcode.js +201 -0
  30. package/src/commands/marketplace.js +206 -0
  31. package/src/commands/matrix.js +214 -0
  32. package/src/commands/mcpscaf.js +153 -0
  33. package/src/commands/meminj.js +153 -0
  34. package/src/commands/nostr.js +213 -0
  35. package/src/commands/orchestrate.js +217 -0
  36. package/src/commands/orchgov.js +156 -0
  37. package/src/commands/pdfp.js +160 -0
  38. package/src/commands/perf.js +176 -0
  39. package/src/commands/perm.js +156 -0
  40. package/src/commands/pipeline.js +211 -0
  41. package/src/commands/planmode.js +154 -0
  42. package/src/commands/privacy.js +203 -0
  43. package/src/commands/promcomp.js +166 -0
  44. package/src/commands/recommend.js +185 -0
  45. package/src/commands/reputation.js +208 -0
  46. package/src/commands/sandbox.js +206 -0
  47. package/src/commands/seshhook.js +153 -0
  48. package/src/commands/seshsearch.js +149 -0
  49. package/src/commands/seshtail.js +152 -0
  50. package/src/commands/seshu.js +160 -0
  51. package/src/commands/sganal.js +172 -0
  52. package/src/commands/siem.js +207 -0
  53. package/src/commands/sla.js +212 -0
  54. package/src/commands/slotfill.js +154 -0
  55. package/src/commands/social.js +159 -0
  56. package/src/commands/stress.js +206 -0
  57. package/src/commands/svccont.js +157 -0
  58. package/src/commands/terraform.js +206 -0
  59. package/src/commands/tms.js +183 -0
  60. package/src/commands/topiccls.js +158 -0
  61. package/src/commands/uprof.js +154 -0
  62. package/src/commands/vcheck.js +172 -0
  63. package/src/commands/webfetch.js +150 -0
  64. package/src/commands/zkp.js +218 -0
  65. package/src/harness/prompt-compressor.js +331 -0
  66. package/src/index.js +101 -1
  67. package/src/lib/a2a-protocol.js +373 -0
  68. package/src/lib/activitypub-bridge.js +343 -0
  69. package/src/lib/agent-economy.js +358 -0
  70. package/src/lib/app-builder.js +338 -0
  71. package/src/lib/audit-logger.js +321 -0
  72. package/src/lib/autonomous-agent.js +341 -0
  73. package/src/lib/bi-engine.js +339 -0
  74. package/src/lib/bm25-search.js +333 -0
  75. package/src/lib/browser-automation.js +352 -0
  76. package/src/lib/chat-core.js +336 -0
  77. package/src/lib/claude-code-bridge.js +341 -0
  78. package/src/lib/compliance-framework-reporter.js +359 -0
  79. package/src/lib/compliance-manager.js +330 -0
  80. package/src/lib/compression-telemetry.js +333 -0
  81. package/src/lib/content-recommender.js +370 -0
  82. package/src/lib/cowork-cron.js +330 -0
  83. package/src/lib/cowork-learning.js +333 -0
  84. package/src/lib/cowork-task-runner.js +362 -0
  85. package/src/lib/cowork-workflow.js +327 -0
  86. package/src/lib/cross-chain.js +365 -0
  87. package/src/lib/dao-governance.js +339 -0
  88. package/src/lib/dlp-engine.js +343 -0
  89. package/src/lib/evolution-system.js +336 -0
  90. package/src/lib/evomap-manager.js +339 -0
  91. package/src/lib/execution-backend.js +351 -0
  92. package/src/lib/feature-flags.js +330 -0
  93. package/src/lib/git-integration.js +343 -0
  94. package/src/lib/hardening-manager.js +341 -0
  95. package/src/lib/hierarchical-memory.js +341 -0
  96. package/src/lib/inference-network.js +362 -0
  97. package/src/lib/iteration-budget.js +357 -0
  98. package/src/lib/knowledge-graph.js +333 -0
  99. package/src/lib/matrix-bridge.js +339 -0
  100. package/src/lib/mcp-scaffold.js +345 -0
  101. package/src/lib/memory-injection.js +320 -0
  102. package/src/lib/nostr-bridge.js +342 -0
  103. package/src/lib/orchestrator.js +350 -0
  104. package/src/lib/pdf-parser.js +330 -0
  105. package/src/lib/perf-tuning.js +364 -0
  106. package/src/lib/permission-engine.js +319 -0
  107. package/src/lib/pipeline-orchestrator.js +345 -0
  108. package/src/lib/plan-mode.js +328 -0
  109. package/src/lib/privacy-computing.js +335 -0
  110. package/src/lib/prompt-compressor.js +1 -10
  111. package/src/lib/reputation-optimizer.js +340 -0
  112. package/src/lib/sandbox-v2.js +327 -0
  113. package/src/lib/service-container.js +342 -0
  114. package/src/lib/session-consolidator.js +352 -0
  115. package/src/lib/session-hooks.js +340 -0
  116. package/src/lib/session-search.js +334 -0
  117. package/src/lib/session-tail.js +320 -0
  118. package/src/lib/session-usage.js +329 -0
  119. package/src/lib/siem-exporter.js +352 -0
  120. package/src/lib/skill-marketplace.js +345 -0
  121. package/src/lib/sla-manager.js +341 -0
  122. package/src/lib/slot-filler.js +333 -0
  123. package/src/lib/social-graph-analytics.js +327 -0
  124. package/src/lib/social-graph.js +304 -0
  125. package/src/lib/stress-tester.js +342 -0
  126. package/src/lib/sub-agent-registry.js +359 -0
  127. package/src/lib/task-model-selector.js +333 -0
  128. package/src/lib/terraform-manager.js +333 -0
  129. package/src/lib/todo-manager.js +339 -0
  130. package/src/lib/token-incentive.js +341 -0
  131. package/src/lib/topic-classifier.js +353 -0
  132. package/src/lib/user-profile.js +325 -0
  133. package/src/lib/version-checker.js +335 -0
  134. package/src/lib/web-fetch.js +322 -0
  135. package/src/lib/zkp-engine.js +342 -0
@@ -735,3 +735,365 @@ export function getInferenceStatsV2() {
735
735
  avgDurationMs: durCount > 0 ? Math.round(durSum / durCount) : 0,
736
736
  };
737
737
  }
738
+
739
+ // ===== V2 Surface: Inference Network governance overlay (CLI v0.139.0) =====
740
+ export const INFERENCE_NODE_MATURITY_V2 = Object.freeze({
741
+ PENDING: "pending",
742
+ ACTIVE: "active",
743
+ DEGRADED: "degraded",
744
+ DECOMMISSIONED: "decommissioned",
745
+ });
746
+ export const INFERENCE_JOB_LIFECYCLE_V2 = Object.freeze({
747
+ QUEUED: "queued",
748
+ RUNNING: "running",
749
+ COMPLETED: "completed",
750
+ FAILED: "failed",
751
+ CANCELLED: "cancelled",
752
+ });
753
+
754
+ const _inTrans = new Map([
755
+ [
756
+ INFERENCE_NODE_MATURITY_V2.PENDING,
757
+ new Set([
758
+ INFERENCE_NODE_MATURITY_V2.ACTIVE,
759
+ INFERENCE_NODE_MATURITY_V2.DECOMMISSIONED,
760
+ ]),
761
+ ],
762
+ [
763
+ INFERENCE_NODE_MATURITY_V2.ACTIVE,
764
+ new Set([
765
+ INFERENCE_NODE_MATURITY_V2.DEGRADED,
766
+ INFERENCE_NODE_MATURITY_V2.DECOMMISSIONED,
767
+ ]),
768
+ ],
769
+ [
770
+ INFERENCE_NODE_MATURITY_V2.DEGRADED,
771
+ new Set([
772
+ INFERENCE_NODE_MATURITY_V2.ACTIVE,
773
+ INFERENCE_NODE_MATURITY_V2.DECOMMISSIONED,
774
+ ]),
775
+ ],
776
+ [INFERENCE_NODE_MATURITY_V2.DECOMMISSIONED, new Set()],
777
+ ]);
778
+ const _inTerminal = new Set([INFERENCE_NODE_MATURITY_V2.DECOMMISSIONED]);
779
+ const _ijTrans = new Map([
780
+ [
781
+ INFERENCE_JOB_LIFECYCLE_V2.QUEUED,
782
+ new Set([
783
+ INFERENCE_JOB_LIFECYCLE_V2.RUNNING,
784
+ INFERENCE_JOB_LIFECYCLE_V2.CANCELLED,
785
+ ]),
786
+ ],
787
+ [
788
+ INFERENCE_JOB_LIFECYCLE_V2.RUNNING,
789
+ new Set([
790
+ INFERENCE_JOB_LIFECYCLE_V2.COMPLETED,
791
+ INFERENCE_JOB_LIFECYCLE_V2.FAILED,
792
+ INFERENCE_JOB_LIFECYCLE_V2.CANCELLED,
793
+ ]),
794
+ ],
795
+ [INFERENCE_JOB_LIFECYCLE_V2.COMPLETED, new Set()],
796
+ [INFERENCE_JOB_LIFECYCLE_V2.FAILED, new Set()],
797
+ [INFERENCE_JOB_LIFECYCLE_V2.CANCELLED, new Set()],
798
+ ]);
799
+
800
+ const _innV2 = new Map();
801
+ const _ijsV2 = new Map();
802
+ let _inMaxActivePerOperator = 12;
803
+ let _inMaxPendingJobsPerNode = 25;
804
+ let _inIdleMs = 24 * 60 * 60 * 1000;
805
+ let _ijStuckMs = 10 * 60 * 1000;
806
+
807
+ function _inPos(n, lbl) {
808
+ const v = Math.floor(Number(n));
809
+ if (!Number.isFinite(v) || v <= 0)
810
+ throw new Error(`${lbl} must be positive integer`);
811
+ return v;
812
+ }
813
+
814
+ export function setMaxActiveInferenceNodesPerOperatorV2(n) {
815
+ _inMaxActivePerOperator = _inPos(n, "maxActiveInferenceNodesPerOperator");
816
+ }
817
+ export function getMaxActiveInferenceNodesPerOperatorV2() {
818
+ return _inMaxActivePerOperator;
819
+ }
820
+ export function setMaxPendingInferenceJobsPerNodeV2(n) {
821
+ _inMaxPendingJobsPerNode = _inPos(n, "maxPendingInferenceJobsPerNode");
822
+ }
823
+ export function getMaxPendingInferenceJobsPerNodeV2() {
824
+ return _inMaxPendingJobsPerNode;
825
+ }
826
+ export function setInferenceNodeIdleMsV2(n) {
827
+ _inIdleMs = _inPos(n, "inferenceNodeIdleMs");
828
+ }
829
+ export function getInferenceNodeIdleMsV2() {
830
+ return _inIdleMs;
831
+ }
832
+ export function setInferenceJobStuckMsV2(n) {
833
+ _ijStuckMs = _inPos(n, "inferenceJobStuckMs");
834
+ }
835
+ export function getInferenceJobStuckMsV2() {
836
+ return _ijStuckMs;
837
+ }
838
+
839
+ export function _resetStateInferenceNetworkV2() {
840
+ _innV2.clear();
841
+ _ijsV2.clear();
842
+ _inMaxActivePerOperator = 12;
843
+ _inMaxPendingJobsPerNode = 25;
844
+ _inIdleMs = 24 * 60 * 60 * 1000;
845
+ _ijStuckMs = 10 * 60 * 1000;
846
+ }
847
+
848
+ export function registerInferenceNodeV2({
849
+ id,
850
+ operator,
851
+ model,
852
+ metadata,
853
+ } = {}) {
854
+ if (!id || typeof id !== "string") throw new Error("id is required");
855
+ if (!operator || typeof operator !== "string")
856
+ throw new Error("operator is required");
857
+ if (_innV2.has(id))
858
+ throw new Error(`inference node ${id} already registered`);
859
+ const now = Date.now();
860
+ const n = {
861
+ id,
862
+ operator,
863
+ model: model || "default",
864
+ status: INFERENCE_NODE_MATURITY_V2.PENDING,
865
+ createdAt: now,
866
+ updatedAt: now,
867
+ activatedAt: null,
868
+ decommissionedAt: null,
869
+ lastTouchedAt: now,
870
+ metadata: { ...(metadata || {}) },
871
+ };
872
+ _innV2.set(id, n);
873
+ return { ...n, metadata: { ...n.metadata } };
874
+ }
875
+ function _inCheckN(from, to) {
876
+ const a = _inTrans.get(from);
877
+ if (!a || !a.has(to))
878
+ throw new Error(`invalid inference node transition ${from} → ${to}`);
879
+ }
880
+ function _inCountActive(operator) {
881
+ let n = 0;
882
+ for (const x of _innV2.values())
883
+ if (
884
+ x.operator === operator &&
885
+ x.status === INFERENCE_NODE_MATURITY_V2.ACTIVE
886
+ )
887
+ n++;
888
+ return n;
889
+ }
890
+
891
+ export function activateInferenceNodeV2(id) {
892
+ const n = _innV2.get(id);
893
+ if (!n) throw new Error(`inference node ${id} not found`);
894
+ _inCheckN(n.status, INFERENCE_NODE_MATURITY_V2.ACTIVE);
895
+ const recovery = n.status === INFERENCE_NODE_MATURITY_V2.DEGRADED;
896
+ if (!recovery) {
897
+ const c = _inCountActive(n.operator);
898
+ if (c >= _inMaxActivePerOperator)
899
+ throw new Error(
900
+ `max active inference nodes per operator (${_inMaxActivePerOperator}) reached for ${n.operator}`,
901
+ );
902
+ }
903
+ const now = Date.now();
904
+ n.status = INFERENCE_NODE_MATURITY_V2.ACTIVE;
905
+ n.updatedAt = now;
906
+ n.lastTouchedAt = now;
907
+ if (!n.activatedAt) n.activatedAt = now;
908
+ return { ...n, metadata: { ...n.metadata } };
909
+ }
910
+ export function degradeInferenceNodeV2(id) {
911
+ const n = _innV2.get(id);
912
+ if (!n) throw new Error(`inference node ${id} not found`);
913
+ _inCheckN(n.status, INFERENCE_NODE_MATURITY_V2.DEGRADED);
914
+ n.status = INFERENCE_NODE_MATURITY_V2.DEGRADED;
915
+ n.updatedAt = Date.now();
916
+ return { ...n, metadata: { ...n.metadata } };
917
+ }
918
+ export function decommissionInferenceNodeV2(id) {
919
+ const n = _innV2.get(id);
920
+ if (!n) throw new Error(`inference node ${id} not found`);
921
+ _inCheckN(n.status, INFERENCE_NODE_MATURITY_V2.DECOMMISSIONED);
922
+ const now = Date.now();
923
+ n.status = INFERENCE_NODE_MATURITY_V2.DECOMMISSIONED;
924
+ n.updatedAt = now;
925
+ if (!n.decommissionedAt) n.decommissionedAt = now;
926
+ return { ...n, metadata: { ...n.metadata } };
927
+ }
928
+ export function touchInferenceNodeV2(id) {
929
+ const n = _innV2.get(id);
930
+ if (!n) throw new Error(`inference node ${id} not found`);
931
+ if (_inTerminal.has(n.status))
932
+ throw new Error(`cannot touch terminal inference node ${id}`);
933
+ const now = Date.now();
934
+ n.lastTouchedAt = now;
935
+ n.updatedAt = now;
936
+ return { ...n, metadata: { ...n.metadata } };
937
+ }
938
+ export function getInferenceNodeV2(id) {
939
+ const n = _innV2.get(id);
940
+ if (!n) return null;
941
+ return { ...n, metadata: { ...n.metadata } };
942
+ }
943
+ export function listInferenceNodesV2() {
944
+ return [..._innV2.values()].map((n) => ({
945
+ ...n,
946
+ metadata: { ...n.metadata },
947
+ }));
948
+ }
949
+
950
+ function _ijCountPending(nodeId) {
951
+ let n = 0;
952
+ for (const j of _ijsV2.values())
953
+ if (
954
+ j.nodeId === nodeId &&
955
+ (j.status === INFERENCE_JOB_LIFECYCLE_V2.QUEUED ||
956
+ j.status === INFERENCE_JOB_LIFECYCLE_V2.RUNNING)
957
+ )
958
+ n++;
959
+ return n;
960
+ }
961
+
962
+ export function createInferenceJobV2({ id, nodeId, prompt, metadata } = {}) {
963
+ if (!id || typeof id !== "string") throw new Error("id is required");
964
+ if (!nodeId || typeof nodeId !== "string")
965
+ throw new Error("nodeId is required");
966
+ if (_ijsV2.has(id)) throw new Error(`inference job ${id} already exists`);
967
+ if (!_innV2.has(nodeId))
968
+ throw new Error(`inference node ${nodeId} not found`);
969
+ const pending = _ijCountPending(nodeId);
970
+ if (pending >= _inMaxPendingJobsPerNode)
971
+ throw new Error(
972
+ `max pending inference jobs per node (${_inMaxPendingJobsPerNode}) reached for ${nodeId}`,
973
+ );
974
+ const now = Date.now();
975
+ const j = {
976
+ id,
977
+ nodeId,
978
+ prompt: prompt || "",
979
+ status: INFERENCE_JOB_LIFECYCLE_V2.QUEUED,
980
+ createdAt: now,
981
+ updatedAt: now,
982
+ startedAt: null,
983
+ settledAt: null,
984
+ metadata: { ...(metadata || {}) },
985
+ };
986
+ _ijsV2.set(id, j);
987
+ return { ...j, metadata: { ...j.metadata } };
988
+ }
989
+ function _ijCheckJ(from, to) {
990
+ const a = _ijTrans.get(from);
991
+ if (!a || !a.has(to))
992
+ throw new Error(`invalid inference job transition ${from} → ${to}`);
993
+ }
994
+ export function startInferenceJobV2(id) {
995
+ const j = _ijsV2.get(id);
996
+ if (!j) throw new Error(`inference job ${id} not found`);
997
+ _ijCheckJ(j.status, INFERENCE_JOB_LIFECYCLE_V2.RUNNING);
998
+ const now = Date.now();
999
+ j.status = INFERENCE_JOB_LIFECYCLE_V2.RUNNING;
1000
+ j.updatedAt = now;
1001
+ if (!j.startedAt) j.startedAt = now;
1002
+ return { ...j, metadata: { ...j.metadata } };
1003
+ }
1004
+ export function completeInferenceJobV2(id) {
1005
+ const j = _ijsV2.get(id);
1006
+ if (!j) throw new Error(`inference job ${id} not found`);
1007
+ _ijCheckJ(j.status, INFERENCE_JOB_LIFECYCLE_V2.COMPLETED);
1008
+ const now = Date.now();
1009
+ j.status = INFERENCE_JOB_LIFECYCLE_V2.COMPLETED;
1010
+ j.updatedAt = now;
1011
+ if (!j.settledAt) j.settledAt = now;
1012
+ return { ...j, metadata: { ...j.metadata } };
1013
+ }
1014
+ export function failInferenceJobV2(id, reason) {
1015
+ const j = _ijsV2.get(id);
1016
+ if (!j) throw new Error(`inference job ${id} not found`);
1017
+ _ijCheckJ(j.status, INFERENCE_JOB_LIFECYCLE_V2.FAILED);
1018
+ const now = Date.now();
1019
+ j.status = INFERENCE_JOB_LIFECYCLE_V2.FAILED;
1020
+ j.updatedAt = now;
1021
+ if (!j.settledAt) j.settledAt = now;
1022
+ if (reason) j.metadata.failReason = String(reason);
1023
+ return { ...j, metadata: { ...j.metadata } };
1024
+ }
1025
+ export function cancelInferenceJobV2(id, reason) {
1026
+ const j = _ijsV2.get(id);
1027
+ if (!j) throw new Error(`inference job ${id} not found`);
1028
+ _ijCheckJ(j.status, INFERENCE_JOB_LIFECYCLE_V2.CANCELLED);
1029
+ const now = Date.now();
1030
+ j.status = INFERENCE_JOB_LIFECYCLE_V2.CANCELLED;
1031
+ j.updatedAt = now;
1032
+ if (!j.settledAt) j.settledAt = now;
1033
+ if (reason) j.metadata.cancelReason = String(reason);
1034
+ return { ...j, metadata: { ...j.metadata } };
1035
+ }
1036
+ export function getInferenceJobV2(id) {
1037
+ const j = _ijsV2.get(id);
1038
+ if (!j) return null;
1039
+ return { ...j, metadata: { ...j.metadata } };
1040
+ }
1041
+ export function listInferenceJobsV2() {
1042
+ return [..._ijsV2.values()].map((j) => ({
1043
+ ...j,
1044
+ metadata: { ...j.metadata },
1045
+ }));
1046
+ }
1047
+
1048
+ export function autoDegradeIdleInferenceNodesV2({ now } = {}) {
1049
+ const t = now ?? Date.now();
1050
+ const flipped = [];
1051
+ for (const n of _innV2.values())
1052
+ if (
1053
+ n.status === INFERENCE_NODE_MATURITY_V2.ACTIVE &&
1054
+ t - n.lastTouchedAt >= _inIdleMs
1055
+ ) {
1056
+ n.status = INFERENCE_NODE_MATURITY_V2.DEGRADED;
1057
+ n.updatedAt = t;
1058
+ flipped.push(n.id);
1059
+ }
1060
+ return { flipped, count: flipped.length };
1061
+ }
1062
+ export function autoFailStuckInferenceJobsV2({ now } = {}) {
1063
+ const t = now ?? Date.now();
1064
+ const flipped = [];
1065
+ for (const j of _ijsV2.values())
1066
+ if (
1067
+ j.status === INFERENCE_JOB_LIFECYCLE_V2.RUNNING &&
1068
+ j.startedAt != null &&
1069
+ t - j.startedAt >= _ijStuckMs
1070
+ ) {
1071
+ j.status = INFERENCE_JOB_LIFECYCLE_V2.FAILED;
1072
+ j.updatedAt = t;
1073
+ if (!j.settledAt) j.settledAt = t;
1074
+ j.metadata.failReason = "auto-fail-stuck";
1075
+ flipped.push(j.id);
1076
+ }
1077
+ return { flipped, count: flipped.length };
1078
+ }
1079
+
1080
+ export function getInferenceNetworkGovStatsV2() {
1081
+ const nodesByStatus = {};
1082
+ for (const s of Object.values(INFERENCE_NODE_MATURITY_V2))
1083
+ nodesByStatus[s] = 0;
1084
+ for (const n of _innV2.values()) nodesByStatus[n.status]++;
1085
+ const jobsByStatus = {};
1086
+ for (const s of Object.values(INFERENCE_JOB_LIFECYCLE_V2))
1087
+ jobsByStatus[s] = 0;
1088
+ for (const j of _ijsV2.values()) jobsByStatus[j.status]++;
1089
+ return {
1090
+ totalInferenceNodesV2: _innV2.size,
1091
+ totalInferenceJobsV2: _ijsV2.size,
1092
+ maxActiveInferenceNodesPerOperator: _inMaxActivePerOperator,
1093
+ maxPendingInferenceJobsPerNode: _inMaxPendingJobsPerNode,
1094
+ inferenceNodeIdleMs: _inIdleMs,
1095
+ inferenceJobStuckMs: _ijStuckMs,
1096
+ nodesByStatus,
1097
+ jobsByStatus,
1098
+ };
1099
+ }