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
package/src/lib/perception.js
CHANGED
|
@@ -844,3 +844,349 @@ export function _resetStateV2() {
|
|
|
844
844
|
_sensorsV2.clear();
|
|
845
845
|
_capturesV2.clear();
|
|
846
846
|
}
|
|
847
|
+
|
|
848
|
+
// =====================================================================
|
|
849
|
+
// perception V2 governance overlay (iter18)
|
|
850
|
+
// =====================================================================
|
|
851
|
+
export const PERCGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
852
|
+
PENDING: "pending",
|
|
853
|
+
ACTIVE: "active",
|
|
854
|
+
STALE: "stale",
|
|
855
|
+
ARCHIVED: "archived",
|
|
856
|
+
});
|
|
857
|
+
export const PERCGOV_SIGNAL_LIFECYCLE_V2 = Object.freeze({
|
|
858
|
+
QUEUED: "queued",
|
|
859
|
+
ANALYZING: "analyzing",
|
|
860
|
+
ANALYZED: "analyzed",
|
|
861
|
+
FAILED: "failed",
|
|
862
|
+
CANCELLED: "cancelled",
|
|
863
|
+
});
|
|
864
|
+
const _percgovPTrans = new Map([
|
|
865
|
+
[
|
|
866
|
+
PERCGOV_PROFILE_MATURITY_V2.PENDING,
|
|
867
|
+
new Set([
|
|
868
|
+
PERCGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
869
|
+
PERCGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
870
|
+
]),
|
|
871
|
+
],
|
|
872
|
+
[
|
|
873
|
+
PERCGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
874
|
+
new Set([
|
|
875
|
+
PERCGOV_PROFILE_MATURITY_V2.STALE,
|
|
876
|
+
PERCGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
877
|
+
]),
|
|
878
|
+
],
|
|
879
|
+
[
|
|
880
|
+
PERCGOV_PROFILE_MATURITY_V2.STALE,
|
|
881
|
+
new Set([
|
|
882
|
+
PERCGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
883
|
+
PERCGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
884
|
+
]),
|
|
885
|
+
],
|
|
886
|
+
[PERCGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
887
|
+
]);
|
|
888
|
+
const _percgovPTerminal = new Set([PERCGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
889
|
+
const _percgovJTrans = new Map([
|
|
890
|
+
[
|
|
891
|
+
PERCGOV_SIGNAL_LIFECYCLE_V2.QUEUED,
|
|
892
|
+
new Set([
|
|
893
|
+
PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZING,
|
|
894
|
+
PERCGOV_SIGNAL_LIFECYCLE_V2.CANCELLED,
|
|
895
|
+
]),
|
|
896
|
+
],
|
|
897
|
+
[
|
|
898
|
+
PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZING,
|
|
899
|
+
new Set([
|
|
900
|
+
PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZED,
|
|
901
|
+
PERCGOV_SIGNAL_LIFECYCLE_V2.FAILED,
|
|
902
|
+
PERCGOV_SIGNAL_LIFECYCLE_V2.CANCELLED,
|
|
903
|
+
]),
|
|
904
|
+
],
|
|
905
|
+
[PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZED, new Set()],
|
|
906
|
+
[PERCGOV_SIGNAL_LIFECYCLE_V2.FAILED, new Set()],
|
|
907
|
+
[PERCGOV_SIGNAL_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
908
|
+
]);
|
|
909
|
+
const _percgovPsV2 = new Map();
|
|
910
|
+
const _percgovJsV2 = new Map();
|
|
911
|
+
let _percgovMaxActive = 6,
|
|
912
|
+
_percgovMaxPending = 12,
|
|
913
|
+
_percgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
914
|
+
_percgovStuckMs = 60 * 1000;
|
|
915
|
+
function _percgovPos(n, label) {
|
|
916
|
+
const v = Math.floor(Number(n));
|
|
917
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
918
|
+
throw new Error(`${label} must be positive integer`);
|
|
919
|
+
return v;
|
|
920
|
+
}
|
|
921
|
+
function _percgovCheckP(from, to) {
|
|
922
|
+
const a = _percgovPTrans.get(from);
|
|
923
|
+
if (!a || !a.has(to))
|
|
924
|
+
throw new Error(`invalid percgov profile transition ${from} → ${to}`);
|
|
925
|
+
}
|
|
926
|
+
function _percgovCheckJ(from, to) {
|
|
927
|
+
const a = _percgovJTrans.get(from);
|
|
928
|
+
if (!a || !a.has(to))
|
|
929
|
+
throw new Error(`invalid percgov signal transition ${from} → ${to}`);
|
|
930
|
+
}
|
|
931
|
+
function _percgovCountActive(owner) {
|
|
932
|
+
let c = 0;
|
|
933
|
+
for (const p of _percgovPsV2.values())
|
|
934
|
+
if (p.owner === owner && p.status === PERCGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
935
|
+
c++;
|
|
936
|
+
return c;
|
|
937
|
+
}
|
|
938
|
+
function _percgovCountPending(profileId) {
|
|
939
|
+
let c = 0;
|
|
940
|
+
for (const j of _percgovJsV2.values())
|
|
941
|
+
if (
|
|
942
|
+
j.profileId === profileId &&
|
|
943
|
+
(j.status === PERCGOV_SIGNAL_LIFECYCLE_V2.QUEUED ||
|
|
944
|
+
j.status === PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZING)
|
|
945
|
+
)
|
|
946
|
+
c++;
|
|
947
|
+
return c;
|
|
948
|
+
}
|
|
949
|
+
export function setMaxActivePercgovProfilesPerOwnerV2(n) {
|
|
950
|
+
_percgovMaxActive = _percgovPos(n, "maxActivePercgovProfilesPerOwner");
|
|
951
|
+
}
|
|
952
|
+
export function getMaxActivePercgovProfilesPerOwnerV2() {
|
|
953
|
+
return _percgovMaxActive;
|
|
954
|
+
}
|
|
955
|
+
export function setMaxPendingPercgovSignalsPerProfileV2(n) {
|
|
956
|
+
_percgovMaxPending = _percgovPos(n, "maxPendingPercgovSignalsPerProfile");
|
|
957
|
+
}
|
|
958
|
+
export function getMaxPendingPercgovSignalsPerProfileV2() {
|
|
959
|
+
return _percgovMaxPending;
|
|
960
|
+
}
|
|
961
|
+
export function setPercgovProfileIdleMsV2(n) {
|
|
962
|
+
_percgovIdleMs = _percgovPos(n, "percgovProfileIdleMs");
|
|
963
|
+
}
|
|
964
|
+
export function getPercgovProfileIdleMsV2() {
|
|
965
|
+
return _percgovIdleMs;
|
|
966
|
+
}
|
|
967
|
+
export function setPercgovSignalStuckMsV2(n) {
|
|
968
|
+
_percgovStuckMs = _percgovPos(n, "percgovSignalStuckMs");
|
|
969
|
+
}
|
|
970
|
+
export function getPercgovSignalStuckMsV2() {
|
|
971
|
+
return _percgovStuckMs;
|
|
972
|
+
}
|
|
973
|
+
export function _resetStatePerceptionGovV2() {
|
|
974
|
+
_percgovPsV2.clear();
|
|
975
|
+
_percgovJsV2.clear();
|
|
976
|
+
_percgovMaxActive = 6;
|
|
977
|
+
_percgovMaxPending = 12;
|
|
978
|
+
_percgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
979
|
+
_percgovStuckMs = 60 * 1000;
|
|
980
|
+
}
|
|
981
|
+
export function registerPercgovProfileV2({
|
|
982
|
+
id,
|
|
983
|
+
owner,
|
|
984
|
+
modality,
|
|
985
|
+
metadata,
|
|
986
|
+
} = {}) {
|
|
987
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
988
|
+
if (_percgovPsV2.has(id))
|
|
989
|
+
throw new Error(`percgov profile ${id} already exists`);
|
|
990
|
+
const now = Date.now();
|
|
991
|
+
const p = {
|
|
992
|
+
id,
|
|
993
|
+
owner,
|
|
994
|
+
modality: modality || "vision",
|
|
995
|
+
status: PERCGOV_PROFILE_MATURITY_V2.PENDING,
|
|
996
|
+
createdAt: now,
|
|
997
|
+
updatedAt: now,
|
|
998
|
+
lastTouchedAt: now,
|
|
999
|
+
activatedAt: null,
|
|
1000
|
+
archivedAt: null,
|
|
1001
|
+
metadata: { ...(metadata || {}) },
|
|
1002
|
+
};
|
|
1003
|
+
_percgovPsV2.set(id, p);
|
|
1004
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1005
|
+
}
|
|
1006
|
+
export function activatePercgovProfileV2(id) {
|
|
1007
|
+
const p = _percgovPsV2.get(id);
|
|
1008
|
+
if (!p) throw new Error(`percgov profile ${id} not found`);
|
|
1009
|
+
const isInitial = p.status === PERCGOV_PROFILE_MATURITY_V2.PENDING;
|
|
1010
|
+
_percgovCheckP(p.status, PERCGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
1011
|
+
if (isInitial && _percgovCountActive(p.owner) >= _percgovMaxActive)
|
|
1012
|
+
throw new Error(`max active percgov profiles for owner ${p.owner} reached`);
|
|
1013
|
+
const now = Date.now();
|
|
1014
|
+
p.status = PERCGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
1015
|
+
p.updatedAt = now;
|
|
1016
|
+
p.lastTouchedAt = now;
|
|
1017
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
1018
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1019
|
+
}
|
|
1020
|
+
export function stalePercgovProfileV2(id) {
|
|
1021
|
+
const p = _percgovPsV2.get(id);
|
|
1022
|
+
if (!p) throw new Error(`percgov profile ${id} not found`);
|
|
1023
|
+
_percgovCheckP(p.status, PERCGOV_PROFILE_MATURITY_V2.STALE);
|
|
1024
|
+
p.status = PERCGOV_PROFILE_MATURITY_V2.STALE;
|
|
1025
|
+
p.updatedAt = Date.now();
|
|
1026
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1027
|
+
}
|
|
1028
|
+
export function archivePercgovProfileV2(id) {
|
|
1029
|
+
const p = _percgovPsV2.get(id);
|
|
1030
|
+
if (!p) throw new Error(`percgov profile ${id} not found`);
|
|
1031
|
+
_percgovCheckP(p.status, PERCGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
1032
|
+
const now = Date.now();
|
|
1033
|
+
p.status = PERCGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
1034
|
+
p.updatedAt = now;
|
|
1035
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
1036
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1037
|
+
}
|
|
1038
|
+
export function touchPercgovProfileV2(id) {
|
|
1039
|
+
const p = _percgovPsV2.get(id);
|
|
1040
|
+
if (!p) throw new Error(`percgov profile ${id} not found`);
|
|
1041
|
+
if (_percgovPTerminal.has(p.status))
|
|
1042
|
+
throw new Error(`cannot touch terminal percgov profile ${id}`);
|
|
1043
|
+
const now = Date.now();
|
|
1044
|
+
p.lastTouchedAt = now;
|
|
1045
|
+
p.updatedAt = now;
|
|
1046
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1047
|
+
}
|
|
1048
|
+
export function getPercgovProfileV2(id) {
|
|
1049
|
+
const p = _percgovPsV2.get(id);
|
|
1050
|
+
if (!p) return null;
|
|
1051
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1052
|
+
}
|
|
1053
|
+
export function listPercgovProfilesV2() {
|
|
1054
|
+
return [..._percgovPsV2.values()].map((p) => ({
|
|
1055
|
+
...p,
|
|
1056
|
+
metadata: { ...p.metadata },
|
|
1057
|
+
}));
|
|
1058
|
+
}
|
|
1059
|
+
export function createPercgovSignalV2({
|
|
1060
|
+
id,
|
|
1061
|
+
profileId,
|
|
1062
|
+
source,
|
|
1063
|
+
metadata,
|
|
1064
|
+
} = {}) {
|
|
1065
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
1066
|
+
if (_percgovJsV2.has(id))
|
|
1067
|
+
throw new Error(`percgov signal ${id} already exists`);
|
|
1068
|
+
if (!_percgovPsV2.has(profileId))
|
|
1069
|
+
throw new Error(`percgov profile ${profileId} not found`);
|
|
1070
|
+
if (_percgovCountPending(profileId) >= _percgovMaxPending)
|
|
1071
|
+
throw new Error(
|
|
1072
|
+
`max pending percgov signals for profile ${profileId} reached`,
|
|
1073
|
+
);
|
|
1074
|
+
const now = Date.now();
|
|
1075
|
+
const j = {
|
|
1076
|
+
id,
|
|
1077
|
+
profileId,
|
|
1078
|
+
source: source || "",
|
|
1079
|
+
status: PERCGOV_SIGNAL_LIFECYCLE_V2.QUEUED,
|
|
1080
|
+
createdAt: now,
|
|
1081
|
+
updatedAt: now,
|
|
1082
|
+
startedAt: null,
|
|
1083
|
+
settledAt: null,
|
|
1084
|
+
metadata: { ...(metadata || {}) },
|
|
1085
|
+
};
|
|
1086
|
+
_percgovJsV2.set(id, j);
|
|
1087
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1088
|
+
}
|
|
1089
|
+
export function analyzingPercgovSignalV2(id) {
|
|
1090
|
+
const j = _percgovJsV2.get(id);
|
|
1091
|
+
if (!j) throw new Error(`percgov signal ${id} not found`);
|
|
1092
|
+
_percgovCheckJ(j.status, PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZING);
|
|
1093
|
+
const now = Date.now();
|
|
1094
|
+
j.status = PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZING;
|
|
1095
|
+
j.updatedAt = now;
|
|
1096
|
+
if (!j.startedAt) j.startedAt = now;
|
|
1097
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1098
|
+
}
|
|
1099
|
+
export function completeSignalPercgovV2(id) {
|
|
1100
|
+
const j = _percgovJsV2.get(id);
|
|
1101
|
+
if (!j) throw new Error(`percgov signal ${id} not found`);
|
|
1102
|
+
_percgovCheckJ(j.status, PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZED);
|
|
1103
|
+
const now = Date.now();
|
|
1104
|
+
j.status = PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZED;
|
|
1105
|
+
j.updatedAt = now;
|
|
1106
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1107
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1108
|
+
}
|
|
1109
|
+
export function failPercgovSignalV2(id, reason) {
|
|
1110
|
+
const j = _percgovJsV2.get(id);
|
|
1111
|
+
if (!j) throw new Error(`percgov signal ${id} not found`);
|
|
1112
|
+
_percgovCheckJ(j.status, PERCGOV_SIGNAL_LIFECYCLE_V2.FAILED);
|
|
1113
|
+
const now = Date.now();
|
|
1114
|
+
j.status = PERCGOV_SIGNAL_LIFECYCLE_V2.FAILED;
|
|
1115
|
+
j.updatedAt = now;
|
|
1116
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1117
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
1118
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1119
|
+
}
|
|
1120
|
+
export function cancelPercgovSignalV2(id, reason) {
|
|
1121
|
+
const j = _percgovJsV2.get(id);
|
|
1122
|
+
if (!j) throw new Error(`percgov signal ${id} not found`);
|
|
1123
|
+
_percgovCheckJ(j.status, PERCGOV_SIGNAL_LIFECYCLE_V2.CANCELLED);
|
|
1124
|
+
const now = Date.now();
|
|
1125
|
+
j.status = PERCGOV_SIGNAL_LIFECYCLE_V2.CANCELLED;
|
|
1126
|
+
j.updatedAt = now;
|
|
1127
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1128
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1129
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1130
|
+
}
|
|
1131
|
+
export function getPercgovSignalV2(id) {
|
|
1132
|
+
const j = _percgovJsV2.get(id);
|
|
1133
|
+
if (!j) return null;
|
|
1134
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1135
|
+
}
|
|
1136
|
+
export function listPercgovSignalsV2() {
|
|
1137
|
+
return [..._percgovJsV2.values()].map((j) => ({
|
|
1138
|
+
...j,
|
|
1139
|
+
metadata: { ...j.metadata },
|
|
1140
|
+
}));
|
|
1141
|
+
}
|
|
1142
|
+
export function autoStaleIdlePercgovProfilesV2({ now } = {}) {
|
|
1143
|
+
const t = now ?? Date.now();
|
|
1144
|
+
const flipped = [];
|
|
1145
|
+
for (const p of _percgovPsV2.values())
|
|
1146
|
+
if (
|
|
1147
|
+
p.status === PERCGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1148
|
+
t - p.lastTouchedAt >= _percgovIdleMs
|
|
1149
|
+
) {
|
|
1150
|
+
p.status = PERCGOV_PROFILE_MATURITY_V2.STALE;
|
|
1151
|
+
p.updatedAt = t;
|
|
1152
|
+
flipped.push(p.id);
|
|
1153
|
+
}
|
|
1154
|
+
return { flipped, count: flipped.length };
|
|
1155
|
+
}
|
|
1156
|
+
export function autoFailStuckPercgovSignalsV2({ now } = {}) {
|
|
1157
|
+
const t = now ?? Date.now();
|
|
1158
|
+
const flipped = [];
|
|
1159
|
+
for (const j of _percgovJsV2.values())
|
|
1160
|
+
if (
|
|
1161
|
+
j.status === PERCGOV_SIGNAL_LIFECYCLE_V2.ANALYZING &&
|
|
1162
|
+
j.startedAt != null &&
|
|
1163
|
+
t - j.startedAt >= _percgovStuckMs
|
|
1164
|
+
) {
|
|
1165
|
+
j.status = PERCGOV_SIGNAL_LIFECYCLE_V2.FAILED;
|
|
1166
|
+
j.updatedAt = t;
|
|
1167
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1168
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1169
|
+
flipped.push(j.id);
|
|
1170
|
+
}
|
|
1171
|
+
return { flipped, count: flipped.length };
|
|
1172
|
+
}
|
|
1173
|
+
export function getPerceptionGovStatsV2() {
|
|
1174
|
+
const profilesByStatus = {};
|
|
1175
|
+
for (const v of Object.values(PERCGOV_PROFILE_MATURITY_V2))
|
|
1176
|
+
profilesByStatus[v] = 0;
|
|
1177
|
+
for (const p of _percgovPsV2.values()) profilesByStatus[p.status]++;
|
|
1178
|
+
const signalsByStatus = {};
|
|
1179
|
+
for (const v of Object.values(PERCGOV_SIGNAL_LIFECYCLE_V2))
|
|
1180
|
+
signalsByStatus[v] = 0;
|
|
1181
|
+
for (const j of _percgovJsV2.values()) signalsByStatus[j.status]++;
|
|
1182
|
+
return {
|
|
1183
|
+
totalPercgovProfilesV2: _percgovPsV2.size,
|
|
1184
|
+
totalPercgovSignalsV2: _percgovJsV2.size,
|
|
1185
|
+
maxActivePercgovProfilesPerOwner: _percgovMaxActive,
|
|
1186
|
+
maxPendingPercgovSignalsPerProfile: _percgovMaxPending,
|
|
1187
|
+
percgovProfileIdleMs: _percgovIdleMs,
|
|
1188
|
+
percgovSignalStuckMs: _percgovStuckMs,
|
|
1189
|
+
profilesByStatus,
|
|
1190
|
+
signalsByStatus,
|
|
1191
|
+
};
|
|
1192
|
+
}
|
|
@@ -688,3 +688,330 @@ export function _resetStatePermanentMemoryV2() {
|
|
|
688
688
|
_pinIdleMsV2 = PERMMEM_DEFAULT_PIN_IDLE_MS;
|
|
689
689
|
_jobStuckMsV2 = PERMMEM_DEFAULT_JOB_STUCK_MS;
|
|
690
690
|
}
|
|
691
|
+
|
|
692
|
+
// =====================================================================
|
|
693
|
+
// permanent-memory V2 governance overlay (iter23)
|
|
694
|
+
// =====================================================================
|
|
695
|
+
export const PMGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
696
|
+
PENDING: "pending",
|
|
697
|
+
ACTIVE: "active",
|
|
698
|
+
DORMANT: "dormant",
|
|
699
|
+
ARCHIVED: "archived",
|
|
700
|
+
});
|
|
701
|
+
export const PMGOV_PIN_LIFECYCLE_V2 = Object.freeze({
|
|
702
|
+
QUEUED: "queued",
|
|
703
|
+
PINNING: "pinning",
|
|
704
|
+
PINNED: "pinned",
|
|
705
|
+
FAILED: "failed",
|
|
706
|
+
CANCELLED: "cancelled",
|
|
707
|
+
});
|
|
708
|
+
const _pmgovPTrans = new Map([
|
|
709
|
+
[
|
|
710
|
+
PMGOV_PROFILE_MATURITY_V2.PENDING,
|
|
711
|
+
new Set([
|
|
712
|
+
PMGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
713
|
+
PMGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
714
|
+
]),
|
|
715
|
+
],
|
|
716
|
+
[
|
|
717
|
+
PMGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
718
|
+
new Set([
|
|
719
|
+
PMGOV_PROFILE_MATURITY_V2.DORMANT,
|
|
720
|
+
PMGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
721
|
+
]),
|
|
722
|
+
],
|
|
723
|
+
[
|
|
724
|
+
PMGOV_PROFILE_MATURITY_V2.DORMANT,
|
|
725
|
+
new Set([
|
|
726
|
+
PMGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
727
|
+
PMGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
728
|
+
]),
|
|
729
|
+
],
|
|
730
|
+
[PMGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
731
|
+
]);
|
|
732
|
+
const _pmgovPTerminal = new Set([PMGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
733
|
+
const _pmgovJTrans = new Map([
|
|
734
|
+
[
|
|
735
|
+
PMGOV_PIN_LIFECYCLE_V2.QUEUED,
|
|
736
|
+
new Set([PMGOV_PIN_LIFECYCLE_V2.PINNING, PMGOV_PIN_LIFECYCLE_V2.CANCELLED]),
|
|
737
|
+
],
|
|
738
|
+
[
|
|
739
|
+
PMGOV_PIN_LIFECYCLE_V2.PINNING,
|
|
740
|
+
new Set([
|
|
741
|
+
PMGOV_PIN_LIFECYCLE_V2.PINNED,
|
|
742
|
+
PMGOV_PIN_LIFECYCLE_V2.FAILED,
|
|
743
|
+
PMGOV_PIN_LIFECYCLE_V2.CANCELLED,
|
|
744
|
+
]),
|
|
745
|
+
],
|
|
746
|
+
[PMGOV_PIN_LIFECYCLE_V2.PINNED, new Set()],
|
|
747
|
+
[PMGOV_PIN_LIFECYCLE_V2.FAILED, new Set()],
|
|
748
|
+
[PMGOV_PIN_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
749
|
+
]);
|
|
750
|
+
const _pmgovPsV2 = new Map();
|
|
751
|
+
const _pmgovJsV2 = new Map();
|
|
752
|
+
let _pmgovMaxActive = 10,
|
|
753
|
+
_pmgovMaxPending = 30,
|
|
754
|
+
_pmgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
755
|
+
_pmgovStuckMs = 60 * 1000;
|
|
756
|
+
function _pmgovPos(n, label) {
|
|
757
|
+
const v = Math.floor(Number(n));
|
|
758
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
759
|
+
throw new Error(`${label} must be positive integer`);
|
|
760
|
+
return v;
|
|
761
|
+
}
|
|
762
|
+
function _pmgovCheckP(from, to) {
|
|
763
|
+
const a = _pmgovPTrans.get(from);
|
|
764
|
+
if (!a || !a.has(to))
|
|
765
|
+
throw new Error(`invalid pmgov profile transition ${from} → ${to}`);
|
|
766
|
+
}
|
|
767
|
+
function _pmgovCheckJ(from, to) {
|
|
768
|
+
const a = _pmgovJTrans.get(from);
|
|
769
|
+
if (!a || !a.has(to))
|
|
770
|
+
throw new Error(`invalid pmgov pin transition ${from} → ${to}`);
|
|
771
|
+
}
|
|
772
|
+
function _pmgovCountActive(owner) {
|
|
773
|
+
let c = 0;
|
|
774
|
+
for (const p of _pmgovPsV2.values())
|
|
775
|
+
if (p.owner === owner && p.status === PMGOV_PROFILE_MATURITY_V2.ACTIVE) c++;
|
|
776
|
+
return c;
|
|
777
|
+
}
|
|
778
|
+
function _pmgovCountPending(profileId) {
|
|
779
|
+
let c = 0;
|
|
780
|
+
for (const j of _pmgovJsV2.values())
|
|
781
|
+
if (
|
|
782
|
+
j.profileId === profileId &&
|
|
783
|
+
(j.status === PMGOV_PIN_LIFECYCLE_V2.QUEUED ||
|
|
784
|
+
j.status === PMGOV_PIN_LIFECYCLE_V2.PINNING)
|
|
785
|
+
)
|
|
786
|
+
c++;
|
|
787
|
+
return c;
|
|
788
|
+
}
|
|
789
|
+
export function setMaxActivePmgovProfilesPerOwnerV2(n) {
|
|
790
|
+
_pmgovMaxActive = _pmgovPos(n, "maxActivePmgovProfilesPerOwner");
|
|
791
|
+
}
|
|
792
|
+
export function getMaxActivePmgovProfilesPerOwnerV2() {
|
|
793
|
+
return _pmgovMaxActive;
|
|
794
|
+
}
|
|
795
|
+
export function setMaxPendingPmgovPinsPerProfileV2(n) {
|
|
796
|
+
_pmgovMaxPending = _pmgovPos(n, "maxPendingPmgovPinsPerProfile");
|
|
797
|
+
}
|
|
798
|
+
export function getMaxPendingPmgovPinsPerProfileV2() {
|
|
799
|
+
return _pmgovMaxPending;
|
|
800
|
+
}
|
|
801
|
+
export function setPmgovProfileIdleMsV2(n) {
|
|
802
|
+
_pmgovIdleMs = _pmgovPos(n, "pmgovProfileIdleMs");
|
|
803
|
+
}
|
|
804
|
+
export function getPmgovProfileIdleMsV2() {
|
|
805
|
+
return _pmgovIdleMs;
|
|
806
|
+
}
|
|
807
|
+
export function setPmgovPinStuckMsV2(n) {
|
|
808
|
+
_pmgovStuckMs = _pmgovPos(n, "pmgovPinStuckMs");
|
|
809
|
+
}
|
|
810
|
+
export function getPmgovPinStuckMsV2() {
|
|
811
|
+
return _pmgovStuckMs;
|
|
812
|
+
}
|
|
813
|
+
export function _resetStatePermanentMemoryGovV2() {
|
|
814
|
+
_pmgovPsV2.clear();
|
|
815
|
+
_pmgovJsV2.clear();
|
|
816
|
+
_pmgovMaxActive = 10;
|
|
817
|
+
_pmgovMaxPending = 30;
|
|
818
|
+
_pmgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
819
|
+
_pmgovStuckMs = 60 * 1000;
|
|
820
|
+
}
|
|
821
|
+
export function registerPmgovProfileV2({ id, owner, bucket, metadata } = {}) {
|
|
822
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
823
|
+
if (_pmgovPsV2.has(id)) throw new Error(`pmgov profile ${id} already exists`);
|
|
824
|
+
const now = Date.now();
|
|
825
|
+
const p = {
|
|
826
|
+
id,
|
|
827
|
+
owner,
|
|
828
|
+
bucket: bucket || "default",
|
|
829
|
+
status: PMGOV_PROFILE_MATURITY_V2.PENDING,
|
|
830
|
+
createdAt: now,
|
|
831
|
+
updatedAt: now,
|
|
832
|
+
lastTouchedAt: now,
|
|
833
|
+
activatedAt: null,
|
|
834
|
+
archivedAt: null,
|
|
835
|
+
metadata: { ...(metadata || {}) },
|
|
836
|
+
};
|
|
837
|
+
_pmgovPsV2.set(id, p);
|
|
838
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
839
|
+
}
|
|
840
|
+
export function activatePmgovProfileV2(id) {
|
|
841
|
+
const p = _pmgovPsV2.get(id);
|
|
842
|
+
if (!p) throw new Error(`pmgov profile ${id} not found`);
|
|
843
|
+
const isInitial = p.status === PMGOV_PROFILE_MATURITY_V2.PENDING;
|
|
844
|
+
_pmgovCheckP(p.status, PMGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
845
|
+
if (isInitial && _pmgovCountActive(p.owner) >= _pmgovMaxActive)
|
|
846
|
+
throw new Error(`max active pmgov profiles for owner ${p.owner} reached`);
|
|
847
|
+
const now = Date.now();
|
|
848
|
+
p.status = PMGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
849
|
+
p.updatedAt = now;
|
|
850
|
+
p.lastTouchedAt = now;
|
|
851
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
852
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
853
|
+
}
|
|
854
|
+
export function dormantPmgovProfileV2(id) {
|
|
855
|
+
const p = _pmgovPsV2.get(id);
|
|
856
|
+
if (!p) throw new Error(`pmgov profile ${id} not found`);
|
|
857
|
+
_pmgovCheckP(p.status, PMGOV_PROFILE_MATURITY_V2.DORMANT);
|
|
858
|
+
p.status = PMGOV_PROFILE_MATURITY_V2.DORMANT;
|
|
859
|
+
p.updatedAt = Date.now();
|
|
860
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
861
|
+
}
|
|
862
|
+
export function archivePmgovProfileV2(id) {
|
|
863
|
+
const p = _pmgovPsV2.get(id);
|
|
864
|
+
if (!p) throw new Error(`pmgov profile ${id} not found`);
|
|
865
|
+
_pmgovCheckP(p.status, PMGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
866
|
+
const now = Date.now();
|
|
867
|
+
p.status = PMGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
868
|
+
p.updatedAt = now;
|
|
869
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
870
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
871
|
+
}
|
|
872
|
+
export function touchPmgovProfileV2(id) {
|
|
873
|
+
const p = _pmgovPsV2.get(id);
|
|
874
|
+
if (!p) throw new Error(`pmgov profile ${id} not found`);
|
|
875
|
+
if (_pmgovPTerminal.has(p.status))
|
|
876
|
+
throw new Error(`cannot touch terminal pmgov profile ${id}`);
|
|
877
|
+
const now = Date.now();
|
|
878
|
+
p.lastTouchedAt = now;
|
|
879
|
+
p.updatedAt = now;
|
|
880
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
881
|
+
}
|
|
882
|
+
export function getPmgovProfileV2(id) {
|
|
883
|
+
const p = _pmgovPsV2.get(id);
|
|
884
|
+
if (!p) return null;
|
|
885
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
886
|
+
}
|
|
887
|
+
export function listPmgovProfilesV2() {
|
|
888
|
+
return [..._pmgovPsV2.values()].map((p) => ({
|
|
889
|
+
...p,
|
|
890
|
+
metadata: { ...p.metadata },
|
|
891
|
+
}));
|
|
892
|
+
}
|
|
893
|
+
export function createPmgovPinV2({ id, profileId, key, metadata } = {}) {
|
|
894
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
895
|
+
if (_pmgovJsV2.has(id)) throw new Error(`pmgov pin ${id} already exists`);
|
|
896
|
+
if (!_pmgovPsV2.has(profileId))
|
|
897
|
+
throw new Error(`pmgov profile ${profileId} not found`);
|
|
898
|
+
if (_pmgovCountPending(profileId) >= _pmgovMaxPending)
|
|
899
|
+
throw new Error(`max pending pmgov pins for profile ${profileId} reached`);
|
|
900
|
+
const now = Date.now();
|
|
901
|
+
const j = {
|
|
902
|
+
id,
|
|
903
|
+
profileId,
|
|
904
|
+
key: key || "",
|
|
905
|
+
status: PMGOV_PIN_LIFECYCLE_V2.QUEUED,
|
|
906
|
+
createdAt: now,
|
|
907
|
+
updatedAt: now,
|
|
908
|
+
startedAt: null,
|
|
909
|
+
settledAt: null,
|
|
910
|
+
metadata: { ...(metadata || {}) },
|
|
911
|
+
};
|
|
912
|
+
_pmgovJsV2.set(id, j);
|
|
913
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
914
|
+
}
|
|
915
|
+
export function pinningPmgovPinV2(id) {
|
|
916
|
+
const j = _pmgovJsV2.get(id);
|
|
917
|
+
if (!j) throw new Error(`pmgov pin ${id} not found`);
|
|
918
|
+
_pmgovCheckJ(j.status, PMGOV_PIN_LIFECYCLE_V2.PINNING);
|
|
919
|
+
const now = Date.now();
|
|
920
|
+
j.status = PMGOV_PIN_LIFECYCLE_V2.PINNING;
|
|
921
|
+
j.updatedAt = now;
|
|
922
|
+
if (!j.startedAt) j.startedAt = now;
|
|
923
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
924
|
+
}
|
|
925
|
+
export function completePinPmgovV2(id) {
|
|
926
|
+
const j = _pmgovJsV2.get(id);
|
|
927
|
+
if (!j) throw new Error(`pmgov pin ${id} not found`);
|
|
928
|
+
_pmgovCheckJ(j.status, PMGOV_PIN_LIFECYCLE_V2.PINNED);
|
|
929
|
+
const now = Date.now();
|
|
930
|
+
j.status = PMGOV_PIN_LIFECYCLE_V2.PINNED;
|
|
931
|
+
j.updatedAt = now;
|
|
932
|
+
if (!j.settledAt) j.settledAt = now;
|
|
933
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
934
|
+
}
|
|
935
|
+
export function failPmgovPinV2(id, reason) {
|
|
936
|
+
const j = _pmgovJsV2.get(id);
|
|
937
|
+
if (!j) throw new Error(`pmgov pin ${id} not found`);
|
|
938
|
+
_pmgovCheckJ(j.status, PMGOV_PIN_LIFECYCLE_V2.FAILED);
|
|
939
|
+
const now = Date.now();
|
|
940
|
+
j.status = PMGOV_PIN_LIFECYCLE_V2.FAILED;
|
|
941
|
+
j.updatedAt = now;
|
|
942
|
+
if (!j.settledAt) j.settledAt = now;
|
|
943
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
944
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
945
|
+
}
|
|
946
|
+
export function cancelPmgovPinV2(id, reason) {
|
|
947
|
+
const j = _pmgovJsV2.get(id);
|
|
948
|
+
if (!j) throw new Error(`pmgov pin ${id} not found`);
|
|
949
|
+
_pmgovCheckJ(j.status, PMGOV_PIN_LIFECYCLE_V2.CANCELLED);
|
|
950
|
+
const now = Date.now();
|
|
951
|
+
j.status = PMGOV_PIN_LIFECYCLE_V2.CANCELLED;
|
|
952
|
+
j.updatedAt = now;
|
|
953
|
+
if (!j.settledAt) j.settledAt = now;
|
|
954
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
955
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
956
|
+
}
|
|
957
|
+
export function getPmgovPinV2(id) {
|
|
958
|
+
const j = _pmgovJsV2.get(id);
|
|
959
|
+
if (!j) return null;
|
|
960
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
961
|
+
}
|
|
962
|
+
export function listPmgovPinsV2() {
|
|
963
|
+
return [..._pmgovJsV2.values()].map((j) => ({
|
|
964
|
+
...j,
|
|
965
|
+
metadata: { ...j.metadata },
|
|
966
|
+
}));
|
|
967
|
+
}
|
|
968
|
+
export function autoDormantIdlePmgovProfilesV2({ now } = {}) {
|
|
969
|
+
const t = now ?? Date.now();
|
|
970
|
+
const flipped = [];
|
|
971
|
+
for (const p of _pmgovPsV2.values())
|
|
972
|
+
if (
|
|
973
|
+
p.status === PMGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
974
|
+
t - p.lastTouchedAt >= _pmgovIdleMs
|
|
975
|
+
) {
|
|
976
|
+
p.status = PMGOV_PROFILE_MATURITY_V2.DORMANT;
|
|
977
|
+
p.updatedAt = t;
|
|
978
|
+
flipped.push(p.id);
|
|
979
|
+
}
|
|
980
|
+
return { flipped, count: flipped.length };
|
|
981
|
+
}
|
|
982
|
+
export function autoFailStuckPmgovPinsV2({ now } = {}) {
|
|
983
|
+
const t = now ?? Date.now();
|
|
984
|
+
const flipped = [];
|
|
985
|
+
for (const j of _pmgovJsV2.values())
|
|
986
|
+
if (
|
|
987
|
+
j.status === PMGOV_PIN_LIFECYCLE_V2.PINNING &&
|
|
988
|
+
j.startedAt != null &&
|
|
989
|
+
t - j.startedAt >= _pmgovStuckMs
|
|
990
|
+
) {
|
|
991
|
+
j.status = PMGOV_PIN_LIFECYCLE_V2.FAILED;
|
|
992
|
+
j.updatedAt = t;
|
|
993
|
+
if (!j.settledAt) j.settledAt = t;
|
|
994
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
995
|
+
flipped.push(j.id);
|
|
996
|
+
}
|
|
997
|
+
return { flipped, count: flipped.length };
|
|
998
|
+
}
|
|
999
|
+
export function getPermanentMemoryGovStatsV2() {
|
|
1000
|
+
const profilesByStatus = {};
|
|
1001
|
+
for (const v of Object.values(PMGOV_PROFILE_MATURITY_V2))
|
|
1002
|
+
profilesByStatus[v] = 0;
|
|
1003
|
+
for (const p of _pmgovPsV2.values()) profilesByStatus[p.status]++;
|
|
1004
|
+
const pinsByStatus = {};
|
|
1005
|
+
for (const v of Object.values(PMGOV_PIN_LIFECYCLE_V2)) pinsByStatus[v] = 0;
|
|
1006
|
+
for (const j of _pmgovJsV2.values()) pinsByStatus[j.status]++;
|
|
1007
|
+
return {
|
|
1008
|
+
totalPmgovProfilesV2: _pmgovPsV2.size,
|
|
1009
|
+
totalPmgovPinsV2: _pmgovJsV2.size,
|
|
1010
|
+
maxActivePmgovProfilesPerOwner: _pmgovMaxActive,
|
|
1011
|
+
maxPendingPmgovPinsPerProfile: _pmgovMaxPending,
|
|
1012
|
+
pmgovProfileIdleMs: _pmgovIdleMs,
|
|
1013
|
+
pmgovPinStuckMs: _pmgovStuckMs,
|
|
1014
|
+
profilesByStatus,
|
|
1015
|
+
pinsByStatus,
|
|
1016
|
+
};
|
|
1017
|
+
}
|