attio-mcp 1.3.6 → 1.4.0

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