@autobe/agent 0.30.0-dev.20260315 → 0.30.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/LICENSE +661 -661
- package/lib/constants/AutoBeTemplateFileConstant.d.ts +1 -1
- package/lib/factory/consentFunctionCall.js +4 -4
- package/lib/factory/createAutoBeContext.js +24 -24
- package/lib/factory/createAutoBeMessageContent.js +6 -6
- package/lib/index.mjs +41 -41
- package/lib/orchestrate/analyze/histories/transformAnalyzeScenarioHistory.js +18 -18
- package/lib/orchestrate/analyze/histories/transformAnalyzeScenarioReviewHistory.js +13 -13
- package/lib/orchestrate/analyze/histories/transformAnalyzeSectionCrossFileReviewHistory.js +47 -47
- package/lib/orchestrate/analyze/histories/transformAnalyzeSectionReviewHistory.js +66 -66
- package/lib/orchestrate/analyze/histories/transformAnalyzeWriteSectionHistory.js +91 -91
- package/lib/orchestrate/analyze/histories/transformAnalyzeWriteSectionPatchHistory.js +46 -46
- package/lib/orchestrate/analyze/histories/transformAnalyzeWriteUnitHistory.js +72 -72
- package/lib/orchestrate/analyze/orchestrateAnalyzeScenario.js +1 -1
- package/lib/orchestrate/analyze/orchestrateAnalyzeSectionCrossFileReview.js +1 -1
- package/lib/orchestrate/analyze/orchestrateAnalyzeSectionReview.js +1 -1
- package/lib/orchestrate/analyze/orchestrateAnalyzeWriteSection.js +1 -1
- package/lib/orchestrate/analyze/orchestrateAnalyzeWriteSectionPatch.js +1 -1
- package/lib/orchestrate/analyze/orchestrateAnalyzeWriteUnit.js +1 -1
- package/lib/orchestrate/common/histories/transformCommonCorrectCastingHistory.js +5 -5
- package/lib/orchestrate/common/histories/transformPreliminaryHistory.js +44 -44
- package/lib/orchestrate/common/histories/transformPreviousAndLatestCorrectHistory.js +44 -44
- package/lib/orchestrate/common/internal/fixPrelminaryApplication.js +22 -22
- package/lib/orchestrate/common/internal/validatePreliminary.js +116 -116
- package/lib/orchestrate/facade/createAutoBeFacadeController.js +3 -3
- package/lib/orchestrate/facade/structures/transformFacadeStateMessage.js +20 -20
- package/lib/orchestrate/interface/histories/transformInterfaceActionEndpointReviewHistory.js +34 -34
- package/lib/orchestrate/interface/histories/transformInterfaceActionEndpointWriteHistory.js +37 -37
- package/lib/orchestrate/interface/histories/transformInterfaceAuthorizationHistory.js +56 -56
- package/lib/orchestrate/interface/histories/transformInterfaceBaseEndpointReviewHistory.js +26 -26
- package/lib/orchestrate/interface/histories/transformInterfaceBaseEndpointWriteHistory.js +28 -28
- package/lib/orchestrate/interface/histories/transformInterfaceEndpointAuthorizationSection.js +11 -11
- package/lib/orchestrate/interface/histories/transformInterfaceGroupHistory.js +38 -38
- package/lib/orchestrate/interface/histories/transformInterfaceOperationHistory.js +29 -29
- package/lib/orchestrate/interface/histories/transformInterfaceOperationParameterHistory.js +15 -15
- package/lib/orchestrate/interface/histories/transformInterfaceOperationReviewHistory.js +6 -6
- package/lib/orchestrate/interface/histories/transformInterfacePrerequisiteHistory.js +25 -25
- package/lib/orchestrate/interface/histories/transformInterfaceSchemaCastingHistory.js +67 -67
- package/lib/orchestrate/interface/histories/transformInterfaceSchemaComplementHistory.js +60 -60
- package/lib/orchestrate/interface/histories/transformInterfaceSchemaRefineHistory.js +83 -83
- package/lib/orchestrate/interface/histories/transformInterfaceSchemaRenameHistory.js +29 -29
- package/lib/orchestrate/interface/histories/transformInterfaceSchemaReviewHistory.js +74 -74
- package/lib/orchestrate/interface/histories/transformInterfaceSchemaWriteHistory.js +46 -46
- package/lib/orchestrate/interface/orchestrateInterfaceAuthorization.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfaceEndpointReview.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfaceEndpointWrite.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfaceGroup.js +9 -9
- package/lib/orchestrate/interface/orchestrateInterfaceOperation.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfaceOperationReview.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfacePrerequisite.js +4 -4
- package/lib/orchestrate/interface/orchestrateInterfaceSchemaCasting.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfaceSchemaComplement.js +5 -5
- package/lib/orchestrate/interface/orchestrateInterfaceSchemaRefine.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfaceSchemaReview.js +1 -1
- package/lib/orchestrate/interface/orchestrateInterfaceSchemaWrite.js +1 -1
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceAuthorizationProgrammer.js +90 -90
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceEndpointProgrammer.js +6 -6
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceEndpointReviewProgrammer.js +25 -25
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceOperationProgrammer.js +71 -71
- package/lib/orchestrate/interface/programmers/AutoBeInterfacePrerequisiteProgrammer.js +162 -162
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceSchemaProgrammer.js +11 -11
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceSchemaPropertyReviseProgrammer.js +73 -73
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceSchemaRefineProgrammer.js +35 -35
- package/lib/orchestrate/interface/programmers/AutoBeInterfaceSchemaReviewProgrammer.js +11 -11
- package/lib/orchestrate/interface/utils/AutoBeJsonSchemaFactory.js +4 -4
- package/lib/orchestrate/interface/utils/AutoBeJsonSchemaValidator.js +283 -283
- package/lib/orchestrate/interface/utils/fulfillJsonSchemaErrorMessages.js +76 -76
- package/lib/orchestrate/prisma/histories/transformPrismaAuthorizationHistory.js +76 -76
- package/lib/orchestrate/prisma/histories/transformPrismaAuthorizationReviewHistory.js +51 -51
- package/lib/orchestrate/prisma/histories/transformPrismaComponentReviewHistory.js +54 -54
- package/lib/orchestrate/prisma/histories/transformPrismaComponentsHistory.js +83 -83
- package/lib/orchestrate/prisma/histories/transformPrismaCorrectHistory.js +6 -6
- package/lib/orchestrate/prisma/histories/transformPrismaGroupHistory.js +22 -22
- package/lib/orchestrate/prisma/histories/transformPrismaGroupReviewHistory.js +41 -41
- package/lib/orchestrate/prisma/histories/transformPrismaSchemaHistory.js +39 -39
- package/lib/orchestrate/prisma/histories/transformPrismaSchemaReviewHistory.js +41 -41
- package/lib/orchestrate/prisma/orchestratePrismaAuthorization.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaAuthorizationReview.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaComponent.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaComponentReview.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaCorrect.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaGroup.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaGroupReview.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaSchema.js +1 -1
- package/lib/orchestrate/prisma/orchestratePrismaSchemaReview.js +1 -1
- package/lib/orchestrate/prisma/programmers/AutoBeDatabaseAuthorizationProgrammer.js +23 -23
- package/lib/orchestrate/prisma/programmers/AutoBeDatabaseAuthorizationReviewProgrammer.js +7 -7
- package/lib/orchestrate/prisma/programmers/AutoBeDatabaseComponentProgrammer.js +5 -5
- package/lib/orchestrate/prisma/programmers/AutoBeDatabaseComponentReviewProgrammer.js +20 -20
- package/lib/orchestrate/prisma/programmers/AutoBeDatabaseGroupProgrammer.js +13 -13
- package/lib/orchestrate/prisma/programmers/AutoBeDatabaseGroupReviewProgrammer.js +51 -51
- package/lib/orchestrate/prisma/programmers/AutoBeDatabaseSchemaProgrammer.js +25 -25
- package/lib/orchestrate/realize/histories/transformRealizeAuthorizationCorrectHistory.js +28 -28
- package/lib/orchestrate/realize/histories/transformRealizeAuthorizationWriteHistory.js +14 -14
- package/lib/orchestrate/realize/histories/transformRealizeCollectorCorrectHistory.js +42 -42
- package/lib/orchestrate/realize/histories/transformRealizeCollectorPlanHistory.js +27 -27
- package/lib/orchestrate/realize/histories/transformRealizeCollectorWriteHistory.js +57 -57
- package/lib/orchestrate/realize/histories/transformRealizeCorrectCastingHistory.js +35 -35
- package/lib/orchestrate/realize/histories/transformRealizeOperationCorrectHistory.js +14 -14
- package/lib/orchestrate/realize/histories/transformRealizeOperationWriteHistory.js +37 -37
- package/lib/orchestrate/realize/histories/transformRealizeOperationWriteHistory.js.map +1 -1
- package/lib/orchestrate/realize/histories/transformRealizeTransformerCorrectHistory.js +47 -47
- package/lib/orchestrate/realize/histories/transformRealizeTransformerPlanHistory.js +27 -27
- package/lib/orchestrate/realize/histories/transformRealizeTransformerWriteHistory.js +51 -51
- package/lib/orchestrate/realize/orchestrateRealizeAuthorizationCorrect.js +1 -1
- package/lib/orchestrate/realize/orchestrateRealizeAuthorizationWrite.js +1 -1
- package/lib/orchestrate/realize/orchestrateRealizeCollectorCorrectOverall.js +1 -1
- package/lib/orchestrate/realize/orchestrateRealizeCollectorPlan.js +11 -11
- package/lib/orchestrate/realize/orchestrateRealizeCollectorWrite.js +1 -1
- package/lib/orchestrate/realize/orchestrateRealizeOperationCorrectOverall.js +1 -1
- package/lib/orchestrate/realize/orchestrateRealizeOperationWrite.js +1 -1
- package/lib/orchestrate/realize/orchestrateRealizeTransformerCorrectOverall.js +1 -1
- package/lib/orchestrate/realize/orchestrateRealizeTransformerPlan.js +11 -11
- package/lib/orchestrate/realize/orchestrateRealizeTransformerWrite.js +1 -1
- package/lib/orchestrate/realize/programmers/AutoBeRealizeCollectorProgrammer.js +41 -41
- package/lib/orchestrate/realize/programmers/AutoBeRealizeOperationProgrammer.js +21 -21
- package/lib/orchestrate/realize/programmers/AutoBeRealizeTransformerProgrammer.js +57 -57
- package/lib/orchestrate/realize/utils/getRealizeWriteInputType.js +3 -3
- package/lib/orchestrate/realize/utils/printErrorHints.js +5 -5
- package/lib/orchestrate/test/compile/getTestImportStatements.js +9 -9
- package/lib/orchestrate/test/histories/transformTestAuthorizeWriteHistory.js +38 -38
- package/lib/orchestrate/test/histories/transformTestGenerationWriteHistory.js +79 -79
- package/lib/orchestrate/test/histories/transformTestOperationWriteHistory.js +162 -162
- package/lib/orchestrate/test/histories/transformTestPrepareWriteHistory.js +54 -54
- package/lib/orchestrate/test/histories/transformTestScenarioHistory.js +31 -31
- package/lib/orchestrate/test/histories/transformTestScenarioReviewHistory.js +27 -27
- package/lib/orchestrate/test/orchestrateTestScenario.js +1 -1
- package/lib/orchestrate/test/orchestrateTestScenarioReview.js +1 -1
- package/lib/orchestrate/test/programmers/AutoBeTestAuthorizeProgrammer.js +31 -31
- package/lib/orchestrate/test/programmers/AutoBeTestGenerateProgrammer.js +23 -23
- package/lib/orchestrate/test/programmers/AutoBeTestOperationProgrammer.js +6 -6
- package/lib/orchestrate/test/programmers/AutoBeTestPrepareProgrammer.js +34 -34
- package/lib/orchestrate/test/programmers/AutoBeTestScenarioProgrammer.js +39 -39
- package/lib/utils/predicateStateMessage.js +19 -19
- package/lib/utils/validateEmptyCode.js +16 -16
- package/package.json +5 -5
- package/src/AutoBeAgent.ts +374 -374
- package/src/AutoBeAgentBase.ts +126 -126
- package/src/AutoBeMockAgent.ts +254 -254
- package/src/constants/AutoBeConfigConstant.ts +173 -173
- package/src/constants/AutoBeTemplateFileConstant.ts +1 -1
- package/src/context/AutoBeContext.ts +107 -107
- package/src/context/AutoBeState.ts +66 -66
- package/src/context/AutoBeTokenUsage.ts +307 -307
- package/src/context/AutoBeTokenUsageComponent.ts +227 -227
- package/src/describe/describe.ts +47 -47
- package/src/describe/image/histories/transformImageDescribeDraftHistories.ts +16 -16
- package/src/describe/image/orchestrateImageDescribeDraft.ts +200 -200
- package/src/describe/image/structures/IAutoBeImageDescribeDraftApplication.ts +92 -92
- package/src/describe/imageDescribe.ts +64 -64
- package/src/factory/consentFunctionCall.ts +141 -141
- package/src/factory/createAgenticaHistory.ts +71 -71
- package/src/factory/createAutoBeContext.ts +584 -584
- package/src/factory/createAutoBeMessageContent.ts +36 -36
- package/src/factory/createAutoBeState.ts +20 -20
- package/src/factory/getAutoBeGenerated.ts +317 -317
- package/src/factory/getAutoBeRealizeGenerated.ts +31 -31
- package/src/factory/getCriticalCompiler.ts +52 -52
- package/src/factory/index.ts +1 -1
- package/src/factory/mergeSystemMessages.ts +60 -60
- package/src/factory/supportFunctionCallFallback.ts +214 -214
- package/src/factory/supportMistral.ts +138 -138
- package/src/index.ts +16 -16
- package/src/orchestrate/analyze/fillTocDeterministic.ts +280 -280
- package/src/orchestrate/analyze/histories/transformAnalyzeScenarioHistory.ts +55 -55
- package/src/orchestrate/analyze/histories/transformAnalyzeScenarioReviewHistory.ts +74 -74
- package/src/orchestrate/analyze/histories/transformAnalyzeSectionCrossFileReviewHistory.ts +179 -179
- package/src/orchestrate/analyze/histories/transformAnalyzeSectionReviewHistory.ts +163 -163
- package/src/orchestrate/analyze/histories/transformAnalyzeWriteSectionHistory.ts +191 -191
- package/src/orchestrate/analyze/histories/transformAnalyzeWriteSectionPatchHistory.ts +122 -122
- package/src/orchestrate/analyze/histories/transformAnalyzeWriteUnitHistory.ts +161 -161
- package/src/orchestrate/analyze/index.ts +7 -7
- package/src/orchestrate/analyze/orchestrateAnalyze.ts +1693 -1693
- package/src/orchestrate/analyze/orchestrateAnalyzeScenario.ts +267 -267
- package/src/orchestrate/analyze/orchestrateAnalyzeScenarioReview.ts +122 -122
- package/src/orchestrate/analyze/orchestrateAnalyzeSectionCrossFileReview.ts +146 -146
- package/src/orchestrate/analyze/orchestrateAnalyzeSectionReview.ts +154 -154
- package/src/orchestrate/analyze/orchestrateAnalyzeWriteSection.ts +388 -388
- package/src/orchestrate/analyze/orchestrateAnalyzeWriteSectionPatch.ts +407 -407
- package/src/orchestrate/analyze/orchestrateAnalyzeWriteUnit.ts +348 -348
- package/src/orchestrate/analyze/programmers/AutoBeAnalyzeProgrammer.ts +149 -149
- package/src/orchestrate/analyze/structures/FixedAnalyzeTemplate.ts +961 -961
- package/src/orchestrate/analyze/structures/IAutoBeAnalyzeScenarioApplication.ts +141 -141
- package/src/orchestrate/analyze/structures/IAutoBeAnalyzeScenarioReviewApplication.ts +96 -96
- package/src/orchestrate/analyze/structures/IAutoBeAnalyzeSectionCrossFileReviewApplication.ts +160 -160
- package/src/orchestrate/analyze/structures/IAutoBeAnalyzeSectionReviewApplication.ts +192 -192
- package/src/orchestrate/analyze/structures/IAutoBeAnalyzeWriteSectionApplication.ts +142 -142
- package/src/orchestrate/analyze/structures/IAutoBeAnalyzeWriteUnitApplication.ts +123 -123
- package/src/orchestrate/analyze/utils/buildConstraintConsistencyReport.ts +813 -813
- package/src/orchestrate/analyze/utils/buildErrorCodeRegistry.ts +324 -324
- package/src/orchestrate/analyze/utils/buildHardValidators.ts +88 -88
- package/src/orchestrate/analyze/utils/detectInventedEntities.ts +87 -87
- package/src/orchestrate/analyze/utils/detectProseConstraintConflicts.ts +319 -319
- package/src/orchestrate/analyze/utils/repairSectionReviewUtils.ts +181 -181
- package/src/orchestrate/analyze/utils/repairUtils.ts +60 -60
- package/src/orchestrate/analyze/utils/validateScenarioBasics.ts +104 -104
- package/src/orchestrate/common/AutoBePreliminaryController.ts +400 -400
- package/src/orchestrate/common/histories/transformCommonCorrectCastingHistory.ts +32 -32
- package/src/orchestrate/common/histories/transformPreliminaryHistory.ts +742 -742
- package/src/orchestrate/common/histories/transformPreviousAndLatestCorrectHistory.ts +77 -77
- package/src/orchestrate/common/internal/complementPreliminaryCollection.ts +263 -263
- package/src/orchestrate/common/internal/convertToSectionEntries.ts +57 -57
- package/src/orchestrate/common/internal/createPreliminaryCollection.ts +76 -76
- package/src/orchestrate/common/internal/fixPrelminaryApplication.ts +346 -346
- package/src/orchestrate/common/internal/validatePreliminary.ts +671 -671
- package/src/orchestrate/common/orchestrateCommonCorrectCasting.ts +223 -223
- package/src/orchestrate/common/orchestratePreliminary.ts +610 -610
- package/src/orchestrate/common/structures/AutoBePreliminaryRequest.ts +42 -42
- package/src/orchestrate/common/structures/IAnalysisSectionEntry.ts +35 -35
- package/src/orchestrate/common/structures/IAutoBeCommonCorrectCastingApplication.ts +72 -72
- package/src/orchestrate/common/structures/IAutoBeOrchestrateResult.ts +28 -28
- package/src/orchestrate/common/structures/IAutoBePreliminaryCollection.ts +52 -52
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetAnalysisSections.ts +34 -34
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetDatabaseSchemas.ts +31 -31
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetInterfaceOperations.ts +32 -32
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetInterfaceSchemas.ts +31 -31
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousAnalysisSections.ts +28 -28
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousDatabaseSchemas.ts +88 -88
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousInterfaceOperations.ts +102 -102
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousInterfaceSchemas.ts +105 -105
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetRealizeCollectors.ts +32 -32
- package/src/orchestrate/common/structures/IAutoBePreliminaryGetRealizeTransformers.ts +32 -32
- package/src/orchestrate/facade/createAutoBeFacadeController.ts +118 -118
- package/src/orchestrate/facade/histories/IAutoBeFacadeApplication.ts +139 -139
- package/src/orchestrate/facade/histories/IAutoBeFacadeApplicationProps.ts +8 -8
- package/src/orchestrate/facade/histories/IAutoBeFacadeApplicationResult.ts +9 -9
- package/src/orchestrate/facade/structures/transformFacadeStateMessage.ts +59 -59
- package/src/orchestrate/index.ts +5 -5
- package/src/orchestrate/interface/histories/transformInterfaceActionEndpointReviewHistory.ts +83 -83
- package/src/orchestrate/interface/histories/transformInterfaceActionEndpointWriteHistory.ts +78 -78
- package/src/orchestrate/interface/histories/transformInterfaceAuthorizationHistory.ts +129 -129
- package/src/orchestrate/interface/histories/transformInterfaceBaseEndpointReviewHistory.ts +74 -74
- package/src/orchestrate/interface/histories/transformInterfaceBaseEndpointWriteHistory.ts +68 -68
- package/src/orchestrate/interface/histories/transformInterfaceCommonHistory.ts +64 -64
- package/src/orchestrate/interface/histories/transformInterfaceEndpointAuthorizationSection.ts +42 -42
- package/src/orchestrate/interface/histories/transformInterfaceGroupHistory.ts +103 -103
- package/src/orchestrate/interface/histories/transformInterfaceOperationHistory.ts +81 -81
- package/src/orchestrate/interface/histories/transformInterfaceOperationParameterHistory.ts +53 -53
- package/src/orchestrate/interface/histories/transformInterfaceOperationReviewHistory.ts +49 -49
- package/src/orchestrate/interface/histories/transformInterfacePrerequisiteHistory.ts +94 -94
- package/src/orchestrate/interface/histories/transformInterfaceSchemaCastingHistory.ts +122 -122
- package/src/orchestrate/interface/histories/transformInterfaceSchemaComplementHistory.ts +192 -192
- package/src/orchestrate/interface/histories/transformInterfaceSchemaRefineHistory.ts +189 -189
- package/src/orchestrate/interface/histories/transformInterfaceSchemaRenameHistory.ts +63 -63
- package/src/orchestrate/interface/histories/transformInterfaceSchemaReviewHistory.ts +173 -173
- package/src/orchestrate/interface/histories/transformInterfaceSchemaWriteHistory.ts +88 -88
- package/src/orchestrate/interface/index.ts +6 -6
- package/src/orchestrate/interface/orchestrateInterface.ts +118 -118
- package/src/orchestrate/interface/orchestrateInterfaceActionEndpoint.ts +58 -58
- package/src/orchestrate/interface/orchestrateInterfaceAuthorization.ts +208 -208
- package/src/orchestrate/interface/orchestrateInterfaceBaseEndpoint.ts +55 -55
- package/src/orchestrate/interface/orchestrateInterfaceEndpoint.ts +67 -67
- package/src/orchestrate/interface/orchestrateInterfaceEndpointOverall.ts +80 -80
- package/src/orchestrate/interface/orchestrateInterfaceEndpointReview.ts +212 -212
- package/src/orchestrate/interface/orchestrateInterfaceEndpointWrite.ts +236 -236
- package/src/orchestrate/interface/orchestrateInterfaceGroup.ts +166 -166
- package/src/orchestrate/interface/orchestrateInterfaceOperation.ts +322 -322
- package/src/orchestrate/interface/orchestrateInterfaceOperationReview.ts +245 -245
- package/src/orchestrate/interface/orchestrateInterfacePrerequisite.ts +240 -240
- package/src/orchestrate/interface/orchestrateInterfaceSchema.ts +191 -191
- package/src/orchestrate/interface/orchestrateInterfaceSchemaCasting.ts +274 -274
- package/src/orchestrate/interface/orchestrateInterfaceSchemaComplement.ts +329 -329
- package/src/orchestrate/interface/orchestrateInterfaceSchemaRefine.ts +292 -292
- package/src/orchestrate/interface/orchestrateInterfaceSchemaRename.ts +266 -266
- package/src/orchestrate/interface/orchestrateInterfaceSchemaReview.ts +310 -310
- package/src/orchestrate/interface/orchestrateInterfaceSchemaWrite.ts +283 -283
- package/src/orchestrate/interface/programmers/AutoBeInterfaceAuthorizationProgrammer.ts +260 -260
- package/src/orchestrate/interface/programmers/AutoBeInterfaceEndpointProgrammer.ts +155 -155
- package/src/orchestrate/interface/programmers/AutoBeInterfaceEndpointReviewProgrammer.ts +139 -139
- package/src/orchestrate/interface/programmers/AutoBeInterfaceOperationProgrammer.ts +277 -277
- package/src/orchestrate/interface/programmers/AutoBeInterfacePrerequisiteProgrammer.ts +259 -259
- package/src/orchestrate/interface/programmers/AutoBeInterfaceSchemaProgrammer.ts +152 -152
- package/src/orchestrate/interface/programmers/AutoBeInterfaceSchemaPropertyReviseProgrammer.ts +347 -347
- package/src/orchestrate/interface/programmers/AutoBeInterfaceSchemaRefineProgrammer.ts +183 -183
- package/src/orchestrate/interface/programmers/AutoBeInterfaceSchemaReviewProgrammer.ts +263 -263
- package/src/orchestrate/interface/structures/IAutoBeInterfaceAuthorizationApplication.ts +135 -135
- package/src/orchestrate/interface/structures/IAutoBeInterfaceEndpointReviewApplication.ts +128 -128
- package/src/orchestrate/interface/structures/IAutoBeInterfaceEndpointWriteApplication.ts +133 -133
- package/src/orchestrate/interface/structures/IAutoBeInterfaceGroupApplication.ts +122 -122
- package/src/orchestrate/interface/structures/IAutoBeInterfaceOperationApplication.ts +178 -178
- package/src/orchestrate/interface/structures/IAutoBeInterfaceOperationReviewApplication.ts +175 -175
- package/src/orchestrate/interface/structures/IAutoBeInterfacePrerequisiteApplication.ts +130 -130
- package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaApplication.ts +121 -121
- package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaCastingApplication.ts +153 -153
- package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaComplementApplication.ts +123 -123
- package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaRefineApplication.ts +181 -181
- package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaRenameApplication.ts +45 -45
- package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaReviewApplication.ts +108 -108
- package/src/orchestrate/interface/utils/AutoBeJsonSchemaCollection.ts +42 -42
- package/src/orchestrate/interface/utils/AutoBeJsonSchemaFactory.ts +714 -714
- package/src/orchestrate/interface/utils/AutoBeJsonSchemaNamingConvention.ts +86 -86
- package/src/orchestrate/interface/utils/AutoBeJsonSchemaValidator.ts +725 -725
- package/src/orchestrate/interface/utils/fulfillJsonSchemaErrorMessages.ts +219 -219
- package/src/orchestrate/prisma/histories/transformPrismaAuthorizationHistory.ts +144 -144
- package/src/orchestrate/prisma/histories/transformPrismaAuthorizationReviewHistory.ts +104 -104
- package/src/orchestrate/prisma/histories/transformPrismaComponentReviewHistory.ts +97 -97
- package/src/orchestrate/prisma/histories/transformPrismaComponentsHistory.ts +136 -136
- package/src/orchestrate/prisma/histories/transformPrismaCorrectHistory.ts +41 -41
- package/src/orchestrate/prisma/histories/transformPrismaGroupHistory.ts +63 -63
- package/src/orchestrate/prisma/histories/transformPrismaGroupReviewHistory.ts +79 -79
- package/src/orchestrate/prisma/histories/transformPrismaSchemaHistory.ts +97 -97
- package/src/orchestrate/prisma/histories/transformPrismaSchemaReviewHistory.ts +126 -126
- package/src/orchestrate/prisma/index.ts +7 -7
- package/src/orchestrate/prisma/orchestratePrisma.ts +296 -296
- package/src/orchestrate/prisma/orchestratePrismaAuthorization.ts +173 -173
- package/src/orchestrate/prisma/orchestratePrismaAuthorizationReview.ts +183 -183
- package/src/orchestrate/prisma/orchestratePrismaComponent.ts +205 -205
- package/src/orchestrate/prisma/orchestratePrismaComponentReview.ts +205 -205
- package/src/orchestrate/prisma/orchestratePrismaCorrect.ts +265 -265
- package/src/orchestrate/prisma/orchestratePrismaGroup.ts +121 -121
- package/src/orchestrate/prisma/orchestratePrismaGroupReview.ts +141 -141
- package/src/orchestrate/prisma/orchestratePrismaSchema.ts +218 -218
- package/src/orchestrate/prisma/orchestratePrismaSchemaReview.ts +220 -220
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseAuthorizationProgrammer.ts +86 -86
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseAuthorizationReviewProgrammer.ts +103 -103
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseComponentProgrammer.ts +80 -80
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseComponentReviewProgrammer.ts +168 -168
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseGroupProgrammer.ts +63 -63
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseGroupReviewProgrammer.ts +210 -210
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseModelProgrammer.ts +57 -57
- package/src/orchestrate/prisma/programmers/AutoBeDatabaseSchemaProgrammer.ts +92 -92
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseAuthorizationApplication.ts +147 -147
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseAuthorizationReviewApplication.ts +153 -153
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseComponentApplication.ts +142 -142
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseComponentReviewApplication.ts +151 -151
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseCorrectApplication.ts +157 -157
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseGroupApplication.ts +117 -117
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseGroupReviewApplication.ts +154 -154
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseSchemaApplication.ts +144 -144
- package/src/orchestrate/prisma/structures/IAutoBeDatabaseSchemaReviewApplication.ts +138 -138
- package/src/orchestrate/realize/histories/transformRealizeAuthorizationCorrectHistory.ts +89 -89
- package/src/orchestrate/realize/histories/transformRealizeAuthorizationWriteHistory.ts +45 -45
- package/src/orchestrate/realize/histories/transformRealizeCollectorCorrectHistory.ts +137 -137
- package/src/orchestrate/realize/histories/transformRealizeCollectorPlanHistory.ts +64 -64
- package/src/orchestrate/realize/histories/transformRealizeCollectorWriteHistory.ts +147 -147
- package/src/orchestrate/realize/histories/transformRealizeCorrectCastingHistory.ts +69 -69
- package/src/orchestrate/realize/histories/transformRealizeOperationCorrectHistory.ts +94 -94
- package/src/orchestrate/realize/histories/transformRealizeOperationWriteHistory.ts +127 -127
- package/src/orchestrate/realize/histories/transformRealizeTransformerCorrectHistory.ts +147 -147
- package/src/orchestrate/realize/histories/transformRealizeTransformerPlanHistory.ts +61 -61
- package/src/orchestrate/realize/histories/transformRealizeTransformerWriteHistory.ts +133 -133
- package/src/orchestrate/realize/histories/transformRealizeWriteMembershipHistory.ts +30 -30
- package/src/orchestrate/realize/index.ts +3 -3
- package/src/orchestrate/realize/internal/orchestrateRealizeCorrectCasting.ts +444 -444
- package/src/orchestrate/realize/internal/orchestrateRealizeCorrectOverall.ts +449 -449
- package/src/orchestrate/realize/orchestrateRealize.ts +143 -143
- package/src/orchestrate/realize/orchestrateRealizeAuthorizationCorrect.ts +207 -207
- package/src/orchestrate/realize/orchestrateRealizeAuthorizationWrite.ts +209 -209
- package/src/orchestrate/realize/orchestrateRealizeCollector.ts +41 -41
- package/src/orchestrate/realize/orchestrateRealizeCollectorCorrectCasting.ts +43 -43
- package/src/orchestrate/realize/orchestrateRealizeCollectorCorrectOverall.ts +157 -157
- package/src/orchestrate/realize/orchestrateRealizeCollectorPlan.ts +264 -264
- package/src/orchestrate/realize/orchestrateRealizeCollectorWrite.ts +225 -225
- package/src/orchestrate/realize/orchestrateRealizeOperation.ts +48 -48
- package/src/orchestrate/realize/orchestrateRealizeOperationCorrectCasting.ts +69 -69
- package/src/orchestrate/realize/orchestrateRealizeOperationCorrectOverall.ts +173 -173
- package/src/orchestrate/realize/orchestrateRealizeOperationWrite.ts +262 -262
- package/src/orchestrate/realize/orchestrateRealizeTransformer.ts +41 -41
- package/src/orchestrate/realize/orchestrateRealizeTransformerCorrectCasting.ts +38 -38
- package/src/orchestrate/realize/orchestrateRealizeTransformerCorrectOverall.ts +160 -160
- package/src/orchestrate/realize/orchestrateRealizeTransformerPlan.ts +254 -254
- package/src/orchestrate/realize/orchestrateRealizeTransformerWrite.ts +226 -226
- package/src/orchestrate/realize/programmers/AutoBeRealizeCollectorProgrammer.ts +424 -424
- package/src/orchestrate/realize/programmers/AutoBeRealizeOperationProgrammer.ts +409 -409
- package/src/orchestrate/realize/programmers/AutoBeRealizeTransformerProgrammer.ts +451 -451
- package/src/orchestrate/realize/programmers/compileRealizeFiles.ts +65 -65
- package/src/orchestrate/realize/structures/IAutoBeRealizeAuthorizationCorrectApplication.ts +119 -119
- package/src/orchestrate/realize/structures/IAutoBeRealizeAuthorizationWriteApplication.ts +167 -167
- package/src/orchestrate/realize/structures/IAutoBeRealizeCollectorCorrectApplication.ts +191 -191
- package/src/orchestrate/realize/structures/IAutoBeRealizeCollectorPlanApplication.ts +177 -177
- package/src/orchestrate/realize/structures/IAutoBeRealizeCollectorWriteApplication.ts +207 -207
- package/src/orchestrate/realize/structures/IAutoBeRealizeFunctionFailure.ts +11 -11
- package/src/orchestrate/realize/structures/IAutoBeRealizeOperationCorrectApplication.ts +134 -134
- package/src/orchestrate/realize/structures/IAutoBeRealizeOperationWriteApplication.ts +138 -138
- package/src/orchestrate/realize/structures/IAutoBeRealizeScenarioResult.ts +32 -32
- package/src/orchestrate/realize/structures/IAutoBeRealizeTransformerCorrectApplication.ts +248 -248
- package/src/orchestrate/realize/structures/IAutoBeRealizeTransformerPlanApplication.ts +150 -150
- package/src/orchestrate/realize/structures/IAutoBeRealizeTransformerWriteApplication.ts +278 -278
- package/src/orchestrate/realize/utils/AuthorizationFileSystem.ts +10 -10
- package/src/orchestrate/realize/utils/AutoBeRealizeAuthorizationFileSystem.ts +9 -9
- package/src/orchestrate/realize/utils/AutoBeRealizeAuthorizationReplaceImport.ts +62 -62
- package/src/orchestrate/realize/utils/InternalFileSystem.ts +12 -12
- package/src/orchestrate/realize/utils/ProviderFileSystem.ts +4 -4
- package/src/orchestrate/realize/utils/filterDiagnostics.ts +25 -25
- package/src/orchestrate/realize/utils/generateTS2339Hints.ts +54 -54
- package/src/orchestrate/realize/utils/getRealizeWriteImportStatements.ts +42 -42
- package/src/orchestrate/realize/utils/getRealizeWriteInputType.ts +88 -88
- package/src/orchestrate/realize/utils/printErrorHints.ts +54 -54
- package/src/orchestrate/test/compile/getTestArtifacts.ts +124 -124
- package/src/orchestrate/test/compile/getTestExternalDeclarations.ts +39 -39
- package/src/orchestrate/test/compile/getTestImportStatements.ts +27 -27
- package/src/orchestrate/test/experimental/orchestrateTestCorrect.ast +237 -237
- package/src/orchestrate/test/experimental/orchestrateTestWrite.ast +322 -322
- package/src/orchestrate/test/experimental/transformTestCorrectHistories.ast +52 -52
- package/src/orchestrate/test/histories/transformTestAuthorizeWriteHistory.ts +80 -80
- package/src/orchestrate/test/histories/transformTestCorrectOverallHistory.ts +116 -116
- package/src/orchestrate/test/histories/transformTestGenerationWriteHistory.ts +118 -118
- package/src/orchestrate/test/histories/transformTestOperationWriteHistory.ts +287 -287
- package/src/orchestrate/test/histories/transformTestPrepareWriteHistory.ts +95 -95
- package/src/orchestrate/test/histories/transformTestScenarioHistory.ts +120 -120
- package/src/orchestrate/test/histories/transformTestScenarioReviewHistory.ts +99 -99
- package/src/orchestrate/test/histories/transformTestValidateEvent.ts +11 -11
- package/src/orchestrate/test/index.ts +5 -5
- package/src/orchestrate/test/internal/orchestrateTestCorrectCasting.ts +96 -96
- package/src/orchestrate/test/internal/orchestrateTestCorrectOverall.ts +219 -219
- package/src/orchestrate/test/internal/orchestrateTestCorrectRequest.ts +206 -206
- package/src/orchestrate/test/orchestrateTest.ts +161 -161
- package/src/orchestrate/test/orchestrateTestAuthorize.ts +125 -125
- package/src/orchestrate/test/orchestrateTestAuthorizeWrite.ts +263 -263
- package/src/orchestrate/test/orchestrateTestGenerate.ts +121 -121
- package/src/orchestrate/test/orchestrateTestGenerateWrite.ts +211 -211
- package/src/orchestrate/test/orchestrateTestOperation.ts +133 -133
- package/src/orchestrate/test/orchestrateTestOperationWrite.ts +221 -221
- package/src/orchestrate/test/orchestrateTestPrepare.ts +117 -117
- package/src/orchestrate/test/orchestrateTestPrepareWrite.ts +264 -264
- package/src/orchestrate/test/orchestrateTestScenario.ts +290 -290
- package/src/orchestrate/test/orchestrateTestScenarioReview.ts +262 -262
- package/src/orchestrate/test/programmers/AutoBeTestAuthorizeProgrammer.ts +149 -149
- package/src/orchestrate/test/programmers/AutoBeTestFunctionProgrammer.ts +90 -90
- package/src/orchestrate/test/programmers/AutoBeTestGenerateProgrammer.ts +170 -170
- package/src/orchestrate/test/programmers/AutoBeTestOperationProgrammer.ts +168 -168
- package/src/orchestrate/test/programmers/AutoBeTestPrepareProgrammer.ts +261 -261
- package/src/orchestrate/test/programmers/AutoBeTestScenarioProgrammer.ts +316 -316
- package/src/orchestrate/test/structures/IAutoBeTestArtifacts.ts +8 -8
- package/src/orchestrate/test/structures/IAutoBeTestAuthorizationWriteApplication.ts +113 -113
- package/src/orchestrate/test/structures/IAutoBeTestAuthorizeWriteResult.ts +10 -10
- package/src/orchestrate/test/structures/IAutoBeTestCorrectOverallApplication.ts +134 -134
- package/src/orchestrate/test/structures/IAutoBeTestCorrectRequestApplication.ts +152 -152
- package/src/orchestrate/test/structures/IAutoBeTestFunction.ts +10 -10
- package/src/orchestrate/test/structures/IAutoBeTestFunctionFailure.ts +10 -10
- package/src/orchestrate/test/structures/IAutoBeTestGenerateProcedure.ts +15 -15
- package/src/orchestrate/test/structures/IAutoBeTestGenerationWriteApplication.ts +145 -145
- package/src/orchestrate/test/structures/IAutoBeTestOperationProcedure.ts +17 -17
- package/src/orchestrate/test/structures/IAutoBeTestOperationWriteApplication.ts +162 -162
- package/src/orchestrate/test/structures/IAutoBeTestPrepareCorrectOverallApplication.ts +194 -194
- package/src/orchestrate/test/structures/IAutoBeTestPrepareProcedure.ts +8 -8
- package/src/orchestrate/test/structures/IAutoBeTestPrepareWriteApplication.ts +147 -147
- package/src/orchestrate/test/structures/IAutoBeTestProcedure.ts +10 -10
- package/src/orchestrate/test/structures/IAutoBeTestScenarioApplication.ts +105 -105
- package/src/orchestrate/test/structures/IAutoBeTestScenarioArtifacts.ts +8 -8
- package/src/orchestrate/test/structures/IAutoBeTestScenarioAuthorizationActor.ts +7 -7
- package/src/orchestrate/test/structures/IAutoBeTestScenarioReviewApplication.ts +133 -133
- package/src/orchestrate/test/utils/getPrerequisites.ts +51 -51
- package/src/orchestrate/test/utils/getReferenceIds.ts +26 -26
- package/src/orchestrate/test/utils/insertScriptToTestResult.ts +14 -14
- package/src/structures/IAutoBeConfig.ts +110 -110
- package/src/structures/IAutoBeOrchestrateHistory.ts +44 -44
- package/src/structures/IAutoBeProps.ts +102 -102
- package/src/structures/IAutoBeVendor.ts +113 -113
- package/src/utils/AutoBePreliminaryExhaustedError.ts +30 -30
- package/src/utils/AutoBeTimeoutError.ts +35 -35
- package/src/utils/EmbeddingProvider.ts +4 -4
- package/src/utils/LocalEmbeddingProvider.ts +145 -145
- package/src/utils/RAGRetrieval.ts +411 -411
- package/src/utils/TimedConversation.ts +125 -125
- package/src/utils/backoffRetry.ts +169 -169
- package/src/utils/divideArray.ts +35 -35
- package/src/utils/emplaceMap.ts +31 -31
- package/src/utils/executeCachedBatch.ts +67 -67
- package/src/utils/forceRetry.ts +15 -15
- package/src/utils/getEmbedder.ts +16 -16
- package/src/utils/parseTextFunctionCall.ts +437 -437
- package/src/utils/predicateStateMessage.ts +131 -131
- package/src/utils/validateEmptyCode.ts +73 -73
- package/src/utils/validateEnglishOnly.ts +224 -224
- package/README.md +0 -261
|
@@ -1,319 +1,319 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AutoBeAnalyze,
|
|
3
|
-
AutoBeAnalyzeWriteSectionEvent,
|
|
4
|
-
} from "@autobe/interface";
|
|
5
|
-
import YAML from "yaml";
|
|
6
|
-
|
|
7
|
-
// ─── Types ───
|
|
8
|
-
|
|
9
|
-
export interface IProseConstraintConflict {
|
|
10
|
-
entityAttr: string;
|
|
11
|
-
canonicalValues: number[];
|
|
12
|
-
proseValues: number[];
|
|
13
|
-
file: string;
|
|
14
|
-
sectionTitle: string;
|
|
15
|
-
context: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
type FileSectionInput = Array<{
|
|
19
|
-
file: AutoBeAnalyze.IFileScenario;
|
|
20
|
-
sectionEvents: AutoBeAnalyzeWriteSectionEvent[][];
|
|
21
|
-
}>;
|
|
22
|
-
|
|
23
|
-
// ─── Constants ───
|
|
24
|
-
|
|
25
|
-
const YAML_CODE_BLOCK_REGEX = /```yaml\n[\s\S]*?```/g;
|
|
26
|
-
const CANONICAL_FILENAME = "02-domain-model.md";
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Numeric constraint patterns found in prose text. Matches: "300 characters",
|
|
30
|
-
* "1-50 characters", "1–150 characters", "up to 2000 characters", "maximum 500
|
|
31
|
-
* chars", "minimum 8 characters", "exceeds 300 characters", "at least 1
|
|
32
|
-
* character", "at most 200 characters".
|
|
33
|
-
*/
|
|
34
|
-
const NUMERIC_PATTERNS: RegExp[] = [
|
|
35
|
-
// Range: "1-50 characters", "1–150 characters", "0–300 characters"
|
|
36
|
-
/(\d+)\s*[–\-]\s*(\d+)\s*(?:characters|chars?|unicode characters)/gi,
|
|
37
|
-
// Single number with unit: "300 characters", "2000 characters"
|
|
38
|
-
/(?:up to|maximum|max|at most|no more than|exceeds?|at least|minimum|min|no less than)\s+(\d+)\s*(?:characters|chars?|unicode characters)/gi,
|
|
39
|
-
// Plain: "N characters" (when preceded by constraint-like context)
|
|
40
|
-
/(?:limited to|restricted to|capped at|allow(?:s|ed)?)\s+(\d+)\s*(?:characters|chars?|unicode characters)/gi,
|
|
41
|
-
];
|
|
42
|
-
|
|
43
|
-
// ─── Helpers ───
|
|
44
|
-
|
|
45
|
-
function escapeRegExp(str: string): string {
|
|
46
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// ─── Canonical Registry ───
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Build a map of Entity.attribute → canonical numeric values from
|
|
53
|
-
* 02-domain-model YAML blocks.
|
|
54
|
-
*/
|
|
55
|
-
function buildCanonicalNumericRegistry(
|
|
56
|
-
canonicalFile: FileSectionInput[number],
|
|
57
|
-
): Map<string, number[]> {
|
|
58
|
-
const registry: Map<string, number[]> = new Map();
|
|
59
|
-
|
|
60
|
-
for (const sectionsForModule of canonicalFile.sectionEvents) {
|
|
61
|
-
for (const sectionEvent of sectionsForModule) {
|
|
62
|
-
for (const section of sectionEvent.sectionSections) {
|
|
63
|
-
const yamlMatches = section.content.matchAll(/```yaml\n([\s\S]*?)```/g);
|
|
64
|
-
for (const match of yamlMatches) {
|
|
65
|
-
const yamlContent = match[1] ?? "";
|
|
66
|
-
try {
|
|
67
|
-
const parsed = YAML.parse(yamlContent);
|
|
68
|
-
if (
|
|
69
|
-
!parsed ||
|
|
70
|
-
typeof parsed !== "object" ||
|
|
71
|
-
typeof parsed.entity !== "string" ||
|
|
72
|
-
!Array.isArray(parsed.attributes)
|
|
73
|
-
)
|
|
74
|
-
continue;
|
|
75
|
-
|
|
76
|
-
for (const attr of parsed.attributes) {
|
|
77
|
-
if (!attr || typeof attr.name !== "string") continue;
|
|
78
|
-
const constraintStr = String(attr.constraints ?? "");
|
|
79
|
-
const numbers = extractAllNumbers(constraintStr);
|
|
80
|
-
if (numbers.length === 0) continue;
|
|
81
|
-
const key = `${parsed.entity}.${attr.name}`;
|
|
82
|
-
registry.set(key, numbers);
|
|
83
|
-
}
|
|
84
|
-
} catch {
|
|
85
|
-
// skip parse errors
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return registry;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Build a reverse index: attribute name → list of Entity.attribute keys. e.g.,
|
|
97
|
-
* "bio" → ["User.bio"], "title" → ["Article.title", "Todo.title"]
|
|
98
|
-
*/
|
|
99
|
-
function buildAttributeNameIndex(
|
|
100
|
-
registry: Map<string, number[]>,
|
|
101
|
-
): Map<string, string[]> {
|
|
102
|
-
const index: Map<string, string[]> = new Map();
|
|
103
|
-
for (const key of registry.keys()) {
|
|
104
|
-
const dotIdx = key.indexOf(".");
|
|
105
|
-
if (dotIdx < 0) continue;
|
|
106
|
-
const attrName = key.slice(dotIdx + 1);
|
|
107
|
-
if (!index.has(attrName)) index.set(attrName, []);
|
|
108
|
-
index.get(attrName)!.push(key);
|
|
109
|
-
}
|
|
110
|
-
return index;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Extract all integer numbers from a constraint string. "1-50, required" → [1,
|
|
115
|
-
* 50] "optional, maximum 2000 characters, may be null" → [2000]
|
|
116
|
-
*/
|
|
117
|
-
function extractAllNumbers(value: string): number[] {
|
|
118
|
-
const nums: Set<number> = new Set();
|
|
119
|
-
const matches = value.matchAll(/\d+/g);
|
|
120
|
-
for (const m of matches) {
|
|
121
|
-
const n = parseInt(m[0], 10);
|
|
122
|
-
if (!isNaN(n)) nums.add(n);
|
|
123
|
-
}
|
|
124
|
-
return [...nums];
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// ─── Prose Constraint Extraction (Value-Driven) ───
|
|
128
|
-
|
|
129
|
-
interface IProseMention {
|
|
130
|
-
entityAttr: string;
|
|
131
|
-
numbers: number[];
|
|
132
|
-
context: string;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Value-driven prose constraint extraction.
|
|
137
|
-
*
|
|
138
|
-
* Instead of finding backtick references first, this approach:
|
|
139
|
-
*
|
|
140
|
-
* 1. Finds lines with numeric constraint patterns ("N characters", etc.)
|
|
141
|
-
* 2. Checks if any canonical attribute name appears on that line
|
|
142
|
-
* 3. Compares the numbers against canonical values
|
|
143
|
-
*
|
|
144
|
-
* This catches all patterns regardless of backtick usage:
|
|
145
|
-
*
|
|
146
|
-
* - `User.bio`: 0-300 characters
|
|
147
|
-
* - `bio` (0-500 chars)
|
|
148
|
-
* - Bio text limited to 300 characters
|
|
149
|
-
* - | bio | 0-300 chars |
|
|
150
|
-
*/
|
|
151
|
-
function extractProseConstraintMentions(
|
|
152
|
-
proseContent: string,
|
|
153
|
-
attrNameIndex: Map<string, string[]>,
|
|
154
|
-
registry: Map<string, number[]>,
|
|
155
|
-
): IProseMention[] {
|
|
156
|
-
const results: IProseMention[] = [];
|
|
157
|
-
const lines = proseContent.split("\n");
|
|
158
|
-
|
|
159
|
-
for (const line of lines) {
|
|
160
|
-
// Step 1: Extract constraint-like numbers from this line
|
|
161
|
-
const numbers = extractConstraintNumbers(line);
|
|
162
|
-
if (numbers.length === 0) continue;
|
|
163
|
-
|
|
164
|
-
// Step 2: Check if any canonical attribute name appears on this line
|
|
165
|
-
for (const [attrName, entityAttrs] of attrNameIndex) {
|
|
166
|
-
const attrPattern = new RegExp(`\\b${escapeRegExp(attrName)}\\b`, "i");
|
|
167
|
-
if (!attrPattern.test(line)) continue;
|
|
168
|
-
|
|
169
|
-
// Step 3: Union all canonical values for all possible Entity.attr matches
|
|
170
|
-
const allCanonical: Set<number> = new Set();
|
|
171
|
-
for (const ea of entityAttrs) {
|
|
172
|
-
const vals = registry.get(ea);
|
|
173
|
-
if (vals) for (const v of vals) allCanonical.add(v);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Step 4: Find numbers that don't match any canonical value
|
|
177
|
-
const conflicting = numbers.filter(
|
|
178
|
-
(n) => !allCanonical.has(n) && n !== 0,
|
|
179
|
-
);
|
|
180
|
-
if (conflicting.length === 0) continue;
|
|
181
|
-
|
|
182
|
-
results.push({
|
|
183
|
-
entityAttr: entityAttrs[0]!,
|
|
184
|
-
numbers,
|
|
185
|
-
context: line.trim().slice(0, 200),
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Deduplicate: same entityAttr + same numbers → keep first
|
|
191
|
-
const seen: Map<string, IProseMention> = new Map();
|
|
192
|
-
for (const mention of results) {
|
|
193
|
-
const key = `${mention.entityAttr}:${mention.numbers.sort((a, b) => a - b).join(",")}`;
|
|
194
|
-
if (!seen.has(key)) seen.set(key, mention);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return [...seen.values()];
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Extract numbers from constraint-like patterns in text. Only extracts numbers
|
|
202
|
-
* that appear in constraint context (near "characters", etc.).
|
|
203
|
-
*/
|
|
204
|
-
function extractConstraintNumbers(text: string): number[] {
|
|
205
|
-
const numbers: Set<number> = new Set();
|
|
206
|
-
|
|
207
|
-
for (const pattern of NUMERIC_PATTERNS) {
|
|
208
|
-
pattern.lastIndex = 0;
|
|
209
|
-
const matches = text.matchAll(pattern);
|
|
210
|
-
for (const m of matches) {
|
|
211
|
-
if (m[1]) {
|
|
212
|
-
const n = parseInt(m[1], 10);
|
|
213
|
-
if (!isNaN(n)) numbers.add(n);
|
|
214
|
-
}
|
|
215
|
-
if (m[2]) {
|
|
216
|
-
const n = parseInt(m[2], 10);
|
|
217
|
-
if (!isNaN(n)) numbers.add(n);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return [...numbers];
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// ─── Main Detection ───
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Detect prose-level constraint value conflicts between non-canonical files and
|
|
229
|
-
* the canonical 02-domain-model.
|
|
230
|
-
*
|
|
231
|
-
* Uses a value-driven approach: builds a reverse index of canonical attribute
|
|
232
|
-
* names, then scans prose text for those names near numeric constraint
|
|
233
|
-
* patterns. Catches all patterns regardless of backtick usage.
|
|
234
|
-
*/
|
|
235
|
-
export const detectProseConstraintConflicts = (props: {
|
|
236
|
-
files: FileSectionInput;
|
|
237
|
-
}): IProseConstraintConflict[] => {
|
|
238
|
-
// Find canonical file (02-domain-model.md)
|
|
239
|
-
const canonicalFile = props.files.find(
|
|
240
|
-
(f) => f.file.filename === CANONICAL_FILENAME,
|
|
241
|
-
);
|
|
242
|
-
if (!canonicalFile) return [];
|
|
243
|
-
|
|
244
|
-
const registry = buildCanonicalNumericRegistry(canonicalFile);
|
|
245
|
-
if (registry.size === 0) return [];
|
|
246
|
-
|
|
247
|
-
const attrNameIndex = buildAttributeNameIndex(registry);
|
|
248
|
-
|
|
249
|
-
const conflicts: IProseConstraintConflict[] = [];
|
|
250
|
-
|
|
251
|
-
for (const { file, sectionEvents } of props.files) {
|
|
252
|
-
// Skip canonical file itself
|
|
253
|
-
if (file.filename === CANONICAL_FILENAME) continue;
|
|
254
|
-
|
|
255
|
-
for (const sectionsForModule of sectionEvents) {
|
|
256
|
-
for (const sectionEvent of sectionsForModule) {
|
|
257
|
-
for (const section of sectionEvent.sectionSections) {
|
|
258
|
-
// Strip YAML code blocks — those are handled by existing validators
|
|
259
|
-
const proseContent = section.content.replace(
|
|
260
|
-
YAML_CODE_BLOCK_REGEX,
|
|
261
|
-
"",
|
|
262
|
-
);
|
|
263
|
-
|
|
264
|
-
const mentions = extractProseConstraintMentions(
|
|
265
|
-
proseContent,
|
|
266
|
-
attrNameIndex,
|
|
267
|
-
registry,
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
for (const mention of mentions) {
|
|
271
|
-
const canonicalValues = registry.get(mention.entityAttr);
|
|
272
|
-
if (!canonicalValues) continue;
|
|
273
|
-
|
|
274
|
-
// Check if prose values conflict with canonical
|
|
275
|
-
const conflictingValues = mention.numbers.filter(
|
|
276
|
-
(n) => !canonicalValues.includes(n) && n !== 0,
|
|
277
|
-
);
|
|
278
|
-
|
|
279
|
-
if (conflictingValues.length === 0) continue;
|
|
280
|
-
|
|
281
|
-
conflicts.push({
|
|
282
|
-
entityAttr: mention.entityAttr,
|
|
283
|
-
canonicalValues,
|
|
284
|
-
proseValues: mention.numbers,
|
|
285
|
-
file: file.filename,
|
|
286
|
-
sectionTitle: section.title,
|
|
287
|
-
context: mention.context,
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
return conflicts;
|
|
296
|
-
};
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Build a map from filename → list of prose conflict feedback strings. Only
|
|
300
|
-
* non-canonical files appear in the map.
|
|
301
|
-
*/
|
|
302
|
-
export const buildFileProseConflictMap = (
|
|
303
|
-
conflicts: IProseConstraintConflict[],
|
|
304
|
-
): Map<string, string[]> => {
|
|
305
|
-
const map: Map<string, string[]> = new Map();
|
|
306
|
-
|
|
307
|
-
for (const conflict of conflicts) {
|
|
308
|
-
const feedback =
|
|
309
|
-
`Prose constraint conflict: ${conflict.entityAttr} — ` +
|
|
310
|
-
`canonical values [${conflict.canonicalValues.join(", ")}] (from ${CANONICAL_FILENAME}) vs ` +
|
|
311
|
-
`prose values [${conflict.proseValues.join(", ")}] in "${conflict.sectionTitle}". ` +
|
|
312
|
-
`Remove the restated value and use a backtick reference to ${CANONICAL_FILENAME} instead.`;
|
|
313
|
-
|
|
314
|
-
if (!map.has(conflict.file)) map.set(conflict.file, []);
|
|
315
|
-
map.get(conflict.file)!.push(feedback);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
return map;
|
|
319
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
AutoBeAnalyze,
|
|
3
|
+
AutoBeAnalyzeWriteSectionEvent,
|
|
4
|
+
} from "@autobe/interface";
|
|
5
|
+
import YAML from "yaml";
|
|
6
|
+
|
|
7
|
+
// ─── Types ───
|
|
8
|
+
|
|
9
|
+
export interface IProseConstraintConflict {
|
|
10
|
+
entityAttr: string;
|
|
11
|
+
canonicalValues: number[];
|
|
12
|
+
proseValues: number[];
|
|
13
|
+
file: string;
|
|
14
|
+
sectionTitle: string;
|
|
15
|
+
context: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
type FileSectionInput = Array<{
|
|
19
|
+
file: AutoBeAnalyze.IFileScenario;
|
|
20
|
+
sectionEvents: AutoBeAnalyzeWriteSectionEvent[][];
|
|
21
|
+
}>;
|
|
22
|
+
|
|
23
|
+
// ─── Constants ───
|
|
24
|
+
|
|
25
|
+
const YAML_CODE_BLOCK_REGEX = /```yaml\n[\s\S]*?```/g;
|
|
26
|
+
const CANONICAL_FILENAME = "02-domain-model.md";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Numeric constraint patterns found in prose text. Matches: "300 characters",
|
|
30
|
+
* "1-50 characters", "1–150 characters", "up to 2000 characters", "maximum 500
|
|
31
|
+
* chars", "minimum 8 characters", "exceeds 300 characters", "at least 1
|
|
32
|
+
* character", "at most 200 characters".
|
|
33
|
+
*/
|
|
34
|
+
const NUMERIC_PATTERNS: RegExp[] = [
|
|
35
|
+
// Range: "1-50 characters", "1–150 characters", "0–300 characters"
|
|
36
|
+
/(\d+)\s*[–\-]\s*(\d+)\s*(?:characters|chars?|unicode characters)/gi,
|
|
37
|
+
// Single number with unit: "300 characters", "2000 characters"
|
|
38
|
+
/(?:up to|maximum|max|at most|no more than|exceeds?|at least|minimum|min|no less than)\s+(\d+)\s*(?:characters|chars?|unicode characters)/gi,
|
|
39
|
+
// Plain: "N characters" (when preceded by constraint-like context)
|
|
40
|
+
/(?:limited to|restricted to|capped at|allow(?:s|ed)?)\s+(\d+)\s*(?:characters|chars?|unicode characters)/gi,
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
// ─── Helpers ───
|
|
44
|
+
|
|
45
|
+
function escapeRegExp(str: string): string {
|
|
46
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ─── Canonical Registry ───
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Build a map of Entity.attribute → canonical numeric values from
|
|
53
|
+
* 02-domain-model YAML blocks.
|
|
54
|
+
*/
|
|
55
|
+
function buildCanonicalNumericRegistry(
|
|
56
|
+
canonicalFile: FileSectionInput[number],
|
|
57
|
+
): Map<string, number[]> {
|
|
58
|
+
const registry: Map<string, number[]> = new Map();
|
|
59
|
+
|
|
60
|
+
for (const sectionsForModule of canonicalFile.sectionEvents) {
|
|
61
|
+
for (const sectionEvent of sectionsForModule) {
|
|
62
|
+
for (const section of sectionEvent.sectionSections) {
|
|
63
|
+
const yamlMatches = section.content.matchAll(/```yaml\n([\s\S]*?)```/g);
|
|
64
|
+
for (const match of yamlMatches) {
|
|
65
|
+
const yamlContent = match[1] ?? "";
|
|
66
|
+
try {
|
|
67
|
+
const parsed = YAML.parse(yamlContent);
|
|
68
|
+
if (
|
|
69
|
+
!parsed ||
|
|
70
|
+
typeof parsed !== "object" ||
|
|
71
|
+
typeof parsed.entity !== "string" ||
|
|
72
|
+
!Array.isArray(parsed.attributes)
|
|
73
|
+
)
|
|
74
|
+
continue;
|
|
75
|
+
|
|
76
|
+
for (const attr of parsed.attributes) {
|
|
77
|
+
if (!attr || typeof attr.name !== "string") continue;
|
|
78
|
+
const constraintStr = String(attr.constraints ?? "");
|
|
79
|
+
const numbers = extractAllNumbers(constraintStr);
|
|
80
|
+
if (numbers.length === 0) continue;
|
|
81
|
+
const key = `${parsed.entity}.${attr.name}`;
|
|
82
|
+
registry.set(key, numbers);
|
|
83
|
+
}
|
|
84
|
+
} catch {
|
|
85
|
+
// skip parse errors
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return registry;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Build a reverse index: attribute name → list of Entity.attribute keys. e.g.,
|
|
97
|
+
* "bio" → ["User.bio"], "title" → ["Article.title", "Todo.title"]
|
|
98
|
+
*/
|
|
99
|
+
function buildAttributeNameIndex(
|
|
100
|
+
registry: Map<string, number[]>,
|
|
101
|
+
): Map<string, string[]> {
|
|
102
|
+
const index: Map<string, string[]> = new Map();
|
|
103
|
+
for (const key of registry.keys()) {
|
|
104
|
+
const dotIdx = key.indexOf(".");
|
|
105
|
+
if (dotIdx < 0) continue;
|
|
106
|
+
const attrName = key.slice(dotIdx + 1);
|
|
107
|
+
if (!index.has(attrName)) index.set(attrName, []);
|
|
108
|
+
index.get(attrName)!.push(key);
|
|
109
|
+
}
|
|
110
|
+
return index;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Extract all integer numbers from a constraint string. "1-50, required" → [1,
|
|
115
|
+
* 50] "optional, maximum 2000 characters, may be null" → [2000]
|
|
116
|
+
*/
|
|
117
|
+
function extractAllNumbers(value: string): number[] {
|
|
118
|
+
const nums: Set<number> = new Set();
|
|
119
|
+
const matches = value.matchAll(/\d+/g);
|
|
120
|
+
for (const m of matches) {
|
|
121
|
+
const n = parseInt(m[0], 10);
|
|
122
|
+
if (!isNaN(n)) nums.add(n);
|
|
123
|
+
}
|
|
124
|
+
return [...nums];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ─── Prose Constraint Extraction (Value-Driven) ───
|
|
128
|
+
|
|
129
|
+
interface IProseMention {
|
|
130
|
+
entityAttr: string;
|
|
131
|
+
numbers: number[];
|
|
132
|
+
context: string;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Value-driven prose constraint extraction.
|
|
137
|
+
*
|
|
138
|
+
* Instead of finding backtick references first, this approach:
|
|
139
|
+
*
|
|
140
|
+
* 1. Finds lines with numeric constraint patterns ("N characters", etc.)
|
|
141
|
+
* 2. Checks if any canonical attribute name appears on that line
|
|
142
|
+
* 3. Compares the numbers against canonical values
|
|
143
|
+
*
|
|
144
|
+
* This catches all patterns regardless of backtick usage:
|
|
145
|
+
*
|
|
146
|
+
* - `User.bio`: 0-300 characters
|
|
147
|
+
* - `bio` (0-500 chars)
|
|
148
|
+
* - Bio text limited to 300 characters
|
|
149
|
+
* - | bio | 0-300 chars |
|
|
150
|
+
*/
|
|
151
|
+
function extractProseConstraintMentions(
|
|
152
|
+
proseContent: string,
|
|
153
|
+
attrNameIndex: Map<string, string[]>,
|
|
154
|
+
registry: Map<string, number[]>,
|
|
155
|
+
): IProseMention[] {
|
|
156
|
+
const results: IProseMention[] = [];
|
|
157
|
+
const lines = proseContent.split("\n");
|
|
158
|
+
|
|
159
|
+
for (const line of lines) {
|
|
160
|
+
// Step 1: Extract constraint-like numbers from this line
|
|
161
|
+
const numbers = extractConstraintNumbers(line);
|
|
162
|
+
if (numbers.length === 0) continue;
|
|
163
|
+
|
|
164
|
+
// Step 2: Check if any canonical attribute name appears on this line
|
|
165
|
+
for (const [attrName, entityAttrs] of attrNameIndex) {
|
|
166
|
+
const attrPattern = new RegExp(`\\b${escapeRegExp(attrName)}\\b`, "i");
|
|
167
|
+
if (!attrPattern.test(line)) continue;
|
|
168
|
+
|
|
169
|
+
// Step 3: Union all canonical values for all possible Entity.attr matches
|
|
170
|
+
const allCanonical: Set<number> = new Set();
|
|
171
|
+
for (const ea of entityAttrs) {
|
|
172
|
+
const vals = registry.get(ea);
|
|
173
|
+
if (vals) for (const v of vals) allCanonical.add(v);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Step 4: Find numbers that don't match any canonical value
|
|
177
|
+
const conflicting = numbers.filter(
|
|
178
|
+
(n) => !allCanonical.has(n) && n !== 0,
|
|
179
|
+
);
|
|
180
|
+
if (conflicting.length === 0) continue;
|
|
181
|
+
|
|
182
|
+
results.push({
|
|
183
|
+
entityAttr: entityAttrs[0]!,
|
|
184
|
+
numbers,
|
|
185
|
+
context: line.trim().slice(0, 200),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Deduplicate: same entityAttr + same numbers → keep first
|
|
191
|
+
const seen: Map<string, IProseMention> = new Map();
|
|
192
|
+
for (const mention of results) {
|
|
193
|
+
const key = `${mention.entityAttr}:${mention.numbers.sort((a, b) => a - b).join(",")}`;
|
|
194
|
+
if (!seen.has(key)) seen.set(key, mention);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return [...seen.values()];
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Extract numbers from constraint-like patterns in text. Only extracts numbers
|
|
202
|
+
* that appear in constraint context (near "characters", etc.).
|
|
203
|
+
*/
|
|
204
|
+
function extractConstraintNumbers(text: string): number[] {
|
|
205
|
+
const numbers: Set<number> = new Set();
|
|
206
|
+
|
|
207
|
+
for (const pattern of NUMERIC_PATTERNS) {
|
|
208
|
+
pattern.lastIndex = 0;
|
|
209
|
+
const matches = text.matchAll(pattern);
|
|
210
|
+
for (const m of matches) {
|
|
211
|
+
if (m[1]) {
|
|
212
|
+
const n = parseInt(m[1], 10);
|
|
213
|
+
if (!isNaN(n)) numbers.add(n);
|
|
214
|
+
}
|
|
215
|
+
if (m[2]) {
|
|
216
|
+
const n = parseInt(m[2], 10);
|
|
217
|
+
if (!isNaN(n)) numbers.add(n);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return [...numbers];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ─── Main Detection ───
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Detect prose-level constraint value conflicts between non-canonical files and
|
|
229
|
+
* the canonical 02-domain-model.
|
|
230
|
+
*
|
|
231
|
+
* Uses a value-driven approach: builds a reverse index of canonical attribute
|
|
232
|
+
* names, then scans prose text for those names near numeric constraint
|
|
233
|
+
* patterns. Catches all patterns regardless of backtick usage.
|
|
234
|
+
*/
|
|
235
|
+
export const detectProseConstraintConflicts = (props: {
|
|
236
|
+
files: FileSectionInput;
|
|
237
|
+
}): IProseConstraintConflict[] => {
|
|
238
|
+
// Find canonical file (02-domain-model.md)
|
|
239
|
+
const canonicalFile = props.files.find(
|
|
240
|
+
(f) => f.file.filename === CANONICAL_FILENAME,
|
|
241
|
+
);
|
|
242
|
+
if (!canonicalFile) return [];
|
|
243
|
+
|
|
244
|
+
const registry = buildCanonicalNumericRegistry(canonicalFile);
|
|
245
|
+
if (registry.size === 0) return [];
|
|
246
|
+
|
|
247
|
+
const attrNameIndex = buildAttributeNameIndex(registry);
|
|
248
|
+
|
|
249
|
+
const conflicts: IProseConstraintConflict[] = [];
|
|
250
|
+
|
|
251
|
+
for (const { file, sectionEvents } of props.files) {
|
|
252
|
+
// Skip canonical file itself
|
|
253
|
+
if (file.filename === CANONICAL_FILENAME) continue;
|
|
254
|
+
|
|
255
|
+
for (const sectionsForModule of sectionEvents) {
|
|
256
|
+
for (const sectionEvent of sectionsForModule) {
|
|
257
|
+
for (const section of sectionEvent.sectionSections) {
|
|
258
|
+
// Strip YAML code blocks — those are handled by existing validators
|
|
259
|
+
const proseContent = section.content.replace(
|
|
260
|
+
YAML_CODE_BLOCK_REGEX,
|
|
261
|
+
"",
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
const mentions = extractProseConstraintMentions(
|
|
265
|
+
proseContent,
|
|
266
|
+
attrNameIndex,
|
|
267
|
+
registry,
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
for (const mention of mentions) {
|
|
271
|
+
const canonicalValues = registry.get(mention.entityAttr);
|
|
272
|
+
if (!canonicalValues) continue;
|
|
273
|
+
|
|
274
|
+
// Check if prose values conflict with canonical
|
|
275
|
+
const conflictingValues = mention.numbers.filter(
|
|
276
|
+
(n) => !canonicalValues.includes(n) && n !== 0,
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
if (conflictingValues.length === 0) continue;
|
|
280
|
+
|
|
281
|
+
conflicts.push({
|
|
282
|
+
entityAttr: mention.entityAttr,
|
|
283
|
+
canonicalValues,
|
|
284
|
+
proseValues: mention.numbers,
|
|
285
|
+
file: file.filename,
|
|
286
|
+
sectionTitle: section.title,
|
|
287
|
+
context: mention.context,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return conflicts;
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Build a map from filename → list of prose conflict feedback strings. Only
|
|
300
|
+
* non-canonical files appear in the map.
|
|
301
|
+
*/
|
|
302
|
+
export const buildFileProseConflictMap = (
|
|
303
|
+
conflicts: IProseConstraintConflict[],
|
|
304
|
+
): Map<string, string[]> => {
|
|
305
|
+
const map: Map<string, string[]> = new Map();
|
|
306
|
+
|
|
307
|
+
for (const conflict of conflicts) {
|
|
308
|
+
const feedback =
|
|
309
|
+
`Prose constraint conflict: ${conflict.entityAttr} — ` +
|
|
310
|
+
`canonical values [${conflict.canonicalValues.join(", ")}] (from ${CANONICAL_FILENAME}) vs ` +
|
|
311
|
+
`prose values [${conflict.proseValues.join(", ")}] in "${conflict.sectionTitle}". ` +
|
|
312
|
+
`Remove the restated value and use a backtick reference to ${CANONICAL_FILENAME} instead.`;
|
|
313
|
+
|
|
314
|
+
if (!map.has(conflict.file)) map.set(conflict.file, []);
|
|
315
|
+
map.get(conflict.file)!.push(feedback);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return map;
|
|
319
|
+
};
|