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/agent-router.js
CHANGED
|
@@ -790,3 +790,336 @@ export function getAgentRouterStatsV2() {
|
|
|
790
790
|
dispatchesByStatus,
|
|
791
791
|
};
|
|
792
792
|
}
|
|
793
|
+
|
|
794
|
+
// =====================================================================
|
|
795
|
+
// agent-router V2 governance overlay (iter25)
|
|
796
|
+
// =====================================================================
|
|
797
|
+
export const ARGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
798
|
+
PENDING: "pending",
|
|
799
|
+
ACTIVE: "active",
|
|
800
|
+
STALE: "stale",
|
|
801
|
+
ARCHIVED: "archived",
|
|
802
|
+
});
|
|
803
|
+
export const ARGOV_ROUTING_LIFECYCLE_V2 = Object.freeze({
|
|
804
|
+
QUEUED: "queued",
|
|
805
|
+
ROUTING_RUN: "routing",
|
|
806
|
+
ROUTED: "routed",
|
|
807
|
+
FAILED: "failed",
|
|
808
|
+
CANCELLED: "cancelled",
|
|
809
|
+
});
|
|
810
|
+
const _argovPTrans = new Map([
|
|
811
|
+
[
|
|
812
|
+
ARGOV_PROFILE_MATURITY_V2.PENDING,
|
|
813
|
+
new Set([
|
|
814
|
+
ARGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
815
|
+
ARGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
816
|
+
]),
|
|
817
|
+
],
|
|
818
|
+
[
|
|
819
|
+
ARGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
820
|
+
new Set([
|
|
821
|
+
ARGOV_PROFILE_MATURITY_V2.STALE,
|
|
822
|
+
ARGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
823
|
+
]),
|
|
824
|
+
],
|
|
825
|
+
[
|
|
826
|
+
ARGOV_PROFILE_MATURITY_V2.STALE,
|
|
827
|
+
new Set([
|
|
828
|
+
ARGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
829
|
+
ARGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
830
|
+
]),
|
|
831
|
+
],
|
|
832
|
+
[ARGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
833
|
+
]);
|
|
834
|
+
const _argovPTerminal = new Set([ARGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
835
|
+
const _argovJTrans = new Map([
|
|
836
|
+
[
|
|
837
|
+
ARGOV_ROUTING_LIFECYCLE_V2.QUEUED,
|
|
838
|
+
new Set([
|
|
839
|
+
ARGOV_ROUTING_LIFECYCLE_V2.ROUTING_RUN,
|
|
840
|
+
ARGOV_ROUTING_LIFECYCLE_V2.CANCELLED,
|
|
841
|
+
]),
|
|
842
|
+
],
|
|
843
|
+
[
|
|
844
|
+
ARGOV_ROUTING_LIFECYCLE_V2.ROUTING_RUN,
|
|
845
|
+
new Set([
|
|
846
|
+
ARGOV_ROUTING_LIFECYCLE_V2.ROUTED,
|
|
847
|
+
ARGOV_ROUTING_LIFECYCLE_V2.FAILED,
|
|
848
|
+
ARGOV_ROUTING_LIFECYCLE_V2.CANCELLED,
|
|
849
|
+
]),
|
|
850
|
+
],
|
|
851
|
+
[ARGOV_ROUTING_LIFECYCLE_V2.ROUTED, new Set()],
|
|
852
|
+
[ARGOV_ROUTING_LIFECYCLE_V2.FAILED, new Set()],
|
|
853
|
+
[ARGOV_ROUTING_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
854
|
+
]);
|
|
855
|
+
const _argovPsV2 = new Map();
|
|
856
|
+
const _argovJsV2 = new Map();
|
|
857
|
+
let _argovMaxActive = 8,
|
|
858
|
+
_argovMaxPending = 20,
|
|
859
|
+
_argovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
860
|
+
_argovStuckMs = 60 * 1000;
|
|
861
|
+
function _argovPos(n, label) {
|
|
862
|
+
const v = Math.floor(Number(n));
|
|
863
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
864
|
+
throw new Error(`${label} must be positive integer`);
|
|
865
|
+
return v;
|
|
866
|
+
}
|
|
867
|
+
function _argovCheckP(from, to) {
|
|
868
|
+
const a = _argovPTrans.get(from);
|
|
869
|
+
if (!a || !a.has(to))
|
|
870
|
+
throw new Error(`invalid argov profile transition ${from} → ${to}`);
|
|
871
|
+
}
|
|
872
|
+
function _argovCheckJ(from, to) {
|
|
873
|
+
const a = _argovJTrans.get(from);
|
|
874
|
+
if (!a || !a.has(to))
|
|
875
|
+
throw new Error(`invalid argov routing transition ${from} → ${to}`);
|
|
876
|
+
}
|
|
877
|
+
function _argovCountActive(owner) {
|
|
878
|
+
let c = 0;
|
|
879
|
+
for (const p of _argovPsV2.values())
|
|
880
|
+
if (p.owner === owner && p.status === ARGOV_PROFILE_MATURITY_V2.ACTIVE) c++;
|
|
881
|
+
return c;
|
|
882
|
+
}
|
|
883
|
+
function _argovCountPending(profileId) {
|
|
884
|
+
let c = 0;
|
|
885
|
+
for (const j of _argovJsV2.values())
|
|
886
|
+
if (
|
|
887
|
+
j.profileId === profileId &&
|
|
888
|
+
(j.status === ARGOV_ROUTING_LIFECYCLE_V2.QUEUED ||
|
|
889
|
+
j.status === ARGOV_ROUTING_LIFECYCLE_V2.ROUTING_RUN)
|
|
890
|
+
)
|
|
891
|
+
c++;
|
|
892
|
+
return c;
|
|
893
|
+
}
|
|
894
|
+
export function setMaxActiveArgovProfilesPerOwnerV2(n) {
|
|
895
|
+
_argovMaxActive = _argovPos(n, "maxActiveArgovProfilesPerOwner");
|
|
896
|
+
}
|
|
897
|
+
export function getMaxActiveArgovProfilesPerOwnerV2() {
|
|
898
|
+
return _argovMaxActive;
|
|
899
|
+
}
|
|
900
|
+
export function setMaxPendingArgovRoutingsPerProfileV2(n) {
|
|
901
|
+
_argovMaxPending = _argovPos(n, "maxPendingArgovRoutingsPerProfile");
|
|
902
|
+
}
|
|
903
|
+
export function getMaxPendingArgovRoutingsPerProfileV2() {
|
|
904
|
+
return _argovMaxPending;
|
|
905
|
+
}
|
|
906
|
+
export function setArgovProfileIdleMsV2(n) {
|
|
907
|
+
_argovIdleMs = _argovPos(n, "argovProfileIdleMs");
|
|
908
|
+
}
|
|
909
|
+
export function getArgovProfileIdleMsV2() {
|
|
910
|
+
return _argovIdleMs;
|
|
911
|
+
}
|
|
912
|
+
export function setArgovRoutingStuckMsV2(n) {
|
|
913
|
+
_argovStuckMs = _argovPos(n, "argovRoutingStuckMs");
|
|
914
|
+
}
|
|
915
|
+
export function getArgovRoutingStuckMsV2() {
|
|
916
|
+
return _argovStuckMs;
|
|
917
|
+
}
|
|
918
|
+
export function _resetStateAgentRouterGovV2() {
|
|
919
|
+
_argovPsV2.clear();
|
|
920
|
+
_argovJsV2.clear();
|
|
921
|
+
_argovMaxActive = 8;
|
|
922
|
+
_argovMaxPending = 20;
|
|
923
|
+
_argovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
924
|
+
_argovStuckMs = 60 * 1000;
|
|
925
|
+
}
|
|
926
|
+
export function registerArgovProfileV2({ id, owner, strategy, metadata } = {}) {
|
|
927
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
928
|
+
if (_argovPsV2.has(id)) throw new Error(`argov profile ${id} already exists`);
|
|
929
|
+
const now = Date.now();
|
|
930
|
+
const p = {
|
|
931
|
+
id,
|
|
932
|
+
owner,
|
|
933
|
+
strategy: strategy || "round-robin",
|
|
934
|
+
status: ARGOV_PROFILE_MATURITY_V2.PENDING,
|
|
935
|
+
createdAt: now,
|
|
936
|
+
updatedAt: now,
|
|
937
|
+
lastTouchedAt: now,
|
|
938
|
+
activatedAt: null,
|
|
939
|
+
archivedAt: null,
|
|
940
|
+
metadata: { ...(metadata || {}) },
|
|
941
|
+
};
|
|
942
|
+
_argovPsV2.set(id, p);
|
|
943
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
944
|
+
}
|
|
945
|
+
export function activateArgovProfileV2(id) {
|
|
946
|
+
const p = _argovPsV2.get(id);
|
|
947
|
+
if (!p) throw new Error(`argov profile ${id} not found`);
|
|
948
|
+
const isInitial = p.status === ARGOV_PROFILE_MATURITY_V2.PENDING;
|
|
949
|
+
_argovCheckP(p.status, ARGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
950
|
+
if (isInitial && _argovCountActive(p.owner) >= _argovMaxActive)
|
|
951
|
+
throw new Error(`max active argov profiles for owner ${p.owner} reached`);
|
|
952
|
+
const now = Date.now();
|
|
953
|
+
p.status = ARGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
954
|
+
p.updatedAt = now;
|
|
955
|
+
p.lastTouchedAt = now;
|
|
956
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
957
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
958
|
+
}
|
|
959
|
+
export function staleArgovProfileV2(id) {
|
|
960
|
+
const p = _argovPsV2.get(id);
|
|
961
|
+
if (!p) throw new Error(`argov profile ${id} not found`);
|
|
962
|
+
_argovCheckP(p.status, ARGOV_PROFILE_MATURITY_V2.STALE);
|
|
963
|
+
p.status = ARGOV_PROFILE_MATURITY_V2.STALE;
|
|
964
|
+
p.updatedAt = Date.now();
|
|
965
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
966
|
+
}
|
|
967
|
+
export function archiveArgovProfileV2(id) {
|
|
968
|
+
const p = _argovPsV2.get(id);
|
|
969
|
+
if (!p) throw new Error(`argov profile ${id} not found`);
|
|
970
|
+
_argovCheckP(p.status, ARGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
971
|
+
const now = Date.now();
|
|
972
|
+
p.status = ARGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
973
|
+
p.updatedAt = now;
|
|
974
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
975
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
976
|
+
}
|
|
977
|
+
export function touchArgovProfileV2(id) {
|
|
978
|
+
const p = _argovPsV2.get(id);
|
|
979
|
+
if (!p) throw new Error(`argov profile ${id} not found`);
|
|
980
|
+
if (_argovPTerminal.has(p.status))
|
|
981
|
+
throw new Error(`cannot touch terminal argov profile ${id}`);
|
|
982
|
+
const now = Date.now();
|
|
983
|
+
p.lastTouchedAt = now;
|
|
984
|
+
p.updatedAt = now;
|
|
985
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
986
|
+
}
|
|
987
|
+
export function getArgovProfileV2(id) {
|
|
988
|
+
const p = _argovPsV2.get(id);
|
|
989
|
+
if (!p) return null;
|
|
990
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
991
|
+
}
|
|
992
|
+
export function listArgovProfilesV2() {
|
|
993
|
+
return [..._argovPsV2.values()].map((p) => ({
|
|
994
|
+
...p,
|
|
995
|
+
metadata: { ...p.metadata },
|
|
996
|
+
}));
|
|
997
|
+
}
|
|
998
|
+
export function createArgovRoutingV2({ id, profileId, target, metadata } = {}) {
|
|
999
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
1000
|
+
if (_argovJsV2.has(id)) throw new Error(`argov routing ${id} already exists`);
|
|
1001
|
+
if (!_argovPsV2.has(profileId))
|
|
1002
|
+
throw new Error(`argov profile ${profileId} not found`);
|
|
1003
|
+
if (_argovCountPending(profileId) >= _argovMaxPending)
|
|
1004
|
+
throw new Error(
|
|
1005
|
+
`max pending argov routings for profile ${profileId} reached`,
|
|
1006
|
+
);
|
|
1007
|
+
const now = Date.now();
|
|
1008
|
+
const j = {
|
|
1009
|
+
id,
|
|
1010
|
+
profileId,
|
|
1011
|
+
target: target || "",
|
|
1012
|
+
status: ARGOV_ROUTING_LIFECYCLE_V2.QUEUED,
|
|
1013
|
+
createdAt: now,
|
|
1014
|
+
updatedAt: now,
|
|
1015
|
+
startedAt: null,
|
|
1016
|
+
settledAt: null,
|
|
1017
|
+
metadata: { ...(metadata || {}) },
|
|
1018
|
+
};
|
|
1019
|
+
_argovJsV2.set(id, j);
|
|
1020
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1021
|
+
}
|
|
1022
|
+
export function runningArgovRoutingV2(id) {
|
|
1023
|
+
const j = _argovJsV2.get(id);
|
|
1024
|
+
if (!j) throw new Error(`argov routing ${id} not found`);
|
|
1025
|
+
_argovCheckJ(j.status, ARGOV_ROUTING_LIFECYCLE_V2.ROUTING_RUN);
|
|
1026
|
+
const now = Date.now();
|
|
1027
|
+
j.status = ARGOV_ROUTING_LIFECYCLE_V2.ROUTING_RUN;
|
|
1028
|
+
j.updatedAt = now;
|
|
1029
|
+
if (!j.startedAt) j.startedAt = now;
|
|
1030
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1031
|
+
}
|
|
1032
|
+
export function completeRoutingArgovV2(id) {
|
|
1033
|
+
const j = _argovJsV2.get(id);
|
|
1034
|
+
if (!j) throw new Error(`argov routing ${id} not found`);
|
|
1035
|
+
_argovCheckJ(j.status, ARGOV_ROUTING_LIFECYCLE_V2.ROUTED);
|
|
1036
|
+
const now = Date.now();
|
|
1037
|
+
j.status = ARGOV_ROUTING_LIFECYCLE_V2.ROUTED;
|
|
1038
|
+
j.updatedAt = now;
|
|
1039
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1040
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1041
|
+
}
|
|
1042
|
+
export function failArgovRoutingV2(id, reason) {
|
|
1043
|
+
const j = _argovJsV2.get(id);
|
|
1044
|
+
if (!j) throw new Error(`argov routing ${id} not found`);
|
|
1045
|
+
_argovCheckJ(j.status, ARGOV_ROUTING_LIFECYCLE_V2.FAILED);
|
|
1046
|
+
const now = Date.now();
|
|
1047
|
+
j.status = ARGOV_ROUTING_LIFECYCLE_V2.FAILED;
|
|
1048
|
+
j.updatedAt = now;
|
|
1049
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1050
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
1051
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1052
|
+
}
|
|
1053
|
+
export function cancelArgovRoutingV2(id, reason) {
|
|
1054
|
+
const j = _argovJsV2.get(id);
|
|
1055
|
+
if (!j) throw new Error(`argov routing ${id} not found`);
|
|
1056
|
+
_argovCheckJ(j.status, ARGOV_ROUTING_LIFECYCLE_V2.CANCELLED);
|
|
1057
|
+
const now = Date.now();
|
|
1058
|
+
j.status = ARGOV_ROUTING_LIFECYCLE_V2.CANCELLED;
|
|
1059
|
+
j.updatedAt = now;
|
|
1060
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1061
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1062
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1063
|
+
}
|
|
1064
|
+
export function getArgovRoutingV2(id) {
|
|
1065
|
+
const j = _argovJsV2.get(id);
|
|
1066
|
+
if (!j) return null;
|
|
1067
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1068
|
+
}
|
|
1069
|
+
export function listArgovRoutingsV2() {
|
|
1070
|
+
return [..._argovJsV2.values()].map((j) => ({
|
|
1071
|
+
...j,
|
|
1072
|
+
metadata: { ...j.metadata },
|
|
1073
|
+
}));
|
|
1074
|
+
}
|
|
1075
|
+
export function autoStaleIdleArgovProfilesV2({ now } = {}) {
|
|
1076
|
+
const t = now ?? Date.now();
|
|
1077
|
+
const flipped = [];
|
|
1078
|
+
for (const p of _argovPsV2.values())
|
|
1079
|
+
if (
|
|
1080
|
+
p.status === ARGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1081
|
+
t - p.lastTouchedAt >= _argovIdleMs
|
|
1082
|
+
) {
|
|
1083
|
+
p.status = ARGOV_PROFILE_MATURITY_V2.STALE;
|
|
1084
|
+
p.updatedAt = t;
|
|
1085
|
+
flipped.push(p.id);
|
|
1086
|
+
}
|
|
1087
|
+
return { flipped, count: flipped.length };
|
|
1088
|
+
}
|
|
1089
|
+
export function autoFailStuckArgovRoutingsV2({ now } = {}) {
|
|
1090
|
+
const t = now ?? Date.now();
|
|
1091
|
+
const flipped = [];
|
|
1092
|
+
for (const j of _argovJsV2.values())
|
|
1093
|
+
if (
|
|
1094
|
+
j.status === ARGOV_ROUTING_LIFECYCLE_V2.ROUTING_RUN &&
|
|
1095
|
+
j.startedAt != null &&
|
|
1096
|
+
t - j.startedAt >= _argovStuckMs
|
|
1097
|
+
) {
|
|
1098
|
+
j.status = ARGOV_ROUTING_LIFECYCLE_V2.FAILED;
|
|
1099
|
+
j.updatedAt = t;
|
|
1100
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1101
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1102
|
+
flipped.push(j.id);
|
|
1103
|
+
}
|
|
1104
|
+
return { flipped, count: flipped.length };
|
|
1105
|
+
}
|
|
1106
|
+
export function getAgentRouterGovStatsV2() {
|
|
1107
|
+
const profilesByStatus = {};
|
|
1108
|
+
for (const v of Object.values(ARGOV_PROFILE_MATURITY_V2))
|
|
1109
|
+
profilesByStatus[v] = 0;
|
|
1110
|
+
for (const p of _argovPsV2.values()) profilesByStatus[p.status]++;
|
|
1111
|
+
const routingsByStatus = {};
|
|
1112
|
+
for (const v of Object.values(ARGOV_ROUTING_LIFECYCLE_V2))
|
|
1113
|
+
routingsByStatus[v] = 0;
|
|
1114
|
+
for (const j of _argovJsV2.values()) routingsByStatus[j.status]++;
|
|
1115
|
+
return {
|
|
1116
|
+
totalArgovProfilesV2: _argovPsV2.size,
|
|
1117
|
+
totalArgovRoutingsV2: _argovJsV2.size,
|
|
1118
|
+
maxActiveArgovProfilesPerOwner: _argovMaxActive,
|
|
1119
|
+
maxPendingArgovRoutingsPerProfile: _argovMaxPending,
|
|
1120
|
+
argovProfileIdleMs: _argovIdleMs,
|
|
1121
|
+
argovRoutingStuckMs: _argovStuckMs,
|
|
1122
|
+
profilesByStatus,
|
|
1123
|
+
routingsByStatus,
|
|
1124
|
+
};
|
|
1125
|
+
}
|
package/src/lib/aiops.js
CHANGED
|
@@ -999,3 +999,349 @@ export function _resetStateV2() {
|
|
|
999
999
|
_playbookStaleMsV2 = AIOPS_DEFAULT_PLAYBOOK_STALE_MS;
|
|
1000
1000
|
_remediationTimeoutMsV2 = AIOPS_DEFAULT_REMEDIATION_TIMEOUT_MS;
|
|
1001
1001
|
}
|
|
1002
|
+
|
|
1003
|
+
// =====================================================================
|
|
1004
|
+
// aiops V2 governance overlay (iter18)
|
|
1005
|
+
// =====================================================================
|
|
1006
|
+
export const AIOPSGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
1007
|
+
PENDING: "pending",
|
|
1008
|
+
ACTIVE: "active",
|
|
1009
|
+
STALE: "stale",
|
|
1010
|
+
ARCHIVED: "archived",
|
|
1011
|
+
});
|
|
1012
|
+
export const AIOPSGOV_INCIDENT_LIFECYCLE_V2 = Object.freeze({
|
|
1013
|
+
QUEUED: "queued",
|
|
1014
|
+
TRIAGING: "triaging",
|
|
1015
|
+
TRIAGED: "triaged",
|
|
1016
|
+
FAILED: "failed",
|
|
1017
|
+
CANCELLED: "cancelled",
|
|
1018
|
+
});
|
|
1019
|
+
const _aiopsgovPTrans = new Map([
|
|
1020
|
+
[
|
|
1021
|
+
AIOPSGOV_PROFILE_MATURITY_V2.PENDING,
|
|
1022
|
+
new Set([
|
|
1023
|
+
AIOPSGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
1024
|
+
AIOPSGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1025
|
+
]),
|
|
1026
|
+
],
|
|
1027
|
+
[
|
|
1028
|
+
AIOPSGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
1029
|
+
new Set([
|
|
1030
|
+
AIOPSGOV_PROFILE_MATURITY_V2.STALE,
|
|
1031
|
+
AIOPSGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1032
|
+
]),
|
|
1033
|
+
],
|
|
1034
|
+
[
|
|
1035
|
+
AIOPSGOV_PROFILE_MATURITY_V2.STALE,
|
|
1036
|
+
new Set([
|
|
1037
|
+
AIOPSGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
1038
|
+
AIOPSGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
1039
|
+
]),
|
|
1040
|
+
],
|
|
1041
|
+
[AIOPSGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
1042
|
+
]);
|
|
1043
|
+
const _aiopsgovPTerminal = new Set([AIOPSGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
1044
|
+
const _aiopsgovJTrans = new Map([
|
|
1045
|
+
[
|
|
1046
|
+
AIOPSGOV_INCIDENT_LIFECYCLE_V2.QUEUED,
|
|
1047
|
+
new Set([
|
|
1048
|
+
AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGING,
|
|
1049
|
+
AIOPSGOV_INCIDENT_LIFECYCLE_V2.CANCELLED,
|
|
1050
|
+
]),
|
|
1051
|
+
],
|
|
1052
|
+
[
|
|
1053
|
+
AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGING,
|
|
1054
|
+
new Set([
|
|
1055
|
+
AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGED,
|
|
1056
|
+
AIOPSGOV_INCIDENT_LIFECYCLE_V2.FAILED,
|
|
1057
|
+
AIOPSGOV_INCIDENT_LIFECYCLE_V2.CANCELLED,
|
|
1058
|
+
]),
|
|
1059
|
+
],
|
|
1060
|
+
[AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGED, new Set()],
|
|
1061
|
+
[AIOPSGOV_INCIDENT_LIFECYCLE_V2.FAILED, new Set()],
|
|
1062
|
+
[AIOPSGOV_INCIDENT_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
1063
|
+
]);
|
|
1064
|
+
const _aiopsgovPsV2 = new Map();
|
|
1065
|
+
const _aiopsgovJsV2 = new Map();
|
|
1066
|
+
let _aiopsgovMaxActive = 6,
|
|
1067
|
+
_aiopsgovMaxPending = 15,
|
|
1068
|
+
_aiopsgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
1069
|
+
_aiopsgovStuckMs = 60 * 1000;
|
|
1070
|
+
function _aiopsgovPos(n, label) {
|
|
1071
|
+
const v = Math.floor(Number(n));
|
|
1072
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
1073
|
+
throw new Error(`${label} must be positive integer`);
|
|
1074
|
+
return v;
|
|
1075
|
+
}
|
|
1076
|
+
function _aiopsgovCheckP(from, to) {
|
|
1077
|
+
const a = _aiopsgovPTrans.get(from);
|
|
1078
|
+
if (!a || !a.has(to))
|
|
1079
|
+
throw new Error(`invalid aiopsgov profile transition ${from} → ${to}`);
|
|
1080
|
+
}
|
|
1081
|
+
function _aiopsgovCheckJ(from, to) {
|
|
1082
|
+
const a = _aiopsgovJTrans.get(from);
|
|
1083
|
+
if (!a || !a.has(to))
|
|
1084
|
+
throw new Error(`invalid aiopsgov incident transition ${from} → ${to}`);
|
|
1085
|
+
}
|
|
1086
|
+
function _aiopsgovCountActive(owner) {
|
|
1087
|
+
let c = 0;
|
|
1088
|
+
for (const p of _aiopsgovPsV2.values())
|
|
1089
|
+
if (p.owner === owner && p.status === AIOPSGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
1090
|
+
c++;
|
|
1091
|
+
return c;
|
|
1092
|
+
}
|
|
1093
|
+
function _aiopsgovCountPending(profileId) {
|
|
1094
|
+
let c = 0;
|
|
1095
|
+
for (const j of _aiopsgovJsV2.values())
|
|
1096
|
+
if (
|
|
1097
|
+
j.profileId === profileId &&
|
|
1098
|
+
(j.status === AIOPSGOV_INCIDENT_LIFECYCLE_V2.QUEUED ||
|
|
1099
|
+
j.status === AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGING)
|
|
1100
|
+
)
|
|
1101
|
+
c++;
|
|
1102
|
+
return c;
|
|
1103
|
+
}
|
|
1104
|
+
export function setMaxActiveAiopsgovProfilesPerOwnerV2(n) {
|
|
1105
|
+
_aiopsgovMaxActive = _aiopsgovPos(n, "maxActiveAiopsgovProfilesPerOwner");
|
|
1106
|
+
}
|
|
1107
|
+
export function getMaxActiveAiopsgovProfilesPerOwnerV2() {
|
|
1108
|
+
return _aiopsgovMaxActive;
|
|
1109
|
+
}
|
|
1110
|
+
export function setMaxPendingAiopsgovIncidentsPerProfileV2(n) {
|
|
1111
|
+
_aiopsgovMaxPending = _aiopsgovPos(
|
|
1112
|
+
n,
|
|
1113
|
+
"maxPendingAiopsgovIncidentsPerProfile",
|
|
1114
|
+
);
|
|
1115
|
+
}
|
|
1116
|
+
export function getMaxPendingAiopsgovIncidentsPerProfileV2() {
|
|
1117
|
+
return _aiopsgovMaxPending;
|
|
1118
|
+
}
|
|
1119
|
+
export function setAiopsgovProfileIdleMsV2(n) {
|
|
1120
|
+
_aiopsgovIdleMs = _aiopsgovPos(n, "aiopsgovProfileIdleMs");
|
|
1121
|
+
}
|
|
1122
|
+
export function getAiopsgovProfileIdleMsV2() {
|
|
1123
|
+
return _aiopsgovIdleMs;
|
|
1124
|
+
}
|
|
1125
|
+
export function setAiopsgovIncidentStuckMsV2(n) {
|
|
1126
|
+
_aiopsgovStuckMs = _aiopsgovPos(n, "aiopsgovIncidentStuckMs");
|
|
1127
|
+
}
|
|
1128
|
+
export function getAiopsgovIncidentStuckMsV2() {
|
|
1129
|
+
return _aiopsgovStuckMs;
|
|
1130
|
+
}
|
|
1131
|
+
export function _resetStateAiopsGovV2() {
|
|
1132
|
+
_aiopsgovPsV2.clear();
|
|
1133
|
+
_aiopsgovJsV2.clear();
|
|
1134
|
+
_aiopsgovMaxActive = 6;
|
|
1135
|
+
_aiopsgovMaxPending = 15;
|
|
1136
|
+
_aiopsgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
1137
|
+
_aiopsgovStuckMs = 60 * 1000;
|
|
1138
|
+
}
|
|
1139
|
+
export function registerAiopsgovProfileV2({ id, owner, mode, metadata } = {}) {
|
|
1140
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
1141
|
+
if (_aiopsgovPsV2.has(id))
|
|
1142
|
+
throw new Error(`aiopsgov profile ${id} already exists`);
|
|
1143
|
+
const now = Date.now();
|
|
1144
|
+
const p = {
|
|
1145
|
+
id,
|
|
1146
|
+
owner,
|
|
1147
|
+
mode: mode || "monitor",
|
|
1148
|
+
status: AIOPSGOV_PROFILE_MATURITY_V2.PENDING,
|
|
1149
|
+
createdAt: now,
|
|
1150
|
+
updatedAt: now,
|
|
1151
|
+
lastTouchedAt: now,
|
|
1152
|
+
activatedAt: null,
|
|
1153
|
+
archivedAt: null,
|
|
1154
|
+
metadata: { ...(metadata || {}) },
|
|
1155
|
+
};
|
|
1156
|
+
_aiopsgovPsV2.set(id, p);
|
|
1157
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1158
|
+
}
|
|
1159
|
+
export function activateAiopsgovProfileV2(id) {
|
|
1160
|
+
const p = _aiopsgovPsV2.get(id);
|
|
1161
|
+
if (!p) throw new Error(`aiopsgov profile ${id} not found`);
|
|
1162
|
+
const isInitial = p.status === AIOPSGOV_PROFILE_MATURITY_V2.PENDING;
|
|
1163
|
+
_aiopsgovCheckP(p.status, AIOPSGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
1164
|
+
if (isInitial && _aiopsgovCountActive(p.owner) >= _aiopsgovMaxActive)
|
|
1165
|
+
throw new Error(
|
|
1166
|
+
`max active aiopsgov profiles for owner ${p.owner} reached`,
|
|
1167
|
+
);
|
|
1168
|
+
const now = Date.now();
|
|
1169
|
+
p.status = AIOPSGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
1170
|
+
p.updatedAt = now;
|
|
1171
|
+
p.lastTouchedAt = now;
|
|
1172
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
1173
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1174
|
+
}
|
|
1175
|
+
export function staleAiopsgovProfileV2(id) {
|
|
1176
|
+
const p = _aiopsgovPsV2.get(id);
|
|
1177
|
+
if (!p) throw new Error(`aiopsgov profile ${id} not found`);
|
|
1178
|
+
_aiopsgovCheckP(p.status, AIOPSGOV_PROFILE_MATURITY_V2.STALE);
|
|
1179
|
+
p.status = AIOPSGOV_PROFILE_MATURITY_V2.STALE;
|
|
1180
|
+
p.updatedAt = Date.now();
|
|
1181
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1182
|
+
}
|
|
1183
|
+
export function archiveAiopsgovProfileV2(id) {
|
|
1184
|
+
const p = _aiopsgovPsV2.get(id);
|
|
1185
|
+
if (!p) throw new Error(`aiopsgov profile ${id} not found`);
|
|
1186
|
+
_aiopsgovCheckP(p.status, AIOPSGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
1187
|
+
const now = Date.now();
|
|
1188
|
+
p.status = AIOPSGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
1189
|
+
p.updatedAt = now;
|
|
1190
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
1191
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1192
|
+
}
|
|
1193
|
+
export function touchAiopsgovProfileV2(id) {
|
|
1194
|
+
const p = _aiopsgovPsV2.get(id);
|
|
1195
|
+
if (!p) throw new Error(`aiopsgov profile ${id} not found`);
|
|
1196
|
+
if (_aiopsgovPTerminal.has(p.status))
|
|
1197
|
+
throw new Error(`cannot touch terminal aiopsgov profile ${id}`);
|
|
1198
|
+
const now = Date.now();
|
|
1199
|
+
p.lastTouchedAt = now;
|
|
1200
|
+
p.updatedAt = now;
|
|
1201
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1202
|
+
}
|
|
1203
|
+
export function getAiopsgovProfileV2(id) {
|
|
1204
|
+
const p = _aiopsgovPsV2.get(id);
|
|
1205
|
+
if (!p) return null;
|
|
1206
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
1207
|
+
}
|
|
1208
|
+
export function listAiopsgovProfilesV2() {
|
|
1209
|
+
return [..._aiopsgovPsV2.values()].map((p) => ({
|
|
1210
|
+
...p,
|
|
1211
|
+
metadata: { ...p.metadata },
|
|
1212
|
+
}));
|
|
1213
|
+
}
|
|
1214
|
+
export function createAiopsgovIncidentV2({
|
|
1215
|
+
id,
|
|
1216
|
+
profileId,
|
|
1217
|
+
summary,
|
|
1218
|
+
metadata,
|
|
1219
|
+
} = {}) {
|
|
1220
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
1221
|
+
if (_aiopsgovJsV2.has(id))
|
|
1222
|
+
throw new Error(`aiopsgov incident ${id} already exists`);
|
|
1223
|
+
if (!_aiopsgovPsV2.has(profileId))
|
|
1224
|
+
throw new Error(`aiopsgov profile ${profileId} not found`);
|
|
1225
|
+
if (_aiopsgovCountPending(profileId) >= _aiopsgovMaxPending)
|
|
1226
|
+
throw new Error(
|
|
1227
|
+
`max pending aiopsgov incidents for profile ${profileId} reached`,
|
|
1228
|
+
);
|
|
1229
|
+
const now = Date.now();
|
|
1230
|
+
const j = {
|
|
1231
|
+
id,
|
|
1232
|
+
profileId,
|
|
1233
|
+
summary: summary || "",
|
|
1234
|
+
status: AIOPSGOV_INCIDENT_LIFECYCLE_V2.QUEUED,
|
|
1235
|
+
createdAt: now,
|
|
1236
|
+
updatedAt: now,
|
|
1237
|
+
startedAt: null,
|
|
1238
|
+
settledAt: null,
|
|
1239
|
+
metadata: { ...(metadata || {}) },
|
|
1240
|
+
};
|
|
1241
|
+
_aiopsgovJsV2.set(id, j);
|
|
1242
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1243
|
+
}
|
|
1244
|
+
export function triagingAiopsgovIncidentV2(id) {
|
|
1245
|
+
const j = _aiopsgovJsV2.get(id);
|
|
1246
|
+
if (!j) throw new Error(`aiopsgov incident ${id} not found`);
|
|
1247
|
+
_aiopsgovCheckJ(j.status, AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGING);
|
|
1248
|
+
const now = Date.now();
|
|
1249
|
+
j.status = AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGING;
|
|
1250
|
+
j.updatedAt = now;
|
|
1251
|
+
if (!j.startedAt) j.startedAt = now;
|
|
1252
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1253
|
+
}
|
|
1254
|
+
export function completeIncidentAiopsgovV2(id) {
|
|
1255
|
+
const j = _aiopsgovJsV2.get(id);
|
|
1256
|
+
if (!j) throw new Error(`aiopsgov incident ${id} not found`);
|
|
1257
|
+
_aiopsgovCheckJ(j.status, AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGED);
|
|
1258
|
+
const now = Date.now();
|
|
1259
|
+
j.status = AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGED;
|
|
1260
|
+
j.updatedAt = now;
|
|
1261
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1262
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1263
|
+
}
|
|
1264
|
+
export function failAiopsgovIncidentV2(id, reason) {
|
|
1265
|
+
const j = _aiopsgovJsV2.get(id);
|
|
1266
|
+
if (!j) throw new Error(`aiopsgov incident ${id} not found`);
|
|
1267
|
+
_aiopsgovCheckJ(j.status, AIOPSGOV_INCIDENT_LIFECYCLE_V2.FAILED);
|
|
1268
|
+
const now = Date.now();
|
|
1269
|
+
j.status = AIOPSGOV_INCIDENT_LIFECYCLE_V2.FAILED;
|
|
1270
|
+
j.updatedAt = now;
|
|
1271
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1272
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
1273
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1274
|
+
}
|
|
1275
|
+
export function cancelAiopsgovIncidentV2(id, reason) {
|
|
1276
|
+
const j = _aiopsgovJsV2.get(id);
|
|
1277
|
+
if (!j) throw new Error(`aiopsgov incident ${id} not found`);
|
|
1278
|
+
_aiopsgovCheckJ(j.status, AIOPSGOV_INCIDENT_LIFECYCLE_V2.CANCELLED);
|
|
1279
|
+
const now = Date.now();
|
|
1280
|
+
j.status = AIOPSGOV_INCIDENT_LIFECYCLE_V2.CANCELLED;
|
|
1281
|
+
j.updatedAt = now;
|
|
1282
|
+
if (!j.settledAt) j.settledAt = now;
|
|
1283
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
1284
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1285
|
+
}
|
|
1286
|
+
export function getAiopsgovIncidentV2(id) {
|
|
1287
|
+
const j = _aiopsgovJsV2.get(id);
|
|
1288
|
+
if (!j) return null;
|
|
1289
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
1290
|
+
}
|
|
1291
|
+
export function listAiopsgovIncidentsV2() {
|
|
1292
|
+
return [..._aiopsgovJsV2.values()].map((j) => ({
|
|
1293
|
+
...j,
|
|
1294
|
+
metadata: { ...j.metadata },
|
|
1295
|
+
}));
|
|
1296
|
+
}
|
|
1297
|
+
export function autoStaleIdleAiopsgovProfilesV2({ now } = {}) {
|
|
1298
|
+
const t = now ?? Date.now();
|
|
1299
|
+
const flipped = [];
|
|
1300
|
+
for (const p of _aiopsgovPsV2.values())
|
|
1301
|
+
if (
|
|
1302
|
+
p.status === AIOPSGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
1303
|
+
t - p.lastTouchedAt >= _aiopsgovIdleMs
|
|
1304
|
+
) {
|
|
1305
|
+
p.status = AIOPSGOV_PROFILE_MATURITY_V2.STALE;
|
|
1306
|
+
p.updatedAt = t;
|
|
1307
|
+
flipped.push(p.id);
|
|
1308
|
+
}
|
|
1309
|
+
return { flipped, count: flipped.length };
|
|
1310
|
+
}
|
|
1311
|
+
export function autoFailStuckAiopsgovIncidentsV2({ now } = {}) {
|
|
1312
|
+
const t = now ?? Date.now();
|
|
1313
|
+
const flipped = [];
|
|
1314
|
+
for (const j of _aiopsgovJsV2.values())
|
|
1315
|
+
if (
|
|
1316
|
+
j.status === AIOPSGOV_INCIDENT_LIFECYCLE_V2.TRIAGING &&
|
|
1317
|
+
j.startedAt != null &&
|
|
1318
|
+
t - j.startedAt >= _aiopsgovStuckMs
|
|
1319
|
+
) {
|
|
1320
|
+
j.status = AIOPSGOV_INCIDENT_LIFECYCLE_V2.FAILED;
|
|
1321
|
+
j.updatedAt = t;
|
|
1322
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1323
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1324
|
+
flipped.push(j.id);
|
|
1325
|
+
}
|
|
1326
|
+
return { flipped, count: flipped.length };
|
|
1327
|
+
}
|
|
1328
|
+
export function getAiopsGovStatsV2() {
|
|
1329
|
+
const profilesByStatus = {};
|
|
1330
|
+
for (const v of Object.values(AIOPSGOV_PROFILE_MATURITY_V2))
|
|
1331
|
+
profilesByStatus[v] = 0;
|
|
1332
|
+
for (const p of _aiopsgovPsV2.values()) profilesByStatus[p.status]++;
|
|
1333
|
+
const incidentsByStatus = {};
|
|
1334
|
+
for (const v of Object.values(AIOPSGOV_INCIDENT_LIFECYCLE_V2))
|
|
1335
|
+
incidentsByStatus[v] = 0;
|
|
1336
|
+
for (const j of _aiopsgovJsV2.values()) incidentsByStatus[j.status]++;
|
|
1337
|
+
return {
|
|
1338
|
+
totalAiopsgovProfilesV2: _aiopsgovPsV2.size,
|
|
1339
|
+
totalAiopsgovIncidentsV2: _aiopsgovJsV2.size,
|
|
1340
|
+
maxActiveAiopsgovProfilesPerOwner: _aiopsgovMaxActive,
|
|
1341
|
+
maxPendingAiopsgovIncidentsPerProfile: _aiopsgovMaxPending,
|
|
1342
|
+
aiopsgovProfileIdleMs: _aiopsgovIdleMs,
|
|
1343
|
+
aiopsgovIncidentStuckMs: _aiopsgovStuckMs,
|
|
1344
|
+
profilesByStatus,
|
|
1345
|
+
incidentsByStatus,
|
|
1346
|
+
};
|
|
1347
|
+
}
|