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.
- package/package.json +1 -1
- package/src/commands/a2a.js +196 -28
- package/src/commands/activitypub.js +157 -27
- package/src/commands/agent.js +587 -103
- package/src/commands/audit.js +206 -0
- package/src/commands/bi.js +152 -27
- package/src/commands/bm25.js +111 -27
- package/src/commands/browse.js +190 -29
- package/src/commands/ccron.js +128 -28
- package/src/commands/chat.js +207 -0
- package/src/commands/compliance.js +414 -34
- package/src/commands/compt.js +127 -29
- package/src/commands/consol.js +8 -2
- package/src/commands/cowork.js +580 -34
- package/src/commands/crosschain.js +182 -28
- package/src/commands/dao.js +182 -28
- package/src/commands/dlp.js +172 -27
- package/src/commands/economy.js +205 -50
- package/src/commands/evolution.js +203 -50
- package/src/commands/evomap.js +182 -27
- package/src/commands/fflag.js +74 -22
- package/src/commands/git.js +177 -37
- package/src/commands/hardening.js +209 -0
- package/src/commands/hmemory.js +204 -50
- package/src/commands/incentive.js +209 -0
- package/src/commands/inference.js +170 -34
- package/src/commands/itbudget.js +149 -33
- package/src/commands/kg.js +206 -0
- package/src/commands/lowcode.js +195 -38
- package/src/commands/marketplace.js +206 -0
- package/src/commands/matrix.js +179 -27
- package/src/commands/mcpscaf.js +145 -33
- package/src/commands/meminj.js +145 -33
- package/src/commands/nostr.js +178 -27
- package/src/commands/orchestrate.js +217 -0
- package/src/commands/orchgov.js +144 -33
- package/src/commands/pdfp.js +109 -27
- package/src/commands/perf.js +169 -32
- package/src/commands/perm.js +144 -33
- package/src/commands/pipeline.js +207 -52
- package/src/commands/planmode.js +141 -32
- package/src/commands/privacy.js +203 -0
- package/src/commands/promcomp.js +111 -27
- package/src/commands/recommend.js +177 -34
- package/src/commands/reputation.js +208 -0
- package/src/commands/sandbox.js +206 -0
- package/src/commands/seshhook.js +145 -33
- package/src/commands/seshsearch.js +141 -33
- package/src/commands/seshtail.js +144 -33
- package/src/commands/seshu.js +152 -33
- package/src/commands/sganal.js +123 -29
- package/src/commands/siem.js +201 -34
- package/src/commands/sla.js +212 -0
- package/src/commands/slotfill.js +146 -33
- package/src/commands/social.js +157 -32
- package/src/commands/stress.js +206 -0
- package/src/commands/svccont.js +145 -33
- package/src/commands/terraform.js +206 -0
- package/src/commands/tms.js +171 -33
- package/src/commands/topiccls.js +146 -33
- package/src/commands/uprof.js +141 -32
- package/src/commands/vcheck.js +122 -28
- package/src/commands/webfetch.js +141 -32
- package/src/commands/zkp.js +184 -28
- package/src/index.js +40 -0
- package/src/lib/a2a-protocol.js +319 -51
- package/src/lib/activitypub-bridge.js +288 -50
- package/src/lib/agent-economy.js +304 -51
- package/src/lib/app-builder.js +279 -46
- package/src/lib/audit-logger.js +321 -0
- package/src/lib/autonomous-agent.js +284 -48
- package/src/lib/bi-engine.js +283 -49
- package/src/lib/bm25-search.js +301 -49
- package/src/lib/browser-automation.js +296 -49
- package/src/lib/chat-core.js +336 -0
- package/src/lib/claude-code-bridge.js +341 -0
- package/src/lib/compliance-framework-reporter.js +305 -51
- package/src/lib/compliance-manager.js +330 -0
- package/src/lib/compression-telemetry.js +301 -49
- package/src/lib/content-recommender.js +317 -52
- package/src/lib/cowork-cron.js +298 -49
- package/src/lib/cowork-learning.js +333 -0
- package/src/lib/cowork-task-runner.js +308 -51
- package/src/lib/cowork-workflow.js +327 -0
- package/src/lib/cross-chain.js +311 -51
- package/src/lib/dao-governance.js +280 -46
- package/src/lib/dlp-engine.js +287 -49
- package/src/lib/evolution-system.js +278 -47
- package/src/lib/evomap-manager.js +280 -46
- package/src/lib/execution-backend.js +294 -48
- package/src/lib/feature-flags.js +294 -49
- package/src/lib/git-integration.js +285 -47
- package/src/lib/hardening-manager.js +341 -0
- package/src/lib/hierarchical-memory.js +284 -48
- package/src/lib/inference-network.js +308 -51
- package/src/lib/iteration-budget.js +302 -50
- package/src/lib/knowledge-graph.js +333 -0
- package/src/lib/matrix-bridge.js +281 -47
- package/src/lib/mcp-scaffold.js +318 -54
- package/src/lib/memory-injection.js +288 -49
- package/src/lib/nostr-bridge.js +286 -49
- package/src/lib/orchestrator.js +293 -48
- package/src/lib/pdf-parser.js +298 -49
- package/src/lib/perf-tuning.js +309 -50
- package/src/lib/permission-engine.js +287 -49
- package/src/lib/pipeline-orchestrator.js +289 -49
- package/src/lib/plan-mode.js +298 -51
- package/src/lib/privacy-computing.js +335 -0
- package/src/lib/reputation-optimizer.js +340 -0
- package/src/lib/sandbox-v2.js +327 -0
- package/src/lib/service-container.js +313 -52
- package/src/lib/session-consolidator.js +296 -49
- package/src/lib/session-hooks.js +312 -53
- package/src/lib/session-search.js +304 -51
- package/src/lib/session-tail.js +288 -49
- package/src/lib/session-usage.js +298 -52
- package/src/lib/siem-exporter.js +298 -51
- package/src/lib/skill-marketplace.js +345 -0
- package/src/lib/sla-manager.js +341 -0
- package/src/lib/slot-filler.js +303 -51
- package/src/lib/social-graph-analytics.js +295 -49
- package/src/lib/social-graph.js +272 -49
- package/src/lib/stress-tester.js +342 -0
- package/src/lib/sub-agent-registry.js +302 -53
- package/src/lib/task-model-selector.js +302 -50
- package/src/lib/terraform-manager.js +333 -0
- package/src/lib/todo-manager.js +281 -47
- package/src/lib/token-incentive.js +341 -0
- package/src/lib/topic-classifier.js +297 -49
- package/src/lib/user-profile.js +294 -50
- package/src/lib/version-checker.js +304 -50
- package/src/lib/web-fetch.js +292 -51
- 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",
|
|
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",
|
|
203
|
+
QUEUED: "queued",
|
|
204
|
+
SEARCHING: "searching",
|
|
205
|
+
COMPLETED: "completed",
|
|
206
|
+
FAILED: "failed",
|
|
207
|
+
CANCELLED: "cancelled",
|
|
201
208
|
});
|
|
202
209
|
const _sschPTrans = new Map([
|
|
203
|
-
[
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
[
|
|
211
|
-
|
|
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,
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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");
|
|
233
|
-
if (
|
|
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 = {
|
|
236
|
-
|
|
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);
|
|
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)
|
|
244
|
-
|
|
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
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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");
|
|
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))
|
|
257
|
-
|
|
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 = {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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 = {};
|
|
272
|
-
|
|
273
|
-
|
|
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
|
}
|