@epoint-testtech/ep-stage-skill 0.0.4-alpha.0 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/SKILL.md +27 -27
  2. package/codex-skill/ep-stage/glue-create-project/SKILL.md +223 -186
  3. package/codex-skill/ep-stage/glue-generate-testcase/SKILL.md +275 -199
  4. package/codex-skill/ep-stage/glue-generate-testcase/examples/observable-testcase.json +40 -40
  5. package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-schema.md +95 -112
  6. package/codex-skill/ep-stage/glue-generate-testcase/references/testcase-tpl.md +72 -0
  7. package/codex-skill/ep-stage/glue-run-test/SKILL.md +292 -249
  8. package/codex-skill/ep-stage/glue-run-test/references/ai-runtime-loop.md +30 -0
  9. package/codex-skill/ep-stage/glue-run-test/references/crud-pipeline.md +132 -145
  10. package/codex-skill/ep-stage/glue-run-test/references/gap-review-protocol.md +44 -43
  11. package/codex-skill/ep-stage/glue-run-test/references/harness-principles.md +46 -46
  12. package/codex-skill/ep-stage/glue-run-test/references/playwright-cli-odav.md +166 -0
  13. package/codex-skill/ep-stage/glue-run-test/scripts/extract-page-elements-eval.mjs +233 -0
  14. package/codex-skill/ep-stage/glue-run-test/scripts/generate-crud-spec.mjs +149 -149
  15. package/codex-skill/ep-stage/page-element-scan/SKILL.md +91 -0
  16. package/codex-skill/ep-stage/page-element-scan/evals/evals.json +37 -0
  17. package/codex-skill/ep-stage/page-element-scan/evals/fixtures/sample-list-page.html +85 -0
  18. package/codex-skill/ep-stage/page-element-scan/references/pagination-controls.md +153 -0
  19. package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements-eval.mjs +233 -0
  20. package/codex-skill/ep-stage/page-element-scan/scripts/extract-page-elements.mjs +298 -0
  21. package/codex-skill/ep-stage/page-element-scan/scripts/scan-page.mjs +749 -0
  22. package/codex-skill/ep-stage/recording-to-glue/SKILL.md +28 -28
  23. package/codex-skill/ep-stage/scripts/validate-skill.mjs +98 -95
  24. package/dist/src/cli/generate-testcase.d.ts +18 -51
  25. package/dist/src/cli/generate-testcase.d.ts.map +1 -1
  26. package/dist/src/cli/generate-testcase.js +127 -131
  27. package/dist/src/cli/index.d.ts +11 -2
  28. package/dist/src/cli/index.d.ts.map +1 -1
  29. package/dist/src/cli/index.js +49 -16
  30. package/dist/src/cli/probe.d.ts +2 -0
  31. package/dist/src/cli/probe.d.ts.map +1 -1
  32. package/dist/src/cli/probe.js +239 -13
  33. package/dist/src/cli/run.d.ts +136 -29
  34. package/dist/src/cli/run.d.ts.map +1 -1
  35. package/dist/src/cli/run.js +494 -65
  36. package/dist/src/cli/spec.d.ts +18 -11
  37. package/dist/src/cli/spec.d.ts.map +1 -1
  38. package/dist/src/cli/spec.js +74 -20
  39. package/dist/src/contracts/crud-business-module.d.ts +6 -0
  40. package/dist/src/contracts/crud-business-module.d.ts.map +1 -1
  41. package/dist/src/contracts/glue-contract-v1.d.ts +98 -0
  42. package/dist/src/contracts/glue-contract-v1.d.ts.map +1 -0
  43. package/dist/src/contracts/glue-contract-v1.js +9 -0
  44. package/dist/src/contracts/inference-trace.d.ts +223 -0
  45. package/dist/src/contracts/inference-trace.d.ts.map +1 -0
  46. package/dist/src/contracts/inference-trace.js +12 -0
  47. package/dist/src/contracts/observable-chain.d.ts +4 -0
  48. package/dist/src/contracts/observable-chain.d.ts.map +1 -1
  49. package/dist/src/extractors/code-list-json5.d.ts +192 -0
  50. package/dist/src/extractors/code-list-json5.d.ts.map +1 -0
  51. package/dist/src/extractors/code-list-json5.js +91 -0
  52. package/dist/src/extractors/code-list.d.ts +3 -3
  53. package/dist/src/extractors/code-list.d.ts.map +1 -1
  54. package/dist/src/extractors/code-list.js +46 -11
  55. package/dist/src/extractors/html-page.d.ts +9 -0
  56. package/dist/src/extractors/html-page.d.ts.map +1 -1
  57. package/dist/src/extractors/html-page.js +26 -2
  58. package/dist/src/extractors/prd-extractor.d.ts +70 -0
  59. package/dist/src/extractors/prd-extractor.d.ts.map +1 -0
  60. package/dist/src/extractors/prd-extractor.js +248 -0
  61. package/dist/src/generators/agent-inferred-workflow-script.js +66 -66
  62. package/dist/src/generators/stage-skeleton-script.d.ts +87 -20
  63. package/dist/src/generators/stage-skeleton-script.d.ts.map +1 -1
  64. package/dist/src/generators/stage-skeleton-script.js +656 -238
  65. package/dist/src/index.d.ts +7 -2
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +3 -1
  68. package/dist/src/inference/module-hints-inference.d.ts +30 -0
  69. package/dist/src/inference/module-hints-inference.d.ts.map +1 -0
  70. package/dist/src/inference/module-hints-inference.js +363 -0
  71. package/dist/src/inference/source-analysis.d.ts +26 -0
  72. package/dist/src/inference/source-analysis.d.ts.map +1 -0
  73. package/dist/src/inference/source-analysis.js +258 -0
  74. package/dist/src/normalizers/crud-contract.d.ts +3 -0
  75. package/dist/src/normalizers/crud-contract.d.ts.map +1 -1
  76. package/dist/src/normalizers/crud-contract.js +3 -0
  77. package/dist/src/runtime/ai-runtime-trace.d.ts +88 -0
  78. package/dist/src/runtime/ai-runtime-trace.d.ts.map +1 -0
  79. package/dist/src/runtime/ai-runtime-trace.js +119 -0
  80. package/dist/src/testcase/button-interaction-inference.d.ts +37 -0
  81. package/dist/src/testcase/button-interaction-inference.d.ts.map +1 -0
  82. package/dist/src/testcase/button-interaction-inference.js +385 -0
  83. package/dist/src/testcase/contract-testcase-assembler.d.ts +44 -0
  84. package/dist/src/testcase/contract-testcase-assembler.d.ts.map +1 -0
  85. package/dist/src/testcase/contract-testcase-assembler.js +806 -0
  86. package/dist/src/testcase/prd-button-mapper.d.ts +72 -0
  87. package/dist/src/testcase/prd-button-mapper.d.ts.map +1 -0
  88. package/dist/src/testcase/prd-button-mapper.js +148 -0
  89. package/dist/src/testcase/runtime-context.d.ts +9 -0
  90. package/dist/src/testcase/runtime-context.d.ts.map +1 -0
  91. package/dist/src/testcase/runtime-context.js +1 -0
  92. package/dist/src/testcase/test-access.d.ts +38 -0
  93. package/dist/src/testcase/test-access.d.ts.map +1 -0
  94. package/dist/src/testcase/test-access.js +106 -0
  95. package/dist/src/testcase/testcase-execution-fields.d.ts +10 -0
  96. package/dist/src/testcase/testcase-execution-fields.d.ts.map +1 -0
  97. package/dist/src/testcase/testcase-execution-fields.js +1 -0
  98. package/dist/src/testcase/testcase-generator.d.ts.map +1 -1
  99. package/dist/src/testcase/testcase-generator.js +6 -0
  100. package/dist/src/testcase/testcase-markdown.d.ts +11 -0
  101. package/dist/src/testcase/testcase-markdown.d.ts.map +1 -0
  102. package/dist/src/testcase/testcase-markdown.js +181 -0
  103. package/dist/src/testcase/testcase-skeleton.d.ts +4 -0
  104. package/dist/src/testcase/testcase-skeleton.d.ts.map +1 -1
  105. package/dist/src/testcase/testcase-spec-assembly.d.ts +4 -0
  106. package/dist/src/testcase/testcase-spec-assembly.d.ts.map +1 -1
  107. package/dist/src/testcase/testcase-v1-draft.d.ts +58 -0
  108. package/dist/src/testcase/testcase-v1-draft.d.ts.map +1 -0
  109. package/dist/src/testcase/testcase-v1-draft.js +13 -0
  110. package/dist/src/validation/contract.d.ts +14 -0
  111. package/dist/src/validation/contract.d.ts.map +1 -0
  112. package/dist/src/validation/contract.js +132 -0
  113. package/dist/src/validation/credentials.d.ts +7 -2
  114. package/dist/src/validation/credentials.d.ts.map +1 -1
  115. package/dist/src/validation/credentials.js +15 -4
  116. package/dist/src/validation/index.d.ts +2 -0
  117. package/dist/src/validation/index.d.ts.map +1 -1
  118. package/dist/src/validation/index.js +2 -0
  119. package/dist/src/validation/inference-trace.d.ts +13 -0
  120. package/dist/src/validation/inference-trace.d.ts.map +1 -0
  121. package/dist/src/validation/inference-trace.js +31 -0
  122. package/dist/src/validation/testcase.d.ts +9 -7
  123. package/dist/src/validation/testcase.d.ts.map +1 -1
  124. package/dist/src/validation/testcase.js +181 -34
  125. package/docs/README.md +124 -134
  126. package/docs/mvp-usage-guide.md +298 -298
  127. package/examples/schemeresource-observable-docs/schemeresource.context.md +20 -20
  128. package/examples/schemeresource.module-hints.json +38 -38
  129. package/examples/schemeresource.observable.code_list.md +37 -37
  130. package/examples/zwplace-observable-docs/zwplace.context.md +16 -16
  131. package/examples/zwplace-placecategory-validation.json +29 -29
  132. package/examples/zwplace.module-hints.json +69 -69
  133. package/examples/zwplace.observable.code_list.md +37 -37
  134. package/package.json +2 -2
  135. package/dist/test/cli/extract-contract.test.d.ts +0 -2
  136. package/dist/test/cli/extract-contract.test.d.ts.map +0 -1
  137. package/dist/test/cli/extract-contract.test.js +0 -32
  138. package/dist/test/cli/generate-testcase.test.d.ts +0 -2
  139. package/dist/test/cli/generate-testcase.test.d.ts.map +0 -1
  140. package/dist/test/cli/generate-testcase.test.js +0 -130
  141. package/dist/test/cli/index.test.d.ts +0 -2
  142. package/dist/test/cli/index.test.d.ts.map +0 -1
  143. package/dist/test/cli/index.test.js +0 -93
  144. package/dist/test/cli/run.test.d.ts +0 -2
  145. package/dist/test/cli/run.test.d.ts.map +0 -1
  146. package/dist/test/cli/run.test.js +0 -149
  147. package/dist/test/cli/spec.test.d.ts +0 -2
  148. package/dist/test/cli/spec.test.d.ts.map +0 -1
  149. package/dist/test/cli/spec.test.js +0 -196
  150. package/dist/test/crud-contract.test.d.ts +0 -2
  151. package/dist/test/crud-contract.test.d.ts.map +0 -1
  152. package/dist/test/crud-contract.test.js +0 -819
  153. package/dist/test/gap-inference.test.d.ts +0 -2
  154. package/dist/test/gap-inference.test.d.ts.map +0 -1
  155. package/dist/test/gap-inference.test.js +0 -597
  156. package/dist/test/generalization.test.d.ts +0 -2
  157. package/dist/test/generalization.test.d.ts.map +0 -1
  158. package/dist/test/generalization.test.js +0 -73
  159. package/dist/test/material-inventory.test.d.ts +0 -2
  160. package/dist/test/material-inventory.test.d.ts.map +0 -1
  161. package/dist/test/material-inventory.test.js +0 -141
  162. package/dist/test/observable-chain.test.d.ts +0 -2
  163. package/dist/test/observable-chain.test.d.ts.map +0 -1
  164. package/dist/test/observable-chain.test.js +0 -123
  165. package/dist/test/observable-pipeline.test.d.ts +0 -2
  166. package/dist/test/observable-pipeline.test.d.ts.map +0 -1
  167. package/dist/test/observable-pipeline.test.js +0 -461
  168. package/dist/test/page-structure.test.d.ts +0 -2
  169. package/dist/test/page-structure.test.d.ts.map +0 -1
  170. package/dist/test/page-structure.test.js +0 -45
  171. package/dist/test/scenario-inference.test.d.ts +0 -2
  172. package/dist/test/scenario-inference.test.d.ts.map +0 -1
  173. package/dist/test/scenario-inference.test.js +0 -73
  174. package/dist/test/stage-context.test.d.ts +0 -2
  175. package/dist/test/stage-context.test.d.ts.map +0 -1
  176. package/dist/test/stage-context.test.js +0 -395
  177. package/dist/test/testcase-generator.test.d.ts +0 -2
  178. package/dist/test/testcase-generator.test.d.ts.map +0 -1
  179. package/dist/test/testcase-generator.test.js +0 -276
  180. package/dist/test/testcase-skeleton.test.d.ts +0 -2
  181. package/dist/test/testcase-skeleton.test.d.ts.map +0 -1
  182. package/dist/test/testcase-skeleton.test.js +0 -185
  183. package/dist/test/testcase-spec-assembly.test.d.ts +0 -2
  184. package/dist/test/testcase-spec-assembly.test.d.ts.map +0 -1
  185. package/dist/test/testcase-spec-assembly.test.js +0 -105
  186. package/dist/test/util/credentials.test.d.ts +0 -2
  187. package/dist/test/util/credentials.test.d.ts.map +0 -1
  188. package/dist/test/util/credentials.test.js +0 -64
  189. package/dist/test/util/i18n-testcase.test.d.ts +0 -2
  190. package/dist/test/util/i18n-testcase.test.d.ts.map +0 -1
  191. package/dist/test/util/i18n-testcase.test.js +0 -119
  192. package/dist/test/util/softlink.test.d.ts +0 -2
  193. package/dist/test/util/softlink.test.d.ts.map +0 -1
  194. package/dist/test/util/softlink.test.js +0 -82
  195. package/dist/test/validation/credentials.test.d.ts +0 -2
  196. package/dist/test/validation/credentials.test.d.ts.map +0 -1
  197. package/dist/test/validation/credentials.test.js +0 -72
  198. package/dist/test/validation/projects-index.test.d.ts +0 -2
  199. package/dist/test/validation/projects-index.test.d.ts.map +0 -1
  200. package/dist/test/validation/projects-index.test.js +0 -48
  201. package/dist/test/validation/testcase.test.d.ts +0 -2
  202. package/dist/test/validation/testcase.test.d.ts.map +0 -1
  203. package/dist/test/validation/testcase.test.js +0 -129
  204. package/dist/vitest.config.d.ts +0 -3
  205. package/dist/vitest.config.d.ts.map +0 -1
  206. package/dist/vitest.config.js +0 -7
@@ -9,8 +9,8 @@ export { extractJavaAction } from './extractors/java-action.js';
9
9
  export type { ExtractedJavaAction } from './extractors/java-action.js';
10
10
  export { buildCrudBusinessModuleContract } from './normalizers/crud-contract.js';
11
11
  export type { BuildCrudContractInput, ButtonLabelConfig } from './normalizers/crud-contract.js';
12
- export { generateStageSkeletonCrudSpec, mapContractToStageSkeletonCrudSlots, renderStageSkeletonCrudSlots } from './generators/stage-skeleton-script.js';
13
- export type { StageSkeletonCrudDataValueStrategy, StageSkeletonCrudDeletePolicy, StageSkeletonCrudFlowSlots, StageSkeletonScriptOptions } from './generators/stage-skeleton-script.js';
12
+ export { generateStageSkeletonCrudSpecFromSlots, renderStageSkeletonCrudSlots } from './generators/stage-skeleton-script.js';
13
+ export type { GenerateStageSkeletonCrudSpecFromSlotsOptions, StageSkeletonCrudDataValueStrategy, StageSkeletonCrudDeletePolicy, StageSkeletonCrudFlowSlots } from './generators/stage-skeleton-script.js';
14
14
  export type { ActionCandidate, AgentInferredWorkflow, GapActionType, GapExplorationResult, GapInferDraft, GapListItem, GapSignalType, GapWorkflowStatus, SkeletonCoverage } from './contracts/gap-inference.js';
15
15
  export type { ObservableArtifactRef, ObservableGate, ObservableStageName, ObservableStagePayload, ObservableStageSummary, ReasoningEvidence, ReasoningSummary, TraceWriterOptions } from './contracts/observable-chain.js';
16
16
  export { createTraceWriter, } from './trace/trace-writer.js';
@@ -49,4 +49,9 @@ export { glueReportToTrace, glueSpecAssemblyToTrace, playwrightExecutionToTrace,
49
49
  export type { GlueReportSummary, GlueSpecAssemblySummary, PlaywrightExecutionSummary, } from './cli/run-gap-pipeline.js';
50
50
  export { compareObservableRuns, summarizeGeneralizationRun, } from './generalization/generalization-eval.js';
51
51
  export type { GeneralizationComparison, GeneralizationRunMetrics, MaterialResolutionStatus, SummarizeGeneralizationRunInput, } from './generalization/generalization-eval.js';
52
+ export { buildSourceAnalysis } from './inference/source-analysis.js';
53
+ export type { BuildSourceAnalysisInput } from './inference/source-analysis.js';
54
+ export { inferModuleHintsFromMaterials } from './inference/module-hints-inference.js';
55
+ export type { InferModuleHintsInput } from './inference/module-hints-inference.js';
56
+ export type { BackendSignal, CustomWorkflowInference, DataKeyInference, DeletePolicyInference, InferenceTraceV1, MaterialInventoryTrace, MaterialSlotStatus, ModuleHintsInference, SearchConditionInference, SourceAnalysis, SourceAnalysisEntry, SourceAnalysisMode, UiSignal } from './contracts/inference-trace.js';
52
57
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,0BAA0B,EAC1B,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,QAAQ,EACR,gCAAgC,EAChC,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,SAAS,EACT,6BAA6B,EAC7B,cAAc,EACd,kBAAkB,EACnB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,eAAe,EAChB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,eAAe,EAChB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,mBAAmB,EACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,+BAA+B,EAChC,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,6BAA6B,EAC7B,mCAAmC,EACnC,4BAA4B,EAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,kCAAkC,EAClC,6BAA6B,EAC7B,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,uCAAuC,CAAC;AAE/C,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,+BAA+B,EAC/B,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACZ,gBAAgB,EAChB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,0BAA0B,GAC3B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,gBAAgB,GACjB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,gDAAgD,CAAC;AAExD,OAAO,EACL,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,6BAA6B,EAC7B,8BAA8B,EAC9B,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,2CAA2C,GAC5C,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,iBAAiB,EACjB,mCAAmC,EACnC,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC;AACzC,YAAY,EACV,YAAY,EACZ,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,sBAAsB,EACtB,mCAAmC,EACnC,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,sBAAsB,EACtB,8BAA8B,EAC9B,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAC3B,gCAAgC,EAChC,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,yCAAyC,CAAC;AACjD,YAAY,EACV,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,yCAAyC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -3,7 +3,7 @@ export { extractSpecYaml } from './extractors/spec-yaml.js';
3
3
  export { extractCodeListSummary } from './extractors/code-list.js';
4
4
  export { extractJavaAction } from './extractors/java-action.js';
5
5
  export { buildCrudBusinessModuleContract } from './normalizers/crud-contract.js';
6
- export { generateStageSkeletonCrudSpec, mapContractToStageSkeletonCrudSlots, renderStageSkeletonCrudSlots } from './generators/stage-skeleton-script.js';
6
+ export { generateStageSkeletonCrudSpecFromSlots, renderStageSkeletonCrudSlots } from './generators/stage-skeleton-script.js';
7
7
  export { createTraceWriter, } from './trace/trace-writer.js';
8
8
  export { lookupProjectByRequirement, readStageContext, resolveStageContext, writeProjectIndex, } from './context/stage-context.js';
9
9
  export { renderReviewSummary, } from './trace/review-summary.js';
@@ -24,3 +24,5 @@ export { applyCodeListWriteBack, collectCodeListMaterialRefsFromPath, isProtecte
24
24
  export { createRuntimeFailureSummary, extractLoginSystemUrlFromEnvFile, parseRuntimeSummaryOutput, runtimeSummaryToTrace, } from './cli/run-gap-pipeline.js';
25
25
  export { glueReportToTrace, glueSpecAssemblyToTrace, playwrightExecutionToTrace, } from './cli/run-gap-pipeline.js';
26
26
  export { compareObservableRuns, summarizeGeneralizationRun, } from './generalization/generalization-eval.js';
27
+ export { buildSourceAnalysis } from './inference/source-analysis.js';
28
+ export { inferModuleHintsFromMaterials } from './inference/module-hints-inference.js';
@@ -0,0 +1,30 @@
1
+ import type { ExtractedHtmlPage, ExtractedJavaAction } from '../index.js';
2
+ import type { ModuleHints } from '../contracts/crud-business-module.js';
3
+ import type { ModuleHintsInference, SourceAnalysis } from '../contracts/inference-trace.js';
4
+ /**
5
+ * inferModuleHintsFromMaterials 的输入参数。
6
+ */
7
+ export type InferModuleHintsInput = {
8
+ sourceAnalysis: SourceAnalysis;
9
+ pages: ExtractedHtmlPage[];
10
+ actions: ExtractedJavaAction[];
11
+ explicitHints?: ModuleHints;
12
+ };
13
+ /**
14
+ * 基于上游物料推理 ModuleHints 动态槽位。
15
+ *
16
+ * 推理规则:
17
+ * - dataKey.selectedField 优先选同时出现在列表页搜索区、表格列、新增/编辑页表单的 input 字段。
18
+ * - searchConditions 至少包含 dataKey input 条件;listbox 条件缺取值时只进 unresolved。
19
+ * - buttonAliases 从页面按钮标签归类(新增、搜索、修改、删除、确定、导出)。
20
+ * - deletePolicy 若 Java messages 含"不可删除",推为 blocked_by_business_rule。
21
+ * - customWorkflows 收集 CRUD/Export 骨架之外的工具栏按钮;有 Java callback 时填 assertion,否则 unresolved。
22
+ *
23
+ * @param input - 输入参数(sourceAnalysis、pages、actions、可选 explicitHints)。
24
+ * @returns 推理出的 hints 与推理过程。
25
+ */
26
+ export declare function inferModuleHintsFromMaterials(input: InferModuleHintsInput): {
27
+ hints: ModuleHints;
28
+ inference: ModuleHintsInference;
29
+ };
30
+ //# sourceMappingURL=module-hints-inference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-hints-inference.d.ts","sourceRoot":"","sources":["../../../src/inference/module-hints-inference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,WAAW,EAEZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAIV,oBAAoB,EAEpB,cAAc,EACf,MAAM,iCAAiC,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,WAAW,CAAC;CAC7B,CAAC;AA4UF;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,qBAAqB,GAAG;IAC3E,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,oBAAoB,CAAC;CACjC,CAoEA"}
@@ -0,0 +1,363 @@
1
+ /** CRUD 骨架与导出覆盖的标准按钮标签集合(归类用)。 */
2
+ const CRUD_BUTTON_LABELS = {
3
+ create: ['新增', '增加', '添加', '新建'],
4
+ search: ['搜索', '查询', '检索'],
5
+ edit: ['修改', '编辑'],
6
+ delete: ['删除', '删除选定', '批量删除'],
7
+ confirm: ['确定', '确认', '保存', '保存并关闭'],
8
+ export: ['导出', '导出选定', '批量导出']
9
+ };
10
+ /**
11
+ * 识别列表页。
12
+ *
13
+ * 优先选 pageId 以 `list` 结尾的页面(文件名约定);无则回落到第一个含 datagrid 的页面。
14
+ * 不能只用 grids.length > 0,因为 add/edit/detail 页也可能内嵌 datagrid(如 014 场景),
15
+ * 会导致搜索条件误从表单页抽取(regression:windowname 被当作搜索条件)。
16
+ *
17
+ * @param pages - 已抽取的 HTML 页面列表。
18
+ * @returns 列表页;无则返回 undefined。
19
+ */
20
+ function findListPage(pages) {
21
+ const byId = pages.find((page) => /list$/i.test(page.pageId));
22
+ if (byId)
23
+ return byId;
24
+ return pages.find((page) => page.grids.length > 0);
25
+ }
26
+ /**
27
+ * 收集列表页搜索区字段名(fui-condition 区的 input bind)。
28
+ *
29
+ * @param listPage - 列表页。
30
+ * @returns 搜索区字段名集合。
31
+ */
32
+ function collectSearchFields(listPage) {
33
+ const fields = new Set();
34
+ if (!listPage)
35
+ return fields;
36
+ for (const field of listPage.fields) {
37
+ fields.add(field.name);
38
+ }
39
+ return fields;
40
+ }
41
+ /**
42
+ * 收集列表页表格数据列 field。
43
+ *
44
+ * @param listPage - 列表页。
45
+ * @returns 表格列 field 集合。
46
+ */
47
+ function collectGridFields(listPage) {
48
+ const fields = new Set();
49
+ if (!listPage)
50
+ return fields;
51
+ for (const grid of listPage.grids) {
52
+ for (const column of grid.dataColumns) {
53
+ if (column.field) {
54
+ fields.add(column.field);
55
+ }
56
+ }
57
+ }
58
+ return fields;
59
+ }
60
+ /**
61
+ * 收集新增/编辑页表单字段名。
62
+ *
63
+ * @param pages - 所有页面。
64
+ * @returns 表单字段名集合。
65
+ */
66
+ function collectFormFields(pages) {
67
+ const fields = new Set();
68
+ for (const page of pages) {
69
+ for (const field of page.fields) {
70
+ if (field.name) {
71
+ fields.add(field.name);
72
+ }
73
+ }
74
+ }
75
+ return fields;
76
+ }
77
+ /**
78
+ * 推理 dataKey.selectedField。
79
+ *
80
+ * 规则:优先选同时出现在列表页搜索区、表格列、新增/编辑页表单的 input 字段。
81
+ * 若无三方交集,回落到搜索区与表格列的交集;再无则取表格第一列。
82
+ *
83
+ * @param listPage - 列表页。
84
+ * @param pages - 所有页面。
85
+ * @returns dataKey 推理过程。
86
+ */
87
+ function inferDataKey(listPage, pages) {
88
+ const searchFields = collectSearchFields(listPage);
89
+ const gridFields = collectGridFields(listPage);
90
+ const formFields = collectFormFields(pages);
91
+ // 三方交集
92
+ const tripleIntersection = Array.from(searchFields).filter((field) => gridFields.has(field) && formFields.has(field));
93
+ if (tripleIntersection.length > 0) {
94
+ return {
95
+ selectedField: tripleIntersection[0],
96
+ reason: '列表页搜索区、表格列、新增/编辑页表单同时出现该字段',
97
+ evidence: tripleIntersection.map((field) => `${field} 出现在搜索区+表格列+表单`)
98
+ };
99
+ }
100
+ // 搜索区与表格列交集
101
+ const dualIntersection = Array.from(searchFields).filter((field) => gridFields.has(field));
102
+ if (dualIntersection.length > 0) {
103
+ return {
104
+ selectedField: dualIntersection[0],
105
+ reason: '列表页搜索区与表格列同时出现该字段(表单未覆盖)',
106
+ evidence: dualIntersection.map((field) => `${field} 出现在搜索区+表格列`)
107
+ };
108
+ }
109
+ // 回落到表格第一列
110
+ if (listPage && listPage.grids.length > 0) {
111
+ const firstColumn = listPage.grids[0].dataColumns[0];
112
+ if (firstColumn?.field) {
113
+ return {
114
+ selectedField: firstColumn.field,
115
+ reason: '搜索区与表格列无交集,回落到表格第一列',
116
+ evidence: [`表格第一列 field=${firstColumn.field}`]
117
+ };
118
+ }
119
+ }
120
+ return {
121
+ reason: '无法从物料中推理出 dataKey',
122
+ evidence: []
123
+ };
124
+ }
125
+ /**
126
+ * 推理搜索条件。
127
+ *
128
+ * 规则:至少包含 dataKey input 条件;listbox 条件缺取值时只进 unresolved。
129
+ *
130
+ * @param listPage - 列表页。
131
+ * @param dataKeyField - 选定的 dataKey 字段。
132
+ * @returns 搜索条件推理过程数组。
133
+ */
134
+ function inferSearchConditions(listPage, dataKeyField) {
135
+ const conditions = [];
136
+ if (!listPage)
137
+ return conditions;
138
+ for (const field of listPage.fields) {
139
+ const isInput = field.controlType.includes('textbox') || field.controlType.includes('input');
140
+ const isListbox = field.controlType.includes('combobox') || field.controlType.includes('listbox');
141
+ if (isInput) {
142
+ conditions.push({
143
+ field: field.name,
144
+ component: 'input',
145
+ resolved: true
146
+ });
147
+ }
148
+ else if (isListbox) {
149
+ // listbox 缺取值时只进 unresolved,不阻断
150
+ conditions.push({
151
+ field: field.name,
152
+ component: 'listbox',
153
+ resolved: false,
154
+ reason: 'listbox 取值需人工或后续补齐'
155
+ });
156
+ }
157
+ }
158
+ // 确保 dataKey 字段在搜索条件中
159
+ if (dataKeyField && !conditions.some((condition) => condition.field === dataKeyField)) {
160
+ conditions.unshift({
161
+ field: dataKeyField,
162
+ component: 'input',
163
+ resolved: true
164
+ });
165
+ }
166
+ return conditions;
167
+ }
168
+ /**
169
+ * 从按钮标签归类 buttonAliases。
170
+ *
171
+ * @param pages - 所有页面。
172
+ * @returns 按钮别名归类映射。
173
+ */
174
+ function inferButtonAliases(pages) {
175
+ const aliases = {};
176
+ const allLabels = new Set();
177
+ for (const page of pages) {
178
+ for (const button of page.buttons) {
179
+ allLabels.add(button.label);
180
+ }
181
+ }
182
+ for (const [alias, patterns] of Object.entries(CRUD_BUTTON_LABELS)) {
183
+ const matched = Array.from(allLabels).filter((label) => patterns.some((pattern) => label.includes(pattern)));
184
+ if (matched.length > 0) {
185
+ aliases[alias] = matched;
186
+ }
187
+ }
188
+ return aliases;
189
+ }
190
+ /**
191
+ * 推理删除策略。
192
+ *
193
+ * 规则:Java messages 含"不可删除"类提示时推为 blocked_by_business_rule。
194
+ *
195
+ * @param actions - Java Action 列表。
196
+ * @returns 删除策略推理过程。
197
+ */
198
+ function inferDeletePolicy(actions) {
199
+ const blockMessages = [];
200
+ for (const action of actions) {
201
+ for (const message of action.messages) {
202
+ if (/不可删除|不允许删除|禁止删除/.test(message)) {
203
+ blockMessages.push(message);
204
+ }
205
+ }
206
+ }
207
+ if (blockMessages.length > 0) {
208
+ return {
209
+ value: 'blocked_by_business_rule',
210
+ reason: 'Java Action 存在不可删除提示',
211
+ evidence: blockMessages
212
+ };
213
+ }
214
+ return {
215
+ reason: '未发现删除限制证据,默认允许删除',
216
+ evidence: []
217
+ };
218
+ }
219
+ /** 已被 CRUD 骨架与导出覆盖的按钮标签模式(customWorkflows 排除用)。 */
220
+ const SKELETON_BUTTON_PATTERNS = [
221
+ ...CRUD_BUTTON_LABELS.create,
222
+ ...CRUD_BUTTON_LABELS.search,
223
+ ...CRUD_BUTTON_LABELS.edit,
224
+ ...CRUD_BUTTON_LABELS.delete,
225
+ ...CRUD_BUTTON_LABELS.confirm,
226
+ ...CRUD_BUTTON_LABELS.export,
227
+ '重置', '关闭', '返回', '取消', '刷新'
228
+ ];
229
+ /**
230
+ * 收集 CRUD/Export 骨架之外的自定义工作流(工具栏按钮)。
231
+ *
232
+ * 规则:有 Java callback message 时填 assertion,否则 unresolved。
233
+ *
234
+ * @param pages - 所有页面。
235
+ * @param actions - Java Action 列表。
236
+ * @returns 自定义工作流推理过程数组。
237
+ */
238
+ function inferCustomWorkflows(pages, actions) {
239
+ // 收集所有 Java callback 消息,用于匹配断言
240
+ const allMessages = [];
241
+ for (const action of actions) {
242
+ allMessages.push(...action.messages);
243
+ }
244
+ const workflows = [];
245
+ const seen = new Set();
246
+ for (const page of pages) {
247
+ for (const button of page.buttons) {
248
+ const label = button.label;
249
+ if (seen.has(label))
250
+ continue;
251
+ const isSkeleton = SKELETON_BUTTON_PATTERNS.some((pattern) => label.includes(pattern));
252
+ if (isSkeleton)
253
+ continue;
254
+ seen.add(label);
255
+ // 尝试从 Java messages 中找到与按钮相关的断言
256
+ const relatedMessage = allMessages.find((message) => {
257
+ // 按钮标签的关键词出现在消息里,或消息里的动作动词与按钮相关
258
+ const keywords = label.replace(/管理系统|信息管理|数据/g, '').trim();
259
+ return keywords.length > 0 && message.includes(keywords);
260
+ });
261
+ if (relatedMessage) {
262
+ workflows.push({
263
+ label,
264
+ actionAlias: button.onclick ? [button.onclick] : undefined,
265
+ expectedIntent: label,
266
+ expectedAssertion: relatedMessage,
267
+ resolved: true,
268
+ evidence: [
269
+ `按钮 onclick=${button.onclick ?? '(未声明)'}`,
270
+ `Java callback: ${relatedMessage}`
271
+ ]
272
+ });
273
+ }
274
+ else {
275
+ workflows.push({
276
+ label,
277
+ actionAlias: button.onclick ? [button.onclick] : undefined,
278
+ expectedIntent: label,
279
+ resolved: false,
280
+ reason: '未找到对应 Java callback 断言',
281
+ evidence: [`按钮 onclick=${button.onclick ?? '(未声明)'}`]
282
+ });
283
+ }
284
+ }
285
+ }
286
+ return workflows;
287
+ }
288
+ /**
289
+ * 基于上游物料推理 ModuleHints 动态槽位。
290
+ *
291
+ * 推理规则:
292
+ * - dataKey.selectedField 优先选同时出现在列表页搜索区、表格列、新增/编辑页表单的 input 字段。
293
+ * - searchConditions 至少包含 dataKey input 条件;listbox 条件缺取值时只进 unresolved。
294
+ * - buttonAliases 从页面按钮标签归类(新增、搜索、修改、删除、确定、导出)。
295
+ * - deletePolicy 若 Java messages 含"不可删除",推为 blocked_by_business_rule。
296
+ * - customWorkflows 收集 CRUD/Export 骨架之外的工具栏按钮;有 Java callback 时填 assertion,否则 unresolved。
297
+ *
298
+ * @param input - 输入参数(sourceAnalysis、pages、actions、可选 explicitHints)。
299
+ * @returns 推理出的 hints 与推理过程。
300
+ */
301
+ export function inferModuleHintsFromMaterials(input) {
302
+ const listPage = findListPage(input.pages);
303
+ const dataKeyInference = inferDataKey(listPage, input.pages);
304
+ const searchConditionInferences = inferSearchConditions(listPage, dataKeyInference.selectedField);
305
+ const buttonAliases = inferButtonAliases(input.pages);
306
+ const deletePolicyInference = inferDeletePolicy(input.actions);
307
+ const customWorkflows = inferCustomWorkflows(input.pages, input.actions);
308
+ // 组装 hints(与 ModuleHints 类型对齐)
309
+ const hints = {
310
+ dataKey: dataKeyInference.selectedField
311
+ ? {
312
+ selectedField: dataKeyInference.selectedField,
313
+ candidateFields: input.sourceAnalysis.fields
314
+ }
315
+ : undefined,
316
+ searchConditions: searchConditionInferences
317
+ .filter((condition) => condition.resolved)
318
+ .map((condition) => ({
319
+ field: condition.field,
320
+ component: condition.component
321
+ })),
322
+ buttonAliases,
323
+ deletePolicy: deletePolicyInference.value,
324
+ customWorkflows: customWorkflows.map((workflow) => ({
325
+ label: workflow.label,
326
+ actionAlias: workflow.actionAlias,
327
+ expectedIntent: workflow.expectedIntent,
328
+ expectedAssertion: workflow.expectedAssertion,
329
+ include: workflow.resolved,
330
+ excludeReason: workflow.resolved ? undefined : '未找到对应断言证据'
331
+ }))
332
+ };
333
+ // 组装 unresolved
334
+ const unresolved = [];
335
+ if (!dataKeyInference.selectedField) {
336
+ unresolved.push('dataKey.selectedField');
337
+ }
338
+ for (const condition of searchConditionInferences) {
339
+ if (!condition.resolved) {
340
+ unresolved.push(`searchConditions.${condition.field}`);
341
+ }
342
+ }
343
+ for (const workflow of customWorkflows) {
344
+ if (!workflow.resolved) {
345
+ unresolved.push(`customWorkflows.${workflow.label}`);
346
+ }
347
+ }
348
+ // 合并显式 hints(若有)
349
+ const mode = input.explicitHints ? 'merged' : 'inferred';
350
+ const confidence = unresolved.length === 0 ? 'high' : unresolved.length <= 2 ? 'medium' : 'low';
351
+ const inference = {
352
+ mode,
353
+ confidence,
354
+ dataKey: dataKeyInference,
355
+ searchConditions: searchConditionInferences,
356
+ buttonAliases,
357
+ deletePolicy: deletePolicyInference,
358
+ assertionPolicy: {},
359
+ customWorkflows,
360
+ unresolved
361
+ };
362
+ return { hints, inference };
363
+ }
@@ -0,0 +1,26 @@
1
+ import type { ExtractedCodeListSummary, ExtractedHtmlPage, ExtractedJavaAction } from '../index.js';
2
+ import type { SourceAnalysis } from '../contracts/inference-trace.js';
3
+ /**
4
+ * buildSourceAnalysis 的输入参数。
5
+ */
6
+ export type BuildSourceAnalysisInput = {
7
+ codeListPath: string;
8
+ docsDir: string;
9
+ codeList: ExtractedCodeListSummary;
10
+ pages: ExtractedHtmlPage[];
11
+ actions: ExtractedJavaAction[];
12
+ };
13
+ /**
14
+ * 构建 sourceAnalysis 章节。
15
+ *
16
+ * 实现规则:
17
+ * - docsDir 下存在 PRD markdown(文件名含 prd 或正文含 `## 4. 功能需求`)时登记 prd_markdown source。
18
+ * - HTML 页面登记为 uiSignals(字段、按钮、表格列、弹窗)。
19
+ * - Java Action 登记为 backendSignals(方法名、callback 消息)。
20
+ * - 无 spec.yaml 时 mode='prd+html+java';有 spec.yaml 时 mode='extracted'。
21
+ *
22
+ * @param input - 输入参数(codeListPath、docsDir、codeList、pages、actions)。
23
+ * @returns 源分析快照。
24
+ */
25
+ export declare function buildSourceAnalysis(input: BuildSourceAnalysisInput): SourceAnalysis;
26
+ //# sourceMappingURL=source-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-analysis.d.ts","sourceRoot":"","sources":["../../../src/inference/source-analysis.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,cAAc,EAGf,MAAM,iCAAiC,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC,CAAC;AAgLF;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,cAAc,CAkFnF"}