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
|
@@ -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/chat-core.js
CHANGED
|
@@ -688,3 +688,338 @@ export function getChatCoreGovStatsV2() {
|
|
|
688
688
|
messagesByStatus,
|
|
689
689
|
};
|
|
690
690
|
}
|
|
691
|
+
|
|
692
|
+
// === Iter28 V2 governance overlay: Ccoregov ===
|
|
693
|
+
export const CCOREGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
694
|
+
PENDING: "pending",
|
|
695
|
+
ACTIVE: "active",
|
|
696
|
+
IDLE: "idle",
|
|
697
|
+
ARCHIVED: "archived",
|
|
698
|
+
});
|
|
699
|
+
export const CCOREGOV_MSG_LIFECYCLE_V2 = Object.freeze({
|
|
700
|
+
QUEUED: "queued",
|
|
701
|
+
SENDING: "sending",
|
|
702
|
+
SENT: "sent",
|
|
703
|
+
FAILED: "failed",
|
|
704
|
+
CANCELLED: "cancelled",
|
|
705
|
+
});
|
|
706
|
+
const _ccoregovPTrans = new Map([
|
|
707
|
+
[
|
|
708
|
+
CCOREGOV_PROFILE_MATURITY_V2.PENDING,
|
|
709
|
+
new Set([
|
|
710
|
+
CCOREGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
711
|
+
CCOREGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
712
|
+
]),
|
|
713
|
+
],
|
|
714
|
+
[
|
|
715
|
+
CCOREGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
716
|
+
new Set([
|
|
717
|
+
CCOREGOV_PROFILE_MATURITY_V2.IDLE,
|
|
718
|
+
CCOREGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
719
|
+
]),
|
|
720
|
+
],
|
|
721
|
+
[
|
|
722
|
+
CCOREGOV_PROFILE_MATURITY_V2.IDLE,
|
|
723
|
+
new Set([
|
|
724
|
+
CCOREGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
725
|
+
CCOREGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
726
|
+
]),
|
|
727
|
+
],
|
|
728
|
+
[CCOREGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
729
|
+
]);
|
|
730
|
+
const _ccoregovPTerminal = new Set([CCOREGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
731
|
+
const _ccoregovJTrans = new Map([
|
|
732
|
+
[
|
|
733
|
+
CCOREGOV_MSG_LIFECYCLE_V2.QUEUED,
|
|
734
|
+
new Set([
|
|
735
|
+
CCOREGOV_MSG_LIFECYCLE_V2.SENDING,
|
|
736
|
+
CCOREGOV_MSG_LIFECYCLE_V2.CANCELLED,
|
|
737
|
+
]),
|
|
738
|
+
],
|
|
739
|
+
[
|
|
740
|
+
CCOREGOV_MSG_LIFECYCLE_V2.SENDING,
|
|
741
|
+
new Set([
|
|
742
|
+
CCOREGOV_MSG_LIFECYCLE_V2.SENT,
|
|
743
|
+
CCOREGOV_MSG_LIFECYCLE_V2.FAILED,
|
|
744
|
+
CCOREGOV_MSG_LIFECYCLE_V2.CANCELLED,
|
|
745
|
+
]),
|
|
746
|
+
],
|
|
747
|
+
[CCOREGOV_MSG_LIFECYCLE_V2.SENT, new Set()],
|
|
748
|
+
[CCOREGOV_MSG_LIFECYCLE_V2.FAILED, new Set()],
|
|
749
|
+
[CCOREGOV_MSG_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
750
|
+
]);
|
|
751
|
+
const _ccoregovPsV2 = new Map();
|
|
752
|
+
const _ccoregovJsV2 = new Map();
|
|
753
|
+
let _ccoregovMaxActive = 10,
|
|
754
|
+
_ccoregovMaxPending = 25,
|
|
755
|
+
_ccoregovIdleMs = 2592000000,
|
|
756
|
+
_ccoregovStuckMs = 60 * 1000;
|
|
757
|
+
function _ccoregovPos(n, label) {
|
|
758
|
+
const v = Math.floor(Number(n));
|
|
759
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
760
|
+
throw new Error(`${label} must be positive integer`);
|
|
761
|
+
return v;
|
|
762
|
+
}
|
|
763
|
+
function _ccoregovCheckP(from, to) {
|
|
764
|
+
const a = _ccoregovPTrans.get(from);
|
|
765
|
+
if (!a || !a.has(to))
|
|
766
|
+
throw new Error(`invalid ccoregov profile transition ${from} → ${to}`);
|
|
767
|
+
}
|
|
768
|
+
function _ccoregovCheckJ(from, to) {
|
|
769
|
+
const a = _ccoregovJTrans.get(from);
|
|
770
|
+
if (!a || !a.has(to))
|
|
771
|
+
throw new Error(`invalid ccoregov msg transition ${from} → ${to}`);
|
|
772
|
+
}
|
|
773
|
+
function _ccoregovCountActive(owner) {
|
|
774
|
+
let c = 0;
|
|
775
|
+
for (const p of _ccoregovPsV2.values())
|
|
776
|
+
if (p.owner === owner && p.status === CCOREGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
777
|
+
c++;
|
|
778
|
+
return c;
|
|
779
|
+
}
|
|
780
|
+
function _ccoregovCountPending(profileId) {
|
|
781
|
+
let c = 0;
|
|
782
|
+
for (const j of _ccoregovJsV2.values())
|
|
783
|
+
if (
|
|
784
|
+
j.profileId === profileId &&
|
|
785
|
+
(j.status === CCOREGOV_MSG_LIFECYCLE_V2.QUEUED ||
|
|
786
|
+
j.status === CCOREGOV_MSG_LIFECYCLE_V2.SENDING)
|
|
787
|
+
)
|
|
788
|
+
c++;
|
|
789
|
+
return c;
|
|
790
|
+
}
|
|
791
|
+
export function setMaxActiveCcoreProfilesPerOwnerV2(n) {
|
|
792
|
+
_ccoregovMaxActive = _ccoregovPos(n, "maxActiveCcoreProfilesPerOwner");
|
|
793
|
+
}
|
|
794
|
+
export function getMaxActiveCcoreProfilesPerOwnerV2() {
|
|
795
|
+
return _ccoregovMaxActive;
|
|
796
|
+
}
|
|
797
|
+
export function setMaxPendingCcoreMsgsPerProfileV2(n) {
|
|
798
|
+
_ccoregovMaxPending = _ccoregovPos(n, "maxPendingCcoreMsgsPerProfile");
|
|
799
|
+
}
|
|
800
|
+
export function getMaxPendingCcoreMsgsPerProfileV2() {
|
|
801
|
+
return _ccoregovMaxPending;
|
|
802
|
+
}
|
|
803
|
+
export function setCcoreProfileIdleMsV2(n) {
|
|
804
|
+
_ccoregovIdleMs = _ccoregovPos(n, "ccoregovProfileIdleMs");
|
|
805
|
+
}
|
|
806
|
+
export function getCcoreProfileIdleMsV2() {
|
|
807
|
+
return _ccoregovIdleMs;
|
|
808
|
+
}
|
|
809
|
+
export function setCcoreMsgStuckMsV2(n) {
|
|
810
|
+
_ccoregovStuckMs = _ccoregovPos(n, "ccoregovMsgStuckMs");
|
|
811
|
+
}
|
|
812
|
+
export function getCcoreMsgStuckMsV2() {
|
|
813
|
+
return _ccoregovStuckMs;
|
|
814
|
+
}
|
|
815
|
+
export function _resetStateCcoregovV2() {
|
|
816
|
+
_ccoregovPsV2.clear();
|
|
817
|
+
_ccoregovJsV2.clear();
|
|
818
|
+
_ccoregovMaxActive = 10;
|
|
819
|
+
_ccoregovMaxPending = 25;
|
|
820
|
+
_ccoregovIdleMs = 2592000000;
|
|
821
|
+
_ccoregovStuckMs = 60 * 1000;
|
|
822
|
+
}
|
|
823
|
+
export function registerCcoreProfileV2({ id, owner, channel, metadata } = {}) {
|
|
824
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
825
|
+
if (_ccoregovPsV2.has(id))
|
|
826
|
+
throw new Error(`ccoregov profile ${id} already exists`);
|
|
827
|
+
const now = Date.now();
|
|
828
|
+
const p = {
|
|
829
|
+
id,
|
|
830
|
+
owner,
|
|
831
|
+
channel: channel || "default",
|
|
832
|
+
status: CCOREGOV_PROFILE_MATURITY_V2.PENDING,
|
|
833
|
+
createdAt: now,
|
|
834
|
+
updatedAt: now,
|
|
835
|
+
lastTouchedAt: now,
|
|
836
|
+
activatedAt: null,
|
|
837
|
+
archivedAt: null,
|
|
838
|
+
metadata: { ...(metadata || {}) },
|
|
839
|
+
};
|
|
840
|
+
_ccoregovPsV2.set(id, p);
|
|
841
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
842
|
+
}
|
|
843
|
+
export function activateCcoreProfileV2(id) {
|
|
844
|
+
const p = _ccoregovPsV2.get(id);
|
|
845
|
+
if (!p) throw new Error(`ccoregov profile ${id} not found`);
|
|
846
|
+
const isInitial = p.status === CCOREGOV_PROFILE_MATURITY_V2.PENDING;
|
|
847
|
+
_ccoregovCheckP(p.status, CCOREGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
848
|
+
if (isInitial && _ccoregovCountActive(p.owner) >= _ccoregovMaxActive)
|
|
849
|
+
throw new Error(
|
|
850
|
+
`max active ccoregov profiles for owner ${p.owner} reached`,
|
|
851
|
+
);
|
|
852
|
+
const now = Date.now();
|
|
853
|
+
p.status = CCOREGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
854
|
+
p.updatedAt = now;
|
|
855
|
+
p.lastTouchedAt = now;
|
|
856
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
857
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
858
|
+
}
|
|
859
|
+
export function idleCcoreProfileV2(id) {
|
|
860
|
+
const p = _ccoregovPsV2.get(id);
|
|
861
|
+
if (!p) throw new Error(`ccoregov profile ${id} not found`);
|
|
862
|
+
_ccoregovCheckP(p.status, CCOREGOV_PROFILE_MATURITY_V2.IDLE);
|
|
863
|
+
p.status = CCOREGOV_PROFILE_MATURITY_V2.IDLE;
|
|
864
|
+
p.updatedAt = Date.now();
|
|
865
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
866
|
+
}
|
|
867
|
+
export function archiveCcoreProfileV2(id) {
|
|
868
|
+
const p = _ccoregovPsV2.get(id);
|
|
869
|
+
if (!p) throw new Error(`ccoregov profile ${id} not found`);
|
|
870
|
+
_ccoregovCheckP(p.status, CCOREGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
871
|
+
const now = Date.now();
|
|
872
|
+
p.status = CCOREGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
873
|
+
p.updatedAt = now;
|
|
874
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
875
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
876
|
+
}
|
|
877
|
+
export function touchCcoreProfileV2(id) {
|
|
878
|
+
const p = _ccoregovPsV2.get(id);
|
|
879
|
+
if (!p) throw new Error(`ccoregov profile ${id} not found`);
|
|
880
|
+
if (_ccoregovPTerminal.has(p.status))
|
|
881
|
+
throw new Error(`cannot touch terminal ccoregov profile ${id}`);
|
|
882
|
+
const now = Date.now();
|
|
883
|
+
p.lastTouchedAt = now;
|
|
884
|
+
p.updatedAt = now;
|
|
885
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
886
|
+
}
|
|
887
|
+
export function getCcoreProfileV2(id) {
|
|
888
|
+
const p = _ccoregovPsV2.get(id);
|
|
889
|
+
if (!p) return null;
|
|
890
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
891
|
+
}
|
|
892
|
+
export function listCcoreProfilesV2() {
|
|
893
|
+
return [..._ccoregovPsV2.values()].map((p) => ({
|
|
894
|
+
...p,
|
|
895
|
+
metadata: { ...p.metadata },
|
|
896
|
+
}));
|
|
897
|
+
}
|
|
898
|
+
export function createCcoreMsgV2({ id, profileId, messageId, metadata } = {}) {
|
|
899
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
900
|
+
if (_ccoregovJsV2.has(id))
|
|
901
|
+
throw new Error(`ccoregov msg ${id} already exists`);
|
|
902
|
+
if (!_ccoregovPsV2.has(profileId))
|
|
903
|
+
throw new Error(`ccoregov profile ${profileId} not found`);
|
|
904
|
+
if (_ccoregovCountPending(profileId) >= _ccoregovMaxPending)
|
|
905
|
+
throw new Error(
|
|
906
|
+
`max pending ccoregov msgs for profile ${profileId} reached`,
|
|
907
|
+
);
|
|
908
|
+
const now = Date.now();
|
|
909
|
+
const j = {
|
|
910
|
+
id,
|
|
911
|
+
profileId,
|
|
912
|
+
messageId: messageId || "",
|
|
913
|
+
status: CCOREGOV_MSG_LIFECYCLE_V2.QUEUED,
|
|
914
|
+
createdAt: now,
|
|
915
|
+
updatedAt: now,
|
|
916
|
+
startedAt: null,
|
|
917
|
+
settledAt: null,
|
|
918
|
+
metadata: { ...(metadata || {}) },
|
|
919
|
+
};
|
|
920
|
+
_ccoregovJsV2.set(id, j);
|
|
921
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
922
|
+
}
|
|
923
|
+
export function sendingCcoreMsgV2(id) {
|
|
924
|
+
const j = _ccoregovJsV2.get(id);
|
|
925
|
+
if (!j) throw new Error(`ccoregov msg ${id} not found`);
|
|
926
|
+
_ccoregovCheckJ(j.status, CCOREGOV_MSG_LIFECYCLE_V2.SENDING);
|
|
927
|
+
const now = Date.now();
|
|
928
|
+
j.status = CCOREGOV_MSG_LIFECYCLE_V2.SENDING;
|
|
929
|
+
j.updatedAt = now;
|
|
930
|
+
if (!j.startedAt) j.startedAt = now;
|
|
931
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
932
|
+
}
|
|
933
|
+
export function completeMsgCcoreV2(id) {
|
|
934
|
+
const j = _ccoregovJsV2.get(id);
|
|
935
|
+
if (!j) throw new Error(`ccoregov msg ${id} not found`);
|
|
936
|
+
_ccoregovCheckJ(j.status, CCOREGOV_MSG_LIFECYCLE_V2.SENT);
|
|
937
|
+
const now = Date.now();
|
|
938
|
+
j.status = CCOREGOV_MSG_LIFECYCLE_V2.SENT;
|
|
939
|
+
j.updatedAt = now;
|
|
940
|
+
if (!j.settledAt) j.settledAt = now;
|
|
941
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
942
|
+
}
|
|
943
|
+
export function failCcoreMsgV2(id, reason) {
|
|
944
|
+
const j = _ccoregovJsV2.get(id);
|
|
945
|
+
if (!j) throw new Error(`ccoregov msg ${id} not found`);
|
|
946
|
+
_ccoregovCheckJ(j.status, CCOREGOV_MSG_LIFECYCLE_V2.FAILED);
|
|
947
|
+
const now = Date.now();
|
|
948
|
+
j.status = CCOREGOV_MSG_LIFECYCLE_V2.FAILED;
|
|
949
|
+
j.updatedAt = now;
|
|
950
|
+
if (!j.settledAt) j.settledAt = now;
|
|
951
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
952
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
953
|
+
}
|
|
954
|
+
export function cancelCcoreMsgV2(id, reason) {
|
|
955
|
+
const j = _ccoregovJsV2.get(id);
|
|
956
|
+
if (!j) throw new Error(`ccoregov msg ${id} not found`);
|
|
957
|
+
_ccoregovCheckJ(j.status, CCOREGOV_MSG_LIFECYCLE_V2.CANCELLED);
|
|
958
|
+
const now = Date.now();
|
|
959
|
+
j.status = CCOREGOV_MSG_LIFECYCLE_V2.CANCELLED;
|
|
960
|
+
j.updatedAt = now;
|
|
961
|
+
if (!j.settledAt) j.settledAt = now;
|
|
962
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
963
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
964
|
+
}
|
|
965
|
+
export function getCcoreMsgV2(id) {
|
|
966
|
+
const j = _ccoregovJsV2.get(id);
|
|
967
|
+
if (!j) return null;
|
|
968
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
969
|
+
}
|
|
970
|
+
export function listCcoreMsgsV2() {
|
|
971
|
+
return [..._ccoregovJsV2.values()].map((j) => ({
|
|
972
|
+
...j,
|
|
973
|
+
metadata: { ...j.metadata },
|
|
974
|
+
}));
|
|
975
|
+
}
|
|
976
|
+
export function autoIdleIdleCcoreProfilesV2({ now } = {}) {
|
|
977
|
+
const t = now ?? Date.now();
|
|
978
|
+
const flipped = [];
|
|
979
|
+
for (const p of _ccoregovPsV2.values())
|
|
980
|
+
if (
|
|
981
|
+
p.status === CCOREGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
982
|
+
t - p.lastTouchedAt >= _ccoregovIdleMs
|
|
983
|
+
) {
|
|
984
|
+
p.status = CCOREGOV_PROFILE_MATURITY_V2.IDLE;
|
|
985
|
+
p.updatedAt = t;
|
|
986
|
+
flipped.push(p.id);
|
|
987
|
+
}
|
|
988
|
+
return { flipped, count: flipped.length };
|
|
989
|
+
}
|
|
990
|
+
export function autoFailStuckCcoreMsgsV2({ now } = {}) {
|
|
991
|
+
const t = now ?? Date.now();
|
|
992
|
+
const flipped = [];
|
|
993
|
+
for (const j of _ccoregovJsV2.values())
|
|
994
|
+
if (
|
|
995
|
+
j.status === CCOREGOV_MSG_LIFECYCLE_V2.SENDING &&
|
|
996
|
+
j.startedAt != null &&
|
|
997
|
+
t - j.startedAt >= _ccoregovStuckMs
|
|
998
|
+
) {
|
|
999
|
+
j.status = CCOREGOV_MSG_LIFECYCLE_V2.FAILED;
|
|
1000
|
+
j.updatedAt = t;
|
|
1001
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1002
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1003
|
+
flipped.push(j.id);
|
|
1004
|
+
}
|
|
1005
|
+
return { flipped, count: flipped.length };
|
|
1006
|
+
}
|
|
1007
|
+
export function getCcoregovStatsV2() {
|
|
1008
|
+
const profilesByStatus = {};
|
|
1009
|
+
for (const v of Object.values(CCOREGOV_PROFILE_MATURITY_V2))
|
|
1010
|
+
profilesByStatus[v] = 0;
|
|
1011
|
+
for (const p of _ccoregovPsV2.values()) profilesByStatus[p.status]++;
|
|
1012
|
+
const msgsByStatus = {};
|
|
1013
|
+
for (const v of Object.values(CCOREGOV_MSG_LIFECYCLE_V2)) msgsByStatus[v] = 0;
|
|
1014
|
+
for (const j of _ccoregovJsV2.values()) msgsByStatus[j.status]++;
|
|
1015
|
+
return {
|
|
1016
|
+
totalCcoreProfilesV2: _ccoregovPsV2.size,
|
|
1017
|
+
totalCcoreMsgsV2: _ccoregovJsV2.size,
|
|
1018
|
+
maxActiveCcoreProfilesPerOwner: _ccoregovMaxActive,
|
|
1019
|
+
maxPendingCcoreMsgsPerProfile: _ccoregovMaxPending,
|
|
1020
|
+
ccoregovProfileIdleMs: _ccoregovIdleMs,
|
|
1021
|
+
ccoregovMsgStuckMs: _ccoregovStuckMs,
|
|
1022
|
+
profilesByStatus,
|
|
1023
|
+
msgsByStatus,
|
|
1024
|
+
};
|
|
1025
|
+
}
|