@exulu/backend 1.47.0 → 1.48.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.
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,
@@ -16226,6 +16227,7 @@ export {
16226
16227
  ExuluEval,
16227
16228
  ExuluJobs,
16228
16229
  ExuluOtel,
16230
+ ExuluProvider,
16229
16231
  queues as ExuluQueues,
16230
16232
  ExuluReranker,
16231
16233
  ExuluTool,
@@ -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,11 +1,11 @@
1
1
  {
2
2
  "name": "@exulu/backend",
3
3
  "author": "Qventu Bv.",
4
- "version": "1.47.0",
4
+ "version": "1.48.2",
5
5
  "main": "./dist/index.js",
6
6
  "private": false,
7
7
  "publishConfig": {
8
- "access": "restricted"
8
+ "access": "public"
9
9
  },
10
10
  "module": "./dist/index.mjs",
11
11
  "types": "./dist/index.d.ts",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "repository": {
17
17
  "type": "git",
18
- "url": "https://github.com/Qventu/exulu-backend"
18
+ "url": "https://github.com/Qventu/exulu-backend.git"
19
19
  },
20
20
  "scripts": {
21
21
  "preinstall": "node -e \"if (process.version !== 'v22.18.0') { console.error('❌ Wrong Node.js version. Expected v22.18.0, got ' + process.version); process.exit(1); }\"",
@@ -126,6 +126,7 @@
126
126
  "natural": "^8.1.0",
127
127
  "officeparser": "^5.2.2",
128
128
  "openai": "^5.21.0",
129
+ "p-limit": "^7.3.0",
129
130
  "papaparse": "^5.5.2",
130
131
  "pg": "^8.16.3",
131
132
  "pgvector": "^0.2.0",