attio-mcp 1.3.6 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +236 -2
- package/README.md +106 -266
- package/dist/api/attio-client.d.ts +13 -3
- package/dist/api/attio-client.d.ts.map +1 -1
- package/dist/api/attio-client.js +37 -7
- package/dist/api/attio-client.js.map +1 -1
- package/dist/api/attribute-types.d.ts.map +1 -1
- package/dist/api/attribute-types.js +42 -20
- package/dist/api/attribute-types.js.map +1 -1
- package/dist/api/client-context.d.ts.map +1 -1
- package/dist/api/client-context.js +28 -42
- package/dist/api/client-context.js.map +1 -1
- package/dist/cli/commands/generate-skill.d.ts +28 -0
- package/dist/cli/commands/generate-skill.d.ts.map +1 -0
- package/dist/cli/commands/generate-skill.js +101 -0
- package/dist/cli/commands/generate-skill.js.map +1 -0
- package/dist/cli/discover.js +65 -0
- package/dist/cli/discover.js.map +1 -1
- package/dist/config/deal-defaults.d.ts +2 -2
- package/dist/config/deal-defaults.d.ts.map +1 -1
- package/dist/config/deal-defaults.js +15 -6
- package/dist/config/deal-defaults.js.map +1 -1
- package/dist/config/tool-aliases.d.ts +12 -0
- package/dist/config/tool-aliases.d.ts.map +1 -1
- package/dist/config/tool-aliases.js +213 -69
- package/dist/config/tool-aliases.js.map +1 -1
- package/dist/constants/tool-names.d.ts +84 -0
- package/dist/constants/tool-names.d.ts.map +1 -0
- package/dist/constants/tool-names.js +81 -0
- package/dist/constants/tool-names.js.map +1 -0
- package/dist/constants/universal.constants.d.ts +24 -0
- package/dist/constants/universal.constants.d.ts.map +1 -1
- package/dist/constants/universal.constants.js +81 -9
- package/dist/constants/universal.constants.js.map +1 -1
- package/dist/handlers/tool-configs/universal/batch-search.js +4 -4
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts +26 -4
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js +181 -21
- package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/crud-operations.js +13 -13
- package/dist/handlers/tool-configs/universal/core/crud-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js +3 -3
- package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts +17 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js +118 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts +14 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js +77 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts +24 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js +35 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts +15 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js +108 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts +14 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js +91 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts +14 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js +118 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts +77 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js +42 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts +15 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts.map +1 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js +109 -0
- package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js.map +1 -0
- package/dist/handlers/tool-configs/universal/core/index.d.ts +63 -22
- package/dist/handlers/tool-configs/universal/core/index.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/index.js +24 -22
- package/dist/handlers/tool-configs/universal/core/index.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts +43 -1
- package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/core/metadata-operations.js +117 -11
- package/dist/handlers/tool-configs/universal/core/metadata-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/notes-operations.js +12 -12
- package/dist/handlers/tool-configs/universal/core/notes-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/record-details-operations.js +3 -3
- package/dist/handlers/tool-configs/universal/core/record-details-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/core/search-operations.js +4 -4
- package/dist/handlers/tool-configs/universal/core/search-operations.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js +32 -9
- package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js +45 -6
- package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/people.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js +36 -5
- package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js +17 -1
- package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js +3 -1
- package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js.map +1 -1
- package/dist/handlers/tool-configs/universal/index.d.ts +75 -34
- package/dist/handlers/tool-configs/universal/index.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/index.js +58 -58
- package/dist/handlers/tool-configs/universal/index.js.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/advanced-search.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/advanced-search.js +5 -4
- package/dist/handlers/tool-configs/universal/operations/advanced-search.js.map +1 -1
- package/dist/handlers/tool-configs/universal/operations/batch-operations.js +3 -3
- package/dist/handlers/tool-configs/universal/operations/content-search.js +3 -3
- package/dist/handlers/tool-configs/universal/operations/index.d.ts +10 -10
- package/dist/handlers/tool-configs/universal/operations/index.js +15 -15
- package/dist/handlers/tool-configs/universal/operations/relationship-search.js +3 -3
- package/dist/handlers/tool-configs/universal/operations/timeframe-search.js +3 -3
- package/dist/handlers/tool-configs/universal/schemas/utility-schemas.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js +5 -2
- package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts +29 -0
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js +28 -0
- package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas.d.ts +1 -1
- package/dist/handlers/tool-configs/universal/schemas.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/schemas.js +1 -1
- package/dist/handlers/tool-configs/universal/schemas.js.map +1 -1
- package/dist/handlers/tool-configs/universal/shared-handlers.d.ts +20 -1
- package/dist/handlers/tool-configs/universal/shared-handlers.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/shared-handlers.js +216 -0
- package/dist/handlers/tool-configs/universal/shared-handlers.js.map +1 -1
- package/dist/handlers/tool-configs/universal/smithery-diagnostics.js +2 -2
- package/dist/handlers/tool-configs/universal/types.d.ts +9 -0
- package/dist/handlers/tool-configs/universal/types.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts +11 -0
- package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts.map +1 -1
- package/dist/handlers/tool-configs/universal/validators/schema-validator.js +63 -9
- package/dist/handlers/tool-configs/universal/validators/schema-validator.js.map +1 -1
- package/dist/handlers/tools/dispatcher/core.d.ts.map +1 -1
- package/dist/handlers/tools/dispatcher/core.js +5 -1
- package/dist/handlers/tools/dispatcher/core.js.map +1 -1
- package/dist/handlers/tools/formatters.d.ts +8 -1
- package/dist/handlers/tools/formatters.d.ts.map +1 -1
- package/dist/handlers/tools/formatters.js +30 -14
- package/dist/handlers/tools/formatters.js.map +1 -1
- package/dist/handlers/tools/registry.d.ts +125 -84
- package/dist/handlers/tools/registry.d.ts.map +1 -1
- package/dist/handlers/tools/registry.js +14 -9
- package/dist/handlers/tools/registry.js.map +1 -1
- package/dist/handlers/tools/standards/index.d.ts.map +1 -1
- package/dist/handlers/tools/standards/index.js +19 -11
- package/dist/handlers/tools/standards/index.js.map +1 -1
- package/dist/objects/companies/attributes.d.ts +5 -0
- package/dist/objects/companies/attributes.d.ts.map +1 -1
- package/dist/objects/companies/attributes.js +45 -31
- package/dist/objects/companies/attributes.js.map +1 -1
- package/dist/server/createServer.d.ts.map +1 -1
- package/dist/server/createServer.js +4 -3
- package/dist/server/createServer.js.map +1 -1
- package/dist/services/ErrorService.js +3 -3
- package/dist/services/ErrorService.js.map +1 -1
- package/dist/services/UniversalCreateService.d.ts.map +1 -1
- package/dist/services/UniversalCreateService.js +136 -12
- package/dist/services/UniversalCreateService.js.map +1 -1
- package/dist/services/UniversalSearchService.d.ts +4 -25
- package/dist/services/UniversalSearchService.d.ts.map +1 -1
- package/dist/services/UniversalSearchService.js +14 -324
- package/dist/services/UniversalSearchService.js.map +1 -1
- package/dist/services/UniversalUpdateService.d.ts +15 -4
- package/dist/services/UniversalUpdateService.d.ts.map +1 -1
- package/dist/services/UniversalUpdateService.js +79 -151
- package/dist/services/UniversalUpdateService.js.map +1 -1
- package/dist/services/create/factory.d.ts.map +1 -1
- package/dist/services/create/factory.js +2 -1
- package/dist/services/create/factory.js.map +1 -1
- package/dist/services/metadata/AttributeOptionsService.d.ts +38 -0
- package/dist/services/metadata/AttributeOptionsService.d.ts.map +1 -0
- package/dist/services/metadata/AttributeOptionsService.js +92 -0
- package/dist/services/metadata/AttributeOptionsService.js.map +1 -0
- package/dist/services/metadata/index.d.ts +1 -0
- package/dist/services/metadata/index.d.ts.map +1 -1
- package/dist/services/metadata/index.js +1 -0
- package/dist/services/metadata/index.js.map +1 -1
- package/dist/services/search/QueryApiService.d.ts +27 -0
- package/dist/services/search/QueryApiService.d.ts.map +1 -0
- package/dist/services/search/QueryApiService.js +144 -0
- package/dist/services/search/QueryApiService.js.map +1 -0
- package/dist/services/search/RecordsSearchService.d.ts +27 -0
- package/dist/services/search/RecordsSearchService.d.ts.map +1 -0
- package/dist/services/search/RecordsSearchService.js +122 -0
- package/dist/services/search/RecordsSearchService.js.map +1 -0
- package/dist/services/search/SearchCoordinator.d.ts +41 -0
- package/dist/services/search/SearchCoordinator.d.ts.map +1 -0
- package/dist/services/search/SearchCoordinator.js +83 -0
- package/dist/services/search/SearchCoordinator.js.map +1 -0
- package/dist/services/search/StrategyFactory.d.ts +31 -0
- package/dist/services/search/StrategyFactory.d.ts.map +1 -0
- package/dist/services/search/StrategyFactory.js +100 -0
- package/dist/services/search/StrategyFactory.js.map +1 -0
- package/dist/services/skill-generator/OutputWriterService.d.ts +41 -0
- package/dist/services/skill-generator/OutputWriterService.d.ts.map +1 -0
- package/dist/services/skill-generator/OutputWriterService.js +100 -0
- package/dist/services/skill-generator/OutputWriterService.js.map +1 -0
- package/dist/services/skill-generator/SchemaFormatterService.d.ts +61 -0
- package/dist/services/skill-generator/SchemaFormatterService.d.ts.map +1 -0
- package/dist/services/skill-generator/SchemaFormatterService.js +168 -0
- package/dist/services/skill-generator/SchemaFormatterService.js.map +1 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.d.ts +84 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.d.ts.map +1 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.js +292 -0
- package/dist/services/skill-generator/WorkspaceSchemaService.js.map +1 -0
- package/dist/services/skill-generator/index.d.ts +12 -0
- package/dist/services/skill-generator/index.d.ts.map +1 -0
- package/dist/services/skill-generator/index.js +11 -0
- package/dist/services/skill-generator/index.js.map +1 -0
- package/dist/services/skill-generator/types.d.ts +137 -0
- package/dist/services/skill-generator/types.d.ts.map +1 -0
- package/dist/services/skill-generator/types.js +10 -0
- package/dist/services/skill-generator/types.js.map +1 -0
- package/dist/services/update/FieldPersistenceHandler.d.ts +101 -0
- package/dist/services/update/FieldPersistenceHandler.d.ts.map +1 -0
- package/dist/services/update/FieldPersistenceHandler.js +198 -0
- package/dist/services/update/FieldPersistenceHandler.js.map +1 -0
- package/dist/services/update/FieldValidationHandler.d.ts +77 -0
- package/dist/services/update/FieldValidationHandler.d.ts.map +1 -0
- package/dist/services/update/FieldValidationHandler.js +157 -0
- package/dist/services/update/FieldValidationHandler.js.map +1 -0
- package/dist/services/update/MetadataResolver.d.ts +50 -0
- package/dist/services/update/MetadataResolver.d.ts.map +1 -0
- package/dist/services/update/MetadataResolver.js +110 -0
- package/dist/services/update/MetadataResolver.js.map +1 -0
- package/dist/services/update/UpdateOrchestrator.d.ts +37 -0
- package/dist/services/update/UpdateOrchestrator.d.ts.map +1 -0
- package/dist/services/update/UpdateOrchestrator.js +58 -0
- package/dist/services/update/UpdateOrchestrator.js.map +1 -0
- package/dist/services/update/UpdateValidation.d.ts +5 -1
- package/dist/services/update/UpdateValidation.d.ts.map +1 -1
- package/dist/services/update/UpdateValidation.js +46 -14
- package/dist/services/update/UpdateValidation.js.map +1 -1
- package/dist/services/value-transformer/index.d.ts +57 -0
- package/dist/services/value-transformer/index.d.ts.map +1 -0
- package/dist/services/value-transformer/index.js +326 -0
- package/dist/services/value-transformer/index.js.map +1 -0
- package/dist/services/value-transformer/multi-select-transformer.d.ts +63 -0
- package/dist/services/value-transformer/multi-select-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/multi-select-transformer.js +144 -0
- package/dist/services/value-transformer/multi-select-transformer.js.map +1 -0
- package/dist/services/value-transformer/record-reference-transformer.d.ts +43 -0
- package/dist/services/value-transformer/record-reference-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/record-reference-transformer.js +245 -0
- package/dist/services/value-transformer/record-reference-transformer.js.map +1 -0
- package/dist/services/value-transformer/select-transformer.d.ts +48 -0
- package/dist/services/value-transformer/select-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/select-transformer.js +232 -0
- package/dist/services/value-transformer/select-transformer.js.map +1 -0
- package/dist/services/value-transformer/status-transformer.d.ts +32 -0
- package/dist/services/value-transformer/status-transformer.d.ts.map +1 -0
- package/dist/services/value-transformer/status-transformer.js +294 -0
- package/dist/services/value-transformer/status-transformer.js.map +1 -0
- package/dist/services/value-transformer/types.d.ts +100 -0
- package/dist/services/value-transformer/types.d.ts.map +1 -0
- package/dist/services/value-transformer/types.js +6 -0
- package/dist/services/value-transformer/types.js.map +1 -0
- package/dist/templates/skill/SKILL.template.md +78 -0
- package/dist/templates/skill/attribute-reference.template.md +126 -0
- package/dist/templates/skill/complex-types.template.md +255 -0
- package/dist/utils/client-resolver.d.ts.map +1 -1
- package/dist/utils/client-resolver.js +8 -16
- package/dist/utils/client-resolver.js.map +1 -1
- package/dist/utils/complex-type-validation.d.ts +16 -0
- package/dist/utils/complex-type-validation.d.ts.map +1 -0
- package/dist/utils/complex-type-validation.js +196 -0
- package/dist/utils/complex-type-validation.js.map +1 -0
- package/dist/utils/error-utilities.d.ts.map +1 -1
- package/dist/utils/error-utilities.js +16 -9
- package/dist/utils/error-utilities.js.map +1 -1
- package/dist/utils/location-normalizer.d.ts +26 -0
- package/dist/utils/location-normalizer.d.ts.map +1 -0
- package/dist/utils/location-normalizer.js +39 -0
- package/dist/utils/location-normalizer.js.map +1 -0
- package/dist/utils/metadata-utils.d.ts +27 -0
- package/dist/utils/metadata-utils.d.ts.map +1 -0
- package/dist/utils/metadata-utils.js +59 -0
- package/dist/utils/metadata-utils.js.map +1 -0
- package/dist/utils/personal-name-parser.d.ts.map +1 -1
- package/dist/utils/personal-name-parser.js +26 -17
- package/dist/utils/personal-name-parser.js.map +1 -1
- package/dist/validators/company/field_detector.d.ts.map +1 -1
- package/dist/validators/company/field_detector.js +5 -0
- package/dist/validators/company/field_detector.js.map +1 -1
- package/package.json +13 -11
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for fetching and aggregating Attio workspace schema data
|
|
3
|
+
*
|
|
4
|
+
* This service orchestrates calls to existing services to build a complete
|
|
5
|
+
* workspace schema including objects, attributes, select options, and metadata.
|
|
6
|
+
*
|
|
7
|
+
* @see Issue #983
|
|
8
|
+
*/
|
|
9
|
+
import { getObjectAttributeMetadata } from '../../api/attribute-types.js';
|
|
10
|
+
import { getLazyAttioClient } from '../../api/lazy-client.js';
|
|
11
|
+
import { AttributeOptionsService } from '../../services/metadata/AttributeOptionsService.js';
|
|
12
|
+
import { debug as logDebug, error as logError, warn as logWarn, } from '../../utils/logger.js';
|
|
13
|
+
/**
|
|
14
|
+
* Type guard to check if an ID is a nested option ID object
|
|
15
|
+
* Attio API returns option IDs as nested objects: {workspace_id, object_id, attribute_id, option_id}
|
|
16
|
+
* @param id - The ID value to check
|
|
17
|
+
* @returns True if the ID is a nested option ID object
|
|
18
|
+
* @see Issue #1014
|
|
19
|
+
*/
|
|
20
|
+
function isNestedOptionId(id) {
|
|
21
|
+
return typeof id === 'object' && id !== null && 'option_id' in id;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generates a slug-style value from an option title
|
|
25
|
+
* Converts "Existing Customer" → "existing_customer"
|
|
26
|
+
* @param title - The option title
|
|
27
|
+
* @returns Slug-style value
|
|
28
|
+
* @see Issue #1014
|
|
29
|
+
*/
|
|
30
|
+
function generateOptionValue(title) {
|
|
31
|
+
return title
|
|
32
|
+
.toLowerCase()
|
|
33
|
+
.replace(/[^a-z0-9]+/g, '_') // Replace non-alphanumeric with underscore
|
|
34
|
+
.replace(/^_+|_+$/g, ''); // Trim leading/trailing underscores
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Service for fetching complete workspace schema data
|
|
38
|
+
*
|
|
39
|
+
* Note: API key flows through getLazyAttioClient() from environment/context,
|
|
40
|
+
* not through constructor dependency injection.
|
|
41
|
+
*/
|
|
42
|
+
export class WorkspaceSchemaService {
|
|
43
|
+
/**
|
|
44
|
+
* Creates a new WorkspaceSchemaService
|
|
45
|
+
*/
|
|
46
|
+
constructor() {
|
|
47
|
+
// No parameters needed - API key flows through getLazyAttioClient()
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Fetches the display title for an object from the Attio API
|
|
51
|
+
*
|
|
52
|
+
* @param objectSlug - Object API slug (e.g., 'companies', 'custom_prospecting_list')
|
|
53
|
+
* @returns The object title from Attio, or null if fetch fails
|
|
54
|
+
* @see Issue #1017
|
|
55
|
+
*/
|
|
56
|
+
async fetchObjectTitle(objectSlug) {
|
|
57
|
+
try {
|
|
58
|
+
const client = getLazyAttioClient();
|
|
59
|
+
const response = await client.get(`/objects/${objectSlug}`);
|
|
60
|
+
const obj = response?.data?.data || response?.data;
|
|
61
|
+
return obj?.title || null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
logDebug('WorkspaceSchemaService', `Could not fetch title for ${objectSlug}, using fallback`, { objectSlug });
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
getOptionFetchDelayMs(options) {
|
|
69
|
+
const optionFetchDelayMs = options.optionFetchDelayMs;
|
|
70
|
+
if (optionFetchDelayMs === undefined)
|
|
71
|
+
return 100;
|
|
72
|
+
if (typeof optionFetchDelayMs !== 'number' ||
|
|
73
|
+
!Number.isFinite(optionFetchDelayMs) ||
|
|
74
|
+
optionFetchDelayMs < 0) {
|
|
75
|
+
return 100;
|
|
76
|
+
}
|
|
77
|
+
return optionFetchDelayMs;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Fetches complete workspace schema for specified objects
|
|
81
|
+
*
|
|
82
|
+
* This method implements graceful degradation:
|
|
83
|
+
* - If an object fails to fetch, it logs the error and continues with other objects
|
|
84
|
+
* - If an attribute's options fail to fetch, it includes the attribute without options
|
|
85
|
+
*
|
|
86
|
+
* @param objectSlugs - Array of object slugs to fetch (e.g., ['companies', 'people'])
|
|
87
|
+
* @param options - Fetching options (max options, include archived)
|
|
88
|
+
* @returns Complete workspace schema
|
|
89
|
+
*/
|
|
90
|
+
async fetchSchema(objectSlugs, options) {
|
|
91
|
+
const objects = [];
|
|
92
|
+
for (const objectSlug of objectSlugs) {
|
|
93
|
+
try {
|
|
94
|
+
const objectSchema = await this.fetchObjectSchema(objectSlug, options);
|
|
95
|
+
objects.push(objectSchema);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logError('WorkspaceSchemaService', `Failed to fetch schema for ${objectSlug}`, error instanceof Error ? error : new Error(String(error)), { objectSlug });
|
|
99
|
+
// Continue processing other objects despite error
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
metadata: {
|
|
104
|
+
generatedAt: new Date().toISOString(),
|
|
105
|
+
workspace: 'attio', // Could be enhanced to fetch actual workspace name
|
|
106
|
+
objects: objectSlugs,
|
|
107
|
+
},
|
|
108
|
+
objects,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Fetches schema for a single object
|
|
113
|
+
*
|
|
114
|
+
* @param objectSlug - Object slug (e.g., 'companies', 'people', 'deals')
|
|
115
|
+
* @param options - Fetching options
|
|
116
|
+
* @returns Object schema with all attributes and metadata
|
|
117
|
+
*/
|
|
118
|
+
async fetchObjectSchema(objectSlug, options) {
|
|
119
|
+
const optionFetchDelayMs = this.getOptionFetchDelayMs(options);
|
|
120
|
+
const PHASE1_OBJECTS = ['companies', 'people', 'deals'];
|
|
121
|
+
// 1. Fetch object title from API for custom objects (Issue #1017)
|
|
122
|
+
// Skip API call for Phase 1 objects - they have hardcoded display names
|
|
123
|
+
const objectTitle = PHASE1_OBJECTS.includes(objectSlug)
|
|
124
|
+
? null
|
|
125
|
+
: await this.fetchObjectTitle(objectSlug);
|
|
126
|
+
// 2. Fetch attribute metadata (uses existing 15min TTL cache)
|
|
127
|
+
const metadataMap = await getObjectAttributeMetadata(objectSlug);
|
|
128
|
+
// 3. Convert metadata to AttributeSchema array
|
|
129
|
+
const attributes = [];
|
|
130
|
+
for (const [apiSlug, metadata] of metadataMap.entries()) {
|
|
131
|
+
const attributeSchema = {
|
|
132
|
+
apiSlug,
|
|
133
|
+
displayName: metadata.title,
|
|
134
|
+
type: metadata.type,
|
|
135
|
+
isMultiselect: metadata.is_multiselect || false,
|
|
136
|
+
isUnique: metadata.is_unique || false,
|
|
137
|
+
isRequired: metadata.is_required || false,
|
|
138
|
+
isWritable: metadata.is_writable !== false, // Default to true
|
|
139
|
+
description: metadata.description,
|
|
140
|
+
};
|
|
141
|
+
// 4. Fetch options for select/status attributes
|
|
142
|
+
if (this.isOptionBasedAttribute(metadata.type)) {
|
|
143
|
+
try {
|
|
144
|
+
const optionsResult = await AttributeOptionsService.getOptions(objectSlug, apiSlug, options.includeArchived);
|
|
145
|
+
// Apply truncation
|
|
146
|
+
const totalOptions = optionsResult.options.length;
|
|
147
|
+
const truncated = totalOptions > options.maxOptionsPerAttribute;
|
|
148
|
+
attributeSchema.options = optionsResult.options
|
|
149
|
+
.slice(0, options.maxOptionsPerAttribute)
|
|
150
|
+
.map((opt) => ({
|
|
151
|
+
// Handle nested ID objects from Attio API
|
|
152
|
+
// API returns: { workspace_id, object_id, attribute_id, option_id }
|
|
153
|
+
id: isNestedOptionId(opt.id)
|
|
154
|
+
? opt.id.option_id
|
|
155
|
+
: typeof opt.id === 'string'
|
|
156
|
+
? opt.id
|
|
157
|
+
: '',
|
|
158
|
+
title: opt.title,
|
|
159
|
+
// Generate slug-style value from title since Attio API doesn't provide it
|
|
160
|
+
// "Existing Customer" → "existing_customer"
|
|
161
|
+
value: generateOptionValue(opt.title),
|
|
162
|
+
isArchived: 'is_archived' in opt ? opt.is_archived : false,
|
|
163
|
+
}));
|
|
164
|
+
attributeSchema.optionsTruncated = truncated;
|
|
165
|
+
attributeSchema.totalOptions = totalOptions;
|
|
166
|
+
// Rate limiting: Add delay between option fetches
|
|
167
|
+
if (optionFetchDelayMs > 0) {
|
|
168
|
+
await new Promise((resolve) => setTimeout(resolve, optionFetchDelayMs));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
// Log warning but don't fail - attribute can still be documented
|
|
173
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
174
|
+
logWarn('WorkspaceSchemaService', `No options available for ${objectSlug}.${apiSlug}`, { objectSlug, attributeSlug: apiSlug, errorMessage });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// 5. Add complex type structures
|
|
178
|
+
if (this.isComplexType(metadata.type)) {
|
|
179
|
+
attributeSchema.complexTypeStructure = this.getComplexTypeStructure(metadata.type);
|
|
180
|
+
}
|
|
181
|
+
// 6. Add relationship metadata (only when we have real data)
|
|
182
|
+
if (metadata.relationship?.object && metadata.relationship?.cardinality) {
|
|
183
|
+
attributeSchema.relationship = {
|
|
184
|
+
targetObject: metadata.relationship.object,
|
|
185
|
+
cardinality: metadata.relationship.cardinality,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
attributes.push(attributeSchema);
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
objectSlug,
|
|
192
|
+
displayName: this.getDisplayName(objectSlug, objectTitle),
|
|
193
|
+
attributes,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Checks if an attribute type supports options (select, status, multi-select)
|
|
198
|
+
*
|
|
199
|
+
* @param type - Attribute type from Attio API
|
|
200
|
+
* @returns True if attribute supports options
|
|
201
|
+
*/
|
|
202
|
+
isOptionBasedAttribute(type) {
|
|
203
|
+
return ['select', 'status', 'multi-select'].includes(type);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Checks if an attribute type is a complex type requiring structure documentation
|
|
207
|
+
*
|
|
208
|
+
* @param type - Attribute type from Attio API
|
|
209
|
+
* @returns True if attribute is a complex type
|
|
210
|
+
*/
|
|
211
|
+
isComplexType(type) {
|
|
212
|
+
return [
|
|
213
|
+
'location',
|
|
214
|
+
'personal-name',
|
|
215
|
+
'phone-number',
|
|
216
|
+
'email-address',
|
|
217
|
+
].includes(type);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Gets the structure definition for complex attribute types
|
|
221
|
+
*
|
|
222
|
+
* @param type - Complex attribute type
|
|
223
|
+
* @returns Structure definition with field types
|
|
224
|
+
*/
|
|
225
|
+
getComplexTypeStructure(type) {
|
|
226
|
+
switch (type) {
|
|
227
|
+
case 'location':
|
|
228
|
+
return {
|
|
229
|
+
line_1: 'string | null (street address)',
|
|
230
|
+
line_2: 'string | null (apt/suite)',
|
|
231
|
+
line_3: 'string | null (additional)',
|
|
232
|
+
line_4: 'string | null (additional)',
|
|
233
|
+
locality: 'string | null (city)',
|
|
234
|
+
region: 'string | null (state/province)',
|
|
235
|
+
postcode: 'string | null (ZIP/postal code)',
|
|
236
|
+
country_code: 'string | null (ISO country code)',
|
|
237
|
+
latitude: 'number | null (coordinates)',
|
|
238
|
+
longitude: 'number | null (coordinates)',
|
|
239
|
+
};
|
|
240
|
+
case 'personal-name':
|
|
241
|
+
return {
|
|
242
|
+
first_name: 'string (required)',
|
|
243
|
+
last_name: 'string | null',
|
|
244
|
+
middle_name: 'string | null',
|
|
245
|
+
title: 'string | null (e.g., "Dr.", "Prof.")',
|
|
246
|
+
full_name: 'string (auto-generated, read-only)',
|
|
247
|
+
};
|
|
248
|
+
case 'phone-number':
|
|
249
|
+
return {
|
|
250
|
+
country_code: 'string (e.g., "+1")',
|
|
251
|
+
number: 'string (digits only)',
|
|
252
|
+
original_number: 'string (as provided)',
|
|
253
|
+
};
|
|
254
|
+
case 'email-address':
|
|
255
|
+
return {
|
|
256
|
+
email_address: 'string (valid email format)',
|
|
257
|
+
};
|
|
258
|
+
default:
|
|
259
|
+
return {};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Gets human-readable display name for an object slug
|
|
264
|
+
*
|
|
265
|
+
* Uses the fetched title from Attio API if available, otherwise falls back
|
|
266
|
+
* to hardcoded display names for Phase 1 objects or slug capitalization.
|
|
267
|
+
*
|
|
268
|
+
* @param objectSlug - Object API slug
|
|
269
|
+
* @param fetchedTitle - Title fetched from Attio API (optional)
|
|
270
|
+
* @returns Human-readable display name
|
|
271
|
+
* @see Issue #1017
|
|
272
|
+
*/
|
|
273
|
+
getDisplayName(objectSlug, fetchedTitle) {
|
|
274
|
+
// Use API-fetched title if available
|
|
275
|
+
if (fetchedTitle) {
|
|
276
|
+
return fetchedTitle;
|
|
277
|
+
}
|
|
278
|
+
// Fallback to hardcoded display names for Phase 1 objects
|
|
279
|
+
const displayNames = {
|
|
280
|
+
companies: 'Companies',
|
|
281
|
+
people: 'People',
|
|
282
|
+
deals: 'Deals',
|
|
283
|
+
};
|
|
284
|
+
// If not in map, title-case the slug (replace underscores with spaces)
|
|
285
|
+
return (displayNames[objectSlug] ||
|
|
286
|
+
objectSlug
|
|
287
|
+
.split('_')
|
|
288
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
289
|
+
.join(' '));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=WorkspaceSchemaService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceSchemaService.js","sourceRoot":"","sources":["../../../src/services/skill-generator/WorkspaceSchemaService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EACL,KAAK,IAAI,QAAQ,EACjB,KAAK,IAAI,QAAQ,EACjB,IAAI,IAAI,OAAO,GAChB,MAAM,mBAAmB,CAAC;AAmB3B;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,EAAW;IACnC,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,WAAW,IAAI,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,2CAA2C;SACvE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,oCAAoC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAsB;IACjC;;OAEG;IACH;QACE,oEAAoE;IACtE,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,CAAC;YACnD,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CACN,wBAAwB,EACxB,6BAA6B,UAAU,kBAAkB,EACzD,EAAE,UAAU,EAAE,CACf,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,OAA2B;QACvD,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACtD,IAAI,kBAAkB,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QACjD,IACE,OAAO,kBAAkB,KAAK,QAAQ;YACtC,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACpC,kBAAkB,GAAG,CAAC,EACtB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,WAAW,CACf,WAAqB,EACrB,OAA2B;QAE3B,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,QAAQ,CACN,wBAAwB,EACxB,8BAA8B,UAAU,EAAE,EAC1C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACzD,EAAE,UAAU,EAAE,CACf,CAAC;gBACF,kDAAkD;YACpD,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,SAAS,EAAE,OAAO,EAAE,mDAAmD;gBACvE,OAAO,EAAE,WAAW;aACrB;YACD,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,iBAAiB,CAC7B,UAAkB,EAClB,OAA2B;QAE3B,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAExD,kEAAkE;QAClE,wEAAwE;QACxE,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC;YACrD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAE5C,8DAA8D;QAC9D,MAAM,WAAW,GAAG,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAEjE,+CAA+C;QAC/C,MAAM,UAAU,GAAsB,EAAE,CAAC;QAEzC,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,eAAe,GAAoB;gBACvC,OAAO;gBACP,WAAW,EAAE,QAAQ,CAAC,KAAK;gBAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,aAAa,EAAE,QAAQ,CAAC,cAAc,IAAI,KAAK;gBAC/C,QAAQ,EAAE,QAAQ,CAAC,SAAS,IAAI,KAAK;gBACrC,UAAU,EAAE,QAAQ,CAAC,WAAW,IAAI,KAAK;gBACzC,UAAU,EAAE,QAAQ,CAAC,WAAW,KAAK,KAAK,EAAE,kBAAkB;gBAC9D,WAAW,EAAE,QAAQ,CAAC,WAAW;aAClC,CAAC;YAEF,gDAAgD;YAChD,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,MAAM,uBAAuB,CAAC,UAAU,CAC5D,UAAU,EACV,OAAO,EACP,OAAO,CAAC,eAAe,CACxB,CAAC;oBAEF,mBAAmB;oBACnB,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;oBAClD,MAAM,SAAS,GAAG,YAAY,GAAG,OAAO,CAAC,sBAAsB,CAAC;oBAEhE,eAAe,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO;yBAC5C,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC;yBACxC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACb,0CAA0C;wBAC1C,oEAAoE;wBACpE,EAAE,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC1B,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS;4BAClB,CAAC,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;gCAC1B,CAAC,CAAC,GAAG,CAAC,EAAE;gCACR,CAAC,CAAC,EAAE;wBACR,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,0EAA0E;wBAC1E,4CAA4C;wBAC5C,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;wBACrC,UAAU,EAAE,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;qBAC3D,CAAC,CAAC,CAAC;oBAEN,eAAe,CAAC,gBAAgB,GAAG,SAAS,CAAC;oBAC7C,eAAe,CAAC,YAAY,GAAG,YAAY,CAAC;oBAE5C,kDAAkD;oBAClD,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;wBAC3B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CACxC,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAc,EAAE,CAAC;oBACxB,iEAAiE;oBACjE,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACzD,OAAO,CACL,wBAAwB,EACxB,4BAA4B,UAAU,IAAI,OAAO,EAAE,EACnD,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,CACrD,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,eAAe,CAAC,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,CACjE,QAAQ,CAAC,IAAI,CACd,CAAC;YACJ,CAAC;YAED,6DAA6D;YAC7D,IAAI,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;gBACxE,eAAe,CAAC,YAAY,GAAG;oBAC7B,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM;oBAC1C,WAAW,EAAE,QAAQ,CAAC,YAAY,CAAC,WAAW;iBAC/C,CAAC;YACJ,CAAC;YAED,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,OAAO;YACL,UAAU;YACV,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC;YACzD,UAAU;SACX,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,sBAAsB,CAAC,IAAY;QACzC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;OAKG;IACK,aAAa,CAAC,IAAY;QAChC,OAAO;YACL,UAAU;YACV,eAAe;YACf,cAAc;YACd,eAAe;SAChB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACK,uBAAuB,CAAC,IAAY;QAC1C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU;gBACb,OAAO;oBACL,MAAM,EAAE,gCAAgC;oBACxC,MAAM,EAAE,2BAA2B;oBACnC,MAAM,EAAE,4BAA4B;oBACpC,MAAM,EAAE,4BAA4B;oBACpC,QAAQ,EAAE,sBAAsB;oBAChC,MAAM,EAAE,gCAAgC;oBACxC,QAAQ,EAAE,iCAAiC;oBAC3C,YAAY,EAAE,kCAAkC;oBAChD,QAAQ,EAAE,6BAA6B;oBACvC,SAAS,EAAE,6BAA6B;iBACzC,CAAC;YAEJ,KAAK,eAAe;gBAClB,OAAO;oBACL,UAAU,EAAE,mBAAmB;oBAC/B,SAAS,EAAE,eAAe;oBAC1B,WAAW,EAAE,eAAe;oBAC5B,KAAK,EAAE,sCAAsC;oBAC7C,SAAS,EAAE,oCAAoC;iBAChD,CAAC;YAEJ,KAAK,cAAc;gBACjB,OAAO;oBACL,YAAY,EAAE,qBAAqB;oBACnC,MAAM,EAAE,sBAAsB;oBAC9B,eAAe,EAAE,sBAAsB;iBACxC,CAAC;YAEJ,KAAK,eAAe;gBAClB,OAAO;oBACL,aAAa,EAAE,6BAA6B;iBAC7C,CAAC;YAEJ;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACK,cAAc,CACpB,UAAkB,EAClB,YAA4B;QAE5B,qCAAqC;QACrC,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,0DAA0D;QAC1D,MAAM,YAAY,GAA2B;YAC3C,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,OAAO;SACf,CAAC;QAEF,uEAAuE;QACvE,OAAO,CACL,YAAY,CAAC,UAAU,CAAC;YACxB,UAAU;iBACP,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBAC3D,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Schema Skill Generator
|
|
3
|
+
*
|
|
4
|
+
* Exports services and types for generating Claude Skills from Attio workspace schemas.
|
|
5
|
+
*
|
|
6
|
+
* @see Issue #983
|
|
7
|
+
*/
|
|
8
|
+
export { WorkspaceSchemaService } from './WorkspaceSchemaService.js';
|
|
9
|
+
export { SchemaFormatterService } from './SchemaFormatterService.js';
|
|
10
|
+
export { OutputWriterService } from './OutputWriterService.js';
|
|
11
|
+
export type { GenerateSkillConfig, WorkspaceSchema, ObjectSchema, AttributeSchema, AttributeOption, FormattedOutput, SkillOutput, FetchSchemaOptions, } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/skill-generator/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,eAAe,EACf,eAAe,EACf,WAAW,EACX,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Schema Skill Generator
|
|
3
|
+
*
|
|
4
|
+
* Exports services and types for generating Claude Skills from Attio workspace schemas.
|
|
5
|
+
*
|
|
6
|
+
* @see Issue #983
|
|
7
|
+
*/
|
|
8
|
+
export { WorkspaceSchemaService } from './WorkspaceSchemaService.js';
|
|
9
|
+
export { SchemaFormatterService } from './SchemaFormatterService.js';
|
|
10
|
+
export { OutputWriterService } from './OutputWriterService.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/skill-generator/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the Workspace Schema Skill Generator
|
|
3
|
+
*
|
|
4
|
+
* These types support the generation of Claude Skills from Attio workspace schemas,
|
|
5
|
+
* addressing the common issue where LLMs make errors due to unknown attribute values.
|
|
6
|
+
*
|
|
7
|
+
* @see Issue #983
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Configuration for the generate-skill CLI command
|
|
11
|
+
*/
|
|
12
|
+
export interface GenerateSkillConfig {
|
|
13
|
+
/** Object slugs to include in the generated skill */
|
|
14
|
+
objects: string[];
|
|
15
|
+
/** Output format: Claude Skill, plain Markdown, or JSON */
|
|
16
|
+
format: 'skill' | 'markdown' | 'json';
|
|
17
|
+
/** Output directory path */
|
|
18
|
+
outputDir: string;
|
|
19
|
+
/** Whether to package output as ZIP file */
|
|
20
|
+
zip: boolean;
|
|
21
|
+
/** Maximum options to display per attribute (default: 20) */
|
|
22
|
+
maxOptionsPerAttribute: number;
|
|
23
|
+
/** Whether to include archived options */
|
|
24
|
+
includeArchived: boolean;
|
|
25
|
+
/** Delay between attribute option fetches in milliseconds (default: 100) */
|
|
26
|
+
optionFetchDelayMs?: number;
|
|
27
|
+
/** Attio API key for authentication */
|
|
28
|
+
apiKey: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Complete workspace schema containing multiple objects
|
|
32
|
+
*/
|
|
33
|
+
export interface WorkspaceSchema {
|
|
34
|
+
/** Metadata about the schema generation */
|
|
35
|
+
metadata: {
|
|
36
|
+
/** ISO 8601 timestamp when schema was generated */
|
|
37
|
+
generatedAt: string;
|
|
38
|
+
/** Workspace identifier or name */
|
|
39
|
+
workspace: string;
|
|
40
|
+
/** List of object slugs included in this schema */
|
|
41
|
+
objects: string[];
|
|
42
|
+
};
|
|
43
|
+
/** Array of object schemas */
|
|
44
|
+
objects: ObjectSchema[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Schema for a single Attio object (companies, people, deals, etc.)
|
|
48
|
+
*/
|
|
49
|
+
export interface ObjectSchema {
|
|
50
|
+
/** API slug of the object (e.g., 'companies', 'people') */
|
|
51
|
+
objectSlug: string;
|
|
52
|
+
/** Human-readable display name (e.g., 'Companies', 'People') */
|
|
53
|
+
displayName: string;
|
|
54
|
+
/** Array of attribute schemas for this object */
|
|
55
|
+
attributes: AttributeSchema[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Schema for a single attribute within an object
|
|
59
|
+
*/
|
|
60
|
+
export interface AttributeSchema {
|
|
61
|
+
/** API slug used in API calls (e.g., 'team_size', 'industry') */
|
|
62
|
+
apiSlug: string;
|
|
63
|
+
/** Display name shown in Attio UI */
|
|
64
|
+
displayName: string;
|
|
65
|
+
/** Attribute type (e.g., 'text', 'select', 'location', 'personal-name') */
|
|
66
|
+
type: string;
|
|
67
|
+
/** Whether this attribute accepts multiple values */
|
|
68
|
+
isMultiselect: boolean;
|
|
69
|
+
/** Whether this attribute has a uniqueness constraint */
|
|
70
|
+
isUnique: boolean;
|
|
71
|
+
/** Whether this attribute is required for record creation */
|
|
72
|
+
isRequired: boolean;
|
|
73
|
+
/** Whether this attribute can be modified */
|
|
74
|
+
isWritable: boolean;
|
|
75
|
+
/** Optional description of the attribute's purpose */
|
|
76
|
+
description?: string;
|
|
77
|
+
/** For select/status attributes: array of valid options */
|
|
78
|
+
options?: AttributeOption[];
|
|
79
|
+
/** Whether options were truncated due to maxOptionsPerAttribute limit */
|
|
80
|
+
optionsTruncated?: boolean;
|
|
81
|
+
/** Total number of options available (before truncation) */
|
|
82
|
+
totalOptions?: number;
|
|
83
|
+
/** For complex types: structure definition with field types */
|
|
84
|
+
complexTypeStructure?: Record<string, unknown>;
|
|
85
|
+
/** For relationship attributes: target object and cardinality */
|
|
86
|
+
relationship?: {
|
|
87
|
+
/** Target object slug (e.g., 'companies', 'people') */
|
|
88
|
+
targetObject: string;
|
|
89
|
+
/** Relationship cardinality */
|
|
90
|
+
cardinality: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* A single option for select or status attributes
|
|
95
|
+
*/
|
|
96
|
+
export interface AttributeOption {
|
|
97
|
+
/** Unique identifier for this option */
|
|
98
|
+
id: string;
|
|
99
|
+
/** Display title shown in Attio UI */
|
|
100
|
+
title: string;
|
|
101
|
+
/** API value used in API calls */
|
|
102
|
+
value: string;
|
|
103
|
+
/** Whether this option is archived */
|
|
104
|
+
isArchived?: boolean;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Formatted output ready for writing to disk
|
|
108
|
+
*/
|
|
109
|
+
export interface FormattedOutput {
|
|
110
|
+
/** Output format type */
|
|
111
|
+
format: 'skill' | 'markdown' | 'json';
|
|
112
|
+
/** Map of relative file paths to file contents */
|
|
113
|
+
files: Record<string, string>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Result of writing skill output to disk
|
|
117
|
+
*/
|
|
118
|
+
export interface SkillOutput {
|
|
119
|
+
/** Output format that was written */
|
|
120
|
+
format: 'skill' | 'markdown' | 'json';
|
|
121
|
+
/** Absolute path to the output directory or file */
|
|
122
|
+
path: string;
|
|
123
|
+
/** List of files that were created */
|
|
124
|
+
files: string[];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Options for fetching object schema
|
|
128
|
+
*/
|
|
129
|
+
export interface FetchSchemaOptions {
|
|
130
|
+
/** Maximum options to retrieve per attribute */
|
|
131
|
+
maxOptionsPerAttribute: number;
|
|
132
|
+
/** Whether to include archived options */
|
|
133
|
+
includeArchived: boolean;
|
|
134
|
+
/** Delay between attribute option fetches in milliseconds (default: 100) */
|
|
135
|
+
optionFetchDelayMs?: number;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/skill-generator/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the Workspace Schema Skill Generator
|
|
3
|
+
*
|
|
4
|
+
* These types support the generation of Claude Skills from Attio workspace schemas,
|
|
5
|
+
* addressing the common issue where LLMs make errors due to unknown attribute values.
|
|
6
|
+
*
|
|
7
|
+
* @see Issue #983
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/skill-generator/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FieldPersistenceHandler - Post-update field verification
|
|
3
|
+
*
|
|
4
|
+
* Extracted from UniversalUpdateService to separate verification concerns.
|
|
5
|
+
* Handles field persistence checking with configurable strictness.
|
|
6
|
+
*
|
|
7
|
+
* **Verification Modes** (controlled by `ENABLE_FIELD_VERIFICATION` env var):
|
|
8
|
+
* - **Enabled** (default): Any value except `'false'` enables verification
|
|
9
|
+
* - **Disabled**: Set to `'false'` to skip verification entirely
|
|
10
|
+
*
|
|
11
|
+
* **Strictness Modes** (controlled by `STRICT_FIELD_VALIDATION` env var):
|
|
12
|
+
* - **Strict**: `'true'` - Logs all discrepancies (cosmetic + semantic)
|
|
13
|
+
* - **Standard** (default): `'false'` - Logs only semantic mismatches
|
|
14
|
+
*
|
|
15
|
+
* **Semantic vs Cosmetic Mismatches**:
|
|
16
|
+
* - Cosmetic: Format differences with same logical value (e.g., "Demo" vs {title: "Demo"})
|
|
17
|
+
* - Semantic: Actual data loss or corruption (e.g., "Demo" vs "Qualified", missing data)
|
|
18
|
+
*
|
|
19
|
+
* @see Issue #984 - Modularize UniversalUpdateService (831→220 lines)
|
|
20
|
+
* @see PR #1006 Phase 3.2 - Enhanced JSDoc for verification behavior
|
|
21
|
+
*/
|
|
22
|
+
import { UniversalResourceType } from '../../handlers/tool-configs/universal/types.js';
|
|
23
|
+
/**
|
|
24
|
+
* Options for field persistence verification
|
|
25
|
+
*/
|
|
26
|
+
export interface VerificationOptions {
|
|
27
|
+
/** Skip verification entirely (default: false) */
|
|
28
|
+
skip?: boolean;
|
|
29
|
+
/** Throw error on verification failure (default: from env STRICT_FIELD_VALIDATION) */
|
|
30
|
+
strict?: boolean;
|
|
31
|
+
/** Include cosmetic mismatches in warnings (default: false) */
|
|
32
|
+
includeCosmetic?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Result of field persistence verification
|
|
36
|
+
*/
|
|
37
|
+
export interface VerificationResult {
|
|
38
|
+
/** Whether all fields were persisted correctly */
|
|
39
|
+
verified: boolean;
|
|
40
|
+
/** Non-blocking warnings about verification */
|
|
41
|
+
warnings: string[];
|
|
42
|
+
/** List of field discrepancies found */
|
|
43
|
+
discrepancies: string[];
|
|
44
|
+
/** Actual values retrieved from API */
|
|
45
|
+
actualValues: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* FieldPersistenceHandler - Post-update verification orchestration
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* // Standard mode (semantic mismatches only)
|
|
53
|
+
* const result = await FieldPersistenceHandler.verifyPersistence(
|
|
54
|
+
* UniversalResourceType.COMPANIES,
|
|
55
|
+
* 'company-123',
|
|
56
|
+
* { stage: 'Demo' }
|
|
57
|
+
* );
|
|
58
|
+
* // Cosmetic mismatch "Demo" vs {title: "Demo"} → not logged
|
|
59
|
+
* // Semantic mismatch "Demo" vs "Qualified" → logged
|
|
60
|
+
*
|
|
61
|
+
* // Strict mode (all mismatches)
|
|
62
|
+
* process.env.STRICT_FIELD_VALIDATION = 'true';
|
|
63
|
+
* // Both cosmetic and semantic mismatches logged
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class FieldPersistenceHandler {
|
|
67
|
+
/**
|
|
68
|
+
* Verify that fields were persisted correctly after update
|
|
69
|
+
*
|
|
70
|
+
* Supports three modes:
|
|
71
|
+
* 1. Disabled: ENABLE_FIELD_VERIFICATION=false (skip completely)
|
|
72
|
+
* 2. Warn-only: Default, logs discrepancies as warnings
|
|
73
|
+
* 3. Strict: STRICT_FIELD_VALIDATION=true, throws on mismatch
|
|
74
|
+
*
|
|
75
|
+
* @param resourceType - Resource type being verified
|
|
76
|
+
* @param recordId - ID of the updated record
|
|
77
|
+
* @param expectedData - Expected field values after update
|
|
78
|
+
* @param actualRecord - Optional actual record values. If not provided, will be fetched from API
|
|
79
|
+
* @param options - Verification options
|
|
80
|
+
* @returns Verification result with verified status, warnings, and discrepancies
|
|
81
|
+
* @throws UniversalValidationError if strict mode enabled and verification fails
|
|
82
|
+
*/
|
|
83
|
+
static verifyPersistence(resourceType: UniversalResourceType, recordId: string, expectedData: Record<string, unknown>, actualRecord?: Record<string, unknown>, options?: VerificationOptions): Promise<VerificationResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Determine if a discrepancy is semantic (real) vs cosmetic (format-only)
|
|
86
|
+
*
|
|
87
|
+
* Cosmetic mismatches occur when the same logical value is represented differently:
|
|
88
|
+
* - String vs object: "Demo" vs {title: "Demo"}
|
|
89
|
+
* - Array wrapping: "value" vs ["value"]
|
|
90
|
+
* - Type coercion: "123" vs 123
|
|
91
|
+
*
|
|
92
|
+
* Semantic mismatches indicate actual data loss or corruption:
|
|
93
|
+
* - Different values: "Demo" vs "Qualified"
|
|
94
|
+
* - Missing data: {field: "value"} vs {}
|
|
95
|
+
*
|
|
96
|
+
* @param discrepancy - Discrepancy message from verification
|
|
97
|
+
* @returns true if semantic mismatch, false if cosmetic
|
|
98
|
+
*/
|
|
99
|
+
static isSemanticMismatch(discrepancy: string): boolean;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=FieldPersistenceHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldPersistenceHandler.d.ts","sourceRoot":"","sources":["../../../src/services/update/FieldPersistenceHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAQnF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,wCAAwC;IACxC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,uBAAuB;IAClC;;;;;;;;;;;;;;;OAeG;WACU,iBAAiB,CAC5B,YAAY,EAAE,qBAAqB,EACnC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC;IA4J9B;;;;;;;;;;;;;;OAcG;WACW,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAyB/D"}
|