chainlesschain 0.145.0 → 0.152.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/activitypub.js +207 -0
- package/src/commands/agent-network.js +217 -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/codegen.js +207 -0
- package/src/commands/collab.js +211 -0
- package/src/commands/compliance.js +410 -0
- package/src/commands/cowork.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/evomap.js +205 -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/hook.js +209 -0
- package/src/commands/import.js +209 -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/llm.js +217 -0
- package/src/commands/matrix.js +207 -0
- package/src/commands/mcp.js +217 -0
- package/src/commands/memory.js +209 -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/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/plugin-ecosystem.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/session.js +209 -0
- package/src/commands/skill.js +207 -0
- package/src/commands/social.js +201 -0
- package/src/commands/sso.js +209 -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/wallet.js +209 -0
- package/src/commands/workflow.js +203 -0
- package/src/index.js +140 -0
- package/src/lib/activitypub-bridge.js +334 -0
- package/src/lib/agent-network.js +341 -0
- package/src/lib/aiops.js +346 -0
- package/src/lib/automation-engine.js +335 -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/code-agent.js +339 -0
- package/src/lib/collaboration-governance.js +334 -0
- package/src/lib/community-governance.js +346 -0
- package/src/lib/content-recommendation.js +351 -0
- package/src/lib/cowork-share.js +338 -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/evomap-governance.js +334 -0
- package/src/lib/federation-hardening.js +340 -0
- package/src/lib/hook-manager.js +341 -0
- package/src/lib/instinct-manager.js +346 -0
- package/src/lib/ipfs-storage.js +334 -0
- package/src/lib/knowledge-exporter.js +341 -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/plugin-ecosystem.js +346 -0
- package/src/lib/pqc-manager.js +346 -0
- package/src/lib/protocol-fusion.js +338 -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/session-manager.js +334 -0
- package/src/lib/skill-loader.js +334 -0
- package/src/lib/social-manager.js +330 -0
- package/src/lib/sso-manager.js +340 -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/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/workflow-engine.js +330 -0
|
@@ -566,3 +566,337 @@ export function getBrowserAutomationStatsV2() {
|
|
|
566
566
|
actionsByStatus,
|
|
567
567
|
};
|
|
568
568
|
}
|
|
569
|
+
|
|
570
|
+
// =====================================================================
|
|
571
|
+
// browser-automation V2 governance overlay (iter20)
|
|
572
|
+
// =====================================================================
|
|
573
|
+
export const BAGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
574
|
+
PENDING: "pending",
|
|
575
|
+
ACTIVE: "active",
|
|
576
|
+
STALE: "stale",
|
|
577
|
+
ARCHIVED: "archived",
|
|
578
|
+
});
|
|
579
|
+
export const BAGOV_NAVIGATION_LIFECYCLE_V2 = Object.freeze({
|
|
580
|
+
QUEUED: "queued",
|
|
581
|
+
NAVIGATING: "navigating",
|
|
582
|
+
NAVIGATED: "navigated",
|
|
583
|
+
FAILED: "failed",
|
|
584
|
+
CANCELLED: "cancelled",
|
|
585
|
+
});
|
|
586
|
+
const _bagovPTrans = new Map([
|
|
587
|
+
[
|
|
588
|
+
BAGOV_PROFILE_MATURITY_V2.PENDING,
|
|
589
|
+
new Set([
|
|
590
|
+
BAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
591
|
+
BAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
592
|
+
]),
|
|
593
|
+
],
|
|
594
|
+
[
|
|
595
|
+
BAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
596
|
+
new Set([
|
|
597
|
+
BAGOV_PROFILE_MATURITY_V2.STALE,
|
|
598
|
+
BAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
599
|
+
]),
|
|
600
|
+
],
|
|
601
|
+
[
|
|
602
|
+
BAGOV_PROFILE_MATURITY_V2.STALE,
|
|
603
|
+
new Set([
|
|
604
|
+
BAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
605
|
+
BAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
606
|
+
]),
|
|
607
|
+
],
|
|
608
|
+
[BAGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
609
|
+
]);
|
|
610
|
+
const _bagovPTerminal = new Set([BAGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
611
|
+
const _bagovJTrans = new Map([
|
|
612
|
+
[
|
|
613
|
+
BAGOV_NAVIGATION_LIFECYCLE_V2.QUEUED,
|
|
614
|
+
new Set([
|
|
615
|
+
BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATING,
|
|
616
|
+
BAGOV_NAVIGATION_LIFECYCLE_V2.CANCELLED,
|
|
617
|
+
]),
|
|
618
|
+
],
|
|
619
|
+
[
|
|
620
|
+
BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATING,
|
|
621
|
+
new Set([
|
|
622
|
+
BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATED,
|
|
623
|
+
BAGOV_NAVIGATION_LIFECYCLE_V2.FAILED,
|
|
624
|
+
BAGOV_NAVIGATION_LIFECYCLE_V2.CANCELLED,
|
|
625
|
+
]),
|
|
626
|
+
],
|
|
627
|
+
[BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATED, new Set()],
|
|
628
|
+
[BAGOV_NAVIGATION_LIFECYCLE_V2.FAILED, new Set()],
|
|
629
|
+
[BAGOV_NAVIGATION_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
630
|
+
]);
|
|
631
|
+
const _bagovPsV2 = new Map();
|
|
632
|
+
const _bagovJsV2 = new Map();
|
|
633
|
+
let _bagovMaxActive = 6,
|
|
634
|
+
_bagovMaxPending = 15,
|
|
635
|
+
_bagovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
636
|
+
_bagovStuckMs = 60 * 1000;
|
|
637
|
+
function _bagovPos(n, label) {
|
|
638
|
+
const v = Math.floor(Number(n));
|
|
639
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
640
|
+
throw new Error(`${label} must be positive integer`);
|
|
641
|
+
return v;
|
|
642
|
+
}
|
|
643
|
+
function _bagovCheckP(from, to) {
|
|
644
|
+
const a = _bagovPTrans.get(from);
|
|
645
|
+
if (!a || !a.has(to))
|
|
646
|
+
throw new Error(`invalid bagov profile transition ${from} → ${to}`);
|
|
647
|
+
}
|
|
648
|
+
function _bagovCheckJ(from, to) {
|
|
649
|
+
const a = _bagovJTrans.get(from);
|
|
650
|
+
if (!a || !a.has(to))
|
|
651
|
+
throw new Error(`invalid bagov navigation transition ${from} → ${to}`);
|
|
652
|
+
}
|
|
653
|
+
function _bagovCountActive(owner) {
|
|
654
|
+
let c = 0;
|
|
655
|
+
for (const p of _bagovPsV2.values())
|
|
656
|
+
if (p.owner === owner && p.status === BAGOV_PROFILE_MATURITY_V2.ACTIVE) c++;
|
|
657
|
+
return c;
|
|
658
|
+
}
|
|
659
|
+
function _bagovCountPending(profileId) {
|
|
660
|
+
let c = 0;
|
|
661
|
+
for (const j of _bagovJsV2.values())
|
|
662
|
+
if (
|
|
663
|
+
j.profileId === profileId &&
|
|
664
|
+
(j.status === BAGOV_NAVIGATION_LIFECYCLE_V2.QUEUED ||
|
|
665
|
+
j.status === BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATING)
|
|
666
|
+
)
|
|
667
|
+
c++;
|
|
668
|
+
return c;
|
|
669
|
+
}
|
|
670
|
+
export function setMaxActiveBagovProfilesPerOwnerV2(n) {
|
|
671
|
+
_bagovMaxActive = _bagovPos(n, "maxActiveBagovProfilesPerOwner");
|
|
672
|
+
}
|
|
673
|
+
export function getMaxActiveBagovProfilesPerOwnerV2() {
|
|
674
|
+
return _bagovMaxActive;
|
|
675
|
+
}
|
|
676
|
+
export function setMaxPendingBagovNavigationsPerProfileV2(n) {
|
|
677
|
+
_bagovMaxPending = _bagovPos(n, "maxPendingBagovNavigationsPerProfile");
|
|
678
|
+
}
|
|
679
|
+
export function getMaxPendingBagovNavigationsPerProfileV2() {
|
|
680
|
+
return _bagovMaxPending;
|
|
681
|
+
}
|
|
682
|
+
export function setBagovProfileIdleMsV2(n) {
|
|
683
|
+
_bagovIdleMs = _bagovPos(n, "bagovProfileIdleMs");
|
|
684
|
+
}
|
|
685
|
+
export function getBagovProfileIdleMsV2() {
|
|
686
|
+
return _bagovIdleMs;
|
|
687
|
+
}
|
|
688
|
+
export function setBagovNavigationStuckMsV2(n) {
|
|
689
|
+
_bagovStuckMs = _bagovPos(n, "bagovNavigationStuckMs");
|
|
690
|
+
}
|
|
691
|
+
export function getBagovNavigationStuckMsV2() {
|
|
692
|
+
return _bagovStuckMs;
|
|
693
|
+
}
|
|
694
|
+
export function _resetStateBrowserAutomationGovV2() {
|
|
695
|
+
_bagovPsV2.clear();
|
|
696
|
+
_bagovJsV2.clear();
|
|
697
|
+
_bagovMaxActive = 6;
|
|
698
|
+
_bagovMaxPending = 15;
|
|
699
|
+
_bagovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
700
|
+
_bagovStuckMs = 60 * 1000;
|
|
701
|
+
}
|
|
702
|
+
export function registerBagovProfileV2({ id, owner, engine, metadata } = {}) {
|
|
703
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
704
|
+
if (_bagovPsV2.has(id)) throw new Error(`bagov profile ${id} already exists`);
|
|
705
|
+
const now = Date.now();
|
|
706
|
+
const p = {
|
|
707
|
+
id,
|
|
708
|
+
owner,
|
|
709
|
+
engine: engine || "chromium",
|
|
710
|
+
status: BAGOV_PROFILE_MATURITY_V2.PENDING,
|
|
711
|
+
createdAt: now,
|
|
712
|
+
updatedAt: now,
|
|
713
|
+
lastTouchedAt: now,
|
|
714
|
+
activatedAt: null,
|
|
715
|
+
archivedAt: null,
|
|
716
|
+
metadata: { ...(metadata || {}) },
|
|
717
|
+
};
|
|
718
|
+
_bagovPsV2.set(id, p);
|
|
719
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
720
|
+
}
|
|
721
|
+
export function activateBagovProfileV2(id) {
|
|
722
|
+
const p = _bagovPsV2.get(id);
|
|
723
|
+
if (!p) throw new Error(`bagov profile ${id} not found`);
|
|
724
|
+
const isInitial = p.status === BAGOV_PROFILE_MATURITY_V2.PENDING;
|
|
725
|
+
_bagovCheckP(p.status, BAGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
726
|
+
if (isInitial && _bagovCountActive(p.owner) >= _bagovMaxActive)
|
|
727
|
+
throw new Error(`max active bagov profiles for owner ${p.owner} reached`);
|
|
728
|
+
const now = Date.now();
|
|
729
|
+
p.status = BAGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
730
|
+
p.updatedAt = now;
|
|
731
|
+
p.lastTouchedAt = now;
|
|
732
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
733
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
734
|
+
}
|
|
735
|
+
export function staleBagovProfileV2(id) {
|
|
736
|
+
const p = _bagovPsV2.get(id);
|
|
737
|
+
if (!p) throw new Error(`bagov profile ${id} not found`);
|
|
738
|
+
_bagovCheckP(p.status, BAGOV_PROFILE_MATURITY_V2.STALE);
|
|
739
|
+
p.status = BAGOV_PROFILE_MATURITY_V2.STALE;
|
|
740
|
+
p.updatedAt = Date.now();
|
|
741
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
742
|
+
}
|
|
743
|
+
export function archiveBagovProfileV2(id) {
|
|
744
|
+
const p = _bagovPsV2.get(id);
|
|
745
|
+
if (!p) throw new Error(`bagov profile ${id} not found`);
|
|
746
|
+
_bagovCheckP(p.status, BAGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
747
|
+
const now = Date.now();
|
|
748
|
+
p.status = BAGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
749
|
+
p.updatedAt = now;
|
|
750
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
751
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
752
|
+
}
|
|
753
|
+
export function touchBagovProfileV2(id) {
|
|
754
|
+
const p = _bagovPsV2.get(id);
|
|
755
|
+
if (!p) throw new Error(`bagov profile ${id} not found`);
|
|
756
|
+
if (_bagovPTerminal.has(p.status))
|
|
757
|
+
throw new Error(`cannot touch terminal bagov profile ${id}`);
|
|
758
|
+
const now = Date.now();
|
|
759
|
+
p.lastTouchedAt = now;
|
|
760
|
+
p.updatedAt = now;
|
|
761
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
762
|
+
}
|
|
763
|
+
export function getBagovProfileV2(id) {
|
|
764
|
+
const p = _bagovPsV2.get(id);
|
|
765
|
+
if (!p) return null;
|
|
766
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
767
|
+
}
|
|
768
|
+
export function listBagovProfilesV2() {
|
|
769
|
+
return [..._bagovPsV2.values()].map((p) => ({
|
|
770
|
+
...p,
|
|
771
|
+
metadata: { ...p.metadata },
|
|
772
|
+
}));
|
|
773
|
+
}
|
|
774
|
+
export function createBagovNavigationV2({ id, profileId, url, metadata } = {}) {
|
|
775
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
776
|
+
if (_bagovJsV2.has(id))
|
|
777
|
+
throw new Error(`bagov navigation ${id} already exists`);
|
|
778
|
+
if (!_bagovPsV2.has(profileId))
|
|
779
|
+
throw new Error(`bagov profile ${profileId} not found`);
|
|
780
|
+
if (_bagovCountPending(profileId) >= _bagovMaxPending)
|
|
781
|
+
throw new Error(
|
|
782
|
+
`max pending bagov navigations for profile ${profileId} reached`,
|
|
783
|
+
);
|
|
784
|
+
const now = Date.now();
|
|
785
|
+
const j = {
|
|
786
|
+
id,
|
|
787
|
+
profileId,
|
|
788
|
+
url: url || "",
|
|
789
|
+
status: BAGOV_NAVIGATION_LIFECYCLE_V2.QUEUED,
|
|
790
|
+
createdAt: now,
|
|
791
|
+
updatedAt: now,
|
|
792
|
+
startedAt: null,
|
|
793
|
+
settledAt: null,
|
|
794
|
+
metadata: { ...(metadata || {}) },
|
|
795
|
+
};
|
|
796
|
+
_bagovJsV2.set(id, j);
|
|
797
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
798
|
+
}
|
|
799
|
+
export function navigatingBagovNavigationV2(id) {
|
|
800
|
+
const j = _bagovJsV2.get(id);
|
|
801
|
+
if (!j) throw new Error(`bagov navigation ${id} not found`);
|
|
802
|
+
_bagovCheckJ(j.status, BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATING);
|
|
803
|
+
const now = Date.now();
|
|
804
|
+
j.status = BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATING;
|
|
805
|
+
j.updatedAt = now;
|
|
806
|
+
if (!j.startedAt) j.startedAt = now;
|
|
807
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
808
|
+
}
|
|
809
|
+
export function completeNavigationBagovV2(id) {
|
|
810
|
+
const j = _bagovJsV2.get(id);
|
|
811
|
+
if (!j) throw new Error(`bagov navigation ${id} not found`);
|
|
812
|
+
_bagovCheckJ(j.status, BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATED);
|
|
813
|
+
const now = Date.now();
|
|
814
|
+
j.status = BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATED;
|
|
815
|
+
j.updatedAt = now;
|
|
816
|
+
if (!j.settledAt) j.settledAt = now;
|
|
817
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
818
|
+
}
|
|
819
|
+
export function failBagovNavigationV2(id, reason) {
|
|
820
|
+
const j = _bagovJsV2.get(id);
|
|
821
|
+
if (!j) throw new Error(`bagov navigation ${id} not found`);
|
|
822
|
+
_bagovCheckJ(j.status, BAGOV_NAVIGATION_LIFECYCLE_V2.FAILED);
|
|
823
|
+
const now = Date.now();
|
|
824
|
+
j.status = BAGOV_NAVIGATION_LIFECYCLE_V2.FAILED;
|
|
825
|
+
j.updatedAt = now;
|
|
826
|
+
if (!j.settledAt) j.settledAt = now;
|
|
827
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
828
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
829
|
+
}
|
|
830
|
+
export function cancelBagovNavigationV2(id, reason) {
|
|
831
|
+
const j = _bagovJsV2.get(id);
|
|
832
|
+
if (!j) throw new Error(`bagov navigation ${id} not found`);
|
|
833
|
+
_bagovCheckJ(j.status, BAGOV_NAVIGATION_LIFECYCLE_V2.CANCELLED);
|
|
834
|
+
const now = Date.now();
|
|
835
|
+
j.status = BAGOV_NAVIGATION_LIFECYCLE_V2.CANCELLED;
|
|
836
|
+
j.updatedAt = now;
|
|
837
|
+
if (!j.settledAt) j.settledAt = now;
|
|
838
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
839
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
840
|
+
}
|
|
841
|
+
export function getBagovNavigationV2(id) {
|
|
842
|
+
const j = _bagovJsV2.get(id);
|
|
843
|
+
if (!j) return null;
|
|
844
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
845
|
+
}
|
|
846
|
+
export function listBagovNavigationsV2() {
|
|
847
|
+
return [..._bagovJsV2.values()].map((j) => ({
|
|
848
|
+
...j,
|
|
849
|
+
metadata: { ...j.metadata },
|
|
850
|
+
}));
|
|
851
|
+
}
|
|
852
|
+
export function autoStaleIdleBagovProfilesV2({ now } = {}) {
|
|
853
|
+
const t = now ?? Date.now();
|
|
854
|
+
const flipped = [];
|
|
855
|
+
for (const p of _bagovPsV2.values())
|
|
856
|
+
if (
|
|
857
|
+
p.status === BAGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
858
|
+
t - p.lastTouchedAt >= _bagovIdleMs
|
|
859
|
+
) {
|
|
860
|
+
p.status = BAGOV_PROFILE_MATURITY_V2.STALE;
|
|
861
|
+
p.updatedAt = t;
|
|
862
|
+
flipped.push(p.id);
|
|
863
|
+
}
|
|
864
|
+
return { flipped, count: flipped.length };
|
|
865
|
+
}
|
|
866
|
+
export function autoFailStuckBagovNavigationsV2({ now } = {}) {
|
|
867
|
+
const t = now ?? Date.now();
|
|
868
|
+
const flipped = [];
|
|
869
|
+
for (const j of _bagovJsV2.values())
|
|
870
|
+
if (
|
|
871
|
+
j.status === BAGOV_NAVIGATION_LIFECYCLE_V2.NAVIGATING &&
|
|
872
|
+
j.startedAt != null &&
|
|
873
|
+
t - j.startedAt >= _bagovStuckMs
|
|
874
|
+
) {
|
|
875
|
+
j.status = BAGOV_NAVIGATION_LIFECYCLE_V2.FAILED;
|
|
876
|
+
j.updatedAt = t;
|
|
877
|
+
if (!j.settledAt) j.settledAt = t;
|
|
878
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
879
|
+
flipped.push(j.id);
|
|
880
|
+
}
|
|
881
|
+
return { flipped, count: flipped.length };
|
|
882
|
+
}
|
|
883
|
+
export function getBrowserAutomationGovStatsV2() {
|
|
884
|
+
const profilesByStatus = {};
|
|
885
|
+
for (const v of Object.values(BAGOV_PROFILE_MATURITY_V2))
|
|
886
|
+
profilesByStatus[v] = 0;
|
|
887
|
+
for (const p of _bagovPsV2.values()) profilesByStatus[p.status]++;
|
|
888
|
+
const navigationsByStatus = {};
|
|
889
|
+
for (const v of Object.values(BAGOV_NAVIGATION_LIFECYCLE_V2))
|
|
890
|
+
navigationsByStatus[v] = 0;
|
|
891
|
+
for (const j of _bagovJsV2.values()) navigationsByStatus[j.status]++;
|
|
892
|
+
return {
|
|
893
|
+
totalBagovProfilesV2: _bagovPsV2.size,
|
|
894
|
+
totalBagovNavigationsV2: _bagovJsV2.size,
|
|
895
|
+
maxActiveBagovProfilesPerOwner: _bagovMaxActive,
|
|
896
|
+
maxPendingBagovNavigationsPerProfile: _bagovMaxPending,
|
|
897
|
+
bagovProfileIdleMs: _bagovIdleMs,
|
|
898
|
+
bagovNavigationStuckMs: _bagovStuckMs,
|
|
899
|
+
profilesByStatus,
|
|
900
|
+
navigationsByStatus,
|
|
901
|
+
};
|
|
902
|
+
}
|
package/src/lib/code-agent.js
CHANGED
|
@@ -763,3 +763,342 @@ export function _resetStateV2() {
|
|
|
763
763
|
_agentsV2.clear();
|
|
764
764
|
_jobsV2.clear();
|
|
765
765
|
}
|
|
766
|
+
|
|
767
|
+
// =====================================================================
|
|
768
|
+
// code-agent V2 governance overlay (iter19)
|
|
769
|
+
// =====================================================================
|
|
770
|
+
export const CDAGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
771
|
+
PENDING: "pending",
|
|
772
|
+
ACTIVE: "active",
|
|
773
|
+
STALE: "stale",
|
|
774
|
+
ARCHIVED: "archived",
|
|
775
|
+
});
|
|
776
|
+
export const CDAGOV_EDIT_LIFECYCLE_V2 = Object.freeze({
|
|
777
|
+
QUEUED: "queued",
|
|
778
|
+
EDITING: "editing",
|
|
779
|
+
EDITED: "edited",
|
|
780
|
+
FAILED: "failed",
|
|
781
|
+
CANCELLED: "cancelled",
|
|
782
|
+
});
|
|
783
|
+
const _cdagovPTrans = new Map([
|
|
784
|
+
[
|
|
785
|
+
CDAGOV_PROFILE_MATURITY_V2.PENDING,
|
|
786
|
+
new Set([
|
|
787
|
+
CDAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
788
|
+
CDAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
789
|
+
]),
|
|
790
|
+
],
|
|
791
|
+
[
|
|
792
|
+
CDAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
793
|
+
new Set([
|
|
794
|
+
CDAGOV_PROFILE_MATURITY_V2.STALE,
|
|
795
|
+
CDAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
796
|
+
]),
|
|
797
|
+
],
|
|
798
|
+
[
|
|
799
|
+
CDAGOV_PROFILE_MATURITY_V2.STALE,
|
|
800
|
+
new Set([
|
|
801
|
+
CDAGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
802
|
+
CDAGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
803
|
+
]),
|
|
804
|
+
],
|
|
805
|
+
[CDAGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
806
|
+
]);
|
|
807
|
+
const _cdagovPTerminal = new Set([CDAGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
808
|
+
const _cdagovJTrans = new Map([
|
|
809
|
+
[
|
|
810
|
+
CDAGOV_EDIT_LIFECYCLE_V2.QUEUED,
|
|
811
|
+
new Set([
|
|
812
|
+
CDAGOV_EDIT_LIFECYCLE_V2.EDITING,
|
|
813
|
+
CDAGOV_EDIT_LIFECYCLE_V2.CANCELLED,
|
|
814
|
+
]),
|
|
815
|
+
],
|
|
816
|
+
[
|
|
817
|
+
CDAGOV_EDIT_LIFECYCLE_V2.EDITING,
|
|
818
|
+
new Set([
|
|
819
|
+
CDAGOV_EDIT_LIFECYCLE_V2.EDITED,
|
|
820
|
+
CDAGOV_EDIT_LIFECYCLE_V2.FAILED,
|
|
821
|
+
CDAGOV_EDIT_LIFECYCLE_V2.CANCELLED,
|
|
822
|
+
]),
|
|
823
|
+
],
|
|
824
|
+
[CDAGOV_EDIT_LIFECYCLE_V2.EDITED, new Set()],
|
|
825
|
+
[CDAGOV_EDIT_LIFECYCLE_V2.FAILED, new Set()],
|
|
826
|
+
[CDAGOV_EDIT_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
827
|
+
]);
|
|
828
|
+
const _cdagovPsV2 = new Map();
|
|
829
|
+
const _cdagovJsV2 = new Map();
|
|
830
|
+
let _cdagovMaxActive = 6,
|
|
831
|
+
_cdagovMaxPending = 15,
|
|
832
|
+
_cdagovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
833
|
+
_cdagovStuckMs = 60 * 1000;
|
|
834
|
+
function _cdagovPos(n, label) {
|
|
835
|
+
const v = Math.floor(Number(n));
|
|
836
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
837
|
+
throw new Error(`${label} must be positive integer`);
|
|
838
|
+
return v;
|
|
839
|
+
}
|
|
840
|
+
function _cdagovCheckP(from, to) {
|
|
841
|
+
const a = _cdagovPTrans.get(from);
|
|
842
|
+
if (!a || !a.has(to))
|
|
843
|
+
throw new Error(`invalid cdagov profile transition ${from} → ${to}`);
|
|
844
|
+
}
|
|
845
|
+
function _cdagovCheckJ(from, to) {
|
|
846
|
+
const a = _cdagovJTrans.get(from);
|
|
847
|
+
if (!a || !a.has(to))
|
|
848
|
+
throw new Error(`invalid cdagov edit transition ${from} → ${to}`);
|
|
849
|
+
}
|
|
850
|
+
function _cdagovCountActive(owner) {
|
|
851
|
+
let c = 0;
|
|
852
|
+
for (const p of _cdagovPsV2.values())
|
|
853
|
+
if (p.owner === owner && p.status === CDAGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
854
|
+
c++;
|
|
855
|
+
return c;
|
|
856
|
+
}
|
|
857
|
+
function _cdagovCountPending(profileId) {
|
|
858
|
+
let c = 0;
|
|
859
|
+
for (const j of _cdagovJsV2.values())
|
|
860
|
+
if (
|
|
861
|
+
j.profileId === profileId &&
|
|
862
|
+
(j.status === CDAGOV_EDIT_LIFECYCLE_V2.QUEUED ||
|
|
863
|
+
j.status === CDAGOV_EDIT_LIFECYCLE_V2.EDITING)
|
|
864
|
+
)
|
|
865
|
+
c++;
|
|
866
|
+
return c;
|
|
867
|
+
}
|
|
868
|
+
export function setMaxActiveCdagovProfilesPerOwnerV2(n) {
|
|
869
|
+
_cdagovMaxActive = _cdagovPos(n, "maxActiveCdagovProfilesPerOwner");
|
|
870
|
+
}
|
|
871
|
+
export function getMaxActiveCdagovProfilesPerOwnerV2() {
|
|
872
|
+
return _cdagovMaxActive;
|
|
873
|
+
}
|
|
874
|
+
export function setMaxPendingCdagovEditsPerProfileV2(n) {
|
|
875
|
+
_cdagovMaxPending = _cdagovPos(n, "maxPendingCdagovEditsPerProfile");
|
|
876
|
+
}
|
|
877
|
+
export function getMaxPendingCdagovEditsPerProfileV2() {
|
|
878
|
+
return _cdagovMaxPending;
|
|
879
|
+
}
|
|
880
|
+
export function setCdagovProfileIdleMsV2(n) {
|
|
881
|
+
_cdagovIdleMs = _cdagovPos(n, "cdagovProfileIdleMs");
|
|
882
|
+
}
|
|
883
|
+
export function getCdagovProfileIdleMsV2() {
|
|
884
|
+
return _cdagovIdleMs;
|
|
885
|
+
}
|
|
886
|
+
export function setCdagovEditStuckMsV2(n) {
|
|
887
|
+
_cdagovStuckMs = _cdagovPos(n, "cdagovEditStuckMs");
|
|
888
|
+
}
|
|
889
|
+
export function getCdagovEditStuckMsV2() {
|
|
890
|
+
return _cdagovStuckMs;
|
|
891
|
+
}
|
|
892
|
+
export function _resetStateCodeAgentGovV2() {
|
|
893
|
+
_cdagovPsV2.clear();
|
|
894
|
+
_cdagovJsV2.clear();
|
|
895
|
+
_cdagovMaxActive = 6;
|
|
896
|
+
_cdagovMaxPending = 15;
|
|
897
|
+
_cdagovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
898
|
+
_cdagovStuckMs = 60 * 1000;
|
|
899
|
+
}
|
|
900
|
+
export function registerCdagovProfileV2({
|
|
901
|
+
id,
|
|
902
|
+
owner,
|
|
903
|
+
language,
|
|
904
|
+
metadata,
|
|
905
|
+
} = {}) {
|
|
906
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
907
|
+
if (_cdagovPsV2.has(id))
|
|
908
|
+
throw new Error(`cdagov profile ${id} already exists`);
|
|
909
|
+
const now = Date.now();
|
|
910
|
+
const p = {
|
|
911
|
+
id,
|
|
912
|
+
owner,
|
|
913
|
+
language: language || "javascript",
|
|
914
|
+
status: CDAGOV_PROFILE_MATURITY_V2.PENDING,
|
|
915
|
+
createdAt: now,
|
|
916
|
+
updatedAt: now,
|
|
917
|
+
lastTouchedAt: now,
|
|
918
|
+
activatedAt: null,
|
|
919
|
+
archivedAt: null,
|
|
920
|
+
metadata: { ...(metadata || {}) },
|
|
921
|
+
};
|
|
922
|
+
_cdagovPsV2.set(id, p);
|
|
923
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
924
|
+
}
|
|
925
|
+
export function activateCdagovProfileV2(id) {
|
|
926
|
+
const p = _cdagovPsV2.get(id);
|
|
927
|
+
if (!p) throw new Error(`cdagov profile ${id} not found`);
|
|
928
|
+
const isInitial = p.status === CDAGOV_PROFILE_MATURITY_V2.PENDING;
|
|
929
|
+
_cdagovCheckP(p.status, CDAGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
930
|
+
if (isInitial && _cdagovCountActive(p.owner) >= _cdagovMaxActive)
|
|
931
|
+
throw new Error(`max active cdagov profiles for owner ${p.owner} reached`);
|
|
932
|
+
const now = Date.now();
|
|
933
|
+
p.status = CDAGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
934
|
+
p.updatedAt = now;
|
|
935
|
+
p.lastTouchedAt = now;
|
|
936
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
937
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
938
|
+
}
|
|
939
|
+
export function staleCdagovProfileV2(id) {
|
|
940
|
+
const p = _cdagovPsV2.get(id);
|
|
941
|
+
if (!p) throw new Error(`cdagov profile ${id} not found`);
|
|
942
|
+
_cdagovCheckP(p.status, CDAGOV_PROFILE_MATURITY_V2.STALE);
|
|
943
|
+
p.status = CDAGOV_PROFILE_MATURITY_V2.STALE;
|
|
944
|
+
p.updatedAt = Date.now();
|
|
945
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
946
|
+
}
|
|
947
|
+
export function archiveCdagovProfileV2(id) {
|
|
948
|
+
const p = _cdagovPsV2.get(id);
|
|
949
|
+
if (!p) throw new Error(`cdagov profile ${id} not found`);
|
|
950
|
+
_cdagovCheckP(p.status, CDAGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
951
|
+
const now = Date.now();
|
|
952
|
+
p.status = CDAGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
953
|
+
p.updatedAt = now;
|
|
954
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
955
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
956
|
+
}
|
|
957
|
+
export function touchCdagovProfileV2(id) {
|
|
958
|
+
const p = _cdagovPsV2.get(id);
|
|
959
|
+
if (!p) throw new Error(`cdagov profile ${id} not found`);
|
|
960
|
+
if (_cdagovPTerminal.has(p.status))
|
|
961
|
+
throw new Error(`cannot touch terminal cdagov profile ${id}`);
|
|
962
|
+
const now = Date.now();
|
|
963
|
+
p.lastTouchedAt = now;
|
|
964
|
+
p.updatedAt = now;
|
|
965
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
966
|
+
}
|
|
967
|
+
export function getCdagovProfileV2(id) {
|
|
968
|
+
const p = _cdagovPsV2.get(id);
|
|
969
|
+
if (!p) return null;
|
|
970
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
971
|
+
}
|
|
972
|
+
export function listCdagovProfilesV2() {
|
|
973
|
+
return [..._cdagovPsV2.values()].map((p) => ({
|
|
974
|
+
...p,
|
|
975
|
+
metadata: { ...p.metadata },
|
|
976
|
+
}));
|
|
977
|
+
}
|
|
978
|
+
export function createCdagovEditV2({ id, profileId, target, metadata } = {}) {
|
|
979
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
980
|
+
if (_cdagovJsV2.has(id)) throw new Error(`cdagov edit ${id} already exists`);
|
|
981
|
+
if (!_cdagovPsV2.has(profileId))
|
|
982
|
+
throw new Error(`cdagov profile ${profileId} not found`);
|
|
983
|
+
if (_cdagovCountPending(profileId) >= _cdagovMaxPending)
|
|
984
|
+
throw new Error(
|
|
985
|
+
`max pending cdagov edits for profile ${profileId} reached`,
|
|
986
|
+
);
|
|
987
|
+
const now = Date.now();
|
|
988
|
+
const j = {
|
|
989
|
+
id,
|
|
990
|
+
profileId,
|
|
991
|
+
target: target || "",
|
|
992
|
+
status: CDAGOV_EDIT_LIFECYCLE_V2.QUEUED,
|
|
993
|
+
createdAt: now,
|
|
994
|
+
updatedAt: now,
|
|
995
|
+
startedAt: null,
|
|
996
|
+
settledAt: null,
|
|
997
|
+
metadata: { ...(metadata || {}) },
|
|
998
|
+
};
|
|
999
|
+
_cdagovJsV2.set(id, j);
|
|
1000
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1001
|
+
}
|
|
1002
|
+
export function editingCdagovEditV2(id) {
|
|
1003
|
+
const j = _cdagovJsV2.get(id);
|
|
1004
|
+
if (!j) throw new Error(`cdagov edit ${id} not found`);
|
|
1005
|
+
_cdagovCheckJ(j.status, CDAGOV_EDIT_LIFECYCLE_V2.EDITING);
|
|
1006
|
+
const now = Date.now();
|
|
1007
|
+
j.status = CDAGOV_EDIT_LIFECYCLE_V2.EDITING;
|
|
1008
|
+
j.updatedAt = now;
|
|
1009
|
+
if (!j.startedAt) j.startedAt = now;
|
|
1010
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1011
|
+
}
|
|
1012
|
+
export function completeEditCdagovV2(id) {
|
|
1013
|
+
const j = _cdagovJsV2.get(id);
|
|
1014
|
+
if (!j) throw new Error(`cdagov edit ${id} not found`);
|
|
1015
|
+
_cdagovCheckJ(j.status, CDAGOV_EDIT_LIFECYCLE_V2.EDITED);
|
|
1016
|
+
const now = Date.now();
|
|
1017
|
+
j.status = CDAGOV_EDIT_LIFECYCLE_V2.EDITED;
|
|
1018
|
+
j.updatedAt = now;
|
|
1019
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1020
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1021
|
+
}
|
|
1022
|
+
export function failCdagovEditV2(id, reason) {
|
|
1023
|
+
const j = _cdagovJsV2.get(id);
|
|
1024
|
+
if (!j) throw new Error(`cdagov edit ${id} not found`);
|
|
1025
|
+
_cdagovCheckJ(j.status, CDAGOV_EDIT_LIFECYCLE_V2.FAILED);
|
|
1026
|
+
const now = Date.now();
|
|
1027
|
+
j.status = CDAGOV_EDIT_LIFECYCLE_V2.FAILED;
|
|
1028
|
+
j.updatedAt = now;
|
|
1029
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1030
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
1031
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1032
|
+
}
|
|
1033
|
+
export function cancelCdagovEditV2(id, reason) {
|
|
1034
|
+
const j = _cdagovJsV2.get(id);
|
|
1035
|
+
if (!j) throw new Error(`cdagov edit ${id} not found`);
|
|
1036
|
+
_cdagovCheckJ(j.status, CDAGOV_EDIT_LIFECYCLE_V2.CANCELLED);
|
|
1037
|
+
const now = Date.now();
|
|
1038
|
+
j.status = CDAGOV_EDIT_LIFECYCLE_V2.CANCELLED;
|
|
1039
|
+
j.updatedAt = now;
|
|
1040
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1041
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1042
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1043
|
+
}
|
|
1044
|
+
export function getCdagovEditV2(id) {
|
|
1045
|
+
const j = _cdagovJsV2.get(id);
|
|
1046
|
+
if (!j) return null;
|
|
1047
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1048
|
+
}
|
|
1049
|
+
export function listCdagovEditsV2() {
|
|
1050
|
+
return [..._cdagovJsV2.values()].map((j) => ({
|
|
1051
|
+
...j,
|
|
1052
|
+
metadata: { ...j.metadata },
|
|
1053
|
+
}));
|
|
1054
|
+
}
|
|
1055
|
+
export function autoStaleIdleCdagovProfilesV2({ now } = {}) {
|
|
1056
|
+
const t = now ?? Date.now();
|
|
1057
|
+
const flipped = [];
|
|
1058
|
+
for (const p of _cdagovPsV2.values())
|
|
1059
|
+
if (
|
|
1060
|
+
p.status === CDAGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1061
|
+
t - p.lastTouchedAt >= _cdagovIdleMs
|
|
1062
|
+
) {
|
|
1063
|
+
p.status = CDAGOV_PROFILE_MATURITY_V2.STALE;
|
|
1064
|
+
p.updatedAt = t;
|
|
1065
|
+
flipped.push(p.id);
|
|
1066
|
+
}
|
|
1067
|
+
return { flipped, count: flipped.length };
|
|
1068
|
+
}
|
|
1069
|
+
export function autoFailStuckCdagovEditsV2({ now } = {}) {
|
|
1070
|
+
const t = now ?? Date.now();
|
|
1071
|
+
const flipped = [];
|
|
1072
|
+
for (const j of _cdagovJsV2.values())
|
|
1073
|
+
if (
|
|
1074
|
+
j.status === CDAGOV_EDIT_LIFECYCLE_V2.EDITING &&
|
|
1075
|
+
j.startedAt != null &&
|
|
1076
|
+
t - j.startedAt >= _cdagovStuckMs
|
|
1077
|
+
) {
|
|
1078
|
+
j.status = CDAGOV_EDIT_LIFECYCLE_V2.FAILED;
|
|
1079
|
+
j.updatedAt = t;
|
|
1080
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1081
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1082
|
+
flipped.push(j.id);
|
|
1083
|
+
}
|
|
1084
|
+
return { flipped, count: flipped.length };
|
|
1085
|
+
}
|
|
1086
|
+
export function getCodeAgentGovStatsV2() {
|
|
1087
|
+
const profilesByStatus = {};
|
|
1088
|
+
for (const v of Object.values(CDAGOV_PROFILE_MATURITY_V2))
|
|
1089
|
+
profilesByStatus[v] = 0;
|
|
1090
|
+
for (const p of _cdagovPsV2.values()) profilesByStatus[p.status]++;
|
|
1091
|
+
const editsByStatus = {};
|
|
1092
|
+
for (const v of Object.values(CDAGOV_EDIT_LIFECYCLE_V2)) editsByStatus[v] = 0;
|
|
1093
|
+
for (const j of _cdagovJsV2.values()) editsByStatus[j.status]++;
|
|
1094
|
+
return {
|
|
1095
|
+
totalCdagovProfilesV2: _cdagovPsV2.size,
|
|
1096
|
+
totalCdagovEditsV2: _cdagovJsV2.size,
|
|
1097
|
+
maxActiveCdagovProfilesPerOwner: _cdagovMaxActive,
|
|
1098
|
+
maxPendingCdagovEditsPerProfile: _cdagovMaxPending,
|
|
1099
|
+
cdagovProfileIdleMs: _cdagovIdleMs,
|
|
1100
|
+
cdagovEditStuckMs: _cdagovStuckMs,
|
|
1101
|
+
profilesByStatus,
|
|
1102
|
+
editsByStatus,
|
|
1103
|
+
};
|
|
1104
|
+
}
|