chainlesschain 0.132.0 → 0.145.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/commands/a2a.js +230 -0
- package/src/commands/activitypub.js +191 -0
- package/src/commands/agent.js +601 -0
- package/src/commands/audit.js +206 -0
- package/src/commands/bi.js +186 -0
- package/src/commands/bm25.js +162 -0
- package/src/commands/browse.js +225 -0
- package/src/commands/ccron.js +178 -0
- package/src/commands/chat.js +207 -0
- package/src/commands/compliance.js +420 -0
- package/src/commands/compt.js +176 -0
- package/src/commands/consol.js +237 -0
- package/src/commands/cowork.js +588 -0
- package/src/commands/crosschain.js +216 -0
- package/src/commands/dao.js +216 -0
- package/src/commands/dlp.js +206 -0
- package/src/commands/economy.js +211 -0
- package/src/commands/evolution.js +209 -0
- package/src/commands/evomap.js +216 -0
- package/src/commands/fflag.js +230 -0
- package/src/commands/git.js +185 -0
- package/src/commands/hardening.js +209 -0
- package/src/commands/hmemory.js +210 -0
- package/src/commands/incentive.js +209 -0
- package/src/commands/inference.js +178 -0
- package/src/commands/itbudget.js +161 -0
- package/src/commands/kg.js +206 -0
- package/src/commands/lowcode.js +201 -0
- package/src/commands/marketplace.js +206 -0
- package/src/commands/matrix.js +214 -0
- package/src/commands/mcpscaf.js +153 -0
- package/src/commands/meminj.js +153 -0
- package/src/commands/nostr.js +213 -0
- package/src/commands/orchestrate.js +217 -0
- package/src/commands/orchgov.js +156 -0
- package/src/commands/pdfp.js +160 -0
- package/src/commands/perf.js +176 -0
- package/src/commands/perm.js +156 -0
- package/src/commands/pipeline.js +211 -0
- package/src/commands/planmode.js +154 -0
- package/src/commands/privacy.js +203 -0
- package/src/commands/promcomp.js +166 -0
- package/src/commands/recommend.js +185 -0
- package/src/commands/reputation.js +208 -0
- package/src/commands/sandbox.js +206 -0
- package/src/commands/seshhook.js +153 -0
- package/src/commands/seshsearch.js +149 -0
- package/src/commands/seshtail.js +152 -0
- package/src/commands/seshu.js +160 -0
- package/src/commands/sganal.js +172 -0
- package/src/commands/siem.js +207 -0
- package/src/commands/sla.js +212 -0
- package/src/commands/slotfill.js +154 -0
- package/src/commands/social.js +159 -0
- package/src/commands/stress.js +206 -0
- package/src/commands/svccont.js +157 -0
- package/src/commands/terraform.js +206 -0
- package/src/commands/tms.js +183 -0
- package/src/commands/topiccls.js +158 -0
- package/src/commands/uprof.js +154 -0
- package/src/commands/vcheck.js +172 -0
- package/src/commands/webfetch.js +150 -0
- package/src/commands/zkp.js +218 -0
- package/src/harness/prompt-compressor.js +331 -0
- package/src/index.js +101 -1
- package/src/lib/a2a-protocol.js +373 -0
- package/src/lib/activitypub-bridge.js +343 -0
- package/src/lib/agent-economy.js +358 -0
- package/src/lib/app-builder.js +338 -0
- package/src/lib/audit-logger.js +321 -0
- package/src/lib/autonomous-agent.js +341 -0
- package/src/lib/bi-engine.js +339 -0
- package/src/lib/bm25-search.js +333 -0
- package/src/lib/browser-automation.js +352 -0
- package/src/lib/chat-core.js +336 -0
- package/src/lib/claude-code-bridge.js +341 -0
- package/src/lib/compliance-framework-reporter.js +359 -0
- package/src/lib/compliance-manager.js +330 -0
- package/src/lib/compression-telemetry.js +333 -0
- package/src/lib/content-recommender.js +370 -0
- package/src/lib/cowork-cron.js +330 -0
- package/src/lib/cowork-learning.js +333 -0
- package/src/lib/cowork-task-runner.js +362 -0
- package/src/lib/cowork-workflow.js +327 -0
- package/src/lib/cross-chain.js +365 -0
- package/src/lib/dao-governance.js +339 -0
- package/src/lib/dlp-engine.js +343 -0
- package/src/lib/evolution-system.js +336 -0
- package/src/lib/evomap-manager.js +339 -0
- package/src/lib/execution-backend.js +351 -0
- package/src/lib/feature-flags.js +330 -0
- package/src/lib/git-integration.js +343 -0
- package/src/lib/hardening-manager.js +341 -0
- package/src/lib/hierarchical-memory.js +341 -0
- package/src/lib/inference-network.js +362 -0
- package/src/lib/iteration-budget.js +357 -0
- package/src/lib/knowledge-graph.js +333 -0
- package/src/lib/matrix-bridge.js +339 -0
- package/src/lib/mcp-scaffold.js +345 -0
- package/src/lib/memory-injection.js +320 -0
- package/src/lib/nostr-bridge.js +342 -0
- package/src/lib/orchestrator.js +350 -0
- package/src/lib/pdf-parser.js +330 -0
- package/src/lib/perf-tuning.js +364 -0
- package/src/lib/permission-engine.js +319 -0
- package/src/lib/pipeline-orchestrator.js +345 -0
- package/src/lib/plan-mode.js +328 -0
- package/src/lib/privacy-computing.js +335 -0
- package/src/lib/prompt-compressor.js +1 -10
- package/src/lib/reputation-optimizer.js +340 -0
- package/src/lib/sandbox-v2.js +327 -0
- package/src/lib/service-container.js +342 -0
- package/src/lib/session-consolidator.js +352 -0
- package/src/lib/session-hooks.js +340 -0
- package/src/lib/session-search.js +334 -0
- package/src/lib/session-tail.js +320 -0
- package/src/lib/session-usage.js +329 -0
- package/src/lib/siem-exporter.js +352 -0
- package/src/lib/skill-marketplace.js +345 -0
- package/src/lib/sla-manager.js +341 -0
- package/src/lib/slot-filler.js +333 -0
- package/src/lib/social-graph-analytics.js +327 -0
- package/src/lib/social-graph.js +304 -0
- package/src/lib/stress-tester.js +342 -0
- package/src/lib/sub-agent-registry.js +359 -0
- package/src/lib/task-model-selector.js +333 -0
- package/src/lib/terraform-manager.js +333 -0
- package/src/lib/todo-manager.js +339 -0
- package/src/lib/token-incentive.js +341 -0
- package/src/lib/topic-classifier.js +353 -0
- package/src/lib/user-profile.js +325 -0
- package/src/lib/version-checker.js +335 -0
- package/src/lib/web-fetch.js +322 -0
- package/src/lib/zkp-engine.js +342 -0
package/src/lib/sandbox-v2.js
CHANGED
|
@@ -1002,3 +1002,330 @@ export function getSandboxStatsV2() {
|
|
|
1002
1002
|
},
|
|
1003
1003
|
};
|
|
1004
1004
|
}
|
|
1005
|
+
|
|
1006
|
+
// =====================================================================
|
|
1007
|
+
// sandbox-v2 V2 governance overlay (iter16)
|
|
1008
|
+
// =====================================================================
|
|
1009
|
+
export const SBOX_PROFILE_MATURITY_V2 = Object.freeze({
|
|
1010
|
+
PENDING: "pending",
|
|
1011
|
+
ACTIVE: "active",
|
|
1012
|
+
PAUSED: "paused",
|
|
1013
|
+
ARCHIVED: "archived",
|
|
1014
|
+
});
|
|
1015
|
+
export const SBOX_EXEC_LIFECYCLE_V2 = Object.freeze({
|
|
1016
|
+
QUEUED: "queued",
|
|
1017
|
+
RUNNING: "running",
|
|
1018
|
+
COMPLETED: "completed",
|
|
1019
|
+
FAILED: "failed",
|
|
1020
|
+
CANCELLED: "cancelled",
|
|
1021
|
+
});
|
|
1022
|
+
const _sboxPTrans = new Map([
|
|
1023
|
+
[
|
|
1024
|
+
SBOX_PROFILE_MATURITY_V2.PENDING,
|
|
1025
|
+
new Set([
|
|
1026
|
+
SBOX_PROFILE_MATURITY_V2.ACTIVE,
|
|
1027
|
+
SBOX_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1028
|
+
]),
|
|
1029
|
+
],
|
|
1030
|
+
[
|
|
1031
|
+
SBOX_PROFILE_MATURITY_V2.ACTIVE,
|
|
1032
|
+
new Set([
|
|
1033
|
+
SBOX_PROFILE_MATURITY_V2.PAUSED,
|
|
1034
|
+
SBOX_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1035
|
+
]),
|
|
1036
|
+
],
|
|
1037
|
+
[
|
|
1038
|
+
SBOX_PROFILE_MATURITY_V2.PAUSED,
|
|
1039
|
+
new Set([
|
|
1040
|
+
SBOX_PROFILE_MATURITY_V2.ACTIVE,
|
|
1041
|
+
SBOX_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1042
|
+
]),
|
|
1043
|
+
],
|
|
1044
|
+
[SBOX_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
1045
|
+
]);
|
|
1046
|
+
const _sboxPTerminal = new Set([SBOX_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
1047
|
+
const _sboxJTrans = new Map([
|
|
1048
|
+
[
|
|
1049
|
+
SBOX_EXEC_LIFECYCLE_V2.QUEUED,
|
|
1050
|
+
new Set([SBOX_EXEC_LIFECYCLE_V2.RUNNING, SBOX_EXEC_LIFECYCLE_V2.CANCELLED]),
|
|
1051
|
+
],
|
|
1052
|
+
[
|
|
1053
|
+
SBOX_EXEC_LIFECYCLE_V2.RUNNING,
|
|
1054
|
+
new Set([
|
|
1055
|
+
SBOX_EXEC_LIFECYCLE_V2.COMPLETED,
|
|
1056
|
+
SBOX_EXEC_LIFECYCLE_V2.FAILED,
|
|
1057
|
+
SBOX_EXEC_LIFECYCLE_V2.CANCELLED,
|
|
1058
|
+
]),
|
|
1059
|
+
],
|
|
1060
|
+
[SBOX_EXEC_LIFECYCLE_V2.COMPLETED, new Set()],
|
|
1061
|
+
[SBOX_EXEC_LIFECYCLE_V2.FAILED, new Set()],
|
|
1062
|
+
[SBOX_EXEC_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
1063
|
+
]);
|
|
1064
|
+
const _sboxPsV2 = new Map();
|
|
1065
|
+
const _sboxJsV2 = new Map();
|
|
1066
|
+
let _sboxMaxActive = 6,
|
|
1067
|
+
_sboxMaxPending = 12,
|
|
1068
|
+
_sboxIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
1069
|
+
_sboxStuckMs = 60 * 1000;
|
|
1070
|
+
function _sboxPos(n, label) {
|
|
1071
|
+
const v = Math.floor(Number(n));
|
|
1072
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
1073
|
+
throw new Error(`${label} must be positive integer`);
|
|
1074
|
+
return v;
|
|
1075
|
+
}
|
|
1076
|
+
function _sboxCheckP(from, to) {
|
|
1077
|
+
const a = _sboxPTrans.get(from);
|
|
1078
|
+
if (!a || !a.has(to))
|
|
1079
|
+
throw new Error(`invalid sbox profile transition ${from} → ${to}`);
|
|
1080
|
+
}
|
|
1081
|
+
function _sboxCheckJ(from, to) {
|
|
1082
|
+
const a = _sboxJTrans.get(from);
|
|
1083
|
+
if (!a || !a.has(to))
|
|
1084
|
+
throw new Error(`invalid sbox exec transition ${from} → ${to}`);
|
|
1085
|
+
}
|
|
1086
|
+
function _sboxCountActive(owner) {
|
|
1087
|
+
let c = 0;
|
|
1088
|
+
for (const p of _sboxPsV2.values())
|
|
1089
|
+
if (p.owner === owner && p.status === SBOX_PROFILE_MATURITY_V2.ACTIVE) c++;
|
|
1090
|
+
return c;
|
|
1091
|
+
}
|
|
1092
|
+
function _sboxCountPending(profileId) {
|
|
1093
|
+
let c = 0;
|
|
1094
|
+
for (const j of _sboxJsV2.values())
|
|
1095
|
+
if (
|
|
1096
|
+
j.profileId === profileId &&
|
|
1097
|
+
(j.status === SBOX_EXEC_LIFECYCLE_V2.QUEUED ||
|
|
1098
|
+
j.status === SBOX_EXEC_LIFECYCLE_V2.RUNNING)
|
|
1099
|
+
)
|
|
1100
|
+
c++;
|
|
1101
|
+
return c;
|
|
1102
|
+
}
|
|
1103
|
+
export function setMaxActiveSboxProfilesPerOwnerV2(n) {
|
|
1104
|
+
_sboxMaxActive = _sboxPos(n, "maxActiveSboxProfilesPerOwner");
|
|
1105
|
+
}
|
|
1106
|
+
export function getMaxActiveSboxProfilesPerOwnerV2() {
|
|
1107
|
+
return _sboxMaxActive;
|
|
1108
|
+
}
|
|
1109
|
+
export function setMaxPendingSboxExecsPerProfileV2(n) {
|
|
1110
|
+
_sboxMaxPending = _sboxPos(n, "maxPendingSboxExecsPerProfile");
|
|
1111
|
+
}
|
|
1112
|
+
export function getMaxPendingSboxExecsPerProfileV2() {
|
|
1113
|
+
return _sboxMaxPending;
|
|
1114
|
+
}
|
|
1115
|
+
export function setSboxProfileIdleMsV2(n) {
|
|
1116
|
+
_sboxIdleMs = _sboxPos(n, "sboxProfileIdleMs");
|
|
1117
|
+
}
|
|
1118
|
+
export function getSboxProfileIdleMsV2() {
|
|
1119
|
+
return _sboxIdleMs;
|
|
1120
|
+
}
|
|
1121
|
+
export function setSboxExecStuckMsV2(n) {
|
|
1122
|
+
_sboxStuckMs = _sboxPos(n, "sboxExecStuckMs");
|
|
1123
|
+
}
|
|
1124
|
+
export function getSboxExecStuckMsV2() {
|
|
1125
|
+
return _sboxStuckMs;
|
|
1126
|
+
}
|
|
1127
|
+
export function _resetStateSandboxV2() {
|
|
1128
|
+
_sboxPsV2.clear();
|
|
1129
|
+
_sboxJsV2.clear();
|
|
1130
|
+
_sboxMaxActive = 6;
|
|
1131
|
+
_sboxMaxPending = 12;
|
|
1132
|
+
_sboxIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
1133
|
+
_sboxStuckMs = 60 * 1000;
|
|
1134
|
+
}
|
|
1135
|
+
export function registerSboxProfileV2({ id, owner, template, metadata } = {}) {
|
|
1136
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
1137
|
+
if (_sboxPsV2.has(id)) throw new Error(`sbox profile ${id} already exists`);
|
|
1138
|
+
const now = Date.now();
|
|
1139
|
+
const p = {
|
|
1140
|
+
id,
|
|
1141
|
+
owner,
|
|
1142
|
+
template: template || "default",
|
|
1143
|
+
status: SBOX_PROFILE_MATURITY_V2.PENDING,
|
|
1144
|
+
createdAt: now,
|
|
1145
|
+
updatedAt: now,
|
|
1146
|
+
lastTouchedAt: now,
|
|
1147
|
+
activatedAt: null,
|
|
1148
|
+
archivedAt: null,
|
|
1149
|
+
metadata: { ...(metadata || {}) },
|
|
1150
|
+
};
|
|
1151
|
+
_sboxPsV2.set(id, p);
|
|
1152
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1153
|
+
}
|
|
1154
|
+
export function activateSboxProfileV2(id) {
|
|
1155
|
+
const p = _sboxPsV2.get(id);
|
|
1156
|
+
if (!p) throw new Error(`sbox profile ${id} not found`);
|
|
1157
|
+
const isInitial = p.status === SBOX_PROFILE_MATURITY_V2.PENDING;
|
|
1158
|
+
_sboxCheckP(p.status, SBOX_PROFILE_MATURITY_V2.ACTIVE);
|
|
1159
|
+
if (isInitial && _sboxCountActive(p.owner) >= _sboxMaxActive)
|
|
1160
|
+
throw new Error(`max active sbox profiles for owner ${p.owner} reached`);
|
|
1161
|
+
const now = Date.now();
|
|
1162
|
+
p.status = SBOX_PROFILE_MATURITY_V2.ACTIVE;
|
|
1163
|
+
p.updatedAt = now;
|
|
1164
|
+
p.lastTouchedAt = now;
|
|
1165
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
1166
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1167
|
+
}
|
|
1168
|
+
export function pauseSboxProfileV2(id) {
|
|
1169
|
+
const p = _sboxPsV2.get(id);
|
|
1170
|
+
if (!p) throw new Error(`sbox profile ${id} not found`);
|
|
1171
|
+
_sboxCheckP(p.status, SBOX_PROFILE_MATURITY_V2.PAUSED);
|
|
1172
|
+
p.status = SBOX_PROFILE_MATURITY_V2.PAUSED;
|
|
1173
|
+
p.updatedAt = Date.now();
|
|
1174
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1175
|
+
}
|
|
1176
|
+
export function archiveSboxProfileV2(id) {
|
|
1177
|
+
const p = _sboxPsV2.get(id);
|
|
1178
|
+
if (!p) throw new Error(`sbox profile ${id} not found`);
|
|
1179
|
+
_sboxCheckP(p.status, SBOX_PROFILE_MATURITY_V2.ARCHIVED);
|
|
1180
|
+
const now = Date.now();
|
|
1181
|
+
p.status = SBOX_PROFILE_MATURITY_V2.ARCHIVED;
|
|
1182
|
+
p.updatedAt = now;
|
|
1183
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
1184
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1185
|
+
}
|
|
1186
|
+
export function touchSboxProfileV2(id) {
|
|
1187
|
+
const p = _sboxPsV2.get(id);
|
|
1188
|
+
if (!p) throw new Error(`sbox profile ${id} not found`);
|
|
1189
|
+
if (_sboxPTerminal.has(p.status))
|
|
1190
|
+
throw new Error(`cannot touch terminal sbox profile ${id}`);
|
|
1191
|
+
const now = Date.now();
|
|
1192
|
+
p.lastTouchedAt = now;
|
|
1193
|
+
p.updatedAt = now;
|
|
1194
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1195
|
+
}
|
|
1196
|
+
export function getSboxProfileV2(id) {
|
|
1197
|
+
const p = _sboxPsV2.get(id);
|
|
1198
|
+
if (!p) return null;
|
|
1199
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1200
|
+
}
|
|
1201
|
+
export function listSboxProfilesV2() {
|
|
1202
|
+
return [..._sboxPsV2.values()].map((p) => ({
|
|
1203
|
+
...p,
|
|
1204
|
+
metadata: { ...p.metadata },
|
|
1205
|
+
}));
|
|
1206
|
+
}
|
|
1207
|
+
export function createSboxExecV2({ id, profileId, command, metadata } = {}) {
|
|
1208
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
1209
|
+
if (_sboxJsV2.has(id)) throw new Error(`sbox exec ${id} already exists`);
|
|
1210
|
+
if (!_sboxPsV2.has(profileId))
|
|
1211
|
+
throw new Error(`sbox profile ${profileId} not found`);
|
|
1212
|
+
if (_sboxCountPending(profileId) >= _sboxMaxPending)
|
|
1213
|
+
throw new Error(`max pending sbox execs for profile ${profileId} reached`);
|
|
1214
|
+
const now = Date.now();
|
|
1215
|
+
const j = {
|
|
1216
|
+
id,
|
|
1217
|
+
profileId,
|
|
1218
|
+
command: command || "",
|
|
1219
|
+
status: SBOX_EXEC_LIFECYCLE_V2.QUEUED,
|
|
1220
|
+
createdAt: now,
|
|
1221
|
+
updatedAt: now,
|
|
1222
|
+
startedAt: null,
|
|
1223
|
+
settledAt: null,
|
|
1224
|
+
metadata: { ...(metadata || {}) },
|
|
1225
|
+
};
|
|
1226
|
+
_sboxJsV2.set(id, j);
|
|
1227
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1228
|
+
}
|
|
1229
|
+
export function runningSboxExecV2(id) {
|
|
1230
|
+
const j = _sboxJsV2.get(id);
|
|
1231
|
+
if (!j) throw new Error(`sbox exec ${id} not found`);
|
|
1232
|
+
_sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.RUNNING);
|
|
1233
|
+
const now = Date.now();
|
|
1234
|
+
j.status = SBOX_EXEC_LIFECYCLE_V2.RUNNING;
|
|
1235
|
+
j.updatedAt = now;
|
|
1236
|
+
if (!j.startedAt) j.startedAt = now;
|
|
1237
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1238
|
+
}
|
|
1239
|
+
export function completeExecSboxV2(id) {
|
|
1240
|
+
const j = _sboxJsV2.get(id);
|
|
1241
|
+
if (!j) throw new Error(`sbox exec ${id} not found`);
|
|
1242
|
+
_sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.COMPLETED);
|
|
1243
|
+
const now = Date.now();
|
|
1244
|
+
j.status = SBOX_EXEC_LIFECYCLE_V2.COMPLETED;
|
|
1245
|
+
j.updatedAt = now;
|
|
1246
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1247
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1248
|
+
}
|
|
1249
|
+
export function failSboxExecV2(id, reason) {
|
|
1250
|
+
const j = _sboxJsV2.get(id);
|
|
1251
|
+
if (!j) throw new Error(`sbox exec ${id} not found`);
|
|
1252
|
+
_sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.FAILED);
|
|
1253
|
+
const now = Date.now();
|
|
1254
|
+
j.status = SBOX_EXEC_LIFECYCLE_V2.FAILED;
|
|
1255
|
+
j.updatedAt = now;
|
|
1256
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1257
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
1258
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1259
|
+
}
|
|
1260
|
+
export function cancelSboxExecV2(id, reason) {
|
|
1261
|
+
const j = _sboxJsV2.get(id);
|
|
1262
|
+
if (!j) throw new Error(`sbox exec ${id} not found`);
|
|
1263
|
+
_sboxCheckJ(j.status, SBOX_EXEC_LIFECYCLE_V2.CANCELLED);
|
|
1264
|
+
const now = Date.now();
|
|
1265
|
+
j.status = SBOX_EXEC_LIFECYCLE_V2.CANCELLED;
|
|
1266
|
+
j.updatedAt = now;
|
|
1267
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1268
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1269
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1270
|
+
}
|
|
1271
|
+
export function getSboxExecV2(id) {
|
|
1272
|
+
const j = _sboxJsV2.get(id);
|
|
1273
|
+
if (!j) return null;
|
|
1274
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1275
|
+
}
|
|
1276
|
+
export function listSboxExecsV2() {
|
|
1277
|
+
return [..._sboxJsV2.values()].map((j) => ({
|
|
1278
|
+
...j,
|
|
1279
|
+
metadata: { ...j.metadata },
|
|
1280
|
+
}));
|
|
1281
|
+
}
|
|
1282
|
+
export function autoPauseIdleSboxProfilesV2({ now } = {}) {
|
|
1283
|
+
const t = now ?? Date.now();
|
|
1284
|
+
const flipped = [];
|
|
1285
|
+
for (const p of _sboxPsV2.values())
|
|
1286
|
+
if (
|
|
1287
|
+
p.status === SBOX_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1288
|
+
t - p.lastTouchedAt >= _sboxIdleMs
|
|
1289
|
+
) {
|
|
1290
|
+
p.status = SBOX_PROFILE_MATURITY_V2.PAUSED;
|
|
1291
|
+
p.updatedAt = t;
|
|
1292
|
+
flipped.push(p.id);
|
|
1293
|
+
}
|
|
1294
|
+
return { flipped, count: flipped.length };
|
|
1295
|
+
}
|
|
1296
|
+
export function autoFailStuckSboxExecsV2({ now } = {}) {
|
|
1297
|
+
const t = now ?? Date.now();
|
|
1298
|
+
const flipped = [];
|
|
1299
|
+
for (const j of _sboxJsV2.values())
|
|
1300
|
+
if (
|
|
1301
|
+
j.status === SBOX_EXEC_LIFECYCLE_V2.RUNNING &&
|
|
1302
|
+
j.startedAt != null &&
|
|
1303
|
+
t - j.startedAt >= _sboxStuckMs
|
|
1304
|
+
) {
|
|
1305
|
+
j.status = SBOX_EXEC_LIFECYCLE_V2.FAILED;
|
|
1306
|
+
j.updatedAt = t;
|
|
1307
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1308
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1309
|
+
flipped.push(j.id);
|
|
1310
|
+
}
|
|
1311
|
+
return { flipped, count: flipped.length };
|
|
1312
|
+
}
|
|
1313
|
+
export function getSandboxGovStatsV2() {
|
|
1314
|
+
const profilesByStatus = {};
|
|
1315
|
+
for (const v of Object.values(SBOX_PROFILE_MATURITY_V2))
|
|
1316
|
+
profilesByStatus[v] = 0;
|
|
1317
|
+
for (const p of _sboxPsV2.values()) profilesByStatus[p.status]++;
|
|
1318
|
+
const execsByStatus = {};
|
|
1319
|
+
for (const v of Object.values(SBOX_EXEC_LIFECYCLE_V2)) execsByStatus[v] = 0;
|
|
1320
|
+
for (const j of _sboxJsV2.values()) execsByStatus[j.status]++;
|
|
1321
|
+
return {
|
|
1322
|
+
totalSboxProfilesV2: _sboxPsV2.size,
|
|
1323
|
+
totalSboxExecsV2: _sboxJsV2.size,
|
|
1324
|
+
maxActiveSboxProfilesPerOwner: _sboxMaxActive,
|
|
1325
|
+
maxPendingSboxExecsPerProfile: _sboxMaxPending,
|
|
1326
|
+
sboxProfileIdleMs: _sboxIdleMs,
|
|
1327
|
+
sboxExecStuckMs: _sboxStuckMs,
|
|
1328
|
+
profilesByStatus,
|
|
1329
|
+
execsByStatus,
|
|
1330
|
+
};
|
|
1331
|
+
}
|
|
@@ -181,3 +181,345 @@ export class ServiceContainer {
|
|
|
181
181
|
export function createServiceContainer() {
|
|
182
182
|
return new ServiceContainer();
|
|
183
183
|
}
|
|
184
|
+
|
|
185
|
+
// ===== V2 Surface: Service Container governance overlay (CLI v0.141.0) =====
|
|
186
|
+
export const SVC_CONTAINER_MATURITY_V2 = Object.freeze({
|
|
187
|
+
PENDING: "pending",
|
|
188
|
+
ACTIVE: "active",
|
|
189
|
+
DEGRADED: "degraded",
|
|
190
|
+
DECOMMISSIONED: "decommissioned",
|
|
191
|
+
});
|
|
192
|
+
export const SVC_RESOLUTION_LIFECYCLE_V2 = Object.freeze({
|
|
193
|
+
QUEUED: "queued",
|
|
194
|
+
RESOLVING: "resolving",
|
|
195
|
+
RESOLVED: "resolved",
|
|
196
|
+
FAILED: "failed",
|
|
197
|
+
CANCELLED: "cancelled",
|
|
198
|
+
});
|
|
199
|
+
const _svcCTrans = new Map([
|
|
200
|
+
[
|
|
201
|
+
SVC_CONTAINER_MATURITY_V2.PENDING,
|
|
202
|
+
new Set([
|
|
203
|
+
SVC_CONTAINER_MATURITY_V2.ACTIVE,
|
|
204
|
+
SVC_CONTAINER_MATURITY_V2.DECOMMISSIONED,
|
|
205
|
+
]),
|
|
206
|
+
],
|
|
207
|
+
[
|
|
208
|
+
SVC_CONTAINER_MATURITY_V2.ACTIVE,
|
|
209
|
+
new Set([
|
|
210
|
+
SVC_CONTAINER_MATURITY_V2.DEGRADED,
|
|
211
|
+
SVC_CONTAINER_MATURITY_V2.DECOMMISSIONED,
|
|
212
|
+
]),
|
|
213
|
+
],
|
|
214
|
+
[
|
|
215
|
+
SVC_CONTAINER_MATURITY_V2.DEGRADED,
|
|
216
|
+
new Set([
|
|
217
|
+
SVC_CONTAINER_MATURITY_V2.ACTIVE,
|
|
218
|
+
SVC_CONTAINER_MATURITY_V2.DECOMMISSIONED,
|
|
219
|
+
]),
|
|
220
|
+
],
|
|
221
|
+
[SVC_CONTAINER_MATURITY_V2.DECOMMISSIONED, new Set()],
|
|
222
|
+
]);
|
|
223
|
+
const _svcCTerminal = new Set([SVC_CONTAINER_MATURITY_V2.DECOMMISSIONED]);
|
|
224
|
+
const _svcRTrans = new Map([
|
|
225
|
+
[
|
|
226
|
+
SVC_RESOLUTION_LIFECYCLE_V2.QUEUED,
|
|
227
|
+
new Set([
|
|
228
|
+
SVC_RESOLUTION_LIFECYCLE_V2.RESOLVING,
|
|
229
|
+
SVC_RESOLUTION_LIFECYCLE_V2.CANCELLED,
|
|
230
|
+
]),
|
|
231
|
+
],
|
|
232
|
+
[
|
|
233
|
+
SVC_RESOLUTION_LIFECYCLE_V2.RESOLVING,
|
|
234
|
+
new Set([
|
|
235
|
+
SVC_RESOLUTION_LIFECYCLE_V2.RESOLVED,
|
|
236
|
+
SVC_RESOLUTION_LIFECYCLE_V2.FAILED,
|
|
237
|
+
SVC_RESOLUTION_LIFECYCLE_V2.CANCELLED,
|
|
238
|
+
]),
|
|
239
|
+
],
|
|
240
|
+
[SVC_RESOLUTION_LIFECYCLE_V2.RESOLVED, new Set()],
|
|
241
|
+
[SVC_RESOLUTION_LIFECYCLE_V2.FAILED, new Set()],
|
|
242
|
+
[SVC_RESOLUTION_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
243
|
+
]);
|
|
244
|
+
const _svcCsV2 = new Map();
|
|
245
|
+
const _svcRsV2 = new Map();
|
|
246
|
+
let _svcMaxActivePerOwner = 8,
|
|
247
|
+
_svcMaxPendingResPerContainer = 25,
|
|
248
|
+
_svcIdleMs = 60 * 60 * 1000,
|
|
249
|
+
_svcStuckMs = 30 * 1000;
|
|
250
|
+
function _svcPos(n, label) {
|
|
251
|
+
const v = Math.floor(Number(n));
|
|
252
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
253
|
+
throw new Error(`${label} must be positive integer`);
|
|
254
|
+
return v;
|
|
255
|
+
}
|
|
256
|
+
function _svcCheckC(from, to) {
|
|
257
|
+
const a = _svcCTrans.get(from);
|
|
258
|
+
if (!a || !a.has(to))
|
|
259
|
+
throw new Error(`invalid svc container transition ${from} → ${to}`);
|
|
260
|
+
}
|
|
261
|
+
function _svcCheckR(from, to) {
|
|
262
|
+
const a = _svcRTrans.get(from);
|
|
263
|
+
if (!a || !a.has(to))
|
|
264
|
+
throw new Error(`invalid svc resolution transition ${from} → ${to}`);
|
|
265
|
+
}
|
|
266
|
+
export function setMaxActiveSvcContainersPerOwnerV2(n) {
|
|
267
|
+
_svcMaxActivePerOwner = _svcPos(n, "maxActiveSvcContainersPerOwner");
|
|
268
|
+
}
|
|
269
|
+
export function getMaxActiveSvcContainersPerOwnerV2() {
|
|
270
|
+
return _svcMaxActivePerOwner;
|
|
271
|
+
}
|
|
272
|
+
export function setMaxPendingSvcResolutionsPerContainerV2(n) {
|
|
273
|
+
_svcMaxPendingResPerContainer = _svcPos(
|
|
274
|
+
n,
|
|
275
|
+
"maxPendingSvcResolutionsPerContainer",
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
export function getMaxPendingSvcResolutionsPerContainerV2() {
|
|
279
|
+
return _svcMaxPendingResPerContainer;
|
|
280
|
+
}
|
|
281
|
+
export function setSvcContainerIdleMsV2(n) {
|
|
282
|
+
_svcIdleMs = _svcPos(n, "svcContainerIdleMs");
|
|
283
|
+
}
|
|
284
|
+
export function getSvcContainerIdleMsV2() {
|
|
285
|
+
return _svcIdleMs;
|
|
286
|
+
}
|
|
287
|
+
export function setSvcResolutionStuckMsV2(n) {
|
|
288
|
+
_svcStuckMs = _svcPos(n, "svcResolutionStuckMs");
|
|
289
|
+
}
|
|
290
|
+
export function getSvcResolutionStuckMsV2() {
|
|
291
|
+
return _svcStuckMs;
|
|
292
|
+
}
|
|
293
|
+
export function _resetStateServiceContainerV2() {
|
|
294
|
+
_svcCsV2.clear();
|
|
295
|
+
_svcRsV2.clear();
|
|
296
|
+
_svcMaxActivePerOwner = 8;
|
|
297
|
+
_svcMaxPendingResPerContainer = 25;
|
|
298
|
+
_svcIdleMs = 60 * 60 * 1000;
|
|
299
|
+
_svcStuckMs = 30 * 1000;
|
|
300
|
+
}
|
|
301
|
+
export function registerSvcContainerV2({ id, owner, scope, metadata } = {}) {
|
|
302
|
+
if (!id) throw new Error("svc container id required");
|
|
303
|
+
if (!owner) throw new Error("svc container owner required");
|
|
304
|
+
if (_svcCsV2.has(id))
|
|
305
|
+
throw new Error(`svc container ${id} already registered`);
|
|
306
|
+
const now = Date.now();
|
|
307
|
+
const c = {
|
|
308
|
+
id,
|
|
309
|
+
owner,
|
|
310
|
+
scope: scope || "default",
|
|
311
|
+
status: SVC_CONTAINER_MATURITY_V2.PENDING,
|
|
312
|
+
createdAt: now,
|
|
313
|
+
updatedAt: now,
|
|
314
|
+
activatedAt: null,
|
|
315
|
+
decommissionedAt: null,
|
|
316
|
+
lastTouchedAt: now,
|
|
317
|
+
metadata: { ...(metadata || {}) },
|
|
318
|
+
};
|
|
319
|
+
_svcCsV2.set(id, c);
|
|
320
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
321
|
+
}
|
|
322
|
+
function _svcCountActive(owner) {
|
|
323
|
+
let n = 0;
|
|
324
|
+
for (const c of _svcCsV2.values())
|
|
325
|
+
if (c.owner === owner && c.status === SVC_CONTAINER_MATURITY_V2.ACTIVE) n++;
|
|
326
|
+
return n;
|
|
327
|
+
}
|
|
328
|
+
export function activateSvcContainerV2(id) {
|
|
329
|
+
const c = _svcCsV2.get(id);
|
|
330
|
+
if (!c) throw new Error(`svc container ${id} not found`);
|
|
331
|
+
_svcCheckC(c.status, SVC_CONTAINER_MATURITY_V2.ACTIVE);
|
|
332
|
+
const recovery = c.status === SVC_CONTAINER_MATURITY_V2.DEGRADED;
|
|
333
|
+
if (!recovery && _svcCountActive(c.owner) >= _svcMaxActivePerOwner)
|
|
334
|
+
throw new Error(`max active svc containers for owner ${c.owner} reached`);
|
|
335
|
+
const now = Date.now();
|
|
336
|
+
c.status = SVC_CONTAINER_MATURITY_V2.ACTIVE;
|
|
337
|
+
c.updatedAt = now;
|
|
338
|
+
c.lastTouchedAt = now;
|
|
339
|
+
if (!c.activatedAt) c.activatedAt = now;
|
|
340
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
341
|
+
}
|
|
342
|
+
export function degradeSvcContainerV2(id) {
|
|
343
|
+
const c = _svcCsV2.get(id);
|
|
344
|
+
if (!c) throw new Error(`svc container ${id} not found`);
|
|
345
|
+
_svcCheckC(c.status, SVC_CONTAINER_MATURITY_V2.DEGRADED);
|
|
346
|
+
c.status = SVC_CONTAINER_MATURITY_V2.DEGRADED;
|
|
347
|
+
c.updatedAt = Date.now();
|
|
348
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
349
|
+
}
|
|
350
|
+
export function decommissionSvcContainerV2(id) {
|
|
351
|
+
const c = _svcCsV2.get(id);
|
|
352
|
+
if (!c) throw new Error(`svc container ${id} not found`);
|
|
353
|
+
_svcCheckC(c.status, SVC_CONTAINER_MATURITY_V2.DECOMMISSIONED);
|
|
354
|
+
const now = Date.now();
|
|
355
|
+
c.status = SVC_CONTAINER_MATURITY_V2.DECOMMISSIONED;
|
|
356
|
+
c.updatedAt = now;
|
|
357
|
+
if (!c.decommissionedAt) c.decommissionedAt = now;
|
|
358
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
359
|
+
}
|
|
360
|
+
export function touchSvcContainerV2(id) {
|
|
361
|
+
const c = _svcCsV2.get(id);
|
|
362
|
+
if (!c) throw new Error(`svc container ${id} not found`);
|
|
363
|
+
if (_svcCTerminal.has(c.status))
|
|
364
|
+
throw new Error(`cannot touch terminal svc container ${id}`);
|
|
365
|
+
const now = Date.now();
|
|
366
|
+
c.lastTouchedAt = now;
|
|
367
|
+
c.updatedAt = now;
|
|
368
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
369
|
+
}
|
|
370
|
+
export function getSvcContainerV2(id) {
|
|
371
|
+
const c = _svcCsV2.get(id);
|
|
372
|
+
if (!c) return null;
|
|
373
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
374
|
+
}
|
|
375
|
+
export function listSvcContainersV2() {
|
|
376
|
+
return [..._svcCsV2.values()].map((c) => ({
|
|
377
|
+
...c,
|
|
378
|
+
metadata: { ...c.metadata },
|
|
379
|
+
}));
|
|
380
|
+
}
|
|
381
|
+
function _svcCountPending(containerId) {
|
|
382
|
+
let n = 0;
|
|
383
|
+
for (const r of _svcRsV2.values())
|
|
384
|
+
if (
|
|
385
|
+
r.containerId === containerId &&
|
|
386
|
+
(r.status === SVC_RESOLUTION_LIFECYCLE_V2.QUEUED ||
|
|
387
|
+
r.status === SVC_RESOLUTION_LIFECYCLE_V2.RESOLVING)
|
|
388
|
+
)
|
|
389
|
+
n++;
|
|
390
|
+
return n;
|
|
391
|
+
}
|
|
392
|
+
export function createSvcResolutionV2({
|
|
393
|
+
id,
|
|
394
|
+
containerId,
|
|
395
|
+
token,
|
|
396
|
+
metadata,
|
|
397
|
+
} = {}) {
|
|
398
|
+
if (!id) throw new Error("svc resolution id required");
|
|
399
|
+
if (!containerId) throw new Error("svc resolution containerId required");
|
|
400
|
+
if (_svcRsV2.has(id)) throw new Error(`svc resolution ${id} already exists`);
|
|
401
|
+
if (!_svcCsV2.has(containerId))
|
|
402
|
+
throw new Error(`svc container ${containerId} not found`);
|
|
403
|
+
if (_svcCountPending(containerId) >= _svcMaxPendingResPerContainer)
|
|
404
|
+
throw new Error(
|
|
405
|
+
`max pending svc resolutions for container ${containerId} reached`,
|
|
406
|
+
);
|
|
407
|
+
const now = Date.now();
|
|
408
|
+
const r = {
|
|
409
|
+
id,
|
|
410
|
+
containerId,
|
|
411
|
+
token: token || "",
|
|
412
|
+
status: SVC_RESOLUTION_LIFECYCLE_V2.QUEUED,
|
|
413
|
+
createdAt: now,
|
|
414
|
+
updatedAt: now,
|
|
415
|
+
startedAt: null,
|
|
416
|
+
settledAt: null,
|
|
417
|
+
metadata: { ...(metadata || {}) },
|
|
418
|
+
};
|
|
419
|
+
_svcRsV2.set(id, r);
|
|
420
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
421
|
+
}
|
|
422
|
+
export function resolvingSvcResolutionV2(id) {
|
|
423
|
+
const r = _svcRsV2.get(id);
|
|
424
|
+
if (!r) throw new Error(`svc resolution ${id} not found`);
|
|
425
|
+
_svcCheckR(r.status, SVC_RESOLUTION_LIFECYCLE_V2.RESOLVING);
|
|
426
|
+
const now = Date.now();
|
|
427
|
+
r.status = SVC_RESOLUTION_LIFECYCLE_V2.RESOLVING;
|
|
428
|
+
r.updatedAt = now;
|
|
429
|
+
if (!r.startedAt) r.startedAt = now;
|
|
430
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
431
|
+
}
|
|
432
|
+
export function resolveSvcResolutionV2(id) {
|
|
433
|
+
const r = _svcRsV2.get(id);
|
|
434
|
+
if (!r) throw new Error(`svc resolution ${id} not found`);
|
|
435
|
+
_svcCheckR(r.status, SVC_RESOLUTION_LIFECYCLE_V2.RESOLVED);
|
|
436
|
+
const now = Date.now();
|
|
437
|
+
r.status = SVC_RESOLUTION_LIFECYCLE_V2.RESOLVED;
|
|
438
|
+
r.updatedAt = now;
|
|
439
|
+
if (!r.settledAt) r.settledAt = now;
|
|
440
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
441
|
+
}
|
|
442
|
+
export function failSvcResolutionV2(id, reason) {
|
|
443
|
+
const r = _svcRsV2.get(id);
|
|
444
|
+
if (!r) throw new Error(`svc resolution ${id} not found`);
|
|
445
|
+
_svcCheckR(r.status, SVC_RESOLUTION_LIFECYCLE_V2.FAILED);
|
|
446
|
+
const now = Date.now();
|
|
447
|
+
r.status = SVC_RESOLUTION_LIFECYCLE_V2.FAILED;
|
|
448
|
+
r.updatedAt = now;
|
|
449
|
+
if (!r.settledAt) r.settledAt = now;
|
|
450
|
+
if (reason) r.metadata.failReason = String(reason);
|
|
451
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
452
|
+
}
|
|
453
|
+
export function cancelSvcResolutionV2(id, reason) {
|
|
454
|
+
const r = _svcRsV2.get(id);
|
|
455
|
+
if (!r) throw new Error(`svc resolution ${id} not found`);
|
|
456
|
+
_svcCheckR(r.status, SVC_RESOLUTION_LIFECYCLE_V2.CANCELLED);
|
|
457
|
+
const now = Date.now();
|
|
458
|
+
r.status = SVC_RESOLUTION_LIFECYCLE_V2.CANCELLED;
|
|
459
|
+
r.updatedAt = now;
|
|
460
|
+
if (!r.settledAt) r.settledAt = now;
|
|
461
|
+
if (reason) r.metadata.cancelReason = String(reason);
|
|
462
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
463
|
+
}
|
|
464
|
+
export function getSvcResolutionV2(id) {
|
|
465
|
+
const r = _svcRsV2.get(id);
|
|
466
|
+
if (!r) return null;
|
|
467
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
468
|
+
}
|
|
469
|
+
export function listSvcResolutionsV2() {
|
|
470
|
+
return [..._svcRsV2.values()].map((r) => ({
|
|
471
|
+
...r,
|
|
472
|
+
metadata: { ...r.metadata },
|
|
473
|
+
}));
|
|
474
|
+
}
|
|
475
|
+
export function autoDegradeIdleSvcContainersV2({ now } = {}) {
|
|
476
|
+
const t = now ?? Date.now();
|
|
477
|
+
const flipped = [];
|
|
478
|
+
for (const c of _svcCsV2.values())
|
|
479
|
+
if (
|
|
480
|
+
c.status === SVC_CONTAINER_MATURITY_V2.ACTIVE &&
|
|
481
|
+
t - c.lastTouchedAt >= _svcIdleMs
|
|
482
|
+
) {
|
|
483
|
+
c.status = SVC_CONTAINER_MATURITY_V2.DEGRADED;
|
|
484
|
+
c.updatedAt = t;
|
|
485
|
+
flipped.push(c.id);
|
|
486
|
+
}
|
|
487
|
+
return { flipped, count: flipped.length };
|
|
488
|
+
}
|
|
489
|
+
export function autoFailStuckSvcResolutionsV2({ now } = {}) {
|
|
490
|
+
const t = now ?? Date.now();
|
|
491
|
+
const flipped = [];
|
|
492
|
+
for (const r of _svcRsV2.values())
|
|
493
|
+
if (
|
|
494
|
+
r.status === SVC_RESOLUTION_LIFECYCLE_V2.RESOLVING &&
|
|
495
|
+
r.startedAt != null &&
|
|
496
|
+
t - r.startedAt >= _svcStuckMs
|
|
497
|
+
) {
|
|
498
|
+
r.status = SVC_RESOLUTION_LIFECYCLE_V2.FAILED;
|
|
499
|
+
r.updatedAt = t;
|
|
500
|
+
if (!r.settledAt) r.settledAt = t;
|
|
501
|
+
r.metadata.failReason = "auto-fail-stuck";
|
|
502
|
+
flipped.push(r.id);
|
|
503
|
+
}
|
|
504
|
+
return { flipped, count: flipped.length };
|
|
505
|
+
}
|
|
506
|
+
export function getServiceContainerGovStatsV2() {
|
|
507
|
+
const containersByStatus = {};
|
|
508
|
+
for (const v of Object.values(SVC_CONTAINER_MATURITY_V2))
|
|
509
|
+
containersByStatus[v] = 0;
|
|
510
|
+
for (const c of _svcCsV2.values()) containersByStatus[c.status]++;
|
|
511
|
+
const resolutionsByStatus = {};
|
|
512
|
+
for (const v of Object.values(SVC_RESOLUTION_LIFECYCLE_V2))
|
|
513
|
+
resolutionsByStatus[v] = 0;
|
|
514
|
+
for (const r of _svcRsV2.values()) resolutionsByStatus[r.status]++;
|
|
515
|
+
return {
|
|
516
|
+
totalSvcContainersV2: _svcCsV2.size,
|
|
517
|
+
totalSvcResolutionsV2: _svcRsV2.size,
|
|
518
|
+
maxActiveSvcContainersPerOwner: _svcMaxActivePerOwner,
|
|
519
|
+
maxPendingSvcResolutionsPerContainer: _svcMaxPendingResPerContainer,
|
|
520
|
+
svcContainerIdleMs: _svcIdleMs,
|
|
521
|
+
svcResolutionStuckMs: _svcStuckMs,
|
|
522
|
+
containersByStatus,
|
|
523
|
+
resolutionsByStatus,
|
|
524
|
+
};
|
|
525
|
+
}
|