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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/value-transformer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-select transformer - wraps single values in arrays for multi-select fields
|
|
3
|
+
*
|
|
4
|
+
* Problem: LLMs commonly pass multi-select values as single strings (e.g., "Inbound")
|
|
5
|
+
* but Attio API requires array format (e.g., ["Inbound"]).
|
|
6
|
+
*
|
|
7
|
+
* Solution: Auto-detect multi-select attributes and wrap single values in arrays.
|
|
8
|
+
*/
|
|
9
|
+
import { TransformContext, TransformResult, AttributeMetadata } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Check if an attribute type name indicates multi-select (legacy check)
|
|
12
|
+
* @internal Use isMultiSelectAttribute() for proper detection
|
|
13
|
+
*/
|
|
14
|
+
export declare function isMultiSelectTypeName(type: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Check if an attribute is multi-select based on metadata
|
|
17
|
+
*
|
|
18
|
+
* CRITICAL: Attio's actual API format for multi-select attributes is:
|
|
19
|
+
* { type: "select", is_multiselect: true }
|
|
20
|
+
*
|
|
21
|
+
* NOT { type: "multi_select" } as one might expect.
|
|
22
|
+
*
|
|
23
|
+
* This function checks the is_multiselect flag FIRST because:
|
|
24
|
+
* 1. Custom workspace attributes (e.g., lead_type, inbound_outbound) use type="select"
|
|
25
|
+
* 2. The is_multiselect flag is the authoritative source from Attio's API
|
|
26
|
+
* 3. Type name matching is only for backward compatibility with older schemas
|
|
27
|
+
*
|
|
28
|
+
* Issue #992: Without flag-first detection, custom multi-select attributes were
|
|
29
|
+
* not being auto-wrapped to arrays, causing API errors.
|
|
30
|
+
*
|
|
31
|
+
* @param meta - Attribute metadata from Attio API
|
|
32
|
+
* @returns true if the attribute accepts multiple values
|
|
33
|
+
*/
|
|
34
|
+
export declare function isMultiSelectAttribute(meta: AttributeMetadata): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Check if an attribute type is multi-select
|
|
37
|
+
* @deprecated Use isMultiSelectAttribute() instead for proper detection with metadata
|
|
38
|
+
*/
|
|
39
|
+
export declare function isMultiSelectType(type: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Transform a multi-select value from single string to array format
|
|
42
|
+
*
|
|
43
|
+
* @param value - The value to transform
|
|
44
|
+
* @param attributeSlug - The attribute slug
|
|
45
|
+
* @param context - Transformation context
|
|
46
|
+
* @param attributeMeta - Attribute metadata
|
|
47
|
+
* @returns Transform result
|
|
48
|
+
*/
|
|
49
|
+
export declare function transformMultiSelectValue(value: unknown, attributeSlug: string, context: TransformContext, attributeMeta: AttributeMetadata): Promise<TransformResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Check if a value needs to be wrapped for multi-select
|
|
52
|
+
* (Useful for validation without transformation)
|
|
53
|
+
* @deprecated Use needsArrayWrappingForAttribute() instead for proper detection
|
|
54
|
+
*/
|
|
55
|
+
export declare function needsArrayWrapping(value: unknown, attributeType: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Check if a value needs to be wrapped for multi-select based on attribute metadata
|
|
58
|
+
* @param value - The value to check
|
|
59
|
+
* @param attributeMeta - Attribute metadata
|
|
60
|
+
* @returns true if the value needs to be wrapped in an array
|
|
61
|
+
*/
|
|
62
|
+
export declare function needsArrayWrappingForAttribute(value: unknown, attributeMeta: AttributeMetadata): boolean;
|
|
63
|
+
//# sourceMappingURL=multi-select-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select-transformer.d.ts","sourceRoot":"","sources":["../../../src/services/value-transformer/multi-select-transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CASvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AASD;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,iBAAiB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAqD1B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,MAAM,GACpB,OAAO,CAKT;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,iBAAiB,GAC/B,OAAO,CAKT"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-select transformer - wraps single values in arrays for multi-select fields
|
|
3
|
+
*
|
|
4
|
+
* Problem: LLMs commonly pass multi-select values as single strings (e.g., "Inbound")
|
|
5
|
+
* but Attio API requires array format (e.g., ["Inbound"]).
|
|
6
|
+
*
|
|
7
|
+
* Solution: Auto-detect multi-select attributes and wrap single values in arrays.
|
|
8
|
+
*/
|
|
9
|
+
import { debug, OperationType } from '../../utils/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Multi-select attribute types that require array values (legacy type names)
|
|
12
|
+
*/
|
|
13
|
+
const MULTI_SELECT_TYPES = ['multi_select', 'multi-select', 'multiselect'];
|
|
14
|
+
/**
|
|
15
|
+
* Check if an attribute type name indicates multi-select (legacy check)
|
|
16
|
+
* @internal Use isMultiSelectAttribute() for proper detection
|
|
17
|
+
*/
|
|
18
|
+
export function isMultiSelectTypeName(type) {
|
|
19
|
+
return MULTI_SELECT_TYPES.includes(type.toLowerCase().replace(/[_-]/g, ''));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if an attribute is multi-select based on metadata
|
|
23
|
+
*
|
|
24
|
+
* CRITICAL: Attio's actual API format for multi-select attributes is:
|
|
25
|
+
* { type: "select", is_multiselect: true }
|
|
26
|
+
*
|
|
27
|
+
* NOT { type: "multi_select" } as one might expect.
|
|
28
|
+
*
|
|
29
|
+
* This function checks the is_multiselect flag FIRST because:
|
|
30
|
+
* 1. Custom workspace attributes (e.g., lead_type, inbound_outbound) use type="select"
|
|
31
|
+
* 2. The is_multiselect flag is the authoritative source from Attio's API
|
|
32
|
+
* 3. Type name matching is only for backward compatibility with older schemas
|
|
33
|
+
*
|
|
34
|
+
* Issue #992: Without flag-first detection, custom multi-select attributes were
|
|
35
|
+
* not being auto-wrapped to arrays, causing API errors.
|
|
36
|
+
*
|
|
37
|
+
* @param meta - Attribute metadata from Attio API
|
|
38
|
+
* @returns true if the attribute accepts multiple values
|
|
39
|
+
*/
|
|
40
|
+
export function isMultiSelectAttribute(meta) {
|
|
41
|
+
// IMPORTANT: Check is_multiselect flag first - this is Attio's authoritative format
|
|
42
|
+
// Custom workspace attributes have type="select" but is_multiselect=true
|
|
43
|
+
if (meta.is_multiselect === true) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
// Fallback to type name matching for backward compatibility only
|
|
47
|
+
// (handles edge cases where schema lacks the is_multiselect field)
|
|
48
|
+
return isMultiSelectTypeName(meta.type);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if an attribute type is multi-select
|
|
52
|
+
* @deprecated Use isMultiSelectAttribute() instead for proper detection with metadata
|
|
53
|
+
*/
|
|
54
|
+
export function isMultiSelectType(type) {
|
|
55
|
+
return isMultiSelectTypeName(type);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if a value is already an array
|
|
59
|
+
*/
|
|
60
|
+
function isArray(value) {
|
|
61
|
+
return Array.isArray(value);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Transform a multi-select value from single string to array format
|
|
65
|
+
*
|
|
66
|
+
* @param value - The value to transform
|
|
67
|
+
* @param attributeSlug - The attribute slug
|
|
68
|
+
* @param context - Transformation context
|
|
69
|
+
* @param attributeMeta - Attribute metadata
|
|
70
|
+
* @returns Transform result
|
|
71
|
+
*/
|
|
72
|
+
export async function transformMultiSelectValue(value, attributeSlug, context, attributeMeta) {
|
|
73
|
+
// Only transform multi-select attributes (check is_multiselect flag OR type name)
|
|
74
|
+
if (!isMultiSelectAttribute(attributeMeta)) {
|
|
75
|
+
return {
|
|
76
|
+
transformed: false,
|
|
77
|
+
originalValue: value,
|
|
78
|
+
transformedValue: value,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Skip if already an array
|
|
82
|
+
if (isArray(value)) {
|
|
83
|
+
return {
|
|
84
|
+
transformed: false,
|
|
85
|
+
originalValue: value,
|
|
86
|
+
transformedValue: value,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Skip null/undefined values
|
|
90
|
+
if (value === null || value === undefined) {
|
|
91
|
+
return {
|
|
92
|
+
transformed: false,
|
|
93
|
+
originalValue: value,
|
|
94
|
+
transformedValue: value,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Wrap single value in array
|
|
98
|
+
const transformedValue = [value];
|
|
99
|
+
debug('multi-select-transformer', `Wrapped single value in array for multi-select`, {
|
|
100
|
+
attribute: attributeSlug,
|
|
101
|
+
from: value,
|
|
102
|
+
to: transformedValue,
|
|
103
|
+
resourceType: context.resourceType,
|
|
104
|
+
detectedVia: attributeMeta.is_multiselect
|
|
105
|
+
? 'is_multiselect flag'
|
|
106
|
+
: 'type name',
|
|
107
|
+
}, 'transformMultiSelectValue', OperationType.DATA_PROCESSING);
|
|
108
|
+
return {
|
|
109
|
+
transformed: true,
|
|
110
|
+
originalValue: value,
|
|
111
|
+
transformedValue,
|
|
112
|
+
description: `Wrapped single value "${value}" in array for multi-select field ${attributeSlug}`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if a value needs to be wrapped for multi-select
|
|
117
|
+
* (Useful for validation without transformation)
|
|
118
|
+
* @deprecated Use needsArrayWrappingForAttribute() instead for proper detection
|
|
119
|
+
*/
|
|
120
|
+
export function needsArrayWrapping(value, attributeType) {
|
|
121
|
+
if (!isMultiSelectTypeName(attributeType))
|
|
122
|
+
return false;
|
|
123
|
+
if (isArray(value))
|
|
124
|
+
return false;
|
|
125
|
+
if (value === null || value === undefined)
|
|
126
|
+
return false;
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if a value needs to be wrapped for multi-select based on attribute metadata
|
|
131
|
+
* @param value - The value to check
|
|
132
|
+
* @param attributeMeta - Attribute metadata
|
|
133
|
+
* @returns true if the value needs to be wrapped in an array
|
|
134
|
+
*/
|
|
135
|
+
export function needsArrayWrappingForAttribute(value, attributeMeta) {
|
|
136
|
+
if (!isMultiSelectAttribute(attributeMeta))
|
|
137
|
+
return false;
|
|
138
|
+
if (isArray(value))
|
|
139
|
+
return false;
|
|
140
|
+
if (value === null || value === undefined)
|
|
141
|
+
return false;
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=multi-select-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select-transformer.js","sourceRoot":"","sources":["../../../src/services/value-transformer/multi-select-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record-reference transformer - formats record IDs to Attio's expected format
|
|
3
|
+
*
|
|
4
|
+
* Issue #997: Record-reference attributes like people.company or deals.associated_people
|
|
5
|
+
* require a specific format: [{ target_object: "companies", target_record_id: "uuid" }]
|
|
6
|
+
*
|
|
7
|
+
* Problem: Users commonly pass:
|
|
8
|
+
* - Simple string ID: "company-uuid"
|
|
9
|
+
* - Legacy object: { record_id: "uuid" }
|
|
10
|
+
* - Incomplete object: { target_record_id: "uuid" } (missing target_object)
|
|
11
|
+
*
|
|
12
|
+
* Solution: Auto-detect record-reference attributes and format to Attio's expected structure.
|
|
13
|
+
*/
|
|
14
|
+
import { TransformContext, TransformResult, AttributeMetadata, RecordReferenceValue } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check if an attribute type is a record-reference
|
|
17
|
+
*/
|
|
18
|
+
export declare function isRecordReferenceType(type: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a value is already in the correct Attio record-reference format
|
|
21
|
+
* Exported for reuse in mayNeedTransformation() to avoid duplication
|
|
22
|
+
*/
|
|
23
|
+
export declare function isCorrectRecordReferenceFormat(value: unknown): value is RecordReferenceValue[];
|
|
24
|
+
/**
|
|
25
|
+
* Transform a record-reference value to Attio API format
|
|
26
|
+
*
|
|
27
|
+
* @param value - The value to transform
|
|
28
|
+
* @param field - The field/attribute slug
|
|
29
|
+
* @param context - Transformation context
|
|
30
|
+
* @param attrMeta - Attribute metadata
|
|
31
|
+
* @returns Transform result
|
|
32
|
+
*/
|
|
33
|
+
export declare function transformRecordReferenceValue(value: unknown, field: string, context: TransformContext, attrMeta: AttributeMetadata): Promise<TransformResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a value needs record-reference formatting
|
|
36
|
+
* Useful for validation without transformation
|
|
37
|
+
*
|
|
38
|
+
* @param value - The value to check
|
|
39
|
+
* @param attrMeta - Attribute metadata
|
|
40
|
+
* @returns true if the value needs formatting
|
|
41
|
+
*/
|
|
42
|
+
export declare function needsRecordReferenceFormatting(value: unknown, attrMeta: AttributeMetadata): boolean;
|
|
43
|
+
//# sourceMappingURL=record-reference-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-reference-transformer.d.ts","sourceRoot":"","sources":["../../../src/services/value-transformer/record-reference-transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAoBpB;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,oBAAoB,EAAE,CAcjC;AA2FD;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA2H1B;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAKT"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record-reference transformer - formats record IDs to Attio's expected format
|
|
3
|
+
*
|
|
4
|
+
* Issue #997: Record-reference attributes like people.company or deals.associated_people
|
|
5
|
+
* require a specific format: [{ target_object: "companies", target_record_id: "uuid" }]
|
|
6
|
+
*
|
|
7
|
+
* Problem: Users commonly pass:
|
|
8
|
+
* - Simple string ID: "company-uuid"
|
|
9
|
+
* - Legacy object: { record_id: "uuid" }
|
|
10
|
+
* - Incomplete object: { target_record_id: "uuid" } (missing target_object)
|
|
11
|
+
*
|
|
12
|
+
* Solution: Auto-detect record-reference attributes and format to Attio's expected structure.
|
|
13
|
+
*/
|
|
14
|
+
import { debug, OperationType } from '../../utils/logger.js';
|
|
15
|
+
/**
|
|
16
|
+
* Mapping from field names to their target object types
|
|
17
|
+
* Used as fallback when relationship metadata is not available
|
|
18
|
+
*/
|
|
19
|
+
const FIELD_TO_TARGET_OBJECT = {
|
|
20
|
+
company: 'companies',
|
|
21
|
+
associated_company: 'companies',
|
|
22
|
+
associated_companies: 'companies',
|
|
23
|
+
main_contact: 'people',
|
|
24
|
+
associated_people: 'people',
|
|
25
|
+
associated_person: 'people',
|
|
26
|
+
person: 'people',
|
|
27
|
+
people: 'people',
|
|
28
|
+
owner: 'workspace-members', // Note: owner might be workspace-member, not people
|
|
29
|
+
assignee: 'workspace-members',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Check if an attribute type is a record-reference
|
|
33
|
+
*/
|
|
34
|
+
export function isRecordReferenceType(type) {
|
|
35
|
+
return type === 'record-reference';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if a value is already in the correct Attio record-reference format
|
|
39
|
+
* Exported for reuse in mayNeedTransformation() to avoid duplication
|
|
40
|
+
*/
|
|
41
|
+
export function isCorrectRecordReferenceFormat(value) {
|
|
42
|
+
if (!Array.isArray(value))
|
|
43
|
+
return false;
|
|
44
|
+
if (value.length === 0)
|
|
45
|
+
return true; // Empty array is valid (clears the field)
|
|
46
|
+
// Check first element has both required fields
|
|
47
|
+
const first = value[0];
|
|
48
|
+
return (first &&
|
|
49
|
+
typeof first === 'object' &&
|
|
50
|
+
'target_object' in first &&
|
|
51
|
+
'target_record_id' in first &&
|
|
52
|
+
typeof first.target_object === 'string' &&
|
|
53
|
+
typeof first.target_record_id === 'string');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Infer the target object type from field name or metadata
|
|
57
|
+
*/
|
|
58
|
+
function inferTargetObject(field, metadata) {
|
|
59
|
+
// Priority 1: Use relationship.object from metadata (authoritative)
|
|
60
|
+
if (metadata.relationship?.object) {
|
|
61
|
+
return metadata.relationship.object;
|
|
62
|
+
}
|
|
63
|
+
// Priority 2: Infer from field name (fallback - log for monitoring)
|
|
64
|
+
const fieldLower = field.toLowerCase();
|
|
65
|
+
for (const [pattern, target] of Object.entries(FIELD_TO_TARGET_OBJECT)) {
|
|
66
|
+
if (fieldLower === pattern || fieldLower.includes(pattern)) {
|
|
67
|
+
// Log when using fallback inference to help identify fields that
|
|
68
|
+
// should have relationship metadata added to the Attio schema
|
|
69
|
+
debug('record-reference-transformer', `Using fallback field-name inference: ${field} → ${target}`, { field, pattern, inferredTarget: target }, 'inferTargetObject', OperationType.DATA_PROCESSING);
|
|
70
|
+
return target;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract record ID from various input formats
|
|
77
|
+
*
|
|
78
|
+
* Returns null for:
|
|
79
|
+
* - null/undefined values
|
|
80
|
+
* - Empty strings or whitespace-only strings
|
|
81
|
+
* - Objects without recognizable ID fields (record_id, target_record_id, id)
|
|
82
|
+
*
|
|
83
|
+
* Returning null causes the item to be filtered out of arrays or
|
|
84
|
+
* triggers a "Could not extract record ID" error for single values,
|
|
85
|
+
* rather than creating invalid record references.
|
|
86
|
+
*/
|
|
87
|
+
function extractRecordId(item) {
|
|
88
|
+
// String: "uuid" → "uuid"
|
|
89
|
+
if (typeof item === 'string') {
|
|
90
|
+
return item.trim() || null;
|
|
91
|
+
}
|
|
92
|
+
// Object formats
|
|
93
|
+
if (item && typeof item === 'object') {
|
|
94
|
+
const obj = item;
|
|
95
|
+
// Already correct format: { target_record_id: "uuid" }
|
|
96
|
+
if (typeof obj.target_record_id === 'string') {
|
|
97
|
+
return obj.target_record_id;
|
|
98
|
+
}
|
|
99
|
+
// Legacy format: { record_id: "uuid" }
|
|
100
|
+
if (typeof obj.record_id === 'string') {
|
|
101
|
+
return obj.record_id;
|
|
102
|
+
}
|
|
103
|
+
// Sometimes: { id: "uuid" }
|
|
104
|
+
if (typeof obj.id === 'string') {
|
|
105
|
+
return obj.id;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Transform a single value to record-reference format
|
|
112
|
+
*/
|
|
113
|
+
function transformSingleValue(item, targetObject) {
|
|
114
|
+
const recordId = extractRecordId(item);
|
|
115
|
+
if (!recordId)
|
|
116
|
+
return null;
|
|
117
|
+
return {
|
|
118
|
+
target_object: targetObject,
|
|
119
|
+
target_record_id: recordId,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Transform a record-reference value to Attio API format
|
|
124
|
+
*
|
|
125
|
+
* @param value - The value to transform
|
|
126
|
+
* @param field - The field/attribute slug
|
|
127
|
+
* @param context - Transformation context
|
|
128
|
+
* @param attrMeta - Attribute metadata
|
|
129
|
+
* @returns Transform result
|
|
130
|
+
*/
|
|
131
|
+
export async function transformRecordReferenceValue(value, field, context, attrMeta) {
|
|
132
|
+
// Only transform record-reference attributes
|
|
133
|
+
if (!isRecordReferenceType(attrMeta.type)) {
|
|
134
|
+
return {
|
|
135
|
+
transformed: false,
|
|
136
|
+
originalValue: value,
|
|
137
|
+
transformedValue: value,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Skip null/undefined values
|
|
141
|
+
if (value === null || value === undefined) {
|
|
142
|
+
return {
|
|
143
|
+
transformed: false,
|
|
144
|
+
originalValue: value,
|
|
145
|
+
transformedValue: value,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// Skip if already in correct format
|
|
149
|
+
if (isCorrectRecordReferenceFormat(value)) {
|
|
150
|
+
debug('record-reference-transformer', `Value already in correct format, skipping`, {
|
|
151
|
+
field,
|
|
152
|
+
resourceType: context.resourceType,
|
|
153
|
+
}, 'transformRecordReferenceValue', OperationType.DATA_PROCESSING);
|
|
154
|
+
return {
|
|
155
|
+
transformed: false,
|
|
156
|
+
originalValue: value,
|
|
157
|
+
transformedValue: value,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Determine target object type
|
|
161
|
+
const targetObject = inferTargetObject(field, attrMeta);
|
|
162
|
+
if (!targetObject) {
|
|
163
|
+
debug('record-reference-transformer', `Could not determine target object for field ${field}, skipping transformation`, {
|
|
164
|
+
field,
|
|
165
|
+
resourceType: context.resourceType,
|
|
166
|
+
metadataRelationship: attrMeta.relationship,
|
|
167
|
+
}, 'transformRecordReferenceValue', OperationType.DATA_PROCESSING);
|
|
168
|
+
return {
|
|
169
|
+
transformed: false,
|
|
170
|
+
originalValue: value,
|
|
171
|
+
transformedValue: value,
|
|
172
|
+
description: `Could not determine target object for record-reference field ${field}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// Transform based on input type
|
|
176
|
+
let transformedValue;
|
|
177
|
+
if (Array.isArray(value)) {
|
|
178
|
+
// Array of values (strings or objects)
|
|
179
|
+
const transformed = [];
|
|
180
|
+
for (const item of value) {
|
|
181
|
+
const ref = transformSingleValue(item, targetObject);
|
|
182
|
+
if (ref) {
|
|
183
|
+
transformed.push(ref);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// CRITICAL (Issue #997): Don't silently clear on all-invalid input
|
|
187
|
+
// If user passes [null, '', {}], we should NOT return [] and clear the field.
|
|
188
|
+
// Instead, return transformed: false with an error message.
|
|
189
|
+
// User must pass [] explicitly to clear a record-reference field.
|
|
190
|
+
if (transformed.length === 0 && value.length > 0) {
|
|
191
|
+
return {
|
|
192
|
+
transformed: false,
|
|
193
|
+
originalValue: value,
|
|
194
|
+
transformedValue: value,
|
|
195
|
+
description: `Could not extract any valid record IDs from array for field ${field}. ` +
|
|
196
|
+
`Received ${value.length} item(s), all invalid. Pass [] explicitly to clear the field.`,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
transformedValue = transformed;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Single value (string or object)
|
|
203
|
+
const ref = transformSingleValue(value, targetObject);
|
|
204
|
+
if (!ref) {
|
|
205
|
+
return {
|
|
206
|
+
transformed: false,
|
|
207
|
+
originalValue: value,
|
|
208
|
+
transformedValue: value,
|
|
209
|
+
description: `Could not extract record ID from value for field ${field}`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
transformedValue = [ref];
|
|
213
|
+
}
|
|
214
|
+
debug('record-reference-transformer', `Transformed record-reference value`, {
|
|
215
|
+
field,
|
|
216
|
+
targetObject,
|
|
217
|
+
originalType: Array.isArray(value) ? 'array' : typeof value,
|
|
218
|
+
transformedCount: transformedValue.length,
|
|
219
|
+
resourceType: context.resourceType,
|
|
220
|
+
}, 'transformRecordReferenceValue', OperationType.DATA_PROCESSING);
|
|
221
|
+
return {
|
|
222
|
+
transformed: true,
|
|
223
|
+
originalValue: value,
|
|
224
|
+
transformedValue,
|
|
225
|
+
description: `Formatted ${field} as record-reference array with target_object="${targetObject}"`,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if a value needs record-reference formatting
|
|
230
|
+
* Useful for validation without transformation
|
|
231
|
+
*
|
|
232
|
+
* @param value - The value to check
|
|
233
|
+
* @param attrMeta - Attribute metadata
|
|
234
|
+
* @returns true if the value needs formatting
|
|
235
|
+
*/
|
|
236
|
+
export function needsRecordReferenceFormatting(value, attrMeta) {
|
|
237
|
+
if (!isRecordReferenceType(attrMeta.type))
|
|
238
|
+
return false;
|
|
239
|
+
if (value === null || value === undefined)
|
|
240
|
+
return false;
|
|
241
|
+
if (isCorrectRecordReferenceFormat(value))
|
|
242
|
+
return false;
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=record-reference-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-reference-transformer.js","sourceRoot":"","sources":["../../../src/services/value-transformer/record-reference-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Select transformer - converts select option titles to ["title"] array format
|
|
3
|
+
*
|
|
4
|
+
* Problem: LLMs commonly pass select values as human-readable strings
|
|
5
|
+
* (e.g., "Technology", "Potential Customer") but Attio API requires
|
|
6
|
+
* array format: ["title"]
|
|
7
|
+
*
|
|
8
|
+
* Solution: Auto-detect single-select attributes (type="select" AND
|
|
9
|
+
* is_multiselect !== true) and transform string titles to title arrays.
|
|
10
|
+
*
|
|
11
|
+
* NOTE: Attio API accepts ["title"] format and silently rejects ["uuid"] format
|
|
12
|
+
* despite returning HTTP 200 OK (Issue #1045). This transformer uses titles.
|
|
13
|
+
*
|
|
14
|
+
* @see Issue #1019, #1045
|
|
15
|
+
*/
|
|
16
|
+
import { TransformContext, TransformResult, AttributeMetadata } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Clear all cached select options (for testing)
|
|
19
|
+
*/
|
|
20
|
+
export declare function clearSelectCache(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Transform a select value from string title to ["title"] array format
|
|
23
|
+
*
|
|
24
|
+
* Supports:
|
|
25
|
+
* - Case-insensitive title matching: "technology" → ["Technology"]
|
|
26
|
+
* - Partial matching: "Tech" → ["Technology"] (if matches "Technology")
|
|
27
|
+
* - UUID pass-through: "uuid-string" → ["uuid-string"] (no API lookup)
|
|
28
|
+
* - Error suggestions: Lists valid options on invalid input
|
|
29
|
+
*
|
|
30
|
+
* NOTE: Uses ["title"] format not ["uuid"] because Attio API silently
|
|
31
|
+
* rejects UUID arrays despite returning HTTP 200 OK (Issue #1045).
|
|
32
|
+
*
|
|
33
|
+
* @param value - The value to transform
|
|
34
|
+
* @param attributeSlug - The attribute slug
|
|
35
|
+
* @param context - Transformation context
|
|
36
|
+
* @param attributeMeta - Attribute metadata (must be single-select)
|
|
37
|
+
* @returns Transform result with ["title"] array format
|
|
38
|
+
*/
|
|
39
|
+
export declare function transformSelectValue(value: unknown, attributeSlug: string, context: TransformContext, attributeMeta: AttributeMetadata): Promise<TransformResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Get valid select options for error messages
|
|
42
|
+
*
|
|
43
|
+
* @param objectSlug - Object slug
|
|
44
|
+
* @param attributeSlug - Attribute slug
|
|
45
|
+
* @returns Array of valid option titles
|
|
46
|
+
*/
|
|
47
|
+
export declare function getValidSelectOptions(objectSlug: string, attributeSlug: string): Promise<string[]>;
|
|
48
|
+
//# sourceMappingURL=select-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-transformer.d.ts","sourceRoot":"","sources":["../../../src/services/value-transformer/select-transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAgCpB;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAqKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,iBAAiB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAoF1B;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB"}
|