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
|
@@ -118,3 +118,351 @@ export function buildProviderSource(provider, opts = {}) {
|
|
|
118
118
|
signal,
|
|
119
119
|
});
|
|
120
120
|
}
|
|
121
|
+
|
|
122
|
+
// =====================================================================
|
|
123
|
+
// provider-stream V2 governance overlay (iter27)
|
|
124
|
+
// =====================================================================
|
|
125
|
+
export const PSTRMGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
126
|
+
PENDING: "pending",
|
|
127
|
+
ACTIVE: "active",
|
|
128
|
+
STALE: "stale",
|
|
129
|
+
ARCHIVED: "archived",
|
|
130
|
+
});
|
|
131
|
+
export const PSTRMGOV_CHUNK_LIFECYCLE_V2 = Object.freeze({
|
|
132
|
+
QUEUED: "queued",
|
|
133
|
+
STREAMING: "streaming",
|
|
134
|
+
FLUSHED: "flushed",
|
|
135
|
+
FAILED: "failed",
|
|
136
|
+
CANCELLED: "cancelled",
|
|
137
|
+
});
|
|
138
|
+
const _pstrmgovPTrans = new Map([
|
|
139
|
+
[
|
|
140
|
+
PSTRMGOV_PROFILE_MATURITY_V2.PENDING,
|
|
141
|
+
new Set([
|
|
142
|
+
PSTRMGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
143
|
+
PSTRMGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
144
|
+
]),
|
|
145
|
+
],
|
|
146
|
+
[
|
|
147
|
+
PSTRMGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
148
|
+
new Set([
|
|
149
|
+
PSTRMGOV_PROFILE_MATURITY_V2.STALE,
|
|
150
|
+
PSTRMGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
151
|
+
]),
|
|
152
|
+
],
|
|
153
|
+
[
|
|
154
|
+
PSTRMGOV_PROFILE_MATURITY_V2.STALE,
|
|
155
|
+
new Set([
|
|
156
|
+
PSTRMGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
157
|
+
PSTRMGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
158
|
+
]),
|
|
159
|
+
],
|
|
160
|
+
[PSTRMGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
161
|
+
]);
|
|
162
|
+
const _pstrmgovPTerminal = new Set([PSTRMGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
163
|
+
const _pstrmgovJTrans = new Map([
|
|
164
|
+
[
|
|
165
|
+
PSTRMGOV_CHUNK_LIFECYCLE_V2.QUEUED,
|
|
166
|
+
new Set([
|
|
167
|
+
PSTRMGOV_CHUNK_LIFECYCLE_V2.STREAMING,
|
|
168
|
+
PSTRMGOV_CHUNK_LIFECYCLE_V2.CANCELLED,
|
|
169
|
+
]),
|
|
170
|
+
],
|
|
171
|
+
[
|
|
172
|
+
PSTRMGOV_CHUNK_LIFECYCLE_V2.STREAMING,
|
|
173
|
+
new Set([
|
|
174
|
+
PSTRMGOV_CHUNK_LIFECYCLE_V2.FLUSHED,
|
|
175
|
+
PSTRMGOV_CHUNK_LIFECYCLE_V2.FAILED,
|
|
176
|
+
PSTRMGOV_CHUNK_LIFECYCLE_V2.CANCELLED,
|
|
177
|
+
]),
|
|
178
|
+
],
|
|
179
|
+
[PSTRMGOV_CHUNK_LIFECYCLE_V2.FLUSHED, new Set()],
|
|
180
|
+
[PSTRMGOV_CHUNK_LIFECYCLE_V2.FAILED, new Set()],
|
|
181
|
+
[PSTRMGOV_CHUNK_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
182
|
+
]);
|
|
183
|
+
const _pstrmgovPsV2 = new Map();
|
|
184
|
+
const _pstrmgovJsV2 = new Map();
|
|
185
|
+
let _pstrmgovMaxActive = 8,
|
|
186
|
+
_pstrmgovMaxPending = 25,
|
|
187
|
+
_pstrmgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
188
|
+
_pstrmgovStuckMs = 60 * 1000;
|
|
189
|
+
function _pstrmgovPos(n, label) {
|
|
190
|
+
const v = Math.floor(Number(n));
|
|
191
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
192
|
+
throw new Error(`${label} must be positive integer`);
|
|
193
|
+
return v;
|
|
194
|
+
}
|
|
195
|
+
function _pstrmgovCheckP(from, to) {
|
|
196
|
+
const a = _pstrmgovPTrans.get(from);
|
|
197
|
+
if (!a || !a.has(to))
|
|
198
|
+
throw new Error(`invalid pstrmgov profile transition ${from} → ${to}`);
|
|
199
|
+
}
|
|
200
|
+
function _pstrmgovCheckJ(from, to) {
|
|
201
|
+
const a = _pstrmgovJTrans.get(from);
|
|
202
|
+
if (!a || !a.has(to))
|
|
203
|
+
throw new Error(`invalid pstrmgov chunk transition ${from} → ${to}`);
|
|
204
|
+
}
|
|
205
|
+
function _pstrmgovCountActive(owner) {
|
|
206
|
+
let c = 0;
|
|
207
|
+
for (const p of _pstrmgovPsV2.values())
|
|
208
|
+
if (p.owner === owner && p.status === PSTRMGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
209
|
+
c++;
|
|
210
|
+
return c;
|
|
211
|
+
}
|
|
212
|
+
function _pstrmgovCountPending(profileId) {
|
|
213
|
+
let c = 0;
|
|
214
|
+
for (const j of _pstrmgovJsV2.values())
|
|
215
|
+
if (
|
|
216
|
+
j.profileId === profileId &&
|
|
217
|
+
(j.status === PSTRMGOV_CHUNK_LIFECYCLE_V2.QUEUED ||
|
|
218
|
+
j.status === PSTRMGOV_CHUNK_LIFECYCLE_V2.STREAMING)
|
|
219
|
+
)
|
|
220
|
+
c++;
|
|
221
|
+
return c;
|
|
222
|
+
}
|
|
223
|
+
export function setMaxActivePstrmgovProfilesPerOwnerV2(n) {
|
|
224
|
+
_pstrmgovMaxActive = _pstrmgovPos(n, "maxActivePstrmgovProfilesPerOwner");
|
|
225
|
+
}
|
|
226
|
+
export function getMaxActivePstrmgovProfilesPerOwnerV2() {
|
|
227
|
+
return _pstrmgovMaxActive;
|
|
228
|
+
}
|
|
229
|
+
export function setMaxPendingPstrmgovChunksPerProfileV2(n) {
|
|
230
|
+
_pstrmgovMaxPending = _pstrmgovPos(n, "maxPendingPstrmgovChunksPerProfile");
|
|
231
|
+
}
|
|
232
|
+
export function getMaxPendingPstrmgovChunksPerProfileV2() {
|
|
233
|
+
return _pstrmgovMaxPending;
|
|
234
|
+
}
|
|
235
|
+
export function setPstrmgovProfileIdleMsV2(n) {
|
|
236
|
+
_pstrmgovIdleMs = _pstrmgovPos(n, "pstrmgovProfileIdleMs");
|
|
237
|
+
}
|
|
238
|
+
export function getPstrmgovProfileIdleMsV2() {
|
|
239
|
+
return _pstrmgovIdleMs;
|
|
240
|
+
}
|
|
241
|
+
export function setPstrmgovChunkStuckMsV2(n) {
|
|
242
|
+
_pstrmgovStuckMs = _pstrmgovPos(n, "pstrmgovChunkStuckMs");
|
|
243
|
+
}
|
|
244
|
+
export function getPstrmgovChunkStuckMsV2() {
|
|
245
|
+
return _pstrmgovStuckMs;
|
|
246
|
+
}
|
|
247
|
+
export function _resetStateProviderStreamGovV2() {
|
|
248
|
+
_pstrmgovPsV2.clear();
|
|
249
|
+
_pstrmgovJsV2.clear();
|
|
250
|
+
_pstrmgovMaxActive = 8;
|
|
251
|
+
_pstrmgovMaxPending = 25;
|
|
252
|
+
_pstrmgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
253
|
+
_pstrmgovStuckMs = 60 * 1000;
|
|
254
|
+
}
|
|
255
|
+
export function registerPstrmgovProfileV2({
|
|
256
|
+
id,
|
|
257
|
+
owner,
|
|
258
|
+
provider,
|
|
259
|
+
metadata,
|
|
260
|
+
} = {}) {
|
|
261
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
262
|
+
if (_pstrmgovPsV2.has(id))
|
|
263
|
+
throw new Error(`pstrmgov profile ${id} already exists`);
|
|
264
|
+
const now = Date.now();
|
|
265
|
+
const p = {
|
|
266
|
+
id,
|
|
267
|
+
owner,
|
|
268
|
+
provider: provider || "default",
|
|
269
|
+
status: PSTRMGOV_PROFILE_MATURITY_V2.PENDING,
|
|
270
|
+
createdAt: now,
|
|
271
|
+
updatedAt: now,
|
|
272
|
+
lastTouchedAt: now,
|
|
273
|
+
activatedAt: null,
|
|
274
|
+
archivedAt: null,
|
|
275
|
+
metadata: { ...(metadata || {}) },
|
|
276
|
+
};
|
|
277
|
+
_pstrmgovPsV2.set(id, p);
|
|
278
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
279
|
+
}
|
|
280
|
+
export function activatePstrmgovProfileV2(id) {
|
|
281
|
+
const p = _pstrmgovPsV2.get(id);
|
|
282
|
+
if (!p) throw new Error(`pstrmgov profile ${id} not found`);
|
|
283
|
+
const isInitial = p.status === PSTRMGOV_PROFILE_MATURITY_V2.PENDING;
|
|
284
|
+
_pstrmgovCheckP(p.status, PSTRMGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
285
|
+
if (isInitial && _pstrmgovCountActive(p.owner) >= _pstrmgovMaxActive)
|
|
286
|
+
throw new Error(
|
|
287
|
+
`max active pstrmgov profiles for owner ${p.owner} reached`,
|
|
288
|
+
);
|
|
289
|
+
const now = Date.now();
|
|
290
|
+
p.status = PSTRMGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
291
|
+
p.updatedAt = now;
|
|
292
|
+
p.lastTouchedAt = now;
|
|
293
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
294
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
295
|
+
}
|
|
296
|
+
export function stalePstrmgovProfileV2(id) {
|
|
297
|
+
const p = _pstrmgovPsV2.get(id);
|
|
298
|
+
if (!p) throw new Error(`pstrmgov profile ${id} not found`);
|
|
299
|
+
_pstrmgovCheckP(p.status, PSTRMGOV_PROFILE_MATURITY_V2.STALE);
|
|
300
|
+
p.status = PSTRMGOV_PROFILE_MATURITY_V2.STALE;
|
|
301
|
+
p.updatedAt = Date.now();
|
|
302
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
303
|
+
}
|
|
304
|
+
export function archivePstrmgovProfileV2(id) {
|
|
305
|
+
const p = _pstrmgovPsV2.get(id);
|
|
306
|
+
if (!p) throw new Error(`pstrmgov profile ${id} not found`);
|
|
307
|
+
_pstrmgovCheckP(p.status, PSTRMGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
308
|
+
const now = Date.now();
|
|
309
|
+
p.status = PSTRMGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
310
|
+
p.updatedAt = now;
|
|
311
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
312
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
313
|
+
}
|
|
314
|
+
export function touchPstrmgovProfileV2(id) {
|
|
315
|
+
const p = _pstrmgovPsV2.get(id);
|
|
316
|
+
if (!p) throw new Error(`pstrmgov profile ${id} not found`);
|
|
317
|
+
if (_pstrmgovPTerminal.has(p.status))
|
|
318
|
+
throw new Error(`cannot touch terminal pstrmgov profile ${id}`);
|
|
319
|
+
const now = Date.now();
|
|
320
|
+
p.lastTouchedAt = now;
|
|
321
|
+
p.updatedAt = now;
|
|
322
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
323
|
+
}
|
|
324
|
+
export function getPstrmgovProfileV2(id) {
|
|
325
|
+
const p = _pstrmgovPsV2.get(id);
|
|
326
|
+
if (!p) return null;
|
|
327
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
328
|
+
}
|
|
329
|
+
export function listPstrmgovProfilesV2() {
|
|
330
|
+
return [..._pstrmgovPsV2.values()].map((p) => ({
|
|
331
|
+
...p,
|
|
332
|
+
metadata: { ...p.metadata },
|
|
333
|
+
}));
|
|
334
|
+
}
|
|
335
|
+
export function createPstrmgovChunkV2({
|
|
336
|
+
id,
|
|
337
|
+
profileId,
|
|
338
|
+
tokenId,
|
|
339
|
+
metadata,
|
|
340
|
+
} = {}) {
|
|
341
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
342
|
+
if (_pstrmgovJsV2.has(id))
|
|
343
|
+
throw new Error(`pstrmgov chunk ${id} already exists`);
|
|
344
|
+
if (!_pstrmgovPsV2.has(profileId))
|
|
345
|
+
throw new Error(`pstrmgov profile ${profileId} not found`);
|
|
346
|
+
if (_pstrmgovCountPending(profileId) >= _pstrmgovMaxPending)
|
|
347
|
+
throw new Error(
|
|
348
|
+
`max pending pstrmgov chunks for profile ${profileId} reached`,
|
|
349
|
+
);
|
|
350
|
+
const now = Date.now();
|
|
351
|
+
const j = {
|
|
352
|
+
id,
|
|
353
|
+
profileId,
|
|
354
|
+
tokenId: tokenId || "",
|
|
355
|
+
status: PSTRMGOV_CHUNK_LIFECYCLE_V2.QUEUED,
|
|
356
|
+
createdAt: now,
|
|
357
|
+
updatedAt: now,
|
|
358
|
+
startedAt: null,
|
|
359
|
+
settledAt: null,
|
|
360
|
+
metadata: { ...(metadata || {}) },
|
|
361
|
+
};
|
|
362
|
+
_pstrmgovJsV2.set(id, j);
|
|
363
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
364
|
+
}
|
|
365
|
+
export function streamingPstrmgovChunkV2(id) {
|
|
366
|
+
const j = _pstrmgovJsV2.get(id);
|
|
367
|
+
if (!j) throw new Error(`pstrmgov chunk ${id} not found`);
|
|
368
|
+
_pstrmgovCheckJ(j.status, PSTRMGOV_CHUNK_LIFECYCLE_V2.STREAMING);
|
|
369
|
+
const now = Date.now();
|
|
370
|
+
j.status = PSTRMGOV_CHUNK_LIFECYCLE_V2.STREAMING;
|
|
371
|
+
j.updatedAt = now;
|
|
372
|
+
if (!j.startedAt) j.startedAt = now;
|
|
373
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
374
|
+
}
|
|
375
|
+
export function completeChunkPstrmgovV2(id) {
|
|
376
|
+
const j = _pstrmgovJsV2.get(id);
|
|
377
|
+
if (!j) throw new Error(`pstrmgov chunk ${id} not found`);
|
|
378
|
+
_pstrmgovCheckJ(j.status, PSTRMGOV_CHUNK_LIFECYCLE_V2.FLUSHED);
|
|
379
|
+
const now = Date.now();
|
|
380
|
+
j.status = PSTRMGOV_CHUNK_LIFECYCLE_V2.FLUSHED;
|
|
381
|
+
j.updatedAt = now;
|
|
382
|
+
if (!j.settledAt) j.settledAt = now;
|
|
383
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
384
|
+
}
|
|
385
|
+
export function failPstrmgovChunkV2(id, reason) {
|
|
386
|
+
const j = _pstrmgovJsV2.get(id);
|
|
387
|
+
if (!j) throw new Error(`pstrmgov chunk ${id} not found`);
|
|
388
|
+
_pstrmgovCheckJ(j.status, PSTRMGOV_CHUNK_LIFECYCLE_V2.FAILED);
|
|
389
|
+
const now = Date.now();
|
|
390
|
+
j.status = PSTRMGOV_CHUNK_LIFECYCLE_V2.FAILED;
|
|
391
|
+
j.updatedAt = now;
|
|
392
|
+
if (!j.settledAt) j.settledAt = now;
|
|
393
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
394
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
395
|
+
}
|
|
396
|
+
export function cancelPstrmgovChunkV2(id, reason) {
|
|
397
|
+
const j = _pstrmgovJsV2.get(id);
|
|
398
|
+
if (!j) throw new Error(`pstrmgov chunk ${id} not found`);
|
|
399
|
+
_pstrmgovCheckJ(j.status, PSTRMGOV_CHUNK_LIFECYCLE_V2.CANCELLED);
|
|
400
|
+
const now = Date.now();
|
|
401
|
+
j.status = PSTRMGOV_CHUNK_LIFECYCLE_V2.CANCELLED;
|
|
402
|
+
j.updatedAt = now;
|
|
403
|
+
if (!j.settledAt) j.settledAt = now;
|
|
404
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
405
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
406
|
+
}
|
|
407
|
+
export function getPstrmgovChunkV2(id) {
|
|
408
|
+
const j = _pstrmgovJsV2.get(id);
|
|
409
|
+
if (!j) return null;
|
|
410
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
411
|
+
}
|
|
412
|
+
export function listPstrmgovChunksV2() {
|
|
413
|
+
return [..._pstrmgovJsV2.values()].map((j) => ({
|
|
414
|
+
...j,
|
|
415
|
+
metadata: { ...j.metadata },
|
|
416
|
+
}));
|
|
417
|
+
}
|
|
418
|
+
export function autoStaleIdlePstrmgovProfilesV2({ now } = {}) {
|
|
419
|
+
const t = now ?? Date.now();
|
|
420
|
+
const flipped = [];
|
|
421
|
+
for (const p of _pstrmgovPsV2.values())
|
|
422
|
+
if (
|
|
423
|
+
p.status === PSTRMGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
424
|
+
t - p.lastTouchedAt >= _pstrmgovIdleMs
|
|
425
|
+
) {
|
|
426
|
+
p.status = PSTRMGOV_PROFILE_MATURITY_V2.STALE;
|
|
427
|
+
p.updatedAt = t;
|
|
428
|
+
flipped.push(p.id);
|
|
429
|
+
}
|
|
430
|
+
return { flipped, count: flipped.length };
|
|
431
|
+
}
|
|
432
|
+
export function autoFailStuckPstrmgovChunksV2({ now } = {}) {
|
|
433
|
+
const t = now ?? Date.now();
|
|
434
|
+
const flipped = [];
|
|
435
|
+
for (const j of _pstrmgovJsV2.values())
|
|
436
|
+
if (
|
|
437
|
+
j.status === PSTRMGOV_CHUNK_LIFECYCLE_V2.STREAMING &&
|
|
438
|
+
j.startedAt != null &&
|
|
439
|
+
t - j.startedAt >= _pstrmgovStuckMs
|
|
440
|
+
) {
|
|
441
|
+
j.status = PSTRMGOV_CHUNK_LIFECYCLE_V2.FAILED;
|
|
442
|
+
j.updatedAt = t;
|
|
443
|
+
if (!j.settledAt) j.settledAt = t;
|
|
444
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
445
|
+
flipped.push(j.id);
|
|
446
|
+
}
|
|
447
|
+
return { flipped, count: flipped.length };
|
|
448
|
+
}
|
|
449
|
+
export function getProviderStreamGovStatsV2() {
|
|
450
|
+
const profilesByStatus = {};
|
|
451
|
+
for (const v of Object.values(PSTRMGOV_PROFILE_MATURITY_V2))
|
|
452
|
+
profilesByStatus[v] = 0;
|
|
453
|
+
for (const p of _pstrmgovPsV2.values()) profilesByStatus[p.status]++;
|
|
454
|
+
const chunksByStatus = {};
|
|
455
|
+
for (const v of Object.values(PSTRMGOV_CHUNK_LIFECYCLE_V2))
|
|
456
|
+
chunksByStatus[v] = 0;
|
|
457
|
+
for (const j of _pstrmgovJsV2.values()) chunksByStatus[j.status]++;
|
|
458
|
+
return {
|
|
459
|
+
totalPstrmgovProfilesV2: _pstrmgovPsV2.size,
|
|
460
|
+
totalPstrmgovChunksV2: _pstrmgovJsV2.size,
|
|
461
|
+
maxActivePstrmgovProfilesPerOwner: _pstrmgovMaxActive,
|
|
462
|
+
maxPendingPstrmgovChunksPerProfile: _pstrmgovMaxPending,
|
|
463
|
+
pstrmgovProfileIdleMs: _pstrmgovIdleMs,
|
|
464
|
+
pstrmgovChunkStuckMs: _pstrmgovStuckMs,
|
|
465
|
+
profilesByStatus,
|
|
466
|
+
chunksByStatus,
|
|
467
|
+
};
|
|
468
|
+
}
|
package/src/lib/quantization.js
CHANGED
|
@@ -685,3 +685,340 @@ export function _resetStateV2() {
|
|
|
685
685
|
_modelsV2.clear();
|
|
686
686
|
_jobTicketsV2.clear();
|
|
687
687
|
}
|
|
688
|
+
|
|
689
|
+
// =====================================================================
|
|
690
|
+
// quantization V2 governance overlay (iter18)
|
|
691
|
+
// =====================================================================
|
|
692
|
+
export const QNTGOV_PROFILE_MATURITY_V2 = Object.freeze({
|
|
693
|
+
PENDING: "pending",
|
|
694
|
+
ACTIVE: "active",
|
|
695
|
+
STALE: "stale",
|
|
696
|
+
ARCHIVED: "archived",
|
|
697
|
+
});
|
|
698
|
+
export const QNTGOV_JOB_LIFECYCLE_V2 = Object.freeze({
|
|
699
|
+
QUEUED: "queued",
|
|
700
|
+
QUANTIZING: "quantizing",
|
|
701
|
+
QUANTIZED: "quantized",
|
|
702
|
+
FAILED: "failed",
|
|
703
|
+
CANCELLED: "cancelled",
|
|
704
|
+
});
|
|
705
|
+
const _qntgovPTrans = new Map([
|
|
706
|
+
[
|
|
707
|
+
QNTGOV_PROFILE_MATURITY_V2.PENDING,
|
|
708
|
+
new Set([
|
|
709
|
+
QNTGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
710
|
+
QNTGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
711
|
+
]),
|
|
712
|
+
],
|
|
713
|
+
[
|
|
714
|
+
QNTGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
715
|
+
new Set([
|
|
716
|
+
QNTGOV_PROFILE_MATURITY_V2.STALE,
|
|
717
|
+
QNTGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
718
|
+
]),
|
|
719
|
+
],
|
|
720
|
+
[
|
|
721
|
+
QNTGOV_PROFILE_MATURITY_V2.STALE,
|
|
722
|
+
new Set([
|
|
723
|
+
QNTGOV_PROFILE_MATURITY_V2.ACTIVE,
|
|
724
|
+
QNTGOV_PROFILE_MATURITY_V2.ARCHIVED,
|
|
725
|
+
]),
|
|
726
|
+
],
|
|
727
|
+
[QNTGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
|
|
728
|
+
]);
|
|
729
|
+
const _qntgovPTerminal = new Set([QNTGOV_PROFILE_MATURITY_V2.ARCHIVED]);
|
|
730
|
+
const _qntgovJTrans = new Map([
|
|
731
|
+
[
|
|
732
|
+
QNTGOV_JOB_LIFECYCLE_V2.QUEUED,
|
|
733
|
+
new Set([
|
|
734
|
+
QNTGOV_JOB_LIFECYCLE_V2.QUANTIZING,
|
|
735
|
+
QNTGOV_JOB_LIFECYCLE_V2.CANCELLED,
|
|
736
|
+
]),
|
|
737
|
+
],
|
|
738
|
+
[
|
|
739
|
+
QNTGOV_JOB_LIFECYCLE_V2.QUANTIZING,
|
|
740
|
+
new Set([
|
|
741
|
+
QNTGOV_JOB_LIFECYCLE_V2.QUANTIZED,
|
|
742
|
+
QNTGOV_JOB_LIFECYCLE_V2.FAILED,
|
|
743
|
+
QNTGOV_JOB_LIFECYCLE_V2.CANCELLED,
|
|
744
|
+
]),
|
|
745
|
+
],
|
|
746
|
+
[QNTGOV_JOB_LIFECYCLE_V2.QUANTIZED, new Set()],
|
|
747
|
+
[QNTGOV_JOB_LIFECYCLE_V2.FAILED, new Set()],
|
|
748
|
+
[QNTGOV_JOB_LIFECYCLE_V2.CANCELLED, new Set()],
|
|
749
|
+
]);
|
|
750
|
+
const _qntgovPsV2 = new Map();
|
|
751
|
+
const _qntgovJsV2 = new Map();
|
|
752
|
+
let _qntgovMaxActive = 6,
|
|
753
|
+
_qntgovMaxPending = 12,
|
|
754
|
+
_qntgovIdleMs = 30 * 24 * 60 * 60 * 1000,
|
|
755
|
+
_qntgovStuckMs = 60 * 1000;
|
|
756
|
+
function _qntgovPos(n, label) {
|
|
757
|
+
const v = Math.floor(Number(n));
|
|
758
|
+
if (!Number.isFinite(v) || v <= 0)
|
|
759
|
+
throw new Error(`${label} must be positive integer`);
|
|
760
|
+
return v;
|
|
761
|
+
}
|
|
762
|
+
function _qntgovCheckP(from, to) {
|
|
763
|
+
const a = _qntgovPTrans.get(from);
|
|
764
|
+
if (!a || !a.has(to))
|
|
765
|
+
throw new Error(`invalid qntgov profile transition ${from} → ${to}`);
|
|
766
|
+
}
|
|
767
|
+
function _qntgovCheckJ(from, to) {
|
|
768
|
+
const a = _qntgovJTrans.get(from);
|
|
769
|
+
if (!a || !a.has(to))
|
|
770
|
+
throw new Error(`invalid qntgov job transition ${from} → ${to}`);
|
|
771
|
+
}
|
|
772
|
+
function _qntgovCountActive(owner) {
|
|
773
|
+
let c = 0;
|
|
774
|
+
for (const p of _qntgovPsV2.values())
|
|
775
|
+
if (p.owner === owner && p.status === QNTGOV_PROFILE_MATURITY_V2.ACTIVE)
|
|
776
|
+
c++;
|
|
777
|
+
return c;
|
|
778
|
+
}
|
|
779
|
+
function _qntgovCountPending(profileId) {
|
|
780
|
+
let c = 0;
|
|
781
|
+
for (const j of _qntgovJsV2.values())
|
|
782
|
+
if (
|
|
783
|
+
j.profileId === profileId &&
|
|
784
|
+
(j.status === QNTGOV_JOB_LIFECYCLE_V2.QUEUED ||
|
|
785
|
+
j.status === QNTGOV_JOB_LIFECYCLE_V2.QUANTIZING)
|
|
786
|
+
)
|
|
787
|
+
c++;
|
|
788
|
+
return c;
|
|
789
|
+
}
|
|
790
|
+
export function setMaxActiveQntgovProfilesPerOwnerV2(n) {
|
|
791
|
+
_qntgovMaxActive = _qntgovPos(n, "maxActiveQntgovProfilesPerOwner");
|
|
792
|
+
}
|
|
793
|
+
export function getMaxActiveQntgovProfilesPerOwnerV2() {
|
|
794
|
+
return _qntgovMaxActive;
|
|
795
|
+
}
|
|
796
|
+
export function setMaxPendingQntgovJobsPerProfileV2(n) {
|
|
797
|
+
_qntgovMaxPending = _qntgovPos(n, "maxPendingQntgovJobsPerProfile");
|
|
798
|
+
}
|
|
799
|
+
export function getMaxPendingQntgovJobsPerProfileV2() {
|
|
800
|
+
return _qntgovMaxPending;
|
|
801
|
+
}
|
|
802
|
+
export function setQntgovProfileIdleMsV2(n) {
|
|
803
|
+
_qntgovIdleMs = _qntgovPos(n, "qntgovProfileIdleMs");
|
|
804
|
+
}
|
|
805
|
+
export function getQntgovProfileIdleMsV2() {
|
|
806
|
+
return _qntgovIdleMs;
|
|
807
|
+
}
|
|
808
|
+
export function setQntgovJobStuckMsV2(n) {
|
|
809
|
+
_qntgovStuckMs = _qntgovPos(n, "qntgovJobStuckMs");
|
|
810
|
+
}
|
|
811
|
+
export function getQntgovJobStuckMsV2() {
|
|
812
|
+
return _qntgovStuckMs;
|
|
813
|
+
}
|
|
814
|
+
export function _resetStateQuantizationGovV2() {
|
|
815
|
+
_qntgovPsV2.clear();
|
|
816
|
+
_qntgovJsV2.clear();
|
|
817
|
+
_qntgovMaxActive = 6;
|
|
818
|
+
_qntgovMaxPending = 12;
|
|
819
|
+
_qntgovIdleMs = 30 * 24 * 60 * 60 * 1000;
|
|
820
|
+
_qntgovStuckMs = 60 * 1000;
|
|
821
|
+
}
|
|
822
|
+
export function registerQntgovProfileV2({
|
|
823
|
+
id,
|
|
824
|
+
owner,
|
|
825
|
+
precision,
|
|
826
|
+
metadata,
|
|
827
|
+
} = {}) {
|
|
828
|
+
if (!id || !owner) throw new Error("id and owner required");
|
|
829
|
+
if (_qntgovPsV2.has(id))
|
|
830
|
+
throw new Error(`qntgov profile ${id} already exists`);
|
|
831
|
+
const now = Date.now();
|
|
832
|
+
const p = {
|
|
833
|
+
id,
|
|
834
|
+
owner,
|
|
835
|
+
precision: precision || "int8",
|
|
836
|
+
status: QNTGOV_PROFILE_MATURITY_V2.PENDING,
|
|
837
|
+
createdAt: now,
|
|
838
|
+
updatedAt: now,
|
|
839
|
+
lastTouchedAt: now,
|
|
840
|
+
activatedAt: null,
|
|
841
|
+
archivedAt: null,
|
|
842
|
+
metadata: { ...(metadata || {}) },
|
|
843
|
+
};
|
|
844
|
+
_qntgovPsV2.set(id, p);
|
|
845
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
846
|
+
}
|
|
847
|
+
export function activateQntgovProfileV2(id) {
|
|
848
|
+
const p = _qntgovPsV2.get(id);
|
|
849
|
+
if (!p) throw new Error(`qntgov profile ${id} not found`);
|
|
850
|
+
const isInitial = p.status === QNTGOV_PROFILE_MATURITY_V2.PENDING;
|
|
851
|
+
_qntgovCheckP(p.status, QNTGOV_PROFILE_MATURITY_V2.ACTIVE);
|
|
852
|
+
if (isInitial && _qntgovCountActive(p.owner) >= _qntgovMaxActive)
|
|
853
|
+
throw new Error(`max active qntgov profiles for owner ${p.owner} reached`);
|
|
854
|
+
const now = Date.now();
|
|
855
|
+
p.status = QNTGOV_PROFILE_MATURITY_V2.ACTIVE;
|
|
856
|
+
p.updatedAt = now;
|
|
857
|
+
p.lastTouchedAt = now;
|
|
858
|
+
if (!p.activatedAt) p.activatedAt = now;
|
|
859
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
860
|
+
}
|
|
861
|
+
export function staleQntgovProfileV2(id) {
|
|
862
|
+
const p = _qntgovPsV2.get(id);
|
|
863
|
+
if (!p) throw new Error(`qntgov profile ${id} not found`);
|
|
864
|
+
_qntgovCheckP(p.status, QNTGOV_PROFILE_MATURITY_V2.STALE);
|
|
865
|
+
p.status = QNTGOV_PROFILE_MATURITY_V2.STALE;
|
|
866
|
+
p.updatedAt = Date.now();
|
|
867
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
868
|
+
}
|
|
869
|
+
export function archiveQntgovProfileV2(id) {
|
|
870
|
+
const p = _qntgovPsV2.get(id);
|
|
871
|
+
if (!p) throw new Error(`qntgov profile ${id} not found`);
|
|
872
|
+
_qntgovCheckP(p.status, QNTGOV_PROFILE_MATURITY_V2.ARCHIVED);
|
|
873
|
+
const now = Date.now();
|
|
874
|
+
p.status = QNTGOV_PROFILE_MATURITY_V2.ARCHIVED;
|
|
875
|
+
p.updatedAt = now;
|
|
876
|
+
if (!p.archivedAt) p.archivedAt = now;
|
|
877
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
878
|
+
}
|
|
879
|
+
export function touchQntgovProfileV2(id) {
|
|
880
|
+
const p = _qntgovPsV2.get(id);
|
|
881
|
+
if (!p) throw new Error(`qntgov profile ${id} not found`);
|
|
882
|
+
if (_qntgovPTerminal.has(p.status))
|
|
883
|
+
throw new Error(`cannot touch terminal qntgov profile ${id}`);
|
|
884
|
+
const now = Date.now();
|
|
885
|
+
p.lastTouchedAt = now;
|
|
886
|
+
p.updatedAt = now;
|
|
887
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
888
|
+
}
|
|
889
|
+
export function getQntgovProfileV2(id) {
|
|
890
|
+
const p = _qntgovPsV2.get(id);
|
|
891
|
+
if (!p) return null;
|
|
892
|
+
return { ...p, metadata: { ...p.metadata } };
|
|
893
|
+
}
|
|
894
|
+
export function listQntgovProfilesV2() {
|
|
895
|
+
return [..._qntgovPsV2.values()].map((p) => ({
|
|
896
|
+
...p,
|
|
897
|
+
metadata: { ...p.metadata },
|
|
898
|
+
}));
|
|
899
|
+
}
|
|
900
|
+
export function createQntgovJobV2({ id, profileId, model, metadata } = {}) {
|
|
901
|
+
if (!id || !profileId) throw new Error("id and profileId required");
|
|
902
|
+
if (_qntgovJsV2.has(id)) throw new Error(`qntgov job ${id} already exists`);
|
|
903
|
+
if (!_qntgovPsV2.has(profileId))
|
|
904
|
+
throw new Error(`qntgov profile ${profileId} not found`);
|
|
905
|
+
if (_qntgovCountPending(profileId) >= _qntgovMaxPending)
|
|
906
|
+
throw new Error(`max pending qntgov jobs for profile ${profileId} reached`);
|
|
907
|
+
const now = Date.now();
|
|
908
|
+
const j = {
|
|
909
|
+
id,
|
|
910
|
+
profileId,
|
|
911
|
+
model: model || "",
|
|
912
|
+
status: QNTGOV_JOB_LIFECYCLE_V2.QUEUED,
|
|
913
|
+
createdAt: now,
|
|
914
|
+
updatedAt: now,
|
|
915
|
+
startedAt: null,
|
|
916
|
+
settledAt: null,
|
|
917
|
+
metadata: { ...(metadata || {}) },
|
|
918
|
+
};
|
|
919
|
+
_qntgovJsV2.set(id, j);
|
|
920
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
921
|
+
}
|
|
922
|
+
export function quantizingQntgovJobV2(id) {
|
|
923
|
+
const j = _qntgovJsV2.get(id);
|
|
924
|
+
if (!j) throw new Error(`qntgov job ${id} not found`);
|
|
925
|
+
_qntgovCheckJ(j.status, QNTGOV_JOB_LIFECYCLE_V2.QUANTIZING);
|
|
926
|
+
const now = Date.now();
|
|
927
|
+
j.status = QNTGOV_JOB_LIFECYCLE_V2.QUANTIZING;
|
|
928
|
+
j.updatedAt = now;
|
|
929
|
+
if (!j.startedAt) j.startedAt = now;
|
|
930
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
931
|
+
}
|
|
932
|
+
export function completeJobQntgovV2(id) {
|
|
933
|
+
const j = _qntgovJsV2.get(id);
|
|
934
|
+
if (!j) throw new Error(`qntgov job ${id} not found`);
|
|
935
|
+
_qntgovCheckJ(j.status, QNTGOV_JOB_LIFECYCLE_V2.QUANTIZED);
|
|
936
|
+
const now = Date.now();
|
|
937
|
+
j.status = QNTGOV_JOB_LIFECYCLE_V2.QUANTIZED;
|
|
938
|
+
j.updatedAt = now;
|
|
939
|
+
if (!j.settledAt) j.settledAt = now;
|
|
940
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
941
|
+
}
|
|
942
|
+
export function failQntgovJobV2(id, reason) {
|
|
943
|
+
const j = _qntgovJsV2.get(id);
|
|
944
|
+
if (!j) throw new Error(`qntgov job ${id} not found`);
|
|
945
|
+
_qntgovCheckJ(j.status, QNTGOV_JOB_LIFECYCLE_V2.FAILED);
|
|
946
|
+
const now = Date.now();
|
|
947
|
+
j.status = QNTGOV_JOB_LIFECYCLE_V2.FAILED;
|
|
948
|
+
j.updatedAt = now;
|
|
949
|
+
if (!j.settledAt) j.settledAt = now;
|
|
950
|
+
if (reason) j.metadata.failReason = String(reason);
|
|
951
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
952
|
+
}
|
|
953
|
+
export function cancelQntgovJobV2(id, reason) {
|
|
954
|
+
const j = _qntgovJsV2.get(id);
|
|
955
|
+
if (!j) throw new Error(`qntgov job ${id} not found`);
|
|
956
|
+
_qntgovCheckJ(j.status, QNTGOV_JOB_LIFECYCLE_V2.CANCELLED);
|
|
957
|
+
const now = Date.now();
|
|
958
|
+
j.status = QNTGOV_JOB_LIFECYCLE_V2.CANCELLED;
|
|
959
|
+
j.updatedAt = now;
|
|
960
|
+
if (!j.settledAt) j.settledAt = now;
|
|
961
|
+
if (reason) j.metadata.cancelReason = String(reason);
|
|
962
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
963
|
+
}
|
|
964
|
+
export function getQntgovJobV2(id) {
|
|
965
|
+
const j = _qntgovJsV2.get(id);
|
|
966
|
+
if (!j) return null;
|
|
967
|
+
return { ...j, metadata: { ...j.metadata } };
|
|
968
|
+
}
|
|
969
|
+
export function listQntgovJobsV2() {
|
|
970
|
+
return [..._qntgovJsV2.values()].map((j) => ({
|
|
971
|
+
...j,
|
|
972
|
+
metadata: { ...j.metadata },
|
|
973
|
+
}));
|
|
974
|
+
}
|
|
975
|
+
export function autoStaleIdleQntgovProfilesV2({ now } = {}) {
|
|
976
|
+
const t = now ?? Date.now();
|
|
977
|
+
const flipped = [];
|
|
978
|
+
for (const p of _qntgovPsV2.values())
|
|
979
|
+
if (
|
|
980
|
+
p.status === QNTGOV_PROFILE_MATURITY_V2.ACTIVE &&
|
|
981
|
+
t - p.lastTouchedAt >= _qntgovIdleMs
|
|
982
|
+
) {
|
|
983
|
+
p.status = QNTGOV_PROFILE_MATURITY_V2.STALE;
|
|
984
|
+
p.updatedAt = t;
|
|
985
|
+
flipped.push(p.id);
|
|
986
|
+
}
|
|
987
|
+
return { flipped, count: flipped.length };
|
|
988
|
+
}
|
|
989
|
+
export function autoFailStuckQntgovJobsV2({ now } = {}) {
|
|
990
|
+
const t = now ?? Date.now();
|
|
991
|
+
const flipped = [];
|
|
992
|
+
for (const j of _qntgovJsV2.values())
|
|
993
|
+
if (
|
|
994
|
+
j.status === QNTGOV_JOB_LIFECYCLE_V2.QUANTIZING &&
|
|
995
|
+
j.startedAt != null &&
|
|
996
|
+
t - j.startedAt >= _qntgovStuckMs
|
|
997
|
+
) {
|
|
998
|
+
j.status = QNTGOV_JOB_LIFECYCLE_V2.FAILED;
|
|
999
|
+
j.updatedAt = t;
|
|
1000
|
+
if (!j.settledAt) j.settledAt = t;
|
|
1001
|
+
j.metadata.failReason = "auto-fail-stuck";
|
|
1002
|
+
flipped.push(j.id);
|
|
1003
|
+
}
|
|
1004
|
+
return { flipped, count: flipped.length };
|
|
1005
|
+
}
|
|
1006
|
+
export function getQuantizationGovStatsV2() {
|
|
1007
|
+
const profilesByStatus = {};
|
|
1008
|
+
for (const v of Object.values(QNTGOV_PROFILE_MATURITY_V2))
|
|
1009
|
+
profilesByStatus[v] = 0;
|
|
1010
|
+
for (const p of _qntgovPsV2.values()) profilesByStatus[p.status]++;
|
|
1011
|
+
const jobsByStatus = {};
|
|
1012
|
+
for (const v of Object.values(QNTGOV_JOB_LIFECYCLE_V2)) jobsByStatus[v] = 0;
|
|
1013
|
+
for (const j of _qntgovJsV2.values()) jobsByStatus[j.status]++;
|
|
1014
|
+
return {
|
|
1015
|
+
totalQntgovProfilesV2: _qntgovPsV2.size,
|
|
1016
|
+
totalQntgovJobsV2: _qntgovJsV2.size,
|
|
1017
|
+
maxActiveQntgovProfilesPerOwner: _qntgovMaxActive,
|
|
1018
|
+
maxPendingQntgovJobsPerProfile: _qntgovMaxPending,
|
|
1019
|
+
qntgovProfileIdleMs: _qntgovIdleMs,
|
|
1020
|
+
qntgovJobStuckMs: _qntgovStuckMs,
|
|
1021
|
+
profilesByStatus,
|
|
1022
|
+
jobsByStatus,
|
|
1023
|
+
};
|
|
1024
|
+
}
|