attio-mcp 1.3.6 → 1.4.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.
- package/CHANGELOG.md +236 -2
- package/README.md +106 -266
- package/dist/api/attio-client.d.ts +13 -3
- package/dist/api/attio-client.d.ts.map +1 -1
- package/dist/api/attio-client.js +37 -7
- package/dist/api/attio-client.js.map +1 -1
- package/dist/api/attribute-types.d.ts.map +1 -1
- package/dist/api/attribute-types.js +42 -20
- package/dist/api/attribute-types.js.map +1 -1
- package/dist/api/client-context.d.ts.map +1 -1
- package/dist/api/client-context.js +28 -42
- package/dist/api/client-context.js.map +1 -1
- package/dist/cli/commands/generate-skill.d.ts +28 -0
- package/dist/cli/commands/generate-skill.d.ts.map +1 -0
- package/dist/cli/commands/generate-skill.js +101 -0
- package/dist/cli/commands/generate-skill.js.map +1 -0
- package/dist/cli/discover.js +65 -0
- package/dist/cli/discover.js.map +1 -1
- package/dist/config/deal-defaults.d.ts +2 -2
- package/dist/config/deal-defaults.d.ts.map +1 -1
- package/dist/config/deal-defaults.js +15 -6
- package/dist/config/deal-defaults.js.map +1 -1
- package/dist/config/tool-aliases.d.ts +12 -0
- package/dist/config/tool-aliases.d.ts.map +1 -1
- package/dist/config/tool-aliases.js +213 -69
- package/dist/config/tool-aliases.js.map +1 -1
- package/dist/constants/tool-names.d.ts +84 -0
- package/dist/constants/tool-names.d.ts.map +1 -0
- package/dist/constants/tool-names.js +81 -0
- package/dist/constants/tool-names.js.map +1 -0
- package/dist/constants/universal.constants.d.ts +24 -0
- package/dist/constants/universal.constants.d.ts.map +1 -1
- package/dist/constants/universal.constants.js +81 -9
- package/dist/constants/universal.constants.js.map +1 -1
- package/dist/handlers/tool-configs/universal/batch-search.js +4 -4
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts +26 -4
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js +181 -21
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/crud-operations.js +13 -13
- package/dist/handlers/tool-configs/universal/core/crud-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js +3 -3
- package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts +17 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js +118 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts +14 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js +77 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts +24 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js +35 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts +15 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js +108 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts +14 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js +91 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts +14 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js +118 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts +77 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js +42 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts +15 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js +109 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/index.d.ts +63 -22
- package/dist/handlers/tool-configs/universal/core/index.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/index.js +24 -22
- package/dist/handlers/tool-configs/universal/core/index.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts +43 -1
- package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/metadata-operations.js +117 -11
- package/dist/handlers/tool-configs/universal/core/metadata-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/notes-operations.js +12 -12
- package/dist/handlers/tool-configs/universal/core/notes-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/record-details-operations.js +3 -3
- package/dist/handlers/tool-configs/universal/core/record-details-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/search-operations.js +4 -4
- package/dist/handlers/tool-configs/universal/core/search-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js +32 -9
- package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js +45 -6
- package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/people.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js +36 -5
- package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js +17 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js +3 -1
- package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js.map +1 -1
- package/dist/handlers/tool-configs/universal/index.d.ts +75 -34
- package/dist/handlers/tool-configs/universal/index.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/index.js +58 -58
- package/dist/handlers/tool-configs/universal/index.js.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/advanced-search.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/advanced-search.js +5 -4
- package/dist/handlers/tool-configs/universal/operations/advanced-search.js.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/batch-operations.js +3 -3
- package/dist/handlers/tool-configs/universal/operations/content-search.js +3 -3
- package/dist/handlers/tool-configs/universal/operations/index.d.ts +10 -10
- package/dist/handlers/tool-configs/universal/operations/index.js +15 -15
- package/dist/handlers/tool-configs/universal/operations/relationship-search.js +3 -3
- package/dist/handlers/tool-configs/universal/operations/timeframe-search.js +3 -3
- package/dist/handlers/tool-configs/universal/schemas/utility-schemas.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js +5 -2
- package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts +29 -0
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js +28 -0
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas.d.ts +1 -1
- package/dist/handlers/tool-configs/universal/schemas.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas.js +1 -1
- package/dist/handlers/tool-configs/universal/schemas.js.map +1 -1
- package/dist/handlers/tool-configs/universal/shared-handlers.d.ts +20 -1
- package/dist/handlers/tool-configs/universal/shared-handlers.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/shared-handlers.js +216 -0
- package/dist/handlers/tool-configs/universal/shared-handlers.js.map +1 -1
- package/dist/handlers/tool-configs/universal/smithery-diagnostics.js +2 -2
- package/dist/handlers/tool-configs/universal/types.d.ts +9 -0
- package/dist/handlers/tool-configs/universal/types.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts +11 -0
- package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/validators/schema-validator.js +63 -9
- package/dist/handlers/tool-configs/universal/validators/schema-validator.js.map +1 -1
- package/dist/handlers/tools/dispatcher/core.d.ts.map +1 -1
- package/dist/handlers/tools/dispatcher/core.js +5 -1
- package/dist/handlers/tools/dispatcher/core.js.map +1 -1
- package/dist/handlers/tools/formatters.d.ts +8 -1
- package/dist/handlers/tools/formatters.d.ts.map +1 -1
- package/dist/handlers/tools/formatters.js +30 -14
- package/dist/handlers/tools/formatters.js.map +1 -1
- package/dist/handlers/tools/registry.d.ts +125 -84
- package/dist/handlers/tools/registry.d.ts.map +1 -1
- package/dist/handlers/tools/registry.js +14 -9
- package/dist/handlers/tools/registry.js.map +1 -1
- package/dist/handlers/tools/standards/index.d.ts.map +1 -1
- package/dist/handlers/tools/standards/index.js +19 -11
- package/dist/handlers/tools/standards/index.js.map +1 -1
- package/dist/objects/companies/attributes.d.ts +5 -0
- package/dist/objects/companies/attributes.d.ts.map +1 -1
- package/dist/objects/companies/attributes.js +45 -31
- package/dist/objects/companies/attributes.js.map +1 -1
- package/dist/server/createServer.d.ts.map +1 -1
- package/dist/server/createServer.js +4 -3
- package/dist/server/createServer.js.map +1 -1
- package/dist/services/ErrorService.js +3 -3
- package/dist/services/ErrorService.js.map +1 -1
- package/dist/services/UniversalCreateService.d.ts.map +1 -1
- package/dist/services/UniversalCreateService.js +136 -12
- package/dist/services/UniversalCreateService.js.map +1 -1
- package/dist/services/UniversalSearchService.d.ts +4 -25
- package/dist/services/UniversalSearchService.d.ts.map +1 -1
- package/dist/services/UniversalSearchService.js +14 -324
- package/dist/services/UniversalSearchService.js.map +1 -1
- package/dist/services/UniversalUpdateService.d.ts +15 -4
- package/dist/services/UniversalUpdateService.d.ts.map +1 -1
- package/dist/services/UniversalUpdateService.js +79 -151
- package/dist/services/UniversalUpdateService.js.map +1 -1
- package/dist/services/create/factory.d.ts.map +1 -1
- package/dist/services/create/factory.js +2 -1
- package/dist/services/create/factory.js.map +1 -1
- package/dist/services/metadata/AttributeOptionsService.d.ts +38 -0
- package/dist/services/metadata/AttributeOptionsService.d.ts.map +1 -0
- package/dist/services/metadata/AttributeOptionsService.js +92 -0
- package/dist/services/metadata/AttributeOptionsService.js.map +1 -0
- package/dist/services/metadata/index.d.ts +1 -0
- package/dist/services/metadata/index.d.ts.map +1 -1
- package/dist/services/metadata/index.js +1 -0
- package/dist/services/metadata/index.js.map +1 -1
- package/dist/services/search/QueryApiService.d.ts +27 -0
- package/dist/services/search/QueryApiService.d.ts.map +1 -0
- package/dist/services/search/QueryApiService.js +144 -0
- package/dist/services/search/QueryApiService.js.map +1 -0
- package/dist/services/search/RecordsSearchService.d.ts +27 -0
- package/dist/services/search/RecordsSearchService.d.ts.map +1 -0
- package/dist/services/search/RecordsSearchService.js +122 -0
- package/dist/services/search/RecordsSearchService.js.map +1 -0
- package/dist/services/search/SearchCoordinator.d.ts +41 -0
- package/dist/services/search/SearchCoordinator.d.ts.map +1 -0
- package/dist/services/search/SearchCoordinator.js +83 -0
- package/dist/services/search/SearchCoordinator.js.map +1 -0
- package/dist/services/search/StrategyFactory.d.ts +31 -0
- package/dist/services/search/StrategyFactory.d.ts.map +1 -0
- package/dist/services/search/StrategyFactory.js +100 -0
- package/dist/services/search/StrategyFactory.js.map +1 -0
- package/dist/services/skill-generator/OutputWriterService.d.ts +41 -0
- package/dist/services/skill-generator/OutputWriterService.d.ts.map +1 -0
- package/dist/services/skill-generator/OutputWriterService.js +100 -0
- package/dist/services/skill-generator/OutputWriterService.js.map +1 -0
- package/dist/services/skill-generator/SchemaFormatterService.d.ts +61 -0
- package/dist/services/skill-generator/SchemaFormatterService.d.ts.map +1 -0
- package/dist/services/skill-generator/SchemaFormatterService.js +168 -0
- package/dist/services/skill-generator/SchemaFormatterService.js.map +1 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.d.ts +84 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.d.ts.map +1 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.js +292 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.js.map +1 -0
- package/dist/services/skill-generator/index.d.ts +12 -0
- package/dist/services/skill-generator/index.d.ts.map +1 -0
- package/dist/services/skill-generator/index.js +11 -0
- package/dist/services/skill-generator/index.js.map +1 -0
- package/dist/services/skill-generator/types.d.ts +137 -0
- package/dist/services/skill-generator/types.d.ts.map +1 -0
- package/dist/services/skill-generator/types.js +10 -0
- package/dist/services/skill-generator/types.js.map +1 -0
- package/dist/services/update/FieldPersistenceHandler.d.ts +101 -0
- package/dist/services/update/FieldPersistenceHandler.d.ts.map +1 -0
- package/dist/services/update/FieldPersistenceHandler.js +198 -0
- package/dist/services/update/FieldPersistenceHandler.js.map +1 -0
- package/dist/services/update/FieldValidationHandler.d.ts +77 -0
- package/dist/services/update/FieldValidationHandler.d.ts.map +1 -0
- package/dist/services/update/FieldValidationHandler.js +157 -0
- package/dist/services/update/FieldValidationHandler.js.map +1 -0
- package/dist/services/update/MetadataResolver.d.ts +50 -0
- package/dist/services/update/MetadataResolver.d.ts.map +1 -0
- package/dist/services/update/MetadataResolver.js +110 -0
- package/dist/services/update/MetadataResolver.js.map +1 -0
- package/dist/services/update/UpdateOrchestrator.d.ts +37 -0
- package/dist/services/update/UpdateOrchestrator.d.ts.map +1 -0
- package/dist/services/update/UpdateOrchestrator.js +58 -0
- package/dist/services/update/UpdateOrchestrator.js.map +1 -0
- package/dist/services/update/UpdateValidation.d.ts +5 -1
- package/dist/services/update/UpdateValidation.d.ts.map +1 -1
- package/dist/services/update/UpdateValidation.js +46 -14
- package/dist/services/update/UpdateValidation.js.map +1 -1
- package/dist/services/value-transformer/index.d.ts +57 -0
- package/dist/services/value-transformer/index.d.ts.map +1 -0
- package/dist/services/value-transformer/index.js +326 -0
- package/dist/services/value-transformer/index.js.map +1 -0
- package/dist/services/value-transformer/multi-select-transformer.d.ts +63 -0
- package/dist/services/value-transformer/multi-select-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/multi-select-transformer.js +144 -0
- package/dist/services/value-transformer/multi-select-transformer.js.map +1 -0
- package/dist/services/value-transformer/record-reference-transformer.d.ts +43 -0
- package/dist/services/value-transformer/record-reference-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/record-reference-transformer.js +245 -0
- package/dist/services/value-transformer/record-reference-transformer.js.map +1 -0
- package/dist/services/value-transformer/select-transformer.d.ts +48 -0
- package/dist/services/value-transformer/select-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/select-transformer.js +232 -0
- package/dist/services/value-transformer/select-transformer.js.map +1 -0
- package/dist/services/value-transformer/status-transformer.d.ts +32 -0
- package/dist/services/value-transformer/status-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/status-transformer.js +294 -0
- package/dist/services/value-transformer/status-transformer.js.map +1 -0
- package/dist/services/value-transformer/types.d.ts +100 -0
- package/dist/services/value-transformer/types.d.ts.map +1 -0
- package/dist/services/value-transformer/types.js +6 -0
- package/dist/services/value-transformer/types.js.map +1 -0
- package/dist/templates/skill/SKILL.template.md +78 -0
- package/dist/templates/skill/attribute-reference.template.md +126 -0
- package/dist/templates/skill/complex-types.template.md +255 -0
- package/dist/utils/client-resolver.d.ts.map +1 -1
- package/dist/utils/client-resolver.js +8 -16
- package/dist/utils/client-resolver.js.map +1 -1
- package/dist/utils/complex-type-validation.d.ts +16 -0
- package/dist/utils/complex-type-validation.d.ts.map +1 -0
- package/dist/utils/complex-type-validation.js +196 -0
- package/dist/utils/complex-type-validation.js.map +1 -0
- package/dist/utils/error-utilities.d.ts.map +1 -1
- package/dist/utils/error-utilities.js +16 -9
- package/dist/utils/error-utilities.js.map +1 -1
- package/dist/utils/location-normalizer.d.ts +26 -0
- package/dist/utils/location-normalizer.d.ts.map +1 -0
- package/dist/utils/location-normalizer.js +39 -0
- package/dist/utils/location-normalizer.js.map +1 -0
- package/dist/utils/metadata-utils.d.ts +27 -0
- package/dist/utils/metadata-utils.d.ts.map +1 -0
- package/dist/utils/metadata-utils.js +59 -0
- package/dist/utils/metadata-utils.js.map +1 -0
- package/dist/utils/personal-name-parser.d.ts.map +1 -1
- package/dist/utils/personal-name-parser.js +26 -17
- package/dist/utils/personal-name-parser.js.map +1 -1
- package/dist/validators/company/field_detector.d.ts.map +1 -1
- package/dist/validators/company/field_detector.js +5 -0
- package/dist/validators/company/field_detector.js.map +1 -1
- package/package.json +13 -11
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryApiService - Attio Query API operations for advanced search
|
|
3
|
+
*
|
|
4
|
+
* Issue #935: Extracted from UniversalSearchService.ts to reduce file size
|
|
5
|
+
* Handles relationship, timeframe, and content searches using the Query API
|
|
6
|
+
*/
|
|
7
|
+
import { UniversalResourceType } from '../../handlers/tool-configs/universal/types.js';
|
|
8
|
+
import { debug, createScopedLogger, OperationType } from '../../utils/logger.js';
|
|
9
|
+
import { AuthenticationError, AuthorizationError, NetworkError, RateLimitError, ServerError, ResourceNotFoundError, createApiErrorFromAxiosError, } from '../../errors/api-errors.js';
|
|
10
|
+
import { createRelationshipQuery, createTimeframeQuery, createContentSearchQuery, } from '../../utils/filters/index.js';
|
|
11
|
+
import { getLazyAttioClient } from '../../api/lazy-client.js';
|
|
12
|
+
import * as AttioClientModule from '../../api/attio-client.js';
|
|
13
|
+
/**
|
|
14
|
+
* Resolve Query API client (prefers mocked version in tests)
|
|
15
|
+
*/
|
|
16
|
+
function resolveQueryApiClient() {
|
|
17
|
+
const mod = AttioClientModule;
|
|
18
|
+
if (typeof mod.getAttioClient === 'function') {
|
|
19
|
+
return mod.getAttioClient();
|
|
20
|
+
}
|
|
21
|
+
return getLazyAttioClient();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Handle Query API errors consistently across methods
|
|
25
|
+
* Issue #935: Extracted to reduce code duplication
|
|
26
|
+
*/
|
|
27
|
+
function handleQueryApiError(error, path, context) {
|
|
28
|
+
const apiError = createApiErrorFromAxiosError(error, path, 'POST');
|
|
29
|
+
// Re-throw critical errors that should bubble up
|
|
30
|
+
if (apiError instanceof AuthenticationError ||
|
|
31
|
+
apiError instanceof AuthorizationError ||
|
|
32
|
+
apiError instanceof NetworkError ||
|
|
33
|
+
apiError instanceof RateLimitError ||
|
|
34
|
+
apiError instanceof ServerError) {
|
|
35
|
+
throw apiError;
|
|
36
|
+
}
|
|
37
|
+
// Handle not found gracefully - return empty results
|
|
38
|
+
if (apiError instanceof ResourceNotFoundError) {
|
|
39
|
+
debug('QueryApiService', `No results for ${context.operation}`, context.metadata);
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
// Log and return empty for other errors
|
|
43
|
+
createScopedLogger('QueryApiService', context.operation, OperationType.API_CALL).error(`${context.operation} failed for ${context.resourceType}`, error);
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Query API Service for advanced search operations
|
|
48
|
+
*/
|
|
49
|
+
export class QueryApiService {
|
|
50
|
+
/**
|
|
51
|
+
* Search records by relationship to another record
|
|
52
|
+
*/
|
|
53
|
+
static async searchByRelationship(sourceResourceType, targetResourceType, targetRecordId, limit, offset) {
|
|
54
|
+
const relationshipQuery = {
|
|
55
|
+
sourceObjectType: sourceResourceType,
|
|
56
|
+
targetObjectType: targetResourceType,
|
|
57
|
+
targetAttribute: 'id',
|
|
58
|
+
condition: 'equals',
|
|
59
|
+
value: targetRecordId,
|
|
60
|
+
};
|
|
61
|
+
const queryApiFilter = createRelationshipQuery(relationshipQuery);
|
|
62
|
+
const path = `/objects/${sourceResourceType}/records/query`;
|
|
63
|
+
try {
|
|
64
|
+
const client = resolveQueryApiClient();
|
|
65
|
+
const requestBody = {
|
|
66
|
+
...queryApiFilter,
|
|
67
|
+
limit: limit || 10,
|
|
68
|
+
offset: offset || 0,
|
|
69
|
+
};
|
|
70
|
+
const response = await client.post(path, requestBody);
|
|
71
|
+
return response?.data?.data || [];
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return handleQueryApiError(error, path, {
|
|
75
|
+
resourceType: sourceResourceType,
|
|
76
|
+
operation: 'searchByRelationship',
|
|
77
|
+
metadata: { targetResourceType, targetRecordId },
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Search records within a specific timeframe
|
|
83
|
+
*/
|
|
84
|
+
static async searchByTimeframe(resourceType, timeframeConfig, limit, offset) {
|
|
85
|
+
const queryApiFilter = createTimeframeQuery(timeframeConfig);
|
|
86
|
+
const path = `/objects/${resourceType}/records/query`;
|
|
87
|
+
try {
|
|
88
|
+
const client = resolveQueryApiClient();
|
|
89
|
+
const requestBody = {
|
|
90
|
+
...queryApiFilter,
|
|
91
|
+
limit: limit || 10,
|
|
92
|
+
offset: offset || 0,
|
|
93
|
+
};
|
|
94
|
+
const response = await client.post(path, requestBody);
|
|
95
|
+
return response?.data?.data || [];
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return handleQueryApiError(error, path, {
|
|
99
|
+
resourceType,
|
|
100
|
+
operation: 'searchByTimeframe',
|
|
101
|
+
metadata: { timeframeConfig },
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Search records by content across multiple fields
|
|
107
|
+
*/
|
|
108
|
+
static async searchByContent(resourceType, query, searchFields = [], useOrLogic = true, limit, offset) {
|
|
109
|
+
let fields = searchFields;
|
|
110
|
+
if (fields.length === 0) {
|
|
111
|
+
switch (resourceType) {
|
|
112
|
+
case UniversalResourceType.COMPANIES:
|
|
113
|
+
fields = ['name', 'description', 'domains'];
|
|
114
|
+
break;
|
|
115
|
+
case UniversalResourceType.PEOPLE:
|
|
116
|
+
fields = ['name', 'email_addresses', 'job_title'];
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
fields = ['name'];
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const queryApiFilter = createContentSearchQuery(fields, query, useOrLogic);
|
|
124
|
+
const path = `/objects/${resourceType}/records/query`;
|
|
125
|
+
try {
|
|
126
|
+
const client = resolveQueryApiClient();
|
|
127
|
+
const requestBody = {
|
|
128
|
+
...queryApiFilter,
|
|
129
|
+
limit: limit || 10,
|
|
130
|
+
offset: offset || 0,
|
|
131
|
+
};
|
|
132
|
+
const response = await client.post(path, requestBody);
|
|
133
|
+
return response?.data?.data || [];
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return handleQueryApiError(error, path, {
|
|
137
|
+
resourceType,
|
|
138
|
+
operation: 'searchByContent',
|
|
139
|
+
metadata: { query, fields },
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=QueryApiService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryApiService.js","sourceRoot":"","sources":["../../../src/services/search/QueryApiService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecordsSearchService - Generic records and custom objects search
|
|
3
|
+
*
|
|
4
|
+
* Issue #935: Extracted from UniversalSearchService.ts to reduce file size
|
|
5
|
+
* Handles generic records and custom object searches
|
|
6
|
+
*/
|
|
7
|
+
import { AttioRecord } from '../../types/attio.js';
|
|
8
|
+
/**
|
|
9
|
+
* Records Search Service for generic records and custom objects
|
|
10
|
+
*/
|
|
11
|
+
export declare class RecordsSearchService {
|
|
12
|
+
/**
|
|
13
|
+
* Search records using object records API with filter support
|
|
14
|
+
*/
|
|
15
|
+
static searchRecordsObjectType(limit?: number, offset?: number, filters?: Record<string, unknown>): Promise<AttioRecord[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Search custom objects using generic records API
|
|
18
|
+
* Enables support for user-defined custom objects (Issue #918)
|
|
19
|
+
*
|
|
20
|
+
* @param objectSlug - The custom object type (e.g., "funds", "investment_opportunities")
|
|
21
|
+
* @param limit - Maximum results
|
|
22
|
+
* @param offset - Pagination offset
|
|
23
|
+
* @param filters - Optional filters to apply to the search
|
|
24
|
+
*/
|
|
25
|
+
static searchCustomObject(objectSlug: string, limit?: number, offset?: number, filters?: Record<string, unknown>): Promise<AttioRecord[]>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=RecordsSearchService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordsSearchService.d.ts","sourceRoot":"","sources":["../../../src/services/search/RecordsSearchService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAwE/C;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;OAEG;WACU,uBAAuB,CAClC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,WAAW,EAAE,CAAC;IAoBzB;;;;;;;;OAQG;WACU,kBAAkB,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,WAAW,EAAE,CAAC;CA0D1B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecordsSearchService - Generic records and custom objects search
|
|
3
|
+
*
|
|
4
|
+
* Issue #935: Extracted from UniversalSearchService.ts to reduce file size
|
|
5
|
+
* Handles generic records and custom object searches
|
|
6
|
+
*/
|
|
7
|
+
import { debug, createScopedLogger, OperationType } from '../../utils/logger.js';
|
|
8
|
+
import { ValidationService } from '../../services/ValidationService.js';
|
|
9
|
+
import { getLazyAttioClient } from '../../api/lazy-client.js';
|
|
10
|
+
import * as AttioClientModule from '../../api/attio-client.js';
|
|
11
|
+
import { listObjectRecords } from '../../objects/records/index.js';
|
|
12
|
+
import { AuthenticationError, AuthorizationError, NetworkError, RateLimitError, ServerError, ResourceNotFoundError, createApiErrorFromAxiosError, } from '../../errors/api-errors.js';
|
|
13
|
+
/**
|
|
14
|
+
* Resolve API client (prefers mocked version in tests)
|
|
15
|
+
*/
|
|
16
|
+
function resolveApiClient() {
|
|
17
|
+
const mod = AttioClientModule;
|
|
18
|
+
if (typeof mod.getAttioClient === 'function') {
|
|
19
|
+
return mod.getAttioClient();
|
|
20
|
+
}
|
|
21
|
+
return getLazyAttioClient();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Handle API errors consistently
|
|
25
|
+
* Issue #935: Matches QueryApiService error handling pattern
|
|
26
|
+
*/
|
|
27
|
+
function handleRecordsApiError(error, path, context) {
|
|
28
|
+
const apiError = createApiErrorFromAxiosError(error, path, 'POST');
|
|
29
|
+
// Re-throw critical errors that should bubble up
|
|
30
|
+
if (apiError instanceof AuthenticationError ||
|
|
31
|
+
apiError instanceof AuthorizationError ||
|
|
32
|
+
apiError instanceof NetworkError ||
|
|
33
|
+
apiError instanceof RateLimitError ||
|
|
34
|
+
apiError instanceof ServerError) {
|
|
35
|
+
throw apiError;
|
|
36
|
+
}
|
|
37
|
+
// Handle not found gracefully - return empty results
|
|
38
|
+
if (apiError instanceof ResourceNotFoundError) {
|
|
39
|
+
debug('RecordsSearchService', `No results for ${context.operation}`, context.metadata);
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
// Log and return empty for other errors
|
|
43
|
+
createScopedLogger('RecordsSearchService', context.operation, OperationType.API_CALL).error(`${context.operation} failed`, error);
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Records Search Service for generic records and custom objects
|
|
48
|
+
*/
|
|
49
|
+
export class RecordsSearchService {
|
|
50
|
+
/**
|
|
51
|
+
* Search records using object records API with filter support
|
|
52
|
+
*/
|
|
53
|
+
static async searchRecordsObjectType(limit, offset, filters) {
|
|
54
|
+
// Handle list_membership filters - invalid UUID should return empty array
|
|
55
|
+
if (filters?.list_membership) {
|
|
56
|
+
const listId = String(filters.list_membership);
|
|
57
|
+
if (!ValidationService.validateUUIDForSearch(listId)) {
|
|
58
|
+
return []; // Return empty success for invalid UUID
|
|
59
|
+
}
|
|
60
|
+
createScopedLogger('RecordsSearchService', 'searchRecordsObjectType', OperationType.DATA_PROCESSING).warn('list_membership filter not yet supported in listObjectRecords');
|
|
61
|
+
}
|
|
62
|
+
return await listObjectRecords('records', {
|
|
63
|
+
pageSize: limit,
|
|
64
|
+
page: Math.floor((offset || 0) / (limit || 10)) + 1,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Search custom objects using generic records API
|
|
69
|
+
* Enables support for user-defined custom objects (Issue #918)
|
|
70
|
+
*
|
|
71
|
+
* @param objectSlug - The custom object type (e.g., "funds", "investment_opportunities")
|
|
72
|
+
* @param limit - Maximum results
|
|
73
|
+
* @param offset - Pagination offset
|
|
74
|
+
* @param filters - Optional filters to apply to the search
|
|
75
|
+
*/
|
|
76
|
+
static async searchCustomObject(objectSlug, limit, offset, filters) {
|
|
77
|
+
// Handle list_membership filters - invalid UUID should return empty array
|
|
78
|
+
if (filters?.list_membership) {
|
|
79
|
+
const listId = String(filters.list_membership);
|
|
80
|
+
if (!ValidationService.validateUUIDForSearch(listId)) {
|
|
81
|
+
return []; // Return empty success for invalid UUID
|
|
82
|
+
}
|
|
83
|
+
createScopedLogger('RecordsSearchService', 'searchCustomObject', OperationType.DATA_PROCESSING).warn('list_membership filter not yet supported for custom objects');
|
|
84
|
+
}
|
|
85
|
+
createScopedLogger('RecordsSearchService', 'searchCustomObject', OperationType.DATA_PROCESSING).info('Searching custom object', {
|
|
86
|
+
objectSlug,
|
|
87
|
+
limit,
|
|
88
|
+
offset,
|
|
89
|
+
hasFilters: !!filters,
|
|
90
|
+
});
|
|
91
|
+
// Custom objects require POST to /objects/{slug}/records/query
|
|
92
|
+
// The GET endpoint (/objects/{slug}/records) returns 404 for custom objects
|
|
93
|
+
const path = `/objects/${objectSlug}/records/query`;
|
|
94
|
+
const requestBody = {
|
|
95
|
+
limit: limit || 20,
|
|
96
|
+
};
|
|
97
|
+
// Add offset if provided
|
|
98
|
+
if (offset && offset > 0) {
|
|
99
|
+
requestBody.offset = offset;
|
|
100
|
+
}
|
|
101
|
+
// Issue #935: Forward filters to request body (was silently dropped before)
|
|
102
|
+
if (filters && Object.keys(filters).length > 0) {
|
|
103
|
+
// Exclude list_membership from filter object as it's handled separately
|
|
104
|
+
const { list_membership, ...remainingFilters } = filters;
|
|
105
|
+
if (Object.keys(remainingFilters).length > 0) {
|
|
106
|
+
requestBody.filter = remainingFilters;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const api = resolveApiClient();
|
|
111
|
+
const response = await api.post(path, requestBody);
|
|
112
|
+
return Array.isArray(response?.data?.data) ? response.data.data : [];
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return handleRecordsApiError(error, path, {
|
|
116
|
+
operation: 'searchCustomObject',
|
|
117
|
+
metadata: { objectSlug, limit, offset, hasFilters: !!filters },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=RecordsSearchService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordsSearchService.js","sourceRoot":"","sources":["../../../src/services/search/RecordsSearchService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchCoordinator - Coordinates search type routing and execution
|
|
3
|
+
*
|
|
4
|
+
* Issue #935: Extracted from UniversalSearchService.ts to reduce file size
|
|
5
|
+
* Handles search type detection and routing to appropriate services
|
|
6
|
+
*/
|
|
7
|
+
import { AttioRecord } from '../../types/attio.js';
|
|
8
|
+
import { UniversalResourceType, SearchType, MatchType, SortType } from '../../handlers/tool-configs/universal/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parameters for search routing
|
|
11
|
+
*/
|
|
12
|
+
export interface SearchRoutingParams {
|
|
13
|
+
resource_type: UniversalResourceType;
|
|
14
|
+
query?: string;
|
|
15
|
+
filters?: Record<string, unknown>;
|
|
16
|
+
limit?: number;
|
|
17
|
+
offset?: number;
|
|
18
|
+
search_type?: SearchType;
|
|
19
|
+
fields?: string[];
|
|
20
|
+
match_type?: MatchType;
|
|
21
|
+
sort?: SortType;
|
|
22
|
+
relationship_target_type?: UniversalResourceType;
|
|
23
|
+
relationship_target_id?: string;
|
|
24
|
+
timeframe_attribute?: string;
|
|
25
|
+
start_date?: string;
|
|
26
|
+
end_date?: string;
|
|
27
|
+
date_operator?: 'greater_than' | 'less_than' | 'between' | 'equals';
|
|
28
|
+
content_fields?: string[];
|
|
29
|
+
use_or_logic?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Coordinates search execution by routing to appropriate services
|
|
33
|
+
*/
|
|
34
|
+
export declare class SearchCoordinator {
|
|
35
|
+
/**
|
|
36
|
+
* Route search to appropriate service based on search type
|
|
37
|
+
* Issue #935: Performance tracking is handled at the UniversalSearchService level
|
|
38
|
+
*/
|
|
39
|
+
static executeSearch(params: SearchRoutingParams): Promise<AttioRecord[]>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=SearchCoordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchCoordinator.d.ts","sourceRoot":"","sources":["../../../src/services/search/SearchCoordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,QAAQ,EACT,MAAM,4CAA4C,CAAC;AAMpD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,qBAAqB,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,wBAAwB,CAAC,EAAE,qBAAqB,CAAC;IACjD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;;OAGG;WACU,aAAa,CACxB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC;CAsH1B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchCoordinator - Coordinates search type routing and execution
|
|
3
|
+
*
|
|
4
|
+
* Issue #935: Extracted from UniversalSearchService.ts to reduce file size
|
|
5
|
+
* Handles search type detection and routing to appropriate services
|
|
6
|
+
*/
|
|
7
|
+
import { UniversalResourceType, SearchType, } from '../../handlers/tool-configs/universal/types.js';
|
|
8
|
+
import { QueryApiService } from './QueryApiService.js';
|
|
9
|
+
import { RecordsSearchService } from './RecordsSearchService.js';
|
|
10
|
+
import { StrategyFactory } from './StrategyFactory.js';
|
|
11
|
+
/**
|
|
12
|
+
* Coordinates search execution by routing to appropriate services
|
|
13
|
+
*/
|
|
14
|
+
export class SearchCoordinator {
|
|
15
|
+
/**
|
|
16
|
+
* Route search to appropriate service based on search type
|
|
17
|
+
* Issue #935: Performance tracking is handled at the UniversalSearchService level
|
|
18
|
+
*/
|
|
19
|
+
static async executeSearch(params) {
|
|
20
|
+
const { resource_type, query, filters, limit, offset, search_type, fields, match_type, sort, relationship_target_type, relationship_target_id, timeframe_attribute, start_date, end_date, date_operator, content_fields, use_or_logic, } = params;
|
|
21
|
+
// Handle special search types first
|
|
22
|
+
switch (search_type) {
|
|
23
|
+
case SearchType.RELATIONSHIP:
|
|
24
|
+
if (relationship_target_type && relationship_target_id) {
|
|
25
|
+
return QueryApiService.searchByRelationship(resource_type, relationship_target_type, relationship_target_id, limit, offset);
|
|
26
|
+
}
|
|
27
|
+
throw new Error('Relationship search requires target_type and target_id parameters');
|
|
28
|
+
case SearchType.TIMEFRAME:
|
|
29
|
+
if (timeframe_attribute) {
|
|
30
|
+
const timeframeConfig = {
|
|
31
|
+
resourceType: resource_type,
|
|
32
|
+
attribute: timeframe_attribute,
|
|
33
|
+
startDate: start_date,
|
|
34
|
+
endDate: end_date,
|
|
35
|
+
operator: date_operator || 'between',
|
|
36
|
+
};
|
|
37
|
+
return QueryApiService.searchByTimeframe(resource_type, timeframeConfig, limit, offset);
|
|
38
|
+
}
|
|
39
|
+
throw new Error('Timeframe search requires timeframe_attribute parameter');
|
|
40
|
+
case SearchType.CONTENT:
|
|
41
|
+
// Use Query API if content_fields is explicitly provided
|
|
42
|
+
if (content_fields && content_fields.length > 0) {
|
|
43
|
+
if (!query) {
|
|
44
|
+
throw new Error('Content search requires query parameter');
|
|
45
|
+
}
|
|
46
|
+
return QueryApiService.searchByContent(resource_type, query, content_fields, use_or_logic !== false, limit, offset);
|
|
47
|
+
}
|
|
48
|
+
// Fall through to strategy-based content search
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
// Use strategy pattern for resource-specific searches
|
|
52
|
+
const strategy = await StrategyFactory.getStrategy(resource_type);
|
|
53
|
+
if (strategy) {
|
|
54
|
+
return await strategy.search({
|
|
55
|
+
query,
|
|
56
|
+
filters,
|
|
57
|
+
limit,
|
|
58
|
+
offset,
|
|
59
|
+
search_type,
|
|
60
|
+
fields,
|
|
61
|
+
match_type,
|
|
62
|
+
sort,
|
|
63
|
+
timeframeParams: {
|
|
64
|
+
timeframe_attribute,
|
|
65
|
+
start_date,
|
|
66
|
+
end_date,
|
|
67
|
+
date_operator,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Fallback for resources without strategies
|
|
72
|
+
// This handles both 'records' type AND custom objects
|
|
73
|
+
switch (resource_type) {
|
|
74
|
+
case UniversalResourceType.RECORDS:
|
|
75
|
+
return RecordsSearchService.searchRecordsObjectType(limit, offset, filters);
|
|
76
|
+
default:
|
|
77
|
+
// Custom objects: route through generic records API with object slug
|
|
78
|
+
// This enables support for user-defined custom objects (Issue #918)
|
|
79
|
+
return RecordsSearchService.searchCustomObject(resource_type, limit, offset, filters);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=SearchCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchCoordinator.js","sourceRoot":"","sources":["../../../src/services/search/SearchCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StrategyFactory - Creates and initializes search strategies
|
|
3
|
+
*
|
|
4
|
+
* Issue #935: Extracted from UniversalSearchService.ts to reduce file size
|
|
5
|
+
* Handles strategy initialization with dependencies
|
|
6
|
+
*/
|
|
7
|
+
import { UniversalResourceType } from '../../handlers/tool-configs/universal/types.js';
|
|
8
|
+
import { ISearchStrategy } from '../../services/search-strategies/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Factory for creating and managing search strategies
|
|
11
|
+
*/
|
|
12
|
+
export declare class StrategyFactory {
|
|
13
|
+
private static strategies;
|
|
14
|
+
/**
|
|
15
|
+
* Get or create a strategy for a resource type
|
|
16
|
+
*/
|
|
17
|
+
static getStrategy(resourceType: UniversalResourceType): Promise<ISearchStrategy | undefined>;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize all search strategies with their dependencies
|
|
20
|
+
*/
|
|
21
|
+
private static initializeStrategies;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a resource type has a strategy
|
|
24
|
+
*/
|
|
25
|
+
static hasStrategy(resourceType: UniversalResourceType): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Clear all strategies (useful for testing)
|
|
28
|
+
*/
|
|
29
|
+
static clearStrategies(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=StrategyFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrategyFactory.d.ts","sourceRoot":"","sources":["../../../src/services/search/StrategyFactory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EACL,eAAe,EAQhB,MAAM,uCAAuC,CAAC;AAuB/C;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqD;IAE9E;;OAEG;WACU,WAAW,CACtB,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAOvC;;OAEG;mBACkB,oBAAoB;IAiFzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,qBAAqB,GAAG,OAAO;IAIhE;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,IAAI;CAG/B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StrategyFactory - Creates and initializes search strategies
|
|
3
|
+
*
|
|
4
|
+
* Issue #935: Extracted from UniversalSearchService.ts to reduce file size
|
|
5
|
+
* Handles strategy initialization with dependencies
|
|
6
|
+
*/
|
|
7
|
+
import { UniversalResourceType } from '../../handlers/tool-configs/universal/types.js';
|
|
8
|
+
import { CompanySearchStrategy, PeopleSearchStrategy, DealSearchStrategy, TaskSearchStrategy, ListSearchStrategy, NoteSearchStrategy, } from '../../services/search-strategies/index.js';
|
|
9
|
+
import { SearchUtilities } from '../../services/search-utilities/SearchUtilities.js';
|
|
10
|
+
import { ensureFunctionAvailability } from '../../services/search-utilities/FunctionValidator.js';
|
|
11
|
+
import { advancedSearchCompanies } from '../../objects/companies/index.js';
|
|
12
|
+
import { advancedSearchPeople } from '../../objects/people/index.js';
|
|
13
|
+
import { advancedSearchDeals } from '../../objects/deals/index.js';
|
|
14
|
+
import { searchLists } from '../../objects/lists.js';
|
|
15
|
+
import { listTasks } from '../../objects/tasks.js';
|
|
16
|
+
import { listNotes } from '../../objects/notes.js';
|
|
17
|
+
// Dynamic imports for better error handling
|
|
18
|
+
const ensureAdvancedSearchCompanies = () => ensureFunctionAvailability(advancedSearchCompanies, 'advancedSearchCompanies');
|
|
19
|
+
const ensureAdvancedSearchPeople = () => ensureFunctionAvailability(advancedSearchPeople, 'advancedSearchPeople');
|
|
20
|
+
const ensureAdvancedSearchDeals = () => ensureFunctionAvailability(advancedSearchDeals, 'advancedSearchDeals');
|
|
21
|
+
/**
|
|
22
|
+
* Factory for creating and managing search strategies
|
|
23
|
+
*/
|
|
24
|
+
export class StrategyFactory {
|
|
25
|
+
static strategies = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* Get or create a strategy for a resource type
|
|
28
|
+
*/
|
|
29
|
+
static async getStrategy(resourceType) {
|
|
30
|
+
if (this.strategies.size === 0) {
|
|
31
|
+
await this.initializeStrategies();
|
|
32
|
+
}
|
|
33
|
+
return this.strategies.get(resourceType);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize all search strategies with their dependencies
|
|
37
|
+
*/
|
|
38
|
+
static async initializeStrategies() {
|
|
39
|
+
if (this.strategies.size > 0) {
|
|
40
|
+
return; // Already initialized
|
|
41
|
+
}
|
|
42
|
+
// Create dependencies for strategies
|
|
43
|
+
const companyDependencies = {
|
|
44
|
+
advancedSearchFunction: await ensureAdvancedSearchCompanies(),
|
|
45
|
+
createDateFilter: SearchUtilities.createDateFilter,
|
|
46
|
+
mergeFilters: SearchUtilities.mergeFilters,
|
|
47
|
+
rankByRelevance: SearchUtilities.rankByRelevance.bind(SearchUtilities),
|
|
48
|
+
getFieldValue: SearchUtilities.getFieldValue.bind(SearchUtilities),
|
|
49
|
+
};
|
|
50
|
+
const peopleDependencies = {
|
|
51
|
+
paginatedSearchFunction: await ensureAdvancedSearchPeople(),
|
|
52
|
+
createDateFilter: SearchUtilities.createDateFilter,
|
|
53
|
+
mergeFilters: SearchUtilities.mergeFilters,
|
|
54
|
+
rankByRelevance: SearchUtilities.rankByRelevance.bind(SearchUtilities),
|
|
55
|
+
getFieldValue: SearchUtilities.getFieldValue.bind(SearchUtilities),
|
|
56
|
+
};
|
|
57
|
+
const dealDependencies = {
|
|
58
|
+
advancedSearchFunction: await ensureAdvancedSearchDeals(),
|
|
59
|
+
createDateFilter: SearchUtilities.createDateFilter,
|
|
60
|
+
mergeFilters: SearchUtilities.mergeFilters,
|
|
61
|
+
rankByRelevance: SearchUtilities.rankByRelevance.bind(SearchUtilities),
|
|
62
|
+
getFieldValue: SearchUtilities.getFieldValue.bind(SearchUtilities),
|
|
63
|
+
};
|
|
64
|
+
const listDependencies = {
|
|
65
|
+
listFunction: (query, limit, offset) => searchLists(query || '', limit, offset),
|
|
66
|
+
rankByRelevance: SearchUtilities.rankByRelevance.bind(SearchUtilities),
|
|
67
|
+
getFieldValue: SearchUtilities.getFieldValue.bind(SearchUtilities),
|
|
68
|
+
};
|
|
69
|
+
const taskDependencies = {
|
|
70
|
+
taskFunction: (status, assigneeId, page, pageSize) => listTasks(status, assigneeId, page, pageSize),
|
|
71
|
+
rankByRelevance: SearchUtilities.rankByRelevance.bind(SearchUtilities),
|
|
72
|
+
getFieldValue: SearchUtilities.getFieldValue.bind(SearchUtilities),
|
|
73
|
+
};
|
|
74
|
+
const noteDependencies = {
|
|
75
|
+
noteFunction: (query) => listNotes(query || {}),
|
|
76
|
+
rankByRelevance: SearchUtilities.rankByRelevance.bind(SearchUtilities),
|
|
77
|
+
getFieldValue: SearchUtilities.getFieldValue.bind(SearchUtilities),
|
|
78
|
+
};
|
|
79
|
+
// Initialize strategies
|
|
80
|
+
this.strategies.set(UniversalResourceType.COMPANIES, new CompanySearchStrategy(companyDependencies));
|
|
81
|
+
this.strategies.set(UniversalResourceType.PEOPLE, new PeopleSearchStrategy(peopleDependencies));
|
|
82
|
+
this.strategies.set(UniversalResourceType.DEALS, new DealSearchStrategy(dealDependencies));
|
|
83
|
+
this.strategies.set(UniversalResourceType.LISTS, new ListSearchStrategy(listDependencies));
|
|
84
|
+
this.strategies.set(UniversalResourceType.TASKS, new TaskSearchStrategy(taskDependencies));
|
|
85
|
+
this.strategies.set(UniversalResourceType.NOTES, new NoteSearchStrategy(noteDependencies));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a resource type has a strategy
|
|
89
|
+
*/
|
|
90
|
+
static hasStrategy(resourceType) {
|
|
91
|
+
return this.strategies.has(resourceType);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Clear all strategies (useful for testing)
|
|
95
|
+
*/
|
|
96
|
+
static clearStrategies() {
|
|
97
|
+
this.strategies.clear();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=StrategyFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrategyFactory.js","sourceRoot":"","sources":["../../../src/services/search/StrategyFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for writing formatted output to disk
|
|
3
|
+
*
|
|
4
|
+
* Handles file I/O operations including:
|
|
5
|
+
* - Creating directory structures
|
|
6
|
+
* - Writing files to disk
|
|
7
|
+
* - Creating ZIP archives
|
|
8
|
+
* - Path validation (security)
|
|
9
|
+
*
|
|
10
|
+
* @see Issue #983
|
|
11
|
+
*/
|
|
12
|
+
import type { FormattedOutput, GenerateSkillConfig, SkillOutput } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Service for writing skill output to disk
|
|
15
|
+
*/
|
|
16
|
+
export declare class OutputWriterService {
|
|
17
|
+
/**
|
|
18
|
+
* Writes formatted output to disk
|
|
19
|
+
*
|
|
20
|
+
* @param formatted - Formatted output from SchemaFormatterService
|
|
21
|
+
* @param config - Generation configuration
|
|
22
|
+
* @returns Information about written files
|
|
23
|
+
*/
|
|
24
|
+
write(formatted: FormattedOutput, config: GenerateSkillConfig): Promise<SkillOutput>;
|
|
25
|
+
/**
|
|
26
|
+
* Creates ZIP archive of output files
|
|
27
|
+
*
|
|
28
|
+
* @param basePath - Base directory path
|
|
29
|
+
* @param files - Map of relative paths to file contents
|
|
30
|
+
*/
|
|
31
|
+
private createZip;
|
|
32
|
+
/**
|
|
33
|
+
* Resolves and validates output path
|
|
34
|
+
*
|
|
35
|
+
* @param config - Generation configuration
|
|
36
|
+
* @returns Absolute output path
|
|
37
|
+
* @throws Error if path validation fails (directory traversal attempt)
|
|
38
|
+
*/
|
|
39
|
+
private resolveOutputPath;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=OutputWriterService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputWriterService.d.ts","sourceRoot":"","sources":["../../../src/services/skill-generator/OutputWriterService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,mBAAmB;IAC9B;;;;;;OAMG;IACG,KAAK,CACT,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC;IAiCvB;;;;;OAKG;YACW,SAAS;IAqBvB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;CA4B1B"}
|