chainlesschain 0.143.0 → 0.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/package.json +1 -1
  2. package/src/commands/a2a.js +196 -28
  3. package/src/commands/activitypub.js +157 -27
  4. package/src/commands/agent.js +587 -103
  5. package/src/commands/audit.js +206 -0
  6. package/src/commands/bi.js +152 -27
  7. package/src/commands/bm25.js +111 -27
  8. package/src/commands/browse.js +190 -29
  9. package/src/commands/ccron.js +128 -28
  10. package/src/commands/chat.js +207 -0
  11. package/src/commands/compliance.js +414 -34
  12. package/src/commands/compt.js +127 -29
  13. package/src/commands/consol.js +8 -2
  14. package/src/commands/cowork.js +580 -34
  15. package/src/commands/crosschain.js +182 -28
  16. package/src/commands/dao.js +182 -28
  17. package/src/commands/dlp.js +172 -27
  18. package/src/commands/economy.js +205 -50
  19. package/src/commands/evolution.js +203 -50
  20. package/src/commands/evomap.js +182 -27
  21. package/src/commands/fflag.js +74 -22
  22. package/src/commands/git.js +177 -37
  23. package/src/commands/hardening.js +209 -0
  24. package/src/commands/hmemory.js +204 -50
  25. package/src/commands/incentive.js +209 -0
  26. package/src/commands/inference.js +170 -34
  27. package/src/commands/itbudget.js +149 -33
  28. package/src/commands/kg.js +206 -0
  29. package/src/commands/lowcode.js +195 -38
  30. package/src/commands/marketplace.js +206 -0
  31. package/src/commands/matrix.js +179 -27
  32. package/src/commands/mcpscaf.js +145 -33
  33. package/src/commands/meminj.js +145 -33
  34. package/src/commands/nostr.js +178 -27
  35. package/src/commands/orchestrate.js +217 -0
  36. package/src/commands/orchgov.js +144 -33
  37. package/src/commands/pdfp.js +109 -27
  38. package/src/commands/perf.js +169 -32
  39. package/src/commands/perm.js +144 -33
  40. package/src/commands/pipeline.js +207 -52
  41. package/src/commands/planmode.js +141 -32
  42. package/src/commands/privacy.js +203 -0
  43. package/src/commands/promcomp.js +111 -27
  44. package/src/commands/recommend.js +177 -34
  45. package/src/commands/reputation.js +208 -0
  46. package/src/commands/sandbox.js +206 -0
  47. package/src/commands/seshhook.js +145 -33
  48. package/src/commands/seshsearch.js +141 -33
  49. package/src/commands/seshtail.js +144 -33
  50. package/src/commands/seshu.js +152 -33
  51. package/src/commands/sganal.js +123 -29
  52. package/src/commands/siem.js +201 -34
  53. package/src/commands/sla.js +212 -0
  54. package/src/commands/slotfill.js +146 -33
  55. package/src/commands/social.js +157 -32
  56. package/src/commands/stress.js +206 -0
  57. package/src/commands/svccont.js +145 -33
  58. package/src/commands/terraform.js +206 -0
  59. package/src/commands/tms.js +171 -33
  60. package/src/commands/topiccls.js +146 -33
  61. package/src/commands/uprof.js +141 -32
  62. package/src/commands/vcheck.js +122 -28
  63. package/src/commands/webfetch.js +141 -32
  64. package/src/commands/zkp.js +184 -28
  65. package/src/index.js +40 -0
  66. package/src/lib/a2a-protocol.js +319 -51
  67. package/src/lib/activitypub-bridge.js +288 -50
  68. package/src/lib/agent-economy.js +304 -51
  69. package/src/lib/app-builder.js +279 -46
  70. package/src/lib/audit-logger.js +321 -0
  71. package/src/lib/autonomous-agent.js +284 -48
  72. package/src/lib/bi-engine.js +283 -49
  73. package/src/lib/bm25-search.js +301 -49
  74. package/src/lib/browser-automation.js +296 -49
  75. package/src/lib/chat-core.js +336 -0
  76. package/src/lib/claude-code-bridge.js +341 -0
  77. package/src/lib/compliance-framework-reporter.js +305 -51
  78. package/src/lib/compliance-manager.js +330 -0
  79. package/src/lib/compression-telemetry.js +301 -49
  80. package/src/lib/content-recommender.js +317 -52
  81. package/src/lib/cowork-cron.js +298 -49
  82. package/src/lib/cowork-learning.js +333 -0
  83. package/src/lib/cowork-task-runner.js +308 -51
  84. package/src/lib/cowork-workflow.js +327 -0
  85. package/src/lib/cross-chain.js +311 -51
  86. package/src/lib/dao-governance.js +280 -46
  87. package/src/lib/dlp-engine.js +287 -49
  88. package/src/lib/evolution-system.js +278 -47
  89. package/src/lib/evomap-manager.js +280 -46
  90. package/src/lib/execution-backend.js +294 -48
  91. package/src/lib/feature-flags.js +294 -49
  92. package/src/lib/git-integration.js +285 -47
  93. package/src/lib/hardening-manager.js +341 -0
  94. package/src/lib/hierarchical-memory.js +284 -48
  95. package/src/lib/inference-network.js +308 -51
  96. package/src/lib/iteration-budget.js +302 -50
  97. package/src/lib/knowledge-graph.js +333 -0
  98. package/src/lib/matrix-bridge.js +281 -47
  99. package/src/lib/mcp-scaffold.js +318 -54
  100. package/src/lib/memory-injection.js +288 -49
  101. package/src/lib/nostr-bridge.js +286 -49
  102. package/src/lib/orchestrator.js +293 -48
  103. package/src/lib/pdf-parser.js +298 -49
  104. package/src/lib/perf-tuning.js +309 -50
  105. package/src/lib/permission-engine.js +287 -49
  106. package/src/lib/pipeline-orchestrator.js +289 -49
  107. package/src/lib/plan-mode.js +298 -51
  108. package/src/lib/privacy-computing.js +335 -0
  109. package/src/lib/reputation-optimizer.js +340 -0
  110. package/src/lib/sandbox-v2.js +327 -0
  111. package/src/lib/service-container.js +313 -52
  112. package/src/lib/session-consolidator.js +296 -49
  113. package/src/lib/session-hooks.js +312 -53
  114. package/src/lib/session-search.js +304 -51
  115. package/src/lib/session-tail.js +288 -49
  116. package/src/lib/session-usage.js +298 -52
  117. package/src/lib/siem-exporter.js +298 -51
  118. package/src/lib/skill-marketplace.js +345 -0
  119. package/src/lib/sla-manager.js +341 -0
  120. package/src/lib/slot-filler.js +303 -51
  121. package/src/lib/social-graph-analytics.js +295 -49
  122. package/src/lib/social-graph.js +272 -49
  123. package/src/lib/stress-tester.js +342 -0
  124. package/src/lib/sub-agent-registry.js +302 -53
  125. package/src/lib/task-model-selector.js +302 -50
  126. package/src/lib/terraform-manager.js +333 -0
  127. package/src/lib/todo-manager.js +281 -47
  128. package/src/lib/token-incentive.js +341 -0
  129. package/src/lib/topic-classifier.js +297 -49
  130. package/src/lib/user-profile.js +294 -50
  131. package/src/lib/version-checker.js +304 -50
  132. package/src/lib/web-fetch.js +292 -51
  133. package/src/lib/zkp-engine.js +286 -49
@@ -960,3 +960,336 @@ export function _resetStateV2() {
960
960
  _entityStaleMsV2 = KG_DEFAULT_ENTITY_STALE_MS;
961
961
  _relationStaleMsV2 = KG_DEFAULT_RELATION_STALE_MS;
962
962
  }
963
+
964
+ // =====================================================================
965
+ // knowledge-graph V2 governance overlay (iter16)
966
+ // =====================================================================
967
+ export const KGOV_PROFILE_MATURITY_V2 = Object.freeze({
968
+ PENDING: "pending",
969
+ ACTIVE: "active",
970
+ STALE: "stale",
971
+ ARCHIVED: "archived",
972
+ });
973
+ export const KGOV_IMPORT_LIFECYCLE_V2 = Object.freeze({
974
+ QUEUED: "queued",
975
+ IMPORTING: "importing",
976
+ IMPORTED: "imported",
977
+ FAILED: "failed",
978
+ CANCELLED: "cancelled",
979
+ });
980
+ const _kgovPTrans = new Map([
981
+ [
982
+ KGOV_PROFILE_MATURITY_V2.PENDING,
983
+ new Set([
984
+ KGOV_PROFILE_MATURITY_V2.ACTIVE,
985
+ KGOV_PROFILE_MATURITY_V2.ARCHIVED,
986
+ ]),
987
+ ],
988
+ [
989
+ KGOV_PROFILE_MATURITY_V2.ACTIVE,
990
+ new Set([
991
+ KGOV_PROFILE_MATURITY_V2.STALE,
992
+ KGOV_PROFILE_MATURITY_V2.ARCHIVED,
993
+ ]),
994
+ ],
995
+ [
996
+ KGOV_PROFILE_MATURITY_V2.STALE,
997
+ new Set([
998
+ KGOV_PROFILE_MATURITY_V2.ACTIVE,
999
+ KGOV_PROFILE_MATURITY_V2.ARCHIVED,
1000
+ ]),
1001
+ ],
1002
+ [KGOV_PROFILE_MATURITY_V2.ARCHIVED, new Set()],
1003
+ ]);
1004
+ const _kgovPTerminal = new Set([KGOV_PROFILE_MATURITY_V2.ARCHIVED]);
1005
+ const _kgovJTrans = new Map([
1006
+ [
1007
+ KGOV_IMPORT_LIFECYCLE_V2.QUEUED,
1008
+ new Set([
1009
+ KGOV_IMPORT_LIFECYCLE_V2.IMPORTING,
1010
+ KGOV_IMPORT_LIFECYCLE_V2.CANCELLED,
1011
+ ]),
1012
+ ],
1013
+ [
1014
+ KGOV_IMPORT_LIFECYCLE_V2.IMPORTING,
1015
+ new Set([
1016
+ KGOV_IMPORT_LIFECYCLE_V2.IMPORTED,
1017
+ KGOV_IMPORT_LIFECYCLE_V2.FAILED,
1018
+ KGOV_IMPORT_LIFECYCLE_V2.CANCELLED,
1019
+ ]),
1020
+ ],
1021
+ [KGOV_IMPORT_LIFECYCLE_V2.IMPORTED, new Set()],
1022
+ [KGOV_IMPORT_LIFECYCLE_V2.FAILED, new Set()],
1023
+ [KGOV_IMPORT_LIFECYCLE_V2.CANCELLED, new Set()],
1024
+ ]);
1025
+ const _kgovPsV2 = new Map();
1026
+ const _kgovJsV2 = new Map();
1027
+ let _kgovMaxActive = 6,
1028
+ _kgovMaxPending = 20,
1029
+ _kgovIdleMs = 30 * 24 * 60 * 60 * 1000,
1030
+ _kgovStuckMs = 60 * 1000;
1031
+ function _kgovPos(n, label) {
1032
+ const v = Math.floor(Number(n));
1033
+ if (!Number.isFinite(v) || v <= 0)
1034
+ throw new Error(`${label} must be positive integer`);
1035
+ return v;
1036
+ }
1037
+ function _kgovCheckP(from, to) {
1038
+ const a = _kgovPTrans.get(from);
1039
+ if (!a || !a.has(to))
1040
+ throw new Error(`invalid kgov profile transition ${from} → ${to}`);
1041
+ }
1042
+ function _kgovCheckJ(from, to) {
1043
+ const a = _kgovJTrans.get(from);
1044
+ if (!a || !a.has(to))
1045
+ throw new Error(`invalid kgov import transition ${from} → ${to}`);
1046
+ }
1047
+ function _kgovCountActive(owner) {
1048
+ let c = 0;
1049
+ for (const p of _kgovPsV2.values())
1050
+ if (p.owner === owner && p.status === KGOV_PROFILE_MATURITY_V2.ACTIVE) c++;
1051
+ return c;
1052
+ }
1053
+ function _kgovCountPending(profileId) {
1054
+ let c = 0;
1055
+ for (const j of _kgovJsV2.values())
1056
+ if (
1057
+ j.profileId === profileId &&
1058
+ (j.status === KGOV_IMPORT_LIFECYCLE_V2.QUEUED ||
1059
+ j.status === KGOV_IMPORT_LIFECYCLE_V2.IMPORTING)
1060
+ )
1061
+ c++;
1062
+ return c;
1063
+ }
1064
+ export function setMaxActiveKgovProfilesPerOwnerV2(n) {
1065
+ _kgovMaxActive = _kgovPos(n, "maxActiveKgovProfilesPerOwner");
1066
+ }
1067
+ export function getMaxActiveKgovProfilesPerOwnerV2() {
1068
+ return _kgovMaxActive;
1069
+ }
1070
+ export function setMaxPendingKgovImportsPerProfileV2(n) {
1071
+ _kgovMaxPending = _kgovPos(n, "maxPendingKgovImportsPerProfile");
1072
+ }
1073
+ export function getMaxPendingKgovImportsPerProfileV2() {
1074
+ return _kgovMaxPending;
1075
+ }
1076
+ export function setKgovProfileIdleMsV2(n) {
1077
+ _kgovIdleMs = _kgovPos(n, "kgovProfileIdleMs");
1078
+ }
1079
+ export function getKgovProfileIdleMsV2() {
1080
+ return _kgovIdleMs;
1081
+ }
1082
+ export function setKgovImportStuckMsV2(n) {
1083
+ _kgovStuckMs = _kgovPos(n, "kgovImportStuckMs");
1084
+ }
1085
+ export function getKgovImportStuckMsV2() {
1086
+ return _kgovStuckMs;
1087
+ }
1088
+ export function _resetStateKnowledgeGraphV2() {
1089
+ _kgovPsV2.clear();
1090
+ _kgovJsV2.clear();
1091
+ _kgovMaxActive = 6;
1092
+ _kgovMaxPending = 20;
1093
+ _kgovIdleMs = 30 * 24 * 60 * 60 * 1000;
1094
+ _kgovStuckMs = 60 * 1000;
1095
+ }
1096
+ export function registerKgovProfileV2({ id, owner, namespace, metadata } = {}) {
1097
+ if (!id || !owner) throw new Error("id and owner required");
1098
+ if (_kgovPsV2.has(id)) throw new Error(`kgov profile ${id} already exists`);
1099
+ const now = Date.now();
1100
+ const p = {
1101
+ id,
1102
+ owner,
1103
+ namespace: namespace || "default",
1104
+ status: KGOV_PROFILE_MATURITY_V2.PENDING,
1105
+ createdAt: now,
1106
+ updatedAt: now,
1107
+ lastTouchedAt: now,
1108
+ activatedAt: null,
1109
+ archivedAt: null,
1110
+ metadata: { ...(metadata || {}) },
1111
+ };
1112
+ _kgovPsV2.set(id, p);
1113
+ return { ...p, metadata: { ...p.metadata } };
1114
+ }
1115
+ export function activateKgovProfileV2(id) {
1116
+ const p = _kgovPsV2.get(id);
1117
+ if (!p) throw new Error(`kgov profile ${id} not found`);
1118
+ const isInitial = p.status === KGOV_PROFILE_MATURITY_V2.PENDING;
1119
+ _kgovCheckP(p.status, KGOV_PROFILE_MATURITY_V2.ACTIVE);
1120
+ if (isInitial && _kgovCountActive(p.owner) >= _kgovMaxActive)
1121
+ throw new Error(`max active kgov profiles for owner ${p.owner} reached`);
1122
+ const now = Date.now();
1123
+ p.status = KGOV_PROFILE_MATURITY_V2.ACTIVE;
1124
+ p.updatedAt = now;
1125
+ p.lastTouchedAt = now;
1126
+ if (!p.activatedAt) p.activatedAt = now;
1127
+ return { ...p, metadata: { ...p.metadata } };
1128
+ }
1129
+ export function staleKgovProfileV2(id) {
1130
+ const p = _kgovPsV2.get(id);
1131
+ if (!p) throw new Error(`kgov profile ${id} not found`);
1132
+ _kgovCheckP(p.status, KGOV_PROFILE_MATURITY_V2.STALE);
1133
+ p.status = KGOV_PROFILE_MATURITY_V2.STALE;
1134
+ p.updatedAt = Date.now();
1135
+ return { ...p, metadata: { ...p.metadata } };
1136
+ }
1137
+ export function archiveKgovProfileV2(id) {
1138
+ const p = _kgovPsV2.get(id);
1139
+ if (!p) throw new Error(`kgov profile ${id} not found`);
1140
+ _kgovCheckP(p.status, KGOV_PROFILE_MATURITY_V2.ARCHIVED);
1141
+ const now = Date.now();
1142
+ p.status = KGOV_PROFILE_MATURITY_V2.ARCHIVED;
1143
+ p.updatedAt = now;
1144
+ if (!p.archivedAt) p.archivedAt = now;
1145
+ return { ...p, metadata: { ...p.metadata } };
1146
+ }
1147
+ export function touchKgovProfileV2(id) {
1148
+ const p = _kgovPsV2.get(id);
1149
+ if (!p) throw new Error(`kgov profile ${id} not found`);
1150
+ if (_kgovPTerminal.has(p.status))
1151
+ throw new Error(`cannot touch terminal kgov profile ${id}`);
1152
+ const now = Date.now();
1153
+ p.lastTouchedAt = now;
1154
+ p.updatedAt = now;
1155
+ return { ...p, metadata: { ...p.metadata } };
1156
+ }
1157
+ export function getKgovProfileV2(id) {
1158
+ const p = _kgovPsV2.get(id);
1159
+ if (!p) return null;
1160
+ return { ...p, metadata: { ...p.metadata } };
1161
+ }
1162
+ export function listKgovProfilesV2() {
1163
+ return [..._kgovPsV2.values()].map((p) => ({
1164
+ ...p,
1165
+ metadata: { ...p.metadata },
1166
+ }));
1167
+ }
1168
+ export function createKgovImportV2({ id, profileId, source, metadata } = {}) {
1169
+ if (!id || !profileId) throw new Error("id and profileId required");
1170
+ if (_kgovJsV2.has(id)) throw new Error(`kgov import ${id} already exists`);
1171
+ if (!_kgovPsV2.has(profileId))
1172
+ throw new Error(`kgov profile ${profileId} not found`);
1173
+ if (_kgovCountPending(profileId) >= _kgovMaxPending)
1174
+ throw new Error(
1175
+ `max pending kgov imports for profile ${profileId} reached`,
1176
+ );
1177
+ const now = Date.now();
1178
+ const j = {
1179
+ id,
1180
+ profileId,
1181
+ source: source || "",
1182
+ status: KGOV_IMPORT_LIFECYCLE_V2.QUEUED,
1183
+ createdAt: now,
1184
+ updatedAt: now,
1185
+ startedAt: null,
1186
+ settledAt: null,
1187
+ metadata: { ...(metadata || {}) },
1188
+ };
1189
+ _kgovJsV2.set(id, j);
1190
+ return { ...j, metadata: { ...j.metadata } };
1191
+ }
1192
+ export function importingKgovImportV2(id) {
1193
+ const j = _kgovJsV2.get(id);
1194
+ if (!j) throw new Error(`kgov import ${id} not found`);
1195
+ _kgovCheckJ(j.status, KGOV_IMPORT_LIFECYCLE_V2.IMPORTING);
1196
+ const now = Date.now();
1197
+ j.status = KGOV_IMPORT_LIFECYCLE_V2.IMPORTING;
1198
+ j.updatedAt = now;
1199
+ if (!j.startedAt) j.startedAt = now;
1200
+ return { ...j, metadata: { ...j.metadata } };
1201
+ }
1202
+ export function completeImportKgovV2(id) {
1203
+ const j = _kgovJsV2.get(id);
1204
+ if (!j) throw new Error(`kgov import ${id} not found`);
1205
+ _kgovCheckJ(j.status, KGOV_IMPORT_LIFECYCLE_V2.IMPORTED);
1206
+ const now = Date.now();
1207
+ j.status = KGOV_IMPORT_LIFECYCLE_V2.IMPORTED;
1208
+ j.updatedAt = now;
1209
+ if (!j.settledAt) j.settledAt = now;
1210
+ return { ...j, metadata: { ...j.metadata } };
1211
+ }
1212
+ export function failKgovImportV2(id, reason) {
1213
+ const j = _kgovJsV2.get(id);
1214
+ if (!j) throw new Error(`kgov import ${id} not found`);
1215
+ _kgovCheckJ(j.status, KGOV_IMPORT_LIFECYCLE_V2.FAILED);
1216
+ const now = Date.now();
1217
+ j.status = KGOV_IMPORT_LIFECYCLE_V2.FAILED;
1218
+ j.updatedAt = now;
1219
+ if (!j.settledAt) j.settledAt = now;
1220
+ if (reason) j.metadata.failReason = String(reason);
1221
+ return { ...j, metadata: { ...j.metadata } };
1222
+ }
1223
+ export function cancelKgovImportV2(id, reason) {
1224
+ const j = _kgovJsV2.get(id);
1225
+ if (!j) throw new Error(`kgov import ${id} not found`);
1226
+ _kgovCheckJ(j.status, KGOV_IMPORT_LIFECYCLE_V2.CANCELLED);
1227
+ const now = Date.now();
1228
+ j.status = KGOV_IMPORT_LIFECYCLE_V2.CANCELLED;
1229
+ j.updatedAt = now;
1230
+ if (!j.settledAt) j.settledAt = now;
1231
+ if (reason) j.metadata.cancelReason = String(reason);
1232
+ return { ...j, metadata: { ...j.metadata } };
1233
+ }
1234
+ export function getKgovImportV2(id) {
1235
+ const j = _kgovJsV2.get(id);
1236
+ if (!j) return null;
1237
+ return { ...j, metadata: { ...j.metadata } };
1238
+ }
1239
+ export function listKgovImportsV2() {
1240
+ return [..._kgovJsV2.values()].map((j) => ({
1241
+ ...j,
1242
+ metadata: { ...j.metadata },
1243
+ }));
1244
+ }
1245
+ export function autoStaleIdleKgovProfilesV2({ now } = {}) {
1246
+ const t = now ?? Date.now();
1247
+ const flipped = [];
1248
+ for (const p of _kgovPsV2.values())
1249
+ if (
1250
+ p.status === KGOV_PROFILE_MATURITY_V2.ACTIVE &&
1251
+ t - p.lastTouchedAt >= _kgovIdleMs
1252
+ ) {
1253
+ p.status = KGOV_PROFILE_MATURITY_V2.STALE;
1254
+ p.updatedAt = t;
1255
+ flipped.push(p.id);
1256
+ }
1257
+ return { flipped, count: flipped.length };
1258
+ }
1259
+ export function autoFailStuckKgovImportsV2({ now } = {}) {
1260
+ const t = now ?? Date.now();
1261
+ const flipped = [];
1262
+ for (const j of _kgovJsV2.values())
1263
+ if (
1264
+ j.status === KGOV_IMPORT_LIFECYCLE_V2.IMPORTING &&
1265
+ j.startedAt != null &&
1266
+ t - j.startedAt >= _kgovStuckMs
1267
+ ) {
1268
+ j.status = KGOV_IMPORT_LIFECYCLE_V2.FAILED;
1269
+ j.updatedAt = t;
1270
+ if (!j.settledAt) j.settledAt = t;
1271
+ j.metadata.failReason = "auto-fail-stuck";
1272
+ flipped.push(j.id);
1273
+ }
1274
+ return { flipped, count: flipped.length };
1275
+ }
1276
+ export function getKnowledgeGraphGovStatsV2() {
1277
+ const profilesByStatus = {};
1278
+ for (const v of Object.values(KGOV_PROFILE_MATURITY_V2))
1279
+ profilesByStatus[v] = 0;
1280
+ for (const p of _kgovPsV2.values()) profilesByStatus[p.status]++;
1281
+ const importsByStatus = {};
1282
+ for (const v of Object.values(KGOV_IMPORT_LIFECYCLE_V2))
1283
+ importsByStatus[v] = 0;
1284
+ for (const j of _kgovJsV2.values()) importsByStatus[j.status]++;
1285
+ return {
1286
+ totalKgovProfilesV2: _kgovPsV2.size,
1287
+ totalKgovImportsV2: _kgovJsV2.size,
1288
+ maxActiveKgovProfilesPerOwner: _kgovMaxActive,
1289
+ maxPendingKgovImportsPerProfile: _kgovMaxPending,
1290
+ kgovProfileIdleMs: _kgovIdleMs,
1291
+ kgovImportStuckMs: _kgovStuckMs,
1292
+ profilesByStatus,
1293
+ importsByStatus,
1294
+ };
1295
+ }