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.
- package/README.md +52 -3
- package/package.json +1 -1
- package/src/commands/a2a.js +201 -0
- package/src/commands/activitypub.js +207 -0
- package/src/commands/agent-network.js +217 -0
- package/src/commands/agent.js +1250 -0
- package/src/commands/automation.js +201 -0
- package/src/commands/bi.js +203 -0
- package/src/commands/browse.js +213 -0
- package/src/commands/chat.js +605 -0
- package/src/commands/cli-anything.js +426 -0
- package/src/commands/codegen.js +207 -0
- package/src/commands/collab.js +211 -0
- package/src/commands/compliance.js +822 -0
- package/src/commands/config.js +213 -0
- package/src/commands/cowork.js +1666 -0
- package/src/commands/crosschain.js +203 -0
- package/src/commands/dao.js +203 -0
- package/src/commands/dbevo.js +227 -0
- package/src/commands/dev.js +207 -0
- package/src/commands/did-v2.js +217 -0
- package/src/commands/did.js +221 -0
- package/src/commands/dlp.js +213 -0
- package/src/commands/economy.js +199 -0
- package/src/commands/encrypt.js +201 -0
- package/src/commands/evolution.js +199 -0
- package/src/commands/evomap.js +830 -0
- package/src/commands/export.js +213 -0
- package/src/commands/federation.js +209 -0
- package/src/commands/fusion.js +205 -0
- package/src/commands/governance.js +209 -0
- package/src/commands/hmemory.js +203 -0
- package/src/commands/hook.js +209 -0
- package/src/commands/import.js +209 -0
- package/src/commands/inference.js +207 -0
- package/src/commands/infra.js +203 -0
- package/src/commands/instinct.js +209 -0
- package/src/commands/ipfs.js +207 -0
- package/src/commands/kg.js +195 -0
- package/src/commands/llm.js +426 -0
- package/src/commands/matrix.js +207 -0
- package/src/commands/mcp.js +217 -0
- package/src/commands/memory.js +412 -0
- package/src/commands/multimodal.js +203 -0
- package/src/commands/nlprog.js +225 -0
- package/src/commands/nostr.js +209 -0
- package/src/commands/note.js +205 -0
- package/src/commands/ops.js +219 -0
- package/src/commands/orchestrate.js +406 -0
- package/src/commands/org.js +209 -0
- package/src/commands/p2p.js +209 -0
- package/src/commands/perception.js +209 -0
- package/src/commands/permmem.js +203 -0
- package/src/commands/pipeline.js +199 -0
- package/src/commands/planmode.js +426 -0
- package/src/commands/plugin-ecosystem.js +209 -0
- package/src/commands/plugin.js +209 -0
- package/src/commands/pqc.js +213 -0
- package/src/commands/quantization.js +207 -0
- package/src/commands/rcache.js +205 -0
- package/src/commands/recommend.js +233 -0
- package/src/commands/runtime.js +205 -0
- package/src/commands/scim.js +209 -0
- package/src/commands/services.js +207 -0
- package/src/commands/session.js +209 -0
- package/src/commands/setup.js +205 -0
- package/src/commands/skill.js +414 -0
- package/src/commands/social.js +201 -0
- package/src/commands/sso.js +209 -0
- package/src/commands/start.js +209 -0
- package/src/commands/stream.js +213 -0
- package/src/commands/sync.js +209 -0
- package/src/commands/tech.js +209 -0
- package/src/commands/tenant.js +217 -0
- package/src/commands/tokens.js +209 -0
- package/src/commands/trust.js +217 -0
- package/src/commands/ui.js +225 -0
- package/src/commands/wallet.js +209 -0
- package/src/commands/workflow.js +412 -0
- package/src/index.js +252 -0
- package/src/lib/a2a-protocol.js +332 -0
- package/src/lib/activitypub-bridge.js +334 -0
- package/src/lib/agent-coordinator.js +334 -0
- package/src/lib/agent-economy.js +334 -0
- package/src/lib/agent-network.js +341 -0
- package/src/lib/agent-router.js +333 -0
- package/src/lib/aiops.js +346 -0
- package/src/lib/automation-engine.js +335 -0
- package/src/lib/autonomous-agent.js +332 -0
- package/src/lib/autonomous-developer.js +332 -0
- package/src/lib/bi-engine.js +333 -0
- package/src/lib/browser-automation.js +334 -0
- package/src/lib/chat-core.js +335 -0
- package/src/lib/cli-anything-bridge.js +341 -0
- package/src/lib/cli-context-engineering.js +351 -0
- package/src/lib/code-agent.js +339 -0
- package/src/lib/collaboration-governance.js +334 -0
- package/src/lib/community-governance.js +346 -0
- package/src/lib/compliance-manager.js +334 -0
- package/src/lib/content-recommendation.js +351 -0
- package/src/lib/cowork-adapter.js +336 -0
- package/src/lib/cowork-evomap-adapter.js +341 -0
- package/src/lib/cowork-mcp-tools.js +341 -0
- package/src/lib/cowork-observe-html.js +341 -0
- package/src/lib/cowork-observe.js +341 -0
- package/src/lib/cowork-share.js +338 -0
- package/src/lib/cowork-task-templates.js +342 -1
- package/src/lib/cowork-template-marketplace.js +340 -0
- package/src/lib/cross-chain.js +339 -0
- package/src/lib/crypto-manager.js +334 -0
- package/src/lib/dao-governance.js +339 -0
- package/src/lib/dbevo.js +351 -0
- package/src/lib/decentral-infra.js +330 -0
- package/src/lib/did-manager.js +341 -0
- package/src/lib/did-v2-manager.js +341 -0
- package/src/lib/dlp-engine.js +339 -0
- package/src/lib/downloader.js +334 -0
- package/src/lib/evolution-system.js +334 -0
- package/src/lib/evomap-client.js +342 -0
- package/src/lib/evomap-federation.js +338 -0
- package/src/lib/evomap-governance.js +334 -0
- package/src/lib/evomap-manager.js +330 -0
- package/src/lib/execution-backend.js +330 -0
- package/src/lib/federation-hardening.js +340 -0
- package/src/lib/hashline.js +338 -0
- package/src/lib/hierarchical-memory.js +334 -0
- package/src/lib/hook-manager.js +341 -0
- package/src/lib/inference-network.js +341 -0
- package/src/lib/instinct-manager.js +346 -0
- package/src/lib/interaction-adapter.js +330 -0
- package/src/lib/interactive-planner.js +354 -0
- package/src/lib/ipfs-storage.js +334 -0
- package/src/lib/knowledge-exporter.js +341 -0
- package/src/lib/knowledge-graph.js +331 -0
- package/src/lib/knowledge-importer.js +341 -0
- package/src/lib/llm-providers.js +346 -0
- package/src/lib/matrix-bridge.js +339 -0
- package/src/lib/mcp-registry.js +346 -0
- package/src/lib/memory-manager.js +336 -0
- package/src/lib/multimodal.js +330 -0
- package/src/lib/nl-programming.js +341 -0
- package/src/lib/nostr-bridge.js +336 -0
- package/src/lib/note-versioning.js +339 -0
- package/src/lib/org-manager.js +336 -0
- package/src/lib/p2p-manager.js +341 -0
- package/src/lib/perception.js +346 -0
- package/src/lib/permanent-memory.js +327 -0
- package/src/lib/pipeline-orchestrator.js +332 -0
- package/src/lib/plan-mode.js +336 -0
- package/src/lib/plugin-autodiscovery.js +334 -0
- package/src/lib/plugin-ecosystem.js +346 -0
- package/src/lib/pqc-manager.js +346 -0
- package/src/lib/process-manager.js +336 -0
- package/src/lib/protocol-fusion.js +338 -0
- package/src/lib/provider-options.js +346 -0
- package/src/lib/provider-stream.js +348 -0
- package/src/lib/quantization.js +337 -0
- package/src/lib/response-cache.js +333 -0
- package/src/lib/scim-manager.js +346 -0
- package/src/lib/service-manager.js +337 -0
- package/src/lib/session-core-singletons.js +341 -0
- package/src/lib/session-manager.js +334 -0
- package/src/lib/skill-loader.js +334 -0
- package/src/lib/skill-mcp.js +336 -0
- package/src/lib/social-manager.js +330 -0
- package/src/lib/sso-manager.js +340 -0
- package/src/lib/stix-parser.js +346 -0
- package/src/lib/sub-agent-context.js +343 -0
- package/src/lib/sub-agent-profiles.js +335 -0
- package/src/lib/sub-agent-registry.js +336 -0
- package/src/lib/sync-manager.js +336 -0
- package/src/lib/tech-learning-engine.js +341 -0
- package/src/lib/tenant-saas.js +341 -0
- package/src/lib/threat-intel.js +330 -0
- package/src/lib/todo-manager.js +336 -0
- package/src/lib/token-tracker.js +336 -0
- package/src/lib/trust-security.js +343 -0
- package/src/lib/ueba.js +340 -0
- package/src/lib/universal-runtime.js +330 -0
- package/src/lib/wallet-manager.js +336 -0
- package/src/lib/web-ui-server.js +348 -0
- package/src/lib/workflow-engine.js +330 -0
- package/src/lib/workflow-expr.js +346 -0
- package/src/lib/ws-chat-handler.js +337 -0
|
@@ -377,3 +377,344 @@ export function listTools(db) {
|
|
|
377
377
|
)
|
|
378
378
|
.all();
|
|
379
379
|
}
|
|
380
|
+
|
|
381
|
+
// =====================================================================
|
|
382
|
+
// cli-anything-bridge V2 governance overlay (iter25)
|
|
383
|
+
// =====================================================================
|
|
384
|
+
export const CLIBGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
385
|
+
PENDING: "pending",
|
|
386
|
+
ACTIVE: "active",
|
|
387
|
+
DEGRADED: "degraded",
|
|
388
|
+
ARCHIVED: "archived",
|
|
389
|
+
});
|
|
390
|
+
export const CLIBGOV_BRIDGE_LIFECYCLE_V2 = Object.freeze({
|
|
391
|
+
QUEUED: "queued",
|
|
392
|
+
BRIDGING: "bridging",
|
|
393
|
+
BRIDGED: "bridged",
|
|
394
|
+
FAILED: "failed",
|
|
395
|
+
CANCELLED: "cancelled",
|
|
396
|
+
});
|
|
397
|
+
const _clibgovPTrans = new Map([
|
|
398
|
+
[
|
|
399
|
+
CLIBGOV_PROFILE_MATURITY_V2.PENDING,
|
|
400
|
+
new Set([
|
|
401
|
+
CLIBGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
402
|
+
CLIBGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
403
|
+
]),
|
|
404
|
+
],
|
|
405
|
+
[
|
|
406
|
+
CLIBGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
407
|
+
new Set([
|
|
408
|
+
CLIBGOV_PROFILE_MATURITY_V2.DEGRADED,
|
|
409
|
+
CLIBGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
410
|
+
]),
|
|
411
|
+
],
|
|
412
|
+
[
|
|
413
|
+
CLIBGOV_PROFILE_MATURITY_V2.DEGRADED,
|
|
414
|
+
new Set([
|
|
415
|
+
CLIBGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
416
|
+
CLIBGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
417
|
+
]),
|
|
418
|
+
],
|
|
419
|
+
[CLIBGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
420
|
+
]);
|
|
421
|
+
const _clibgovPTerminal = new Set([CLIBGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
422
|
+
const _clibgovJTrans = new Map([
|
|
423
|
+
[
|
|
424
|
+
CLIBGOV_BRIDGE_LIFECYCLE_V2.QUEUED,
|
|
425
|
+
new Set([
|
|
426
|
+
CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGING,
|
|
427
|
+
CLIBGOV_BRIDGE_LIFECYCLE_V2.CANCELLED,
|
|
428
|
+
]),
|
|
429
|
+
],
|
|
430
|
+
[
|
|
431
|
+
CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGING,
|
|
432
|
+
new Set([
|
|
433
|
+
CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGED,
|
|
434
|
+
CLIBGOV_BRIDGE_LIFECYCLE_V2.FAILED,
|
|
435
|
+
CLIBGOV_BRIDGE_LIFECYCLE_V2.CANCELLED,
|
|
436
|
+
]),
|
|
437
|
+
],
|
|
438
|
+
[CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGED, new Set()],
|
|
439
|
+
[CLIBGOV_BRIDGE_LIFECYCLE_V2.FAILED, new Set()],
|
|
440
|
+
[CLIBGOV_BRIDGE_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
441
|
+
]);
|
|
442
|
+
const _clibgovPsV2 = new Map();
|
|
443
|
+
const _clibgovJsV2 = new Map();
|
|
444
|
+
let _clibgovMaxActive = 8,
|
|
445
|
+
_clibgovMaxPending = 20,
|
|
446
|
+
_clibgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
447
|
+
_clibgovStuckMs = 60 * 1000;
|
|
448
|
+
function _clibgovPos(n, label) {
|
|
449
|
+
const v = Math.floor(Number(n));
|
|
450
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
451
|
+
throw new Error(`${label} must be positive integer`);
|
|
452
|
+
return v;
|
|
453
|
+
}
|
|
454
|
+
function _clibgovCheckP(from, to) {
|
|
455
|
+
const a = _clibgovPTrans.get(from);
|
|
456
|
+
if (!a || !a.has(to))
|
|
457
|
+
throw new Error(`invalid clibgov profile transition ${from} → ${to}`);
|
|
458
|
+
}
|
|
459
|
+
function _clibgovCheckJ(from, to) {
|
|
460
|
+
const a = _clibgovJTrans.get(from);
|
|
461
|
+
if (!a || !a.has(to))
|
|
462
|
+
throw new Error(`invalid clibgov bridge transition ${from} → ${to}`);
|
|
463
|
+
}
|
|
464
|
+
function _clibgovCountActive(owner) {
|
|
465
|
+
let c = 0;
|
|
466
|
+
for (const p of _clibgovPsV2.values())
|
|
467
|
+
if (p.owner === owner && p.status === CLIBGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
468
|
+
c++;
|
|
469
|
+
return c;
|
|
470
|
+
}
|
|
471
|
+
function _clibgovCountPending(profileId) {
|
|
472
|
+
let c = 0;
|
|
473
|
+
for (const j of _clibgovJsV2.values())
|
|
474
|
+
if (
|
|
475
|
+
j.profileId === profileId &&
|
|
476
|
+
(j.status === CLIBGOV_BRIDGE_LIFECYCLE_V2.QUEUED ||
|
|
477
|
+
j.status === CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGING)
|
|
478
|
+
)
|
|
479
|
+
c++;
|
|
480
|
+
return c;
|
|
481
|
+
}
|
|
482
|
+
export function setMaxActiveClibgovProfilesPerOwnerV2(n) {
|
|
483
|
+
_clibgovMaxActive = _clibgovPos(n, "maxActiveClibgovProfilesPerOwner");
|
|
484
|
+
}
|
|
485
|
+
export function getMaxActiveClibgovProfilesPerOwnerV2() {
|
|
486
|
+
return _clibgovMaxActive;
|
|
487
|
+
}
|
|
488
|
+
export function setMaxPendingClibgovBridgesPerProfileV2(n) {
|
|
489
|
+
_clibgovMaxPending = _clibgovPos(n, "maxPendingClibgovBridgesPerProfile");
|
|
490
|
+
}
|
|
491
|
+
export function getMaxPendingClibgovBridgesPerProfileV2() {
|
|
492
|
+
return _clibgovMaxPending;
|
|
493
|
+
}
|
|
494
|
+
export function setClibgovProfileIdleMsV2(n) {
|
|
495
|
+
_clibgovIdleMs = _clibgovPos(n, "clibgovProfileIdleMs");
|
|
496
|
+
}
|
|
497
|
+
export function getClibgovProfileIdleMsV2() {
|
|
498
|
+
return _clibgovIdleMs;
|
|
499
|
+
}
|
|
500
|
+
export function setClibgovBridgeStuckMsV2(n) {
|
|
501
|
+
_clibgovStuckMs = _clibgovPos(n, "clibgovBridgeStuckMs");
|
|
502
|
+
}
|
|
503
|
+
export function getClibgovBridgeStuckMsV2() {
|
|
504
|
+
return _clibgovStuckMs;
|
|
505
|
+
}
|
|
506
|
+
export function _resetStateCliAnythingBridgeGovV2() {
|
|
507
|
+
_clibgovPsV2.clear();
|
|
508
|
+
_clibgovJsV2.clear();
|
|
509
|
+
_clibgovMaxActive = 8;
|
|
510
|
+
_clibgovMaxPending = 20;
|
|
511
|
+
_clibgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
512
|
+
_clibgovStuckMs = 60 * 1000;
|
|
513
|
+
}
|
|
514
|
+
export function registerClibgovProfileV2({ id, owner, tool, metadata } = {}) {
|
|
515
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
516
|
+
if (_clibgovPsV2.has(id))
|
|
517
|
+
throw new Error(`clibgov profile ${id} already exists`);
|
|
518
|
+
const now = Date.now();
|
|
519
|
+
const p = {
|
|
520
|
+
id,
|
|
521
|
+
owner,
|
|
522
|
+
tool: tool || "generic",
|
|
523
|
+
status: CLIBGOV_PROFILE_MATURITY_V2.PENDING,
|
|
524
|
+
createdAt: now,
|
|
525
|
+
updatedAt: now,
|
|
526
|
+
lastTouchedAt: now,
|
|
527
|
+
activatedAt: null,
|
|
528
|
+
archivedAt: null,
|
|
529
|
+
metadata: { ...(metadata || {}) },
|
|
530
|
+
};
|
|
531
|
+
_clibgovPsV2.set(id, p);
|
|
532
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
533
|
+
}
|
|
534
|
+
export function activateClibgovProfileV2(id) {
|
|
535
|
+
const p = _clibgovPsV2.get(id);
|
|
536
|
+
if (!p) throw new Error(`clibgov profile ${id} not found`);
|
|
537
|
+
const isInitial = p.status === CLIBGOV_PROFILE_MATURITY_V2.PENDING;
|
|
538
|
+
_clibgovCheckP(p.status, CLIBGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
539
|
+
if (isInitial && _clibgovCountActive(p.owner) >= _clibgovMaxActive)
|
|
540
|
+
throw new Error(`max active clibgov profiles for owner ${p.owner} reached`);
|
|
541
|
+
const now = Date.now();
|
|
542
|
+
p.status = CLIBGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
543
|
+
p.updatedAt = now;
|
|
544
|
+
p.lastTouchedAt = now;
|
|
545
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
546
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
547
|
+
}
|
|
548
|
+
export function degradeClibgovProfileV2(id) {
|
|
549
|
+
const p = _clibgovPsV2.get(id);
|
|
550
|
+
if (!p) throw new Error(`clibgov profile ${id} not found`);
|
|
551
|
+
_clibgovCheckP(p.status, CLIBGOV_PROFILE_MATURITY_V2.DEGRADED);
|
|
552
|
+
p.status = CLIBGOV_PROFILE_MATURITY_V2.DEGRADED;
|
|
553
|
+
p.updatedAt = Date.now();
|
|
554
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
555
|
+
}
|
|
556
|
+
export function archiveClibgovProfileV2(id) {
|
|
557
|
+
const p = _clibgovPsV2.get(id);
|
|
558
|
+
if (!p) throw new Error(`clibgov profile ${id} not found`);
|
|
559
|
+
_clibgovCheckP(p.status, CLIBGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
560
|
+
const now = Date.now();
|
|
561
|
+
p.status = CLIBGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
562
|
+
p.updatedAt = now;
|
|
563
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
564
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
565
|
+
}
|
|
566
|
+
export function touchClibgovProfileV2(id) {
|
|
567
|
+
const p = _clibgovPsV2.get(id);
|
|
568
|
+
if (!p) throw new Error(`clibgov profile ${id} not found`);
|
|
569
|
+
if (_clibgovPTerminal.has(p.status))
|
|
570
|
+
throw new Error(`cannot touch terminal clibgov profile ${id}`);
|
|
571
|
+
const now = Date.now();
|
|
572
|
+
p.lastTouchedAt = now;
|
|
573
|
+
p.updatedAt = now;
|
|
574
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
575
|
+
}
|
|
576
|
+
export function getClibgovProfileV2(id) {
|
|
577
|
+
const p = _clibgovPsV2.get(id);
|
|
578
|
+
if (!p) return null;
|
|
579
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
580
|
+
}
|
|
581
|
+
export function listClibgovProfilesV2() {
|
|
582
|
+
return [..._clibgovPsV2.values()].map((p) => ({
|
|
583
|
+
...p,
|
|
584
|
+
metadata: { ...p.metadata },
|
|
585
|
+
}));
|
|
586
|
+
}
|
|
587
|
+
export function createClibgovBridgeV2({
|
|
588
|
+
id,
|
|
589
|
+
profileId,
|
|
590
|
+
command,
|
|
591
|
+
metadata,
|
|
592
|
+
} = {}) {
|
|
593
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
594
|
+
if (_clibgovJsV2.has(id))
|
|
595
|
+
throw new Error(`clibgov bridge ${id} already exists`);
|
|
596
|
+
if (!_clibgovPsV2.has(profileId))
|
|
597
|
+
throw new Error(`clibgov profile ${profileId} not found`);
|
|
598
|
+
if (_clibgovCountPending(profileId) >= _clibgovMaxPending)
|
|
599
|
+
throw new Error(
|
|
600
|
+
`max pending clibgov bridges for profile ${profileId} reached`,
|
|
601
|
+
);
|
|
602
|
+
const now = Date.now();
|
|
603
|
+
const j = {
|
|
604
|
+
id,
|
|
605
|
+
profileId,
|
|
606
|
+
command: command || "",
|
|
607
|
+
status: CLIBGOV_BRIDGE_LIFECYCLE_V2.QUEUED,
|
|
608
|
+
createdAt: now,
|
|
609
|
+
updatedAt: now,
|
|
610
|
+
startedAt: null,
|
|
611
|
+
settledAt: null,
|
|
612
|
+
metadata: { ...(metadata || {}) },
|
|
613
|
+
};
|
|
614
|
+
_clibgovJsV2.set(id, j);
|
|
615
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
616
|
+
}
|
|
617
|
+
export function bridgingClibgovBridgeV2(id) {
|
|
618
|
+
const j = _clibgovJsV2.get(id);
|
|
619
|
+
if (!j) throw new Error(`clibgov bridge ${id} not found`);
|
|
620
|
+
_clibgovCheckJ(j.status, CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGING);
|
|
621
|
+
const now = Date.now();
|
|
622
|
+
j.status = CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGING;
|
|
623
|
+
j.updatedAt = now;
|
|
624
|
+
if (!j.startedAt) j.startedAt = now;
|
|
625
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
626
|
+
}
|
|
627
|
+
export function completeBridgeClibgovV2(id) {
|
|
628
|
+
const j = _clibgovJsV2.get(id);
|
|
629
|
+
if (!j) throw new Error(`clibgov bridge ${id} not found`);
|
|
630
|
+
_clibgovCheckJ(j.status, CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGED);
|
|
631
|
+
const now = Date.now();
|
|
632
|
+
j.status = CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGED;
|
|
633
|
+
j.updatedAt = now;
|
|
634
|
+
if (!j.settledAt) j.settledAt = now;
|
|
635
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
636
|
+
}
|
|
637
|
+
export function failClibgovBridgeV2(id, reason) {
|
|
638
|
+
const j = _clibgovJsV2.get(id);
|
|
639
|
+
if (!j) throw new Error(`clibgov bridge ${id} not found`);
|
|
640
|
+
_clibgovCheckJ(j.status, CLIBGOV_BRIDGE_LIFECYCLE_V2.FAILED);
|
|
641
|
+
const now = Date.now();
|
|
642
|
+
j.status = CLIBGOV_BRIDGE_LIFECYCLE_V2.FAILED;
|
|
643
|
+
j.updatedAt = now;
|
|
644
|
+
if (!j.settledAt) j.settledAt = now;
|
|
645
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
646
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
647
|
+
}
|
|
648
|
+
export function cancelClibgovBridgeV2(id, reason) {
|
|
649
|
+
const j = _clibgovJsV2.get(id);
|
|
650
|
+
if (!j) throw new Error(`clibgov bridge ${id} not found`);
|
|
651
|
+
_clibgovCheckJ(j.status, CLIBGOV_BRIDGE_LIFECYCLE_V2.CANCELLED);
|
|
652
|
+
const now = Date.now();
|
|
653
|
+
j.status = CLIBGOV_BRIDGE_LIFECYCLE_V2.CANCELLED;
|
|
654
|
+
j.updatedAt = now;
|
|
655
|
+
if (!j.settledAt) j.settledAt = now;
|
|
656
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
657
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
658
|
+
}
|
|
659
|
+
export function getClibgovBridgeV2(id) {
|
|
660
|
+
const j = _clibgovJsV2.get(id);
|
|
661
|
+
if (!j) return null;
|
|
662
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
663
|
+
}
|
|
664
|
+
export function listClibgovBridgesV2() {
|
|
665
|
+
return [..._clibgovJsV2.values()].map((j) => ({
|
|
666
|
+
...j,
|
|
667
|
+
metadata: { ...j.metadata },
|
|
668
|
+
}));
|
|
669
|
+
}
|
|
670
|
+
export function autoDegradeIdleClibgovProfilesV2({ now } = {}) {
|
|
671
|
+
const t = now ?? Date.now();
|
|
672
|
+
const flipped = [];
|
|
673
|
+
for (const p of _clibgovPsV2.values())
|
|
674
|
+
if (
|
|
675
|
+
p.status === CLIBGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
676
|
+
t - p.lastTouchedAt >= _clibgovIdleMs
|
|
677
|
+
) {
|
|
678
|
+
p.status = CLIBGOV_PROFILE_MATURITY_V2.DEGRADED;
|
|
679
|
+
p.updatedAt = t;
|
|
680
|
+
flipped.push(p.id);
|
|
681
|
+
}
|
|
682
|
+
return { flipped, count: flipped.length };
|
|
683
|
+
}
|
|
684
|
+
export function autoFailStuckClibgovBridgesV2({ now } = {}) {
|
|
685
|
+
const t = now ?? Date.now();
|
|
686
|
+
const flipped = [];
|
|
687
|
+
for (const j of _clibgovJsV2.values())
|
|
688
|
+
if (
|
|
689
|
+
j.status === CLIBGOV_BRIDGE_LIFECYCLE_V2.BRIDGING &&
|
|
690
|
+
j.startedAt != null &&
|
|
691
|
+
t - j.startedAt >= _clibgovStuckMs
|
|
692
|
+
) {
|
|
693
|
+
j.status = CLIBGOV_BRIDGE_LIFECYCLE_V2.FAILED;
|
|
694
|
+
j.updatedAt = t;
|
|
695
|
+
if (!j.settledAt) j.settledAt = t;
|
|
696
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
697
|
+
flipped.push(j.id);
|
|
698
|
+
}
|
|
699
|
+
return { flipped, count: flipped.length };
|
|
700
|
+
}
|
|
701
|
+
export function getCliAnythingBridgeGovStatsV2() {
|
|
702
|
+
const profilesByStatus = {};
|
|
703
|
+
for (const v of Object.values(CLIBGOV_PROFILE_MATURITY_V2))
|
|
704
|
+
profilesByStatus[v] = 0;
|
|
705
|
+
for (const p of _clibgovPsV2.values()) profilesByStatus[p.status]++;
|
|
706
|
+
const bridgesByStatus = {};
|
|
707
|
+
for (const v of Object.values(CLIBGOV_BRIDGE_LIFECYCLE_V2))
|
|
708
|
+
bridgesByStatus[v] = 0;
|
|
709
|
+
for (const j of _clibgovJsV2.values()) bridgesByStatus[j.status]++;
|
|
710
|
+
return {
|
|
711
|
+
totalClibgovProfilesV2: _clibgovPsV2.size,
|
|
712
|
+
totalClibgovBridgesV2: _clibgovJsV2.size,
|
|
713
|
+
maxActiveClibgovProfilesPerOwner: _clibgovMaxActive,
|
|
714
|
+
maxPendingClibgovBridgesPerProfile: _clibgovMaxPending,
|
|
715
|
+
clibgovProfileIdleMs: _clibgovIdleMs,
|
|
716
|
+
clibgovBridgeStuckMs: _clibgovStuckMs,
|
|
717
|
+
profilesByStatus,
|
|
718
|
+
bridgesByStatus,
|
|
719
|
+
};
|
|
720
|
+
}
|
|
@@ -518,3 +518,354 @@ export class CLIContextEngineering {
|
|
|
518
518
|
}
|
|
519
519
|
}
|
|
520
520
|
}
|
|
521
|
+
|
|
522
|
+
// =====================================================================
|
|
523
|
+
// cli-context-engineering V2 governance overlay (iter26)
|
|
524
|
+
// =====================================================================
|
|
525
|
+
export const CTXENGGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
526
|
+
PENDING: "pending",
|
|
527
|
+
ACTIVE: "active",
|
|
528
|
+
STALE: "stale",
|
|
529
|
+
ARCHIVED: "archived",
|
|
530
|
+
});
|
|
531
|
+
export const CTXENGGOV_BUILD_LIFECYCLE_V2 = Object.freeze({
|
|
532
|
+
QUEUED: "queued",
|
|
533
|
+
BUILDING: "building",
|
|
534
|
+
BUILT: "built",
|
|
535
|
+
FAILED: "failed",
|
|
536
|
+
CANCELLED: "cancelled",
|
|
537
|
+
});
|
|
538
|
+
const _ctxenggovPTrans = new Map([
|
|
539
|
+
[
|
|
540
|
+
CTXENGGOV_PROFILE_MATURITY_V2.PENDING,
|
|
541
|
+
new Set([
|
|
542
|
+
CTXENGGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
543
|
+
CTXENGGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
544
|
+
]),
|
|
545
|
+
],
|
|
546
|
+
[
|
|
547
|
+
CTXENGGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
548
|
+
new Set([
|
|
549
|
+
CTXENGGOV_PROFILE_MATURITY_V2.STALE,
|
|
550
|
+
CTXENGGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
551
|
+
]),
|
|
552
|
+
],
|
|
553
|
+
[
|
|
554
|
+
CTXENGGOV_PROFILE_MATURITY_V2.STALE,
|
|
555
|
+
new Set([
|
|
556
|
+
CTXENGGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
557
|
+
CTXENGGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
558
|
+
]),
|
|
559
|
+
],
|
|
560
|
+
[CTXENGGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
561
|
+
]);
|
|
562
|
+
const _ctxenggovPTerminal = new Set([CTXENGGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
563
|
+
const _ctxenggovJTrans = new Map([
|
|
564
|
+
[
|
|
565
|
+
CTXENGGOV_BUILD_LIFECYCLE_V2.QUEUED,
|
|
566
|
+
new Set([
|
|
567
|
+
CTXENGGOV_BUILD_LIFECYCLE_V2.BUILDING,
|
|
568
|
+
CTXENGGOV_BUILD_LIFECYCLE_V2.CANCELLED,
|
|
569
|
+
]),
|
|
570
|
+
],
|
|
571
|
+
[
|
|
572
|
+
CTXENGGOV_BUILD_LIFECYCLE_V2.BUILDING,
|
|
573
|
+
new Set([
|
|
574
|
+
CTXENGGOV_BUILD_LIFECYCLE_V2.BUILT,
|
|
575
|
+
CTXENGGOV_BUILD_LIFECYCLE_V2.FAILED,
|
|
576
|
+
CTXENGGOV_BUILD_LIFECYCLE_V2.CANCELLED,
|
|
577
|
+
]),
|
|
578
|
+
],
|
|
579
|
+
[CTXENGGOV_BUILD_LIFECYCLE_V2.BUILT, new Set()],
|
|
580
|
+
[CTXENGGOV_BUILD_LIFECYCLE_V2.FAILED, new Set()],
|
|
581
|
+
[CTXENGGOV_BUILD_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
582
|
+
]);
|
|
583
|
+
const _ctxenggovPsV2 = new Map();
|
|
584
|
+
const _ctxenggovJsV2 = new Map();
|
|
585
|
+
let _ctxenggovMaxActive = 8,
|
|
586
|
+
_ctxenggovMaxPending = 20,
|
|
587
|
+
_ctxenggovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
588
|
+
_ctxenggovStuckMs = 60 * 1000;
|
|
589
|
+
function _ctxenggovPos(n, label) {
|
|
590
|
+
const v = Math.floor(Number(n));
|
|
591
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
592
|
+
throw new Error(`${label} must be positive integer`);
|
|
593
|
+
return v;
|
|
594
|
+
}
|
|
595
|
+
function _ctxenggovCheckP(from, to) {
|
|
596
|
+
const a = _ctxenggovPTrans.get(from);
|
|
597
|
+
if (!a || !a.has(to))
|
|
598
|
+
throw new Error(`invalid ctxenggov profile transition ${from} → ${to}`);
|
|
599
|
+
}
|
|
600
|
+
function _ctxenggovCheckJ(from, to) {
|
|
601
|
+
const a = _ctxenggovJTrans.get(from);
|
|
602
|
+
if (!a || !a.has(to))
|
|
603
|
+
throw new Error(`invalid ctxenggov build transition ${from} → ${to}`);
|
|
604
|
+
}
|
|
605
|
+
function _ctxenggovCountActive(owner) {
|
|
606
|
+
let c = 0;
|
|
607
|
+
for (const p of _ctxenggovPsV2.values())
|
|
608
|
+
if (p.owner === owner && p.status === CTXENGGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
609
|
+
c++;
|
|
610
|
+
return c;
|
|
611
|
+
}
|
|
612
|
+
function _ctxenggovCountPending(profileId) {
|
|
613
|
+
let c = 0;
|
|
614
|
+
for (const j of _ctxenggovJsV2.values())
|
|
615
|
+
if (
|
|
616
|
+
j.profileId === profileId &&
|
|
617
|
+
(j.status === CTXENGGOV_BUILD_LIFECYCLE_V2.QUEUED ||
|
|
618
|
+
j.status === CTXENGGOV_BUILD_LIFECYCLE_V2.BUILDING)
|
|
619
|
+
)
|
|
620
|
+
c++;
|
|
621
|
+
return c;
|
|
622
|
+
}
|
|
623
|
+
export function setMaxActiveCtxenggovProfilesPerOwnerV2(n) {
|
|
624
|
+
_ctxenggovMaxActive = _ctxenggovPos(n, "maxActiveCtxenggovProfilesPerOwner");
|
|
625
|
+
}
|
|
626
|
+
export function getMaxActiveCtxenggovProfilesPerOwnerV2() {
|
|
627
|
+
return _ctxenggovMaxActive;
|
|
628
|
+
}
|
|
629
|
+
export function setMaxPendingCtxenggovBuildsPerProfileV2(n) {
|
|
630
|
+
_ctxenggovMaxPending = _ctxenggovPos(
|
|
631
|
+
n,
|
|
632
|
+
"maxPendingCtxenggovBuildsPerProfile",
|
|
633
|
+
);
|
|
634
|
+
}
|
|
635
|
+
export function getMaxPendingCtxenggovBuildsPerProfileV2() {
|
|
636
|
+
return _ctxenggovMaxPending;
|
|
637
|
+
}
|
|
638
|
+
export function setCtxenggovProfileIdleMsV2(n) {
|
|
639
|
+
_ctxenggovIdleMs = _ctxenggovPos(n, "ctxenggovProfileIdleMs");
|
|
640
|
+
}
|
|
641
|
+
export function getCtxenggovProfileIdleMsV2() {
|
|
642
|
+
return _ctxenggovIdleMs;
|
|
643
|
+
}
|
|
644
|
+
export function setCtxenggovBuildStuckMsV2(n) {
|
|
645
|
+
_ctxenggovStuckMs = _ctxenggovPos(n, "ctxenggovBuildStuckMs");
|
|
646
|
+
}
|
|
647
|
+
export function getCtxenggovBuildStuckMsV2() {
|
|
648
|
+
return _ctxenggovStuckMs;
|
|
649
|
+
}
|
|
650
|
+
export function _resetStateCliContextEngineeringGovV2() {
|
|
651
|
+
_ctxenggovPsV2.clear();
|
|
652
|
+
_ctxenggovJsV2.clear();
|
|
653
|
+
_ctxenggovMaxActive = 8;
|
|
654
|
+
_ctxenggovMaxPending = 20;
|
|
655
|
+
_ctxenggovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
656
|
+
_ctxenggovStuckMs = 60 * 1000;
|
|
657
|
+
}
|
|
658
|
+
export function registerCtxenggovProfileV2({
|
|
659
|
+
id,
|
|
660
|
+
owner,
|
|
661
|
+
scope,
|
|
662
|
+
metadata,
|
|
663
|
+
} = {}) {
|
|
664
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
665
|
+
if (_ctxenggovPsV2.has(id))
|
|
666
|
+
throw new Error(`ctxenggov profile ${id} already exists`);
|
|
667
|
+
const now = Date.now();
|
|
668
|
+
const p = {
|
|
669
|
+
id,
|
|
670
|
+
owner,
|
|
671
|
+
scope: scope || "session",
|
|
672
|
+
status: CTXENGGOV_PROFILE_MATURITY_V2.PENDING,
|
|
673
|
+
createdAt: now,
|
|
674
|
+
updatedAt: now,
|
|
675
|
+
lastTouchedAt: now,
|
|
676
|
+
activatedAt: null,
|
|
677
|
+
archivedAt: null,
|
|
678
|
+
metadata: { ...(metadata || {}) },
|
|
679
|
+
};
|
|
680
|
+
_ctxenggovPsV2.set(id, p);
|
|
681
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
682
|
+
}
|
|
683
|
+
export function activateCtxenggovProfileV2(id) {
|
|
684
|
+
const p = _ctxenggovPsV2.get(id);
|
|
685
|
+
if (!p) throw new Error(`ctxenggov profile ${id} not found`);
|
|
686
|
+
const isInitial = p.status === CTXENGGOV_PROFILE_MATURITY_V2.PENDING;
|
|
687
|
+
_ctxenggovCheckP(p.status, CTXENGGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
688
|
+
if (isInitial && _ctxenggovCountActive(p.owner) >= _ctxenggovMaxActive)
|
|
689
|
+
throw new Error(
|
|
690
|
+
`max active ctxenggov profiles for owner ${p.owner} reached`,
|
|
691
|
+
);
|
|
692
|
+
const now = Date.now();
|
|
693
|
+
p.status = CTXENGGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
694
|
+
p.updatedAt = now;
|
|
695
|
+
p.lastTouchedAt = now;
|
|
696
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
697
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
698
|
+
}
|
|
699
|
+
export function staleCtxenggovProfileV2(id) {
|
|
700
|
+
const p = _ctxenggovPsV2.get(id);
|
|
701
|
+
if (!p) throw new Error(`ctxenggov profile ${id} not found`);
|
|
702
|
+
_ctxenggovCheckP(p.status, CTXENGGOV_PROFILE_MATURITY_V2.STALE);
|
|
703
|
+
p.status = CTXENGGOV_PROFILE_MATURITY_V2.STALE;
|
|
704
|
+
p.updatedAt = Date.now();
|
|
705
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
706
|
+
}
|
|
707
|
+
export function archiveCtxenggovProfileV2(id) {
|
|
708
|
+
const p = _ctxenggovPsV2.get(id);
|
|
709
|
+
if (!p) throw new Error(`ctxenggov profile ${id} not found`);
|
|
710
|
+
_ctxenggovCheckP(p.status, CTXENGGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
711
|
+
const now = Date.now();
|
|
712
|
+
p.status = CTXENGGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
713
|
+
p.updatedAt = now;
|
|
714
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
715
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
716
|
+
}
|
|
717
|
+
export function touchCtxenggovProfileV2(id) {
|
|
718
|
+
const p = _ctxenggovPsV2.get(id);
|
|
719
|
+
if (!p) throw new Error(`ctxenggov profile ${id} not found`);
|
|
720
|
+
if (_ctxenggovPTerminal.has(p.status))
|
|
721
|
+
throw new Error(`cannot touch terminal ctxenggov profile ${id}`);
|
|
722
|
+
const now = Date.now();
|
|
723
|
+
p.lastTouchedAt = now;
|
|
724
|
+
p.updatedAt = now;
|
|
725
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
726
|
+
}
|
|
727
|
+
export function getCtxenggovProfileV2(id) {
|
|
728
|
+
const p = _ctxenggovPsV2.get(id);
|
|
729
|
+
if (!p) return null;
|
|
730
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
731
|
+
}
|
|
732
|
+
export function listCtxenggovProfilesV2() {
|
|
733
|
+
return [..._ctxenggovPsV2.values()].map((p) => ({
|
|
734
|
+
...p,
|
|
735
|
+
metadata: { ...p.metadata },
|
|
736
|
+
}));
|
|
737
|
+
}
|
|
738
|
+
export function createCtxenggovBuildV2({
|
|
739
|
+
id,
|
|
740
|
+
profileId,
|
|
741
|
+
prompt,
|
|
742
|
+
metadata,
|
|
743
|
+
} = {}) {
|
|
744
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
745
|
+
if (_ctxenggovJsV2.has(id))
|
|
746
|
+
throw new Error(`ctxenggov build ${id} already exists`);
|
|
747
|
+
if (!_ctxenggovPsV2.has(profileId))
|
|
748
|
+
throw new Error(`ctxenggov profile ${profileId} not found`);
|
|
749
|
+
if (_ctxenggovCountPending(profileId) >= _ctxenggovMaxPending)
|
|
750
|
+
throw new Error(
|
|
751
|
+
`max pending ctxenggov builds for profile ${profileId} reached`,
|
|
752
|
+
);
|
|
753
|
+
const now = Date.now();
|
|
754
|
+
const j = {
|
|
755
|
+
id,
|
|
756
|
+
profileId,
|
|
757
|
+
prompt: prompt || "",
|
|
758
|
+
status: CTXENGGOV_BUILD_LIFECYCLE_V2.QUEUED,
|
|
759
|
+
createdAt: now,
|
|
760
|
+
updatedAt: now,
|
|
761
|
+
startedAt: null,
|
|
762
|
+
settledAt: null,
|
|
763
|
+
metadata: { ...(metadata || {}) },
|
|
764
|
+
};
|
|
765
|
+
_ctxenggovJsV2.set(id, j);
|
|
766
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
767
|
+
}
|
|
768
|
+
export function buildingCtxenggovBuildV2(id) {
|
|
769
|
+
const j = _ctxenggovJsV2.get(id);
|
|
770
|
+
if (!j) throw new Error(`ctxenggov build ${id} not found`);
|
|
771
|
+
_ctxenggovCheckJ(j.status, CTXENGGOV_BUILD_LIFECYCLE_V2.BUILDING);
|
|
772
|
+
const now = Date.now();
|
|
773
|
+
j.status = CTXENGGOV_BUILD_LIFECYCLE_V2.BUILDING;
|
|
774
|
+
j.updatedAt = now;
|
|
775
|
+
if (!j.startedAt) j.startedAt = now;
|
|
776
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
777
|
+
}
|
|
778
|
+
export function completeBuildCtxenggovV2(id) {
|
|
779
|
+
const j = _ctxenggovJsV2.get(id);
|
|
780
|
+
if (!j) throw new Error(`ctxenggov build ${id} not found`);
|
|
781
|
+
_ctxenggovCheckJ(j.status, CTXENGGOV_BUILD_LIFECYCLE_V2.BUILT);
|
|
782
|
+
const now = Date.now();
|
|
783
|
+
j.status = CTXENGGOV_BUILD_LIFECYCLE_V2.BUILT;
|
|
784
|
+
j.updatedAt = now;
|
|
785
|
+
if (!j.settledAt) j.settledAt = now;
|
|
786
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
787
|
+
}
|
|
788
|
+
export function failCtxenggovBuildV2(id, reason) {
|
|
789
|
+
const j = _ctxenggovJsV2.get(id);
|
|
790
|
+
if (!j) throw new Error(`ctxenggov build ${id} not found`);
|
|
791
|
+
_ctxenggovCheckJ(j.status, CTXENGGOV_BUILD_LIFECYCLE_V2.FAILED);
|
|
792
|
+
const now = Date.now();
|
|
793
|
+
j.status = CTXENGGOV_BUILD_LIFECYCLE_V2.FAILED;
|
|
794
|
+
j.updatedAt = now;
|
|
795
|
+
if (!j.settledAt) j.settledAt = now;
|
|
796
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
797
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
798
|
+
}
|
|
799
|
+
export function cancelCtxenggovBuildV2(id, reason) {
|
|
800
|
+
const j = _ctxenggovJsV2.get(id);
|
|
801
|
+
if (!j) throw new Error(`ctxenggov build ${id} not found`);
|
|
802
|
+
_ctxenggovCheckJ(j.status, CTXENGGOV_BUILD_LIFECYCLE_V2.CANCELLED);
|
|
803
|
+
const now = Date.now();
|
|
804
|
+
j.status = CTXENGGOV_BUILD_LIFECYCLE_V2.CANCELLED;
|
|
805
|
+
j.updatedAt = now;
|
|
806
|
+
if (!j.settledAt) j.settledAt = now;
|
|
807
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
808
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
809
|
+
}
|
|
810
|
+
export function getCtxenggovBuildV2(id) {
|
|
811
|
+
const j = _ctxenggovJsV2.get(id);
|
|
812
|
+
if (!j) return null;
|
|
813
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
814
|
+
}
|
|
815
|
+
export function listCtxenggovBuildsV2() {
|
|
816
|
+
return [..._ctxenggovJsV2.values()].map((j) => ({
|
|
817
|
+
...j,
|
|
818
|
+
metadata: { ...j.metadata },
|
|
819
|
+
}));
|
|
820
|
+
}
|
|
821
|
+
export function autoStaleIdleCtxenggovProfilesV2({ now } = {}) {
|
|
822
|
+
const t = now ?? Date.now();
|
|
823
|
+
const flipped = [];
|
|
824
|
+
for (const p of _ctxenggovPsV2.values())
|
|
825
|
+
if (
|
|
826
|
+
p.status === CTXENGGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
827
|
+
t - p.lastTouchedAt >= _ctxenggovIdleMs
|
|
828
|
+
) {
|
|
829
|
+
p.status = CTXENGGOV_PROFILE_MATURITY_V2.STALE;
|
|
830
|
+
p.updatedAt = t;
|
|
831
|
+
flipped.push(p.id);
|
|
832
|
+
}
|
|
833
|
+
return { flipped, count: flipped.length };
|
|
834
|
+
}
|
|
835
|
+
export function autoFailStuckCtxenggovBuildsV2({ now } = {}) {
|
|
836
|
+
const t = now ?? Date.now();
|
|
837
|
+
const flipped = [];
|
|
838
|
+
for (const j of _ctxenggovJsV2.values())
|
|
839
|
+
if (
|
|
840
|
+
j.status === CTXENGGOV_BUILD_LIFECYCLE_V2.BUILDING &&
|
|
841
|
+
j.startedAt != null &&
|
|
842
|
+
t - j.startedAt >= _ctxenggovStuckMs
|
|
843
|
+
) {
|
|
844
|
+
j.status = CTXENGGOV_BUILD_LIFECYCLE_V2.FAILED;
|
|
845
|
+
j.updatedAt = t;
|
|
846
|
+
if (!j.settledAt) j.settledAt = t;
|
|
847
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
848
|
+
flipped.push(j.id);
|
|
849
|
+
}
|
|
850
|
+
return { flipped, count: flipped.length };
|
|
851
|
+
}
|
|
852
|
+
export function getCliContextEngineeringGovStatsV2() {
|
|
853
|
+
const profilesByStatus = {};
|
|
854
|
+
for (const v of Object.values(CTXENGGOV_PROFILE_MATURITY_V2))
|
|
855
|
+
profilesByStatus[v] = 0;
|
|
856
|
+
for (const p of _ctxenggovPsV2.values()) profilesByStatus[p.status]++;
|
|
857
|
+
const buildsByStatus = {};
|
|
858
|
+
for (const v of Object.values(CTXENGGOV_BUILD_LIFECYCLE_V2))
|
|
859
|
+
buildsByStatus[v] = 0;
|
|
860
|
+
for (const j of _ctxenggovJsV2.values()) buildsByStatus[j.status]++;
|
|
861
|
+
return {
|
|
862
|
+
totalCtxenggovProfilesV2: _ctxenggovPsV2.size,
|
|
863
|
+
totalCtxenggovBuildsV2: _ctxenggovJsV2.size,
|
|
864
|
+
maxActiveCtxenggovProfilesPerOwner: _ctxenggovMaxActive,
|
|
865
|
+
maxPendingCtxenggovBuildsPerProfile: _ctxenggovMaxPending,
|
|
866
|
+
ctxenggovProfileIdleMs: _ctxenggovIdleMs,
|
|
867
|
+
ctxenggovBuildStuckMs: _ctxenggovStuckMs,
|
|
868
|
+
profilesByStatus,
|
|
869
|
+
buildsByStatus,
|
|
870
|
+
};
|
|
871
|
+
}
|