@owox/backend 0.35.0-next-20260917211534 → 0.35.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 (100) hide show
  1. package/dist/src/common/search/search.facade.d.ts +15 -1
  2. package/dist/src/common/search/search.facade.js +1 -0
  3. package/dist/src/data-marts/ai-insights/agent/types.d.ts +12 -12
  4. package/dist/src/data-marts/controllers/spec/report.api.js +5 -1
  5. package/dist/src/data-marts/controllers/spec/search.api.js +2 -1
  6. package/dist/src/data-marts/data-destination-types/enums/data-destination-type.enum.d.ts +1 -0
  7. package/dist/src/data-marts/data-destination-types/enums/data-destination-type.enum.js +14 -0
  8. package/dist/src/data-marts/data-marts.module.js +3 -0
  9. package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.d.ts +1 -0
  10. package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.js +18 -0
  11. package/dist/src/data-marts/dto/domain/blendable-schema.dto.d.ts +1 -0
  12. package/dist/src/data-marts/dto/domain/blendable-schema.dto.js +15 -0
  13. package/dist/src/data-marts/dto/presentation/run-data-mart-request-api.dto.js +4 -1
  14. package/dist/src/data-marts/dto/presentation/search-result-response-api.dto.d.ts +15 -0
  15. package/dist/src/data-marts/dto/presentation/search-result-response-api.dto.js +61 -1
  16. package/dist/src/data-marts/entities/report.entity.d.ts +1 -0
  17. package/dist/src/data-marts/entities/report.entity.js +8 -1
  18. package/dist/src/data-marts/entities/search/report-search-index.entity.d.ts +10 -0
  19. package/dist/src/data-marts/entities/search/report-search-index.entity.js +62 -0
  20. package/dist/src/data-marts/entities/search/search-project-reindex-trigger.entity.d.ts +2 -0
  21. package/dist/src/data-marts/entities/search/search-project-reindex-trigger.entity.js +9 -1
  22. package/dist/src/data-marts/entities/search/search-reindex-trigger.entity.d.ts +9 -1
  23. package/dist/src/data-marts/entities/search/search-reindex-trigger.entity.js +14 -0
  24. package/dist/src/data-marts/errors/disconnected-report-columns.error.d.ts +1 -1
  25. package/dist/src/data-marts/errors/disconnected-report-columns.error.js +19 -6
  26. package/dist/src/data-marts/search/config/advanced-search.config.d.ts +1 -0
  27. package/dist/src/data-marts/search/config/advanced-search.config.js +2 -0
  28. package/dist/src/data-marts/search/engine/advanced-search.service.js +1 -0
  29. package/dist/src/data-marts/search/engine/in-memory-paginated.search.js +3 -1
  30. package/dist/src/data-marts/search/engine/search-query-builder.d.ts +2 -1
  31. package/dist/src/data-marts/search/engine/search-query-builder.js +2 -2
  32. package/dist/src/data-marts/search/engine/tokenizer.d.ts +2 -0
  33. package/dist/src/data-marts/search/engine/tokenizer.js +9 -0
  34. package/dist/src/data-marts/search/engine/vector-search.port.d.ts +2 -1
  35. package/dist/src/data-marts/search/indexing/document-builder.d.ts +2 -0
  36. package/dist/src/data-marts/search/indexing/document-builder.js +1 -0
  37. package/dist/src/data-marts/search/indexing/entity-scoring-descriptor.d.ts +2 -1
  38. package/dist/src/data-marts/search/indexing/search-indexer.service.d.ts +9 -1
  39. package/dist/src/data-marts/search/indexing/search-indexer.service.js +147 -7
  40. package/dist/src/data-marts/search/indexing/search-reindex-trigger-handler.service.d.ts +6 -2
  41. package/dist/src/data-marts/search/indexing/search-reindex-trigger-handler.service.js +34 -2
  42. package/dist/src/data-marts/search/schema/search-index.repository.d.ts +1 -0
  43. package/dist/src/data-marts/search/schema/search-index.repository.js +81 -13
  44. package/dist/src/data-marts/search/search.facade.impl.d.ts +4 -1
  45. package/dist/src/data-marts/search/search.facade.impl.js +18 -4
  46. package/dist/src/data-marts/search/search.module.js +13 -2
  47. package/dist/src/data-marts/search/sources/report.source.d.ts +23 -0
  48. package/dist/src/data-marts/search/sources/report.source.js +173 -0
  49. package/dist/src/data-marts/services/advanced-search-index-sync.service.d.ts +5 -2
  50. package/dist/src/data-marts/services/advanced-search-index-sync.service.js +24 -1
  51. package/dist/src/data-marts/services/auto-collapse.resolver.d.ts +6 -0
  52. package/dist/src/data-marts/services/auto-collapse.resolver.js +14 -0
  53. package/dist/src/data-marts/services/blendable-schema.service.js +15 -1
  54. package/dist/src/data-marts/services/blended-report-data.service.js +3 -3
  55. package/dist/src/data-marts/services/connector/connector-executor.service.d.ts +1 -0
  56. package/dist/src/data-marts/services/connector/connector-executor.service.js +80 -14
  57. package/dist/src/data-marts/services/connector/connector-run.service.d.ts +3 -1
  58. package/dist/src/data-marts/services/connector/connector-run.service.js +10 -4
  59. package/dist/src/data-marts/services/connector/connector-source-config.service.js +2 -5
  60. package/dist/src/data-marts/services/data-mart-run.service.d.ts +2 -0
  61. package/dist/src/data-marts/services/data-mart-run.service.js +6 -3
  62. package/dist/src/data-marts/services/looker-studio-report.service.d.ts +7 -0
  63. package/dist/src/data-marts/services/looker-studio-report.service.js +79 -0
  64. package/dist/src/data-marts/services/output-controls-validator.service.js +1 -1
  65. package/dist/src/data-marts/services/report-data-cache.service.d.ts +1 -0
  66. package/dist/src/data-marts/services/report-data-cache.service.js +33 -8
  67. package/dist/src/data-marts/services/report-run.service.js +1 -1
  68. package/dist/src/data-marts/services/report.service.d.ts +6 -2
  69. package/dist/src/data-marts/services/report.service.js +17 -4
  70. package/dist/src/data-marts/use-cases/create-report.service.d.ts +5 -1
  71. package/dist/src/data-marts/use-cases/create-report.service.js +21 -8
  72. package/dist/src/data-marts/use-cases/delete-report.service.d.ts +3 -1
  73. package/dist/src/data-marts/use-cases/delete-report.service.js +9 -3
  74. package/dist/src/data-marts/use-cases/get-report-generated-sql.service.js +1 -1
  75. package/dist/src/data-marts/use-cases/legacy-data-marts/move-legacy-data-storage.service.js +11 -2
  76. package/dist/src/data-marts/use-cases/run-report.service.js +8 -9
  77. package/dist/src/data-marts/use-cases/stream-http-data.service.d.ts +3 -0
  78. package/dist/src/data-marts/use-cases/stream-http-data.service.js +15 -6
  79. package/dist/src/data-marts/use-cases/update-data-destination.service.js +7 -0
  80. package/dist/src/data-marts/use-cases/update-data-mart-title.service.js +4 -0
  81. package/dist/src/data-marts/use-cases/update-report.service.d.ts +3 -1
  82. package/dist/src/data-marts/use-cases/update-report.service.js +8 -2
  83. package/dist/src/data-marts/utils/manual-backfill-range.d.ts +20 -0
  84. package/dist/src/data-marts/utils/manual-backfill-range.js +131 -0
  85. package/dist/src/ee/mcp/instructions/mcp-system-instructions.d.ts +1 -1
  86. package/dist/src/ee/mcp/instructions/mcp-system-instructions.js +1 -0
  87. package/dist/src/ee/mcp/tools/delete-report.tool.d.ts +1 -1
  88. package/dist/src/ee/mcp/tools/delete-report.tool.js +1 -1
  89. package/dist/src/ee/mcp/tools/mcp-tool.providers.js +2 -0
  90. package/dist/src/ee/mcp/tools/query-data-mart.tool.js +6 -2
  91. package/dist/src/ee/mcp/tools/search-reports.tool.d.ts +107 -0
  92. package/dist/src/ee/mcp/tools/search-reports.tool.js +106 -0
  93. package/dist/src/migrations/1779200000000-migrate-prejoin-filter-to-unified-column.js +1 -0
  94. package/dist/src/migrations/1787788800004-create-report-search-index-tables.d.ts +7 -0
  95. package/dist/src/migrations/1787788800004-create-report-search-index-tables.js +84 -0
  96. package/dist/src/migrations/1787788800005-add-report-reindex-progress.d.ts +5 -0
  97. package/dist/src/migrations/1787788800005-add-report-reindex-progress.js +39 -0
  98. package/dist/src/migrations/1789646400000-add-soft-delete-to-report.d.ts +6 -0
  99. package/dist/src/migrations/1789646400000-add-soft-delete-to-report.js +15 -0
  100. package/package.json +5 -5
@@ -3,7 +3,19 @@ export declare const SEARCH_SEMANTIC_ENGINE: unique symbol;
3
3
  export declare enum SearchableEntityType {
4
4
  DATA_MART = "DATA_MART",
5
5
  DATA_STORAGE = "DATA_STORAGE",
6
- DATA_DESTINATION = "DATA_DESTINATION"
6
+ DATA_DESTINATION = "DATA_DESTINATION",
7
+ REPORT = "REPORT"
8
+ }
9
+ export interface SearchReportRef {
10
+ dataMart: {
11
+ id: string;
12
+ title: string;
13
+ };
14
+ dataDestination: {
15
+ id: string;
16
+ title: string;
17
+ type: string;
18
+ };
7
19
  }
8
20
  export interface SearchResult {
9
21
  entityType: SearchableEntityType;
@@ -13,6 +25,8 @@ export interface SearchResult {
13
25
  finalScore: number;
14
26
  kwScore: number;
15
27
  vecScore: number | null;
28
+ report?: SearchReportRef;
29
+ url?: string;
16
30
  }
17
31
  export interface SearchAccessScope {
18
32
  userId: string;
@@ -8,5 +8,6 @@ var SearchableEntityType;
8
8
  SearchableEntityType["DATA_MART"] = "DATA_MART";
9
9
  SearchableEntityType["DATA_STORAGE"] = "DATA_STORAGE";
10
10
  SearchableEntityType["DATA_DESTINATION"] = "DATA_DESTINATION";
11
+ SearchableEntityType["REPORT"] = "REPORT";
11
12
  })(SearchableEntityType || (exports.SearchableEntityType = SearchableEntityType = {}));
12
13
  //# sourceMappingURL=search.facade.js.map
@@ -252,12 +252,12 @@ export declare const QueryPlanWhereSpecSchema: z.ZodObject<{
252
252
  }, "strip", z.ZodTypeAny, {
253
253
  value: string | number | boolean | string[] | number[] | null;
254
254
  required: boolean;
255
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
255
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
256
256
  field: string;
257
257
  notes?: string | undefined;
258
258
  }, {
259
259
  value: string | number | boolean | string[] | number[] | null;
260
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
260
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
261
261
  field: string;
262
262
  required?: boolean | undefined;
263
263
  notes?: string | undefined;
@@ -339,12 +339,12 @@ export declare const QueryPlanSchema: z.ZodObject<{
339
339
  }, "strip", z.ZodTypeAny, {
340
340
  value: string | number | boolean | string[] | number[] | null;
341
341
  required: boolean;
342
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
342
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
343
343
  field: string;
344
344
  notes?: string | undefined;
345
345
  }, {
346
346
  value: string | number | boolean | string[] | number[] | null;
347
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
347
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
348
348
  field: string;
349
349
  required?: boolean | undefined;
350
350
  notes?: string | undefined;
@@ -475,7 +475,7 @@ export declare const QueryPlanSchema: z.ZodObject<{
475
475
  whereSpecs: {
476
476
  value: string | number | boolean | string[] | number[] | null;
477
477
  required: boolean;
478
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
478
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
479
479
  field: string;
480
480
  notes?: string | undefined;
481
481
  }[];
@@ -517,7 +517,7 @@ export declare const QueryPlanSchema: z.ZodObject<{
517
517
  }[];
518
518
  whereSpecs: {
519
519
  value: string | number | boolean | string[] | number[] | null;
520
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
520
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
521
521
  field: string;
522
522
  required?: boolean | undefined;
523
523
  notes?: string | undefined;
@@ -625,12 +625,12 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
625
625
  }, "strip", z.ZodTypeAny, {
626
626
  value: string | number | boolean | string[] | number[] | null;
627
627
  required: boolean;
628
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
628
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
629
629
  field: string;
630
630
  notes?: string | undefined;
631
631
  }, {
632
632
  value: string | number | boolean | string[] | number[] | null;
633
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
633
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
634
634
  field: string;
635
635
  required?: boolean | undefined;
636
636
  notes?: string | undefined;
@@ -761,7 +761,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
761
761
  whereSpecs: {
762
762
  value: string | number | boolean | string[] | number[] | null;
763
763
  required: boolean;
764
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
764
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
765
765
  field: string;
766
766
  notes?: string | undefined;
767
767
  }[];
@@ -803,7 +803,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
803
803
  }[];
804
804
  whereSpecs: {
805
805
  value: string | number | boolean | string[] | number[] | null;
806
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
806
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
807
807
  field: string;
808
808
  required?: boolean | undefined;
809
809
  notes?: string | undefined;
@@ -877,7 +877,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
877
877
  whereSpecs: {
878
878
  value: string | number | boolean | string[] | number[] | null;
879
879
  required: boolean;
880
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
880
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
881
881
  field: string;
882
882
  notes?: string | undefined;
883
883
  }[];
@@ -923,7 +923,7 @@ export declare const PlanModelJsonSchema: z.ZodObject<{
923
923
  }[];
924
924
  whereSpecs: {
925
925
  value: string | number | boolean | string[] | number[] | null;
926
- operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "=" | "!=" | ">" | ">=" | "<" | "<=";
926
+ operator: "between" | "in" | "ilike" | "like" | "is_null" | "is_not_null" | "<" | ">" | "=" | "!=" | ">=" | "<=";
927
927
  field: string;
928
928
  required?: boolean | undefined;
929
929
  notes?: string | undefined;
@@ -36,7 +36,11 @@ function GetReportSpec() {
36
36
  }));
37
37
  }
38
38
  function DeleteReportSpec() {
39
- return (0, common_1.applyDecorators)((0, swagger_1.ApiOperation)({ summary: 'Delete a report' }), (0, swagger_1.ApiParam)({ name: 'id', description: 'Report ID' }), (0, swagger_1.ApiOkResponse)({
39
+ return (0, common_1.applyDecorators)((0, swagger_1.ApiOperation)({
40
+ summary: 'Delete a report',
41
+ description: 'Soft-deletes the report, retaining its configuration and run history. ' +
42
+ 'Deleted reports are excluded from report lists and cannot be read or run.',
43
+ }), (0, swagger_1.ApiParam)({ name: 'id', description: 'Report ID' }), (0, swagger_1.ApiOkResponse)({
40
44
  description: 'The report has been successfully deleted.',
41
45
  }));
42
46
  }
@@ -8,7 +8,8 @@ const search_result_response_api_dto_1 = require("../../dto/presentation/search-
8
8
  function SearchSpec() {
9
9
  return (0, common_1.applyDecorators)((0, swagger_1.ApiOperation)({
10
10
  summary: 'Search project entities',
11
- description: 'Returns data marts, data storages, and data destinations visible to the caller. ' +
11
+ description: 'Returns data marts, data storages, data destinations, and reports visible to the caller. ' +
12
+ 'Report results also carry their data mart, destination, and a canonical direct URL. ' +
12
13
  'Search uses semantic and keyword signals and falls back to keyword matching when ' +
13
14
  'prompt embeddings are unavailable.',
14
15
  }), (0, swagger_1.ApiQuery)({
@@ -10,5 +10,6 @@ export declare enum DataDestinationType {
10
10
  export declare function toHumanReadable(type: DataDestinationType): string;
11
11
  export declare function isEmailBasedDataDestinationType(type: DataDestinationType): boolean;
12
12
  export declare function isPullBasedDataDestinationType(type: DataDestinationType): boolean;
13
+ export declare function collapsesOnDelivery(type: DataDestinationType): boolean;
13
14
  export declare function requiresCredentials(type: DataDestinationType): boolean;
14
15
  export declare function usesSuffixedJoinedFieldNames(type: DataDestinationType): boolean;
@@ -4,6 +4,7 @@ exports.DataDestinationType = void 0;
4
4
  exports.toHumanReadable = toHumanReadable;
5
5
  exports.isEmailBasedDataDestinationType = isEmailBasedDataDestinationType;
6
6
  exports.isPullBasedDataDestinationType = isPullBasedDataDestinationType;
7
+ exports.collapsesOnDelivery = collapsesOnDelivery;
7
8
  exports.requiresCredentials = requiresCredentials;
8
9
  exports.usesSuffixedJoinedFieldNames = usesSuffixedJoinedFieldNames;
9
10
  var DataDestinationType;
@@ -45,6 +46,19 @@ function isEmailBasedDataDestinationType(type) {
45
46
  function isPullBasedDataDestinationType(type) {
46
47
  return type === DataDestinationType.LOOKER_STUDIO || type === DataDestinationType.EXCEL;
47
48
  }
49
+ function collapsesOnDelivery(type) {
50
+ switch (type) {
51
+ case DataDestinationType.LOOKER_STUDIO:
52
+ return false;
53
+ case DataDestinationType.GOOGLE_SHEETS:
54
+ case DataDestinationType.EXCEL:
55
+ case DataDestinationType.EMAIL:
56
+ case DataDestinationType.SLACK:
57
+ case DataDestinationType.MS_TEAMS:
58
+ case DataDestinationType.GOOGLE_CHAT:
59
+ return true;
60
+ }
61
+ }
48
62
  function requiresCredentials(type) {
49
63
  return type !== DataDestinationType.EXCEL;
50
64
  }
@@ -175,6 +175,7 @@ const data_mart_schema_parser_facade_service_1 = require("./data-storage-types/f
175
175
  const data_mart_scheduled_trigger_entity_1 = require("./entities/data-mart-scheduled-trigger.entity");
176
176
  const scheduled_triggers_handler_service_1 = require("./services/scheduled-triggers-handler.service");
177
177
  const report_service_1 = require("./services/report.service");
178
+ const looker_studio_report_service_1 = require("./services/looker-studio-report.service");
178
179
  const insight_service_1 = require("./services/insight.service");
179
180
  const insight_artifact_service_1 = require("./services/insight-artifact.service");
180
181
  const insight_artifact_sql_preview_trigger_handler_service_1 = require("./services/insight-artifact-sql-preview-trigger-handler.service");
@@ -490,6 +491,7 @@ exports.DataMartsModule = DataMartsModule = __decorate([
490
491
  search_project_reindex_trigger_entity_1.SearchDataMartProjectReindexTrigger,
491
492
  search_project_reindex_trigger_entity_1.SearchDataStorageProjectReindexTrigger,
492
493
  search_project_reindex_trigger_entity_1.SearchDataDestinationProjectReindexTrigger,
494
+ search_project_reindex_trigger_entity_1.SearchReportProjectReindexTrigger,
493
495
  data_mart_entity_1.DataMart,
494
496
  data_mart_business_owner_entity_1.DataMartBusinessOwner,
495
497
  data_mart_technical_owner_entity_1.DataMartTechnicalOwner,
@@ -803,6 +805,7 @@ exports.DataMartsModule = DataMartsModule = __decorate([
803
805
  update_scheduled_trigger_service_1.UpdateScheduledTriggerService,
804
806
  delete_scheduled_trigger_service_1.DeleteScheduledTriggerService,
805
807
  report_service_1.ReportService,
808
+ looker_studio_report_service_1.LookerStudioReportService,
806
809
  report_access_service_1.ReportAccessService,
807
810
  access_decision_1.AccessDecisionService,
808
811
  advanced_search_index_sync_service_1.AdvancedSearchIndexSyncService,
@@ -19,6 +19,7 @@ export declare function collectSchemaFieldPathDescriptors(fields: readonly DataM
19
19
  type: string;
20
20
  field: DataMartSchemaField;
21
21
  }[];
22
+ export declare function collectHiddenForReportingPaths(fields: readonly DataMartSchemaField[], prefix?: string): string[];
22
23
  export declare function collectFormulaReferenceableFields(fields: readonly DataMartSchemaField[], prefix?: string): {
23
24
  name: string;
24
25
  field: DataMartSchemaField;
@@ -15,6 +15,7 @@ exports.collectSchemaFieldPaths = collectSchemaFieldPaths;
15
15
  exports.collectSchemaFieldPathTypes = collectSchemaFieldPathTypes;
16
16
  exports.getReportFieldType = getReportFieldType;
17
17
  exports.collectSchemaFieldPathDescriptors = collectSchemaFieldPathDescriptors;
18
+ exports.collectHiddenForReportingPaths = collectHiddenForReportingPaths;
18
19
  exports.collectFormulaReferenceableFields = collectFormulaReferenceableFields;
19
20
  exports.getMainUniqueCountKeyFields = getMainUniqueCountKeyFields;
20
21
  exports.collectPrimaryKeyRowIdentity = collectPrimaryKeyRowIdentity;
@@ -65,6 +66,23 @@ function collectSchemaFieldPathDescriptors(fields, prefix = '') {
65
66
  }
66
67
  return result;
67
68
  }
69
+ function collectHiddenForReportingPaths(fields, prefix = '') {
70
+ const result = [];
71
+ for (const field of fields) {
72
+ if (!isConnected(field))
73
+ continue;
74
+ const fullName = prefix ? `${prefix}.${field.name}` : field.name;
75
+ const children = 'fields' in field && field.fields?.length && !(0, field_type_compatibility_1.isArrayFieldType)(getReportFieldType(field))
76
+ ? field.fields
77
+ : [];
78
+ if (field.isHiddenForReporting) {
79
+ result.push(fullName, ...collectFormulaReferenceableFields(children, fullName).map(({ name }) => name));
80
+ continue;
81
+ }
82
+ result.push(...collectHiddenForReportingPaths(children, fullName));
83
+ }
84
+ return result;
85
+ }
68
86
  function collectFormulaReferenceableFields(fields, prefix = '') {
69
87
  const result = [];
70
88
  for (const field of fields) {
@@ -46,4 +46,5 @@ export declare class BlendableSchemaDto {
46
46
  availableSources: AvailableSourceDto[];
47
47
  mainUniqueCountKeyFields: string[];
48
48
  calculatedFieldIssues: CalculatedFieldIssueDto[];
49
+ hiddenFieldNames: string[];
49
50
  }
@@ -250,6 +250,7 @@ class BlendableSchemaDto {
250
250
  availableSources;
251
251
  mainUniqueCountKeyFields;
252
252
  calculatedFieldIssues;
253
+ hiddenFieldNames;
253
254
  }
254
255
  exports.BlendableSchemaDto = BlendableSchemaDto;
255
256
  __decorate([
@@ -295,4 +296,18 @@ __decorate([
295
296
  }),
296
297
  __metadata("design:type", Array)
297
298
  ], BlendableSchemaDto.prototype, "calculatedFieldIssues", void 0);
299
+ __decorate([
300
+ (0, swagger_1.ApiProperty)({
301
+ type: [String],
302
+ description: 'Column names someone hid from reporting, in the form a report stores them: own columns as ' +
303
+ 'dotted paths (`metrics.cost`, a hidden RECORD bringing its subtree), joined columns by ' +
304
+ 'their unified blended name — the same form as `blendedFields[].name`, hash suffix and all. ' +
305
+ 'Covers both joined switches: a field hidden on the joined Data Mart (absent from ' +
306
+ '`blendedFields` entirely) and one hidden per join (present there with `isHidden: true`). ' +
307
+ 'The list exists so a report that still selects such a column can be told it was HIDDEN ' +
308
+ 'rather than lost, which is a different fact with a different fix. A column that is also ' +
309
+ 'disconnected is left out: it really is gone.',
310
+ }),
311
+ __metadata("design:type", Array)
312
+ ], BlendableSchemaDto.prototype, "hiddenFieldNames", void 0);
298
313
  //# sourceMappingURL=blendable-schema.dto.js.map
@@ -102,7 +102,10 @@ __decorate([
102
102
  data: { StartDate: '2026-07-01', EndDate: '2026-07-31' },
103
103
  },
104
104
  description: `Payload for the manual run. Omit it or select INCREMENTAL for an incremental run.
105
- MANUAL_BACKFILL can include connector-specific fields in data.`,
105
+ MANUAL_BACKFILL can include connector-specific fields in data; connectors without backfill
106
+ fields can omit data. StartDate and EndDate accept YYYY-MM-DD (or the date part of an
107
+ ISO-8601 timestamp). A missing or future EndDate counts as today, and the resulting range
108
+ may cover at most 31 days.`,
106
109
  }),
107
110
  __metadata("design:type", Object)
108
111
  ], RunDataMartRequestApiDto.prototype, "payload", void 0);
@@ -1,4 +1,17 @@
1
1
  import { SearchableEntityType } from '../../../common/search/search.facade';
2
+ export declare class SearchReportDataMartRefResponseApiDto {
3
+ id: string;
4
+ title: string;
5
+ }
6
+ export declare class SearchReportDataDestinationRefResponseApiDto {
7
+ id: string;
8
+ title: string;
9
+ type: string;
10
+ }
11
+ export declare class SearchReportRefResponseApiDto {
12
+ dataMart: SearchReportDataMartRefResponseApiDto;
13
+ dataDestination: SearchReportDataDestinationRefResponseApiDto;
14
+ }
2
15
  export declare class SearchResultResponseApiDto {
3
16
  entityType: SearchableEntityType;
4
17
  entityId: string;
@@ -7,4 +20,6 @@ export declare class SearchResultResponseApiDto {
7
20
  finalScore: number;
8
21
  kwScore: number;
9
22
  vecScore: number | null;
23
+ report?: SearchReportRefResponseApiDto;
24
+ url?: string;
10
25
  }
@@ -9,9 +9,53 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.SearchResultResponseApiDto = void 0;
12
+ exports.SearchResultResponseApiDto = exports.SearchReportRefResponseApiDto = exports.SearchReportDataDestinationRefResponseApiDto = exports.SearchReportDataMartRefResponseApiDto = void 0;
13
13
  const swagger_1 = require("@nestjs/swagger");
14
14
  const search_facade_1 = require("../../../common/search/search.facade");
15
+ class SearchReportDataMartRefResponseApiDto {
16
+ id;
17
+ title;
18
+ }
19
+ exports.SearchReportDataMartRefResponseApiDto = SearchReportDataMartRefResponseApiDto;
20
+ __decorate([
21
+ (0, swagger_1.ApiProperty)({ example: '9cabc24e-1234-4a5a-8b12-abcdef123456' }),
22
+ __metadata("design:type", String)
23
+ ], SearchReportDataMartRefResponseApiDto.prototype, "id", void 0);
24
+ __decorate([
25
+ (0, swagger_1.ApiProperty)({ example: 'Orders' }),
26
+ __metadata("design:type", String)
27
+ ], SearchReportDataMartRefResponseApiDto.prototype, "title", void 0);
28
+ class SearchReportDataDestinationRefResponseApiDto {
29
+ id;
30
+ title;
31
+ type;
32
+ }
33
+ exports.SearchReportDataDestinationRefResponseApiDto = SearchReportDataDestinationRefResponseApiDto;
34
+ __decorate([
35
+ (0, swagger_1.ApiProperty)({ example: '2f1c5d0a-5678-4b1c-9d2e-fedcba654321' }),
36
+ __metadata("design:type", String)
37
+ ], SearchReportDataDestinationRefResponseApiDto.prototype, "id", void 0);
38
+ __decorate([
39
+ (0, swagger_1.ApiProperty)({ example: 'Finance Sheets' }),
40
+ __metadata("design:type", String)
41
+ ], SearchReportDataDestinationRefResponseApiDto.prototype, "title", void 0);
42
+ __decorate([
43
+ (0, swagger_1.ApiProperty)({ example: 'GOOGLE_SHEETS', description: 'Data destination type' }),
44
+ __metadata("design:type", String)
45
+ ], SearchReportDataDestinationRefResponseApiDto.prototype, "type", void 0);
46
+ class SearchReportRefResponseApiDto {
47
+ dataMart;
48
+ dataDestination;
49
+ }
50
+ exports.SearchReportRefResponseApiDto = SearchReportRefResponseApiDto;
51
+ __decorate([
52
+ (0, swagger_1.ApiProperty)({ type: SearchReportDataMartRefResponseApiDto }),
53
+ __metadata("design:type", SearchReportDataMartRefResponseApiDto)
54
+ ], SearchReportRefResponseApiDto.prototype, "dataMart", void 0);
55
+ __decorate([
56
+ (0, swagger_1.ApiProperty)({ type: SearchReportDataDestinationRefResponseApiDto }),
57
+ __metadata("design:type", SearchReportDataDestinationRefResponseApiDto)
58
+ ], SearchReportRefResponseApiDto.prototype, "dataDestination", void 0);
15
59
  class SearchResultResponseApiDto {
16
60
  entityType;
17
61
  entityId;
@@ -20,6 +64,8 @@ class SearchResultResponseApiDto {
20
64
  finalScore;
21
65
  kwScore;
22
66
  vecScore;
67
+ report;
68
+ url;
23
69
  }
24
70
  exports.SearchResultResponseApiDto = SearchResultResponseApiDto;
25
71
  __decorate([
@@ -59,4 +105,18 @@ __decorate([
59
105
  }),
60
106
  __metadata("design:type", Object)
61
107
  ], SearchResultResponseApiDto.prototype, "vecScore", void 0);
108
+ __decorate([
109
+ (0, swagger_1.ApiPropertyOptional)({
110
+ type: SearchReportRefResponseApiDto,
111
+ description: 'Data mart and destination of a REPORT result; absent for other entity types',
112
+ }),
113
+ __metadata("design:type", SearchReportRefResponseApiDto)
114
+ ], SearchResultResponseApiDto.prototype, "report", void 0);
115
+ __decorate([
116
+ (0, swagger_1.ApiPropertyOptional)({
117
+ example: 'https://app.owox.com/ui/project-1/data-marts/dm-1/reports?reportId=rep-1',
118
+ description: 'Canonical direct URL of a REPORT result; absent for other entity types',
119
+ }),
120
+ __metadata("design:type", String)
121
+ ], SearchResultResponseApiDto.prototype, "url", void 0);
62
122
  //# sourceMappingURL=search-result-response-api.dto.js.map
@@ -31,6 +31,7 @@ export declare class Report implements CreatorAwareEntity {
31
31
  owners: ReportOwner[];
32
32
  createdAt: Date;
33
33
  modifiedAt: Date;
34
+ deletedAt?: Date | null;
34
35
  version: number;
35
36
  generateId(): void;
36
37
  get ownerIds(): string[];
@@ -47,6 +47,7 @@ let Report = class Report {
47
47
  owners;
48
48
  createdAt;
49
49
  modifiedAt;
50
+ deletedAt;
50
51
  version;
51
52
  generateId() {
52
53
  if (this.dataDestination.type === data_destination_type_enum_1.DataDestinationType.LOOKER_STUDIO) {
@@ -182,6 +183,10 @@ __decorate([
182
183
  (0, typeorm_1.UpdateDateColumn)(),
183
184
  __metadata("design:type", Date)
184
185
  ], Report.prototype, "modifiedAt", void 0);
186
+ __decorate([
187
+ (0, typeorm_1.DeleteDateColumn)({ type: 'datetime', nullable: true, update: false }),
188
+ __metadata("design:type", Object)
189
+ ], Report.prototype, "deletedAt", void 0);
185
190
  __decorate([
186
191
  (0, typeorm_1.VersionColumn)(),
187
192
  __metadata("design:type", Number)
@@ -193,6 +198,8 @@ __decorate([
193
198
  __metadata("design:returntype", void 0)
194
199
  ], Report.prototype, "generateId", null);
195
200
  exports.Report = Report = __decorate([
196
- (0, typeorm_1.Entity)()
201
+ (0, typeorm_1.Entity)(),
202
+ (0, typeorm_1.Index)('idx_report_search_by_mart', ['dataMart', 'createdAt', 'id']),
203
+ (0, typeorm_1.Index)('idx_report_search_by_destination', ['dataDestination', 'createdAt', 'id'])
197
204
  ], Report);
198
205
  //# sourceMappingURL=report.entity.js.map
@@ -0,0 +1,10 @@
1
+ export declare class ReportSearchIndex {
2
+ entityId: string;
3
+ projectId: string;
4
+ embedding: Buffer | null;
5
+ embeddingStatus: string;
6
+ document: string | null;
7
+ searchText: string | null;
8
+ docHash: string;
9
+ updatedAt: Date;
10
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ReportSearchIndex = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ let ReportSearchIndex = class ReportSearchIndex {
15
+ entityId;
16
+ projectId;
17
+ embedding;
18
+ embeddingStatus;
19
+ document;
20
+ searchText;
21
+ docHash;
22
+ updatedAt;
23
+ };
24
+ exports.ReportSearchIndex = ReportSearchIndex;
25
+ __decorate([
26
+ (0, typeorm_1.PrimaryColumn)({ type: 'varchar', length: 36, name: 'entity_id' }),
27
+ __metadata("design:type", String)
28
+ ], ReportSearchIndex.prototype, "entityId", void 0);
29
+ __decorate([
30
+ (0, typeorm_1.Column)({ type: 'varchar', length: 255, name: 'project_id' }),
31
+ __metadata("design:type", String)
32
+ ], ReportSearchIndex.prototype, "projectId", void 0);
33
+ __decorate([
34
+ (0, typeorm_1.Column)({ type: 'blob', nullable: true }),
35
+ __metadata("design:type", Object)
36
+ ], ReportSearchIndex.prototype, "embedding", void 0);
37
+ __decorate([
38
+ (0, typeorm_1.Column)({ type: 'varchar', length: 16, name: 'embedding_status', default: 'MISSING' }),
39
+ __metadata("design:type", String)
40
+ ], ReportSearchIndex.prototype, "embeddingStatus", void 0);
41
+ __decorate([
42
+ (0, typeorm_1.Column)({ type: 'text', nullable: true }),
43
+ __metadata("design:type", Object)
44
+ ], ReportSearchIndex.prototype, "document", void 0);
45
+ __decorate([
46
+ (0, typeorm_1.Column)({ type: 'text', name: 'search_text', nullable: true }),
47
+ __metadata("design:type", Object)
48
+ ], ReportSearchIndex.prototype, "searchText", void 0);
49
+ __decorate([
50
+ (0, typeorm_1.Column)({ type: 'varchar', length: 64, name: 'doc_hash' }),
51
+ __metadata("design:type", String)
52
+ ], ReportSearchIndex.prototype, "docHash", void 0);
53
+ __decorate([
54
+ (0, typeorm_1.Column)({ type: 'datetime', name: 'updated_at', default: () => 'CURRENT_TIMESTAMP' }),
55
+ __metadata("design:type", Date)
56
+ ], ReportSearchIndex.prototype, "updatedAt", void 0);
57
+ exports.ReportSearchIndex = ReportSearchIndex = __decorate([
58
+ (0, typeorm_1.Entity)({ name: 'report_search_index' }),
59
+ (0, typeorm_1.Index)('idx_report_search_index_project', ['projectId']),
60
+ (0, typeorm_1.Index)('idx_report_search_index_project_entity', ['projectId', 'entityId'])
61
+ ], ReportSearchIndex);
62
+ //# sourceMappingURL=report-search-index.entity.js.map
@@ -8,3 +8,5 @@ export declare class SearchDataStorageProjectReindexTrigger extends SearchProjec
8
8
  }
9
9
  export declare class SearchDataDestinationProjectReindexTrigger extends SearchProjectReindexTrigger {
10
10
  }
11
+ export declare class SearchReportProjectReindexTrigger extends SearchProjectReindexTrigger {
12
+ }
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.SearchDataDestinationProjectReindexTrigger = exports.SearchDataStorageProjectReindexTrigger = exports.SearchDataMartProjectReindexTrigger = exports.SearchProjectReindexTrigger = void 0;
12
+ exports.SearchReportProjectReindexTrigger = exports.SearchDataDestinationProjectReindexTrigger = exports.SearchDataStorageProjectReindexTrigger = exports.SearchDataMartProjectReindexTrigger = exports.SearchProjectReindexTrigger = void 0;
13
13
  const typeorm_1 = require("typeorm");
14
14
  const trigger_entity_1 = require("../../../common/scheduler/shared/entities/trigger.entity");
15
15
  class SearchProjectReindexTrigger extends trigger_entity_1.Trigger {
@@ -44,4 +44,12 @@ exports.SearchDataDestinationProjectReindexTrigger = SearchDataDestinationProjec
44
44
  (0, typeorm_1.Index)('idx_search_data_destination_project_reindex_trigger_ready', ['isActive', 'status']),
45
45
  (0, typeorm_1.Index)('idx_search_data_destination_project_reindex_trigger_project', ['projectId', 'status'])
46
46
  ], SearchDataDestinationProjectReindexTrigger);
47
+ let SearchReportProjectReindexTrigger = class SearchReportProjectReindexTrigger extends SearchProjectReindexTrigger {
48
+ };
49
+ exports.SearchReportProjectReindexTrigger = SearchReportProjectReindexTrigger;
50
+ exports.SearchReportProjectReindexTrigger = SearchReportProjectReindexTrigger = __decorate([
51
+ (0, typeorm_1.Entity)('search_report_project_reindex_triggers'),
52
+ (0, typeorm_1.Index)('idx_search_report_project_reindex_trigger_ready', ['isActive', 'status']),
53
+ (0, typeorm_1.Index)('idx_search_report_project_reindex_trigger_project', ['projectId', 'status'])
54
+ ], SearchReportProjectReindexTrigger);
47
55
  //# sourceMappingURL=search-project-reindex-trigger.entity.js.map
@@ -1,8 +1,16 @@
1
1
  import { Trigger } from '../../../common/scheduler/shared/entities/trigger.entity';
2
- export type ReindexOperation = 'REINDEX' | 'DELETE';
2
+ export type ReindexOperation = 'REINDEX' | 'DELETE' | 'REINDEX_REPORTS';
3
3
  export declare class SearchReindexTrigger extends Trigger {
4
4
  projectId: string;
5
5
  entityType: string;
6
6
  entityId: string;
7
7
  operation: ReindexOperation;
8
+ reportProgress: {
9
+ cursor: {
10
+ createdAt: string;
11
+ id: string;
12
+ } | null;
13
+ errors: number;
14
+ } | null;
15
+ onSuccess(now?: Date): void;
8
16
  }
@@ -12,11 +12,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.SearchReindexTrigger = void 0;
13
13
  const typeorm_1 = require("typeorm");
14
14
  const trigger_entity_1 = require("../../../common/scheduler/shared/entities/trigger.entity");
15
+ const trigger_status_1 = require("../../../common/scheduler/shared/entities/trigger-status");
15
16
  let SearchReindexTrigger = class SearchReindexTrigger extends trigger_entity_1.Trigger {
16
17
  projectId;
17
18
  entityType;
18
19
  entityId;
19
20
  operation;
21
+ reportProgress = null;
22
+ onSuccess(now = new Date()) {
23
+ if (this.operation === 'REINDEX_REPORTS' && this.reportProgress?.cursor) {
24
+ this.status = trigger_status_1.TriggerStatus.IDLE;
25
+ this.createdAt = now;
26
+ return;
27
+ }
28
+ super.onSuccess(now);
29
+ }
20
30
  };
21
31
  exports.SearchReindexTrigger = SearchReindexTrigger;
22
32
  __decorate([
@@ -35,6 +45,10 @@ __decorate([
35
45
  (0, typeorm_1.Column)({ type: 'varchar', length: 16 }),
36
46
  __metadata("design:type", String)
37
47
  ], SearchReindexTrigger.prototype, "operation", void 0);
48
+ __decorate([
49
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
50
+ __metadata("design:type", Object)
51
+ ], SearchReindexTrigger.prototype, "reportProgress", void 0);
38
52
  exports.SearchReindexTrigger = SearchReindexTrigger = __decorate([
39
53
  (0, typeorm_1.Entity)('search_reindex_triggers'),
40
54
  (0, typeorm_1.Index)('idx_search_reindex_trigger_ready', ['isActive', 'status']),
@@ -1 +1 @@
1
- export declare function throwDisconnectedReportColumnsError(dataMartId: string, unknownColumns: string[]): never;
1
+ export declare function throwDisconnectedReportColumnsError(dataMartId: string, unknownColumns: string[], hiddenColumnNames?: ReadonlySet<string>): never;