chainlesschain 0.152.0 → 0.156.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +52 -3
  2. package/package.json +1 -1
  3. package/src/commands/a2a.js +201 -0
  4. package/src/commands/agent.js +1250 -0
  5. package/src/commands/chat.js +605 -0
  6. package/src/commands/cli-anything.js +426 -0
  7. package/src/commands/compliance.js +412 -0
  8. package/src/commands/config.js +213 -0
  9. package/src/commands/cowork.js +1463 -0
  10. package/src/commands/crosschain.js +203 -0
  11. package/src/commands/dao.js +203 -0
  12. package/src/commands/economy.js +199 -0
  13. package/src/commands/encrypt.js +201 -0
  14. package/src/commands/evolution.js +199 -0
  15. package/src/commands/evomap.js +625 -0
  16. package/src/commands/hmemory.js +203 -0
  17. package/src/commands/inference.js +207 -0
  18. package/src/commands/kg.js +195 -0
  19. package/src/commands/llm.js +209 -0
  20. package/src/commands/memory.js +203 -0
  21. package/src/commands/orchestrate.js +406 -0
  22. package/src/commands/pipeline.js +199 -0
  23. package/src/commands/planmode.js +426 -0
  24. package/src/commands/plugin.js +209 -0
  25. package/src/commands/services.js +207 -0
  26. package/src/commands/setup.js +205 -0
  27. package/src/commands/skill.js +207 -0
  28. package/src/commands/start.js +209 -0
  29. package/src/commands/stream.js +213 -0
  30. package/src/commands/ui.js +225 -0
  31. package/src/commands/workflow.js +209 -0
  32. package/src/index.js +112 -0
  33. package/src/lib/a2a-protocol.js +332 -0
  34. package/src/lib/agent-coordinator.js +334 -0
  35. package/src/lib/agent-economy.js +334 -0
  36. package/src/lib/agent-router.js +333 -0
  37. package/src/lib/autonomous-agent.js +332 -0
  38. package/src/lib/chat-core.js +335 -0
  39. package/src/lib/cli-anything-bridge.js +341 -0
  40. package/src/lib/cli-context-engineering.js +351 -0
  41. package/src/lib/compliance-manager.js +334 -0
  42. package/src/lib/cowork-adapter.js +336 -0
  43. package/src/lib/cowork-evomap-adapter.js +341 -0
  44. package/src/lib/cowork-mcp-tools.js +341 -0
  45. package/src/lib/cowork-observe-html.js +341 -0
  46. package/src/lib/cowork-observe.js +341 -0
  47. package/src/lib/cowork-task-templates.js +342 -1
  48. package/src/lib/cowork-template-marketplace.js +340 -0
  49. package/src/lib/cross-chain.js +339 -0
  50. package/src/lib/crypto-manager.js +334 -0
  51. package/src/lib/dao-governance.js +339 -0
  52. package/src/lib/downloader.js +334 -0
  53. package/src/lib/evolution-system.js +334 -0
  54. package/src/lib/evomap-client.js +342 -0
  55. package/src/lib/evomap-federation.js +338 -0
  56. package/src/lib/evomap-manager.js +330 -0
  57. package/src/lib/execution-backend.js +330 -0
  58. package/src/lib/hashline.js +338 -0
  59. package/src/lib/hierarchical-memory.js +334 -0
  60. package/src/lib/inference-network.js +341 -0
  61. package/src/lib/interaction-adapter.js +330 -0
  62. package/src/lib/interactive-planner.js +354 -0
  63. package/src/lib/knowledge-graph.js +331 -0
  64. package/src/lib/pipeline-orchestrator.js +332 -0
  65. package/src/lib/plan-mode.js +336 -0
  66. package/src/lib/plugin-autodiscovery.js +334 -0
  67. package/src/lib/process-manager.js +336 -0
  68. package/src/lib/provider-options.js +346 -0
  69. package/src/lib/provider-stream.js +348 -0
  70. package/src/lib/service-manager.js +337 -0
  71. package/src/lib/session-core-singletons.js +341 -0
  72. package/src/lib/skill-mcp.js +336 -0
  73. package/src/lib/stix-parser.js +346 -0
  74. package/src/lib/sub-agent-context.js +343 -0
  75. package/src/lib/sub-agent-profiles.js +335 -0
  76. package/src/lib/sub-agent-registry.js +336 -0
  77. package/src/lib/todo-manager.js +336 -0
  78. package/src/lib/web-ui-server.js +348 -0
  79. package/src/lib/workflow-expr.js +346 -0
  80. package/src/lib/ws-chat-handler.js +337 -0
@@ -1097,3 +1097,344 @@ export function getInferenceNetworkGovStatsV2() {
1097
1097
  jobsByStatus,
1098
1098
  };
1099
1099
  }
1100
+
1101
+ // === Iter28 V2 governance overlay: Infnetgov ===
1102
+ export const INFNETGOV_PROFILE_MATURITY_V2 = Object.freeze({
1103
+ PENDING: "pending",
1104
+ ACTIVE: "active",
1105
+ STALE: "stale",
1106
+ ARCHIVED: "archived",
1107
+ });
1108
+ export const INFNETGOV_REQUEST_LIFECYCLE_V2 = Object.freeze({
1109
+ QUEUED: "queued",
1110
+ INFERRING: "inferring",
1111
+ INFERRED: "inferred",
1112
+ FAILED: "failed",
1113
+ CANCELLED: "cancelled",
1114
+ });
1115
+ const _infnetgovPTrans = new Map([
1116
+ [
1117
+ INFNETGOV_PROFILE_MATURITY_V2.PENDING,
1118
+ new Set([
1119
+ INFNETGOV_PROFILE_MATURITY_V2.ACTIVE,
1120
+ INFNETGOV_PROFILE_MATURITY_V2.ARCHIVED,
1121
+ ]),
1122
+ ],
1123
+ [
1124
+ INFNETGOV_PROFILE_MATURITY_V2.ACTIVE,
1125
+ new Set([
1126
+ INFNETGOV_PROFILE_MATURITY_V2.STALE,
1127
+ INFNETGOV_PROFILE_MATURITY_V2.ARCHIVED,
1128
+ ]),
1129
+ ],
1130
+ [
1131
+ INFNETGOV_PROFILE_MATURITY_V2.STALE,
1132
+ new Set([
1133
+ INFNETGOV_PROFILE_MATURITY_V2.ACTIVE,
1134
+ INFNETGOV_PROFILE_MATURITY_V2.ARCHIVED,
1135
+ ]),
1136
+ ],
1137
+ [INFNETGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
1138
+ ]);
1139
+ const _infnetgovPTerminal = new Set([INFNETGOV_PROFILE_MATURITY_V2.ARCHIVED]);
1140
+ const _infnetgovJTrans = new Map([
1141
+ [
1142
+ INFNETGOV_REQUEST_LIFECYCLE_V2.QUEUED,
1143
+ new Set([
1144
+ INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRING,
1145
+ INFNETGOV_REQUEST_LIFECYCLE_V2.CANCELLED,
1146
+ ]),
1147
+ ],
1148
+ [
1149
+ INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRING,
1150
+ new Set([
1151
+ INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRED,
1152
+ INFNETGOV_REQUEST_LIFECYCLE_V2.FAILED,
1153
+ INFNETGOV_REQUEST_LIFECYCLE_V2.CANCELLED,
1154
+ ]),
1155
+ ],
1156
+ [INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRED, new Set()],
1157
+ [INFNETGOV_REQUEST_LIFECYCLE_V2.FAILED, new Set()],
1158
+ [INFNETGOV_REQUEST_LIFECYCLE_V2.CANCELLED, new Set()],
1159
+ ]);
1160
+ const _infnetgovPsV2 = new Map();
1161
+ const _infnetgovJsV2 = new Map();
1162
+ let _infnetgovMaxActive = 8,
1163
+ _infnetgovMaxPending = 25,
1164
+ _infnetgovIdleMs = 2592000000,
1165
+ _infnetgovStuckMs = 60 * 1000;
1166
+ function _infnetgovPos(n, label) {
1167
+ const v = Math.floor(Number(n));
1168
+ if (!Number.isFinite(v) || v <= 0)
1169
+ throw new Error(`${label} must be positive integer`);
1170
+ return v;
1171
+ }
1172
+ function _infnetgovCheckP(from, to) {
1173
+ const a = _infnetgovPTrans.get(from);
1174
+ if (!a || !a.has(to))
1175
+ throw new Error(`invalid infnetgov profile transition ${from} → ${to}`);
1176
+ }
1177
+ function _infnetgovCheckJ(from, to) {
1178
+ const a = _infnetgovJTrans.get(from);
1179
+ if (!a || !a.has(to))
1180
+ throw new Error(`invalid infnetgov request transition ${from} → ${to}`);
1181
+ }
1182
+ function _infnetgovCountActive(owner) {
1183
+ let c = 0;
1184
+ for (const p of _infnetgovPsV2.values())
1185
+ if (p.owner === owner && p.status === INFNETGOV_PROFILE_MATURITY_V2.ACTIVE)
1186
+ c++;
1187
+ return c;
1188
+ }
1189
+ function _infnetgovCountPending(profileId) {
1190
+ let c = 0;
1191
+ for (const j of _infnetgovJsV2.values())
1192
+ if (
1193
+ j.profileId === profileId &&
1194
+ (j.status === INFNETGOV_REQUEST_LIFECYCLE_V2.QUEUED ||
1195
+ j.status === INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRING)
1196
+ )
1197
+ c++;
1198
+ return c;
1199
+ }
1200
+ export function setMaxActiveInfnetProfilesPerOwnerV2(n) {
1201
+ _infnetgovMaxActive = _infnetgovPos(n, "maxActiveInfnetProfilesPerOwner");
1202
+ }
1203
+ export function getMaxActiveInfnetProfilesPerOwnerV2() {
1204
+ return _infnetgovMaxActive;
1205
+ }
1206
+ export function setMaxPendingInfnetRequestsPerProfileV2(n) {
1207
+ _infnetgovMaxPending = _infnetgovPos(n, "maxPendingInfnetRequestsPerProfile");
1208
+ }
1209
+ export function getMaxPendingInfnetRequestsPerProfileV2() {
1210
+ return _infnetgovMaxPending;
1211
+ }
1212
+ export function setInfnetProfileIdleMsV2(n) {
1213
+ _infnetgovIdleMs = _infnetgovPos(n, "infnetgovProfileIdleMs");
1214
+ }
1215
+ export function getInfnetProfileIdleMsV2() {
1216
+ return _infnetgovIdleMs;
1217
+ }
1218
+ export function setInfnetRequestStuckMsV2(n) {
1219
+ _infnetgovStuckMs = _infnetgovPos(n, "infnetgovRequestStuckMs");
1220
+ }
1221
+ export function getInfnetRequestStuckMsV2() {
1222
+ return _infnetgovStuckMs;
1223
+ }
1224
+ export function _resetStateInfnetgovV2() {
1225
+ _infnetgovPsV2.clear();
1226
+ _infnetgovJsV2.clear();
1227
+ _infnetgovMaxActive = 8;
1228
+ _infnetgovMaxPending = 25;
1229
+ _infnetgovIdleMs = 2592000000;
1230
+ _infnetgovStuckMs = 60 * 1000;
1231
+ }
1232
+ export function registerInfnetProfileV2({ id, owner, node, metadata } = {}) {
1233
+ if (!id || !owner) throw new Error("id and owner required");
1234
+ if (_infnetgovPsV2.has(id))
1235
+ throw new Error(`infnetgov profile ${id} already exists`);
1236
+ const now = Date.now();
1237
+ const p = {
1238
+ id,
1239
+ owner,
1240
+ node: node || "default",
1241
+ status: INFNETGOV_PROFILE_MATURITY_V2.PENDING,
1242
+ createdAt: now,
1243
+ updatedAt: now,
1244
+ lastTouchedAt: now,
1245
+ activatedAt: null,
1246
+ archivedAt: null,
1247
+ metadata: { ...(metadata || {}) },
1248
+ };
1249
+ _infnetgovPsV2.set(id, p);
1250
+ return { ...p, metadata: { ...p.metadata } };
1251
+ }
1252
+ export function activateInfnetProfileV2(id) {
1253
+ const p = _infnetgovPsV2.get(id);
1254
+ if (!p) throw new Error(`infnetgov profile ${id} not found`);
1255
+ const isInitial = p.status === INFNETGOV_PROFILE_MATURITY_V2.PENDING;
1256
+ _infnetgovCheckP(p.status, INFNETGOV_PROFILE_MATURITY_V2.ACTIVE);
1257
+ if (isInitial && _infnetgovCountActive(p.owner) >= _infnetgovMaxActive)
1258
+ throw new Error(
1259
+ `max active infnetgov profiles for owner ${p.owner} reached`,
1260
+ );
1261
+ const now = Date.now();
1262
+ p.status = INFNETGOV_PROFILE_MATURITY_V2.ACTIVE;
1263
+ p.updatedAt = now;
1264
+ p.lastTouchedAt = now;
1265
+ if (!p.activatedAt) p.activatedAt = now;
1266
+ return { ...p, metadata: { ...p.metadata } };
1267
+ }
1268
+ export function staleInfnetProfileV2(id) {
1269
+ const p = _infnetgovPsV2.get(id);
1270
+ if (!p) throw new Error(`infnetgov profile ${id} not found`);
1271
+ _infnetgovCheckP(p.status, INFNETGOV_PROFILE_MATURITY_V2.STALE);
1272
+ p.status = INFNETGOV_PROFILE_MATURITY_V2.STALE;
1273
+ p.updatedAt = Date.now();
1274
+ return { ...p, metadata: { ...p.metadata } };
1275
+ }
1276
+ export function archiveInfnetProfileV2(id) {
1277
+ const p = _infnetgovPsV2.get(id);
1278
+ if (!p) throw new Error(`infnetgov profile ${id} not found`);
1279
+ _infnetgovCheckP(p.status, INFNETGOV_PROFILE_MATURITY_V2.ARCHIVED);
1280
+ const now = Date.now();
1281
+ p.status = INFNETGOV_PROFILE_MATURITY_V2.ARCHIVED;
1282
+ p.updatedAt = now;
1283
+ if (!p.archivedAt) p.archivedAt = now;
1284
+ return { ...p, metadata: { ...p.metadata } };
1285
+ }
1286
+ export function touchInfnetProfileV2(id) {
1287
+ const p = _infnetgovPsV2.get(id);
1288
+ if (!p) throw new Error(`infnetgov profile ${id} not found`);
1289
+ if (_infnetgovPTerminal.has(p.status))
1290
+ throw new Error(`cannot touch terminal infnetgov profile ${id}`);
1291
+ const now = Date.now();
1292
+ p.lastTouchedAt = now;
1293
+ p.updatedAt = now;
1294
+ return { ...p, metadata: { ...p.metadata } };
1295
+ }
1296
+ export function getInfnetProfileV2(id) {
1297
+ const p = _infnetgovPsV2.get(id);
1298
+ if (!p) return null;
1299
+ return { ...p, metadata: { ...p.metadata } };
1300
+ }
1301
+ export function listInfnetProfilesV2() {
1302
+ return [..._infnetgovPsV2.values()].map((p) => ({
1303
+ ...p,
1304
+ metadata: { ...p.metadata },
1305
+ }));
1306
+ }
1307
+ export function createInfnetRequestV2({
1308
+ id,
1309
+ profileId,
1310
+ requestId,
1311
+ metadata,
1312
+ } = {}) {
1313
+ if (!id || !profileId) throw new Error("id and profileId required");
1314
+ if (_infnetgovJsV2.has(id))
1315
+ throw new Error(`infnetgov request ${id} already exists`);
1316
+ if (!_infnetgovPsV2.has(profileId))
1317
+ throw new Error(`infnetgov profile ${profileId} not found`);
1318
+ if (_infnetgovCountPending(profileId) >= _infnetgovMaxPending)
1319
+ throw new Error(
1320
+ `max pending infnetgov requests for profile ${profileId} reached`,
1321
+ );
1322
+ const now = Date.now();
1323
+ const j = {
1324
+ id,
1325
+ profileId,
1326
+ requestId: requestId || "",
1327
+ status: INFNETGOV_REQUEST_LIFECYCLE_V2.QUEUED,
1328
+ createdAt: now,
1329
+ updatedAt: now,
1330
+ startedAt: null,
1331
+ settledAt: null,
1332
+ metadata: { ...(metadata || {}) },
1333
+ };
1334
+ _infnetgovJsV2.set(id, j);
1335
+ return { ...j, metadata: { ...j.metadata } };
1336
+ }
1337
+ export function inferringInfnetRequestV2(id) {
1338
+ const j = _infnetgovJsV2.get(id);
1339
+ if (!j) throw new Error(`infnetgov request ${id} not found`);
1340
+ _infnetgovCheckJ(j.status, INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRING);
1341
+ const now = Date.now();
1342
+ j.status = INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRING;
1343
+ j.updatedAt = now;
1344
+ if (!j.startedAt) j.startedAt = now;
1345
+ return { ...j, metadata: { ...j.metadata } };
1346
+ }
1347
+ export function completeRequestInfnetV2(id) {
1348
+ const j = _infnetgovJsV2.get(id);
1349
+ if (!j) throw new Error(`infnetgov request ${id} not found`);
1350
+ _infnetgovCheckJ(j.status, INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRED);
1351
+ const now = Date.now();
1352
+ j.status = INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRED;
1353
+ j.updatedAt = now;
1354
+ if (!j.settledAt) j.settledAt = now;
1355
+ return { ...j, metadata: { ...j.metadata } };
1356
+ }
1357
+ export function failInfnetRequestV2(id, reason) {
1358
+ const j = _infnetgovJsV2.get(id);
1359
+ if (!j) throw new Error(`infnetgov request ${id} not found`);
1360
+ _infnetgovCheckJ(j.status, INFNETGOV_REQUEST_LIFECYCLE_V2.FAILED);
1361
+ const now = Date.now();
1362
+ j.status = INFNETGOV_REQUEST_LIFECYCLE_V2.FAILED;
1363
+ j.updatedAt = now;
1364
+ if (!j.settledAt) j.settledAt = now;
1365
+ if (reason) j.metadata.failReason = String(reason);
1366
+ return { ...j, metadata: { ...j.metadata } };
1367
+ }
1368
+ export function cancelInfnetRequestV2(id, reason) {
1369
+ const j = _infnetgovJsV2.get(id);
1370
+ if (!j) throw new Error(`infnetgov request ${id} not found`);
1371
+ _infnetgovCheckJ(j.status, INFNETGOV_REQUEST_LIFECYCLE_V2.CANCELLED);
1372
+ const now = Date.now();
1373
+ j.status = INFNETGOV_REQUEST_LIFECYCLE_V2.CANCELLED;
1374
+ j.updatedAt = now;
1375
+ if (!j.settledAt) j.settledAt = now;
1376
+ if (reason) j.metadata.cancelReason = String(reason);
1377
+ return { ...j, metadata: { ...j.metadata } };
1378
+ }
1379
+ export function getInfnetRequestV2(id) {
1380
+ const j = _infnetgovJsV2.get(id);
1381
+ if (!j) return null;
1382
+ return { ...j, metadata: { ...j.metadata } };
1383
+ }
1384
+ export function listInfnetRequestsV2() {
1385
+ return [..._infnetgovJsV2.values()].map((j) => ({
1386
+ ...j,
1387
+ metadata: { ...j.metadata },
1388
+ }));
1389
+ }
1390
+ export function autoStaleIdleInfnetProfilesV2({ now } = {}) {
1391
+ const t = now ?? Date.now();
1392
+ const flipped = [];
1393
+ for (const p of _infnetgovPsV2.values())
1394
+ if (
1395
+ p.status === INFNETGOV_PROFILE_MATURITY_V2.ACTIVE &&
1396
+ t - p.lastTouchedAt >= _infnetgovIdleMs
1397
+ ) {
1398
+ p.status = INFNETGOV_PROFILE_MATURITY_V2.STALE;
1399
+ p.updatedAt = t;
1400
+ flipped.push(p.id);
1401
+ }
1402
+ return { flipped, count: flipped.length };
1403
+ }
1404
+ export function autoFailStuckInfnetRequestsV2({ now } = {}) {
1405
+ const t = now ?? Date.now();
1406
+ const flipped = [];
1407
+ for (const j of _infnetgovJsV2.values())
1408
+ if (
1409
+ j.status === INFNETGOV_REQUEST_LIFECYCLE_V2.INFERRING &&
1410
+ j.startedAt != null &&
1411
+ t - j.startedAt >= _infnetgovStuckMs
1412
+ ) {
1413
+ j.status = INFNETGOV_REQUEST_LIFECYCLE_V2.FAILED;
1414
+ j.updatedAt = t;
1415
+ if (!j.settledAt) j.settledAt = t;
1416
+ j.metadata.failReason = "auto-fail-stuck";
1417
+ flipped.push(j.id);
1418
+ }
1419
+ return { flipped, count: flipped.length };
1420
+ }
1421
+ export function getInfnetgovStatsV2() {
1422
+ const profilesByStatus = {};
1423
+ for (const v of Object.values(INFNETGOV_PROFILE_MATURITY_V2))
1424
+ profilesByStatus[v] = 0;
1425
+ for (const p of _infnetgovPsV2.values()) profilesByStatus[p.status]++;
1426
+ const requestsByStatus = {};
1427
+ for (const v of Object.values(INFNETGOV_REQUEST_LIFECYCLE_V2))
1428
+ requestsByStatus[v] = 0;
1429
+ for (const j of _infnetgovJsV2.values()) requestsByStatus[j.status]++;
1430
+ return {
1431
+ totalInfnetProfilesV2: _infnetgovPsV2.size,
1432
+ totalInfnetRequestsV2: _infnetgovJsV2.size,
1433
+ maxActiveInfnetProfilesPerOwner: _infnetgovMaxActive,
1434
+ maxPendingInfnetRequestsPerProfile: _infnetgovMaxPending,
1435
+ infnetgovProfileIdleMs: _infnetgovIdleMs,
1436
+ infnetgovRequestStuckMs: _infnetgovStuckMs,
1437
+ profilesByStatus,
1438
+ requestsByStatus,
1439
+ };
1440
+ }
@@ -323,3 +323,333 @@ export class WebSocketInteractionAdapter extends InteractionAdapter {
323
323
  pending.resolve(payload);
324
324
  }
325
325
  }
326
+
327
+ // =====================================================================
328
+ // interaction-adapter V2 governance overlay (iter26)
329
+ // =====================================================================
330
+ export const IAGOV_PROFILE_MATURITY_V2 = Object.freeze({
331
+ PENDING: "pending",
332
+ ACTIVE: "active",
333
+ IDLE: "idle",
334
+ ARCHIVED: "archived",
335
+ });
336
+ export const IAGOV_TURN_LIFECYCLE_V2 = Object.freeze({
337
+ QUEUED: "queued",
338
+ RESPONDING: "responding",
339
+ RESPONDED: "responded",
340
+ FAILED: "failed",
341
+ CANCELLED: "cancelled",
342
+ });
343
+ const _iagovPTrans = new Map([
344
+ [
345
+ IAGOV_PROFILE_MATURITY_V2.PENDING,
346
+ new Set([
347
+ IAGOV_PROFILE_MATURITY_V2.ACTIVE,
348
+ IAGOV_PROFILE_MATURITY_V2.ARCHIVED,
349
+ ]),
350
+ ],
351
+ [
352
+ IAGOV_PROFILE_MATURITY_V2.ACTIVE,
353
+ new Set([
354
+ IAGOV_PROFILE_MATURITY_V2.IDLE,
355
+ IAGOV_PROFILE_MATURITY_V2.ARCHIVED,
356
+ ]),
357
+ ],
358
+ [
359
+ IAGOV_PROFILE_MATURITY_V2.IDLE,
360
+ new Set([
361
+ IAGOV_PROFILE_MATURITY_V2.ACTIVE,
362
+ IAGOV_PROFILE_MATURITY_V2.ARCHIVED,
363
+ ]),
364
+ ],
365
+ [IAGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
366
+ ]);
367
+ const _iagovPTerminal = new Set([IAGOV_PROFILE_MATURITY_V2.ARCHIVED]);
368
+ const _iagovJTrans = new Map([
369
+ [
370
+ IAGOV_TURN_LIFECYCLE_V2.QUEUED,
371
+ new Set([
372
+ IAGOV_TURN_LIFECYCLE_V2.RESPONDING,
373
+ IAGOV_TURN_LIFECYCLE_V2.CANCELLED,
374
+ ]),
375
+ ],
376
+ [
377
+ IAGOV_TURN_LIFECYCLE_V2.RESPONDING,
378
+ new Set([
379
+ IAGOV_TURN_LIFECYCLE_V2.RESPONDED,
380
+ IAGOV_TURN_LIFECYCLE_V2.FAILED,
381
+ IAGOV_TURN_LIFECYCLE_V2.CANCELLED,
382
+ ]),
383
+ ],
384
+ [IAGOV_TURN_LIFECYCLE_V2.RESPONDED, new Set()],
385
+ [IAGOV_TURN_LIFECYCLE_V2.FAILED, new Set()],
386
+ [IAGOV_TURN_LIFECYCLE_V2.CANCELLED, new Set()],
387
+ ]);
388
+ const _iagovPsV2 = new Map();
389
+ const _iagovJsV2 = new Map();
390
+ let _iagovMaxActive = 6,
391
+ _iagovMaxPending = 15,
392
+ _iagovIdleMs = 30 * 24 * 60 * 60 * 1000,
393
+ _iagovStuckMs = 60 * 1000;
394
+ function _iagovPos(n, label) {
395
+ const v = Math.floor(Number(n));
396
+ if (!Number.isFinite(v) || v <= 0)
397
+ throw new Error(`${label} must be positive integer`);
398
+ return v;
399
+ }
400
+ function _iagovCheckP(from, to) {
401
+ const a = _iagovPTrans.get(from);
402
+ if (!a || !a.has(to))
403
+ throw new Error(`invalid iagov profile transition ${from} → ${to}`);
404
+ }
405
+ function _iagovCheckJ(from, to) {
406
+ const a = _iagovJTrans.get(from);
407
+ if (!a || !a.has(to))
408
+ throw new Error(`invalid iagov turn transition ${from} → ${to}`);
409
+ }
410
+ function _iagovCountActive(owner) {
411
+ let c = 0;
412
+ for (const p of _iagovPsV2.values())
413
+ if (p.owner === owner && p.status === IAGOV_PROFILE_MATURITY_V2.ACTIVE) c++;
414
+ return c;
415
+ }
416
+ function _iagovCountPending(profileId) {
417
+ let c = 0;
418
+ for (const j of _iagovJsV2.values())
419
+ if (
420
+ j.profileId === profileId &&
421
+ (j.status === IAGOV_TURN_LIFECYCLE_V2.QUEUED ||
422
+ j.status === IAGOV_TURN_LIFECYCLE_V2.RESPONDING)
423
+ )
424
+ c++;
425
+ return c;
426
+ }
427
+ export function setMaxActiveIagovProfilesPerOwnerV2(n) {
428
+ _iagovMaxActive = _iagovPos(n, "maxActiveIagovProfilesPerOwner");
429
+ }
430
+ export function getMaxActiveIagovProfilesPerOwnerV2() {
431
+ return _iagovMaxActive;
432
+ }
433
+ export function setMaxPendingIagovTurnsPerProfileV2(n) {
434
+ _iagovMaxPending = _iagovPos(n, "maxPendingIagovTurnsPerProfile");
435
+ }
436
+ export function getMaxPendingIagovTurnsPerProfileV2() {
437
+ return _iagovMaxPending;
438
+ }
439
+ export function setIagovProfileIdleMsV2(n) {
440
+ _iagovIdleMs = _iagovPos(n, "iagovProfileIdleMs");
441
+ }
442
+ export function getIagovProfileIdleMsV2() {
443
+ return _iagovIdleMs;
444
+ }
445
+ export function setIagovTurnStuckMsV2(n) {
446
+ _iagovStuckMs = _iagovPos(n, "iagovTurnStuckMs");
447
+ }
448
+ export function getIagovTurnStuckMsV2() {
449
+ return _iagovStuckMs;
450
+ }
451
+ export function _resetStateInteractionAdapterGovV2() {
452
+ _iagovPsV2.clear();
453
+ _iagovJsV2.clear();
454
+ _iagovMaxActive = 6;
455
+ _iagovMaxPending = 15;
456
+ _iagovIdleMs = 30 * 24 * 60 * 60 * 1000;
457
+ _iagovStuckMs = 60 * 1000;
458
+ }
459
+ export function registerIagovProfileV2({ id, owner, adapter, metadata } = {}) {
460
+ if (!id || !owner) throw new Error("id and owner required");
461
+ if (_iagovPsV2.has(id)) throw new Error(`iagov profile ${id} already exists`);
462
+ const now = Date.now();
463
+ const p = {
464
+ id,
465
+ owner,
466
+ adapter: adapter || "cli",
467
+ status: IAGOV_PROFILE_MATURITY_V2.PENDING,
468
+ createdAt: now,
469
+ updatedAt: now,
470
+ lastTouchedAt: now,
471
+ activatedAt: null,
472
+ archivedAt: null,
473
+ metadata: { ...(metadata || {}) },
474
+ };
475
+ _iagovPsV2.set(id, p);
476
+ return { ...p, metadata: { ...p.metadata } };
477
+ }
478
+ export function activateIagovProfileV2(id) {
479
+ const p = _iagovPsV2.get(id);
480
+ if (!p) throw new Error(`iagov profile ${id} not found`);
481
+ const isInitial = p.status === IAGOV_PROFILE_MATURITY_V2.PENDING;
482
+ _iagovCheckP(p.status, IAGOV_PROFILE_MATURITY_V2.ACTIVE);
483
+ if (isInitial && _iagovCountActive(p.owner) >= _iagovMaxActive)
484
+ throw new Error(`max active iagov profiles for owner ${p.owner} reached`);
485
+ const now = Date.now();
486
+ p.status = IAGOV_PROFILE_MATURITY_V2.ACTIVE;
487
+ p.updatedAt = now;
488
+ p.lastTouchedAt = now;
489
+ if (!p.activatedAt) p.activatedAt = now;
490
+ return { ...p, metadata: { ...p.metadata } };
491
+ }
492
+ export function idleIagovProfileV2(id) {
493
+ const p = _iagovPsV2.get(id);
494
+ if (!p) throw new Error(`iagov profile ${id} not found`);
495
+ _iagovCheckP(p.status, IAGOV_PROFILE_MATURITY_V2.IDLE);
496
+ p.status = IAGOV_PROFILE_MATURITY_V2.IDLE;
497
+ p.updatedAt = Date.now();
498
+ return { ...p, metadata: { ...p.metadata } };
499
+ }
500
+ export function archiveIagovProfileV2(id) {
501
+ const p = _iagovPsV2.get(id);
502
+ if (!p) throw new Error(`iagov profile ${id} not found`);
503
+ _iagovCheckP(p.status, IAGOV_PROFILE_MATURITY_V2.ARCHIVED);
504
+ const now = Date.now();
505
+ p.status = IAGOV_PROFILE_MATURITY_V2.ARCHIVED;
506
+ p.updatedAt = now;
507
+ if (!p.archivedAt) p.archivedAt = now;
508
+ return { ...p, metadata: { ...p.metadata } };
509
+ }
510
+ export function touchIagovProfileV2(id) {
511
+ const p = _iagovPsV2.get(id);
512
+ if (!p) throw new Error(`iagov profile ${id} not found`);
513
+ if (_iagovPTerminal.has(p.status))
514
+ throw new Error(`cannot touch terminal iagov profile ${id}`);
515
+ const now = Date.now();
516
+ p.lastTouchedAt = now;
517
+ p.updatedAt = now;
518
+ return { ...p, metadata: { ...p.metadata } };
519
+ }
520
+ export function getIagovProfileV2(id) {
521
+ const p = _iagovPsV2.get(id);
522
+ if (!p) return null;
523
+ return { ...p, metadata: { ...p.metadata } };
524
+ }
525
+ export function listIagovProfilesV2() {
526
+ return [..._iagovPsV2.values()].map((p) => ({
527
+ ...p,
528
+ metadata: { ...p.metadata },
529
+ }));
530
+ }
531
+ export function createIagovTurnV2({ id, profileId, input, metadata } = {}) {
532
+ if (!id || !profileId) throw new Error("id and profileId required");
533
+ if (_iagovJsV2.has(id)) throw new Error(`iagov turn ${id} already exists`);
534
+ if (!_iagovPsV2.has(profileId))
535
+ throw new Error(`iagov profile ${profileId} not found`);
536
+ if (_iagovCountPending(profileId) >= _iagovMaxPending)
537
+ throw new Error(`max pending iagov turns for profile ${profileId} reached`);
538
+ const now = Date.now();
539
+ const j = {
540
+ id,
541
+ profileId,
542
+ input: input || "",
543
+ status: IAGOV_TURN_LIFECYCLE_V2.QUEUED,
544
+ createdAt: now,
545
+ updatedAt: now,
546
+ startedAt: null,
547
+ settledAt: null,
548
+ metadata: { ...(metadata || {}) },
549
+ };
550
+ _iagovJsV2.set(id, j);
551
+ return { ...j, metadata: { ...j.metadata } };
552
+ }
553
+ export function respondingIagovTurnV2(id) {
554
+ const j = _iagovJsV2.get(id);
555
+ if (!j) throw new Error(`iagov turn ${id} not found`);
556
+ _iagovCheckJ(j.status, IAGOV_TURN_LIFECYCLE_V2.RESPONDING);
557
+ const now = Date.now();
558
+ j.status = IAGOV_TURN_LIFECYCLE_V2.RESPONDING;
559
+ j.updatedAt = now;
560
+ if (!j.startedAt) j.startedAt = now;
561
+ return { ...j, metadata: { ...j.metadata } };
562
+ }
563
+ export function completeTurnIagovV2(id) {
564
+ const j = _iagovJsV2.get(id);
565
+ if (!j) throw new Error(`iagov turn ${id} not found`);
566
+ _iagovCheckJ(j.status, IAGOV_TURN_LIFECYCLE_V2.RESPONDED);
567
+ const now = Date.now();
568
+ j.status = IAGOV_TURN_LIFECYCLE_V2.RESPONDED;
569
+ j.updatedAt = now;
570
+ if (!j.settledAt) j.settledAt = now;
571
+ return { ...j, metadata: { ...j.metadata } };
572
+ }
573
+ export function failIagovTurnV2(id, reason) {
574
+ const j = _iagovJsV2.get(id);
575
+ if (!j) throw new Error(`iagov turn ${id} not found`);
576
+ _iagovCheckJ(j.status, IAGOV_TURN_LIFECYCLE_V2.FAILED);
577
+ const now = Date.now();
578
+ j.status = IAGOV_TURN_LIFECYCLE_V2.FAILED;
579
+ j.updatedAt = now;
580
+ if (!j.settledAt) j.settledAt = now;
581
+ if (reason) j.metadata.failReason = String(reason);
582
+ return { ...j, metadata: { ...j.metadata } };
583
+ }
584
+ export function cancelIagovTurnV2(id, reason) {
585
+ const j = _iagovJsV2.get(id);
586
+ if (!j) throw new Error(`iagov turn ${id} not found`);
587
+ _iagovCheckJ(j.status, IAGOV_TURN_LIFECYCLE_V2.CANCELLED);
588
+ const now = Date.now();
589
+ j.status = IAGOV_TURN_LIFECYCLE_V2.CANCELLED;
590
+ j.updatedAt = now;
591
+ if (!j.settledAt) j.settledAt = now;
592
+ if (reason) j.metadata.cancelReason = String(reason);
593
+ return { ...j, metadata: { ...j.metadata } };
594
+ }
595
+ export function getIagovTurnV2(id) {
596
+ const j = _iagovJsV2.get(id);
597
+ if (!j) return null;
598
+ return { ...j, metadata: { ...j.metadata } };
599
+ }
600
+ export function listIagovTurnsV2() {
601
+ return [..._iagovJsV2.values()].map((j) => ({
602
+ ...j,
603
+ metadata: { ...j.metadata },
604
+ }));
605
+ }
606
+ export function autoIdleIdleIagovProfilesV2({ now } = {}) {
607
+ const t = now ?? Date.now();
608
+ const flipped = [];
609
+ for (const p of _iagovPsV2.values())
610
+ if (
611
+ p.status === IAGOV_PROFILE_MATURITY_V2.ACTIVE &&
612
+ t - p.lastTouchedAt >= _iagovIdleMs
613
+ ) {
614
+ p.status = IAGOV_PROFILE_MATURITY_V2.IDLE;
615
+ p.updatedAt = t;
616
+ flipped.push(p.id);
617
+ }
618
+ return { flipped, count: flipped.length };
619
+ }
620
+ export function autoFailStuckIagovTurnsV2({ now } = {}) {
621
+ const t = now ?? Date.now();
622
+ const flipped = [];
623
+ for (const j of _iagovJsV2.values())
624
+ if (
625
+ j.status === IAGOV_TURN_LIFECYCLE_V2.RESPONDING &&
626
+ j.startedAt != null &&
627
+ t - j.startedAt >= _iagovStuckMs
628
+ ) {
629
+ j.status = IAGOV_TURN_LIFECYCLE_V2.FAILED;
630
+ j.updatedAt = t;
631
+ if (!j.settledAt) j.settledAt = t;
632
+ j.metadata.failReason = "auto-fail-stuck";
633
+ flipped.push(j.id);
634
+ }
635
+ return { flipped, count: flipped.length };
636
+ }
637
+ export function getInteractionAdapterGovStatsV2() {
638
+ const profilesByStatus = {};
639
+ for (const v of Object.values(IAGOV_PROFILE_MATURITY_V2))
640
+ profilesByStatus[v] = 0;
641
+ for (const p of _iagovPsV2.values()) profilesByStatus[p.status]++;
642
+ const turnsByStatus = {};
643
+ for (const v of Object.values(IAGOV_TURN_LIFECYCLE_V2)) turnsByStatus[v] = 0;
644
+ for (const j of _iagovJsV2.values()) turnsByStatus[j.status]++;
645
+ return {
646
+ totalIagovProfilesV2: _iagovPsV2.size,
647
+ totalIagovTurnsV2: _iagovJsV2.size,
648
+ maxActiveIagovProfilesPerOwner: _iagovMaxActive,
649
+ maxPendingIagovTurnsPerProfile: _iagovMaxPending,
650
+ iagovProfileIdleMs: _iagovIdleMs,
651
+ iagovTurnStuckMs: _iagovStuckMs,
652
+ profilesByStatus,
653
+ turnsByStatus,
654
+ };
655
+ }