chainlesschain 0.143.0 → 0.145.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 (133) hide show
  1. package/package.json +1 -1
  2. package/src/commands/a2a.js +196 -28
  3. package/src/commands/activitypub.js +157 -27
  4. package/src/commands/agent.js +587 -103
  5. package/src/commands/audit.js +206 -0
  6. package/src/commands/bi.js +152 -27
  7. package/src/commands/bm25.js +111 -27
  8. package/src/commands/browse.js +190 -29
  9. package/src/commands/ccron.js +128 -28
  10. package/src/commands/chat.js +207 -0
  11. package/src/commands/compliance.js +414 -34
  12. package/src/commands/compt.js +127 -29
  13. package/src/commands/consol.js +8 -2
  14. package/src/commands/cowork.js +580 -34
  15. package/src/commands/crosschain.js +182 -28
  16. package/src/commands/dao.js +182 -28
  17. package/src/commands/dlp.js +172 -27
  18. package/src/commands/economy.js +205 -50
  19. package/src/commands/evolution.js +203 -50
  20. package/src/commands/evomap.js +182 -27
  21. package/src/commands/fflag.js +74 -22
  22. package/src/commands/git.js +177 -37
  23. package/src/commands/hardening.js +209 -0
  24. package/src/commands/hmemory.js +204 -50
  25. package/src/commands/incentive.js +209 -0
  26. package/src/commands/inference.js +170 -34
  27. package/src/commands/itbudget.js +149 -33
  28. package/src/commands/kg.js +206 -0
  29. package/src/commands/lowcode.js +195 -38
  30. package/src/commands/marketplace.js +206 -0
  31. package/src/commands/matrix.js +179 -27
  32. package/src/commands/mcpscaf.js +145 -33
  33. package/src/commands/meminj.js +145 -33
  34. package/src/commands/nostr.js +178 -27
  35. package/src/commands/orchestrate.js +217 -0
  36. package/src/commands/orchgov.js +144 -33
  37. package/src/commands/pdfp.js +109 -27
  38. package/src/commands/perf.js +169 -32
  39. package/src/commands/perm.js +144 -33
  40. package/src/commands/pipeline.js +207 -52
  41. package/src/commands/planmode.js +141 -32
  42. package/src/commands/privacy.js +203 -0
  43. package/src/commands/promcomp.js +111 -27
  44. package/src/commands/recommend.js +177 -34
  45. package/src/commands/reputation.js +208 -0
  46. package/src/commands/sandbox.js +206 -0
  47. package/src/commands/seshhook.js +145 -33
  48. package/src/commands/seshsearch.js +141 -33
  49. package/src/commands/seshtail.js +144 -33
  50. package/src/commands/seshu.js +152 -33
  51. package/src/commands/sganal.js +123 -29
  52. package/src/commands/siem.js +201 -34
  53. package/src/commands/sla.js +212 -0
  54. package/src/commands/slotfill.js +146 -33
  55. package/src/commands/social.js +157 -32
  56. package/src/commands/stress.js +206 -0
  57. package/src/commands/svccont.js +145 -33
  58. package/src/commands/terraform.js +206 -0
  59. package/src/commands/tms.js +171 -33
  60. package/src/commands/topiccls.js +146 -33
  61. package/src/commands/uprof.js +141 -32
  62. package/src/commands/vcheck.js +122 -28
  63. package/src/commands/webfetch.js +141 -32
  64. package/src/commands/zkp.js +184 -28
  65. package/src/index.js +40 -0
  66. package/src/lib/a2a-protocol.js +319 -51
  67. package/src/lib/activitypub-bridge.js +288 -50
  68. package/src/lib/agent-economy.js +304 -51
  69. package/src/lib/app-builder.js +279 -46
  70. package/src/lib/audit-logger.js +321 -0
  71. package/src/lib/autonomous-agent.js +284 -48
  72. package/src/lib/bi-engine.js +283 -49
  73. package/src/lib/bm25-search.js +301 -49
  74. package/src/lib/browser-automation.js +296 -49
  75. package/src/lib/chat-core.js +336 -0
  76. package/src/lib/claude-code-bridge.js +341 -0
  77. package/src/lib/compliance-framework-reporter.js +305 -51
  78. package/src/lib/compliance-manager.js +330 -0
  79. package/src/lib/compression-telemetry.js +301 -49
  80. package/src/lib/content-recommender.js +317 -52
  81. package/src/lib/cowork-cron.js +298 -49
  82. package/src/lib/cowork-learning.js +333 -0
  83. package/src/lib/cowork-task-runner.js +308 -51
  84. package/src/lib/cowork-workflow.js +327 -0
  85. package/src/lib/cross-chain.js +311 -51
  86. package/src/lib/dao-governance.js +280 -46
  87. package/src/lib/dlp-engine.js +287 -49
  88. package/src/lib/evolution-system.js +278 -47
  89. package/src/lib/evomap-manager.js +280 -46
  90. package/src/lib/execution-backend.js +294 -48
  91. package/src/lib/feature-flags.js +294 -49
  92. package/src/lib/git-integration.js +285 -47
  93. package/src/lib/hardening-manager.js +341 -0
  94. package/src/lib/hierarchical-memory.js +284 -48
  95. package/src/lib/inference-network.js +308 -51
  96. package/src/lib/iteration-budget.js +302 -50
  97. package/src/lib/knowledge-graph.js +333 -0
  98. package/src/lib/matrix-bridge.js +281 -47
  99. package/src/lib/mcp-scaffold.js +318 -54
  100. package/src/lib/memory-injection.js +288 -49
  101. package/src/lib/nostr-bridge.js +286 -49
  102. package/src/lib/orchestrator.js +293 -48
  103. package/src/lib/pdf-parser.js +298 -49
  104. package/src/lib/perf-tuning.js +309 -50
  105. package/src/lib/permission-engine.js +287 -49
  106. package/src/lib/pipeline-orchestrator.js +289 -49
  107. package/src/lib/plan-mode.js +298 -51
  108. package/src/lib/privacy-computing.js +335 -0
  109. package/src/lib/reputation-optimizer.js +340 -0
  110. package/src/lib/sandbox-v2.js +327 -0
  111. package/src/lib/service-container.js +313 -52
  112. package/src/lib/session-consolidator.js +296 -49
  113. package/src/lib/session-hooks.js +312 -53
  114. package/src/lib/session-search.js +304 -51
  115. package/src/lib/session-tail.js +288 -49
  116. package/src/lib/session-usage.js +298 -52
  117. package/src/lib/siem-exporter.js +298 -51
  118. package/src/lib/skill-marketplace.js +345 -0
  119. package/src/lib/sla-manager.js +341 -0
  120. package/src/lib/slot-filler.js +303 -51
  121. package/src/lib/social-graph-analytics.js +295 -49
  122. package/src/lib/social-graph.js +272 -49
  123. package/src/lib/stress-tester.js +342 -0
  124. package/src/lib/sub-agent-registry.js +302 -53
  125. package/src/lib/task-model-selector.js +302 -50
  126. package/src/lib/terraform-manager.js +333 -0
  127. package/src/lib/todo-manager.js +281 -47
  128. package/src/lib/token-incentive.js +341 -0
  129. package/src/lib/topic-classifier.js +297 -49
  130. package/src/lib/user-profile.js +294 -50
  131. package/src/lib/version-checker.js +304 -50
  132. package/src/lib/web-fetch.js +292 -51
  133. package/src/lib/zkp-engine.js +286 -49
@@ -194,81 +194,334 @@ export class SessionSearchIndex {
194
194
 
195
195
  // ===== V2 Surface: Session Search governance overlay (CLI v0.142.0) =====
196
196
  export const SSCH_PROFILE_MATURITY_V2 = Object.freeze({
197
- PENDING: "pending", ACTIVE: "active", STALE: "stale", ARCHIVED: "archived",
197
+ PENDING: "pending",
198
+ ACTIVE: "active",
199
+ STALE: "stale",
200
+ ARCHIVED: "archived",
198
201
  });
199
202
  export const SSCH_QUERY_LIFECYCLE_V2 = Object.freeze({
200
- QUEUED: "queued", SEARCHING: "searching", COMPLETED: "completed", FAILED: "failed", CANCELLED: "cancelled",
203
+ QUEUED: "queued",
204
+ SEARCHING: "searching",
205
+ COMPLETED: "completed",
206
+ FAILED: "failed",
207
+ CANCELLED: "cancelled",
201
208
  });
202
209
  const _sschPTrans = new Map([
203
- [SSCH_PROFILE_MATURITY_V2.PENDING, new Set([SSCH_PROFILE_MATURITY_V2.ACTIVE, SSCH_PROFILE_MATURITY_V2.ARCHIVED])],
204
- [SSCH_PROFILE_MATURITY_V2.ACTIVE, new Set([SSCH_PROFILE_MATURITY_V2.STALE, SSCH_PROFILE_MATURITY_V2.ARCHIVED])],
205
- [SSCH_PROFILE_MATURITY_V2.STALE, new Set([SSCH_PROFILE_MATURITY_V2.ACTIVE, SSCH_PROFILE_MATURITY_V2.ARCHIVED])],
210
+ [
211
+ SSCH_PROFILE_MATURITY_V2.PENDING,
212
+ new Set([
213
+ SSCH_PROFILE_MATURITY_V2.ACTIVE,
214
+ SSCH_PROFILE_MATURITY_V2.ARCHIVED,
215
+ ]),
216
+ ],
217
+ [
218
+ SSCH_PROFILE_MATURITY_V2.ACTIVE,
219
+ new Set([
220
+ SSCH_PROFILE_MATURITY_V2.STALE,
221
+ SSCH_PROFILE_MATURITY_V2.ARCHIVED,
222
+ ]),
223
+ ],
224
+ [
225
+ SSCH_PROFILE_MATURITY_V2.STALE,
226
+ new Set([
227
+ SSCH_PROFILE_MATURITY_V2.ACTIVE,
228
+ SSCH_PROFILE_MATURITY_V2.ARCHIVED,
229
+ ]),
230
+ ],
206
231
  [SSCH_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
207
232
  ]);
208
233
  const _sschPTerminal = new Set([SSCH_PROFILE_MATURITY_V2.ARCHIVED]);
209
234
  const _sschQTrans = new Map([
210
- [SSCH_QUERY_LIFECYCLE_V2.QUEUED, new Set([SSCH_QUERY_LIFECYCLE_V2.SEARCHING, SSCH_QUERY_LIFECYCLE_V2.CANCELLED])],
211
- [SSCH_QUERY_LIFECYCLE_V2.SEARCHING, new Set([SSCH_QUERY_LIFECYCLE_V2.COMPLETED, SSCH_QUERY_LIFECYCLE_V2.FAILED, SSCH_QUERY_LIFECYCLE_V2.CANCELLED])],
235
+ [
236
+ SSCH_QUERY_LIFECYCLE_V2.QUEUED,
237
+ new Set([
238
+ SSCH_QUERY_LIFECYCLE_V2.SEARCHING,
239
+ SSCH_QUERY_LIFECYCLE_V2.CANCELLED,
240
+ ]),
241
+ ],
242
+ [
243
+ SSCH_QUERY_LIFECYCLE_V2.SEARCHING,
244
+ new Set([
245
+ SSCH_QUERY_LIFECYCLE_V2.COMPLETED,
246
+ SSCH_QUERY_LIFECYCLE_V2.FAILED,
247
+ SSCH_QUERY_LIFECYCLE_V2.CANCELLED,
248
+ ]),
249
+ ],
212
250
  [SSCH_QUERY_LIFECYCLE_V2.COMPLETED, new Set()],
213
251
  [SSCH_QUERY_LIFECYCLE_V2.FAILED, new Set()],
214
252
  [SSCH_QUERY_LIFECYCLE_V2.CANCELLED, new Set()],
215
253
  ]);
216
254
  const _sschPsV2 = new Map();
217
255
  const _sschQsV2 = new Map();
218
- let _sschMaxActive = 8, _sschMaxPending = 20, _sschIdleMs = 30 * 24 * 60 * 60 * 1000, _sschStuckMs = 30 * 1000;
219
- function _sschPos(n, label) { const v = Math.floor(Number(n)); if (!Number.isFinite(v) || v <= 0) throw new Error(`${label} must be positive integer`); return v; }
220
- function _sschCheckP(from, to) { const a = _sschPTrans.get(from); if (!a || !a.has(to)) throw new Error(`invalid ssch profile transition ${from} → ${to}`); }
221
- function _sschCheckQ(from, to) { const a = _sschQTrans.get(from); if (!a || !a.has(to)) throw new Error(`invalid ssch query transition ${from} → ${to}`); }
222
- export function setMaxActiveSschProfilesPerOwnerV2(n) { _sschMaxActive = _sschPos(n, "maxActiveSschProfilesPerOwner"); }
223
- export function getMaxActiveSschProfilesPerOwnerV2() { return _sschMaxActive; }
224
- export function setMaxPendingSschQueriesPerProfileV2(n) { _sschMaxPending = _sschPos(n, "maxPendingSschQueriesPerProfile"); }
225
- export function getMaxPendingSschQueriesPerProfileV2() { return _sschMaxPending; }
226
- export function setSschProfileIdleMsV2(n) { _sschIdleMs = _sschPos(n, "sschProfileIdleMs"); }
227
- export function getSschProfileIdleMsV2() { return _sschIdleMs; }
228
- export function setSschQueryStuckMsV2(n) { _sschStuckMs = _sschPos(n, "sschQueryStuckMs"); }
229
- export function getSschQueryStuckMsV2() { return _sschStuckMs; }
230
- export function _resetStateSessionSearchV2() { _sschPsV2.clear(); _sschQsV2.clear(); _sschMaxActive = 8; _sschMaxPending = 20; _sschIdleMs = 30 * 24 * 60 * 60 * 1000; _sschStuckMs = 30 * 1000; }
256
+ let _sschMaxActive = 8,
257
+ _sschMaxPending = 20,
258
+ _sschIdleMs = 30 * 24 * 60 * 60 * 1000,
259
+ _sschStuckMs = 30 * 1000;
260
+ function _sschPos(n, label) {
261
+ const v = Math.floor(Number(n));
262
+ if (!Number.isFinite(v) || v <= 0)
263
+ throw new Error(`${label} must be positive integer`);
264
+ return v;
265
+ }
266
+ function _sschCheckP(from, to) {
267
+ const a = _sschPTrans.get(from);
268
+ if (!a || !a.has(to))
269
+ throw new Error(`invalid ssch profile transition ${from} → ${to}`);
270
+ }
271
+ function _sschCheckQ(from, to) {
272
+ const a = _sschQTrans.get(from);
273
+ if (!a || !a.has(to))
274
+ throw new Error(`invalid ssch query transition ${from} → ${to}`);
275
+ }
276
+ export function setMaxActiveSschProfilesPerOwnerV2(n) {
277
+ _sschMaxActive = _sschPos(n, "maxActiveSschProfilesPerOwner");
278
+ }
279
+ export function getMaxActiveSschProfilesPerOwnerV2() {
280
+ return _sschMaxActive;
281
+ }
282
+ export function setMaxPendingSschQueriesPerProfileV2(n) {
283
+ _sschMaxPending = _sschPos(n, "maxPendingSschQueriesPerProfile");
284
+ }
285
+ export function getMaxPendingSschQueriesPerProfileV2() {
286
+ return _sschMaxPending;
287
+ }
288
+ export function setSschProfileIdleMsV2(n) {
289
+ _sschIdleMs = _sschPos(n, "sschProfileIdleMs");
290
+ }
291
+ export function getSschProfileIdleMsV2() {
292
+ return _sschIdleMs;
293
+ }
294
+ export function setSschQueryStuckMsV2(n) {
295
+ _sschStuckMs = _sschPos(n, "sschQueryStuckMs");
296
+ }
297
+ export function getSschQueryStuckMsV2() {
298
+ return _sschStuckMs;
299
+ }
300
+ export function _resetStateSessionSearchV2() {
301
+ _sschPsV2.clear();
302
+ _sschQsV2.clear();
303
+ _sschMaxActive = 8;
304
+ _sschMaxPending = 20;
305
+ _sschIdleMs = 30 * 24 * 60 * 60 * 1000;
306
+ _sschStuckMs = 30 * 1000;
307
+ }
231
308
  export function registerSschProfileV2({ id, owner, scope, metadata } = {}) {
232
- if (!id) throw new Error("ssch profile id required"); if (!owner) throw new Error("ssch profile owner required");
233
- if (_sschPsV2.has(id)) throw new Error(`ssch profile ${id} already registered`);
309
+ if (!id) throw new Error("ssch profile id required");
310
+ if (!owner) throw new Error("ssch profile owner required");
311
+ if (_sschPsV2.has(id))
312
+ throw new Error(`ssch profile ${id} already registered`);
234
313
  const now = Date.now();
235
- const p = { id, owner, scope: scope || "all", status: SSCH_PROFILE_MATURITY_V2.PENDING, createdAt: now, updatedAt: now, activatedAt: null, archivedAt: null, lastTouchedAt: now, metadata: { ...(metadata || {}) } };
236
- _sschPsV2.set(id, p); return { ...p, metadata: { ...p.metadata } };
314
+ const p = {
315
+ id,
316
+ owner,
317
+ scope: scope || "all",
318
+ status: SSCH_PROFILE_MATURITY_V2.PENDING,
319
+ createdAt: now,
320
+ updatedAt: now,
321
+ activatedAt: null,
322
+ archivedAt: null,
323
+ lastTouchedAt: now,
324
+ metadata: { ...(metadata || {}) },
325
+ };
326
+ _sschPsV2.set(id, p);
327
+ return { ...p, metadata: { ...p.metadata } };
328
+ }
329
+ function _sschCountActive(owner) {
330
+ let n = 0;
331
+ for (const p of _sschPsV2.values())
332
+ if (p.owner === owner && p.status === SSCH_PROFILE_MATURITY_V2.ACTIVE) n++;
333
+ return n;
237
334
  }
238
- function _sschCountActive(owner) { let n = 0; for (const p of _sschPsV2.values()) if (p.owner === owner && p.status === SSCH_PROFILE_MATURITY_V2.ACTIVE) n++; return n; }
239
335
  export function activateSschProfileV2(id) {
240
- const p = _sschPsV2.get(id); if (!p) throw new Error(`ssch profile ${id} not found`);
336
+ const p = _sschPsV2.get(id);
337
+ if (!p) throw new Error(`ssch profile ${id} not found`);
241
338
  _sschCheckP(p.status, SSCH_PROFILE_MATURITY_V2.ACTIVE);
242
339
  const recovery = p.status === SSCH_PROFILE_MATURITY_V2.STALE;
243
- if (!recovery && _sschCountActive(p.owner) >= _sschMaxActive) throw new Error(`max active ssch profiles for owner ${p.owner} reached`);
244
- const now = Date.now(); p.status = SSCH_PROFILE_MATURITY_V2.ACTIVE; p.updatedAt = now; p.lastTouchedAt = now; if (!p.activatedAt) p.activatedAt = now;
340
+ if (!recovery && _sschCountActive(p.owner) >= _sschMaxActive)
341
+ throw new Error(`max active ssch profiles for owner ${p.owner} reached`);
342
+ const now = Date.now();
343
+ p.status = SSCH_PROFILE_MATURITY_V2.ACTIVE;
344
+ p.updatedAt = now;
345
+ p.lastTouchedAt = now;
346
+ if (!p.activatedAt) p.activatedAt = now;
347
+ return { ...p, metadata: { ...p.metadata } };
348
+ }
349
+ export function staleSschProfileV2(id) {
350
+ const p = _sschPsV2.get(id);
351
+ if (!p) throw new Error(`ssch profile ${id} not found`);
352
+ _sschCheckP(p.status, SSCH_PROFILE_MATURITY_V2.STALE);
353
+ p.status = SSCH_PROFILE_MATURITY_V2.STALE;
354
+ p.updatedAt = Date.now();
245
355
  return { ...p, metadata: { ...p.metadata } };
246
356
  }
247
- export function staleSschProfileV2(id) { const p = _sschPsV2.get(id); if (!p) throw new Error(`ssch profile ${id} not found`); _sschCheckP(p.status, SSCH_PROFILE_MATURITY_V2.STALE); p.status = SSCH_PROFILE_MATURITY_V2.STALE; p.updatedAt = Date.now(); return { ...p, metadata: { ...p.metadata } }; }
248
- export function archiveSschProfileV2(id) { const p = _sschPsV2.get(id); if (!p) throw new Error(`ssch profile ${id} not found`); _sschCheckP(p.status, SSCH_PROFILE_MATURITY_V2.ARCHIVED); const now = Date.now(); p.status = SSCH_PROFILE_MATURITY_V2.ARCHIVED; p.updatedAt = now; if (!p.archivedAt) p.archivedAt = now; return { ...p, metadata: { ...p.metadata } }; }
249
- export function touchSschProfileV2(id) { const p = _sschPsV2.get(id); if (!p) throw new Error(`ssch profile ${id} not found`); if (_sschPTerminal.has(p.status)) throw new Error(`cannot touch terminal ssch profile ${id}`); const now = Date.now(); p.lastTouchedAt = now; p.updatedAt = now; return { ...p, metadata: { ...p.metadata } }; }
250
- export function getSschProfileV2(id) { const p = _sschPsV2.get(id); if (!p) return null; return { ...p, metadata: { ...p.metadata } }; }
251
- export function listSschProfilesV2() { return [..._sschPsV2.values()].map((p) => ({ ...p, metadata: { ...p.metadata } })); }
252
- function _sschCountPending(profileId) { let n = 0; for (const q of _sschQsV2.values()) if (q.profileId === profileId && (q.status === SSCH_QUERY_LIFECYCLE_V2.QUEUED || q.status === SSCH_QUERY_LIFECYCLE_V2.SEARCHING)) n++; return n; }
357
+ export function archiveSschProfileV2(id) {
358
+ const p = _sschPsV2.get(id);
359
+ if (!p) throw new Error(`ssch profile ${id} not found`);
360
+ _sschCheckP(p.status, SSCH_PROFILE_MATURITY_V2.ARCHIVED);
361
+ const now = Date.now();
362
+ p.status = SSCH_PROFILE_MATURITY_V2.ARCHIVED;
363
+ p.updatedAt = now;
364
+ if (!p.archivedAt) p.archivedAt = now;
365
+ return { ...p, metadata: { ...p.metadata } };
366
+ }
367
+ export function touchSschProfileV2(id) {
368
+ const p = _sschPsV2.get(id);
369
+ if (!p) throw new Error(`ssch profile ${id} not found`);
370
+ if (_sschPTerminal.has(p.status))
371
+ throw new Error(`cannot touch terminal ssch profile ${id}`);
372
+ const now = Date.now();
373
+ p.lastTouchedAt = now;
374
+ p.updatedAt = now;
375
+ return { ...p, metadata: { ...p.metadata } };
376
+ }
377
+ export function getSschProfileV2(id) {
378
+ const p = _sschPsV2.get(id);
379
+ if (!p) return null;
380
+ return { ...p, metadata: { ...p.metadata } };
381
+ }
382
+ export function listSschProfilesV2() {
383
+ return [..._sschPsV2.values()].map((p) => ({
384
+ ...p,
385
+ metadata: { ...p.metadata },
386
+ }));
387
+ }
388
+ function _sschCountPending(profileId) {
389
+ let n = 0;
390
+ for (const q of _sschQsV2.values())
391
+ if (
392
+ q.profileId === profileId &&
393
+ (q.status === SSCH_QUERY_LIFECYCLE_V2.QUEUED ||
394
+ q.status === SSCH_QUERY_LIFECYCLE_V2.SEARCHING)
395
+ )
396
+ n++;
397
+ return n;
398
+ }
253
399
  export function createSschQueryV2({ id, profileId, q, metadata } = {}) {
254
- if (!id) throw new Error("ssch query id required"); if (!profileId) throw new Error("ssch query profileId required");
400
+ if (!id) throw new Error("ssch query id required");
401
+ if (!profileId) throw new Error("ssch query profileId required");
255
402
  if (_sschQsV2.has(id)) throw new Error(`ssch query ${id} already exists`);
256
- if (!_sschPsV2.has(profileId)) throw new Error(`ssch profile ${profileId} not found`);
257
- if (_sschCountPending(profileId) >= _sschMaxPending) throw new Error(`max pending ssch queries for profile ${profileId} reached`);
403
+ if (!_sschPsV2.has(profileId))
404
+ throw new Error(`ssch profile ${profileId} not found`);
405
+ if (_sschCountPending(profileId) >= _sschMaxPending)
406
+ throw new Error(
407
+ `max pending ssch queries for profile ${profileId} reached`,
408
+ );
258
409
  const now = Date.now();
259
- const r = { id, profileId, q: q || "", status: SSCH_QUERY_LIFECYCLE_V2.QUEUED, createdAt: now, updatedAt: now, startedAt: null, settledAt: null, metadata: { ...(metadata || {}) } };
260
- _sschQsV2.set(id, r); return { ...r, metadata: { ...r.metadata } };
261
- }
262
- export function searchingSschQueryV2(id) { const r = _sschQsV2.get(id); if (!r) throw new Error(`ssch query ${id} not found`); _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.SEARCHING); const now = Date.now(); r.status = SSCH_QUERY_LIFECYCLE_V2.SEARCHING; r.updatedAt = now; if (!r.startedAt) r.startedAt = now; return { ...r, metadata: { ...r.metadata } }; }
263
- export function completeSschQueryV2(id) { const r = _sschQsV2.get(id); if (!r) throw new Error(`ssch query ${id} not found`); _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.COMPLETED); const now = Date.now(); r.status = SSCH_QUERY_LIFECYCLE_V2.COMPLETED; r.updatedAt = now; if (!r.settledAt) r.settledAt = now; return { ...r, metadata: { ...r.metadata } }; }
264
- export function failSschQueryV2(id, reason) { const r = _sschQsV2.get(id); if (!r) throw new Error(`ssch query ${id} not found`); _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.FAILED); const now = Date.now(); r.status = SSCH_QUERY_LIFECYCLE_V2.FAILED; r.updatedAt = now; if (!r.settledAt) r.settledAt = now; if (reason) r.metadata.failReason = String(reason); return { ...r, metadata: { ...r.metadata } }; }
265
- export function cancelSschQueryV2(id, reason) { const r = _sschQsV2.get(id); if (!r) throw new Error(`ssch query ${id} not found`); _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.CANCELLED); const now = Date.now(); r.status = SSCH_QUERY_LIFECYCLE_V2.CANCELLED; r.updatedAt = now; if (!r.settledAt) r.settledAt = now; if (reason) r.metadata.cancelReason = String(reason); return { ...r, metadata: { ...r.metadata } }; }
266
- export function getSschQueryV2(id) { const r = _sschQsV2.get(id); if (!r) return null; return { ...r, metadata: { ...r.metadata } }; }
267
- export function listSschQueriesV2() { return [..._sschQsV2.values()].map((r) => ({ ...r, metadata: { ...r.metadata } })); }
268
- export function autoStaleIdleSschProfilesV2({ now } = {}) { const t = now ?? Date.now(); const flipped = []; for (const p of _sschPsV2.values()) if (p.status === SSCH_PROFILE_MATURITY_V2.ACTIVE && (t - p.lastTouchedAt) >= _sschIdleMs) { p.status = SSCH_PROFILE_MATURITY_V2.STALE; p.updatedAt = t; flipped.push(p.id); } return { flipped, count: flipped.length }; }
269
- export function autoFailStuckSschQueriesV2({ now } = {}) { const t = now ?? Date.now(); const flipped = []; for (const r of _sschQsV2.values()) if (r.status === SSCH_QUERY_LIFECYCLE_V2.SEARCHING && r.startedAt != null && (t - r.startedAt) >= _sschStuckMs) { r.status = SSCH_QUERY_LIFECYCLE_V2.FAILED; r.updatedAt = t; if (!r.settledAt) r.settledAt = t; r.metadata.failReason = "auto-fail-stuck"; flipped.push(r.id); } return { flipped, count: flipped.length }; }
410
+ const r = {
411
+ id,
412
+ profileId,
413
+ q: q || "",
414
+ status: SSCH_QUERY_LIFECYCLE_V2.QUEUED,
415
+ createdAt: now,
416
+ updatedAt: now,
417
+ startedAt: null,
418
+ settledAt: null,
419
+ metadata: { ...(metadata || {}) },
420
+ };
421
+ _sschQsV2.set(id, r);
422
+ return { ...r, metadata: { ...r.metadata } };
423
+ }
424
+ export function searchingSschQueryV2(id) {
425
+ const r = _sschQsV2.get(id);
426
+ if (!r) throw new Error(`ssch query ${id} not found`);
427
+ _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.SEARCHING);
428
+ const now = Date.now();
429
+ r.status = SSCH_QUERY_LIFECYCLE_V2.SEARCHING;
430
+ r.updatedAt = now;
431
+ if (!r.startedAt) r.startedAt = now;
432
+ return { ...r, metadata: { ...r.metadata } };
433
+ }
434
+ export function completeSschQueryV2(id) {
435
+ const r = _sschQsV2.get(id);
436
+ if (!r) throw new Error(`ssch query ${id} not found`);
437
+ _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.COMPLETED);
438
+ const now = Date.now();
439
+ r.status = SSCH_QUERY_LIFECYCLE_V2.COMPLETED;
440
+ r.updatedAt = now;
441
+ if (!r.settledAt) r.settledAt = now;
442
+ return { ...r, metadata: { ...r.metadata } };
443
+ }
444
+ export function failSschQueryV2(id, reason) {
445
+ const r = _sschQsV2.get(id);
446
+ if (!r) throw new Error(`ssch query ${id} not found`);
447
+ _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.FAILED);
448
+ const now = Date.now();
449
+ r.status = SSCH_QUERY_LIFECYCLE_V2.FAILED;
450
+ r.updatedAt = now;
451
+ if (!r.settledAt) r.settledAt = now;
452
+ if (reason) r.metadata.failReason = String(reason);
453
+ return { ...r, metadata: { ...r.metadata } };
454
+ }
455
+ export function cancelSschQueryV2(id, reason) {
456
+ const r = _sschQsV2.get(id);
457
+ if (!r) throw new Error(`ssch query ${id} not found`);
458
+ _sschCheckQ(r.status, SSCH_QUERY_LIFECYCLE_V2.CANCELLED);
459
+ const now = Date.now();
460
+ r.status = SSCH_QUERY_LIFECYCLE_V2.CANCELLED;
461
+ r.updatedAt = now;
462
+ if (!r.settledAt) r.settledAt = now;
463
+ if (reason) r.metadata.cancelReason = String(reason);
464
+ return { ...r, metadata: { ...r.metadata } };
465
+ }
466
+ export function getSschQueryV2(id) {
467
+ const r = _sschQsV2.get(id);
468
+ if (!r) return null;
469
+ return { ...r, metadata: { ...r.metadata } };
470
+ }
471
+ export function listSschQueriesV2() {
472
+ return [..._sschQsV2.values()].map((r) => ({
473
+ ...r,
474
+ metadata: { ...r.metadata },
475
+ }));
476
+ }
477
+ export function autoStaleIdleSschProfilesV2({ now } = {}) {
478
+ const t = now ?? Date.now();
479
+ const flipped = [];
480
+ for (const p of _sschPsV2.values())
481
+ if (
482
+ p.status === SSCH_PROFILE_MATURITY_V2.ACTIVE &&
483
+ t - p.lastTouchedAt >= _sschIdleMs
484
+ ) {
485
+ p.status = SSCH_PROFILE_MATURITY_V2.STALE;
486
+ p.updatedAt = t;
487
+ flipped.push(p.id);
488
+ }
489
+ return { flipped, count: flipped.length };
490
+ }
491
+ export function autoFailStuckSschQueriesV2({ now } = {}) {
492
+ const t = now ?? Date.now();
493
+ const flipped = [];
494
+ for (const r of _sschQsV2.values())
495
+ if (
496
+ r.status === SSCH_QUERY_LIFECYCLE_V2.SEARCHING &&
497
+ r.startedAt != null &&
498
+ t - r.startedAt >= _sschStuckMs
499
+ ) {
500
+ r.status = SSCH_QUERY_LIFECYCLE_V2.FAILED;
501
+ r.updatedAt = t;
502
+ if (!r.settledAt) r.settledAt = t;
503
+ r.metadata.failReason = "auto-fail-stuck";
504
+ flipped.push(r.id);
505
+ }
506
+ return { flipped, count: flipped.length };
507
+ }
270
508
  export function getSessionSearchGovStatsV2() {
271
- const profilesByStatus = {}; for (const v of Object.values(SSCH_PROFILE_MATURITY_V2)) profilesByStatus[v] = 0; for (const p of _sschPsV2.values()) profilesByStatus[p.status]++;
272
- const queriesByStatus = {}; for (const v of Object.values(SSCH_QUERY_LIFECYCLE_V2)) queriesByStatus[v] = 0; for (const r of _sschQsV2.values()) queriesByStatus[r.status]++;
273
- return { totalSschProfilesV2: _sschPsV2.size, totalSschQueriesV2: _sschQsV2.size, maxActiveSschProfilesPerOwner: _sschMaxActive, maxPendingSschQueriesPerProfile: _sschMaxPending, sschProfileIdleMs: _sschIdleMs, sschQueryStuckMs: _sschStuckMs, profilesByStatus, queriesByStatus };
509
+ const profilesByStatus = {};
510
+ for (const v of Object.values(SSCH_PROFILE_MATURITY_V2))
511
+ profilesByStatus[v] = 0;
512
+ for (const p of _sschPsV2.values()) profilesByStatus[p.status]++;
513
+ const queriesByStatus = {};
514
+ for (const v of Object.values(SSCH_QUERY_LIFECYCLE_V2))
515
+ queriesByStatus[v] = 0;
516
+ for (const r of _sschQsV2.values()) queriesByStatus[r.status]++;
517
+ return {
518
+ totalSschProfilesV2: _sschPsV2.size,
519
+ totalSschQueriesV2: _sschQsV2.size,
520
+ maxActiveSschProfilesPerOwner: _sschMaxActive,
521
+ maxPendingSschQueriesPerProfile: _sschMaxPending,
522
+ sschProfileIdleMs: _sschIdleMs,
523
+ sschQueryStuckMs: _sschStuckMs,
524
+ profilesByStatus,
525
+ queriesByStatus,
526
+ };
274
527
  }