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
|
@@ -375,81 +375,319 @@ export function listUserRoles(db) {
|
|
|
375
375
|
|
|
376
376
|
// ===== V2 Surface: Permission Engine governance overlay (CLI v0.141.0) =====
|
|
377
377
|
export const PERM_RULE_MATURITY_V2 = Object.freeze({
|
|
378
|
-
PENDING: "pending",
|
|
378
|
+
PENDING: "pending",
|
|
379
|
+
ACTIVE: "active",
|
|
380
|
+
DISABLED: "disabled",
|
|
381
|
+
RETIRED: "retired",
|
|
379
382
|
});
|
|
380
383
|
export const PERM_CHECK_LIFECYCLE_V2 = Object.freeze({
|
|
381
|
-
QUEUED: "queued",
|
|
384
|
+
QUEUED: "queued",
|
|
385
|
+
EVALUATING: "evaluating",
|
|
386
|
+
ALLOWED: "allowed",
|
|
387
|
+
DENIED: "denied",
|
|
388
|
+
CANCELLED: "cancelled",
|
|
382
389
|
});
|
|
383
390
|
const _permRTrans = new Map([
|
|
384
|
-
[
|
|
385
|
-
|
|
386
|
-
|
|
391
|
+
[
|
|
392
|
+
PERM_RULE_MATURITY_V2.PENDING,
|
|
393
|
+
new Set([PERM_RULE_MATURITY_V2.ACTIVE, PERM_RULE_MATURITY_V2.RETIRED]),
|
|
394
|
+
],
|
|
395
|
+
[
|
|
396
|
+
PERM_RULE_MATURITY_V2.ACTIVE,
|
|
397
|
+
new Set([PERM_RULE_MATURITY_V2.DISABLED, PERM_RULE_MATURITY_V2.RETIRED]),
|
|
398
|
+
],
|
|
399
|
+
[
|
|
400
|
+
PERM_RULE_MATURITY_V2.DISABLED,
|
|
401
|
+
new Set([PERM_RULE_MATURITY_V2.ACTIVE, PERM_RULE_MATURITY_V2.RETIRED]),
|
|
402
|
+
],
|
|
387
403
|
[PERM_RULE_MATURITY_V2.RETIRED, new Set()],
|
|
388
404
|
]);
|
|
389
405
|
const _permRTerminal = new Set([PERM_RULE_MATURITY_V2.RETIRED]);
|
|
390
406
|
const _permCTrans = new Map([
|
|
391
|
-
[
|
|
392
|
-
|
|
407
|
+
[
|
|
408
|
+
PERM_CHECK_LIFECYCLE_V2.QUEUED,
|
|
409
|
+
new Set([
|
|
410
|
+
PERM_CHECK_LIFECYCLE_V2.EVALUATING,
|
|
411
|
+
PERM_CHECK_LIFECYCLE_V2.CANCELLED,
|
|
412
|
+
]),
|
|
413
|
+
],
|
|
414
|
+
[
|
|
415
|
+
PERM_CHECK_LIFECYCLE_V2.EVALUATING,
|
|
416
|
+
new Set([
|
|
417
|
+
PERM_CHECK_LIFECYCLE_V2.ALLOWED,
|
|
418
|
+
PERM_CHECK_LIFECYCLE_V2.DENIED,
|
|
419
|
+
PERM_CHECK_LIFECYCLE_V2.CANCELLED,
|
|
420
|
+
]),
|
|
421
|
+
],
|
|
393
422
|
[PERM_CHECK_LIFECYCLE_V2.ALLOWED, new Set()],
|
|
394
423
|
[PERM_CHECK_LIFECYCLE_V2.DENIED, new Set()],
|
|
395
424
|
[PERM_CHECK_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
396
425
|
]);
|
|
397
426
|
const _permRsV2 = new Map();
|
|
398
427
|
const _permCsV2 = new Map();
|
|
399
|
-
let _permMaxActivePerOwner = 10,
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
428
|
+
let _permMaxActivePerOwner = 10,
|
|
429
|
+
_permMaxPendingChecksPerRule = 30,
|
|
430
|
+
_permIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
431
|
+
_permStuckMs = 60 * 1000;
|
|
432
|
+
function _permPos(n, label) {
|
|
433
|
+
const v = Math.floor(Number(n));
|
|
434
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
435
|
+
throw new Error(`${label} must be positive integer`);
|
|
436
|
+
return v;
|
|
437
|
+
}
|
|
438
|
+
function _permCheckR(from, to) {
|
|
439
|
+
const a = _permRTrans.get(from);
|
|
440
|
+
if (!a || !a.has(to))
|
|
441
|
+
throw new Error(`invalid perm rule transition ${from} → ${to}`);
|
|
442
|
+
}
|
|
443
|
+
function _permCheckC(from, to) {
|
|
444
|
+
const a = _permCTrans.get(from);
|
|
445
|
+
if (!a || !a.has(to))
|
|
446
|
+
throw new Error(`invalid perm check transition ${from} → ${to}`);
|
|
447
|
+
}
|
|
448
|
+
export function setMaxActivePermRulesPerOwnerV2(n) {
|
|
449
|
+
_permMaxActivePerOwner = _permPos(n, "maxActivePermRulesPerOwner");
|
|
450
|
+
}
|
|
451
|
+
export function getMaxActivePermRulesPerOwnerV2() {
|
|
452
|
+
return _permMaxActivePerOwner;
|
|
453
|
+
}
|
|
454
|
+
export function setMaxPendingPermChecksPerRuleV2(n) {
|
|
455
|
+
_permMaxPendingChecksPerRule = _permPos(n, "maxPendingPermChecksPerRule");
|
|
456
|
+
}
|
|
457
|
+
export function getMaxPendingPermChecksPerRuleV2() {
|
|
458
|
+
return _permMaxPendingChecksPerRule;
|
|
459
|
+
}
|
|
460
|
+
export function setPermRuleIdleMsV2(n) {
|
|
461
|
+
_permIdleMs = _permPos(n, "permRuleIdleMs");
|
|
462
|
+
}
|
|
463
|
+
export function getPermRuleIdleMsV2() {
|
|
464
|
+
return _permIdleMs;
|
|
465
|
+
}
|
|
466
|
+
export function setPermCheckStuckMsV2(n) {
|
|
467
|
+
_permStuckMs = _permPos(n, "permCheckStuckMs");
|
|
468
|
+
}
|
|
469
|
+
export function getPermCheckStuckMsV2() {
|
|
470
|
+
return _permStuckMs;
|
|
471
|
+
}
|
|
472
|
+
export function _resetStatePermissionEngineV2() {
|
|
473
|
+
_permRsV2.clear();
|
|
474
|
+
_permCsV2.clear();
|
|
475
|
+
_permMaxActivePerOwner = 10;
|
|
476
|
+
_permMaxPendingChecksPerRule = 30;
|
|
477
|
+
_permIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
478
|
+
_permStuckMs = 60 * 1000;
|
|
479
|
+
}
|
|
412
480
|
export function registerPermRuleV2({ id, owner, scope, metadata } = {}) {
|
|
413
|
-
if (!id) throw new Error("perm rule id required");
|
|
481
|
+
if (!id) throw new Error("perm rule id required");
|
|
482
|
+
if (!owner) throw new Error("perm rule owner required");
|
|
414
483
|
if (_permRsV2.has(id)) throw new Error(`perm rule ${id} already registered`);
|
|
415
484
|
const now = Date.now();
|
|
416
|
-
const r = {
|
|
417
|
-
|
|
485
|
+
const r = {
|
|
486
|
+
id,
|
|
487
|
+
owner,
|
|
488
|
+
scope: scope || "*",
|
|
489
|
+
status: PERM_RULE_MATURITY_V2.PENDING,
|
|
490
|
+
createdAt: now,
|
|
491
|
+
updatedAt: now,
|
|
492
|
+
activatedAt: null,
|
|
493
|
+
retiredAt: null,
|
|
494
|
+
lastTouchedAt: now,
|
|
495
|
+
metadata: { ...(metadata || {}) },
|
|
496
|
+
};
|
|
497
|
+
_permRsV2.set(id, r);
|
|
498
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
499
|
+
}
|
|
500
|
+
function _permCountActive(owner) {
|
|
501
|
+
let n = 0;
|
|
502
|
+
for (const r of _permRsV2.values())
|
|
503
|
+
if (r.owner === owner && r.status === PERM_RULE_MATURITY_V2.ACTIVE) n++;
|
|
504
|
+
return n;
|
|
418
505
|
}
|
|
419
|
-
function _permCountActive(owner) { let n = 0; for (const r of _permRsV2.values()) if (r.owner === owner && r.status === PERM_RULE_MATURITY_V2.ACTIVE) n++; return n; }
|
|
420
506
|
export function activatePermRuleV2(id) {
|
|
421
|
-
const r = _permRsV2.get(id);
|
|
507
|
+
const r = _permRsV2.get(id);
|
|
508
|
+
if (!r) throw new Error(`perm rule ${id} not found`);
|
|
422
509
|
_permCheckR(r.status, PERM_RULE_MATURITY_V2.ACTIVE);
|
|
423
510
|
const recovery = r.status === PERM_RULE_MATURITY_V2.DISABLED;
|
|
424
|
-
if (!recovery && _permCountActive(r.owner) >= _permMaxActivePerOwner)
|
|
425
|
-
|
|
511
|
+
if (!recovery && _permCountActive(r.owner) >= _permMaxActivePerOwner)
|
|
512
|
+
throw new Error(`max active perm rules for owner ${r.owner} reached`);
|
|
513
|
+
const now = Date.now();
|
|
514
|
+
r.status = PERM_RULE_MATURITY_V2.ACTIVE;
|
|
515
|
+
r.updatedAt = now;
|
|
516
|
+
r.lastTouchedAt = now;
|
|
517
|
+
if (!r.activatedAt) r.activatedAt = now;
|
|
518
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
519
|
+
}
|
|
520
|
+
export function disablePermRuleV2(id) {
|
|
521
|
+
const r = _permRsV2.get(id);
|
|
522
|
+
if (!r) throw new Error(`perm rule ${id} not found`);
|
|
523
|
+
_permCheckR(r.status, PERM_RULE_MATURITY_V2.DISABLED);
|
|
524
|
+
r.status = PERM_RULE_MATURITY_V2.DISABLED;
|
|
525
|
+
r.updatedAt = Date.now();
|
|
526
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
527
|
+
}
|
|
528
|
+
export function retirePermRuleV2(id) {
|
|
529
|
+
const r = _permRsV2.get(id);
|
|
530
|
+
if (!r) throw new Error(`perm rule ${id} not found`);
|
|
531
|
+
_permCheckR(r.status, PERM_RULE_MATURITY_V2.RETIRED);
|
|
532
|
+
const now = Date.now();
|
|
533
|
+
r.status = PERM_RULE_MATURITY_V2.RETIRED;
|
|
534
|
+
r.updatedAt = now;
|
|
535
|
+
if (!r.retiredAt) r.retiredAt = now;
|
|
536
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
537
|
+
}
|
|
538
|
+
export function touchPermRuleV2(id) {
|
|
539
|
+
const r = _permRsV2.get(id);
|
|
540
|
+
if (!r) throw new Error(`perm rule ${id} not found`);
|
|
541
|
+
if (_permRTerminal.has(r.status))
|
|
542
|
+
throw new Error(`cannot touch terminal perm rule ${id}`);
|
|
543
|
+
const now = Date.now();
|
|
544
|
+
r.lastTouchedAt = now;
|
|
545
|
+
r.updatedAt = now;
|
|
546
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
547
|
+
}
|
|
548
|
+
export function getPermRuleV2(id) {
|
|
549
|
+
const r = _permRsV2.get(id);
|
|
550
|
+
if (!r) return null;
|
|
426
551
|
return { ...r, metadata: { ...r.metadata } };
|
|
427
552
|
}
|
|
428
|
-
export function
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
553
|
+
export function listPermRulesV2() {
|
|
554
|
+
return [..._permRsV2.values()].map((r) => ({
|
|
555
|
+
...r,
|
|
556
|
+
metadata: { ...r.metadata },
|
|
557
|
+
}));
|
|
558
|
+
}
|
|
559
|
+
function _permCountPending(ruleId) {
|
|
560
|
+
let n = 0;
|
|
561
|
+
for (const c of _permCsV2.values())
|
|
562
|
+
if (
|
|
563
|
+
c.ruleId === ruleId &&
|
|
564
|
+
(c.status === PERM_CHECK_LIFECYCLE_V2.QUEUED ||
|
|
565
|
+
c.status === PERM_CHECK_LIFECYCLE_V2.EVALUATING)
|
|
566
|
+
)
|
|
567
|
+
n++;
|
|
568
|
+
return n;
|
|
569
|
+
}
|
|
434
570
|
export function createPermCheckV2({ id, ruleId, subject, metadata } = {}) {
|
|
435
|
-
if (!id) throw new Error("perm check id required");
|
|
571
|
+
if (!id) throw new Error("perm check id required");
|
|
572
|
+
if (!ruleId) throw new Error("perm check ruleId required");
|
|
436
573
|
if (_permCsV2.has(id)) throw new Error(`perm check ${id} already exists`);
|
|
437
574
|
if (!_permRsV2.has(ruleId)) throw new Error(`perm rule ${ruleId} not found`);
|
|
438
|
-
if (_permCountPending(ruleId) >= _permMaxPendingChecksPerRule)
|
|
575
|
+
if (_permCountPending(ruleId) >= _permMaxPendingChecksPerRule)
|
|
576
|
+
throw new Error(`max pending perm checks for rule ${ruleId} reached`);
|
|
577
|
+
const now = Date.now();
|
|
578
|
+
const c = {
|
|
579
|
+
id,
|
|
580
|
+
ruleId,
|
|
581
|
+
subject: subject || "",
|
|
582
|
+
status: PERM_CHECK_LIFECYCLE_V2.QUEUED,
|
|
583
|
+
createdAt: now,
|
|
584
|
+
updatedAt: now,
|
|
585
|
+
startedAt: null,
|
|
586
|
+
settledAt: null,
|
|
587
|
+
metadata: { ...(metadata || {}) },
|
|
588
|
+
};
|
|
589
|
+
_permCsV2.set(id, c);
|
|
590
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
591
|
+
}
|
|
592
|
+
export function evaluatePermCheckV2(id) {
|
|
593
|
+
const c = _permCsV2.get(id);
|
|
594
|
+
if (!c) throw new Error(`perm check ${id} not found`);
|
|
595
|
+
_permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.EVALUATING);
|
|
596
|
+
const now = Date.now();
|
|
597
|
+
c.status = PERM_CHECK_LIFECYCLE_V2.EVALUATING;
|
|
598
|
+
c.updatedAt = now;
|
|
599
|
+
if (!c.startedAt) c.startedAt = now;
|
|
600
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
601
|
+
}
|
|
602
|
+
export function allowPermCheckV2(id) {
|
|
603
|
+
const c = _permCsV2.get(id);
|
|
604
|
+
if (!c) throw new Error(`perm check ${id} not found`);
|
|
605
|
+
_permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.ALLOWED);
|
|
606
|
+
const now = Date.now();
|
|
607
|
+
c.status = PERM_CHECK_LIFECYCLE_V2.ALLOWED;
|
|
608
|
+
c.updatedAt = now;
|
|
609
|
+
if (!c.settledAt) c.settledAt = now;
|
|
610
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
611
|
+
}
|
|
612
|
+
export function denyPermCheckV2(id, reason) {
|
|
613
|
+
const c = _permCsV2.get(id);
|
|
614
|
+
if (!c) throw new Error(`perm check ${id} not found`);
|
|
615
|
+
_permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.DENIED);
|
|
439
616
|
const now = Date.now();
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
export function cancelPermCheckV2(id, reason) {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
617
|
+
c.status = PERM_CHECK_LIFECYCLE_V2.DENIED;
|
|
618
|
+
c.updatedAt = now;
|
|
619
|
+
if (!c.settledAt) c.settledAt = now;
|
|
620
|
+
if (reason) c.metadata.denyReason = String(reason);
|
|
621
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
622
|
+
}
|
|
623
|
+
export function cancelPermCheckV2(id, reason) {
|
|
624
|
+
const c = _permCsV2.get(id);
|
|
625
|
+
if (!c) throw new Error(`perm check ${id} not found`);
|
|
626
|
+
_permCheckC(c.status, PERM_CHECK_LIFECYCLE_V2.CANCELLED);
|
|
627
|
+
const now = Date.now();
|
|
628
|
+
c.status = PERM_CHECK_LIFECYCLE_V2.CANCELLED;
|
|
629
|
+
c.updatedAt = now;
|
|
630
|
+
if (!c.settledAt) c.settledAt = now;
|
|
631
|
+
if (reason) c.metadata.cancelReason = String(reason);
|
|
632
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
633
|
+
}
|
|
634
|
+
export function getPermCheckV2(id) {
|
|
635
|
+
const c = _permCsV2.get(id);
|
|
636
|
+
if (!c) return null;
|
|
637
|
+
return { ...c, metadata: { ...c.metadata } };
|
|
638
|
+
}
|
|
639
|
+
export function listPermChecksV2() {
|
|
640
|
+
return [..._permCsV2.values()].map((c) => ({
|
|
641
|
+
...c,
|
|
642
|
+
metadata: { ...c.metadata },
|
|
643
|
+
}));
|
|
644
|
+
}
|
|
645
|
+
export function autoDisableIdlePermRulesV2({ now } = {}) {
|
|
646
|
+
const t = now ?? Date.now();
|
|
647
|
+
const flipped = [];
|
|
648
|
+
for (const r of _permRsV2.values())
|
|
649
|
+
if (
|
|
650
|
+
r.status === PERM_RULE_MATURITY_V2.ACTIVE &&
|
|
651
|
+
t - r.lastTouchedAt >= _permIdleMs
|
|
652
|
+
) {
|
|
653
|
+
r.status = PERM_RULE_MATURITY_V2.DISABLED;
|
|
654
|
+
r.updatedAt = t;
|
|
655
|
+
flipped.push(r.id);
|
|
656
|
+
}
|
|
657
|
+
return { flipped, count: flipped.length };
|
|
658
|
+
}
|
|
659
|
+
export function autoDenyStuckPermChecksV2({ now } = {}) {
|
|
660
|
+
const t = now ?? Date.now();
|
|
661
|
+
const flipped = [];
|
|
662
|
+
for (const c of _permCsV2.values())
|
|
663
|
+
if (
|
|
664
|
+
c.status === PERM_CHECK_LIFECYCLE_V2.EVALUATING &&
|
|
665
|
+
c.startedAt != null &&
|
|
666
|
+
t - c.startedAt >= _permStuckMs
|
|
667
|
+
) {
|
|
668
|
+
c.status = PERM_CHECK_LIFECYCLE_V2.DENIED;
|
|
669
|
+
c.updatedAt = t;
|
|
670
|
+
if (!c.settledAt) c.settledAt = t;
|
|
671
|
+
c.metadata.denyReason = "auto-deny-stuck";
|
|
672
|
+
flipped.push(c.id);
|
|
673
|
+
}
|
|
674
|
+
return { flipped, count: flipped.length };
|
|
675
|
+
}
|
|
451
676
|
export function getPermissionEngineGovStatsV2() {
|
|
452
|
-
const rulesByStatus = {};
|
|
453
|
-
|
|
454
|
-
|
|
677
|
+
const rulesByStatus = {};
|
|
678
|
+
for (const v of Object.values(PERM_RULE_MATURITY_V2)) rulesByStatus[v] = 0;
|
|
679
|
+
for (const r of _permRsV2.values()) rulesByStatus[r.status]++;
|
|
680
|
+
const checksByStatus = {};
|
|
681
|
+
for (const v of Object.values(PERM_CHECK_LIFECYCLE_V2)) checksByStatus[v] = 0;
|
|
682
|
+
for (const c of _permCsV2.values()) checksByStatus[c.status]++;
|
|
683
|
+
return {
|
|
684
|
+
totalPermRulesV2: _permRsV2.size,
|
|
685
|
+
totalPermChecksV2: _permCsV2.size,
|
|
686
|
+
maxActivePermRulesPerOwner: _permMaxActivePerOwner,
|
|
687
|
+
maxPendingPermChecksPerRule: _permMaxPendingChecksPerRule,
|
|
688
|
+
permRuleIdleMs: _permIdleMs,
|
|
689
|
+
permCheckStuckMs: _permStuckMs,
|
|
690
|
+
rulesByStatus,
|
|
691
|
+
checksByStatus,
|
|
692
|
+
};
|
|
455
693
|
}
|