chainlesschain 0.145.0 → 0.156.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/README.md +52 -3
- package/package.json +1 -1
- package/src/commands/a2a.js +201 -0
- package/src/commands/activitypub.js +207 -0
- package/src/commands/agent-network.js +217 -0
- package/src/commands/agent.js +1250 -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/chat.js +605 -0
- package/src/commands/cli-anything.js +426 -0
- package/src/commands/codegen.js +207 -0
- package/src/commands/collab.js +211 -0
- package/src/commands/compliance.js +822 -0
- package/src/commands/config.js +213 -0
- package/src/commands/cowork.js +1666 -0
- package/src/commands/crosschain.js +203 -0
- package/src/commands/dao.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/economy.js +199 -0
- package/src/commands/encrypt.js +201 -0
- package/src/commands/evolution.js +199 -0
- package/src/commands/evomap.js +830 -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/hmemory.js +203 -0
- package/src/commands/hook.js +209 -0
- package/src/commands/import.js +209 -0
- package/src/commands/inference.js +207 -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/kg.js +195 -0
- package/src/commands/llm.js +426 -0
- package/src/commands/matrix.js +207 -0
- package/src/commands/mcp.js +217 -0
- package/src/commands/memory.js +412 -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/orchestrate.js +406 -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/pipeline.js +199 -0
- package/src/commands/planmode.js +426 -0
- package/src/commands/plugin-ecosystem.js +209 -0
- package/src/commands/plugin.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/services.js +207 -0
- package/src/commands/session.js +209 -0
- package/src/commands/setup.js +205 -0
- package/src/commands/skill.js +414 -0
- package/src/commands/social.js +201 -0
- package/src/commands/sso.js +209 -0
- package/src/commands/start.js +209 -0
- package/src/commands/stream.js +213 -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/ui.js +225 -0
- package/src/commands/wallet.js +209 -0
- package/src/commands/workflow.js +412 -0
- package/src/index.js +252 -0
- package/src/lib/a2a-protocol.js +332 -0
- package/src/lib/activitypub-bridge.js +334 -0
- package/src/lib/agent-coordinator.js +334 -0
- package/src/lib/agent-economy.js +334 -0
- package/src/lib/agent-network.js +341 -0
- package/src/lib/agent-router.js +333 -0
- package/src/lib/aiops.js +346 -0
- package/src/lib/automation-engine.js +335 -0
- package/src/lib/autonomous-agent.js +332 -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/chat-core.js +335 -0
- package/src/lib/cli-anything-bridge.js +341 -0
- package/src/lib/cli-context-engineering.js +351 -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/compliance-manager.js +334 -0
- package/src/lib/content-recommendation.js +351 -0
- package/src/lib/cowork-adapter.js +336 -0
- package/src/lib/cowork-evomap-adapter.js +341 -0
- package/src/lib/cowork-mcp-tools.js +341 -0
- package/src/lib/cowork-observe-html.js +341 -0
- package/src/lib/cowork-observe.js +341 -0
- package/src/lib/cowork-share.js +338 -0
- package/src/lib/cowork-task-templates.js +342 -1
- package/src/lib/cowork-template-marketplace.js +340 -0
- package/src/lib/cross-chain.js +339 -0
- package/src/lib/crypto-manager.js +334 -0
- package/src/lib/dao-governance.js +339 -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/downloader.js +334 -0
- package/src/lib/evolution-system.js +334 -0
- package/src/lib/evomap-client.js +342 -0
- package/src/lib/evomap-federation.js +338 -0
- package/src/lib/evomap-governance.js +334 -0
- package/src/lib/evomap-manager.js +330 -0
- package/src/lib/execution-backend.js +330 -0
- package/src/lib/federation-hardening.js +340 -0
- package/src/lib/hashline.js +338 -0
- package/src/lib/hierarchical-memory.js +334 -0
- package/src/lib/hook-manager.js +341 -0
- package/src/lib/inference-network.js +341 -0
- package/src/lib/instinct-manager.js +346 -0
- package/src/lib/interaction-adapter.js +330 -0
- package/src/lib/interactive-planner.js +354 -0
- package/src/lib/ipfs-storage.js +334 -0
- package/src/lib/knowledge-exporter.js +341 -0
- package/src/lib/knowledge-graph.js +331 -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/pipeline-orchestrator.js +332 -0
- package/src/lib/plan-mode.js +336 -0
- package/src/lib/plugin-autodiscovery.js +334 -0
- package/src/lib/plugin-ecosystem.js +346 -0
- package/src/lib/pqc-manager.js +346 -0
- package/src/lib/process-manager.js +336 -0
- package/src/lib/protocol-fusion.js +338 -0
- package/src/lib/provider-options.js +346 -0
- package/src/lib/provider-stream.js +348 -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/service-manager.js +337 -0
- package/src/lib/session-core-singletons.js +341 -0
- package/src/lib/session-manager.js +334 -0
- package/src/lib/skill-loader.js +334 -0
- package/src/lib/skill-mcp.js +336 -0
- package/src/lib/social-manager.js +330 -0
- package/src/lib/sso-manager.js +340 -0
- package/src/lib/stix-parser.js +346 -0
- package/src/lib/sub-agent-context.js +343 -0
- package/src/lib/sub-agent-profiles.js +335 -0
- package/src/lib/sub-agent-registry.js +336 -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/todo-manager.js +336 -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/web-ui-server.js +348 -0
- package/src/lib/workflow-engine.js +330 -0
- package/src/lib/workflow-expr.js +346 -0
- package/src/lib/ws-chat-handler.js +337 -0
|
@@ -222,3 +222,337 @@ export function extractPluginCommands(plugins) {
|
|
|
222
222
|
}
|
|
223
223
|
return commands;
|
|
224
224
|
}
|
|
225
|
+
|
|
226
|
+
// =====================================================================
|
|
227
|
+
// plugin-autodiscovery V2 governance overlay (iter26)
|
|
228
|
+
// =====================================================================
|
|
229
|
+
export const PADGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
230
|
+
PENDING: "pending",
|
|
231
|
+
ACTIVE: "active",
|
|
232
|
+
STALE: "stale",
|
|
233
|
+
ARCHIVED: "archived",
|
|
234
|
+
});
|
|
235
|
+
export const PADGOV_SCAN_LIFECYCLE_V2 = Object.freeze({
|
|
236
|
+
QUEUED: "queued",
|
|
237
|
+
SCANNING: "scanning",
|
|
238
|
+
SCANNED: "scanned",
|
|
239
|
+
FAILED: "failed",
|
|
240
|
+
CANCELLED: "cancelled",
|
|
241
|
+
});
|
|
242
|
+
const _padgovPTrans = new Map([
|
|
243
|
+
[
|
|
244
|
+
PADGOV_PROFILE_MATURITY_V2.PENDING,
|
|
245
|
+
new Set([
|
|
246
|
+
PADGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
247
|
+
PADGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
248
|
+
]),
|
|
249
|
+
],
|
|
250
|
+
[
|
|
251
|
+
PADGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
252
|
+
new Set([
|
|
253
|
+
PADGOV_PROFILE_MATURITY_V2.STALE,
|
|
254
|
+
PADGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
255
|
+
]),
|
|
256
|
+
],
|
|
257
|
+
[
|
|
258
|
+
PADGOV_PROFILE_MATURITY_V2.STALE,
|
|
259
|
+
new Set([
|
|
260
|
+
PADGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
261
|
+
PADGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
262
|
+
]),
|
|
263
|
+
],
|
|
264
|
+
[PADGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
265
|
+
]);
|
|
266
|
+
const _padgovPTerminal = new Set([PADGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
267
|
+
const _padgovJTrans = new Map([
|
|
268
|
+
[
|
|
269
|
+
PADGOV_SCAN_LIFECYCLE_V2.QUEUED,
|
|
270
|
+
new Set([
|
|
271
|
+
PADGOV_SCAN_LIFECYCLE_V2.SCANNING,
|
|
272
|
+
PADGOV_SCAN_LIFECYCLE_V2.CANCELLED,
|
|
273
|
+
]),
|
|
274
|
+
],
|
|
275
|
+
[
|
|
276
|
+
PADGOV_SCAN_LIFECYCLE_V2.SCANNING,
|
|
277
|
+
new Set([
|
|
278
|
+
PADGOV_SCAN_LIFECYCLE_V2.SCANNED,
|
|
279
|
+
PADGOV_SCAN_LIFECYCLE_V2.FAILED,
|
|
280
|
+
PADGOV_SCAN_LIFECYCLE_V2.CANCELLED,
|
|
281
|
+
]),
|
|
282
|
+
],
|
|
283
|
+
[PADGOV_SCAN_LIFECYCLE_V2.SCANNED, new Set()],
|
|
284
|
+
[PADGOV_SCAN_LIFECYCLE_V2.FAILED, new Set()],
|
|
285
|
+
[PADGOV_SCAN_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
286
|
+
]);
|
|
287
|
+
const _padgovPsV2 = new Map();
|
|
288
|
+
const _padgovJsV2 = new Map();
|
|
289
|
+
let _padgovMaxActive = 6,
|
|
290
|
+
_padgovMaxPending = 15,
|
|
291
|
+
_padgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
292
|
+
_padgovStuckMs = 60 * 1000;
|
|
293
|
+
function _padgovPos(n, label) {
|
|
294
|
+
const v = Math.floor(Number(n));
|
|
295
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
296
|
+
throw new Error(`${label} must be positive integer`);
|
|
297
|
+
return v;
|
|
298
|
+
}
|
|
299
|
+
function _padgovCheckP(from, to) {
|
|
300
|
+
const a = _padgovPTrans.get(from);
|
|
301
|
+
if (!a || !a.has(to))
|
|
302
|
+
throw new Error(`invalid padgov profile transition ${from} → ${to}`);
|
|
303
|
+
}
|
|
304
|
+
function _padgovCheckJ(from, to) {
|
|
305
|
+
const a = _padgovJTrans.get(from);
|
|
306
|
+
if (!a || !a.has(to))
|
|
307
|
+
throw new Error(`invalid padgov scan transition ${from} → ${to}`);
|
|
308
|
+
}
|
|
309
|
+
function _padgovCountActive(owner) {
|
|
310
|
+
let c = 0;
|
|
311
|
+
for (const p of _padgovPsV2.values())
|
|
312
|
+
if (p.owner === owner && p.status === PADGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
313
|
+
c++;
|
|
314
|
+
return c;
|
|
315
|
+
}
|
|
316
|
+
function _padgovCountPending(profileId) {
|
|
317
|
+
let c = 0;
|
|
318
|
+
for (const j of _padgovJsV2.values())
|
|
319
|
+
if (
|
|
320
|
+
j.profileId === profileId &&
|
|
321
|
+
(j.status === PADGOV_SCAN_LIFECYCLE_V2.QUEUED ||
|
|
322
|
+
j.status === PADGOV_SCAN_LIFECYCLE_V2.SCANNING)
|
|
323
|
+
)
|
|
324
|
+
c++;
|
|
325
|
+
return c;
|
|
326
|
+
}
|
|
327
|
+
export function setMaxActivePadgovProfilesPerOwnerV2(n) {
|
|
328
|
+
_padgovMaxActive = _padgovPos(n, "maxActivePadgovProfilesPerOwner");
|
|
329
|
+
}
|
|
330
|
+
export function getMaxActivePadgovProfilesPerOwnerV2() {
|
|
331
|
+
return _padgovMaxActive;
|
|
332
|
+
}
|
|
333
|
+
export function setMaxPendingPadgovScansPerProfileV2(n) {
|
|
334
|
+
_padgovMaxPending = _padgovPos(n, "maxPendingPadgovScansPerProfile");
|
|
335
|
+
}
|
|
336
|
+
export function getMaxPendingPadgovScansPerProfileV2() {
|
|
337
|
+
return _padgovMaxPending;
|
|
338
|
+
}
|
|
339
|
+
export function setPadgovProfileIdleMsV2(n) {
|
|
340
|
+
_padgovIdleMs = _padgovPos(n, "padgovProfileIdleMs");
|
|
341
|
+
}
|
|
342
|
+
export function getPadgovProfileIdleMsV2() {
|
|
343
|
+
return _padgovIdleMs;
|
|
344
|
+
}
|
|
345
|
+
export function setPadgovScanStuckMsV2(n) {
|
|
346
|
+
_padgovStuckMs = _padgovPos(n, "padgovScanStuckMs");
|
|
347
|
+
}
|
|
348
|
+
export function getPadgovScanStuckMsV2() {
|
|
349
|
+
return _padgovStuckMs;
|
|
350
|
+
}
|
|
351
|
+
export function _resetStatePluginAutodiscoveryGovV2() {
|
|
352
|
+
_padgovPsV2.clear();
|
|
353
|
+
_padgovJsV2.clear();
|
|
354
|
+
_padgovMaxActive = 6;
|
|
355
|
+
_padgovMaxPending = 15;
|
|
356
|
+
_padgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
357
|
+
_padgovStuckMs = 60 * 1000;
|
|
358
|
+
}
|
|
359
|
+
export function registerPadgovProfileV2({ id, owner, root, metadata } = {}) {
|
|
360
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
361
|
+
if (_padgovPsV2.has(id))
|
|
362
|
+
throw new Error(`padgov profile ${id} already exists`);
|
|
363
|
+
const now = Date.now();
|
|
364
|
+
const p = {
|
|
365
|
+
id,
|
|
366
|
+
owner,
|
|
367
|
+
root: root || ".chainlesschain",
|
|
368
|
+
status: PADGOV_PROFILE_MATURITY_V2.PENDING,
|
|
369
|
+
createdAt: now,
|
|
370
|
+
updatedAt: now,
|
|
371
|
+
lastTouchedAt: now,
|
|
372
|
+
activatedAt: null,
|
|
373
|
+
archivedAt: null,
|
|
374
|
+
metadata: { ...(metadata || {}) },
|
|
375
|
+
};
|
|
376
|
+
_padgovPsV2.set(id, p);
|
|
377
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
378
|
+
}
|
|
379
|
+
export function activatePadgovProfileV2(id) {
|
|
380
|
+
const p = _padgovPsV2.get(id);
|
|
381
|
+
if (!p) throw new Error(`padgov profile ${id} not found`);
|
|
382
|
+
const isInitial = p.status === PADGOV_PROFILE_MATURITY_V2.PENDING;
|
|
383
|
+
_padgovCheckP(p.status, PADGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
384
|
+
if (isInitial && _padgovCountActive(p.owner) >= _padgovMaxActive)
|
|
385
|
+
throw new Error(`max active padgov profiles for owner ${p.owner} reached`);
|
|
386
|
+
const now = Date.now();
|
|
387
|
+
p.status = PADGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
388
|
+
p.updatedAt = now;
|
|
389
|
+
p.lastTouchedAt = now;
|
|
390
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
391
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
392
|
+
}
|
|
393
|
+
export function stalePadgovProfileV2(id) {
|
|
394
|
+
const p = _padgovPsV2.get(id);
|
|
395
|
+
if (!p) throw new Error(`padgov profile ${id} not found`);
|
|
396
|
+
_padgovCheckP(p.status, PADGOV_PROFILE_MATURITY_V2.STALE);
|
|
397
|
+
p.status = PADGOV_PROFILE_MATURITY_V2.STALE;
|
|
398
|
+
p.updatedAt = Date.now();
|
|
399
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
400
|
+
}
|
|
401
|
+
export function archivePadgovProfileV2(id) {
|
|
402
|
+
const p = _padgovPsV2.get(id);
|
|
403
|
+
if (!p) throw new Error(`padgov profile ${id} not found`);
|
|
404
|
+
_padgovCheckP(p.status, PADGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
405
|
+
const now = Date.now();
|
|
406
|
+
p.status = PADGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
407
|
+
p.updatedAt = now;
|
|
408
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
409
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
410
|
+
}
|
|
411
|
+
export function touchPadgovProfileV2(id) {
|
|
412
|
+
const p = _padgovPsV2.get(id);
|
|
413
|
+
if (!p) throw new Error(`padgov profile ${id} not found`);
|
|
414
|
+
if (_padgovPTerminal.has(p.status))
|
|
415
|
+
throw new Error(`cannot touch terminal padgov profile ${id}`);
|
|
416
|
+
const now = Date.now();
|
|
417
|
+
p.lastTouchedAt = now;
|
|
418
|
+
p.updatedAt = now;
|
|
419
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
420
|
+
}
|
|
421
|
+
export function getPadgovProfileV2(id) {
|
|
422
|
+
const p = _padgovPsV2.get(id);
|
|
423
|
+
if (!p) return null;
|
|
424
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
425
|
+
}
|
|
426
|
+
export function listPadgovProfilesV2() {
|
|
427
|
+
return [..._padgovPsV2.values()].map((p) => ({
|
|
428
|
+
...p,
|
|
429
|
+
metadata: { ...p.metadata },
|
|
430
|
+
}));
|
|
431
|
+
}
|
|
432
|
+
export function createPadgovScanV2({ id, profileId, path, metadata } = {}) {
|
|
433
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
434
|
+
if (_padgovJsV2.has(id)) throw new Error(`padgov scan ${id} already exists`);
|
|
435
|
+
if (!_padgovPsV2.has(profileId))
|
|
436
|
+
throw new Error(`padgov profile ${profileId} not found`);
|
|
437
|
+
if (_padgovCountPending(profileId) >= _padgovMaxPending)
|
|
438
|
+
throw new Error(
|
|
439
|
+
`max pending padgov scans for profile ${profileId} reached`,
|
|
440
|
+
);
|
|
441
|
+
const now = Date.now();
|
|
442
|
+
const j = {
|
|
443
|
+
id,
|
|
444
|
+
profileId,
|
|
445
|
+
path: path || "",
|
|
446
|
+
status: PADGOV_SCAN_LIFECYCLE_V2.QUEUED,
|
|
447
|
+
createdAt: now,
|
|
448
|
+
updatedAt: now,
|
|
449
|
+
startedAt: null,
|
|
450
|
+
settledAt: null,
|
|
451
|
+
metadata: { ...(metadata || {}) },
|
|
452
|
+
};
|
|
453
|
+
_padgovJsV2.set(id, j);
|
|
454
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
455
|
+
}
|
|
456
|
+
export function scanningPadgovScanV2(id) {
|
|
457
|
+
const j = _padgovJsV2.get(id);
|
|
458
|
+
if (!j) throw new Error(`padgov scan ${id} not found`);
|
|
459
|
+
_padgovCheckJ(j.status, PADGOV_SCAN_LIFECYCLE_V2.SCANNING);
|
|
460
|
+
const now = Date.now();
|
|
461
|
+
j.status = PADGOV_SCAN_LIFECYCLE_V2.SCANNING;
|
|
462
|
+
j.updatedAt = now;
|
|
463
|
+
if (!j.startedAt) j.startedAt = now;
|
|
464
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
465
|
+
}
|
|
466
|
+
export function completeScanPadgovV2(id) {
|
|
467
|
+
const j = _padgovJsV2.get(id);
|
|
468
|
+
if (!j) throw new Error(`padgov scan ${id} not found`);
|
|
469
|
+
_padgovCheckJ(j.status, PADGOV_SCAN_LIFECYCLE_V2.SCANNED);
|
|
470
|
+
const now = Date.now();
|
|
471
|
+
j.status = PADGOV_SCAN_LIFECYCLE_V2.SCANNED;
|
|
472
|
+
j.updatedAt = now;
|
|
473
|
+
if (!j.settledAt) j.settledAt = now;
|
|
474
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
475
|
+
}
|
|
476
|
+
export function failPadgovScanV2(id, reason) {
|
|
477
|
+
const j = _padgovJsV2.get(id);
|
|
478
|
+
if (!j) throw new Error(`padgov scan ${id} not found`);
|
|
479
|
+
_padgovCheckJ(j.status, PADGOV_SCAN_LIFECYCLE_V2.FAILED);
|
|
480
|
+
const now = Date.now();
|
|
481
|
+
j.status = PADGOV_SCAN_LIFECYCLE_V2.FAILED;
|
|
482
|
+
j.updatedAt = now;
|
|
483
|
+
if (!j.settledAt) j.settledAt = now;
|
|
484
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
485
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
486
|
+
}
|
|
487
|
+
export function cancelPadgovScanV2(id, reason) {
|
|
488
|
+
const j = _padgovJsV2.get(id);
|
|
489
|
+
if (!j) throw new Error(`padgov scan ${id} not found`);
|
|
490
|
+
_padgovCheckJ(j.status, PADGOV_SCAN_LIFECYCLE_V2.CANCELLED);
|
|
491
|
+
const now = Date.now();
|
|
492
|
+
j.status = PADGOV_SCAN_LIFECYCLE_V2.CANCELLED;
|
|
493
|
+
j.updatedAt = now;
|
|
494
|
+
if (!j.settledAt) j.settledAt = now;
|
|
495
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
496
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
497
|
+
}
|
|
498
|
+
export function getPadgovScanV2(id) {
|
|
499
|
+
const j = _padgovJsV2.get(id);
|
|
500
|
+
if (!j) return null;
|
|
501
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
502
|
+
}
|
|
503
|
+
export function listPadgovScansV2() {
|
|
504
|
+
return [..._padgovJsV2.values()].map((j) => ({
|
|
505
|
+
...j,
|
|
506
|
+
metadata: { ...j.metadata },
|
|
507
|
+
}));
|
|
508
|
+
}
|
|
509
|
+
export function autoStaleIdlePadgovProfilesV2({ now } = {}) {
|
|
510
|
+
const t = now ?? Date.now();
|
|
511
|
+
const flipped = [];
|
|
512
|
+
for (const p of _padgovPsV2.values())
|
|
513
|
+
if (
|
|
514
|
+
p.status === PADGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
515
|
+
t - p.lastTouchedAt >= _padgovIdleMs
|
|
516
|
+
) {
|
|
517
|
+
p.status = PADGOV_PROFILE_MATURITY_V2.STALE;
|
|
518
|
+
p.updatedAt = t;
|
|
519
|
+
flipped.push(p.id);
|
|
520
|
+
}
|
|
521
|
+
return { flipped, count: flipped.length };
|
|
522
|
+
}
|
|
523
|
+
export function autoFailStuckPadgovScansV2({ now } = {}) {
|
|
524
|
+
const t = now ?? Date.now();
|
|
525
|
+
const flipped = [];
|
|
526
|
+
for (const j of _padgovJsV2.values())
|
|
527
|
+
if (
|
|
528
|
+
j.status === PADGOV_SCAN_LIFECYCLE_V2.SCANNING &&
|
|
529
|
+
j.startedAt != null &&
|
|
530
|
+
t - j.startedAt >= _padgovStuckMs
|
|
531
|
+
) {
|
|
532
|
+
j.status = PADGOV_SCAN_LIFECYCLE_V2.FAILED;
|
|
533
|
+
j.updatedAt = t;
|
|
534
|
+
if (!j.settledAt) j.settledAt = t;
|
|
535
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
536
|
+
flipped.push(j.id);
|
|
537
|
+
}
|
|
538
|
+
return { flipped, count: flipped.length };
|
|
539
|
+
}
|
|
540
|
+
export function getPluginAutodiscoveryGovStatsV2() {
|
|
541
|
+
const profilesByStatus = {};
|
|
542
|
+
for (const v of Object.values(PADGOV_PROFILE_MATURITY_V2))
|
|
543
|
+
profilesByStatus[v] = 0;
|
|
544
|
+
for (const p of _padgovPsV2.values()) profilesByStatus[p.status]++;
|
|
545
|
+
const scansByStatus = {};
|
|
546
|
+
for (const v of Object.values(PADGOV_SCAN_LIFECYCLE_V2)) scansByStatus[v] = 0;
|
|
547
|
+
for (const j of _padgovJsV2.values()) scansByStatus[j.status]++;
|
|
548
|
+
return {
|
|
549
|
+
totalPadgovProfilesV2: _padgovPsV2.size,
|
|
550
|
+
totalPadgovScansV2: _padgovJsV2.size,
|
|
551
|
+
maxActivePadgovProfilesPerOwner: _padgovMaxActive,
|
|
552
|
+
maxPendingPadgovScansPerProfile: _padgovMaxPending,
|
|
553
|
+
padgovProfileIdleMs: _padgovIdleMs,
|
|
554
|
+
padgovScanStuckMs: _padgovStuckMs,
|
|
555
|
+
profilesByStatus,
|
|
556
|
+
scansByStatus,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
@@ -1484,3 +1484,349 @@ export function _resetStateV2() {
|
|
|
1484
1484
|
_autoDeprecateAfterMs = PLUGIN_DEFAULT_AUTO_DEPRECATE_AFTER_MS;
|
|
1485
1485
|
_autoArchiveAfterMs = PLUGIN_DEFAULT_AUTO_ARCHIVE_AFTER_MS;
|
|
1486
1486
|
}
|
|
1487
|
+
|
|
1488
|
+
// =====================================================================
|
|
1489
|
+
// plugin-ecosystem V2 governance overlay (iter24)
|
|
1490
|
+
// =====================================================================
|
|
1491
|
+
export const ECOGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
1492
|
+
PENDING: "pending",
|
|
1493
|
+
ACTIVE: "active",
|
|
1494
|
+
DISABLED: "disabled",
|
|
1495
|
+
ARCHIVED: "archived",
|
|
1496
|
+
});
|
|
1497
|
+
export const ECOGOV_INSTALL_LIFECYCLE_V2 = Object.freeze({
|
|
1498
|
+
QUEUED: "queued",
|
|
1499
|
+
INSTALLING: "installing",
|
|
1500
|
+
INSTALLED: "installed",
|
|
1501
|
+
FAILED: "failed",
|
|
1502
|
+
CANCELLED: "cancelled",
|
|
1503
|
+
});
|
|
1504
|
+
const _ecogovPTrans = new Map([
|
|
1505
|
+
[
|
|
1506
|
+
ECOGOV_PROFILE_MATURITY_V2.PENDING,
|
|
1507
|
+
new Set([
|
|
1508
|
+
ECOGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
1509
|
+
ECOGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1510
|
+
]),
|
|
1511
|
+
],
|
|
1512
|
+
[
|
|
1513
|
+
ECOGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
1514
|
+
new Set([
|
|
1515
|
+
ECOGOV_PROFILE_MATURITY_V2.DISABLED,
|
|
1516
|
+
ECOGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1517
|
+
]),
|
|
1518
|
+
],
|
|
1519
|
+
[
|
|
1520
|
+
ECOGOV_PROFILE_MATURITY_V2.DISABLED,
|
|
1521
|
+
new Set([
|
|
1522
|
+
ECOGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
1523
|
+
ECOGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1524
|
+
]),
|
|
1525
|
+
],
|
|
1526
|
+
[ECOGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
1527
|
+
]);
|
|
1528
|
+
const _ecogovPTerminal = new Set([ECOGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
1529
|
+
const _ecogovJTrans = new Map([
|
|
1530
|
+
[
|
|
1531
|
+
ECOGOV_INSTALL_LIFECYCLE_V2.QUEUED,
|
|
1532
|
+
new Set([
|
|
1533
|
+
ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLING,
|
|
1534
|
+
ECOGOV_INSTALL_LIFECYCLE_V2.CANCELLED,
|
|
1535
|
+
]),
|
|
1536
|
+
],
|
|
1537
|
+
[
|
|
1538
|
+
ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLING,
|
|
1539
|
+
new Set([
|
|
1540
|
+
ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLED,
|
|
1541
|
+
ECOGOV_INSTALL_LIFECYCLE_V2.FAILED,
|
|
1542
|
+
ECOGOV_INSTALL_LIFECYCLE_V2.CANCELLED,
|
|
1543
|
+
]),
|
|
1544
|
+
],
|
|
1545
|
+
[ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLED, new Set()],
|
|
1546
|
+
[ECOGOV_INSTALL_LIFECYCLE_V2.FAILED, new Set()],
|
|
1547
|
+
[ECOGOV_INSTALL_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
1548
|
+
]);
|
|
1549
|
+
const _ecogovPsV2 = new Map();
|
|
1550
|
+
const _ecogovJsV2 = new Map();
|
|
1551
|
+
let _ecogovMaxActive = 12,
|
|
1552
|
+
_ecogovMaxPending = 30,
|
|
1553
|
+
_ecogovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
1554
|
+
_ecogovStuckMs = 60 * 1000;
|
|
1555
|
+
function _ecogovPos(n, label) {
|
|
1556
|
+
const v = Math.floor(Number(n));
|
|
1557
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
1558
|
+
throw new Error(`${label} must be positive integer`);
|
|
1559
|
+
return v;
|
|
1560
|
+
}
|
|
1561
|
+
function _ecogovCheckP(from, to) {
|
|
1562
|
+
const a = _ecogovPTrans.get(from);
|
|
1563
|
+
if (!a || !a.has(to))
|
|
1564
|
+
throw new Error(`invalid ecogov profile transition ${from} → ${to}`);
|
|
1565
|
+
}
|
|
1566
|
+
function _ecogovCheckJ(from, to) {
|
|
1567
|
+
const a = _ecogovJTrans.get(from);
|
|
1568
|
+
if (!a || !a.has(to))
|
|
1569
|
+
throw new Error(`invalid ecogov install transition ${from} → ${to}`);
|
|
1570
|
+
}
|
|
1571
|
+
function _ecogovCountActive(owner) {
|
|
1572
|
+
let c = 0;
|
|
1573
|
+
for (const p of _ecogovPsV2.values())
|
|
1574
|
+
if (p.owner === owner && p.status === ECOGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
1575
|
+
c++;
|
|
1576
|
+
return c;
|
|
1577
|
+
}
|
|
1578
|
+
function _ecogovCountPending(profileId) {
|
|
1579
|
+
let c = 0;
|
|
1580
|
+
for (const j of _ecogovJsV2.values())
|
|
1581
|
+
if (
|
|
1582
|
+
j.profileId === profileId &&
|
|
1583
|
+
(j.status === ECOGOV_INSTALL_LIFECYCLE_V2.QUEUED ||
|
|
1584
|
+
j.status === ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLING)
|
|
1585
|
+
)
|
|
1586
|
+
c++;
|
|
1587
|
+
return c;
|
|
1588
|
+
}
|
|
1589
|
+
export function setMaxActiveEcogovProfilesPerOwnerV2(n) {
|
|
1590
|
+
_ecogovMaxActive = _ecogovPos(n, "maxActiveEcogovProfilesPerOwner");
|
|
1591
|
+
}
|
|
1592
|
+
export function getMaxActiveEcogovProfilesPerOwnerV2() {
|
|
1593
|
+
return _ecogovMaxActive;
|
|
1594
|
+
}
|
|
1595
|
+
export function setMaxPendingEcogovInstallsPerProfileV2(n) {
|
|
1596
|
+
_ecogovMaxPending = _ecogovPos(n, "maxPendingEcogovInstallsPerProfile");
|
|
1597
|
+
}
|
|
1598
|
+
export function getMaxPendingEcogovInstallsPerProfileV2() {
|
|
1599
|
+
return _ecogovMaxPending;
|
|
1600
|
+
}
|
|
1601
|
+
export function setEcogovProfileIdleMsV2(n) {
|
|
1602
|
+
_ecogovIdleMs = _ecogovPos(n, "ecogovProfileIdleMs");
|
|
1603
|
+
}
|
|
1604
|
+
export function getEcogovProfileIdleMsV2() {
|
|
1605
|
+
return _ecogovIdleMs;
|
|
1606
|
+
}
|
|
1607
|
+
export function setEcogovInstallStuckMsV2(n) {
|
|
1608
|
+
_ecogovStuckMs = _ecogovPos(n, "ecogovInstallStuckMs");
|
|
1609
|
+
}
|
|
1610
|
+
export function getEcogovInstallStuckMsV2() {
|
|
1611
|
+
return _ecogovStuckMs;
|
|
1612
|
+
}
|
|
1613
|
+
export function _resetStatePluginEcosystemGovV2() {
|
|
1614
|
+
_ecogovPsV2.clear();
|
|
1615
|
+
_ecogovJsV2.clear();
|
|
1616
|
+
_ecogovMaxActive = 12;
|
|
1617
|
+
_ecogovMaxPending = 30;
|
|
1618
|
+
_ecogovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
1619
|
+
_ecogovStuckMs = 60 * 1000;
|
|
1620
|
+
}
|
|
1621
|
+
export function registerEcogovProfileV2({
|
|
1622
|
+
id,
|
|
1623
|
+
owner,
|
|
1624
|
+
category,
|
|
1625
|
+
metadata,
|
|
1626
|
+
} = {}) {
|
|
1627
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
1628
|
+
if (_ecogovPsV2.has(id))
|
|
1629
|
+
throw new Error(`ecogov profile ${id} already exists`);
|
|
1630
|
+
const now = Date.now();
|
|
1631
|
+
const p = {
|
|
1632
|
+
id,
|
|
1633
|
+
owner,
|
|
1634
|
+
category: category || "general",
|
|
1635
|
+
status: ECOGOV_PROFILE_MATURITY_V2.PENDING,
|
|
1636
|
+
createdAt: now,
|
|
1637
|
+
updatedAt: now,
|
|
1638
|
+
lastTouchedAt: now,
|
|
1639
|
+
activatedAt: null,
|
|
1640
|
+
archivedAt: null,
|
|
1641
|
+
metadata: { ...(metadata || {}) },
|
|
1642
|
+
};
|
|
1643
|
+
_ecogovPsV2.set(id, p);
|
|
1644
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1645
|
+
}
|
|
1646
|
+
export function activateEcogovProfileV2(id) {
|
|
1647
|
+
const p = _ecogovPsV2.get(id);
|
|
1648
|
+
if (!p) throw new Error(`ecogov profile ${id} not found`);
|
|
1649
|
+
const isInitial = p.status === ECOGOV_PROFILE_MATURITY_V2.PENDING;
|
|
1650
|
+
_ecogovCheckP(p.status, ECOGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
1651
|
+
if (isInitial && _ecogovCountActive(p.owner) >= _ecogovMaxActive)
|
|
1652
|
+
throw new Error(`max active ecogov profiles for owner ${p.owner} reached`);
|
|
1653
|
+
const now = Date.now();
|
|
1654
|
+
p.status = ECOGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
1655
|
+
p.updatedAt = now;
|
|
1656
|
+
p.lastTouchedAt = now;
|
|
1657
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
1658
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1659
|
+
}
|
|
1660
|
+
export function disableEcogovProfileV2(id) {
|
|
1661
|
+
const p = _ecogovPsV2.get(id);
|
|
1662
|
+
if (!p) throw new Error(`ecogov profile ${id} not found`);
|
|
1663
|
+
_ecogovCheckP(p.status, ECOGOV_PROFILE_MATURITY_V2.DISABLED);
|
|
1664
|
+
p.status = ECOGOV_PROFILE_MATURITY_V2.DISABLED;
|
|
1665
|
+
p.updatedAt = Date.now();
|
|
1666
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1667
|
+
}
|
|
1668
|
+
export function archiveEcogovProfileV2(id) {
|
|
1669
|
+
const p = _ecogovPsV2.get(id);
|
|
1670
|
+
if (!p) throw new Error(`ecogov profile ${id} not found`);
|
|
1671
|
+
_ecogovCheckP(p.status, ECOGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
1672
|
+
const now = Date.now();
|
|
1673
|
+
p.status = ECOGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
1674
|
+
p.updatedAt = now;
|
|
1675
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
1676
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1677
|
+
}
|
|
1678
|
+
export function touchEcogovProfileV2(id) {
|
|
1679
|
+
const p = _ecogovPsV2.get(id);
|
|
1680
|
+
if (!p) throw new Error(`ecogov profile ${id} not found`);
|
|
1681
|
+
if (_ecogovPTerminal.has(p.status))
|
|
1682
|
+
throw new Error(`cannot touch terminal ecogov profile ${id}`);
|
|
1683
|
+
const now = Date.now();
|
|
1684
|
+
p.lastTouchedAt = now;
|
|
1685
|
+
p.updatedAt = now;
|
|
1686
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1687
|
+
}
|
|
1688
|
+
export function getEcogovProfileV2(id) {
|
|
1689
|
+
const p = _ecogovPsV2.get(id);
|
|
1690
|
+
if (!p) return null;
|
|
1691
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1692
|
+
}
|
|
1693
|
+
export function listEcogovProfilesV2() {
|
|
1694
|
+
return [..._ecogovPsV2.values()].map((p) => ({
|
|
1695
|
+
...p,
|
|
1696
|
+
metadata: { ...p.metadata },
|
|
1697
|
+
}));
|
|
1698
|
+
}
|
|
1699
|
+
export function createEcogovInstallV2({
|
|
1700
|
+
id,
|
|
1701
|
+
profileId,
|
|
1702
|
+
version,
|
|
1703
|
+
metadata,
|
|
1704
|
+
} = {}) {
|
|
1705
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
1706
|
+
if (_ecogovJsV2.has(id))
|
|
1707
|
+
throw new Error(`ecogov install ${id} already exists`);
|
|
1708
|
+
if (!_ecogovPsV2.has(profileId))
|
|
1709
|
+
throw new Error(`ecogov profile ${profileId} not found`);
|
|
1710
|
+
if (_ecogovCountPending(profileId) >= _ecogovMaxPending)
|
|
1711
|
+
throw new Error(
|
|
1712
|
+
`max pending ecogov installs for profile ${profileId} reached`,
|
|
1713
|
+
);
|
|
1714
|
+
const now = Date.now();
|
|
1715
|
+
const j = {
|
|
1716
|
+
id,
|
|
1717
|
+
profileId,
|
|
1718
|
+
version: version || "",
|
|
1719
|
+
status: ECOGOV_INSTALL_LIFECYCLE_V2.QUEUED,
|
|
1720
|
+
createdAt: now,
|
|
1721
|
+
updatedAt: now,
|
|
1722
|
+
startedAt: null,
|
|
1723
|
+
settledAt: null,
|
|
1724
|
+
metadata: { ...(metadata || {}) },
|
|
1725
|
+
};
|
|
1726
|
+
_ecogovJsV2.set(id, j);
|
|
1727
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1728
|
+
}
|
|
1729
|
+
export function installingEcogovInstallV2(id) {
|
|
1730
|
+
const j = _ecogovJsV2.get(id);
|
|
1731
|
+
if (!j) throw new Error(`ecogov install ${id} not found`);
|
|
1732
|
+
_ecogovCheckJ(j.status, ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLING);
|
|
1733
|
+
const now = Date.now();
|
|
1734
|
+
j.status = ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLING;
|
|
1735
|
+
j.updatedAt = now;
|
|
1736
|
+
if (!j.startedAt) j.startedAt = now;
|
|
1737
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1738
|
+
}
|
|
1739
|
+
export function completeInstallEcogovV2(id) {
|
|
1740
|
+
const j = _ecogovJsV2.get(id);
|
|
1741
|
+
if (!j) throw new Error(`ecogov install ${id} not found`);
|
|
1742
|
+
_ecogovCheckJ(j.status, ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLED);
|
|
1743
|
+
const now = Date.now();
|
|
1744
|
+
j.status = ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLED;
|
|
1745
|
+
j.updatedAt = now;
|
|
1746
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1747
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1748
|
+
}
|
|
1749
|
+
export function failEcogovInstallV2(id, reason) {
|
|
1750
|
+
const j = _ecogovJsV2.get(id);
|
|
1751
|
+
if (!j) throw new Error(`ecogov install ${id} not found`);
|
|
1752
|
+
_ecogovCheckJ(j.status, ECOGOV_INSTALL_LIFECYCLE_V2.FAILED);
|
|
1753
|
+
const now = Date.now();
|
|
1754
|
+
j.status = ECOGOV_INSTALL_LIFECYCLE_V2.FAILED;
|
|
1755
|
+
j.updatedAt = now;
|
|
1756
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1757
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
1758
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1759
|
+
}
|
|
1760
|
+
export function cancelEcogovInstallV2(id, reason) {
|
|
1761
|
+
const j = _ecogovJsV2.get(id);
|
|
1762
|
+
if (!j) throw new Error(`ecogov install ${id} not found`);
|
|
1763
|
+
_ecogovCheckJ(j.status, ECOGOV_INSTALL_LIFECYCLE_V2.CANCELLED);
|
|
1764
|
+
const now = Date.now();
|
|
1765
|
+
j.status = ECOGOV_INSTALL_LIFECYCLE_V2.CANCELLED;
|
|
1766
|
+
j.updatedAt = now;
|
|
1767
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1768
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1769
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1770
|
+
}
|
|
1771
|
+
export function getEcogovInstallV2(id) {
|
|
1772
|
+
const j = _ecogovJsV2.get(id);
|
|
1773
|
+
if (!j) return null;
|
|
1774
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1775
|
+
}
|
|
1776
|
+
export function listEcogovInstallsV2() {
|
|
1777
|
+
return [..._ecogovJsV2.values()].map((j) => ({
|
|
1778
|
+
...j,
|
|
1779
|
+
metadata: { ...j.metadata },
|
|
1780
|
+
}));
|
|
1781
|
+
}
|
|
1782
|
+
export function autoDisableIdleEcogovProfilesV2({ now } = {}) {
|
|
1783
|
+
const t = now ?? Date.now();
|
|
1784
|
+
const flipped = [];
|
|
1785
|
+
for (const p of _ecogovPsV2.values())
|
|
1786
|
+
if (
|
|
1787
|
+
p.status === ECOGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1788
|
+
t - p.lastTouchedAt >= _ecogovIdleMs
|
|
1789
|
+
) {
|
|
1790
|
+
p.status = ECOGOV_PROFILE_MATURITY_V2.DISABLED;
|
|
1791
|
+
p.updatedAt = t;
|
|
1792
|
+
flipped.push(p.id);
|
|
1793
|
+
}
|
|
1794
|
+
return { flipped, count: flipped.length };
|
|
1795
|
+
}
|
|
1796
|
+
export function autoFailStuckEcogovInstallsV2({ now } = {}) {
|
|
1797
|
+
const t = now ?? Date.now();
|
|
1798
|
+
const flipped = [];
|
|
1799
|
+
for (const j of _ecogovJsV2.values())
|
|
1800
|
+
if (
|
|
1801
|
+
j.status === ECOGOV_INSTALL_LIFECYCLE_V2.INSTALLING &&
|
|
1802
|
+
j.startedAt != null &&
|
|
1803
|
+
t - j.startedAt >= _ecogovStuckMs
|
|
1804
|
+
) {
|
|
1805
|
+
j.status = ECOGOV_INSTALL_LIFECYCLE_V2.FAILED;
|
|
1806
|
+
j.updatedAt = t;
|
|
1807
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1808
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1809
|
+
flipped.push(j.id);
|
|
1810
|
+
}
|
|
1811
|
+
return { flipped, count: flipped.length };
|
|
1812
|
+
}
|
|
1813
|
+
export function getPluginEcosystemGovStatsV2() {
|
|
1814
|
+
const profilesByStatus = {};
|
|
1815
|
+
for (const v of Object.values(ECOGOV_PROFILE_MATURITY_V2))
|
|
1816
|
+
profilesByStatus[v] = 0;
|
|
1817
|
+
for (const p of _ecogovPsV2.values()) profilesByStatus[p.status]++;
|
|
1818
|
+
const installsByStatus = {};
|
|
1819
|
+
for (const v of Object.values(ECOGOV_INSTALL_LIFECYCLE_V2))
|
|
1820
|
+
installsByStatus[v] = 0;
|
|
1821
|
+
for (const j of _ecogovJsV2.values()) installsByStatus[j.status]++;
|
|
1822
|
+
return {
|
|
1823
|
+
totalEcogovProfilesV2: _ecogovPsV2.size,
|
|
1824
|
+
totalEcogovInstallsV2: _ecogovJsV2.size,
|
|
1825
|
+
maxActiveEcogovProfilesPerOwner: _ecogovMaxActive,
|
|
1826
|
+
maxPendingEcogovInstallsPerProfile: _ecogovMaxPending,
|
|
1827
|
+
ecogovProfileIdleMs: _ecogovIdleMs,
|
|
1828
|
+
ecogovInstallStuckMs: _ecogovStuckMs,
|
|
1829
|
+
profilesByStatus,
|
|
1830
|
+
installsByStatus,
|
|
1831
|
+
};
|
|
1832
|
+
}
|