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.
Files changed (184) hide show
  1. package/README.md +52 -3
  2. package/package.json +1 -1
  3. package/src/commands/a2a.js +201 -0
  4. package/src/commands/activitypub.js +207 -0
  5. package/src/commands/agent-network.js +217 -0
  6. package/src/commands/agent.js +1250 -0
  7. package/src/commands/automation.js +201 -0
  8. package/src/commands/bi.js +203 -0
  9. package/src/commands/browse.js +213 -0
  10. package/src/commands/chat.js +605 -0
  11. package/src/commands/cli-anything.js +426 -0
  12. package/src/commands/codegen.js +207 -0
  13. package/src/commands/collab.js +211 -0
  14. package/src/commands/compliance.js +822 -0
  15. package/src/commands/config.js +213 -0
  16. package/src/commands/cowork.js +1666 -0
  17. package/src/commands/crosschain.js +203 -0
  18. package/src/commands/dao.js +203 -0
  19. package/src/commands/dbevo.js +227 -0
  20. package/src/commands/dev.js +207 -0
  21. package/src/commands/did-v2.js +217 -0
  22. package/src/commands/did.js +221 -0
  23. package/src/commands/dlp.js +213 -0
  24. package/src/commands/economy.js +199 -0
  25. package/src/commands/encrypt.js +201 -0
  26. package/src/commands/evolution.js +199 -0
  27. package/src/commands/evomap.js +830 -0
  28. package/src/commands/export.js +213 -0
  29. package/src/commands/federation.js +209 -0
  30. package/src/commands/fusion.js +205 -0
  31. package/src/commands/governance.js +209 -0
  32. package/src/commands/hmemory.js +203 -0
  33. package/src/commands/hook.js +209 -0
  34. package/src/commands/import.js +209 -0
  35. package/src/commands/inference.js +207 -0
  36. package/src/commands/infra.js +203 -0
  37. package/src/commands/instinct.js +209 -0
  38. package/src/commands/ipfs.js +207 -0
  39. package/src/commands/kg.js +195 -0
  40. package/src/commands/llm.js +426 -0
  41. package/src/commands/matrix.js +207 -0
  42. package/src/commands/mcp.js +217 -0
  43. package/src/commands/memory.js +412 -0
  44. package/src/commands/multimodal.js +203 -0
  45. package/src/commands/nlprog.js +225 -0
  46. package/src/commands/nostr.js +209 -0
  47. package/src/commands/note.js +205 -0
  48. package/src/commands/ops.js +219 -0
  49. package/src/commands/orchestrate.js +406 -0
  50. package/src/commands/org.js +209 -0
  51. package/src/commands/p2p.js +209 -0
  52. package/src/commands/perception.js +209 -0
  53. package/src/commands/permmem.js +203 -0
  54. package/src/commands/pipeline.js +199 -0
  55. package/src/commands/planmode.js +426 -0
  56. package/src/commands/plugin-ecosystem.js +209 -0
  57. package/src/commands/plugin.js +209 -0
  58. package/src/commands/pqc.js +213 -0
  59. package/src/commands/quantization.js +207 -0
  60. package/src/commands/rcache.js +205 -0
  61. package/src/commands/recommend.js +233 -0
  62. package/src/commands/runtime.js +205 -0
  63. package/src/commands/scim.js +209 -0
  64. package/src/commands/services.js +207 -0
  65. package/src/commands/session.js +209 -0
  66. package/src/commands/setup.js +205 -0
  67. package/src/commands/skill.js +414 -0
  68. package/src/commands/social.js +201 -0
  69. package/src/commands/sso.js +209 -0
  70. package/src/commands/start.js +209 -0
  71. package/src/commands/stream.js +213 -0
  72. package/src/commands/sync.js +209 -0
  73. package/src/commands/tech.js +209 -0
  74. package/src/commands/tenant.js +217 -0
  75. package/src/commands/tokens.js +209 -0
  76. package/src/commands/trust.js +217 -0
  77. package/src/commands/ui.js +225 -0
  78. package/src/commands/wallet.js +209 -0
  79. package/src/commands/workflow.js +412 -0
  80. package/src/index.js +252 -0
  81. package/src/lib/a2a-protocol.js +332 -0
  82. package/src/lib/activitypub-bridge.js +334 -0
  83. package/src/lib/agent-coordinator.js +334 -0
  84. package/src/lib/agent-economy.js +334 -0
  85. package/src/lib/agent-network.js +341 -0
  86. package/src/lib/agent-router.js +333 -0
  87. package/src/lib/aiops.js +346 -0
  88. package/src/lib/automation-engine.js +335 -0
  89. package/src/lib/autonomous-agent.js +332 -0
  90. package/src/lib/autonomous-developer.js +332 -0
  91. package/src/lib/bi-engine.js +333 -0
  92. package/src/lib/browser-automation.js +334 -0
  93. package/src/lib/chat-core.js +335 -0
  94. package/src/lib/cli-anything-bridge.js +341 -0
  95. package/src/lib/cli-context-engineering.js +351 -0
  96. package/src/lib/code-agent.js +339 -0
  97. package/src/lib/collaboration-governance.js +334 -0
  98. package/src/lib/community-governance.js +346 -0
  99. package/src/lib/compliance-manager.js +334 -0
  100. package/src/lib/content-recommendation.js +351 -0
  101. package/src/lib/cowork-adapter.js +336 -0
  102. package/src/lib/cowork-evomap-adapter.js +341 -0
  103. package/src/lib/cowork-mcp-tools.js +341 -0
  104. package/src/lib/cowork-observe-html.js +341 -0
  105. package/src/lib/cowork-observe.js +341 -0
  106. package/src/lib/cowork-share.js +338 -0
  107. package/src/lib/cowork-task-templates.js +342 -1
  108. package/src/lib/cowork-template-marketplace.js +340 -0
  109. package/src/lib/cross-chain.js +339 -0
  110. package/src/lib/crypto-manager.js +334 -0
  111. package/src/lib/dao-governance.js +339 -0
  112. package/src/lib/dbevo.js +351 -0
  113. package/src/lib/decentral-infra.js +330 -0
  114. package/src/lib/did-manager.js +341 -0
  115. package/src/lib/did-v2-manager.js +341 -0
  116. package/src/lib/dlp-engine.js +339 -0
  117. package/src/lib/downloader.js +334 -0
  118. package/src/lib/evolution-system.js +334 -0
  119. package/src/lib/evomap-client.js +342 -0
  120. package/src/lib/evomap-federation.js +338 -0
  121. package/src/lib/evomap-governance.js +334 -0
  122. package/src/lib/evomap-manager.js +330 -0
  123. package/src/lib/execution-backend.js +330 -0
  124. package/src/lib/federation-hardening.js +340 -0
  125. package/src/lib/hashline.js +338 -0
  126. package/src/lib/hierarchical-memory.js +334 -0
  127. package/src/lib/hook-manager.js +341 -0
  128. package/src/lib/inference-network.js +341 -0
  129. package/src/lib/instinct-manager.js +346 -0
  130. package/src/lib/interaction-adapter.js +330 -0
  131. package/src/lib/interactive-planner.js +354 -0
  132. package/src/lib/ipfs-storage.js +334 -0
  133. package/src/lib/knowledge-exporter.js +341 -0
  134. package/src/lib/knowledge-graph.js +331 -0
  135. package/src/lib/knowledge-importer.js +341 -0
  136. package/src/lib/llm-providers.js +346 -0
  137. package/src/lib/matrix-bridge.js +339 -0
  138. package/src/lib/mcp-registry.js +346 -0
  139. package/src/lib/memory-manager.js +336 -0
  140. package/src/lib/multimodal.js +330 -0
  141. package/src/lib/nl-programming.js +341 -0
  142. package/src/lib/nostr-bridge.js +336 -0
  143. package/src/lib/note-versioning.js +339 -0
  144. package/src/lib/org-manager.js +336 -0
  145. package/src/lib/p2p-manager.js +341 -0
  146. package/src/lib/perception.js +346 -0
  147. package/src/lib/permanent-memory.js +327 -0
  148. package/src/lib/pipeline-orchestrator.js +332 -0
  149. package/src/lib/plan-mode.js +336 -0
  150. package/src/lib/plugin-autodiscovery.js +334 -0
  151. package/src/lib/plugin-ecosystem.js +346 -0
  152. package/src/lib/pqc-manager.js +346 -0
  153. package/src/lib/process-manager.js +336 -0
  154. package/src/lib/protocol-fusion.js +338 -0
  155. package/src/lib/provider-options.js +346 -0
  156. package/src/lib/provider-stream.js +348 -0
  157. package/src/lib/quantization.js +337 -0
  158. package/src/lib/response-cache.js +333 -0
  159. package/src/lib/scim-manager.js +346 -0
  160. package/src/lib/service-manager.js +337 -0
  161. package/src/lib/session-core-singletons.js +341 -0
  162. package/src/lib/session-manager.js +334 -0
  163. package/src/lib/skill-loader.js +334 -0
  164. package/src/lib/skill-mcp.js +336 -0
  165. package/src/lib/social-manager.js +330 -0
  166. package/src/lib/sso-manager.js +340 -0
  167. package/src/lib/stix-parser.js +346 -0
  168. package/src/lib/sub-agent-context.js +343 -0
  169. package/src/lib/sub-agent-profiles.js +335 -0
  170. package/src/lib/sub-agent-registry.js +336 -0
  171. package/src/lib/sync-manager.js +336 -0
  172. package/src/lib/tech-learning-engine.js +341 -0
  173. package/src/lib/tenant-saas.js +341 -0
  174. package/src/lib/threat-intel.js +330 -0
  175. package/src/lib/todo-manager.js +336 -0
  176. package/src/lib/token-tracker.js +336 -0
  177. package/src/lib/trust-security.js +343 -0
  178. package/src/lib/ueba.js +340 -0
  179. package/src/lib/universal-runtime.js +330 -0
  180. package/src/lib/wallet-manager.js +336 -0
  181. package/src/lib/web-ui-server.js +348 -0
  182. package/src/lib/workflow-engine.js +330 -0
  183. package/src/lib/workflow-expr.js +346 -0
  184. package/src/lib/ws-chat-handler.js +337 -0
@@ -146,3 +146,340 @@ export class WSChatHandler {
146
146
  }
147
147
  }
148
148
  }
149
+
150
+ // =====================================================================
151
+ // ws-chat-handler V2 governance overlay (iter27)
152
+ // =====================================================================
153
+ export const WSCGOV_PROFILE_MATURITY_V2 = Object.freeze({
154
+ PENDING: "pending",
155
+ ACTIVE: "active",
156
+ IDLE: "idle",
157
+ ARCHIVED: "archived",
158
+ });
159
+ export const WSCGOV_MSG_LIFECYCLE_V2 = Object.freeze({
160
+ QUEUED: "queued",
161
+ HANDLING: "handling",
162
+ HANDLED: "handled",
163
+ FAILED: "failed",
164
+ CANCELLED: "cancelled",
165
+ });
166
+ const _wscgovPTrans = new Map([
167
+ [
168
+ WSCGOV_PROFILE_MATURITY_V2.PENDING,
169
+ new Set([
170
+ WSCGOV_PROFILE_MATURITY_V2.ACTIVE,
171
+ WSCGOV_PROFILE_MATURITY_V2.ARCHIVED,
172
+ ]),
173
+ ],
174
+ [
175
+ WSCGOV_PROFILE_MATURITY_V2.ACTIVE,
176
+ new Set([
177
+ WSCGOV_PROFILE_MATURITY_V2.IDLE,
178
+ WSCGOV_PROFILE_MATURITY_V2.ARCHIVED,
179
+ ]),
180
+ ],
181
+ [
182
+ WSCGOV_PROFILE_MATURITY_V2.IDLE,
183
+ new Set([
184
+ WSCGOV_PROFILE_MATURITY_V2.ACTIVE,
185
+ WSCGOV_PROFILE_MATURITY_V2.ARCHIVED,
186
+ ]),
187
+ ],
188
+ [WSCGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
189
+ ]);
190
+ const _wscgovPTerminal = new Set([WSCGOV_PROFILE_MATURITY_V2.ARCHIVED]);
191
+ const _wscgovJTrans = new Map([
192
+ [
193
+ WSCGOV_MSG_LIFECYCLE_V2.QUEUED,
194
+ new Set([
195
+ WSCGOV_MSG_LIFECYCLE_V2.HANDLING,
196
+ WSCGOV_MSG_LIFECYCLE_V2.CANCELLED,
197
+ ]),
198
+ ],
199
+ [
200
+ WSCGOV_MSG_LIFECYCLE_V2.HANDLING,
201
+ new Set([
202
+ WSCGOV_MSG_LIFECYCLE_V2.HANDLED,
203
+ WSCGOV_MSG_LIFECYCLE_V2.FAILED,
204
+ WSCGOV_MSG_LIFECYCLE_V2.CANCELLED,
205
+ ]),
206
+ ],
207
+ [WSCGOV_MSG_LIFECYCLE_V2.HANDLED, new Set()],
208
+ [WSCGOV_MSG_LIFECYCLE_V2.FAILED, new Set()],
209
+ [WSCGOV_MSG_LIFECYCLE_V2.CANCELLED, new Set()],
210
+ ]);
211
+ const _wscgovPsV2 = new Map();
212
+ const _wscgovJsV2 = new Map();
213
+ let _wscgovMaxActive = 10,
214
+ _wscgovMaxPending = 25,
215
+ _wscgovIdleMs = 30 * 24 * 60 * 60 * 1000,
216
+ _wscgovStuckMs = 60 * 1000;
217
+ function _wscgovPos(n, label) {
218
+ const v = Math.floor(Number(n));
219
+ if (!Number.isFinite(v) || v <= 0)
220
+ throw new Error(`${label} must be positive integer`);
221
+ return v;
222
+ }
223
+ function _wscgovCheckP(from, to) {
224
+ const a = _wscgovPTrans.get(from);
225
+ if (!a || !a.has(to))
226
+ throw new Error(`invalid wscgov profile transition ${from} → ${to}`);
227
+ }
228
+ function _wscgovCheckJ(from, to) {
229
+ const a = _wscgovJTrans.get(from);
230
+ if (!a || !a.has(to))
231
+ throw new Error(`invalid wscgov msg transition ${from} → ${to}`);
232
+ }
233
+ function _wscgovCountActive(owner) {
234
+ let c = 0;
235
+ for (const p of _wscgovPsV2.values())
236
+ if (p.owner === owner && p.status === WSCGOV_PROFILE_MATURITY_V2.ACTIVE)
237
+ c++;
238
+ return c;
239
+ }
240
+ function _wscgovCountPending(profileId) {
241
+ let c = 0;
242
+ for (const j of _wscgovJsV2.values())
243
+ if (
244
+ j.profileId === profileId &&
245
+ (j.status === WSCGOV_MSG_LIFECYCLE_V2.QUEUED ||
246
+ j.status === WSCGOV_MSG_LIFECYCLE_V2.HANDLING)
247
+ )
248
+ c++;
249
+ return c;
250
+ }
251
+ export function setMaxActiveWscgovProfilesPerOwnerV2(n) {
252
+ _wscgovMaxActive = _wscgovPos(n, "maxActiveWscgovProfilesPerOwner");
253
+ }
254
+ export function getMaxActiveWscgovProfilesPerOwnerV2() {
255
+ return _wscgovMaxActive;
256
+ }
257
+ export function setMaxPendingWscgovMsgsPerProfileV2(n) {
258
+ _wscgovMaxPending = _wscgovPos(n, "maxPendingWscgovMsgsPerProfile");
259
+ }
260
+ export function getMaxPendingWscgovMsgsPerProfileV2() {
261
+ return _wscgovMaxPending;
262
+ }
263
+ export function setWscgovProfileIdleMsV2(n) {
264
+ _wscgovIdleMs = _wscgovPos(n, "wscgovProfileIdleMs");
265
+ }
266
+ export function getWscgovProfileIdleMsV2() {
267
+ return _wscgovIdleMs;
268
+ }
269
+ export function setWscgovMsgStuckMsV2(n) {
270
+ _wscgovStuckMs = _wscgovPos(n, "wscgovMsgStuckMs");
271
+ }
272
+ export function getWscgovMsgStuckMsV2() {
273
+ return _wscgovStuckMs;
274
+ }
275
+ export function _resetStateWsChatHandlerGovV2() {
276
+ _wscgovPsV2.clear();
277
+ _wscgovJsV2.clear();
278
+ _wscgovMaxActive = 10;
279
+ _wscgovMaxPending = 25;
280
+ _wscgovIdleMs = 30 * 24 * 60 * 60 * 1000;
281
+ _wscgovStuckMs = 60 * 1000;
282
+ }
283
+ export function registerWscgovProfileV2({
284
+ id,
285
+ owner,
286
+ connection,
287
+ metadata,
288
+ } = {}) {
289
+ if (!id || !owner) throw new Error("id and owner required");
290
+ if (_wscgovPsV2.has(id))
291
+ throw new Error(`wscgov profile ${id} already exists`);
292
+ const now = Date.now();
293
+ const p = {
294
+ id,
295
+ owner,
296
+ connection: connection || "default",
297
+ status: WSCGOV_PROFILE_MATURITY_V2.PENDING,
298
+ createdAt: now,
299
+ updatedAt: now,
300
+ lastTouchedAt: now,
301
+ activatedAt: null,
302
+ archivedAt: null,
303
+ metadata: { ...(metadata || {}) },
304
+ };
305
+ _wscgovPsV2.set(id, p);
306
+ return { ...p, metadata: { ...p.metadata } };
307
+ }
308
+ export function activateWscgovProfileV2(id) {
309
+ const p = _wscgovPsV2.get(id);
310
+ if (!p) throw new Error(`wscgov profile ${id} not found`);
311
+ const isInitial = p.status === WSCGOV_PROFILE_MATURITY_V2.PENDING;
312
+ _wscgovCheckP(p.status, WSCGOV_PROFILE_MATURITY_V2.ACTIVE);
313
+ if (isInitial && _wscgovCountActive(p.owner) >= _wscgovMaxActive)
314
+ throw new Error(`max active wscgov profiles for owner ${p.owner} reached`);
315
+ const now = Date.now();
316
+ p.status = WSCGOV_PROFILE_MATURITY_V2.ACTIVE;
317
+ p.updatedAt = now;
318
+ p.lastTouchedAt = now;
319
+ if (!p.activatedAt) p.activatedAt = now;
320
+ return { ...p, metadata: { ...p.metadata } };
321
+ }
322
+ export function idleWscgovProfileV2(id) {
323
+ const p = _wscgovPsV2.get(id);
324
+ if (!p) throw new Error(`wscgov profile ${id} not found`);
325
+ _wscgovCheckP(p.status, WSCGOV_PROFILE_MATURITY_V2.IDLE);
326
+ p.status = WSCGOV_PROFILE_MATURITY_V2.IDLE;
327
+ p.updatedAt = Date.now();
328
+ return { ...p, metadata: { ...p.metadata } };
329
+ }
330
+ export function archiveWscgovProfileV2(id) {
331
+ const p = _wscgovPsV2.get(id);
332
+ if (!p) throw new Error(`wscgov profile ${id} not found`);
333
+ _wscgovCheckP(p.status, WSCGOV_PROFILE_MATURITY_V2.ARCHIVED);
334
+ const now = Date.now();
335
+ p.status = WSCGOV_PROFILE_MATURITY_V2.ARCHIVED;
336
+ p.updatedAt = now;
337
+ if (!p.archivedAt) p.archivedAt = now;
338
+ return { ...p, metadata: { ...p.metadata } };
339
+ }
340
+ export function touchWscgovProfileV2(id) {
341
+ const p = _wscgovPsV2.get(id);
342
+ if (!p) throw new Error(`wscgov profile ${id} not found`);
343
+ if (_wscgovPTerminal.has(p.status))
344
+ throw new Error(`cannot touch terminal wscgov profile ${id}`);
345
+ const now = Date.now();
346
+ p.lastTouchedAt = now;
347
+ p.updatedAt = now;
348
+ return { ...p, metadata: { ...p.metadata } };
349
+ }
350
+ export function getWscgovProfileV2(id) {
351
+ const p = _wscgovPsV2.get(id);
352
+ if (!p) return null;
353
+ return { ...p, metadata: { ...p.metadata } };
354
+ }
355
+ export function listWscgovProfilesV2() {
356
+ return [..._wscgovPsV2.values()].map((p) => ({
357
+ ...p,
358
+ metadata: { ...p.metadata },
359
+ }));
360
+ }
361
+ export function createWscgovMsgV2({ id, profileId, payload, metadata } = {}) {
362
+ if (!id || !profileId) throw new Error("id and profileId required");
363
+ if (_wscgovJsV2.has(id)) throw new Error(`wscgov msg ${id} already exists`);
364
+ if (!_wscgovPsV2.has(profileId))
365
+ throw new Error(`wscgov profile ${profileId} not found`);
366
+ if (_wscgovCountPending(profileId) >= _wscgovMaxPending)
367
+ throw new Error(`max pending wscgov msgs for profile ${profileId} reached`);
368
+ const now = Date.now();
369
+ const j = {
370
+ id,
371
+ profileId,
372
+ payload: payload || "",
373
+ status: WSCGOV_MSG_LIFECYCLE_V2.QUEUED,
374
+ createdAt: now,
375
+ updatedAt: now,
376
+ startedAt: null,
377
+ settledAt: null,
378
+ metadata: { ...(metadata || {}) },
379
+ };
380
+ _wscgovJsV2.set(id, j);
381
+ return { ...j, metadata: { ...j.metadata } };
382
+ }
383
+ export function handlingWscgovMsgV2(id) {
384
+ const j = _wscgovJsV2.get(id);
385
+ if (!j) throw new Error(`wscgov msg ${id} not found`);
386
+ _wscgovCheckJ(j.status, WSCGOV_MSG_LIFECYCLE_V2.HANDLING);
387
+ const now = Date.now();
388
+ j.status = WSCGOV_MSG_LIFECYCLE_V2.HANDLING;
389
+ j.updatedAt = now;
390
+ if (!j.startedAt) j.startedAt = now;
391
+ return { ...j, metadata: { ...j.metadata } };
392
+ }
393
+ export function completeMsgWscgovV2(id) {
394
+ const j = _wscgovJsV2.get(id);
395
+ if (!j) throw new Error(`wscgov msg ${id} not found`);
396
+ _wscgovCheckJ(j.status, WSCGOV_MSG_LIFECYCLE_V2.HANDLED);
397
+ const now = Date.now();
398
+ j.status = WSCGOV_MSG_LIFECYCLE_V2.HANDLED;
399
+ j.updatedAt = now;
400
+ if (!j.settledAt) j.settledAt = now;
401
+ return { ...j, metadata: { ...j.metadata } };
402
+ }
403
+ export function failWscgovMsgV2(id, reason) {
404
+ const j = _wscgovJsV2.get(id);
405
+ if (!j) throw new Error(`wscgov msg ${id} not found`);
406
+ _wscgovCheckJ(j.status, WSCGOV_MSG_LIFECYCLE_V2.FAILED);
407
+ const now = Date.now();
408
+ j.status = WSCGOV_MSG_LIFECYCLE_V2.FAILED;
409
+ j.updatedAt = now;
410
+ if (!j.settledAt) j.settledAt = now;
411
+ if (reason) j.metadata.failReason = String(reason);
412
+ return { ...j, metadata: { ...j.metadata } };
413
+ }
414
+ export function cancelWscgovMsgV2(id, reason) {
415
+ const j = _wscgovJsV2.get(id);
416
+ if (!j) throw new Error(`wscgov msg ${id} not found`);
417
+ _wscgovCheckJ(j.status, WSCGOV_MSG_LIFECYCLE_V2.CANCELLED);
418
+ const now = Date.now();
419
+ j.status = WSCGOV_MSG_LIFECYCLE_V2.CANCELLED;
420
+ j.updatedAt = now;
421
+ if (!j.settledAt) j.settledAt = now;
422
+ if (reason) j.metadata.cancelReason = String(reason);
423
+ return { ...j, metadata: { ...j.metadata } };
424
+ }
425
+ export function getWscgovMsgV2(id) {
426
+ const j = _wscgovJsV2.get(id);
427
+ if (!j) return null;
428
+ return { ...j, metadata: { ...j.metadata } };
429
+ }
430
+ export function listWscgovMsgsV2() {
431
+ return [..._wscgovJsV2.values()].map((j) => ({
432
+ ...j,
433
+ metadata: { ...j.metadata },
434
+ }));
435
+ }
436
+ export function autoIdleIdleWscgovProfilesV2({ now } = {}) {
437
+ const t = now ?? Date.now();
438
+ const flipped = [];
439
+ for (const p of _wscgovPsV2.values())
440
+ if (
441
+ p.status === WSCGOV_PROFILE_MATURITY_V2.ACTIVE &&
442
+ t - p.lastTouchedAt >= _wscgovIdleMs
443
+ ) {
444
+ p.status = WSCGOV_PROFILE_MATURITY_V2.IDLE;
445
+ p.updatedAt = t;
446
+ flipped.push(p.id);
447
+ }
448
+ return { flipped, count: flipped.length };
449
+ }
450
+ export function autoFailStuckWscgovMsgsV2({ now } = {}) {
451
+ const t = now ?? Date.now();
452
+ const flipped = [];
453
+ for (const j of _wscgovJsV2.values())
454
+ if (
455
+ j.status === WSCGOV_MSG_LIFECYCLE_V2.HANDLING &&
456
+ j.startedAt != null &&
457
+ t - j.startedAt >= _wscgovStuckMs
458
+ ) {
459
+ j.status = WSCGOV_MSG_LIFECYCLE_V2.FAILED;
460
+ j.updatedAt = t;
461
+ if (!j.settledAt) j.settledAt = t;
462
+ j.metadata.failReason = "auto-fail-stuck";
463
+ flipped.push(j.id);
464
+ }
465
+ return { flipped, count: flipped.length };
466
+ }
467
+ export function getWsChatHandlerGovStatsV2() {
468
+ const profilesByStatus = {};
469
+ for (const v of Object.values(WSCGOV_PROFILE_MATURITY_V2))
470
+ profilesByStatus[v] = 0;
471
+ for (const p of _wscgovPsV2.values()) profilesByStatus[p.status]++;
472
+ const msgsByStatus = {};
473
+ for (const v of Object.values(WSCGOV_MSG_LIFECYCLE_V2)) msgsByStatus[v] = 0;
474
+ for (const j of _wscgovJsV2.values()) msgsByStatus[j.status]++;
475
+ return {
476
+ totalWscgovProfilesV2: _wscgovPsV2.size,
477
+ totalWscgovMsgsV2: _wscgovJsV2.size,
478
+ maxActiveWscgovProfilesPerOwner: _wscgovMaxActive,
479
+ maxPendingWscgovMsgsPerProfile: _wscgovMaxPending,
480
+ wscgovProfileIdleMs: _wscgovIdleMs,
481
+ wscgovMsgStuckMs: _wscgovStuckMs,
482
+ profilesByStatus,
483
+ msgsByStatus,
484
+ };
485
+ }