@exulu/backend 1.47.0 → 1.48.1

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/CHANGELOG.md CHANGED
@@ -1,19 +1,6 @@
1
- # [1.47.0](https://github.com/Qventu/exulu-backend/compare/v1.46.1...v1.47.0) (2026-03-11)
1
+ ## [1.48.1](https://github.com/Qventu/exulu-backend/compare/v1.48.0...v1.48.1) (2026-03-15)
2
2
 
3
3
 
4
4
  ### Bug Fixes
5
5
 
6
- * correct typo in decorators folder and improve development tooling ([d864fa0](https://github.com/Qventu/exulu-backend/commit/d864fa0a2082eb96e4e8160f6b0aa33f6a3f99e2))
7
- * import errors ([93f48db](https://github.com/Qventu/exulu-backend/commit/93f48dbb8cef4004e540455fcfcd49e4aa9aeb3f))
8
- * lint errors ([a4fa265](https://github.com/Qventu/exulu-backend/commit/a4fa2651f4d6874952b275ee674b413d5334bc5d))
9
- * linting errors ([0d8bce8](https://github.com/Qventu/exulu-backend/commit/0d8bce8122fb914055ca21ad3190185febc4b8f3))
10
- * npm audit vulnerabilities ([95707bc](https://github.com/Qventu/exulu-backend/commit/95707bc909e1c1776ab470d691747dc56e2455ed))
11
- * prettier ([8e15404](https://github.com/Qventu/exulu-backend/commit/8e154041b9de4b82cf36ef80980329e4a2fae49d))
12
- * refactor classes.ts into individual modules ([7a71269](https://github.com/Qventu/exulu-backend/commit/7a71269139d59efce4d0ffbd70808e60c3cb26d6))
13
- * src import references ([e349c30](https://github.com/Qventu/exulu-backend/commit/e349c309bbbb6bab90ead175db4968ea2b20f4aa))
14
-
15
-
16
- ### Features
17
-
18
- * enterprise edition split and document processing system ([dd39da3](https://github.com/Qventu/exulu-backend/commit/dd39da3eaf3169d5b0906aab5cd65c7cf212f361))
19
- * licensing and docs update ([1cec6ba](https://github.com/Qventu/exulu-backend/commit/1cec6ba817327ff8dd2090da31660c075b802963))
6
+ * remove old documentation ([ade8e7a](https://github.com/Qventu/exulu-backend/commit/ade8e7a2caa8169bdffe16fb9ad00eaaffce8d2c))
package/dist/index.cjs CHANGED
@@ -31,7 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  EXULU_JOB_STATUS_ENUM: () => JOB_STATUS_ENUM,
34
- EXULU_STATISTICS_TYPE_ENUM: () => STATISTICS_TYPE_ENUM2,
34
+ EXULU_STATISTICS_TYPE_ENUM: () => STATISTICS_TYPE_ENUM,
35
35
  ExuluApp: () => ExuluApp2,
36
36
  ExuluAuthentication: () => ExuluAuthentication,
37
37
  ExuluChunkers: () => ExuluChunkers,
@@ -523,7 +523,7 @@ var requestValidators = {
523
523
  };
524
524
 
525
525
  // types/enums/statistics.ts
526
- var STATISTICS_TYPE_ENUM2 = {
526
+ var STATISTICS_TYPE_ENUM = {
527
527
  CONTEXT_RETRIEVE: "CONTEXT_RETRIEVE",
528
528
  SOURCE_UPDATE: "SOURCE_UPDATE",
529
529
  EMBEDDER_UPSERT: "EMBEDDER_UPSERT",
@@ -1811,7 +1811,7 @@ var rolesSchema = {
1811
1811
  type: "text"
1812
1812
  },
1813
1813
  {
1814
- name: agentsSchema.name.plural,
1814
+ name: "agents",
1815
1815
  type: "text"
1816
1816
  // write | read access to agents
1817
1817
  },
@@ -1825,12 +1825,12 @@ var rolesSchema = {
1825
1825
  // write | read access to workflows
1826
1826
  },
1827
1827
  {
1828
- name: variablesSchema.name.plural,
1828
+ name: "variables",
1829
1829
  type: "text"
1830
1830
  // write | read access to variables
1831
1831
  },
1832
1832
  {
1833
- name: usersSchema.name.plural,
1833
+ name: "users",
1834
1834
  type: "text"
1835
1835
  // write | read access to users
1836
1836
  },
@@ -2178,7 +2178,7 @@ var agentSessionsSchema = {
2178
2178
  }
2179
2179
  ]
2180
2180
  };
2181
- var variablesSchema2 = {
2181
+ var variablesSchema = {
2182
2182
  type: "variables",
2183
2183
  name: {
2184
2184
  plural: "variables",
@@ -2234,7 +2234,7 @@ var projectsSchema = {
2234
2234
  }
2235
2235
  ]
2236
2236
  };
2237
- var agentsSchema2 = {
2237
+ var agentsSchema = {
2238
2238
  type: "agents",
2239
2239
  name: {
2240
2240
  plural: "agents",
@@ -2302,7 +2302,7 @@ var agentsSchema2 = {
2302
2302
  }
2303
2303
  ]
2304
2304
  };
2305
- var usersSchema2 = {
2305
+ var usersSchema = {
2306
2306
  type: "users",
2307
2307
  name: {
2308
2308
  plural: "users",
@@ -2480,6 +2480,10 @@ var promptLibrarySchema = {
2480
2480
  {
2481
2481
  name: "assigned_agents",
2482
2482
  type: "json"
2483
+ },
2484
+ {
2485
+ name: "history",
2486
+ type: "json"
2483
2487
  }
2484
2488
  ]
2485
2489
  };
@@ -2542,13 +2546,13 @@ var coreSchemas = {
2542
2546
  get: () => {
2543
2547
  const license = checkLicense();
2544
2548
  const schemas = {
2545
- agentsSchema: () => addCoreFields(agentsSchema2),
2549
+ agentsSchema: () => addCoreFields(agentsSchema),
2546
2550
  agentMessagesSchema: () => addCoreFields(agentMessagesSchema),
2547
2551
  agentSessionsSchema: () => addCoreFields(agentSessionsSchema),
2548
2552
  projectsSchema: () => addCoreFields(projectsSchema),
2549
- usersSchema: () => addCoreFields(usersSchema2),
2553
+ usersSchema: () => addCoreFields(usersSchema),
2550
2554
  statisticsSchema: () => addCoreFields(statisticsSchema),
2551
- variablesSchema: () => addCoreFields(variablesSchema2),
2555
+ variablesSchema: () => addCoreFields(variablesSchema),
2552
2556
  platformConfigurationsSchema: () => addCoreFields(platformConfigurationsSchema),
2553
2557
  promptLibrarySchema: () => addCoreFields(promptLibrarySchema),
2554
2558
  embedderSettingsSchema: () => addCoreFields(embedderSettingsSchema),
@@ -3093,7 +3097,7 @@ var vectorSearch = async ({
3093
3097
  await updateStatistic({
3094
3098
  name: "count",
3095
3099
  label: table.name.singular,
3096
- type: STATISTICS_TYPE_ENUM2.CONTEXT_RETRIEVE,
3100
+ type: STATISTICS_TYPE_ENUM.CONTEXT_RETRIEVE,
3097
3101
  trigger,
3098
3102
  user: user?.id,
3099
3103
  role
@@ -3702,7 +3706,7 @@ var convertExuluToolsToAiSdkTools = async (currentTools, approvedTools, allExulu
3702
3706
  await updateStatistic({
3703
3707
  name: "count",
3704
3708
  label: cur.name,
3705
- type: STATISTICS_TYPE_ENUM2.TOOL_CALL,
3709
+ type: STATISTICS_TYPE_ENUM.TOOL_CALL,
3706
3710
  trigger: "agent",
3707
3711
  count: 1,
3708
3712
  user: user?.id,
@@ -4599,7 +4603,7 @@ var ExuluContext2 = class {
4599
4603
  await updateStatistic({
4600
4604
  name: "count",
4601
4605
  label: this.name,
4602
- type: STATISTICS_TYPE_ENUM2.TOOL_CALL,
4606
+ type: STATISTICS_TYPE_ENUM.TOOL_CALL,
4603
4607
  trigger: "tool",
4604
4608
  count: 1,
4605
4609
  user: user?.id,
@@ -5709,9 +5713,6 @@ var finalizeRequestedFields = async ({
5709
5713
  });
5710
5714
  });
5711
5715
  } else {
5712
- console.log("[EXULU] table name singular", table.name.singular);
5713
- console.log("[EXULU] requestedFields", requestedFields);
5714
- console.log("[EXULU] result", result);
5715
5716
  if (table.name.singular === "workflow_template") {
5716
5717
  if (requestedFields.includes("variables")) {
5717
5718
  const variables = [];
@@ -6944,7 +6945,7 @@ function createMutations(table, providers, contexts, rerankers, tools, config) {
6944
6945
  await updateStatistic({
6945
6946
  name: "count",
6946
6947
  label: source.id,
6947
- type: STATISTICS_TYPE_ENUM2.SOURCE_UPDATE,
6948
+ type: STATISTICS_TYPE_ENUM.SOURCE_UPDATE,
6948
6949
  trigger: "api",
6949
6950
  count: 1,
6950
6951
  user: context?.user?.id,
@@ -7696,7 +7697,7 @@ var createWorkers = async (providers, queues2, config, contexts, rerankers, eval
7696
7697
  await updateStatistic({
7697
7698
  name: "count",
7698
7699
  label: source.id,
7699
- type: STATISTICS_TYPE_ENUM2.SOURCE_UPDATE,
7700
+ type: STATISTICS_TYPE_ENUM.SOURCE_UPDATE,
7700
7701
  trigger: "api",
7701
7702
  count: 1,
7702
7703
  user: data?.user,
@@ -8079,7 +8080,7 @@ var processUiMessagesFlow = async ({
8079
8080
  updateStatistic({
8080
8081
  name: "count",
8081
8082
  label: statistics.label,
8082
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
8083
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
8083
8084
  trigger: statistics.trigger,
8084
8085
  count: 1,
8085
8086
  user: user.id,
@@ -8089,7 +8090,7 @@ var processUiMessagesFlow = async ({
8089
8090
  updateStatistic({
8090
8091
  name: "inputTokens",
8091
8092
  label: statistics.label,
8092
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
8093
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
8093
8094
  trigger: statistics.trigger,
8094
8095
  count: metadata?.inputTokens,
8095
8096
  user: user.id,
@@ -8100,7 +8101,7 @@ var processUiMessagesFlow = async ({
8100
8101
  updateStatistic({
8101
8102
  name: "outputTokens",
8102
8103
  label: statistics.label,
8103
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
8104
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
8104
8105
  trigger: statistics.trigger,
8105
8106
  count: metadata?.outputTokens
8106
8107
  })
@@ -9978,7 +9979,7 @@ var ExuluProvider = class {
9978
9979
  await updateStatistic({
9979
9980
  name: "count",
9980
9981
  label: agent.name,
9981
- type: STATISTICS_TYPE_ENUM2.TOOL_CALL,
9982
+ type: STATISTICS_TYPE_ENUM.TOOL_CALL,
9982
9983
  trigger: "tool",
9983
9984
  count: 1,
9984
9985
  user: user?.id,
@@ -10210,7 +10211,7 @@ var ExuluProvider = class {
10210
10211
  updateStatistic({
10211
10212
  name: "count",
10212
10213
  label: statistics.label,
10213
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10214
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10214
10215
  trigger: statistics.trigger,
10215
10216
  count: 1,
10216
10217
  user: user?.id,
@@ -10220,7 +10221,7 @@ var ExuluProvider = class {
10220
10221
  updateStatistic({
10221
10222
  name: "inputTokens",
10222
10223
  label: statistics.label,
10223
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10224
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10224
10225
  trigger: statistics.trigger,
10225
10226
  count: inputTokens
10226
10227
  })
@@ -10229,7 +10230,7 @@ var ExuluProvider = class {
10229
10230
  updateStatistic({
10230
10231
  name: "outputTokens",
10231
10232
  label: statistics.label,
10232
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10233
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10233
10234
  trigger: statistics.trigger,
10234
10235
  count: outputTokens
10235
10236
  })
@@ -10275,7 +10276,7 @@ var ExuluProvider = class {
10275
10276
  updateStatistic({
10276
10277
  name: "count",
10277
10278
  label: statistics.label,
10278
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10279
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10279
10280
  trigger: statistics.trigger,
10280
10281
  count: 1,
10281
10282
  user: user?.id,
@@ -10285,7 +10286,7 @@ var ExuluProvider = class {
10285
10286
  updateStatistic({
10286
10287
  name: "inputTokens",
10287
10288
  label: statistics.label,
10288
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10289
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10289
10290
  trigger: statistics.trigger,
10290
10291
  count: totalUsage?.inputTokens,
10291
10292
  user: user?.id,
@@ -10296,7 +10297,7 @@ var ExuluProvider = class {
10296
10297
  updateStatistic({
10297
10298
  name: "outputTokens",
10298
10299
  label: statistics.label,
10299
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10300
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10300
10301
  trigger: statistics.trigger,
10301
10302
  count: totalUsage?.outputTokens
10302
10303
  })
@@ -10691,7 +10692,7 @@ var global_queues = {
10691
10692
  eval_runs: "eval_runs"
10692
10693
  };
10693
10694
  var {
10694
- agentsSchema: agentsSchema3,
10695
+ agentsSchema: agentsSchema2,
10695
10696
  feedbackSchema: feedbackSchema2,
10696
10697
  projectsSchema: projectsSchema2,
10697
10698
  jobResultsSchema: jobResultsSchema2,
@@ -10702,8 +10703,8 @@ var {
10702
10703
  agentSessionsSchema: agentSessionsSchema2,
10703
10704
  agentMessagesSchema: agentMessagesSchema2,
10704
10705
  rolesSchema: rolesSchema2,
10705
- usersSchema: usersSchema3,
10706
- variablesSchema: variablesSchema3,
10706
+ usersSchema: usersSchema2,
10707
+ variablesSchema: variablesSchema2,
10707
10708
  workflowTemplatesSchema: workflowTemplatesSchema2,
10708
10709
  rbacSchema: rbacSchema2,
10709
10710
  promptLibrarySchema: promptLibrarySchema2,
@@ -10746,9 +10747,9 @@ var createExpressRoutes = async (app, providers, tools, contexts, config, evals,
10746
10747
  `);
10747
10748
  const schema = createSDL(
10748
10749
  [
10749
- usersSchema3(),
10750
+ usersSchema2(),
10750
10751
  rolesSchema2(),
10751
- agentsSchema3(),
10752
+ agentsSchema2(),
10752
10753
  feedbackSchema2(),
10753
10754
  projectsSchema2(),
10754
10755
  jobResultsSchema2(),
@@ -10761,7 +10762,7 @@ var createExpressRoutes = async (app, providers, tools, contexts, config, evals,
10761
10762
  testCasesSchema2(),
10762
10763
  agentSessionsSchema2(),
10763
10764
  agentMessagesSchema2(),
10764
- variablesSchema3(),
10765
+ variablesSchema2(),
10765
10766
  workflowTemplatesSchema2(),
10766
10767
  statisticsSchema2(),
10767
10768
  rbacSchema2()
@@ -11205,7 +11206,7 @@ Mood: friendly and intelligent.
11205
11206
  updateStatistic({
11206
11207
  name: "count",
11207
11208
  label: statistics.label,
11208
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11209
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11209
11210
  trigger: statistics.trigger,
11210
11211
  count: 1,
11211
11212
  user: user?.id,
@@ -11215,7 +11216,7 @@ Mood: friendly and intelligent.
11215
11216
  updateStatistic({
11216
11217
  name: "inputTokens",
11217
11218
  label: statistics.label,
11218
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11219
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11219
11220
  trigger: statistics.trigger,
11220
11221
  count: metadata?.inputTokens,
11221
11222
  user: user?.id,
@@ -11226,7 +11227,7 @@ Mood: friendly and intelligent.
11226
11227
  updateStatistic({
11227
11228
  name: "outputTokens",
11228
11229
  label: statistics.label,
11229
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11230
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11230
11231
  trigger: statistics.trigger,
11231
11232
  count: metadata?.outputTokens
11232
11233
  })
@@ -11296,7 +11297,7 @@ Mood: friendly and intelligent.
11296
11297
  const user = authenticationResult.user;
11297
11298
  let agentQuery = db2("agents");
11298
11299
  agentQuery.select("*");
11299
- agentQuery = applyAccessControl(agentsSchema3(), agentQuery, authenticationResult.user);
11300
+ agentQuery = applyAccessControl(agentsSchema2(), agentQuery, authenticationResult.user);
11300
11301
  agentQuery.where({ id: req.params.agent });
11301
11302
  const agent = await agentQuery.first();
11302
11303
  if (!agent) {
@@ -11493,7 +11494,7 @@ data: ${JSON.stringify(event)}
11493
11494
  updateStatistic({
11494
11495
  name: "count",
11495
11496
  label: statistics.label,
11496
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11497
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11497
11498
  trigger: statistics.trigger,
11498
11499
  count: 1,
11499
11500
  user: user.id,
@@ -11504,7 +11505,7 @@ data: ${JSON.stringify(event)}
11504
11505
  updateStatistic({
11505
11506
  name: "inputTokens",
11506
11507
  label: statistics.label,
11507
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11508
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11508
11509
  trigger: statistics.trigger,
11509
11510
  count: totalInputTokens,
11510
11511
  user: user.id,
@@ -11516,7 +11517,7 @@ data: ${JSON.stringify(event)}
11516
11517
  updateStatistic({
11517
11518
  name: "outputTokens",
11518
11519
  label: statistics.label,
11519
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11520
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11520
11521
  trigger: statistics.trigger,
11521
11522
  count: totalInputTokens,
11522
11523
  user: user.id,
@@ -14595,7 +14596,7 @@ var ExuluEmbedder = class {
14595
14596
  await updateStatistic({
14596
14597
  name: "count",
14597
14598
  label: statistics.label,
14598
- type: STATISTICS_TYPE_ENUM2.EMBEDDER_GENERATE,
14599
+ type: STATISTICS_TYPE_ENUM.EMBEDDER_GENERATE,
14599
14600
  trigger: statistics.trigger,
14600
14601
  count: 1,
14601
14602
  user,
@@ -14623,7 +14624,7 @@ var ExuluEmbedder = class {
14623
14624
  await updateStatistic({
14624
14625
  name: "count",
14625
14626
  label: statistics.label,
14626
- type: STATISTICS_TYPE_ENUM2.EMBEDDER_GENERATE,
14627
+ type: STATISTICS_TYPE_ENUM.EMBEDDER_GENERATE,
14627
14628
  trigger: statistics.trigger,
14628
14629
  count: 1,
14629
14630
  user,
@@ -15044,7 +15045,7 @@ var SentenceChunker = class _SentenceChunker extends BaseChunker {
15044
15045
 
15045
15046
  // src/postgres/init-db.ts
15046
15047
  var {
15047
- agentsSchema: agentsSchema4,
15048
+ agentsSchema: agentsSchema3,
15048
15049
  feedbackSchema: feedbackSchema3,
15049
15050
  testCasesSchema: testCasesSchema3,
15050
15051
  evalSetsSchema: evalSetsSchema3,
@@ -15053,9 +15054,9 @@ var {
15053
15054
  platformConfigurationsSchema: platformConfigurationsSchema3,
15054
15055
  agentMessagesSchema: agentMessagesSchema3,
15055
15056
  rolesSchema: rolesSchema3,
15056
- usersSchema: usersSchema4,
15057
+ usersSchema: usersSchema3,
15057
15058
  statisticsSchema: statisticsSchema3,
15058
- variablesSchema: variablesSchema4,
15059
+ variablesSchema: variablesSchema3,
15059
15060
  workflowTemplatesSchema: workflowTemplatesSchema3,
15060
15061
  rbacSchema: rbacSchema3,
15061
15062
  projectsSchema: projectsSchema3,
@@ -15101,9 +15102,9 @@ var up = async function(knex) {
15101
15102
  embedderSettingsSchema3(),
15102
15103
  promptFavoritesSchema3(),
15103
15104
  rbacSchema3(),
15104
- agentsSchema4(),
15105
+ agentsSchema3(),
15105
15106
  feedbackSchema3(),
15106
- variablesSchema4(),
15107
+ variablesSchema3(),
15107
15108
  workflowTemplatesSchema3()
15108
15109
  ];
15109
15110
  const createTable = async (schema) => {
@@ -15150,7 +15151,7 @@ var up = async function(knex) {
15150
15151
  table.string("email", 255);
15151
15152
  table.timestamp("emailVerified", { useTz: true });
15152
15153
  table.text("image");
15153
- for (const field of usersSchema4().fields) {
15154
+ for (const field of usersSchema3().fields) {
15154
15155
  console.log("[EXULU] field", field);
15155
15156
  const { type, name, default: defaultValue, unique } = field;
15156
15157
  if (name === "id" || name === "name" || name === "email" || name === "emailVerified" || name === "image" || name === "password") {
@@ -15163,7 +15164,7 @@ var up = async function(knex) {
15163
15164
  }
15164
15165
  });
15165
15166
  } else {
15166
- await addMissingFields(knex, "users", usersSchema4().fields, [
15167
+ await addMissingFields(knex, "users", usersSchema3().fields, [
15167
15168
  "id",
15168
15169
  "name",
15169
15170
  "email",
package/dist/index.js CHANGED
@@ -473,7 +473,7 @@ var requestValidators = {
473
473
  };
474
474
 
475
475
  // types/enums/statistics.ts
476
- var STATISTICS_TYPE_ENUM2 = {
476
+ var STATISTICS_TYPE_ENUM = {
477
477
  CONTEXT_RETRIEVE: "CONTEXT_RETRIEVE",
478
478
  SOURCE_UPDATE: "SOURCE_UPDATE",
479
479
  EMBEDDER_UPSERT: "EMBEDDER_UPSERT",
@@ -1778,7 +1778,7 @@ var rolesSchema = {
1778
1778
  type: "text"
1779
1779
  },
1780
1780
  {
1781
- name: agentsSchema.name.plural,
1781
+ name: "agents",
1782
1782
  type: "text"
1783
1783
  // write | read access to agents
1784
1784
  },
@@ -1792,12 +1792,12 @@ var rolesSchema = {
1792
1792
  // write | read access to workflows
1793
1793
  },
1794
1794
  {
1795
- name: variablesSchema.name.plural,
1795
+ name: "variables",
1796
1796
  type: "text"
1797
1797
  // write | read access to variables
1798
1798
  },
1799
1799
  {
1800
- name: usersSchema.name.plural,
1800
+ name: "users",
1801
1801
  type: "text"
1802
1802
  // write | read access to users
1803
1803
  },
@@ -2145,7 +2145,7 @@ var agentSessionsSchema = {
2145
2145
  }
2146
2146
  ]
2147
2147
  };
2148
- var variablesSchema2 = {
2148
+ var variablesSchema = {
2149
2149
  type: "variables",
2150
2150
  name: {
2151
2151
  plural: "variables",
@@ -2201,7 +2201,7 @@ var projectsSchema = {
2201
2201
  }
2202
2202
  ]
2203
2203
  };
2204
- var agentsSchema2 = {
2204
+ var agentsSchema = {
2205
2205
  type: "agents",
2206
2206
  name: {
2207
2207
  plural: "agents",
@@ -2269,7 +2269,7 @@ var agentsSchema2 = {
2269
2269
  }
2270
2270
  ]
2271
2271
  };
2272
- var usersSchema2 = {
2272
+ var usersSchema = {
2273
2273
  type: "users",
2274
2274
  name: {
2275
2275
  plural: "users",
@@ -2447,6 +2447,10 @@ var promptLibrarySchema = {
2447
2447
  {
2448
2448
  name: "assigned_agents",
2449
2449
  type: "json"
2450
+ },
2451
+ {
2452
+ name: "history",
2453
+ type: "json"
2450
2454
  }
2451
2455
  ]
2452
2456
  };
@@ -2509,13 +2513,13 @@ var coreSchemas = {
2509
2513
  get: () => {
2510
2514
  const license = checkLicense();
2511
2515
  const schemas = {
2512
- agentsSchema: () => addCoreFields(agentsSchema2),
2516
+ agentsSchema: () => addCoreFields(agentsSchema),
2513
2517
  agentMessagesSchema: () => addCoreFields(agentMessagesSchema),
2514
2518
  agentSessionsSchema: () => addCoreFields(agentSessionsSchema),
2515
2519
  projectsSchema: () => addCoreFields(projectsSchema),
2516
- usersSchema: () => addCoreFields(usersSchema2),
2520
+ usersSchema: () => addCoreFields(usersSchema),
2517
2521
  statisticsSchema: () => addCoreFields(statisticsSchema),
2518
- variablesSchema: () => addCoreFields(variablesSchema2),
2522
+ variablesSchema: () => addCoreFields(variablesSchema),
2519
2523
  platformConfigurationsSchema: () => addCoreFields(platformConfigurationsSchema),
2520
2524
  promptLibrarySchema: () => addCoreFields(promptLibrarySchema),
2521
2525
  embedderSettingsSchema: () => addCoreFields(embedderSettingsSchema),
@@ -3060,7 +3064,7 @@ var vectorSearch = async ({
3060
3064
  await updateStatistic({
3061
3065
  name: "count",
3062
3066
  label: table.name.singular,
3063
- type: STATISTICS_TYPE_ENUM2.CONTEXT_RETRIEVE,
3067
+ type: STATISTICS_TYPE_ENUM.CONTEXT_RETRIEVE,
3064
3068
  trigger,
3065
3069
  user: user?.id,
3066
3070
  role
@@ -3669,7 +3673,7 @@ var convertExuluToolsToAiSdkTools = async (currentTools, approvedTools, allExulu
3669
3673
  await updateStatistic({
3670
3674
  name: "count",
3671
3675
  label: cur.name,
3672
- type: STATISTICS_TYPE_ENUM2.TOOL_CALL,
3676
+ type: STATISTICS_TYPE_ENUM.TOOL_CALL,
3673
3677
  trigger: "agent",
3674
3678
  count: 1,
3675
3679
  user: user?.id,
@@ -4566,7 +4570,7 @@ var ExuluContext2 = class {
4566
4570
  await updateStatistic({
4567
4571
  name: "count",
4568
4572
  label: this.name,
4569
- type: STATISTICS_TYPE_ENUM2.TOOL_CALL,
4573
+ type: STATISTICS_TYPE_ENUM.TOOL_CALL,
4570
4574
  trigger: "tool",
4571
4575
  count: 1,
4572
4576
  user: user?.id,
@@ -5676,9 +5680,6 @@ var finalizeRequestedFields = async ({
5676
5680
  });
5677
5681
  });
5678
5682
  } else {
5679
- console.log("[EXULU] table name singular", table.name.singular);
5680
- console.log("[EXULU] requestedFields", requestedFields);
5681
- console.log("[EXULU] result", result);
5682
5683
  if (table.name.singular === "workflow_template") {
5683
5684
  if (requestedFields.includes("variables")) {
5684
5685
  const variables = [];
@@ -6911,7 +6912,7 @@ function createMutations(table, providers, contexts, rerankers, tools, config) {
6911
6912
  await updateStatistic({
6912
6913
  name: "count",
6913
6914
  label: source.id,
6914
- type: STATISTICS_TYPE_ENUM2.SOURCE_UPDATE,
6915
+ type: STATISTICS_TYPE_ENUM.SOURCE_UPDATE,
6915
6916
  trigger: "api",
6916
6917
  count: 1,
6917
6918
  user: context?.user?.id,
@@ -7663,7 +7664,7 @@ var createWorkers = async (providers, queues2, config, contexts, rerankers, eval
7663
7664
  await updateStatistic({
7664
7665
  name: "count",
7665
7666
  label: source.id,
7666
- type: STATISTICS_TYPE_ENUM2.SOURCE_UPDATE,
7667
+ type: STATISTICS_TYPE_ENUM.SOURCE_UPDATE,
7667
7668
  trigger: "api",
7668
7669
  count: 1,
7669
7670
  user: data?.user,
@@ -8046,7 +8047,7 @@ var processUiMessagesFlow = async ({
8046
8047
  updateStatistic({
8047
8048
  name: "count",
8048
8049
  label: statistics.label,
8049
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
8050
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
8050
8051
  trigger: statistics.trigger,
8051
8052
  count: 1,
8052
8053
  user: user.id,
@@ -8056,7 +8057,7 @@ var processUiMessagesFlow = async ({
8056
8057
  updateStatistic({
8057
8058
  name: "inputTokens",
8058
8059
  label: statistics.label,
8059
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
8060
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
8060
8061
  trigger: statistics.trigger,
8061
8062
  count: metadata?.inputTokens,
8062
8063
  user: user.id,
@@ -8067,7 +8068,7 @@ var processUiMessagesFlow = async ({
8067
8068
  updateStatistic({
8068
8069
  name: "outputTokens",
8069
8070
  label: statistics.label,
8070
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
8071
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
8071
8072
  trigger: statistics.trigger,
8072
8073
  count: metadata?.outputTokens
8073
8074
  })
@@ -9952,7 +9953,7 @@ var ExuluProvider = class {
9952
9953
  await updateStatistic({
9953
9954
  name: "count",
9954
9955
  label: agent.name,
9955
- type: STATISTICS_TYPE_ENUM2.TOOL_CALL,
9956
+ type: STATISTICS_TYPE_ENUM.TOOL_CALL,
9956
9957
  trigger: "tool",
9957
9958
  count: 1,
9958
9959
  user: user?.id,
@@ -10184,7 +10185,7 @@ var ExuluProvider = class {
10184
10185
  updateStatistic({
10185
10186
  name: "count",
10186
10187
  label: statistics.label,
10187
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10188
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10188
10189
  trigger: statistics.trigger,
10189
10190
  count: 1,
10190
10191
  user: user?.id,
@@ -10194,7 +10195,7 @@ var ExuluProvider = class {
10194
10195
  updateStatistic({
10195
10196
  name: "inputTokens",
10196
10197
  label: statistics.label,
10197
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10198
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10198
10199
  trigger: statistics.trigger,
10199
10200
  count: inputTokens
10200
10201
  })
@@ -10203,7 +10204,7 @@ var ExuluProvider = class {
10203
10204
  updateStatistic({
10204
10205
  name: "outputTokens",
10205
10206
  label: statistics.label,
10206
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10207
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10207
10208
  trigger: statistics.trigger,
10208
10209
  count: outputTokens
10209
10210
  })
@@ -10249,7 +10250,7 @@ var ExuluProvider = class {
10249
10250
  updateStatistic({
10250
10251
  name: "count",
10251
10252
  label: statistics.label,
10252
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10253
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10253
10254
  trigger: statistics.trigger,
10254
10255
  count: 1,
10255
10256
  user: user?.id,
@@ -10259,7 +10260,7 @@ var ExuluProvider = class {
10259
10260
  updateStatistic({
10260
10261
  name: "inputTokens",
10261
10262
  label: statistics.label,
10262
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10263
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10263
10264
  trigger: statistics.trigger,
10264
10265
  count: totalUsage?.inputTokens,
10265
10266
  user: user?.id,
@@ -10270,7 +10271,7 @@ var ExuluProvider = class {
10270
10271
  updateStatistic({
10271
10272
  name: "outputTokens",
10272
10273
  label: statistics.label,
10273
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
10274
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
10274
10275
  trigger: statistics.trigger,
10275
10276
  count: totalUsage?.outputTokens
10276
10277
  })
@@ -10665,7 +10666,7 @@ var global_queues = {
10665
10666
  eval_runs: "eval_runs"
10666
10667
  };
10667
10668
  var {
10668
- agentsSchema: agentsSchema3,
10669
+ agentsSchema: agentsSchema2,
10669
10670
  feedbackSchema: feedbackSchema2,
10670
10671
  projectsSchema: projectsSchema2,
10671
10672
  jobResultsSchema: jobResultsSchema2,
@@ -10676,8 +10677,8 @@ var {
10676
10677
  agentSessionsSchema: agentSessionsSchema2,
10677
10678
  agentMessagesSchema: agentMessagesSchema2,
10678
10679
  rolesSchema: rolesSchema2,
10679
- usersSchema: usersSchema3,
10680
- variablesSchema: variablesSchema3,
10680
+ usersSchema: usersSchema2,
10681
+ variablesSchema: variablesSchema2,
10681
10682
  workflowTemplatesSchema: workflowTemplatesSchema2,
10682
10683
  rbacSchema: rbacSchema2,
10683
10684
  promptLibrarySchema: promptLibrarySchema2,
@@ -10720,9 +10721,9 @@ var createExpressRoutes = async (app, providers, tools, contexts, config, evals,
10720
10721
  `);
10721
10722
  const schema = createSDL(
10722
10723
  [
10723
- usersSchema3(),
10724
+ usersSchema2(),
10724
10725
  rolesSchema2(),
10725
- agentsSchema3(),
10726
+ agentsSchema2(),
10726
10727
  feedbackSchema2(),
10727
10728
  projectsSchema2(),
10728
10729
  jobResultsSchema2(),
@@ -10735,7 +10736,7 @@ var createExpressRoutes = async (app, providers, tools, contexts, config, evals,
10735
10736
  testCasesSchema2(),
10736
10737
  agentSessionsSchema2(),
10737
10738
  agentMessagesSchema2(),
10738
- variablesSchema3(),
10739
+ variablesSchema2(),
10739
10740
  workflowTemplatesSchema2(),
10740
10741
  statisticsSchema2(),
10741
10742
  rbacSchema2()
@@ -11179,7 +11180,7 @@ Mood: friendly and intelligent.
11179
11180
  updateStatistic({
11180
11181
  name: "count",
11181
11182
  label: statistics.label,
11182
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11183
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11183
11184
  trigger: statistics.trigger,
11184
11185
  count: 1,
11185
11186
  user: user?.id,
@@ -11189,7 +11190,7 @@ Mood: friendly and intelligent.
11189
11190
  updateStatistic({
11190
11191
  name: "inputTokens",
11191
11192
  label: statistics.label,
11192
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11193
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11193
11194
  trigger: statistics.trigger,
11194
11195
  count: metadata?.inputTokens,
11195
11196
  user: user?.id,
@@ -11200,7 +11201,7 @@ Mood: friendly and intelligent.
11200
11201
  updateStatistic({
11201
11202
  name: "outputTokens",
11202
11203
  label: statistics.label,
11203
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11204
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11204
11205
  trigger: statistics.trigger,
11205
11206
  count: metadata?.outputTokens
11206
11207
  })
@@ -11270,7 +11271,7 @@ Mood: friendly and intelligent.
11270
11271
  const user = authenticationResult.user;
11271
11272
  let agentQuery = db2("agents");
11272
11273
  agentQuery.select("*");
11273
- agentQuery = applyAccessControl(agentsSchema3(), agentQuery, authenticationResult.user);
11274
+ agentQuery = applyAccessControl(agentsSchema2(), agentQuery, authenticationResult.user);
11274
11275
  agentQuery.where({ id: req.params.agent });
11275
11276
  const agent = await agentQuery.first();
11276
11277
  if (!agent) {
@@ -11467,7 +11468,7 @@ data: ${JSON.stringify(event)}
11467
11468
  updateStatistic({
11468
11469
  name: "count",
11469
11470
  label: statistics.label,
11470
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11471
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11471
11472
  trigger: statistics.trigger,
11472
11473
  count: 1,
11473
11474
  user: user.id,
@@ -11478,7 +11479,7 @@ data: ${JSON.stringify(event)}
11478
11479
  updateStatistic({
11479
11480
  name: "inputTokens",
11480
11481
  label: statistics.label,
11481
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11482
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11482
11483
  trigger: statistics.trigger,
11483
11484
  count: totalInputTokens,
11484
11485
  user: user.id,
@@ -11490,7 +11491,7 @@ data: ${JSON.stringify(event)}
11490
11491
  updateStatistic({
11491
11492
  name: "outputTokens",
11492
11493
  label: statistics.label,
11493
- type: STATISTICS_TYPE_ENUM2.AGENT_RUN,
11494
+ type: STATISTICS_TYPE_ENUM.AGENT_RUN,
11494
11495
  trigger: statistics.trigger,
11495
11496
  count: totalInputTokens,
11496
11497
  user: user.id,
@@ -14569,7 +14570,7 @@ var ExuluEmbedder = class {
14569
14570
  await updateStatistic({
14570
14571
  name: "count",
14571
14572
  label: statistics.label,
14572
- type: STATISTICS_TYPE_ENUM2.EMBEDDER_GENERATE,
14573
+ type: STATISTICS_TYPE_ENUM.EMBEDDER_GENERATE,
14573
14574
  trigger: statistics.trigger,
14574
14575
  count: 1,
14575
14576
  user,
@@ -14597,7 +14598,7 @@ var ExuluEmbedder = class {
14597
14598
  await updateStatistic({
14598
14599
  name: "count",
14599
14600
  label: statistics.label,
14600
- type: STATISTICS_TYPE_ENUM2.EMBEDDER_GENERATE,
14601
+ type: STATISTICS_TYPE_ENUM.EMBEDDER_GENERATE,
14601
14602
  trigger: statistics.trigger,
14602
14603
  count: 1,
14603
14604
  user,
@@ -15018,7 +15019,7 @@ var SentenceChunker = class _SentenceChunker extends BaseChunker {
15018
15019
 
15019
15020
  // src/postgres/init-db.ts
15020
15021
  var {
15021
- agentsSchema: agentsSchema4,
15022
+ agentsSchema: agentsSchema3,
15022
15023
  feedbackSchema: feedbackSchema3,
15023
15024
  testCasesSchema: testCasesSchema3,
15024
15025
  evalSetsSchema: evalSetsSchema3,
@@ -15027,9 +15028,9 @@ var {
15027
15028
  platformConfigurationsSchema: platformConfigurationsSchema3,
15028
15029
  agentMessagesSchema: agentMessagesSchema3,
15029
15030
  rolesSchema: rolesSchema3,
15030
- usersSchema: usersSchema4,
15031
+ usersSchema: usersSchema3,
15031
15032
  statisticsSchema: statisticsSchema3,
15032
- variablesSchema: variablesSchema4,
15033
+ variablesSchema: variablesSchema3,
15033
15034
  workflowTemplatesSchema: workflowTemplatesSchema3,
15034
15035
  rbacSchema: rbacSchema3,
15035
15036
  projectsSchema: projectsSchema3,
@@ -15075,9 +15076,9 @@ var up = async function(knex) {
15075
15076
  embedderSettingsSchema3(),
15076
15077
  promptFavoritesSchema3(),
15077
15078
  rbacSchema3(),
15078
- agentsSchema4(),
15079
+ agentsSchema3(),
15079
15080
  feedbackSchema3(),
15080
- variablesSchema4(),
15081
+ variablesSchema3(),
15081
15082
  workflowTemplatesSchema3()
15082
15083
  ];
15083
15084
  const createTable = async (schema) => {
@@ -15124,7 +15125,7 @@ var up = async function(knex) {
15124
15125
  table.string("email", 255);
15125
15126
  table.timestamp("emailVerified", { useTz: true });
15126
15127
  table.text("image");
15127
- for (const field of usersSchema4().fields) {
15128
+ for (const field of usersSchema3().fields) {
15128
15129
  console.log("[EXULU] field", field);
15129
15130
  const { type, name, default: defaultValue, unique } = field;
15130
15131
  if (name === "id" || name === "name" || name === "email" || name === "emailVerified" || name === "image" || name === "password") {
@@ -15137,7 +15138,7 @@ var up = async function(knex) {
15137
15138
  }
15138
15139
  });
15139
15140
  } else {
15140
- await addMissingFields(knex, "users", usersSchema4().fields, [
15141
+ await addMissingFields(knex, "users", usersSchema3().fields, [
15141
15142
  "id",
15142
15143
  "name",
15143
15144
  "email",
@@ -16214,7 +16215,7 @@ var ExuluChunkers = {
16214
16215
  };
16215
16216
  export {
16216
16217
  JOB_STATUS_ENUM as EXULU_JOB_STATUS_ENUM,
16217
- STATISTICS_TYPE_ENUM2 as EXULU_STATISTICS_TYPE_ENUM,
16218
+ STATISTICS_TYPE_ENUM as EXULU_STATISTICS_TYPE_ENUM,
16218
16219
  ExuluApp2 as ExuluApp,
16219
16220
  ExuluAuthentication,
16220
16221
  ExuluChunkers,
@@ -8,7 +8,7 @@ export const ENTITLEMENTS: {
8
8
  "template-conversations": boolean,
9
9
  "agent-feedback": boolean,
10
10
  "multi-agent-tooling": boolean,
11
- "advanced-document-processing": boolean
11
+ "advanced-document-processing": boolean,
12
12
  } = {
13
13
  "rbac": false,
14
14
  "advanced-markdown-chunker": false,
package/ee/schemas.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  // Ee edition specific schemas
2
2
 
3
+ import { STATISTICS_TYPE_ENUM } from "@EXULU_TYPES/enums/statistics";
3
4
  import type { ExuluTableDefinition } from "@EXULU_TYPES/exulu-table-definition";
4
5
 
5
6
  export const feedbackSchema: ExuluTableDefinition = {
@@ -49,7 +50,7 @@ export const rolesSchema: ExuluTableDefinition = {
49
50
  type: "text",
50
51
  },
51
52
  {
52
- name: agentsSchema.name.plural,
53
+ name: "agents",
53
54
  type: "text", // write | read access to agents
54
55
  },
55
56
  {
@@ -61,11 +62,11 @@ export const rolesSchema: ExuluTableDefinition = {
61
62
  type: "text", // write | read access to workflows
62
63
  },
63
64
  {
64
- name: variablesSchema.name.plural,
65
+ name: "variables",
65
66
  type: "text", // write | read access to variables
66
67
  },
67
68
  {
68
- name: usersSchema.name.plural,
69
+ name: "users",
69
70
  type: "text", // write | read access to users
70
71
  },
71
72
  {
@@ -3,7 +3,101 @@ title: "Changelog"
3
3
  description: "Product updates and release notes for Exulu IMP"
4
4
  ---
5
5
 
6
- <Update label="March 2026">
6
+ <Update label="March 2026 - Enterprise Edition">
7
+ **Release Date:** March 11, 2026
8
+
9
+ This release introduces a major architectural change with the separation of Community and Enterprise Edition features, along with a powerful new document processing system.
10
+
11
+ ### Versions
12
+ - **Backend NPM package:** 1.48.0
13
+
14
+ <Info>This release includes breaking changes if you were using enterprise features. Please review the migration guide for Enterprise Edition.</Info>
15
+
16
+ ## What's New
17
+
18
+ ### Enterprise Edition Separation
19
+ We've established a clear separation between Community Edition (CE) and Enterprise Edition (EE) features:
20
+
21
+ - **EE Directory Structure:** All enterprise features now organized in dedicated `ee/` directory
22
+ - **License-based Entitlements:** New entitlements system with license checking for premium features
23
+ - **Feature Differentiation:** Clear documentation of CE vs EE feature sets
24
+ - **Moved to EE:** Agentic retrieval, BullMQ queues, RBAC, workers, and tokenizer are now enterprise features
25
+
26
+ ### Advanced Document Processing System
27
+ Powerful new document processing pipeline with VLM-powered validation:
28
+
29
+ - **Multi-format Support:** Process PDF, DOCX, DOC, TXT, and MD files
30
+ - **Python-based PDF Processor:** Uses MIT-licensed Docling library for accurate extraction
31
+ - **VLM Validation:** Vision Language Model validates and corrects OCR results
32
+ - **Smart Chunking:** Page-aware markdown chunking with heading hierarchy preservation
33
+ - **Table Extraction:** Automatic table detection and normalization in markdown format
34
+ - **Hybrid Chunking:** Combines semantic understanding with token-based splitting
35
+ - **Standalone Executable:** Build script creates portable PDF processor executable
36
+
37
+ ### Code Architecture Improvements
38
+ Significant refactoring for better maintainability and clarity:
39
+
40
+ - **Provider-Agent Separation:** Clear distinction between `ExuluProvider` (LLM configuration) and `ExuluAgent` (provider + tools + contexts)
41
+ - **Code-defined Agents:** Support for defining agents in code, not just via database/API/UI
42
+ - **Refactored Load Logic:** Agent loading logic moved into ExuluApp as methods
43
+ - **Shared Utilities:** Extracted `withRetry` utility for reusable retry logic across codebase
44
+ - **Consolidated Schemas:** Updated GraphQL resolvers and schemas for better organization
45
+
46
+ ## Documentation Updates
47
+
48
+ - **CE vs EE Comparison:** New pages documenting feature differences
49
+ - **Partners Program:** Documentation for licensing and partnerships
50
+ - **Enhanced API Reference:** Expanded with EE features
51
+ - **Migration Guides:** Clear instructions for upgrading to new architecture
52
+
53
+ ## Bug Fixes
54
+
55
+ - **Import Errors:** Fixed import path issues after EE separation
56
+ - **TypeScript Paths:** Updated configuration for EE modules
57
+ - **Queue Structure:** Updated validators for new queue organization
58
+
59
+ ## Dependency Updates
60
+
61
+ ### New Dependencies
62
+ - `docling` - Python library for document processing
63
+ - `mammoth` - DOCX to markdown conversion
64
+ - `turndown` - HTML to markdown conversion
65
+
66
+ ## Breaking Changes
67
+
68
+ <Warning>
69
+ If you were using any of the following features, they now require an Enterprise Edition license:
70
+ - Agentic retrieval system
71
+ - BullMQ-based queues
72
+ - RBAC (Role-Based Access Control)
73
+ - Worker processes
74
+ - Custom tokenizer features
75
+ </Warning>
76
+
77
+ ## Migration Guide
78
+
79
+ For users upgrading from previous versions:
80
+
81
+ 1. Update to `@exulu/backend@latest`
82
+ 2. Review your usage of enterprise features
83
+ 3. Update import paths if you're importing from internal modules
84
+ 4. Check the CE vs EE documentation to understand feature availability
85
+
86
+ ```bash
87
+ npm install @exulu/backend@latest
88
+ ```
89
+
90
+ ## What This Means For You
91
+
92
+ - **Clear Licensing:** Understand exactly which features are available in each edition
93
+ - **Better Architecture:** Cleaner separation of concerns between providers and agents
94
+ - **Advanced Processing:** Extract structured content from complex documents with high accuracy
95
+ - **VLM Validation:** Leverage vision models to improve OCR quality
96
+ - **Code-first Agents:** Define agents programmatically for better version control and deployment
97
+ - **Improved Maintainability:** Clearer code structure makes customization easier
98
+ </Update>
99
+
100
+ <Update label="March 2026 - Q1 Winter Release">
7
101
  **Release Date:** March 5, 2026
8
102
 
9
103
  We're excited to share the latest updates to Exulu IMP! This release focuses on intelligent retrieval capabilities, code quality improvements, and expanded AI model support.
@@ -132,7 +226,7 @@ description: "Product updates and release notes for Exulu IMP"
132
226
  ```
133
227
  </Update>
134
228
 
135
- <Update label="January 2026">
229
+ <Update label="January 2026 - Q4 Winter Release">
136
230
  **Release Date:** January 10, 2026
137
231
 
138
232
  We're excited to announce a major platform update bringing significant workflow enhancements, a significantly improved chat experience, and substantial architectural improvements. This release represents our most comprehensive update to date, with a focus on developer productivity, system performance, and user experience.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@exulu/backend",
3
3
  "author": "Qventu Bv.",
4
- "version": "1.47.0",
4
+ "version": "1.48.1",
5
5
  "main": "./dist/index.js",
6
6
  "private": false,
7
7
  "publishConfig": {
@@ -1,122 +0,0 @@
1
- # Winston Logger Implementation
2
-
3
- This document describes how winston logging has been integrated into the Exulu backend across Express server, MCP server, and worker instances.
4
-
5
- ## Architecture Overview
6
-
7
- The logging system is centralized through a logger factory function in `src/exulu/logger.ts` that creates winston logger instances with conditional OpenTelemetry integration.
8
-
9
- ## Logger Configuration
10
-
11
- ### Core Logger Setup (`src/registry/logger.ts`)
12
-
13
- The `createLogger` function accepts an `enableOtel` boolean parameter to conditionally enable OpenTelemetry transport:
14
-
15
- ```typescript
16
- const createLogger = ({ enableOtel }: { enableOtel: boolean }) => {
17
- const logger = winston.createLogger({
18
- level: 'debug',
19
- format: winston.format.combine(
20
- winston.format.timestamp(),
21
- winston.format.errors({ stack: true }),
22
- winston.format.metadata(),
23
- winston.format.json()
24
- ),
25
- defaultMeta: {
26
- service: 'Exulu',
27
- environment: process.env.NODE_ENV || 'development',
28
- },
29
- transports: [
30
- new winston.transports.Console(),
31
- ...(enableOtel ? [new OpenTelemetryTransportV3()] : []),
32
- ],
33
- })
34
- return logger;
35
- }
36
- ```
37
-
38
- ### Configuration-Driven Telemetry
39
-
40
- The ExuluApp class manages telemetry configuration through the `ExuluConfig` type:
41
-
42
- ```typescript
43
- export type ExuluConfig = {
44
- telemetry?: {
45
- enabled: boolean,
46
- }
47
- workers: {
48
- enabled: boolean,
49
- logsDir?: string,
50
- telemetry?: {
51
- enabled: boolean,
52
- }
53
- }
54
- // ...
55
- }
56
- ```
57
-
58
- ## Integration Points
59
-
60
- ### 1. Express Server Logging
61
-
62
- In `src/exulu/app/index`, the Express server creates a logger instance:
63
-
64
- ```typescript
65
- const logger = createLogger({
66
- enableOtel: this._config?.telemetry?.enabled ?? false
67
- })
68
- ```
69
-
70
- The logger is then passed to `createExpressRoutes()` for use throughout the Express application.
71
-
72
- ### 2. BullMQ Workers Logging
73
-
74
- In `src/exulu/app`, workers create their own logger instance:
75
-
76
- ```typescript
77
- const logger = createLogger({
78
- enableOtel: this._config?.workers?.telemetry?.enabled ?? false
79
- })
80
- ```
81
-
82
- Workers have separate telemetry configuration allowing independent control of logging transport.
83
-
84
- ### 3. MCP Server Logging
85
-
86
- The MCP server receives the logger instance via dependency injection in `src/mcp/index.ts:31`:
87
-
88
- ```typescript
89
- create = async ({ express, contexts, agents, config, tools, tracer, logger }: {
90
- // ... other params
91
- logger: Logger
92
- }) => {
93
- // Logger is passed in and used throughout MCP server
94
- }
95
- ```
96
-
97
- ## Features
98
-
99
- - **Structured JSON Logging**: All logs are formatted as JSON with timestamps and metadata
100
- - **Error Stack Traces**: Automatic stack trace capture for error objects
101
- - **Environment Context**: Automatic service name and environment labeling
102
- - **Conditional OpenTelemetry**: OTel transport enabled based on configuration
103
- - **Console Fallback**: Always includes console transport for development
104
- - **Instance-Level Control**: Express, Workers, and MCP can have independent telemetry settings
105
-
106
- ## Usage
107
-
108
- Configure telemetry in your ExuluApp config:
109
-
110
- ```typescript
111
- const config: ExuluConfig = {
112
- telemetry: {
113
- enabled: true // Enables OTel for Express and MCP
114
- },
115
- workers: {
116
- enabled: true,
117
- telemetry: {
118
- enabled: false // Workers use console-only logging
119
- }
120
- }
121
- }
122
- ```
@@ -1,145 +0,0 @@
1
- # OpenTelemetry (OTEL) Implementation
2
-
3
- ## Overview
4
-
5
- Exulu has built-in OpenTelemetry support for distributed tracing and logging. OTEL can be enabled/disabled individually for different components (workers, MCP, and Express server) through configuration.
6
-
7
- **Current Support**: The implementation currently supports SigNoz (both Cloud and self-hosted) as the observability backend. Future versions may include support for other OTEL-compatible backends.
8
-
9
- ## Architecture
10
-
11
- ### Core Components
12
-
13
- 1. **ExuluOtel Class** (`src/registry/otel.ts`)
14
- - Factory function that creates a NodeSDK instance
15
- - Configures trace and log exporters for SigNoz
16
- - Sets up automatic instrumentation
17
- - Handles graceful shutdown
18
-
19
- 2. **Configuration** (`src/registry/index.ts`)
20
- - Telemetry can be enabled at the app level and component level
21
- - Each component (workers, MCP, Express) has individual telemetry controls
22
-
23
- ## Usage
24
-
25
- ### Basic Setup
26
-
27
- ```typescript
28
- import { ExuluOtel } from "@exulu/backend";
29
-
30
- const otel = ExuluOtel.create({
31
- SIGNOZ_TRACES_URL: process.env.SIGNOZ_TRACES_URL!,
32
- SIGNOZ_LOGS_URL: process.env.SIGNOZ_LOGS_URL!,
33
- SIGNOZ_ACCESS_TOKEN: process.env.SIGNOZ_ACCESS_TOKEN!
34
- });
35
-
36
- otel.start();
37
- ```
38
-
39
- ### Configuration
40
-
41
- ```typescript
42
- const config: ExuluConfig = {
43
- telemetry: {
44
- enabled: true // Global telemetry switch
45
- },
46
- workers: {
47
- enabled: true,
48
- telemetry: {
49
- enabled: true // Worker-specific telemetry
50
- }
51
- },
52
- MCP: {
53
- enabled: true
54
- // MCP uses global telemetry setting
55
- }
56
- };
57
- ```
58
-
59
- ## Implementation Details
60
-
61
- ### Trace Generation
62
-
63
- When telemetry is enabled, Exulu automatically generates trace spans for:
64
-
65
- - **Express Server Routes** (`src/registry/routes.ts:166`)
66
- - **BullMQ Workers** (`src/registry/workers.ts:133`)
67
- - **MCP Operations** (`src/registry/index.ts:176`)
68
-
69
- ### Tracer Initialization
70
-
71
- ```typescript
72
- // Tracer is created when telemetry is enabled
73
- let tracer: Tracer | undefined;
74
- if (config?.telemetry?.enabled) {
75
- tracer = trace.getTracer("exulu", "1.0.0");
76
- }
77
- ```
78
-
79
- ### SigNoz Integration
80
-
81
- The current implementation is specifically designed for SigNoz integration (supports both SigNoz Cloud and self-hosted deployments):
82
-
83
- - **Service Name**: `Exulu`
84
- - **Traces**: Exported to `SIGNOZ_TRACES_URL`
85
- - **Logs**: Exported to `SIGNOZ_LOGS_URL`
86
- - **Authentication**: Uses `signoz-access-token` header
87
- - **Protocol**: OTLP over HTTP with SigNoz-specific headers
88
-
89
- ### Auto-Instrumentation
90
-
91
- Uses `@opentelemetry/auto-instrumentations-node` for automatic instrumentation of:
92
- - HTTP requests/responses
93
- - Database queries
94
- - File system operations
95
- - And more Node.js modules
96
-
97
- ### Graceful Shutdown
98
-
99
- OTEL SDK automatically shuts down on `SIGTERM` signal:
100
-
101
- ```typescript
102
- process.on('SIGTERM', () => {
103
- sdk.shutdown()
104
- .then(() => console.log('Tracing terminated'))
105
- .catch((error) => console.log('Error terminating tracing', error))
106
- .finally(() => process.exit(0));
107
- });
108
- ```
109
-
110
- ## Environment Variables
111
-
112
- Required environment variables for SigNoz integration:
113
-
114
- - `SIGNOZ_TRACES_URL`: URL for trace export
115
- - `SIGNOZ_LOGS_URL`: URL for log export
116
- - `SIGNOZ_ACCESS_TOKEN`: Authentication token
117
-
118
- ## Component-Level Control
119
-
120
- ### Workers
121
- - Controlled by `config.workers.telemetry.enabled`
122
- - Creates tracer instance when enabled
123
- - Passes tracer to worker creation
124
-
125
- ### Express Server
126
- - Controlled by `config.telemetry.enabled`
127
- - Creates tracer for route instrumentation
128
- - Integrates with logger for structured logging
129
-
130
- ### MCP Server
131
- - Uses global `config.telemetry.enabled` setting
132
- - Receives tracer instance from parent ExuluApp
133
- - Traces MCP protocol operations
134
-
135
- ## Logger Integration
136
-
137
- Each component creates an OTEL-aware logger:
138
-
139
- ```typescript
140
- const logger = createLogger({
141
- enableOtel: config?.telemetry?.enabled ?? false
142
- });
143
- ```
144
-
145
- This enables correlation between traces and structured logs.