chainlesschain 0.145.0 → 0.152.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/package.json +1 -1
  2. package/src/commands/activitypub.js +207 -0
  3. package/src/commands/agent-network.js +217 -0
  4. package/src/commands/automation.js +201 -0
  5. package/src/commands/bi.js +203 -0
  6. package/src/commands/browse.js +213 -0
  7. package/src/commands/codegen.js +207 -0
  8. package/src/commands/collab.js +211 -0
  9. package/src/commands/compliance.js +410 -0
  10. package/src/commands/cowork.js +203 -0
  11. package/src/commands/dbevo.js +227 -0
  12. package/src/commands/dev.js +207 -0
  13. package/src/commands/did-v2.js +217 -0
  14. package/src/commands/did.js +221 -0
  15. package/src/commands/dlp.js +213 -0
  16. package/src/commands/evomap.js +205 -0
  17. package/src/commands/export.js +213 -0
  18. package/src/commands/federation.js +209 -0
  19. package/src/commands/fusion.js +205 -0
  20. package/src/commands/governance.js +209 -0
  21. package/src/commands/hook.js +209 -0
  22. package/src/commands/import.js +209 -0
  23. package/src/commands/infra.js +203 -0
  24. package/src/commands/instinct.js +209 -0
  25. package/src/commands/ipfs.js +207 -0
  26. package/src/commands/llm.js +217 -0
  27. package/src/commands/matrix.js +207 -0
  28. package/src/commands/mcp.js +217 -0
  29. package/src/commands/memory.js +209 -0
  30. package/src/commands/multimodal.js +203 -0
  31. package/src/commands/nlprog.js +225 -0
  32. package/src/commands/nostr.js +209 -0
  33. package/src/commands/note.js +205 -0
  34. package/src/commands/ops.js +219 -0
  35. package/src/commands/org.js +209 -0
  36. package/src/commands/p2p.js +209 -0
  37. package/src/commands/perception.js +209 -0
  38. package/src/commands/permmem.js +203 -0
  39. package/src/commands/plugin-ecosystem.js +209 -0
  40. package/src/commands/pqc.js +213 -0
  41. package/src/commands/quantization.js +207 -0
  42. package/src/commands/rcache.js +205 -0
  43. package/src/commands/recommend.js +233 -0
  44. package/src/commands/runtime.js +205 -0
  45. package/src/commands/scim.js +209 -0
  46. package/src/commands/session.js +209 -0
  47. package/src/commands/skill.js +207 -0
  48. package/src/commands/social.js +201 -0
  49. package/src/commands/sso.js +209 -0
  50. package/src/commands/sync.js +209 -0
  51. package/src/commands/tech.js +209 -0
  52. package/src/commands/tenant.js +217 -0
  53. package/src/commands/tokens.js +209 -0
  54. package/src/commands/trust.js +217 -0
  55. package/src/commands/wallet.js +209 -0
  56. package/src/commands/workflow.js +203 -0
  57. package/src/index.js +140 -0
  58. package/src/lib/activitypub-bridge.js +334 -0
  59. package/src/lib/agent-network.js +341 -0
  60. package/src/lib/aiops.js +346 -0
  61. package/src/lib/automation-engine.js +335 -0
  62. package/src/lib/autonomous-developer.js +332 -0
  63. package/src/lib/bi-engine.js +333 -0
  64. package/src/lib/browser-automation.js +334 -0
  65. package/src/lib/code-agent.js +339 -0
  66. package/src/lib/collaboration-governance.js +334 -0
  67. package/src/lib/community-governance.js +346 -0
  68. package/src/lib/content-recommendation.js +351 -0
  69. package/src/lib/cowork-share.js +338 -0
  70. package/src/lib/dbevo.js +351 -0
  71. package/src/lib/decentral-infra.js +330 -0
  72. package/src/lib/did-manager.js +341 -0
  73. package/src/lib/did-v2-manager.js +341 -0
  74. package/src/lib/dlp-engine.js +339 -0
  75. package/src/lib/evomap-governance.js +334 -0
  76. package/src/lib/federation-hardening.js +340 -0
  77. package/src/lib/hook-manager.js +341 -0
  78. package/src/lib/instinct-manager.js +346 -0
  79. package/src/lib/ipfs-storage.js +334 -0
  80. package/src/lib/knowledge-exporter.js +341 -0
  81. package/src/lib/knowledge-importer.js +341 -0
  82. package/src/lib/llm-providers.js +346 -0
  83. package/src/lib/matrix-bridge.js +339 -0
  84. package/src/lib/mcp-registry.js +346 -0
  85. package/src/lib/memory-manager.js +336 -0
  86. package/src/lib/multimodal.js +330 -0
  87. package/src/lib/nl-programming.js +341 -0
  88. package/src/lib/nostr-bridge.js +336 -0
  89. package/src/lib/note-versioning.js +339 -0
  90. package/src/lib/org-manager.js +336 -0
  91. package/src/lib/p2p-manager.js +341 -0
  92. package/src/lib/perception.js +346 -0
  93. package/src/lib/permanent-memory.js +327 -0
  94. package/src/lib/plugin-ecosystem.js +346 -0
  95. package/src/lib/pqc-manager.js +346 -0
  96. package/src/lib/protocol-fusion.js +338 -0
  97. package/src/lib/quantization.js +337 -0
  98. package/src/lib/response-cache.js +333 -0
  99. package/src/lib/scim-manager.js +346 -0
  100. package/src/lib/session-manager.js +334 -0
  101. package/src/lib/skill-loader.js +334 -0
  102. package/src/lib/social-manager.js +330 -0
  103. package/src/lib/sso-manager.js +340 -0
  104. package/src/lib/sync-manager.js +336 -0
  105. package/src/lib/tech-learning-engine.js +341 -0
  106. package/src/lib/tenant-saas.js +341 -0
  107. package/src/lib/threat-intel.js +330 -0
  108. package/src/lib/token-tracker.js +336 -0
  109. package/src/lib/trust-security.js +343 -0
  110. package/src/lib/ueba.js +340 -0
  111. package/src/lib/universal-runtime.js +330 -0
  112. package/src/lib/wallet-manager.js +336 -0
  113. package/src/lib/workflow-engine.js +330 -0
@@ -844,3 +844,343 @@ export function getFederationHardeningStatsV2(db) {
844
844
  healthByMetric,
845
845
  };
846
846
  }
847
+
848
+ // =====================================================================
849
+ // federation-hardening V2 governance overlay (iter20)
850
+ // =====================================================================
851
+ export const FEDGOV_PROFILE_MATURITY_V2 = Object.freeze({
852
+ PENDING: "pending",
853
+ ACTIVE: "active",
854
+ DEGRADED: "degraded",
855
+ ARCHIVED: "archived",
856
+ });
857
+ export const FEDGOV_PROBE_LIFECYCLE_V2 = Object.freeze({
858
+ QUEUED: "queued",
859
+ PROBING: "probing",
860
+ PROBED: "probed",
861
+ FAILED: "failed",
862
+ CANCELLED: "cancelled",
863
+ });
864
+ const _fedgovPTrans = new Map([
865
+ [
866
+ FEDGOV_PROFILE_MATURITY_V2.PENDING,
867
+ new Set([
868
+ FEDGOV_PROFILE_MATURITY_V2.ACTIVE,
869
+ FEDGOV_PROFILE_MATURITY_V2.ARCHIVED,
870
+ ]),
871
+ ],
872
+ [
873
+ FEDGOV_PROFILE_MATURITY_V2.ACTIVE,
874
+ new Set([
875
+ FEDGOV_PROFILE_MATURITY_V2.DEGRADED,
876
+ FEDGOV_PROFILE_MATURITY_V2.ARCHIVED,
877
+ ]),
878
+ ],
879
+ [
880
+ FEDGOV_PROFILE_MATURITY_V2.DEGRADED,
881
+ new Set([
882
+ FEDGOV_PROFILE_MATURITY_V2.ACTIVE,
883
+ FEDGOV_PROFILE_MATURITY_V2.ARCHIVED,
884
+ ]),
885
+ ],
886
+ [FEDGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
887
+ ]);
888
+ const _fedgovPTerminal = new Set([FEDGOV_PROFILE_MATURITY_V2.ARCHIVED]);
889
+ const _fedgovJTrans = new Map([
890
+ [
891
+ FEDGOV_PROBE_LIFECYCLE_V2.QUEUED,
892
+ new Set([
893
+ FEDGOV_PROBE_LIFECYCLE_V2.PROBING,
894
+ FEDGOV_PROBE_LIFECYCLE_V2.CANCELLED,
895
+ ]),
896
+ ],
897
+ [
898
+ FEDGOV_PROBE_LIFECYCLE_V2.PROBING,
899
+ new Set([
900
+ FEDGOV_PROBE_LIFECYCLE_V2.PROBED,
901
+ FEDGOV_PROBE_LIFECYCLE_V2.FAILED,
902
+ FEDGOV_PROBE_LIFECYCLE_V2.CANCELLED,
903
+ ]),
904
+ ],
905
+ [FEDGOV_PROBE_LIFECYCLE_V2.PROBED, new Set()],
906
+ [FEDGOV_PROBE_LIFECYCLE_V2.FAILED, new Set()],
907
+ [FEDGOV_PROBE_LIFECYCLE_V2.CANCELLED, new Set()],
908
+ ]);
909
+ const _fedgovPsV2 = new Map();
910
+ const _fedgovJsV2 = new Map();
911
+ let _fedgovMaxActive = 8,
912
+ _fedgovMaxPending = 20,
913
+ _fedgovIdleMs = 30 * 24 * 60 * 60 * 1000,
914
+ _fedgovStuckMs = 60 * 1000;
915
+ function _fedgovPos(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 _fedgovCheckP(from, to) {
922
+ const a = _fedgovPTrans.get(from);
923
+ if (!a || !a.has(to))
924
+ throw new Error(`invalid fedgov profile transition ${from} → ${to}`);
925
+ }
926
+ function _fedgovCheckJ(from, to) {
927
+ const a = _fedgovJTrans.get(from);
928
+ if (!a || !a.has(to))
929
+ throw new Error(`invalid fedgov probe transition ${from} → ${to}`);
930
+ }
931
+ function _fedgovCountActive(owner) {
932
+ let c = 0;
933
+ for (const p of _fedgovPsV2.values())
934
+ if (p.owner === owner && p.status === FEDGOV_PROFILE_MATURITY_V2.ACTIVE)
935
+ c++;
936
+ return c;
937
+ }
938
+ function _fedgovCountPending(profileId) {
939
+ let c = 0;
940
+ for (const j of _fedgovJsV2.values())
941
+ if (
942
+ j.profileId === profileId &&
943
+ (j.status === FEDGOV_PROBE_LIFECYCLE_V2.QUEUED ||
944
+ j.status === FEDGOV_PROBE_LIFECYCLE_V2.PROBING)
945
+ )
946
+ c++;
947
+ return c;
948
+ }
949
+ export function setMaxActiveFedgovProfilesPerOwnerV2(n) {
950
+ _fedgovMaxActive = _fedgovPos(n, "maxActiveFedgovProfilesPerOwner");
951
+ }
952
+ export function getMaxActiveFedgovProfilesPerOwnerV2() {
953
+ return _fedgovMaxActive;
954
+ }
955
+ export function setMaxPendingFedgovProbesPerProfileV2(n) {
956
+ _fedgovMaxPending = _fedgovPos(n, "maxPendingFedgovProbesPerProfile");
957
+ }
958
+ export function getMaxPendingFedgovProbesPerProfileV2() {
959
+ return _fedgovMaxPending;
960
+ }
961
+ export function setFedgovProfileIdleMsV2(n) {
962
+ _fedgovIdleMs = _fedgovPos(n, "fedgovProfileIdleMs");
963
+ }
964
+ export function getFedgovProfileIdleMsV2() {
965
+ return _fedgovIdleMs;
966
+ }
967
+ export function setFedgovProbeStuckMsV2(n) {
968
+ _fedgovStuckMs = _fedgovPos(n, "fedgovProbeStuckMs");
969
+ }
970
+ export function getFedgovProbeStuckMsV2() {
971
+ return _fedgovStuckMs;
972
+ }
973
+ export function _resetStateFederationHardeningGovV2() {
974
+ _fedgovPsV2.clear();
975
+ _fedgovJsV2.clear();
976
+ _fedgovMaxActive = 8;
977
+ _fedgovMaxPending = 20;
978
+ _fedgovIdleMs = 30 * 24 * 60 * 60 * 1000;
979
+ _fedgovStuckMs = 60 * 1000;
980
+ }
981
+ export function registerFedgovProfileV2({ id, owner, region, metadata } = {}) {
982
+ if (!id || !owner) throw new Error("id and owner required");
983
+ if (_fedgovPsV2.has(id))
984
+ throw new Error(`fedgov profile ${id} already exists`);
985
+ const now = Date.now();
986
+ const p = {
987
+ id,
988
+ owner,
989
+ region: region || "default",
990
+ status: FEDGOV_PROFILE_MATURITY_V2.PENDING,
991
+ createdAt: now,
992
+ updatedAt: now,
993
+ lastTouchedAt: now,
994
+ activatedAt: null,
995
+ archivedAt: null,
996
+ metadata: { ...(metadata || {}) },
997
+ };
998
+ _fedgovPsV2.set(id, p);
999
+ return { ...p, metadata: { ...p.metadata } };
1000
+ }
1001
+ export function activateFedgovProfileV2(id) {
1002
+ const p = _fedgovPsV2.get(id);
1003
+ if (!p) throw new Error(`fedgov profile ${id} not found`);
1004
+ const isInitial = p.status === FEDGOV_PROFILE_MATURITY_V2.PENDING;
1005
+ _fedgovCheckP(p.status, FEDGOV_PROFILE_MATURITY_V2.ACTIVE);
1006
+ if (isInitial && _fedgovCountActive(p.owner) >= _fedgovMaxActive)
1007
+ throw new Error(`max active fedgov profiles for owner ${p.owner} reached`);
1008
+ const now = Date.now();
1009
+ p.status = FEDGOV_PROFILE_MATURITY_V2.ACTIVE;
1010
+ p.updatedAt = now;
1011
+ p.lastTouchedAt = now;
1012
+ if (!p.activatedAt) p.activatedAt = now;
1013
+ return { ...p, metadata: { ...p.metadata } };
1014
+ }
1015
+ export function degradeFedgovProfileV2(id) {
1016
+ const p = _fedgovPsV2.get(id);
1017
+ if (!p) throw new Error(`fedgov profile ${id} not found`);
1018
+ _fedgovCheckP(p.status, FEDGOV_PROFILE_MATURITY_V2.DEGRADED);
1019
+ p.status = FEDGOV_PROFILE_MATURITY_V2.DEGRADED;
1020
+ p.updatedAt = Date.now();
1021
+ return { ...p, metadata: { ...p.metadata } };
1022
+ }
1023
+ export function archiveFedgovProfileV2(id) {
1024
+ const p = _fedgovPsV2.get(id);
1025
+ if (!p) throw new Error(`fedgov profile ${id} not found`);
1026
+ _fedgovCheckP(p.status, FEDGOV_PROFILE_MATURITY_V2.ARCHIVED);
1027
+ const now = Date.now();
1028
+ p.status = FEDGOV_PROFILE_MATURITY_V2.ARCHIVED;
1029
+ p.updatedAt = now;
1030
+ if (!p.archivedAt) p.archivedAt = now;
1031
+ return { ...p, metadata: { ...p.metadata } };
1032
+ }
1033
+ export function touchFedgovProfileV2(id) {
1034
+ const p = _fedgovPsV2.get(id);
1035
+ if (!p) throw new Error(`fedgov profile ${id} not found`);
1036
+ if (_fedgovPTerminal.has(p.status))
1037
+ throw new Error(`cannot touch terminal fedgov profile ${id}`);
1038
+ const now = Date.now();
1039
+ p.lastTouchedAt = now;
1040
+ p.updatedAt = now;
1041
+ return { ...p, metadata: { ...p.metadata } };
1042
+ }
1043
+ export function getFedgovProfileV2(id) {
1044
+ const p = _fedgovPsV2.get(id);
1045
+ if (!p) return null;
1046
+ return { ...p, metadata: { ...p.metadata } };
1047
+ }
1048
+ export function listFedgovProfilesV2() {
1049
+ return [..._fedgovPsV2.values()].map((p) => ({
1050
+ ...p,
1051
+ metadata: { ...p.metadata },
1052
+ }));
1053
+ }
1054
+ export function createFedgovProbeV2({
1055
+ id,
1056
+ profileId,
1057
+ endpoint,
1058
+ metadata,
1059
+ } = {}) {
1060
+ if (!id || !profileId) throw new Error("id and profileId required");
1061
+ if (_fedgovJsV2.has(id)) throw new Error(`fedgov probe ${id} already exists`);
1062
+ if (!_fedgovPsV2.has(profileId))
1063
+ throw new Error(`fedgov profile ${profileId} not found`);
1064
+ if (_fedgovCountPending(profileId) >= _fedgovMaxPending)
1065
+ throw new Error(
1066
+ `max pending fedgov probes for profile ${profileId} reached`,
1067
+ );
1068
+ const now = Date.now();
1069
+ const j = {
1070
+ id,
1071
+ profileId,
1072
+ endpoint: endpoint || "",
1073
+ status: FEDGOV_PROBE_LIFECYCLE_V2.QUEUED,
1074
+ createdAt: now,
1075
+ updatedAt: now,
1076
+ startedAt: null,
1077
+ settledAt: null,
1078
+ metadata: { ...(metadata || {}) },
1079
+ };
1080
+ _fedgovJsV2.set(id, j);
1081
+ return { ...j, metadata: { ...j.metadata } };
1082
+ }
1083
+ export function probingFedgovProbeV2(id) {
1084
+ const j = _fedgovJsV2.get(id);
1085
+ if (!j) throw new Error(`fedgov probe ${id} not found`);
1086
+ _fedgovCheckJ(j.status, FEDGOV_PROBE_LIFECYCLE_V2.PROBING);
1087
+ const now = Date.now();
1088
+ j.status = FEDGOV_PROBE_LIFECYCLE_V2.PROBING;
1089
+ j.updatedAt = now;
1090
+ if (!j.startedAt) j.startedAt = now;
1091
+ return { ...j, metadata: { ...j.metadata } };
1092
+ }
1093
+ export function completeProbeFedgovV2(id) {
1094
+ const j = _fedgovJsV2.get(id);
1095
+ if (!j) throw new Error(`fedgov probe ${id} not found`);
1096
+ _fedgovCheckJ(j.status, FEDGOV_PROBE_LIFECYCLE_V2.PROBED);
1097
+ const now = Date.now();
1098
+ j.status = FEDGOV_PROBE_LIFECYCLE_V2.PROBED;
1099
+ j.updatedAt = now;
1100
+ if (!j.settledAt) j.settledAt = now;
1101
+ return { ...j, metadata: { ...j.metadata } };
1102
+ }
1103
+ export function failFedgovProbeV2(id, reason) {
1104
+ const j = _fedgovJsV2.get(id);
1105
+ if (!j) throw new Error(`fedgov probe ${id} not found`);
1106
+ _fedgovCheckJ(j.status, FEDGOV_PROBE_LIFECYCLE_V2.FAILED);
1107
+ const now = Date.now();
1108
+ j.status = FEDGOV_PROBE_LIFECYCLE_V2.FAILED;
1109
+ j.updatedAt = now;
1110
+ if (!j.settledAt) j.settledAt = now;
1111
+ if (reason) j.metadata.failReason = String(reason);
1112
+ return { ...j, metadata: { ...j.metadata } };
1113
+ }
1114
+ export function cancelFedgovProbeV2(id, reason) {
1115
+ const j = _fedgovJsV2.get(id);
1116
+ if (!j) throw new Error(`fedgov probe ${id} not found`);
1117
+ _fedgovCheckJ(j.status, FEDGOV_PROBE_LIFECYCLE_V2.CANCELLED);
1118
+ const now = Date.now();
1119
+ j.status = FEDGOV_PROBE_LIFECYCLE_V2.CANCELLED;
1120
+ j.updatedAt = now;
1121
+ if (!j.settledAt) j.settledAt = now;
1122
+ if (reason) j.metadata.cancelReason = String(reason);
1123
+ return { ...j, metadata: { ...j.metadata } };
1124
+ }
1125
+ export function getFedgovProbeV2(id) {
1126
+ const j = _fedgovJsV2.get(id);
1127
+ if (!j) return null;
1128
+ return { ...j, metadata: { ...j.metadata } };
1129
+ }
1130
+ export function listFedgovProbesV2() {
1131
+ return [..._fedgovJsV2.values()].map((j) => ({
1132
+ ...j,
1133
+ metadata: { ...j.metadata },
1134
+ }));
1135
+ }
1136
+ export function autoDegradeIdleFedgovProfilesV2({ now } = {}) {
1137
+ const t = now ?? Date.now();
1138
+ const flipped = [];
1139
+ for (const p of _fedgovPsV2.values())
1140
+ if (
1141
+ p.status === FEDGOV_PROFILE_MATURITY_V2.ACTIVE &&
1142
+ t - p.lastTouchedAt >= _fedgovIdleMs
1143
+ ) {
1144
+ p.status = FEDGOV_PROFILE_MATURITY_V2.DEGRADED;
1145
+ p.updatedAt = t;
1146
+ flipped.push(p.id);
1147
+ }
1148
+ return { flipped, count: flipped.length };
1149
+ }
1150
+ export function autoFailStuckFedgovProbesV2({ now } = {}) {
1151
+ const t = now ?? Date.now();
1152
+ const flipped = [];
1153
+ for (const j of _fedgovJsV2.values())
1154
+ if (
1155
+ j.status === FEDGOV_PROBE_LIFECYCLE_V2.PROBING &&
1156
+ j.startedAt != null &&
1157
+ t - j.startedAt >= _fedgovStuckMs
1158
+ ) {
1159
+ j.status = FEDGOV_PROBE_LIFECYCLE_V2.FAILED;
1160
+ j.updatedAt = t;
1161
+ if (!j.settledAt) j.settledAt = t;
1162
+ j.metadata.failReason = "auto-fail-stuck";
1163
+ flipped.push(j.id);
1164
+ }
1165
+ return { flipped, count: flipped.length };
1166
+ }
1167
+ export function getFederationHardeningGovStatsV2() {
1168
+ const profilesByStatus = {};
1169
+ for (const v of Object.values(FEDGOV_PROFILE_MATURITY_V2))
1170
+ profilesByStatus[v] = 0;
1171
+ for (const p of _fedgovPsV2.values()) profilesByStatus[p.status]++;
1172
+ const probesByStatus = {};
1173
+ for (const v of Object.values(FEDGOV_PROBE_LIFECYCLE_V2))
1174
+ probesByStatus[v] = 0;
1175
+ for (const j of _fedgovJsV2.values()) probesByStatus[j.status]++;
1176
+ return {
1177
+ totalFedgovProfilesV2: _fedgovPsV2.size,
1178
+ totalFedgovProbesV2: _fedgovJsV2.size,
1179
+ maxActiveFedgovProfilesPerOwner: _fedgovMaxActive,
1180
+ maxPendingFedgovProbesPerProfile: _fedgovMaxPending,
1181
+ fedgovProfileIdleMs: _fedgovIdleMs,
1182
+ fedgovProbeStuckMs: _fedgovStuckMs,
1183
+ profilesByStatus,
1184
+ probesByStatus,
1185
+ };
1186
+ }
@@ -767,3 +767,344 @@ export function getHookManagerStatsV2() {
767
767
  execsByStatus,
768
768
  };
769
769
  }
770
+
771
+ // =====================================================================
772
+ // hook-manager V2 governance overlay (iter21)
773
+ // =====================================================================
774
+ export const HOOKGOV_PROFILE_MATURITY_V2 = Object.freeze({
775
+ PENDING: "pending",
776
+ ACTIVE: "active",
777
+ DISABLED: "disabled",
778
+ ARCHIVED: "archived",
779
+ });
780
+ export const HOOKGOV_TRIGGER_LIFECYCLE_V2 = Object.freeze({
781
+ QUEUED: "queued",
782
+ FIRING: "firing",
783
+ FIRED: "fired",
784
+ FAILED: "failed",
785
+ CANCELLED: "cancelled",
786
+ });
787
+ const _hookgovPTrans = new Map([
788
+ [
789
+ HOOKGOV_PROFILE_MATURITY_V2.PENDING,
790
+ new Set([
791
+ HOOKGOV_PROFILE_MATURITY_V2.ACTIVE,
792
+ HOOKGOV_PROFILE_MATURITY_V2.ARCHIVED,
793
+ ]),
794
+ ],
795
+ [
796
+ HOOKGOV_PROFILE_MATURITY_V2.ACTIVE,
797
+ new Set([
798
+ HOOKGOV_PROFILE_MATURITY_V2.DISABLED,
799
+ HOOKGOV_PROFILE_MATURITY_V2.ARCHIVED,
800
+ ]),
801
+ ],
802
+ [
803
+ HOOKGOV_PROFILE_MATURITY_V2.DISABLED,
804
+ new Set([
805
+ HOOKGOV_PROFILE_MATURITY_V2.ACTIVE,
806
+ HOOKGOV_PROFILE_MATURITY_V2.ARCHIVED,
807
+ ]),
808
+ ],
809
+ [HOOKGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
810
+ ]);
811
+ const _hookgovPTerminal = new Set([HOOKGOV_PROFILE_MATURITY_V2.ARCHIVED]);
812
+ const _hookgovJTrans = new Map([
813
+ [
814
+ HOOKGOV_TRIGGER_LIFECYCLE_V2.QUEUED,
815
+ new Set([
816
+ HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRING,
817
+ HOOKGOV_TRIGGER_LIFECYCLE_V2.CANCELLED,
818
+ ]),
819
+ ],
820
+ [
821
+ HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRING,
822
+ new Set([
823
+ HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRED,
824
+ HOOKGOV_TRIGGER_LIFECYCLE_V2.FAILED,
825
+ HOOKGOV_TRIGGER_LIFECYCLE_V2.CANCELLED,
826
+ ]),
827
+ ],
828
+ [HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRED, new Set()],
829
+ [HOOKGOV_TRIGGER_LIFECYCLE_V2.FAILED, new Set()],
830
+ [HOOKGOV_TRIGGER_LIFECYCLE_V2.CANCELLED, new Set()],
831
+ ]);
832
+ const _hookgovPsV2 = new Map();
833
+ const _hookgovJsV2 = new Map();
834
+ let _hookgovMaxActive = 12,
835
+ _hookgovMaxPending = 25,
836
+ _hookgovIdleMs = 30 * 24 * 60 * 60 * 1000,
837
+ _hookgovStuckMs = 60 * 1000;
838
+ function _hookgovPos(n, label) {
839
+ const v = Math.floor(Number(n));
840
+ if (!Number.isFinite(v) || v <= 0)
841
+ throw new Error(`${label} must be positive integer`);
842
+ return v;
843
+ }
844
+ function _hookgovCheckP(from, to) {
845
+ const a = _hookgovPTrans.get(from);
846
+ if (!a || !a.has(to))
847
+ throw new Error(`invalid hookgov profile transition ${from} → ${to}`);
848
+ }
849
+ function _hookgovCheckJ(from, to) {
850
+ const a = _hookgovJTrans.get(from);
851
+ if (!a || !a.has(to))
852
+ throw new Error(`invalid hookgov trigger transition ${from} → ${to}`);
853
+ }
854
+ function _hookgovCountActive(owner) {
855
+ let c = 0;
856
+ for (const p of _hookgovPsV2.values())
857
+ if (p.owner === owner && p.status === HOOKGOV_PROFILE_MATURITY_V2.ACTIVE)
858
+ c++;
859
+ return c;
860
+ }
861
+ function _hookgovCountPending(profileId) {
862
+ let c = 0;
863
+ for (const j of _hookgovJsV2.values())
864
+ if (
865
+ j.profileId === profileId &&
866
+ (j.status === HOOKGOV_TRIGGER_LIFECYCLE_V2.QUEUED ||
867
+ j.status === HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRING)
868
+ )
869
+ c++;
870
+ return c;
871
+ }
872
+ export function setMaxActiveHookgovProfilesPerOwnerV2(n) {
873
+ _hookgovMaxActive = _hookgovPos(n, "maxActiveHookgovProfilesPerOwner");
874
+ }
875
+ export function getMaxActiveHookgovProfilesPerOwnerV2() {
876
+ return _hookgovMaxActive;
877
+ }
878
+ export function setMaxPendingHookgovTriggersPerProfileV2(n) {
879
+ _hookgovMaxPending = _hookgovPos(n, "maxPendingHookgovTriggersPerProfile");
880
+ }
881
+ export function getMaxPendingHookgovTriggersPerProfileV2() {
882
+ return _hookgovMaxPending;
883
+ }
884
+ export function setHookgovProfileIdleMsV2(n) {
885
+ _hookgovIdleMs = _hookgovPos(n, "hookgovProfileIdleMs");
886
+ }
887
+ export function getHookgovProfileIdleMsV2() {
888
+ return _hookgovIdleMs;
889
+ }
890
+ export function setHookgovTriggerStuckMsV2(n) {
891
+ _hookgovStuckMs = _hookgovPos(n, "hookgovTriggerStuckMs");
892
+ }
893
+ export function getHookgovTriggerStuckMsV2() {
894
+ return _hookgovStuckMs;
895
+ }
896
+ export function _resetStateHookManagerGovV2() {
897
+ _hookgovPsV2.clear();
898
+ _hookgovJsV2.clear();
899
+ _hookgovMaxActive = 12;
900
+ _hookgovMaxPending = 25;
901
+ _hookgovIdleMs = 30 * 24 * 60 * 60 * 1000;
902
+ _hookgovStuckMs = 60 * 1000;
903
+ }
904
+ export function registerHookgovProfileV2({ id, owner, event, metadata } = {}) {
905
+ if (!id || !owner) throw new Error("id and owner required");
906
+ if (_hookgovPsV2.has(id))
907
+ throw new Error(`hookgov profile ${id} already exists`);
908
+ const now = Date.now();
909
+ const p = {
910
+ id,
911
+ owner,
912
+ event: event || "preTurn",
913
+ status: HOOKGOV_PROFILE_MATURITY_V2.PENDING,
914
+ createdAt: now,
915
+ updatedAt: now,
916
+ lastTouchedAt: now,
917
+ activatedAt: null,
918
+ archivedAt: null,
919
+ metadata: { ...(metadata || {}) },
920
+ };
921
+ _hookgovPsV2.set(id, p);
922
+ return { ...p, metadata: { ...p.metadata } };
923
+ }
924
+ export function activateHookgovProfileV2(id) {
925
+ const p = _hookgovPsV2.get(id);
926
+ if (!p) throw new Error(`hookgov profile ${id} not found`);
927
+ const isInitial = p.status === HOOKGOV_PROFILE_MATURITY_V2.PENDING;
928
+ _hookgovCheckP(p.status, HOOKGOV_PROFILE_MATURITY_V2.ACTIVE);
929
+ if (isInitial && _hookgovCountActive(p.owner) >= _hookgovMaxActive)
930
+ throw new Error(`max active hookgov profiles for owner ${p.owner} reached`);
931
+ const now = Date.now();
932
+ p.status = HOOKGOV_PROFILE_MATURITY_V2.ACTIVE;
933
+ p.updatedAt = now;
934
+ p.lastTouchedAt = now;
935
+ if (!p.activatedAt) p.activatedAt = now;
936
+ return { ...p, metadata: { ...p.metadata } };
937
+ }
938
+ export function disableHookgovProfileV2(id) {
939
+ const p = _hookgovPsV2.get(id);
940
+ if (!p) throw new Error(`hookgov profile ${id} not found`);
941
+ _hookgovCheckP(p.status, HOOKGOV_PROFILE_MATURITY_V2.DISABLED);
942
+ p.status = HOOKGOV_PROFILE_MATURITY_V2.DISABLED;
943
+ p.updatedAt = Date.now();
944
+ return { ...p, metadata: { ...p.metadata } };
945
+ }
946
+ export function archiveHookgovProfileV2(id) {
947
+ const p = _hookgovPsV2.get(id);
948
+ if (!p) throw new Error(`hookgov profile ${id} not found`);
949
+ _hookgovCheckP(p.status, HOOKGOV_PROFILE_MATURITY_V2.ARCHIVED);
950
+ const now = Date.now();
951
+ p.status = HOOKGOV_PROFILE_MATURITY_V2.ARCHIVED;
952
+ p.updatedAt = now;
953
+ if (!p.archivedAt) p.archivedAt = now;
954
+ return { ...p, metadata: { ...p.metadata } };
955
+ }
956
+ export function touchHookgovProfileV2(id) {
957
+ const p = _hookgovPsV2.get(id);
958
+ if (!p) throw new Error(`hookgov profile ${id} not found`);
959
+ if (_hookgovPTerminal.has(p.status))
960
+ throw new Error(`cannot touch terminal hookgov profile ${id}`);
961
+ const now = Date.now();
962
+ p.lastTouchedAt = now;
963
+ p.updatedAt = now;
964
+ return { ...p, metadata: { ...p.metadata } };
965
+ }
966
+ export function getHookgovProfileV2(id) {
967
+ const p = _hookgovPsV2.get(id);
968
+ if (!p) return null;
969
+ return { ...p, metadata: { ...p.metadata } };
970
+ }
971
+ export function listHookgovProfilesV2() {
972
+ return [..._hookgovPsV2.values()].map((p) => ({
973
+ ...p,
974
+ metadata: { ...p.metadata },
975
+ }));
976
+ }
977
+ export function createHookgovTriggerV2({
978
+ id,
979
+ profileId,
980
+ payload,
981
+ metadata,
982
+ } = {}) {
983
+ if (!id || !profileId) throw new Error("id and profileId required");
984
+ if (_hookgovJsV2.has(id))
985
+ throw new Error(`hookgov trigger ${id} already exists`);
986
+ if (!_hookgovPsV2.has(profileId))
987
+ throw new Error(`hookgov profile ${profileId} not found`);
988
+ if (_hookgovCountPending(profileId) >= _hookgovMaxPending)
989
+ throw new Error(
990
+ `max pending hookgov triggers for profile ${profileId} reached`,
991
+ );
992
+ const now = Date.now();
993
+ const j = {
994
+ id,
995
+ profileId,
996
+ payload: payload || "",
997
+ status: HOOKGOV_TRIGGER_LIFECYCLE_V2.QUEUED,
998
+ createdAt: now,
999
+ updatedAt: now,
1000
+ startedAt: null,
1001
+ settledAt: null,
1002
+ metadata: { ...(metadata || {}) },
1003
+ };
1004
+ _hookgovJsV2.set(id, j);
1005
+ return { ...j, metadata: { ...j.metadata } };
1006
+ }
1007
+ export function firingHookgovTriggerV2(id) {
1008
+ const j = _hookgovJsV2.get(id);
1009
+ if (!j) throw new Error(`hookgov trigger ${id} not found`);
1010
+ _hookgovCheckJ(j.status, HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRING);
1011
+ const now = Date.now();
1012
+ j.status = HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRING;
1013
+ j.updatedAt = now;
1014
+ if (!j.startedAt) j.startedAt = now;
1015
+ return { ...j, metadata: { ...j.metadata } };
1016
+ }
1017
+ export function completeTriggerHookgovV2(id) {
1018
+ const j = _hookgovJsV2.get(id);
1019
+ if (!j) throw new Error(`hookgov trigger ${id} not found`);
1020
+ _hookgovCheckJ(j.status, HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRED);
1021
+ const now = Date.now();
1022
+ j.status = HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRED;
1023
+ j.updatedAt = now;
1024
+ if (!j.settledAt) j.settledAt = now;
1025
+ return { ...j, metadata: { ...j.metadata } };
1026
+ }
1027
+ export function failHookgovTriggerV2(id, reason) {
1028
+ const j = _hookgovJsV2.get(id);
1029
+ if (!j) throw new Error(`hookgov trigger ${id} not found`);
1030
+ _hookgovCheckJ(j.status, HOOKGOV_TRIGGER_LIFECYCLE_V2.FAILED);
1031
+ const now = Date.now();
1032
+ j.status = HOOKGOV_TRIGGER_LIFECYCLE_V2.FAILED;
1033
+ j.updatedAt = now;
1034
+ if (!j.settledAt) j.settledAt = now;
1035
+ if (reason) j.metadata.failReason = String(reason);
1036
+ return { ...j, metadata: { ...j.metadata } };
1037
+ }
1038
+ export function cancelHookgovTriggerV2(id, reason) {
1039
+ const j = _hookgovJsV2.get(id);
1040
+ if (!j) throw new Error(`hookgov trigger ${id} not found`);
1041
+ _hookgovCheckJ(j.status, HOOKGOV_TRIGGER_LIFECYCLE_V2.CANCELLED);
1042
+ const now = Date.now();
1043
+ j.status = HOOKGOV_TRIGGER_LIFECYCLE_V2.CANCELLED;
1044
+ j.updatedAt = now;
1045
+ if (!j.settledAt) j.settledAt = now;
1046
+ if (reason) j.metadata.cancelReason = String(reason);
1047
+ return { ...j, metadata: { ...j.metadata } };
1048
+ }
1049
+ export function getHookgovTriggerV2(id) {
1050
+ const j = _hookgovJsV2.get(id);
1051
+ if (!j) return null;
1052
+ return { ...j, metadata: { ...j.metadata } };
1053
+ }
1054
+ export function listHookgovTriggersV2() {
1055
+ return [..._hookgovJsV2.values()].map((j) => ({
1056
+ ...j,
1057
+ metadata: { ...j.metadata },
1058
+ }));
1059
+ }
1060
+ export function autoDisableIdleHookgovProfilesV2({ now } = {}) {
1061
+ const t = now ?? Date.now();
1062
+ const flipped = [];
1063
+ for (const p of _hookgovPsV2.values())
1064
+ if (
1065
+ p.status === HOOKGOV_PROFILE_MATURITY_V2.ACTIVE &&
1066
+ t - p.lastTouchedAt >= _hookgovIdleMs
1067
+ ) {
1068
+ p.status = HOOKGOV_PROFILE_MATURITY_V2.DISABLED;
1069
+ p.updatedAt = t;
1070
+ flipped.push(p.id);
1071
+ }
1072
+ return { flipped, count: flipped.length };
1073
+ }
1074
+ export function autoFailStuckHookgovTriggersV2({ now } = {}) {
1075
+ const t = now ?? Date.now();
1076
+ const flipped = [];
1077
+ for (const j of _hookgovJsV2.values())
1078
+ if (
1079
+ j.status === HOOKGOV_TRIGGER_LIFECYCLE_V2.FIRING &&
1080
+ j.startedAt != null &&
1081
+ t - j.startedAt >= _hookgovStuckMs
1082
+ ) {
1083
+ j.status = HOOKGOV_TRIGGER_LIFECYCLE_V2.FAILED;
1084
+ j.updatedAt = t;
1085
+ if (!j.settledAt) j.settledAt = t;
1086
+ j.metadata.failReason = "auto-fail-stuck";
1087
+ flipped.push(j.id);
1088
+ }
1089
+ return { flipped, count: flipped.length };
1090
+ }
1091
+ export function getHookManagerGovStatsV2() {
1092
+ const profilesByStatus = {};
1093
+ for (const v of Object.values(HOOKGOV_PROFILE_MATURITY_V2))
1094
+ profilesByStatus[v] = 0;
1095
+ for (const p of _hookgovPsV2.values()) profilesByStatus[p.status]++;
1096
+ const triggersByStatus = {};
1097
+ for (const v of Object.values(HOOKGOV_TRIGGER_LIFECYCLE_V2))
1098
+ triggersByStatus[v] = 0;
1099
+ for (const j of _hookgovJsV2.values()) triggersByStatus[j.status]++;
1100
+ return {
1101
+ totalHookgovProfilesV2: _hookgovPsV2.size,
1102
+ totalHookgovTriggersV2: _hookgovJsV2.size,
1103
+ maxActiveHookgovProfilesPerOwner: _hookgovMaxActive,
1104
+ maxPendingHookgovTriggersPerProfile: _hookgovMaxPending,
1105
+ hookgovProfileIdleMs: _hookgovIdleMs,
1106
+ hookgovTriggerStuckMs: _hookgovStuckMs,
1107
+ profilesByStatus,
1108
+ triggersByStatus,
1109
+ };
1110
+ }