attio-mcp 1.3.5 → 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 +263 -9
- package/README.md +315 -235
- 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 +59 -29
- 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.map +1 -1
- package/dist/api/operations/batch.js +3 -1
- package/dist/api/operations/batch.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/tasks.d.ts.map +1 -1
- package/dist/handlers/tool-configs/tasks.js +28 -0
- package/dist/handlers/tool-configs/tasks.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.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/crud-operations.js +52 -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.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/notes-operations.js +27 -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.map +1 -1
- package/dist/handlers/tool-configs/universal/core/record-details-operations.js +20 -3
- 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.map +1 -1
- package/dist/handlers/tool-configs/universal/core/search-operations.js +11 -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/tool-types.d.ts +9 -0
- package/dist/handlers/tool-types.d.ts.map +1 -1
- package/dist/handlers/tools/dispatcher/core.d.ts.map +1 -1
- package/dist/handlers/tools/dispatcher/core.js +24 -5
- 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 +28 -25
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the value transformer service
|
|
3
|
+
* Auto-transforms values before API calls to prevent common errors
|
|
4
|
+
*/
|
|
5
|
+
import { UniversalResourceType } from '../../handlers/tool-configs/universal/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Context provided to transformers
|
|
8
|
+
*/
|
|
9
|
+
export interface TransformContext {
|
|
10
|
+
/** The resource type being operated on */
|
|
11
|
+
resourceType: UniversalResourceType;
|
|
12
|
+
/** The operation type (create or update) */
|
|
13
|
+
operation: 'create' | 'update';
|
|
14
|
+
/** Optional record ID for updates */
|
|
15
|
+
recordId?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Optional pre-fetched attribute metadata to avoid duplicate API calls
|
|
18
|
+
* @see Issue #984 - Consolidate metadata fetching
|
|
19
|
+
*/
|
|
20
|
+
attributeMetadata?: Map<string, AttributeMetadata>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of a transformation
|
|
24
|
+
*/
|
|
25
|
+
export interface TransformResult {
|
|
26
|
+
/** Whether transformation was applied */
|
|
27
|
+
transformed: boolean;
|
|
28
|
+
/** The original value */
|
|
29
|
+
originalValue: unknown;
|
|
30
|
+
/** The transformed value (same as original if not transformed) */
|
|
31
|
+
transformedValue: unknown;
|
|
32
|
+
/** Human-readable description of what was transformed */
|
|
33
|
+
description?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Result of transforming an entire record
|
|
37
|
+
*/
|
|
38
|
+
export interface RecordTransformResult {
|
|
39
|
+
/** The transformed record data */
|
|
40
|
+
data: Record<string, unknown>;
|
|
41
|
+
/** List of transformations applied */
|
|
42
|
+
transformations: FieldTransformation[];
|
|
43
|
+
/** Warnings about potential issues */
|
|
44
|
+
warnings: string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Details about a single field transformation
|
|
48
|
+
*/
|
|
49
|
+
export interface FieldTransformation {
|
|
50
|
+
/** Field name that was transformed */
|
|
51
|
+
field: string;
|
|
52
|
+
/** Original value */
|
|
53
|
+
from: unknown;
|
|
54
|
+
/** Transformed value */
|
|
55
|
+
to: unknown;
|
|
56
|
+
/** Type of transformation applied */
|
|
57
|
+
type: TransformationType;
|
|
58
|
+
/** Human-readable description */
|
|
59
|
+
description: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Types of transformations supported
|
|
63
|
+
*/
|
|
64
|
+
export type TransformationType = 'status_title_to_id' | 'multi_select_wrap' | 'select_title_to_array' | 'array_coercion' | 'record_reference_format';
|
|
65
|
+
/**
|
|
66
|
+
* Attribute metadata needed for transformation
|
|
67
|
+
*/
|
|
68
|
+
export interface AttributeMetadata {
|
|
69
|
+
slug: string;
|
|
70
|
+
type: string;
|
|
71
|
+
title?: string;
|
|
72
|
+
api_slug?: string;
|
|
73
|
+
is_system_attribute?: boolean;
|
|
74
|
+
is_writable?: boolean;
|
|
75
|
+
/** Indicates multi-select attribute (Attio uses type="select" + is_multiselect=true) */
|
|
76
|
+
is_multiselect?: boolean;
|
|
77
|
+
/** Relationship metadata for record-reference attributes (Issue #997) */
|
|
78
|
+
relationship?: {
|
|
79
|
+
/** Target object type (e.g., 'companies', 'people') */
|
|
80
|
+
object?: string;
|
|
81
|
+
/** Relationship cardinality (API may return any string) */
|
|
82
|
+
cardinality?: string;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Record reference value format expected by Attio API
|
|
87
|
+
*/
|
|
88
|
+
export interface RecordReferenceValue {
|
|
89
|
+
target_object: string;
|
|
90
|
+
target_record_id: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Option for select/status attributes
|
|
94
|
+
*/
|
|
95
|
+
export interface AttributeOption {
|
|
96
|
+
id: string;
|
|
97
|
+
title: string;
|
|
98
|
+
is_archived?: boolean;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/value-transformer/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,YAAY,EAAE,qBAAqB,CAAC;IACpC,4CAA4C;IAC5C,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,yBAAyB;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,sCAAsC;IACtC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,sCAAsC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,wBAAwB;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,qCAAqC;IACrC,IAAI,EAAE,kBAAkB,CAAC;IACzB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,oBAAoB,GACpB,mBAAmB,GACnB,uBAAuB,GACvB,gBAAgB,GAChB,yBAAyB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wFAAwF;IACxF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,YAAY,CAAC,EAAE;QACb,uDAAuD;QACvD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,2DAA2D;QAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/value-transformer/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: attio-workspace-schema
|
|
3
|
+
description: Use when working with Attio workspace data to know valid attributes, field names, and option values for {{#each metadata.objects}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Attio Workspace Schema Reference
|
|
7
|
+
|
|
8
|
+
**Generated**: {{metadata.generatedAt}}
|
|
9
|
+
**Objects**: {{#each metadata.objects}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}
|
|
10
|
+
|
|
11
|
+
⚠️ **CRITICAL: Display Name vs API Slug**
|
|
12
|
+
|
|
13
|
+
The #1 error source when working with Attio is using Display Names instead of API Slugs. **Always use API Slugs from the per-object files below.**
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Attribute Reference by Object
|
|
18
|
+
|
|
19
|
+
**Only open the file for the object you're working with** (progressive disclosure):
|
|
20
|
+
|
|
21
|
+
{{#each objects}}
|
|
22
|
+
|
|
23
|
+
- {{displayName}}: [resources/{{objectSlug}}-attributes.md](resources/{{objectSlug}}-attributes.md)
|
|
24
|
+
{{/each}}
|
|
25
|
+
|
|
26
|
+
Each file contains:
|
|
27
|
+
|
|
28
|
+
- Select/status option values
|
|
29
|
+
- Complete attribute specifications
|
|
30
|
+
- Relationship definitions
|
|
31
|
+
|
|
32
|
+
## Complex Type Structures
|
|
33
|
+
|
|
34
|
+
See [resources/complex-types.md](resources/complex-types.md) for:
|
|
35
|
+
|
|
36
|
+
- Location object structure (10 required fields)
|
|
37
|
+
- Personal name object structure
|
|
38
|
+
- Phone number formatting
|
|
39
|
+
- Email address handling
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Usage Guidelines
|
|
44
|
+
|
|
45
|
+
1. **Always use API Slugs**, never Display Names
|
|
46
|
+
- ❌ Wrong: `{"Team size": "51-200"}`
|
|
47
|
+
- ✅ Correct: `{"team_size": "51-200"}`
|
|
48
|
+
|
|
49
|
+
2. **Check multi-select flag** before sending values
|
|
50
|
+
- Multi-select (✓): Send array `["value1", "value2"]`
|
|
51
|
+
- Single-select (✗): Send string `"value1"`
|
|
52
|
+
|
|
53
|
+
3. **Use exact option titles (slugs)** from the tables
|
|
54
|
+
- Per Attio docs, select option slugs are the title field
|
|
55
|
+
- Case-sensitive
|
|
56
|
+
|
|
57
|
+
4. **Complex types require specific object structures**
|
|
58
|
+
- Location: All 10 fields must be present (use `null` for empty)
|
|
59
|
+
- Personal-name: Minimum `first_name` required
|
|
60
|
+
- See resources/complex-types.md for details
|
|
61
|
+
|
|
62
|
+
5. **When unsure, use MCP discovery tools**:
|
|
63
|
+
- `records_discover_attributes` - Get attribute metadata
|
|
64
|
+
- `records_get_attribute_options` - Get valid select/status values
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## When to Use This Skill
|
|
69
|
+
|
|
70
|
+
Use this skill when:
|
|
71
|
+
|
|
72
|
+
- Creating or updating Attio records
|
|
73
|
+
- Filtering or searching by specific attributes
|
|
74
|
+
- Validating attribute values before API calls
|
|
75
|
+
- Understanding field requirements and constraints
|
|
76
|
+
- Working with select/status fields and need valid option values
|
|
77
|
+
|
|
78
|
+
> ⚠️ **This schema may become outdated.** When in doubt, verify with MCP discovery tools listed above.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# {{#each objects}}{{displayName}}{{/each}} Attributes
|
|
2
|
+
|
|
3
|
+
⚠️ **Always use API Slugs, never Display Names**
|
|
4
|
+
|
|
5
|
+
{{#each objects}}
|
|
6
|
+
|
|
7
|
+
## Display Name → API Slug Mapping
|
|
8
|
+
|
|
9
|
+
| Display Name | API Slug | Type | Multi | Required | Unique |
|
|
10
|
+
| ------------ | -------- | ---- | ----- | -------- | ------ |
|
|
11
|
+
|
|
12
|
+
{{#each attributes}}
|
|
13
|
+
| {{displayName}} | `{{apiSlug}}` | {{type}} | {{#if isMultiselect}}✓{{else}}✗{{/if}} | {{#if isRequired}}✓{{else}}✗{{/if}} | {{#if isUnique}}✓{{else}}✗{{/if}} |
|
|
14
|
+
{{/each}}
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Detailed Specifications
|
|
19
|
+
|
|
20
|
+
{{#each attributes}}
|
|
21
|
+
|
|
22
|
+
### {{displayName}} (`{{apiSlug}}`)
|
|
23
|
+
|
|
24
|
+
**Type**: `{{type}}`{{#if isMultiselect}} _(multi-select)_{{/if}}{{#if isRequired}} _(required)_{{/if}}{{#if isUnique}} _(unique)_{{/if}}{{#unless isWritable}} _(read-only)_{{/unless}}{{#if description}}
|
|
25
|
+
**Description**: {{{description}}}{{/if}}
|
|
26
|
+
{{#if options}}
|
|
27
|
+
**Options**: {{#each options}}{{{title}}}{{#unless @last}}, {{/unless}}{{/each}}{{#if optionsTruncated}} _(showing {{options.length}} of {{totalOptions}})_{{/if}}
|
|
28
|
+
{{/if}}
|
|
29
|
+
{{#if complexTypeStructure}}
|
|
30
|
+
**Structure**:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{{{json complexTypeStructure}}}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
{{/if}}
|
|
37
|
+
{{#if relationship}}
|
|
38
|
+
**Relationship**:
|
|
39
|
+
|
|
40
|
+
- Target Object: `{{relationship.targetObject}}`
|
|
41
|
+
- Cardinality: {{relationship.cardinality}}
|
|
42
|
+
{{/if}}
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
{{/each}}
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## ⚠️ Common Pitfalls
|
|
51
|
+
|
|
52
|
+
### 1. Option Fields: Status vs Select Behavior
|
|
53
|
+
|
|
54
|
+
**Status fields** (type: `status`) - Auto-converts human-readable titles:
|
|
55
|
+
|
|
56
|
+
- ✅ Use title: `stage: "Demo Scheduling"`
|
|
57
|
+
- ✅ Already converts to: `{ status_id: "uuid" }`
|
|
58
|
+
- Titles are case-insensitive and support partial matching
|
|
59
|
+
|
|
60
|
+
**Select fields** (type: `select`) - Accepts titles OR UUIDs:
|
|
61
|
+
|
|
62
|
+
- ✅ Use title: `lead_type: ["Potential Customer"]`
|
|
63
|
+
- ✅ Use UUID: `lead_type: ["8f6ac4eb-6ab6-40be-909a-29042d3674e7"]`
|
|
64
|
+
- Titles are case-sensitive (exact match required)
|
|
65
|
+
- Multi-select fields must always use arrays (even for single values)
|
|
66
|
+
|
|
67
|
+
**Both field types accept exact titles** - Use whichever is more convenient for your use case
|
|
68
|
+
|
|
69
|
+
### 2. Array Fields: Always Use Arrays
|
|
70
|
+
|
|
71
|
+
These field types **require arrays** even for single values:
|
|
72
|
+
|
|
73
|
+
**Multi-select fields** (marked with ✓ in Multi column):
|
|
74
|
+
|
|
75
|
+
- ❌ Wrong: `domains: "example.com"`
|
|
76
|
+
- ✅ Correct: `domains: ["example.com"]`
|
|
77
|
+
|
|
78
|
+
**Select fields** (even single-select):
|
|
79
|
+
|
|
80
|
+
- ❌ Wrong: `lead_type: "uuid"`
|
|
81
|
+
- ✅ Correct: `lead_type: ["uuid"]`
|
|
82
|
+
|
|
83
|
+
**Record references** (actor-reference, record-reference types):
|
|
84
|
+
|
|
85
|
+
- ❌ Wrong: `team: "person_id"`
|
|
86
|
+
- ✅ Correct: `team: ["person_id"]`
|
|
87
|
+
|
|
88
|
+
**Common error**: `"expects array"` or `"invalid type"`
|
|
89
|
+
|
|
90
|
+
### 3. Data Type Formatting
|
|
91
|
+
|
|
92
|
+
Types must match exactly:
|
|
93
|
+
|
|
94
|
+
**Number fields**:
|
|
95
|
+
|
|
96
|
+
- ✅ Correct: `lead_score: 85`
|
|
97
|
+
- ❌ Wrong: `lead_score: "85"` or `lead_score: "8.5/10"`
|
|
98
|
+
|
|
99
|
+
**Boolean fields** (checkbox type):
|
|
100
|
+
|
|
101
|
+
- ✅ Correct: `has_weight_loss_program_boolean: true`
|
|
102
|
+
- ❌ Wrong: `has_weight_loss_program_boolean: "true"`
|
|
103
|
+
|
|
104
|
+
**Date fields**:
|
|
105
|
+
|
|
106
|
+
- ✅ Correct: `foundation_date: "2024-12-14"`
|
|
107
|
+
- ❌ Wrong: `foundation_date: "December 14, 2024"`
|
|
108
|
+
|
|
109
|
+
### 4. Read-Only Fields
|
|
110
|
+
|
|
111
|
+
Fields marked as _(read-only)_ cannot be updated:
|
|
112
|
+
|
|
113
|
+
- `record_id`, `created_at`, `created_by`, interaction fields
|
|
114
|
+
|
|
115
|
+
Attempting to update read-only fields will cause API errors.
|
|
116
|
+
|
|
117
|
+
### 5. Complex Type Structures
|
|
118
|
+
|
|
119
|
+
Location, personal-name, phone-number, and email-address types require **complete object structures**. See [complex-types.md](complex-types.md) for required field formats.
|
|
120
|
+
|
|
121
|
+
**Common mistake**: Sending incomplete location objects
|
|
122
|
+
|
|
123
|
+
- ❌ Wrong: `primary_location: {locality: "San Francisco"}`
|
|
124
|
+
- ✅ Correct: All 10 location fields must be present (use `null` for empty fields)
|
|
125
|
+
|
|
126
|
+
{{/each}}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
# Complex Type Structures
|
|
2
|
+
|
|
3
|
+
This document provides detailed structure requirements for complex Attio attribute types.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Location
|
|
8
|
+
|
|
9
|
+
Attio requires **ALL 10 fields** to be present when writing location attributes. Use `null` for empty fields.
|
|
10
|
+
|
|
11
|
+
### Required Structure
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
{
|
|
15
|
+
line_1: string | null, // Street address
|
|
16
|
+
line_2: string | null, // Apt/Suite
|
|
17
|
+
line_3: string | null, // Additional address line
|
|
18
|
+
line_4: string | null, // Additional address line
|
|
19
|
+
locality: string | null, // City
|
|
20
|
+
region: string | null, // State/Province
|
|
21
|
+
postcode: string | null, // ZIP/Postal code
|
|
22
|
+
country_code: string | null, // ISO country code (e.g., "US", "GB")
|
|
23
|
+
latitude: number | null, // Coordinates
|
|
24
|
+
longitude: number | null // Coordinates
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Common Mistakes
|
|
29
|
+
|
|
30
|
+
❌ **Wrong**: Missing fields
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"line_1": "123 Main St",
|
|
35
|
+
"locality": "New York"
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
✅ **Correct**: All fields present
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"line_1": "123 Main St",
|
|
44
|
+
"line_2": null,
|
|
45
|
+
"line_3": null,
|
|
46
|
+
"line_4": null,
|
|
47
|
+
"locality": "New York",
|
|
48
|
+
"region": "NY",
|
|
49
|
+
"postcode": "10001",
|
|
50
|
+
"country_code": "US",
|
|
51
|
+
"latitude": null,
|
|
52
|
+
"longitude": null
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Common Field Aliases
|
|
57
|
+
|
|
58
|
+
These are NOT valid - always use the exact field names above:
|
|
59
|
+
|
|
60
|
+
- `city` → Use `locality`
|
|
61
|
+
- `state` → Use `region`
|
|
62
|
+
- `zip` → Use `postcode`
|
|
63
|
+
- `country` → Use `country_code`
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Personal Name
|
|
68
|
+
|
|
69
|
+
### Required Structure
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
{
|
|
73
|
+
first_name: string, // Required
|
|
74
|
+
last_name: string | null,
|
|
75
|
+
middle_name: string | null,
|
|
76
|
+
title: string | null, // e.g., "Dr.", "Prof.", "Mr."
|
|
77
|
+
full_name: string // Auto-generated by Attio
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### String Parsing
|
|
82
|
+
|
|
83
|
+
When Attio receives a string instead of an object, it will parse it:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
Input: "John Doe"
|
|
87
|
+
Parsed to:
|
|
88
|
+
{
|
|
89
|
+
"first_name": "John",
|
|
90
|
+
"last_name": "Doe",
|
|
91
|
+
"middle_name": null,
|
|
92
|
+
"title": null,
|
|
93
|
+
"full_name": "John Doe"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Examples
|
|
98
|
+
|
|
99
|
+
✅ **Correct**: Object format
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"first_name": "Jane",
|
|
104
|
+
"last_name": "Smith",
|
|
105
|
+
"middle_name": null,
|
|
106
|
+
"title": "Dr.",
|
|
107
|
+
"full_name": "Dr. Jane Smith"
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
✅ **Correct**: String format (auto-parsed)
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
"Jane Smith"
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Phone Number
|
|
120
|
+
|
|
121
|
+
### Required Structure
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
{
|
|
125
|
+
country_code: string, // e.g., "+1", "+44"
|
|
126
|
+
number: string, // Digits only (no formatting)
|
|
127
|
+
original_number: string // As provided by user
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Examples
|
|
132
|
+
|
|
133
|
+
✅ **Correct**:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"country_code": "+1",
|
|
138
|
+
"number": "5551234567",
|
|
139
|
+
"original_number": "(555) 123-4567"
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### String Parsing
|
|
144
|
+
|
|
145
|
+
Attio will attempt to parse phone number strings:
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
Input: "+1 (555) 123-4567"
|
|
149
|
+
Parsed to:
|
|
150
|
+
{
|
|
151
|
+
"country_code": "+1",
|
|
152
|
+
"number": "5551234567",
|
|
153
|
+
"original_number": "+1 (555) 123-4567"
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Email Address
|
|
160
|
+
|
|
161
|
+
### Required Structure
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
{
|
|
165
|
+
email_address: string; // Must be valid email format
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Examples
|
|
170
|
+
|
|
171
|
+
✅ **Correct**: Object format
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"email_address": "jane@example.com"
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
✅ **Correct**: String format (auto-converted)
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
"jane@example.com"
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Usage in API Calls
|
|
188
|
+
|
|
189
|
+
### Creating Records with Complex Types
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// Example: Creating a company with location
|
|
193
|
+
{
|
|
194
|
+
"name": "Acme Corp",
|
|
195
|
+
"primary_location": {
|
|
196
|
+
"line_1": "123 Main St",
|
|
197
|
+
"line_2": null,
|
|
198
|
+
"line_3": null,
|
|
199
|
+
"line_4": null,
|
|
200
|
+
"locality": "San Francisco",
|
|
201
|
+
"region": "CA",
|
|
202
|
+
"postcode": "94105",
|
|
203
|
+
"country_code": "US",
|
|
204
|
+
"latitude": null,
|
|
205
|
+
"longitude": null
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Updating Complex Type Fields
|
|
211
|
+
|
|
212
|
+
When updating, you must provide the **complete structure**, even if only changing one field:
|
|
213
|
+
|
|
214
|
+
❌ **Wrong**: Partial update
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"primary_location": {
|
|
219
|
+
"line_1": "456 New St"
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
✅ **Correct**: Complete structure
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"primary_location": {
|
|
229
|
+
"line_1": "456 New St",
|
|
230
|
+
"line_2": null,
|
|
231
|
+
"line_3": null,
|
|
232
|
+
"line_4": null,
|
|
233
|
+
"locality": "San Francisco",
|
|
234
|
+
"region": "CA",
|
|
235
|
+
"postcode": "94105",
|
|
236
|
+
"country_code": "US",
|
|
237
|
+
"latitude": null,
|
|
238
|
+
"longitude": null
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Need Help?
|
|
246
|
+
|
|
247
|
+
If you encounter errors with complex types:
|
|
248
|
+
|
|
249
|
+
1. **Verify structure completeness**: All required fields present?
|
|
250
|
+
2. **Check field names**: Exact match (case-sensitive)?
|
|
251
|
+
3. **Use MCP discovery tools**:
|
|
252
|
+
- `records_discover_attributes` - Get attribute metadata
|
|
253
|
+
- Check the attribute's type to confirm it's a complex type
|
|
254
|
+
|
|
255
|
+
For the most up-to-date structures, always verify with the MCP discovery tools.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/client-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"client-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/client-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAmEtC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CA4ElD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,aAAa,CAOtE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAIvD"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import * as AttioClientModule from '../api/attio-client.js';
|
|
6
6
|
import { getContextApiKey } from '../api/client-context.js';
|
|
7
|
+
import { createScopedLogger } from './logger.js';
|
|
8
|
+
const logger = createScopedLogger('client-resolver');
|
|
7
9
|
/**
|
|
8
10
|
* Guards that the resolved value behaves like an Axios instance. We keep the
|
|
9
11
|
* checks intentionally simple so tests can provide lightweight mocks.
|
|
@@ -33,9 +35,7 @@ function assertAxiosInstance(value, source) {
|
|
|
33
35
|
? Object.keys(candidate).slice(0, 10)
|
|
34
36
|
: [],
|
|
35
37
|
};
|
|
36
|
-
|
|
37
|
-
console.error(`[client-resolver:assertAxiosInstance] Validation failed for ${source}:`, diagnostics);
|
|
38
|
-
}
|
|
38
|
+
logger.debug(`Validation failed for ${source}`, diagnostics);
|
|
39
39
|
throw new Error(`${source} returned invalid Axios client instance (hasGetMethod=${hasGetMethod}, hasDefaults=${hasDefaults})`);
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -53,7 +53,7 @@ export function resolveAttioClient() {
|
|
|
53
53
|
const contextApiKey = getContextApiKey();
|
|
54
54
|
const envApiKey = process.env.ATTIO_API_KEY;
|
|
55
55
|
const resolvedApiKey = envApiKey || contextApiKey;
|
|
56
|
-
|
|
56
|
+
logger.debug('API key resolution', {
|
|
57
57
|
hasEnvApiKey: Boolean(envApiKey),
|
|
58
58
|
envKeyLength: envApiKey?.length || 0,
|
|
59
59
|
hasContextApiKey: Boolean(contextApiKey),
|
|
@@ -75,18 +75,14 @@ export function resolveAttioClient() {
|
|
|
75
75
|
// - API key resolution (env, context, config)
|
|
76
76
|
// This is the proven code path used throughout the codebase
|
|
77
77
|
if (typeof mod.getAttioClient === 'function') {
|
|
78
|
-
|
|
79
|
-
console.error('[client-resolver:resolve] Using getAttioClient()');
|
|
80
|
-
}
|
|
78
|
+
logger.debug('Using getAttioClient()');
|
|
81
79
|
const client = mod.getAttioClient();
|
|
82
80
|
assertAxiosInstance(client, 'getAttioClient()');
|
|
83
81
|
return client;
|
|
84
82
|
}
|
|
85
83
|
// Fallback to createAttioClient with config object
|
|
86
84
|
if (typeof mod.createAttioClient === 'function') {
|
|
87
|
-
|
|
88
|
-
console.error('[client-resolver:resolve] Fallback to createAttioClient(config)');
|
|
89
|
-
}
|
|
85
|
+
logger.debug('Fallback to createAttioClient(config)');
|
|
90
86
|
try {
|
|
91
87
|
const config = {};
|
|
92
88
|
const client = mod.createAttioClient(config);
|
|
@@ -94,9 +90,7 @@ export function resolveAttioClient() {
|
|
|
94
90
|
return client;
|
|
95
91
|
}
|
|
96
92
|
catch (error) {
|
|
97
|
-
|
|
98
|
-
console.error('[client-resolver:resolve] createAttioClient failed:', error);
|
|
99
|
-
}
|
|
93
|
+
logger.debug('createAttioClient failed', { error });
|
|
100
94
|
// Continue to last resort
|
|
101
95
|
}
|
|
102
96
|
}
|
|
@@ -108,9 +102,7 @@ export function resolveAttioClient() {
|
|
|
108
102
|
if (!resolvedApiKey) {
|
|
109
103
|
throw new Error('Attio API key is required for client initialization. Please set ATTIO_API_KEY environment variable.');
|
|
110
104
|
}
|
|
111
|
-
|
|
112
|
-
console.error('[client-resolver:resolve] Last resort: buildAttioClient');
|
|
113
|
-
}
|
|
105
|
+
logger.debug('Last resort: buildAttioClient');
|
|
114
106
|
const client = mod.buildAttioClient({ apiKey: resolvedApiKey });
|
|
115
107
|
assertAxiosInstance(client, 'buildAttioClient()');
|
|
116
108
|
return client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-resolver.js","sourceRoot":"","sources":["../../src/utils/client-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"client-resolver.js","sourceRoot":"","sources":["../../src/utils/client-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type UnknownRecord = Record<string, unknown>;
|
|
2
|
+
/**
|
|
3
|
+
* Validates and normalizes a location value. Ensures an object shape and adds all 10 fields.
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateLocationValue(value: unknown, fieldName: string): unknown;
|
|
6
|
+
/**
|
|
7
|
+
* Validates and normalizes a personal-name value.
|
|
8
|
+
* Accepts string or object with first_name/last_name/full_name.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validatePersonalNameValue(value: unknown, fieldName: string): UnknownRecord | null;
|
|
11
|
+
/**
|
|
12
|
+
* Validates phone-number values. Ensures each entry has phone_number or original_phone_number.
|
|
13
|
+
*/
|
|
14
|
+
export declare function validatePhoneNumberValue(value: unknown, fieldName: string): unknown;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=complex-type-validation.d.ts.map
|