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
package/src/lib/user-profile.js
CHANGED
|
@@ -173,81 +173,325 @@ export const MAX_USER_PROFILE_LENGTH = MAX_PROFILE_LENGTH;
|
|
|
173
173
|
|
|
174
174
|
// ===== V2 Surface: User Profile governance overlay (CLI v0.141.0) =====
|
|
175
175
|
export const USER_PROFILE_MATURITY_V2 = Object.freeze({
|
|
176
|
-
PENDING: "pending",
|
|
176
|
+
PENDING: "pending",
|
|
177
|
+
ACTIVE: "active",
|
|
178
|
+
DORMANT: "dormant",
|
|
179
|
+
ARCHIVED: "archived",
|
|
177
180
|
});
|
|
178
181
|
export const USER_PREF_LIFECYCLE_V2 = Object.freeze({
|
|
179
|
-
PROPOSED: "proposed",
|
|
182
|
+
PROPOSED: "proposed",
|
|
183
|
+
APPLIED: "applied",
|
|
184
|
+
REJECTED: "rejected",
|
|
185
|
+
SUPERSEDED: "superseded",
|
|
186
|
+
CANCELLED: "cancelled",
|
|
180
187
|
});
|
|
181
188
|
const _upTrans = new Map([
|
|
182
|
-
[
|
|
183
|
-
|
|
184
|
-
|
|
189
|
+
[
|
|
190
|
+
USER_PROFILE_MATURITY_V2.PENDING,
|
|
191
|
+
new Set([
|
|
192
|
+
USER_PROFILE_MATURITY_V2.ACTIVE,
|
|
193
|
+
USER_PROFILE_MATURITY_V2.ARCHIVED,
|
|
194
|
+
]),
|
|
195
|
+
],
|
|
196
|
+
[
|
|
197
|
+
USER_PROFILE_MATURITY_V2.ACTIVE,
|
|
198
|
+
new Set([
|
|
199
|
+
USER_PROFILE_MATURITY_V2.DORMANT,
|
|
200
|
+
USER_PROFILE_MATURITY_V2.ARCHIVED,
|
|
201
|
+
]),
|
|
202
|
+
],
|
|
203
|
+
[
|
|
204
|
+
USER_PROFILE_MATURITY_V2.DORMANT,
|
|
205
|
+
new Set([
|
|
206
|
+
USER_PROFILE_MATURITY_V2.ACTIVE,
|
|
207
|
+
USER_PROFILE_MATURITY_V2.ARCHIVED,
|
|
208
|
+
]),
|
|
209
|
+
],
|
|
185
210
|
[USER_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
186
211
|
]);
|
|
187
212
|
const _upTerminal = new Set([USER_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
188
213
|
const _uprefTrans = new Map([
|
|
189
|
-
[
|
|
190
|
-
|
|
214
|
+
[
|
|
215
|
+
USER_PREF_LIFECYCLE_V2.PROPOSED,
|
|
216
|
+
new Set([
|
|
217
|
+
USER_PREF_LIFECYCLE_V2.APPLIED,
|
|
218
|
+
USER_PREF_LIFECYCLE_V2.REJECTED,
|
|
219
|
+
USER_PREF_LIFECYCLE_V2.CANCELLED,
|
|
220
|
+
]),
|
|
221
|
+
],
|
|
222
|
+
[
|
|
223
|
+
USER_PREF_LIFECYCLE_V2.APPLIED,
|
|
224
|
+
new Set([USER_PREF_LIFECYCLE_V2.SUPERSEDED]),
|
|
225
|
+
],
|
|
191
226
|
[USER_PREF_LIFECYCLE_V2.REJECTED, new Set()],
|
|
192
227
|
[USER_PREF_LIFECYCLE_V2.SUPERSEDED, new Set()],
|
|
193
228
|
[USER_PREF_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
194
229
|
]);
|
|
195
230
|
const _upsV2 = new Map();
|
|
196
231
|
const _uprefsV2 = new Map();
|
|
197
|
-
let _upMaxActivePerOwner = 5,
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
232
|
+
let _upMaxActivePerOwner = 5,
|
|
233
|
+
_upMaxPendingPrefsPerProfile = 20,
|
|
234
|
+
_upIdleMs = 90 * 24 * 60 * 60 * 1000,
|
|
235
|
+
_uprefStuckMs = 7 * 24 * 60 * 60 * 1000;
|
|
236
|
+
function _upPos(n, label) {
|
|
237
|
+
const v = Math.floor(Number(n));
|
|
238
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
239
|
+
throw new Error(`${label} must be positive integer`);
|
|
240
|
+
return v;
|
|
241
|
+
}
|
|
242
|
+
function _upCheckP(from, to) {
|
|
243
|
+
const a = _upTrans.get(from);
|
|
244
|
+
if (!a || !a.has(to))
|
|
245
|
+
throw new Error(`invalid user profile transition ${from} → ${to}`);
|
|
246
|
+
}
|
|
247
|
+
function _uprefCheck(from, to) {
|
|
248
|
+
const a = _uprefTrans.get(from);
|
|
249
|
+
if (!a || !a.has(to))
|
|
250
|
+
throw new Error(`invalid user pref transition ${from} → ${to}`);
|
|
251
|
+
}
|
|
252
|
+
export function setMaxActiveUserProfilesPerOwnerV2(n) {
|
|
253
|
+
_upMaxActivePerOwner = _upPos(n, "maxActiveUserProfilesPerOwner");
|
|
254
|
+
}
|
|
255
|
+
export function getMaxActiveUserProfilesPerOwnerV2() {
|
|
256
|
+
return _upMaxActivePerOwner;
|
|
257
|
+
}
|
|
258
|
+
export function setMaxPendingUserPrefsPerProfileV2(n) {
|
|
259
|
+
_upMaxPendingPrefsPerProfile = _upPos(n, "maxPendingUserPrefsPerProfile");
|
|
260
|
+
}
|
|
261
|
+
export function getMaxPendingUserPrefsPerProfileV2() {
|
|
262
|
+
return _upMaxPendingPrefsPerProfile;
|
|
263
|
+
}
|
|
264
|
+
export function setUserProfileIdleMsV2(n) {
|
|
265
|
+
_upIdleMs = _upPos(n, "userProfileIdleMs");
|
|
266
|
+
}
|
|
267
|
+
export function getUserProfileIdleMsV2() {
|
|
268
|
+
return _upIdleMs;
|
|
269
|
+
}
|
|
270
|
+
export function setUserPrefStuckMsV2(n) {
|
|
271
|
+
_uprefStuckMs = _upPos(n, "userPrefStuckMs");
|
|
272
|
+
}
|
|
273
|
+
export function getUserPrefStuckMsV2() {
|
|
274
|
+
return _uprefStuckMs;
|
|
275
|
+
}
|
|
276
|
+
export function _resetStateUserProfileV2() {
|
|
277
|
+
_upsV2.clear();
|
|
278
|
+
_uprefsV2.clear();
|
|
279
|
+
_upMaxActivePerOwner = 5;
|
|
280
|
+
_upMaxPendingPrefsPerProfile = 20;
|
|
281
|
+
_upIdleMs = 90 * 24 * 60 * 60 * 1000;
|
|
282
|
+
_uprefStuckMs = 7 * 24 * 60 * 60 * 1000;
|
|
283
|
+
}
|
|
210
284
|
export function registerUserProfileV2({ id, owner, handle, metadata } = {}) {
|
|
211
|
-
if (!id) throw new Error("user profile id required");
|
|
285
|
+
if (!id) throw new Error("user profile id required");
|
|
286
|
+
if (!owner) throw new Error("user profile owner required");
|
|
212
287
|
if (_upsV2.has(id)) throw new Error(`user profile ${id} already registered`);
|
|
213
288
|
const now = Date.now();
|
|
214
|
-
const p = {
|
|
215
|
-
|
|
289
|
+
const p = {
|
|
290
|
+
id,
|
|
291
|
+
owner,
|
|
292
|
+
handle: handle || id,
|
|
293
|
+
status: USER_PROFILE_MATURITY_V2.PENDING,
|
|
294
|
+
createdAt: now,
|
|
295
|
+
updatedAt: now,
|
|
296
|
+
activatedAt: null,
|
|
297
|
+
archivedAt: null,
|
|
298
|
+
lastTouchedAt: now,
|
|
299
|
+
metadata: { ...(metadata || {}) },
|
|
300
|
+
};
|
|
301
|
+
_upsV2.set(id, p);
|
|
302
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
303
|
+
}
|
|
304
|
+
function _upCountActive(owner) {
|
|
305
|
+
let n = 0;
|
|
306
|
+
for (const p of _upsV2.values())
|
|
307
|
+
if (p.owner === owner && p.status === USER_PROFILE_MATURITY_V2.ACTIVE) n++;
|
|
308
|
+
return n;
|
|
216
309
|
}
|
|
217
|
-
function _upCountActive(owner) { let n = 0; for (const p of _upsV2.values()) if (p.owner === owner && p.status === USER_PROFILE_MATURITY_V2.ACTIVE) n++; return n; }
|
|
218
310
|
export function activateUserProfileV2(id) {
|
|
219
|
-
const p = _upsV2.get(id);
|
|
311
|
+
const p = _upsV2.get(id);
|
|
312
|
+
if (!p) throw new Error(`user profile ${id} not found`);
|
|
220
313
|
_upCheckP(p.status, USER_PROFILE_MATURITY_V2.ACTIVE);
|
|
221
314
|
const recovery = p.status === USER_PROFILE_MATURITY_V2.DORMANT;
|
|
222
|
-
if (!recovery && _upCountActive(p.owner) >= _upMaxActivePerOwner)
|
|
223
|
-
|
|
315
|
+
if (!recovery && _upCountActive(p.owner) >= _upMaxActivePerOwner)
|
|
316
|
+
throw new Error(`max active user profiles for owner ${p.owner} reached`);
|
|
317
|
+
const now = Date.now();
|
|
318
|
+
p.status = USER_PROFILE_MATURITY_V2.ACTIVE;
|
|
319
|
+
p.updatedAt = now;
|
|
320
|
+
p.lastTouchedAt = now;
|
|
321
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
322
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
323
|
+
}
|
|
324
|
+
export function dormantUserProfileV2(id) {
|
|
325
|
+
const p = _upsV2.get(id);
|
|
326
|
+
if (!p) throw new Error(`user profile ${id} not found`);
|
|
327
|
+
_upCheckP(p.status, USER_PROFILE_MATURITY_V2.DORMANT);
|
|
328
|
+
p.status = USER_PROFILE_MATURITY_V2.DORMANT;
|
|
329
|
+
p.updatedAt = Date.now();
|
|
330
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
331
|
+
}
|
|
332
|
+
export function archiveUserProfileV2(id) {
|
|
333
|
+
const p = _upsV2.get(id);
|
|
334
|
+
if (!p) throw new Error(`user profile ${id} not found`);
|
|
335
|
+
_upCheckP(p.status, USER_PROFILE_MATURITY_V2.ARCHIVED);
|
|
336
|
+
const now = Date.now();
|
|
337
|
+
p.status = USER_PROFILE_MATURITY_V2.ARCHIVED;
|
|
338
|
+
p.updatedAt = now;
|
|
339
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
340
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
341
|
+
}
|
|
342
|
+
export function touchUserProfileV2(id) {
|
|
343
|
+
const p = _upsV2.get(id);
|
|
344
|
+
if (!p) throw new Error(`user profile ${id} not found`);
|
|
345
|
+
if (_upTerminal.has(p.status))
|
|
346
|
+
throw new Error(`cannot touch terminal user profile ${id}`);
|
|
347
|
+
const now = Date.now();
|
|
348
|
+
p.lastTouchedAt = now;
|
|
349
|
+
p.updatedAt = now;
|
|
350
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
351
|
+
}
|
|
352
|
+
export function getUserProfileV2(id) {
|
|
353
|
+
const p = _upsV2.get(id);
|
|
354
|
+
if (!p) return null;
|
|
224
355
|
return { ...p, metadata: { ...p.metadata } };
|
|
225
356
|
}
|
|
226
|
-
export function
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
357
|
+
export function listUserProfilesV2() {
|
|
358
|
+
return [..._upsV2.values()].map((p) => ({
|
|
359
|
+
...p,
|
|
360
|
+
metadata: { ...p.metadata },
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
363
|
+
function _uprefCountPending(profileId) {
|
|
364
|
+
let n = 0;
|
|
365
|
+
for (const r of _uprefsV2.values())
|
|
366
|
+
if (
|
|
367
|
+
r.profileId === profileId &&
|
|
368
|
+
r.status === USER_PREF_LIFECYCLE_V2.PROPOSED
|
|
369
|
+
)
|
|
370
|
+
n++;
|
|
371
|
+
return n;
|
|
372
|
+
}
|
|
232
373
|
export function createUserPrefV2({ id, profileId, key, metadata } = {}) {
|
|
233
|
-
if (!id) throw new Error("user pref id required");
|
|
374
|
+
if (!id) throw new Error("user pref id required");
|
|
375
|
+
if (!profileId) throw new Error("user pref profileId required");
|
|
234
376
|
if (_uprefsV2.has(id)) throw new Error(`user pref ${id} already exists`);
|
|
235
|
-
if (!_upsV2.has(profileId))
|
|
236
|
-
|
|
377
|
+
if (!_upsV2.has(profileId))
|
|
378
|
+
throw new Error(`user profile ${profileId} not found`);
|
|
379
|
+
if (_uprefCountPending(profileId) >= _upMaxPendingPrefsPerProfile)
|
|
380
|
+
throw new Error(`max pending user prefs for profile ${profileId} reached`);
|
|
381
|
+
const now = Date.now();
|
|
382
|
+
const r = {
|
|
383
|
+
id,
|
|
384
|
+
profileId,
|
|
385
|
+
key: key || "",
|
|
386
|
+
status: USER_PREF_LIFECYCLE_V2.PROPOSED,
|
|
387
|
+
createdAt: now,
|
|
388
|
+
updatedAt: now,
|
|
389
|
+
startedAt: now,
|
|
390
|
+
settledAt: null,
|
|
391
|
+
metadata: { ...(metadata || {}) },
|
|
392
|
+
};
|
|
393
|
+
_uprefsV2.set(id, r);
|
|
394
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
395
|
+
}
|
|
396
|
+
export function applyUserPrefV2(id) {
|
|
397
|
+
const r = _uprefsV2.get(id);
|
|
398
|
+
if (!r) throw new Error(`user pref ${id} not found`);
|
|
399
|
+
_uprefCheck(r.status, USER_PREF_LIFECYCLE_V2.APPLIED);
|
|
400
|
+
const now = Date.now();
|
|
401
|
+
r.status = USER_PREF_LIFECYCLE_V2.APPLIED;
|
|
402
|
+
r.updatedAt = now;
|
|
403
|
+
if (!r.settledAt) r.settledAt = now;
|
|
404
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
405
|
+
}
|
|
406
|
+
export function rejectUserPrefV2(id, reason) {
|
|
407
|
+
const r = _uprefsV2.get(id);
|
|
408
|
+
if (!r) throw new Error(`user pref ${id} not found`);
|
|
409
|
+
_uprefCheck(r.status, USER_PREF_LIFECYCLE_V2.REJECTED);
|
|
410
|
+
const now = Date.now();
|
|
411
|
+
r.status = USER_PREF_LIFECYCLE_V2.REJECTED;
|
|
412
|
+
r.updatedAt = now;
|
|
413
|
+
if (!r.settledAt) r.settledAt = now;
|
|
414
|
+
if (reason) r.metadata.rejectReason = String(reason);
|
|
415
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
416
|
+
}
|
|
417
|
+
export function supersedeUserPrefV2(id) {
|
|
418
|
+
const r = _uprefsV2.get(id);
|
|
419
|
+
if (!r) throw new Error(`user pref ${id} not found`);
|
|
420
|
+
_uprefCheck(r.status, USER_PREF_LIFECYCLE_V2.SUPERSEDED);
|
|
237
421
|
const now = Date.now();
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
export function
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
422
|
+
r.status = USER_PREF_LIFECYCLE_V2.SUPERSEDED;
|
|
423
|
+
r.updatedAt = now;
|
|
424
|
+
if (!r.settledAt) r.settledAt = now;
|
|
425
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
426
|
+
}
|
|
427
|
+
export function cancelUserPrefV2(id, reason) {
|
|
428
|
+
const r = _uprefsV2.get(id);
|
|
429
|
+
if (!r) throw new Error(`user pref ${id} not found`);
|
|
430
|
+
_uprefCheck(r.status, USER_PREF_LIFECYCLE_V2.CANCELLED);
|
|
431
|
+
const now = Date.now();
|
|
432
|
+
r.status = USER_PREF_LIFECYCLE_V2.CANCELLED;
|
|
433
|
+
r.updatedAt = now;
|
|
434
|
+
if (!r.settledAt) r.settledAt = now;
|
|
435
|
+
if (reason) r.metadata.cancelReason = String(reason);
|
|
436
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
437
|
+
}
|
|
438
|
+
export function getUserPrefV2(id) {
|
|
439
|
+
const r = _uprefsV2.get(id);
|
|
440
|
+
if (!r) return null;
|
|
441
|
+
return { ...r, metadata: { ...r.metadata } };
|
|
442
|
+
}
|
|
443
|
+
export function listUserPrefsV2() {
|
|
444
|
+
return [..._uprefsV2.values()].map((r) => ({
|
|
445
|
+
...r,
|
|
446
|
+
metadata: { ...r.metadata },
|
|
447
|
+
}));
|
|
448
|
+
}
|
|
449
|
+
export function autoDormantIdleUserProfilesV2({ now } = {}) {
|
|
450
|
+
const t = now ?? Date.now();
|
|
451
|
+
const flipped = [];
|
|
452
|
+
for (const p of _upsV2.values())
|
|
453
|
+
if (
|
|
454
|
+
p.status === USER_PROFILE_MATURITY_V2.ACTIVE &&
|
|
455
|
+
t - p.lastTouchedAt >= _upIdleMs
|
|
456
|
+
) {
|
|
457
|
+
p.status = USER_PROFILE_MATURITY_V2.DORMANT;
|
|
458
|
+
p.updatedAt = t;
|
|
459
|
+
flipped.push(p.id);
|
|
460
|
+
}
|
|
461
|
+
return { flipped, count: flipped.length };
|
|
462
|
+
}
|
|
463
|
+
export function autoCancelStaleUserPrefsV2({ now } = {}) {
|
|
464
|
+
const t = now ?? Date.now();
|
|
465
|
+
const flipped = [];
|
|
466
|
+
for (const r of _uprefsV2.values())
|
|
467
|
+
if (
|
|
468
|
+
r.status === USER_PREF_LIFECYCLE_V2.PROPOSED &&
|
|
469
|
+
t - r.startedAt >= _uprefStuckMs
|
|
470
|
+
) {
|
|
471
|
+
r.status = USER_PREF_LIFECYCLE_V2.CANCELLED;
|
|
472
|
+
r.updatedAt = t;
|
|
473
|
+
if (!r.settledAt) r.settledAt = t;
|
|
474
|
+
r.metadata.cancelReason = "auto-cancel-stale";
|
|
475
|
+
flipped.push(r.id);
|
|
476
|
+
}
|
|
477
|
+
return { flipped, count: flipped.length };
|
|
478
|
+
}
|
|
249
479
|
export function getUserProfileGovStatsV2() {
|
|
250
|
-
const profilesByStatus = {};
|
|
251
|
-
|
|
252
|
-
|
|
480
|
+
const profilesByStatus = {};
|
|
481
|
+
for (const v of Object.values(USER_PROFILE_MATURITY_V2))
|
|
482
|
+
profilesByStatus[v] = 0;
|
|
483
|
+
for (const p of _upsV2.values()) profilesByStatus[p.status]++;
|
|
484
|
+
const prefsByStatus = {};
|
|
485
|
+
for (const v of Object.values(USER_PREF_LIFECYCLE_V2)) prefsByStatus[v] = 0;
|
|
486
|
+
for (const r of _uprefsV2.values()) prefsByStatus[r.status]++;
|
|
487
|
+
return {
|
|
488
|
+
totalUserProfilesV2: _upsV2.size,
|
|
489
|
+
totalUserPrefsV2: _uprefsV2.size,
|
|
490
|
+
maxActiveUserProfilesPerOwner: _upMaxActivePerOwner,
|
|
491
|
+
maxPendingUserPrefsPerProfile: _upMaxPendingPrefsPerProfile,
|
|
492
|
+
userProfileIdleMs: _upIdleMs,
|
|
493
|
+
userPrefStuckMs: _uprefStuckMs,
|
|
494
|
+
profilesByStatus,
|
|
495
|
+
prefsByStatus,
|
|
496
|
+
};
|
|
253
497
|
}
|