attio-mcp 1.3.6 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +284 -3
- package/README.md +143 -334
- 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/api/operations/batch.d.ts +3 -3
- package/dist/api/operations/batch.d.ts.map +1 -1
- package/dist/api/operations/batch.js.map +1 -1
- package/dist/api/operations/crud.d.ts.map +1 -1
- package/dist/api/operations/crud.js.map +1 -1
- package/dist/api/operations/search.d.ts.map +1 -1
- package/dist/api/operations/search.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/cli.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/errors/value-match-error.js +1 -1
- package/dist/handlers/tool-configs/lists.d.ts +142 -19
- package/dist/handlers/tool-configs/lists.d.ts.map +1 -1
- package/dist/handlers/tool-configs/lists.js +319 -25
- package/dist/handlers/tool-configs/lists.js.map +1 -1
- package/dist/handlers/tool-configs/universal/batch-search.d.ts +1 -1
- package/dist/handlers/tool-configs/universal/batch-search.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/batch-search.js +17 -13
- package/dist/handlers/tool-configs/universal/batch-search.js.map +1 -1
- 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.d.ts +4 -4
- package/dist/handlers/tool-configs/universal/core/crud-operations.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/crud-operations.js +37 -24
- 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.d.ts +6 -3
- package/dist/handlers/tool-configs/universal/core/record-details-operations.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/record-details-operations.js +35 -10
- package/dist/handlers/tool-configs/universal/core/record-details-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/search-operations.d.ts +4 -3
- package/dist/handlers/tool-configs/universal/core/search-operations.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/search-operations.js +31 -12
- package/dist/handlers/tool-configs/universal/core/search-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/utils.d.ts +1 -0
- package/dist/handlers/tool-configs/universal/core/utils.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/utils.js +3 -0
- package/dist/handlers/tool-configs/universal/core/utils.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 +3 -3
- package/dist/handlers/tool-configs/universal/operations/advanced-search.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/advanced-search.js +17 -10
- package/dist/handlers/tool-configs/universal/operations/advanced-search.js.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/batch-format.d.ts +1 -1
- package/dist/handlers/tool-configs/universal/operations/batch-format.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/batch-format.js +31 -10
- package/dist/handlers/tool-configs/universal/operations/batch-format.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.d.ts +3 -3
- package/dist/handlers/tool-configs/universal/operations/content-search.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/content-search.js +15 -9
- package/dist/handlers/tool-configs/universal/operations/content-search.js.map +1 -1
- 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.d.ts +3 -3
- package/dist/handlers/tool-configs/universal/operations/relationship-search.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/relationship-search.js +11 -8
- package/dist/handlers/tool-configs/universal/operations/relationship-search.js.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/timeframe-search.d.ts +3 -3
- package/dist/handlers/tool-configs/universal/operations/timeframe-search.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/timeframe-search.js +16 -10
- package/dist/handlers/tool-configs/universal/operations/timeframe-search.js.map +1 -1
- 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 +27 -7
- package/dist/handlers/tool-configs/universal/shared-handlers.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/shared-handlers.js +221 -25
- 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/smithery-diagnostics.js.map +1 -1
- package/dist/handlers/tool-configs/universal/types.d.ts +17 -7
- 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 +80 -17
- 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 +9 -2
- package/dist/handlers/tools/dispatcher/core.js.map +1 -1
- package/dist/handlers/tools/dispatcher/operations/lists.d.ts +20 -1
- package/dist/handlers/tools/dispatcher/operations/lists.d.ts.map +1 -1
- package/dist/handlers/tools/dispatcher/operations/lists.js +366 -17
- package/dist/handlers/tools/dispatcher/operations/lists.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 +409 -122
- 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/objects/companies/basic.d.ts.map +1 -1
- package/dist/objects/companies/basic.js.map +1 -1
- package/dist/objects/lists/base.d.ts.map +1 -1
- package/dist/objects/lists/base.js +6 -2
- package/dist/objects/lists/base.js.map +1 -1
- package/dist/objects/lists/shared.d.ts.map +1 -1
- package/dist/objects/lists/shared.js +12 -1
- package/dist/objects/lists/shared.js.map +1 -1
- package/dist/objects/records/index.d.ts.map +1 -1
- package/dist/objects/records/index.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/OpenAiCompatibilityService.d.ts.map +1 -1
- package/dist/services/OpenAiCompatibilityService.js +12 -8
- package/dist/services/OpenAiCompatibilityService.js.map +1 -1
- package/dist/services/UniversalCreateService.d.ts +3 -3
- package/dist/services/UniversalCreateService.d.ts.map +1 -1
- package/dist/services/UniversalCreateService.js +162 -38
- package/dist/services/UniversalCreateService.js.map +1 -1
- package/dist/services/UniversalMetadataService.d.ts +8 -0
- package/dist/services/UniversalMetadataService.d.ts.map +1 -1
- package/dist/services/UniversalMetadataService.js +21 -0
- package/dist/services/UniversalMetadataService.js.map +1 -1
- package/dist/services/UniversalRetrievalService.d.ts +7 -5
- package/dist/services/UniversalRetrievalService.d.ts.map +1 -1
- package/dist/services/UniversalRetrievalService.js +31 -29
- package/dist/services/UniversalRetrievalService.js.map +1 -1
- package/dist/services/UniversalSearchService.d.ts +8 -27
- package/dist/services/UniversalSearchService.d.ts.map +1 -1
- package/dist/services/UniversalSearchService.js +19 -327
- package/dist/services/UniversalSearchService.js.map +1 -1
- package/dist/services/UniversalUpdateService.d.ts +25 -7
- package/dist/services/UniversalUpdateService.d.ts.map +1 -1
- package/dist/services/UniversalUpdateService.js +132 -157
- package/dist/services/UniversalUpdateService.js.map +1 -1
- package/dist/services/UniversalUtilityService.d.ts +9 -1
- package/dist/services/UniversalUtilityService.d.ts.map +1 -1
- package/dist/services/UniversalUtilityService.js +13 -0
- package/dist/services/UniversalUtilityService.js.map +1 -1
- package/dist/services/ValidationService.js +4 -4
- package/dist/services/ValidationService.js.map +1 -1
- package/dist/services/create/attio-create.service.d.ts.map +1 -1
- package/dist/services/create/attio-create.service.js +2 -1
- package/dist/services/create/attio-create.service.js.map +1 -1
- package/dist/services/create/creators/company-creator.js.map +1 -1
- package/dist/services/create/creators/note-creator.d.ts.map +1 -1
- package/dist/services/create/creators/note-creator.js +4 -2
- package/dist/services/create/creators/note-creator.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/create/mock-create.service.d.ts.map +1 -1
- package/dist/services/create/mock-create.service.js.map +1 -1
- package/dist/services/create/strategies/BaseCreateStrategy.d.ts +2 -2
- package/dist/services/create/strategies/BaseCreateStrategy.d.ts.map +1 -1
- package/dist/services/create/strategies/ListCreateStrategy.d.ts +3 -3
- package/dist/services/create/strategies/ListCreateStrategy.d.ts.map +1 -1
- package/dist/services/create/strategies/ListCreateStrategy.js +2 -16
- package/dist/services/create/strategies/ListCreateStrategy.js.map +1 -1
- package/dist/services/create/strategies/TaskCreateStrategy.d.ts.map +1 -1
- package/dist/services/create/strategies/TaskCreateStrategy.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/MetadataDiscoveryService.d.ts.map +1 -1
- package/dist/services/metadata/MetadataDiscoveryService.js.map +1 -1
- package/dist/services/metadata/MetadataTransformService.d.ts.map +1 -1
- package/dist/services/metadata/MetadataTransformService.js.map +1 -1
- 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/search-strategies/BaseSearchStrategy.d.ts +5 -5
- package/dist/services/search-strategies/BaseSearchStrategy.d.ts.map +1 -1
- package/dist/services/search-strategies/BaseSearchStrategy.js.map +1 -1
- package/dist/services/search-strategies/CompanySearchStrategy.d.ts +4 -4
- package/dist/services/search-strategies/CompanySearchStrategy.d.ts.map +1 -1
- package/dist/services/search-strategies/CompanySearchStrategy.js +1 -1
- package/dist/services/search-strategies/CompanySearchStrategy.js.map +1 -1
- package/dist/services/search-strategies/DealSearchStrategy.d.ts +4 -4
- package/dist/services/search-strategies/DealSearchStrategy.d.ts.map +1 -1
- package/dist/services/search-strategies/DealSearchStrategy.js +1 -1
- package/dist/services/search-strategies/DealSearchStrategy.js.map +1 -1
- package/dist/services/search-strategies/ListSearchStrategy.d.ts +34 -7
- package/dist/services/search-strategies/ListSearchStrategy.d.ts.map +1 -1
- package/dist/services/search-strategies/ListSearchStrategy.js +65 -24
- package/dist/services/search-strategies/ListSearchStrategy.js.map +1 -1
- package/dist/services/search-strategies/NoteSearchStrategy.d.ts +4 -4
- package/dist/services/search-strategies/NoteSearchStrategy.d.ts.map +1 -1
- package/dist/services/search-strategies/NoteSearchStrategy.js +6 -7
- package/dist/services/search-strategies/NoteSearchStrategy.js.map +1 -1
- package/dist/services/search-strategies/PeopleSearchStrategy.d.ts +4 -4
- package/dist/services/search-strategies/PeopleSearchStrategy.d.ts.map +1 -1
- package/dist/services/search-strategies/PeopleSearchStrategy.js +1 -1
- package/dist/services/search-strategies/PeopleSearchStrategy.js.map +1 -1
- package/dist/services/search-strategies/TaskSearchStrategy.d.ts +4 -4
- package/dist/services/search-strategies/TaskSearchStrategy.d.ts.map +1 -1
- package/dist/services/search-strategies/TaskSearchStrategy.js +7 -8
- package/dist/services/search-strategies/TaskSearchStrategy.js.map +1 -1
- package/dist/services/search-strategies/interfaces.d.ts +7 -6
- package/dist/services/search-strategies/interfaces.d.ts.map +1 -1
- package/dist/services/search-utilities/SearchUtilities.d.ts +22 -7
- package/dist/services/search-utilities/SearchUtilities.d.ts.map +1 -1
- package/dist/services/search-utilities/SearchUtilities.js +52 -4
- package/dist/services/search-utilities/SearchUtilities.js.map +1 -1
- 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 +207 -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/ResponseNormalizer.d.ts +4 -4
- package/dist/services/update/ResponseNormalizer.d.ts.map +1 -1
- package/dist/services/update/ResponseNormalizer.js +18 -9
- package/dist/services/update/ResponseNormalizer.js.map +1 -1
- 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 +7 -3
- package/dist/services/update/UpdateValidation.d.ts.map +1 -1
- package/dist/services/update/UpdateValidation.js +56 -32
- package/dist/services/update/UpdateValidation.js.map +1 -1
- package/dist/services/update/strategies/BaseUpdateStrategy.d.ts +2 -2
- package/dist/services/update/strategies/BaseUpdateStrategy.d.ts.map +1 -1
- package/dist/services/update/strategies/ListUpdateStrategy.d.ts +3 -3
- package/dist/services/update/strategies/ListUpdateStrategy.d.ts.map +1 -1
- package/dist/services/update/strategies/ListUpdateStrategy.js +4 -14
- package/dist/services/update/strategies/ListUpdateStrategy.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 +329 -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/types/attio.d.ts +55 -0
- package/dist/types/attio.d.ts.map +1 -1
- package/dist/types/attio.js +36 -0
- package/dist/types/attio.js.map +1 -1
- 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-response-utils.js +3 -3
- package/dist/utils/error-response-utils.js.map +1 -1
- 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/normalization/record-data-normalization.d.ts +47 -0
- package/dist/utils/normalization/record-data-normalization.d.ts.map +1 -0
- package/dist/utils/normalization/record-data-normalization.js +103 -0
- package/dist/utils/normalization/record-data-normalization.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 +35 -33
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { isAttioList, isAttioRecord, } from '../../types/attio.js';
|
|
1
2
|
import { FilterValidationError } from '../../errors/api-errors.js';
|
|
2
|
-
import { shouldUseMockData } from '
|
|
3
|
-
import { UniversalUtilityService } from '
|
|
3
|
+
import { shouldUseMockData } from '../../services/create/index.js';
|
|
4
|
+
import { UniversalUtilityService } from '../../services/UniversalUtilityService.js';
|
|
4
5
|
import { getCompanyDetails } from '../../objects/companies/index.js';
|
|
5
6
|
import { getListDetails } from '../../objects/lists.js';
|
|
6
7
|
import { getPersonDetails } from '../../objects/people/basic.js';
|
|
@@ -45,7 +46,12 @@ export const UpdateValidation = {
|
|
|
45
46
|
discrepancies: [],
|
|
46
47
|
warnings: [],
|
|
47
48
|
};
|
|
48
|
-
|
|
49
|
+
// Standardized environment variable (Issue #984 extension)
|
|
50
|
+
// SKIP_FIELD_VERIFICATION is deprecated, use ENABLE_FIELD_VERIFICATION=false instead
|
|
51
|
+
const skipVerification = shouldUseMockData() ||
|
|
52
|
+
process.env.ENABLE_FIELD_VERIFICATION === 'false' ||
|
|
53
|
+
process.env.SKIP_FIELD_VERIFICATION === 'true'; // Deprecated
|
|
54
|
+
if (skipVerification) {
|
|
49
55
|
result.warnings.push('Field persistence verification skipped in test environment');
|
|
50
56
|
return result;
|
|
51
57
|
}
|
|
@@ -59,7 +65,11 @@ export const UpdateValidation = {
|
|
|
59
65
|
for (const [fieldName, expectedValue] of Object.entries(expectedUpdates)) {
|
|
60
66
|
if (['created_at', 'updated_at', 'id', 'workspace_id'].includes(fieldName))
|
|
61
67
|
continue;
|
|
62
|
-
const actualValue = verificationRecord
|
|
68
|
+
const actualValue = isAttioRecord(verificationRecord)
|
|
69
|
+
? verificationRecord.values?.[fieldName]
|
|
70
|
+
: isAttioList(verificationRecord)
|
|
71
|
+
? verificationRecord[fieldName]
|
|
72
|
+
: undefined;
|
|
63
73
|
const comparisonResult = this.compareFieldValues(fieldName, expectedValue, actualValue);
|
|
64
74
|
if (!comparisonResult.matches) {
|
|
65
75
|
result.verified = false;
|
|
@@ -81,26 +91,13 @@ export const UpdateValidation = {
|
|
|
81
91
|
try {
|
|
82
92
|
switch (resourceType) {
|
|
83
93
|
case 'companies':
|
|
84
|
-
return
|
|
94
|
+
return await getCompanyDetails(recordId);
|
|
85
95
|
case 'people':
|
|
86
|
-
return
|
|
96
|
+
return await getPersonDetails(recordId);
|
|
87
97
|
case 'lists': {
|
|
88
98
|
const list = await getListDetails(recordId);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
values: {
|
|
92
|
-
name: list.name ||
|
|
93
|
-
list.title,
|
|
94
|
-
description: list.description,
|
|
95
|
-
parent_object: list.object_slug ||
|
|
96
|
-
list.parent_object,
|
|
97
|
-
api_slug: list.api_slug,
|
|
98
|
-
workspace_id: list.workspace_id,
|
|
99
|
-
workspace_member_access: list
|
|
100
|
-
.workspace_member_access,
|
|
101
|
-
created_at: list.created_at,
|
|
102
|
-
},
|
|
103
|
-
};
|
|
99
|
+
const resolvedName = list.name || list.title;
|
|
100
|
+
return resolvedName ? { ...list, name: resolvedName } : list;
|
|
104
101
|
}
|
|
105
102
|
case 'tasks': {
|
|
106
103
|
const task = await getTask(recordId);
|
|
@@ -121,10 +118,21 @@ export const UpdateValidation = {
|
|
|
121
118
|
}
|
|
122
119
|
},
|
|
123
120
|
/**
|
|
124
|
-
* Check if a field
|
|
121
|
+
* Check if a field is a status-type field (stage, status, etc.)
|
|
122
|
+
* Enhanced to recognize more status field variations (Issue #995)
|
|
123
|
+
*
|
|
124
|
+
* Uses exact matching and suffix patterns to avoid false positives
|
|
125
|
+
* from unrelated fields like "status_code" or "status_updated_at"
|
|
125
126
|
*/
|
|
126
127
|
isStatusField(fieldName) {
|
|
127
|
-
|
|
128
|
+
const lowerFieldName = fieldName.toLowerCase();
|
|
129
|
+
// Exact matches for canonical status fields
|
|
130
|
+
if (lowerFieldName === 'stage' || lowerFieldName === 'status') {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
// Suffix patterns for common variations
|
|
134
|
+
// e.g., deal_stage, pipeline_stage, company_status, deal_status
|
|
135
|
+
return (lowerFieldName.endsWith('_stage') || lowerFieldName.endsWith('_status'));
|
|
128
136
|
},
|
|
129
137
|
/**
|
|
130
138
|
* Handle null or undefined values
|
|
@@ -147,17 +155,33 @@ export const UpdateValidation = {
|
|
|
147
155
|
return actualValue;
|
|
148
156
|
}
|
|
149
157
|
const firstItem = actualValue[0];
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
158
|
+
// Guard: only proceed with status/title logic if firstItem is an object
|
|
159
|
+
// and contains status or title properties
|
|
160
|
+
if (this.isStatusField(fieldName) &&
|
|
161
|
+
firstItem &&
|
|
162
|
+
typeof firstItem === 'object' &&
|
|
163
|
+
!Array.isArray(firstItem)) {
|
|
164
|
+
const firstItemObj = firstItem;
|
|
165
|
+
// Only use status/title extraction if the object actually has those properties
|
|
166
|
+
if ('status' in firstItemObj || 'title' in firstItemObj) {
|
|
167
|
+
const statusValue = firstItemObj.status ?? firstItemObj.title;
|
|
168
|
+
if (statusValue !== undefined) {
|
|
169
|
+
return actualValue.length === 1
|
|
170
|
+
? statusValue
|
|
171
|
+
: actualValue.map((v) => v.status ?? v.title);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
155
174
|
}
|
|
156
175
|
// Handle regular value fields
|
|
157
|
-
if (firstItem
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
176
|
+
if (firstItem &&
|
|
177
|
+
typeof firstItem === 'object' &&
|
|
178
|
+
!Array.isArray(firstItem)) {
|
|
179
|
+
const firstItemObj = firstItem;
|
|
180
|
+
if (firstItemObj.value !== undefined) {
|
|
181
|
+
return actualValue.length === 1
|
|
182
|
+
? firstItemObj.value
|
|
183
|
+
: actualValue.map((v) => v.value);
|
|
184
|
+
}
|
|
161
185
|
}
|
|
162
186
|
return actualValue;
|
|
163
187
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateValidation.js","sourceRoot":"","sources":["../../../src/services/update/UpdateValidation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UpdateValidation.js","sourceRoot":"","sources":["../../../src/services/update/UpdateValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* given a record_id and mapped values. UniversalUpdateService orchestrates
|
|
6
6
|
* mapping, sanitization, and post-update verification.
|
|
7
7
|
*/
|
|
8
|
-
import type { AttioRecord } from '../../../types/attio.js';
|
|
9
8
|
import type { UniversalResourceType } from '../../../handlers/tool-configs/universal/types.js';
|
|
9
|
+
import type { UniversalRecord } from '../../../types/attio.js';
|
|
10
10
|
export interface UpdateStrategy {
|
|
11
|
-
update(recordId: string, values: Record<string, unknown>, resourceType: UniversalResourceType, context?: Record<string, unknown>): Promise<
|
|
11
|
+
update(recordId: string, values: Record<string, unknown>, resourceType: UniversalResourceType, context?: Record<string, unknown>): Promise<UniversalRecord>;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=BaseUpdateStrategy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseUpdateStrategy.d.ts","sourceRoot":"","sources":["../../../../src/services/update/strategies/BaseUpdateStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"BaseUpdateStrategy.d.ts","sourceRoot":"","sources":["../../../../src/services/update/strategies/BaseUpdateStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,YAAY,EAAE,qBAAqB,EACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AttioRecord } from '../../../types/attio.js';
|
|
2
1
|
import type { UniversalResourceType } from '../../../handlers/tool-configs/universal/types.js';
|
|
3
|
-
import type {
|
|
2
|
+
import type { AttioList } from '../../../types/attio.js';
|
|
3
|
+
import type { UpdateStrategy } from '../../../services/update/strategies/BaseUpdateStrategy.js';
|
|
4
4
|
/**
|
|
5
5
|
* ListUpdateStrategy - Handles updates for Attio Lists
|
|
6
6
|
*
|
|
@@ -8,6 +8,6 @@ import type { UpdateStrategy } from './BaseUpdateStrategy.js';
|
|
|
8
8
|
* and isolate resource-specific behavior.
|
|
9
9
|
*/
|
|
10
10
|
export declare class ListUpdateStrategy implements UpdateStrategy {
|
|
11
|
-
update(recordId: string, values: Record<string, unknown>, resourceType: UniversalResourceType): Promise<
|
|
11
|
+
update(recordId: string, values: Record<string, unknown>, resourceType: UniversalResourceType): Promise<AttioList>;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=ListUpdateStrategy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListUpdateStrategy.d.ts","sourceRoot":"","sources":["../../../../src/services/update/strategies/ListUpdateStrategy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ListUpdateStrategy.d.ts","sourceRoot":"","sources":["../../../../src/services/update/strategies/ListUpdateStrategy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAExF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AAEzF;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACjD,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,SAAS,CAAC;CA8BtB"}
|
|
@@ -11,23 +11,13 @@ export class ListUpdateStrategy {
|
|
|
11
11
|
async update(recordId, values, resourceType) {
|
|
12
12
|
try {
|
|
13
13
|
const list = await updateList(recordId, values);
|
|
14
|
-
// Convert AttioList to AttioRecord format for consistency with callers
|
|
15
|
-
const l = list;
|
|
16
|
-
const lid = l.id || {};
|
|
17
14
|
return {
|
|
15
|
+
...list,
|
|
18
16
|
id: {
|
|
19
|
-
|
|
20
|
-
list_id:
|
|
21
|
-
},
|
|
22
|
-
values: {
|
|
23
|
-
name: l.name || l.title,
|
|
24
|
-
description: l.description,
|
|
25
|
-
parent_object: l.object_slug || l.parent_object,
|
|
26
|
-
api_slug: l.api_slug,
|
|
27
|
-
workspace_id: l.workspace_id,
|
|
28
|
-
workspace_member_access: l.workspace_member_access,
|
|
29
|
-
created_at: l.created_at,
|
|
17
|
+
...list.id,
|
|
18
|
+
list_id: list.id.list_id,
|
|
30
19
|
},
|
|
20
|
+
name: list.name || list.title,
|
|
31
21
|
};
|
|
32
22
|
}
|
|
33
23
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListUpdateStrategy.js","sourceRoot":"","sources":["../../../../src/services/update/strategies/ListUpdateStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ListUpdateStrategy.js","sourceRoot":"","sources":["../../../../src/services/update/strategies/ListUpdateStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AACxF,OAAO,EACL,wBAAwB,EACxB,SAAS,GACV,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IAC7B,KAAK,CAAC,MAAM,CACV,QAAgB,EAChB,MAA+B,EAC/B,YAAmC;QAEnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,OAAO;gBACL,GAAG,IAAI;gBACP,EAAE,EAAE;oBACF,GAAG,IAAI,CAAC,EAAE;oBACV,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO;iBACzB;gBACD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;aAC9B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,IAAI,YAAY,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACvD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtB,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/D,MAAM,IAAI,wBAAwB,CAChC,YAAY,EACZ,SAAS,CAAC,UAAU,EACpB;wBACE,UAAU;wBACV,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;qBAChB,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Value Transformer Service
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates automatic value transformations before API calls to prevent
|
|
5
|
+
* common LLM errors when creating/updating records.
|
|
6
|
+
*
|
|
7
|
+
* Transformations:
|
|
8
|
+
* - Status fields: "Demo Scheduling" → [{status: "uuid"}]
|
|
9
|
+
* - Multi-select fields: "Inbound" → ["Inbound"]
|
|
10
|
+
* - Record-reference fields: "uuid" → [{target_object: "X", target_record_id: "uuid"}] (Issue #997)
|
|
11
|
+
*
|
|
12
|
+
* @module services/value-transformer
|
|
13
|
+
*/
|
|
14
|
+
import { TransformContext, RecordTransformResult } from './types.js';
|
|
15
|
+
import { clearStatusCache } from './status-transformer.js';
|
|
16
|
+
import { clearSelectCache } from './select-transformer.js';
|
|
17
|
+
import { UniversalResourceType } from '../../handlers/tool-configs/universal/types.js';
|
|
18
|
+
export * from './types.js';
|
|
19
|
+
export { clearStatusCache, clearSelectCache };
|
|
20
|
+
/**
|
|
21
|
+
* Clear all transformer caches (useful for testing)
|
|
22
|
+
* @see Issue #984 - Now uses CachingService instead of local cache
|
|
23
|
+
*/
|
|
24
|
+
export declare function clearAllCaches(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Transform record values before API call
|
|
27
|
+
*
|
|
28
|
+
* @param recordData - The record data to transform
|
|
29
|
+
* @param context - Transformation context (resourceType, operation, recordId)
|
|
30
|
+
* @returns Transformed record data with transformation details
|
|
31
|
+
*/
|
|
32
|
+
export declare function transformRecordValues(recordData: Record<string, unknown>, context: TransformContext): Promise<RecordTransformResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a record has fields that may need transformation
|
|
35
|
+
* (Quick check without actually fetching metadata)
|
|
36
|
+
*
|
|
37
|
+
* TRADE-OFF: This function is intentionally PERMISSIVE.
|
|
38
|
+
*
|
|
39
|
+
* Issue #992: We can't know which custom fields are multi-select without fetching
|
|
40
|
+
* metadata from the API. Rather than miss a multi-select field and cause an API
|
|
41
|
+
* error, we trigger transformation for any unknown string field.
|
|
42
|
+
*
|
|
43
|
+
* Issue #997: Record-reference fields also need transformation to format
|
|
44
|
+
* record IDs to [{target_object, target_record_id}] format.
|
|
45
|
+
*
|
|
46
|
+
* Implications:
|
|
47
|
+
* - Some fields will trigger transformation unnecessarily (false positives)
|
|
48
|
+
* - First request per resource type incurs metadata API call (then cached)
|
|
49
|
+
* - This is better than the alternative: silent failures on custom multi-selects
|
|
50
|
+
*
|
|
51
|
+
* Tuning levers if performance becomes an issue:
|
|
52
|
+
* - Expand `definitelyNotMultiSelect` with common text field patterns
|
|
53
|
+
* - Monitor false-positive rate via logging
|
|
54
|
+
* - Consider workspace-specific caching of field types
|
|
55
|
+
*/
|
|
56
|
+
export declare function mayNeedTransformation(recordData: Record<string, unknown>, resourceType: UniversalResourceType): boolean;
|
|
57
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/value-transformer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EAGtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAEL,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAQnF,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AA2DD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAiLhC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAiIT"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Value Transformer Service
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates automatic value transformations before API calls to prevent
|
|
5
|
+
* common LLM errors when creating/updating records.
|
|
6
|
+
*
|
|
7
|
+
* Transformations:
|
|
8
|
+
* - Status fields: "Demo Scheduling" → [{status: "uuid"}]
|
|
9
|
+
* - Multi-select fields: "Inbound" → ["Inbound"]
|
|
10
|
+
* - Record-reference fields: "uuid" → [{target_object: "X", target_record_id: "uuid"}] (Issue #997)
|
|
11
|
+
*
|
|
12
|
+
* @module services/value-transformer
|
|
13
|
+
*/
|
|
14
|
+
import { transformStatusValue, clearStatusCache, } from './status-transformer.js';
|
|
15
|
+
import { transformMultiSelectValue } from './multi-select-transformer.js';
|
|
16
|
+
import { transformSelectValue, clearSelectCache, } from './select-transformer.js';
|
|
17
|
+
import { transformRecordReferenceValue, isCorrectRecordReferenceFormat, } from './record-reference-transformer.js';
|
|
18
|
+
import { convertToMetadataMap } from '../../utils/metadata-utils.js';
|
|
19
|
+
import { handleUniversalDiscoverAttributes } from '../../handlers/tool-configs/universal/shared-handlers.js';
|
|
20
|
+
import { debug, error as logError, OperationType } from '../../utils/logger.js';
|
|
21
|
+
import { CachingService } from '../../services/CachingService.js';
|
|
22
|
+
import { DEFAULT_ATTRIBUTES_CACHE_TTL } from '../../constants/universal.constants.js';
|
|
23
|
+
// Re-export types
|
|
24
|
+
export * from './types.js';
|
|
25
|
+
export { clearStatusCache, clearSelectCache };
|
|
26
|
+
/**
|
|
27
|
+
* Clear all transformer caches (useful for testing)
|
|
28
|
+
* @see Issue #984 - Now uses CachingService instead of local cache
|
|
29
|
+
*/
|
|
30
|
+
export function clearAllCaches() {
|
|
31
|
+
CachingService.clearAttributesCache();
|
|
32
|
+
clearStatusCache();
|
|
33
|
+
clearSelectCache();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get attribute metadata for a resource type with caching
|
|
37
|
+
* @see Issue #984 - Now uses CachingService with TTL and accepts provided metadata
|
|
38
|
+
*/
|
|
39
|
+
async function getAttributeMetadata(resourceType, providedMetadata) {
|
|
40
|
+
// Use provided metadata if available (avoid duplicate fetch)
|
|
41
|
+
if (providedMetadata && providedMetadata.size > 0) {
|
|
42
|
+
debug('value-transformer', 'Using pre-fetched metadata from parent', { resourceType, attributeCount: providedMetadata.size }, 'getAttributeMetadata', OperationType.DATA_PROCESSING);
|
|
43
|
+
return providedMetadata;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
// Use CachingService with TTL instead of local cache
|
|
47
|
+
const result = await CachingService.getOrLoadAttributes(async () => {
|
|
48
|
+
const schema = await handleUniversalDiscoverAttributes(resourceType);
|
|
49
|
+
return schema;
|
|
50
|
+
}, resourceType, undefined, DEFAULT_ATTRIBUTES_CACHE_TTL);
|
|
51
|
+
debug('value-transformer', 'Fetched attribute metadata', {
|
|
52
|
+
resourceType,
|
|
53
|
+
fromCache: result.fromCache,
|
|
54
|
+
}, 'getAttributeMetadata', OperationType.DATA_PROCESSING);
|
|
55
|
+
return convertToMetadataMap(result.data);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
logError('value-transformer', `Failed to fetch attribute metadata for ${resourceType}`, err);
|
|
59
|
+
return new Map();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Note: convertToMetadataMap() moved to @/utils/metadata-utils.js (PR #1006 Phase 2.1)
|
|
63
|
+
// This eliminates duplication between value-transformer and MetadataResolver
|
|
64
|
+
/**
|
|
65
|
+
* Transform record values before API call
|
|
66
|
+
*
|
|
67
|
+
* @param recordData - The record data to transform
|
|
68
|
+
* @param context - Transformation context (resourceType, operation, recordId)
|
|
69
|
+
* @returns Transformed record data with transformation details
|
|
70
|
+
*/
|
|
71
|
+
export async function transformRecordValues(recordData, context) {
|
|
72
|
+
const transformations = [];
|
|
73
|
+
const warnings = [];
|
|
74
|
+
const transformedData = {};
|
|
75
|
+
// Get attribute metadata for this resource type
|
|
76
|
+
// Issue #984: Use provided metadata if available to avoid duplicate API fetch
|
|
77
|
+
const attributeMetadata = await getAttributeMetadata(context.resourceType, context.attributeMetadata);
|
|
78
|
+
debug('value-transformer', `Starting transformation for ${context.resourceType}`, {
|
|
79
|
+
operation: context.operation,
|
|
80
|
+
fieldCount: Object.keys(recordData).length,
|
|
81
|
+
knownAttributes: attributeMetadata.size,
|
|
82
|
+
}, 'transformRecordValues', OperationType.DATA_PROCESSING);
|
|
83
|
+
// Process each field
|
|
84
|
+
for (const [field, value] of Object.entries(recordData)) {
|
|
85
|
+
const attrMeta = attributeMetadata.get(field);
|
|
86
|
+
// If no metadata found, pass through unchanged
|
|
87
|
+
if (!attrMeta) {
|
|
88
|
+
transformedData[field] = value;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Try status transformation
|
|
92
|
+
try {
|
|
93
|
+
const statusResult = await transformStatusValue(value, field, context, attrMeta);
|
|
94
|
+
if (statusResult.transformed) {
|
|
95
|
+
transformedData[field] = statusResult.transformedValue;
|
|
96
|
+
transformations.push({
|
|
97
|
+
field,
|
|
98
|
+
from: statusResult.originalValue,
|
|
99
|
+
to: statusResult.transformedValue,
|
|
100
|
+
type: 'status_title_to_id',
|
|
101
|
+
description: statusResult.description || 'Status value transformed',
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
// Status transformation threw an error (invalid value)
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
110
|
+
// Try multi-select transformation
|
|
111
|
+
try {
|
|
112
|
+
const multiSelectResult = await transformMultiSelectValue(value, field, context, attrMeta);
|
|
113
|
+
if (multiSelectResult.transformed) {
|
|
114
|
+
transformedData[field] = multiSelectResult.transformedValue;
|
|
115
|
+
transformations.push({
|
|
116
|
+
field,
|
|
117
|
+
from: multiSelectResult.originalValue,
|
|
118
|
+
to: multiSelectResult.transformedValue,
|
|
119
|
+
type: 'multi_select_wrap',
|
|
120
|
+
description: multiSelectResult.description || 'Multi-select value wrapped',
|
|
121
|
+
});
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
// Multi-select transformation threw an error
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
// Issue #1019: Try single-select transformation
|
|
130
|
+
try {
|
|
131
|
+
const selectResult = await transformSelectValue(value, field, context, attrMeta);
|
|
132
|
+
if (selectResult.transformed) {
|
|
133
|
+
transformedData[field] = selectResult.transformedValue;
|
|
134
|
+
transformations.push({
|
|
135
|
+
field,
|
|
136
|
+
from: selectResult.originalValue,
|
|
137
|
+
to: selectResult.transformedValue,
|
|
138
|
+
type: 'select_title_to_array',
|
|
139
|
+
description: selectResult.description || 'Select value transformed',
|
|
140
|
+
});
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
// Select transformation threw an error
|
|
146
|
+
throw err;
|
|
147
|
+
}
|
|
148
|
+
// Issue #997: Try record-reference transformation
|
|
149
|
+
try {
|
|
150
|
+
const refResult = await transformRecordReferenceValue(value, field, context, attrMeta);
|
|
151
|
+
if (refResult.transformed) {
|
|
152
|
+
transformedData[field] = refResult.transformedValue;
|
|
153
|
+
transformations.push({
|
|
154
|
+
field,
|
|
155
|
+
from: refResult.originalValue,
|
|
156
|
+
to: refResult.transformedValue,
|
|
157
|
+
type: 'record_reference_format',
|
|
158
|
+
description: refResult.description || 'Record reference formatted',
|
|
159
|
+
});
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
// Record-reference transformation threw an error
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
// No transformation applied, pass through unchanged
|
|
168
|
+
transformedData[field] = value;
|
|
169
|
+
// Issue #992: Debug logging for false-positive measurement
|
|
170
|
+
// Helps evaluate if mayNeedTransformation() is triggering too often for non-multi-select fields
|
|
171
|
+
if (attrMeta && !attrMeta.is_multiselect && typeof value === 'string') {
|
|
172
|
+
debug('value-transformer', 'Non-multi-select string field passed through unchanged', {
|
|
173
|
+
field,
|
|
174
|
+
resourceType: context.resourceType,
|
|
175
|
+
attrType: attrMeta.type,
|
|
176
|
+
}, 'transformRecordValues', OperationType.DATA_PROCESSING);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Log transformation summary
|
|
180
|
+
if (transformations.length > 0) {
|
|
181
|
+
debug('value-transformer', `Completed transformation`, {
|
|
182
|
+
transformationCount: transformations.length,
|
|
183
|
+
transformations: transformations.map((t) => ({
|
|
184
|
+
field: t.field,
|
|
185
|
+
type: t.type,
|
|
186
|
+
})),
|
|
187
|
+
}, 'transformRecordValues', OperationType.DATA_PROCESSING);
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
data: transformedData,
|
|
191
|
+
transformations,
|
|
192
|
+
warnings,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Check if a record has fields that may need transformation
|
|
197
|
+
* (Quick check without actually fetching metadata)
|
|
198
|
+
*
|
|
199
|
+
* TRADE-OFF: This function is intentionally PERMISSIVE.
|
|
200
|
+
*
|
|
201
|
+
* Issue #992: We can't know which custom fields are multi-select without fetching
|
|
202
|
+
* metadata from the API. Rather than miss a multi-select field and cause an API
|
|
203
|
+
* error, we trigger transformation for any unknown string field.
|
|
204
|
+
*
|
|
205
|
+
* Issue #997: Record-reference fields also need transformation to format
|
|
206
|
+
* record IDs to [{target_object, target_record_id}] format.
|
|
207
|
+
*
|
|
208
|
+
* Implications:
|
|
209
|
+
* - Some fields will trigger transformation unnecessarily (false positives)
|
|
210
|
+
* - First request per resource type incurs metadata API call (then cached)
|
|
211
|
+
* - This is better than the alternative: silent failures on custom multi-selects
|
|
212
|
+
*
|
|
213
|
+
* Tuning levers if performance becomes an issue:
|
|
214
|
+
* - Expand `definitelyNotMultiSelect` with common text field patterns
|
|
215
|
+
* - Monitor false-positive rate via logging
|
|
216
|
+
* - Consider workspace-specific caching of field types
|
|
217
|
+
*/
|
|
218
|
+
export function mayNeedTransformation(recordData, resourceType) {
|
|
219
|
+
// Known status fields by resource type
|
|
220
|
+
const statusFields = {
|
|
221
|
+
deals: ['stage'],
|
|
222
|
+
tasks: ['status'],
|
|
223
|
+
};
|
|
224
|
+
// Issue #997: Known record-reference fields by resource type
|
|
225
|
+
const recordReferenceFields = {
|
|
226
|
+
people: ['company'],
|
|
227
|
+
deals: ['associated_company', 'associated_people'],
|
|
228
|
+
companies: ['main_contact'],
|
|
229
|
+
};
|
|
230
|
+
// Known multi-select fields (workspace-specific, so we check common patterns)
|
|
231
|
+
// Issue #992: Added 'channel' based on user feedback
|
|
232
|
+
const multiSelectIndicators = [
|
|
233
|
+
'categories',
|
|
234
|
+
'tags',
|
|
235
|
+
'types',
|
|
236
|
+
'lead_type',
|
|
237
|
+
'inbound_outbound',
|
|
238
|
+
'channel', // Added per Issue #992 feedback
|
|
239
|
+
];
|
|
240
|
+
// Issue #997: Record-reference field name patterns
|
|
241
|
+
const recordReferenceIndicators = [
|
|
242
|
+
'company',
|
|
243
|
+
'person',
|
|
244
|
+
'people',
|
|
245
|
+
'contact',
|
|
246
|
+
'owner',
|
|
247
|
+
'assignee',
|
|
248
|
+
'associated_',
|
|
249
|
+
];
|
|
250
|
+
// Fields that are definitely NOT multi-select (optimization to avoid unnecessary API calls)
|
|
251
|
+
const definitelyNotMultiSelect = [
|
|
252
|
+
'name',
|
|
253
|
+
'description',
|
|
254
|
+
'notes',
|
|
255
|
+
'email',
|
|
256
|
+
'phone',
|
|
257
|
+
'website',
|
|
258
|
+
'domain',
|
|
259
|
+
'address',
|
|
260
|
+
'title',
|
|
261
|
+
'content',
|
|
262
|
+
'id',
|
|
263
|
+
'record_id',
|
|
264
|
+
];
|
|
265
|
+
const resourceKey = resourceType.toLowerCase();
|
|
266
|
+
const knownStatusFields = statusFields[resourceKey] || [];
|
|
267
|
+
const knownRefFields = recordReferenceFields[resourceKey] || [];
|
|
268
|
+
const isAlreadyNormalizedStatusArray = (value) => {
|
|
269
|
+
if (!Array.isArray(value) || value.length === 0)
|
|
270
|
+
return false;
|
|
271
|
+
const first = value[0];
|
|
272
|
+
if (!first || typeof first !== 'object' || Array.isArray(first))
|
|
273
|
+
return false;
|
|
274
|
+
return 'status' in first;
|
|
275
|
+
};
|
|
276
|
+
for (const field of Object.keys(recordData)) {
|
|
277
|
+
const value = recordData[field];
|
|
278
|
+
const fieldLower = field.toLowerCase();
|
|
279
|
+
// Skip null/undefined values - they don't need transformation
|
|
280
|
+
if (value === null || value === undefined) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
// Issue #997: Check if it's a known record-reference field that may need formatting
|
|
284
|
+
// Record-reference fields can be strings, objects, or arrays - all may need transformation
|
|
285
|
+
if (knownRefFields.includes(field)) {
|
|
286
|
+
// Only skip if already in correct format (uses shared helper to avoid duplication)
|
|
287
|
+
if (isCorrectRecordReferenceFormat(value)) {
|
|
288
|
+
continue; // Already in correct format
|
|
289
|
+
}
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
// Skip arrays for other checks - they don't need multi-select transformation
|
|
293
|
+
if (Array.isArray(value)) {
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
// Check if it's a known status field (deals.stage, tasks.status) that needs normalization
|
|
297
|
+
if (knownStatusFields.includes(field)) {
|
|
298
|
+
// Strings always need transformation (title → id)
|
|
299
|
+
if (typeof value === 'string')
|
|
300
|
+
return true;
|
|
301
|
+
// Accept already-normalized Attio array shape
|
|
302
|
+
if (isAlreadyNormalizedStatusArray(value))
|
|
303
|
+
continue;
|
|
304
|
+
// Any other non-null shape (object / legacy / wrong array) should trigger normalization
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
// Check if it matches known multi-select indicator patterns
|
|
308
|
+
if (multiSelectIndicators.some((indicator) => fieldLower.includes(indicator))) {
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
// Issue #997: Check if field name suggests record-reference
|
|
312
|
+
if (recordReferenceIndicators.some((indicator) => fieldLower.includes(indicator)) &&
|
|
313
|
+
(typeof value === 'string' || typeof value === 'object')) {
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
// Issue #992: For any string value on a field that's NOT definitely-not-multi-select,
|
|
317
|
+
// trigger transformation to let the actual metadata check determine if it's multi-select
|
|
318
|
+
if (typeof value === 'string' &&
|
|
319
|
+
!definitelyNotMultiSelect.some((safe) => fieldLower.includes(safe))) {
|
|
320
|
+
// This is a potential multi-select field - trigger full transformation
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=index.js.map
|