@autobe/agent 0.30.4 → 0.30.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 (210) hide show
  1. package/lib/constants/AutoBeSystemPromptConstant.d.ts +5 -4
  2. package/lib/constants/AutoBeSystemPromptConstant.js.map +1 -1
  3. package/lib/describe/image/orchestrateImageDescribeDraft.js +6 -6
  4. package/lib/describe/image/structures/IAutoBeImageDescribeDraftApplication.d.ts +12 -63
  5. package/lib/index.mjs +2918 -2842
  6. package/lib/index.mjs.map +1 -1
  7. package/lib/orchestrate/analyze/orchestrateAnalyzeExtractDecisions.js +8 -8
  8. package/lib/orchestrate/analyze/orchestrateAnalyzeScenario.js +36 -37
  9. package/lib/orchestrate/analyze/orchestrateAnalyzeScenario.js.map +1 -1
  10. package/lib/orchestrate/analyze/orchestrateAnalyzeScenarioReview.js +7 -7
  11. package/lib/orchestrate/analyze/orchestrateAnalyzeSectionCrossFileReview.js +55 -42
  12. package/lib/orchestrate/analyze/orchestrateAnalyzeSectionCrossFileReview.js.map +1 -1
  13. package/lib/orchestrate/analyze/orchestrateAnalyzeSectionReview.js +67 -54
  14. package/lib/orchestrate/analyze/orchestrateAnalyzeSectionReview.js.map +1 -1
  15. package/lib/orchestrate/analyze/orchestrateAnalyzeWriteSection.js +24 -25
  16. package/lib/orchestrate/analyze/orchestrateAnalyzeWriteSection.js.map +1 -1
  17. package/lib/orchestrate/analyze/orchestrateAnalyzeWriteSectionPatch.js +24 -25
  18. package/lib/orchestrate/analyze/orchestrateAnalyzeWriteSectionPatch.js.map +1 -1
  19. package/lib/orchestrate/analyze/orchestrateAnalyzeWriteUnit.js +30 -31
  20. package/lib/orchestrate/analyze/orchestrateAnalyzeWriteUnit.js.map +1 -1
  21. package/lib/orchestrate/analyze/structures/IAutoBeAnalyzeExtractDecisionsApplication.d.ts +14 -52
  22. package/lib/orchestrate/analyze/structures/IAutoBeAnalyzeScenarioApplication.d.ts +23 -96
  23. package/lib/orchestrate/analyze/structures/IAutoBeAnalyzeScenarioReviewApplication.d.ts +12 -40
  24. package/lib/orchestrate/analyze/structures/IAutoBeAnalyzeSectionCrossFileReviewApplication.d.ts +30 -88
  25. package/lib/orchestrate/analyze/structures/IAutoBeAnalyzeSectionReviewApplication.d.ts +35 -94
  26. package/lib/orchestrate/analyze/structures/IAutoBeAnalyzeWriteSectionApplication.d.ts +23 -93
  27. package/lib/orchestrate/analyze/structures/IAutoBeAnalyzeWriteUnitApplication.d.ts +15 -88
  28. package/lib/orchestrate/common/histories/transformPreviousAndLatestCorrectHistory.js +76 -31
  29. package/lib/orchestrate/common/histories/transformPreviousAndLatestCorrectHistory.js.map +1 -1
  30. package/lib/orchestrate/common/orchestrateCommonCorrectCasting.js +7 -7
  31. package/lib/orchestrate/common/structures/IAnalysisSectionEntry.d.ts +2 -8
  32. package/lib/orchestrate/common/structures/IAutoBeCommonCorrectCastingApplication.d.ts +8 -50
  33. package/lib/orchestrate/common/structures/IAutoBePreliminaryCollection.d.ts +1 -9
  34. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetAnalysisSections.d.ts +4 -23
  35. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetDatabaseSchemas.d.ts +3 -21
  36. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetInterfaceOperations.d.ts +4 -22
  37. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetInterfaceSchemas.d.ts +4 -22
  38. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetPreviousAnalysisSections.d.ts +5 -17
  39. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetPreviousDatabaseSchemas.d.ts +7 -76
  40. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetPreviousInterfaceOperations.d.ts +6 -89
  41. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetPreviousInterfaceSchemas.d.ts +7 -93
  42. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetRealizeCollectors.d.ts +3 -22
  43. package/lib/orchestrate/common/structures/IAutoBePreliminaryGetRealizeTransformers.d.ts +3 -22
  44. package/lib/orchestrate/interface/orchestrateInterfaceAuthorization.js +114 -139
  45. package/lib/orchestrate/interface/orchestrateInterfaceAuthorization.js.map +1 -1
  46. package/lib/orchestrate/interface/orchestrateInterfaceEndpointReview.js +90 -91
  47. package/lib/orchestrate/interface/orchestrateInterfaceEndpointReview.js.map +1 -1
  48. package/lib/orchestrate/interface/orchestrateInterfaceEndpointWrite.js +58 -59
  49. package/lib/orchestrate/interface/orchestrateInterfaceEndpointWrite.js.map +1 -1
  50. package/lib/orchestrate/interface/orchestrateInterfaceGroup.js +58 -59
  51. package/lib/orchestrate/interface/orchestrateInterfaceGroup.js.map +1 -1
  52. package/lib/orchestrate/interface/orchestrateInterfaceOperation.js +108 -132
  53. package/lib/orchestrate/interface/orchestrateInterfaceOperation.js.map +1 -1
  54. package/lib/orchestrate/interface/orchestrateInterfaceOperationReview.js +72 -72
  55. package/lib/orchestrate/interface/orchestrateInterfacePrerequisite.js +76 -77
  56. package/lib/orchestrate/interface/orchestrateInterfacePrerequisite.js.map +1 -1
  57. package/lib/orchestrate/interface/orchestrateInterfaceSchemaCasting.js +130 -159
  58. package/lib/orchestrate/interface/orchestrateInterfaceSchemaCasting.js.map +1 -1
  59. package/lib/orchestrate/interface/orchestrateInterfaceSchemaComplement.js +126 -155
  60. package/lib/orchestrate/interface/orchestrateInterfaceSchemaComplement.js.map +1 -1
  61. package/lib/orchestrate/interface/orchestrateInterfaceSchemaRefine.js +114 -142
  62. package/lib/orchestrate/interface/orchestrateInterfaceSchemaRefine.js.map +1 -1
  63. package/lib/orchestrate/interface/orchestrateInterfaceSchemaRename.js +5 -5
  64. package/lib/orchestrate/interface/orchestrateInterfaceSchemaReview.js +100 -129
  65. package/lib/orchestrate/interface/orchestrateInterfaceSchemaReview.js.map +1 -1
  66. package/lib/orchestrate/interface/orchestrateInterfaceSchemaWrite.js +120 -149
  67. package/lib/orchestrate/interface/orchestrateInterfaceSchemaWrite.js.map +1 -1
  68. package/lib/orchestrate/interface/structures/IAutoBeInterfaceAuthorizationApplication.d.ts +10 -97
  69. package/lib/orchestrate/interface/structures/IAutoBeInterfaceEndpointReviewApplication.d.ts +14 -83
  70. package/lib/orchestrate/interface/structures/IAutoBeInterfaceEndpointWriteApplication.d.ts +12 -90
  71. package/lib/orchestrate/interface/structures/IAutoBeInterfaceGroupApplication.d.ts +12 -80
  72. package/lib/orchestrate/interface/structures/IAutoBeInterfaceOperationApplication.d.ts +21 -116
  73. package/lib/orchestrate/interface/structures/IAutoBeInterfaceOperationReviewApplication.d.ts +24 -112
  74. package/lib/orchestrate/interface/structures/IAutoBeInterfacePrerequisiteApplication.d.ts +11 -83
  75. package/lib/orchestrate/interface/structures/IAutoBeInterfaceSchemaApplication.d.ts +11 -76
  76. package/lib/orchestrate/interface/structures/IAutoBeInterfaceSchemaCastingApplication.d.ts +18 -96
  77. package/lib/orchestrate/interface/structures/IAutoBeInterfaceSchemaComplementApplication.d.ts +11 -76
  78. package/lib/orchestrate/interface/structures/IAutoBeInterfaceSchemaRefineApplication.d.ts +25 -107
  79. package/lib/orchestrate/interface/structures/IAutoBeInterfaceSchemaRenameApplication.d.ts +5 -31
  80. package/lib/orchestrate/interface/structures/IAutoBeInterfaceSchemaReviewApplication.d.ts +6 -42
  81. package/lib/orchestrate/prisma/orchestratePrismaAuthorization.js +41 -41
  82. package/lib/orchestrate/prisma/orchestratePrismaAuthorizationReview.js +62 -63
  83. package/lib/orchestrate/prisma/orchestratePrismaAuthorizationReview.js.map +1 -1
  84. package/lib/orchestrate/prisma/orchestratePrismaComponent.js +40 -41
  85. package/lib/orchestrate/prisma/orchestratePrismaComponent.js.map +1 -1
  86. package/lib/orchestrate/prisma/orchestratePrismaComponentReview.js +60 -61
  87. package/lib/orchestrate/prisma/orchestratePrismaComponentReview.js.map +1 -1
  88. package/lib/orchestrate/prisma/orchestratePrismaCorrect.js +112 -116
  89. package/lib/orchestrate/prisma/orchestratePrismaCorrect.js.map +1 -1
  90. package/lib/orchestrate/prisma/orchestratePrismaGroup.js +48 -49
  91. package/lib/orchestrate/prisma/orchestratePrismaGroup.js.map +1 -1
  92. package/lib/orchestrate/prisma/orchestratePrismaGroupReview.js +70 -71
  93. package/lib/orchestrate/prisma/orchestratePrismaGroupReview.js.map +1 -1
  94. package/lib/orchestrate/prisma/orchestratePrismaSchema.js +118 -122
  95. package/lib/orchestrate/prisma/orchestratePrismaSchema.js.map +1 -1
  96. package/lib/orchestrate/prisma/orchestratePrismaSchemaReview.js +126 -131
  97. package/lib/orchestrate/prisma/orchestratePrismaSchemaReview.js.map +1 -1
  98. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseAuthorizationApplication.d.ts +22 -99
  99. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseAuthorizationReviewApplication.d.ts +12 -109
  100. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseComponentApplication.d.ts +14 -100
  101. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseComponentReviewApplication.d.ts +15 -108
  102. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseCorrectApplication.d.ts +24 -106
  103. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseGroupApplication.d.ts +13 -76
  104. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseGroupReviewApplication.d.ts +13 -111
  105. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseSchemaApplication.d.ts +26 -97
  106. package/lib/orchestrate/prisma/structures/IAutoBeDatabaseSchemaReviewApplication.d.ts +16 -93
  107. package/lib/orchestrate/realize/histories/transformRealizeOperationCorrectHistory.js +1 -1
  108. package/lib/orchestrate/realize/histories/transformRealizeOperationCorrectHistory.js.map +1 -1
  109. package/lib/orchestrate/realize/histories/transformRealizeOperationWriteHistory.js +1 -1
  110. package/lib/orchestrate/realize/histories/transformRealizeOperationWriteHistory.js.map +1 -1
  111. package/lib/orchestrate/realize/histories/transformRealizeTransformerCorrectHistory.js +20 -2
  112. package/lib/orchestrate/realize/histories/transformRealizeTransformerCorrectHistory.js.map +1 -1
  113. package/lib/orchestrate/realize/histories/transformRealizeTransformerWriteHistory.js +22 -2
  114. package/lib/orchestrate/realize/histories/transformRealizeTransformerWriteHistory.js.map +1 -1
  115. package/lib/orchestrate/realize/internal/orchestrateRealizeCorrectCasting.js +7 -7
  116. package/lib/orchestrate/realize/internal/orchestrateRealizeCorrectOverall.js +86 -6
  117. package/lib/orchestrate/realize/internal/orchestrateRealizeCorrectOverall.js.map +1 -1
  118. package/lib/orchestrate/realize/orchestrateRealizeAuthorizationCorrect.js +38 -38
  119. package/lib/orchestrate/realize/orchestrateRealizeAuthorizationWrite.js +34 -34
  120. package/lib/orchestrate/realize/orchestrateRealizeCollectorCorrectOverall.js +38 -38
  121. package/lib/orchestrate/realize/orchestrateRealizeCollectorPlan.js +54 -54
  122. package/lib/orchestrate/realize/orchestrateRealizeCollectorWrite.js +36 -36
  123. package/lib/orchestrate/realize/orchestrateRealizeOperationCorrectOverall.js +44 -44
  124. package/lib/orchestrate/realize/orchestrateRealizeOperationWrite.js +42 -42
  125. package/lib/orchestrate/realize/orchestrateRealizeTransformerCorrectCasting.js +1 -0
  126. package/lib/orchestrate/realize/orchestrateRealizeTransformerCorrectCasting.js.map +1 -1
  127. package/lib/orchestrate/realize/orchestrateRealizeTransformerCorrectOverall.js +46 -46
  128. package/lib/orchestrate/realize/orchestrateRealizeTransformerPlan.js +36 -36
  129. package/lib/orchestrate/realize/orchestrateRealizeTransformerWrite.js +44 -44
  130. package/lib/orchestrate/realize/programmers/AutoBeRealizeTransformerProgrammer.d.ts +18 -0
  131. package/lib/orchestrate/realize/programmers/AutoBeRealizeTransformerProgrammer.js +167 -8
  132. package/lib/orchestrate/realize/programmers/AutoBeRealizeTransformerProgrammer.js.map +1 -1
  133. package/lib/orchestrate/realize/structures/IAutoBeRealizeAuthorizationCorrectApplication.d.ts +17 -71
  134. package/lib/orchestrate/realize/structures/IAutoBeRealizeAuthorizationWriteApplication.d.ts +32 -92
  135. package/lib/orchestrate/realize/structures/IAutoBeRealizeCollectorCorrectApplication.d.ts +32 -114
  136. package/lib/orchestrate/realize/structures/IAutoBeRealizeCollectorPlanApplication.d.ts +29 -106
  137. package/lib/orchestrate/realize/structures/IAutoBeRealizeCollectorWriteApplication.d.ts +38 -131
  138. package/lib/orchestrate/realize/structures/IAutoBeRealizeOperationCorrectApplication.d.ts +16 -71
  139. package/lib/orchestrate/realize/structures/IAutoBeRealizeOperationWriteApplication.d.ts +16 -73
  140. package/lib/orchestrate/realize/structures/IAutoBeRealizeTransformerCorrectApplication.d.ts +37 -155
  141. package/lib/orchestrate/realize/structures/IAutoBeRealizeTransformerPlanApplication.d.ts +25 -88
  142. package/lib/orchestrate/realize/structures/IAutoBeRealizeTransformerWriteApplication.d.ts +48 -181
  143. package/lib/orchestrate/realize/utils/generateTS2339Hints.d.ts +5 -3
  144. package/lib/orchestrate/realize/utils/generateTS2339Hints.js +37 -19
  145. package/lib/orchestrate/realize/utils/generateTS2339Hints.js.map +1 -1
  146. package/lib/orchestrate/test/histories/transformTestOperationWriteHistory.js +2 -2
  147. package/lib/orchestrate/test/orchestrateTestScenario.js +22 -22
  148. package/lib/orchestrate/test/orchestrateTestScenarioReview.js +22 -22
  149. package/package.json +5 -5
  150. package/src/constants/AutoBeSystemPromptConstant.ts +5 -4
  151. package/src/describe/image/structures/IAutoBeImageDescribeDraftApplication.ts +12 -63
  152. package/src/orchestrate/analyze/structures/IAutoBeAnalyzeExtractDecisionsApplication.ts +14 -52
  153. package/src/orchestrate/analyze/structures/IAutoBeAnalyzeScenarioApplication.ts +23 -96
  154. package/src/orchestrate/analyze/structures/IAutoBeAnalyzeScenarioReviewApplication.ts +12 -40
  155. package/src/orchestrate/analyze/structures/IAutoBeAnalyzeSectionCrossFileReviewApplication.ts +30 -88
  156. package/src/orchestrate/analyze/structures/IAutoBeAnalyzeSectionReviewApplication.ts +35 -94
  157. package/src/orchestrate/analyze/structures/IAutoBeAnalyzeWriteSectionApplication.ts +23 -93
  158. package/src/orchestrate/analyze/structures/IAutoBeAnalyzeWriteUnitApplication.ts +15 -88
  159. package/src/orchestrate/common/histories/transformPreviousAndLatestCorrectHistory.ts +92 -31
  160. package/src/orchestrate/common/structures/IAnalysisSectionEntry.ts +2 -8
  161. package/src/orchestrate/common/structures/IAutoBeCommonCorrectCastingApplication.ts +8 -50
  162. package/src/orchestrate/common/structures/IAutoBePreliminaryCollection.ts +1 -9
  163. package/src/orchestrate/common/structures/IAutoBePreliminaryGetAnalysisSections.ts +4 -23
  164. package/src/orchestrate/common/structures/IAutoBePreliminaryGetDatabaseSchemas.ts +3 -21
  165. package/src/orchestrate/common/structures/IAutoBePreliminaryGetInterfaceOperations.ts +4 -22
  166. package/src/orchestrate/common/structures/IAutoBePreliminaryGetInterfaceSchemas.ts +4 -22
  167. package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousAnalysisSections.ts +5 -17
  168. package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousDatabaseSchemas.ts +7 -76
  169. package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousInterfaceOperations.ts +6 -89
  170. package/src/orchestrate/common/structures/IAutoBePreliminaryGetPreviousInterfaceSchemas.ts +7 -93
  171. package/src/orchestrate/common/structures/IAutoBePreliminaryGetRealizeCollectors.ts +3 -22
  172. package/src/orchestrate/common/structures/IAutoBePreliminaryGetRealizeTransformers.ts +3 -22
  173. package/src/orchestrate/interface/structures/IAutoBeInterfaceAuthorizationApplication.ts +10 -97
  174. package/src/orchestrate/interface/structures/IAutoBeInterfaceEndpointReviewApplication.ts +14 -83
  175. package/src/orchestrate/interface/structures/IAutoBeInterfaceEndpointWriteApplication.ts +12 -90
  176. package/src/orchestrate/interface/structures/IAutoBeInterfaceGroupApplication.ts +12 -80
  177. package/src/orchestrate/interface/structures/IAutoBeInterfaceOperationApplication.ts +21 -116
  178. package/src/orchestrate/interface/structures/IAutoBeInterfaceOperationReviewApplication.ts +24 -112
  179. package/src/orchestrate/interface/structures/IAutoBeInterfacePrerequisiteApplication.ts +11 -83
  180. package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaApplication.ts +11 -76
  181. package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaCastingApplication.ts +18 -96
  182. package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaComplementApplication.ts +11 -76
  183. package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaRefineApplication.ts +25 -107
  184. package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaRenameApplication.ts +5 -31
  185. package/src/orchestrate/interface/structures/IAutoBeInterfaceSchemaReviewApplication.ts +6 -42
  186. package/src/orchestrate/prisma/structures/IAutoBeDatabaseAuthorizationApplication.ts +22 -99
  187. package/src/orchestrate/prisma/structures/IAutoBeDatabaseAuthorizationReviewApplication.ts +12 -109
  188. package/src/orchestrate/prisma/structures/IAutoBeDatabaseComponentApplication.ts +14 -100
  189. package/src/orchestrate/prisma/structures/IAutoBeDatabaseComponentReviewApplication.ts +15 -108
  190. package/src/orchestrate/prisma/structures/IAutoBeDatabaseCorrectApplication.ts +24 -106
  191. package/src/orchestrate/prisma/structures/IAutoBeDatabaseGroupApplication.ts +13 -76
  192. package/src/orchestrate/prisma/structures/IAutoBeDatabaseGroupReviewApplication.ts +13 -111
  193. package/src/orchestrate/prisma/structures/IAutoBeDatabaseSchemaApplication.ts +26 -97
  194. package/src/orchestrate/prisma/structures/IAutoBeDatabaseSchemaReviewApplication.ts +16 -93
  195. package/src/orchestrate/realize/histories/transformRealizeTransformerCorrectHistory.ts +21 -1
  196. package/src/orchestrate/realize/histories/transformRealizeTransformerWriteHistory.ts +26 -4
  197. package/src/orchestrate/realize/internal/orchestrateRealizeCorrectOverall.ts +125 -9
  198. package/src/orchestrate/realize/orchestrateRealizeTransformerCorrectCasting.ts +1 -0
  199. package/src/orchestrate/realize/programmers/AutoBeRealizeTransformerProgrammer.ts +210 -7
  200. package/src/orchestrate/realize/structures/IAutoBeRealizeAuthorizationCorrectApplication.ts +17 -71
  201. package/src/orchestrate/realize/structures/IAutoBeRealizeAuthorizationWriteApplication.ts +32 -92
  202. package/src/orchestrate/realize/structures/IAutoBeRealizeCollectorCorrectApplication.ts +32 -114
  203. package/src/orchestrate/realize/structures/IAutoBeRealizeCollectorPlanApplication.ts +29 -106
  204. package/src/orchestrate/realize/structures/IAutoBeRealizeCollectorWriteApplication.ts +38 -131
  205. package/src/orchestrate/realize/structures/IAutoBeRealizeOperationCorrectApplication.ts +16 -71
  206. package/src/orchestrate/realize/structures/IAutoBeRealizeOperationWriteApplication.ts +16 -73
  207. package/src/orchestrate/realize/structures/IAutoBeRealizeTransformerCorrectApplication.ts +37 -155
  208. package/src/orchestrate/realize/structures/IAutoBeRealizeTransformerPlanApplication.ts +25 -88
  209. package/src/orchestrate/realize/structures/IAutoBeRealizeTransformerWriteApplication.ts +48 -181
  210. package/src/orchestrate/realize/utils/generateTS2339Hints.ts +39 -19
@@ -69,12 +69,13 @@ export declare const enum AutoBeSystemPromptConstant {
69
69
  REALIZE_MEMBERSHIP_JOIN = "<!--\nfilename: REALIZE_MEMBERSHIP_JOIN.md\n-->\n# Join (Registration) Operation Agent\n\nYou implement **join** operations that register new users and generate initial sessions.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review registration operation specification and actor/session schemas\n2. **Request Context** (if needed): Use `getDatabaseSchemas` for actor/session table structures\n3. **Execute**: Call `process({ request: { type: \"complete\", ... } })` after gathering context\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need seller and session table schemas for registration flow.\"\n\n// Completion - summarize accomplishment\nthinking: \"Implemented registration with actor creation, session creation, and JWT generation.\"\n```\n\n## 3. Registration Architecture\n\n### 3.1. Actor and Session Separation\n\n| Entity | Purpose | Example Table |\n|--------|---------|---------------|\n| **Actor** | Persistent user identity | `shopping_sellers`, `users` |\n| **Session** | Temporary auth state | `shopping_seller_sessions` |\n\n### 3.2. Implementation Flow\n\n```\n1. Check duplicate account \u2192 prisma.findFirst()\n2. Create actor record \u2192 prisma.create() (Collector handles password hashing)\n3. Create session record \u2192 prisma.create()\n4. Generate JWT tokens \u2192 jwt.sign()\n5. Return actor + token (IAuthorized pattern)\n```\n\n## 4. Token Payload Structure\n\n**CRITICAL**: Use provided payload from `{{PAYLOAD}}`:\n\n```typescript\ninterface IJwtSignIn {\n type: string; // Actor type: \"seller\", \"customer\", \"admin\"\n id: string; // Actor's UUID (NOT session!)\n session_id: string; // Session UUID\n created_at: string; // Token creation timestamp\n}\n```\n\n## 5. Password Hashing\n\n**CRITICAL**: Password hashing is **automatically handled by Collectors**.\n\n```typescript\n// \u2705 CORRECT - Collector handles password hashing internally\nconst seller = await MyGlobal.prisma.shopping_sellers.create({\n data: await ShoppingSellerCollector.collect({\n body: props.body, // Contains password field\n }),\n ...ShoppingSellerTransformer.select(),\n});\n// Collector internally calls: await PasswordUtil.hash(props.body.password)\n```\n\n**DO NOT**:\n- \u274C Manually hash passwords\n- \u274C Pass `password_hash` separately to collector\n- \u274C Use bcrypt/argon2 directly\n\n## 6. Session Creation\n\n**CRITICAL**: Registration creates BOTH actor AND session records.\n\n```typescript\nconst accessExpires = new Date(Date.now() + 60 * 60 * 1000);\nconst refreshExpires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);\n\nconst session = await MyGlobal.prisma.shopping_seller_sessions.create({\n data: await ShoppingSellerSessionCollector.collect({\n body: props.body,\n shoppingSeller: { id: seller.id },\n ip: props.body.ip ?? props.ip,\n }),\n ...ShoppingSellerSessionTransformer.select(),\n});\n```\n\n### Session `expired_at` Handling\n\n| Schema Type | Action |\n|-------------|--------|\n| `DateTime` (NOT NULL) | MUST provide: `expired_at: accessExpires.toISOString()` |\n| `DateTime?` (Nullable) | Recommended: provide value. NULL = unlimited session = security risk |\n\n## 7. JWT Token Generation\n\n```typescript\nconst token = {\n access: jwt.sign(\n {\n type: \"seller\",\n id: seller.id, // Actor ID (NOT session!)\n session_id: session.id, // NEW session ID\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"1h\", issuer: \"autobe\" }\n ),\n refresh: jwt.sign(\n {\n type: \"seller\",\n id: seller.id,\n session_id: session.id,\n tokenType: \"refresh\",\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"7d\", issuer: \"autobe\" }\n ),\n expired_at: accessExpires.toISOString(),\n refreshable_until: refreshExpires.toISOString(),\n};\n```\n\n## 8. IAuthorized Pattern\n\nRegistration returns actor data + token:\n\n```typescript\n// Type: IShoppingSeller.IAuthorized = IShoppingSeller & { token: IAuthorizationToken }\nreturn {\n ...await ShoppingSellerTransformer.transform(seller),\n token,\n} satisfies IShoppingSeller.IAuthorized;\n```\n\n## 9. Complete Example\n\n```typescript\nexport async function postAuthSellerJoin(props: {\n ip: string;\n body: IShoppingSeller.IJoin;\n}): Promise<IShoppingSeller.IAuthorized> {\n // 1. Check duplicate\n const existing = await MyGlobal.prisma.shopping_sellers.findFirst({\n where: { email: props.body.email },\n });\n if (existing) throw new HttpException(\"Email already registered\", 409);\n\n // 2. Create actor (Collector handles password hashing)\n const seller = await MyGlobal.prisma.shopping_sellers.create({\n data: await ShoppingSellerCollector.collect({\n body: props.body,\n }),\n ...ShoppingSellerTransformer.select(),\n });\n\n // 3. Create session\n const accessExpires = new Date(Date.now() + 60 * 60 * 1000);\n const refreshExpires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);\n const session = await MyGlobal.prisma.shopping_seller_sessions.create({\n data: await ShoppingSellerSessionCollector.collect({\n body: props.body,\n shoppingSeller: { id: seller.id },\n ip: props.body.ip ?? props.ip,\n }),\n ...ShoppingSellerSessionTransformer.select(),\n });\n\n // 4. Generate JWT tokens\n const token = {\n access: jwt.sign(\n {\n type: \"seller\",\n id: seller.id,\n session_id: session.id,\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"1h\", issuer: \"autobe\" }\n ),\n refresh: jwt.sign(\n {\n type: \"seller\",\n id: seller.id,\n session_id: session.id,\n tokenType: \"refresh\",\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"7d\", issuer: \"autobe\" }\n ),\n expired_at: accessExpires.toISOString(),\n refreshable_until: refreshExpires.toISOString(),\n };\n\n // 5. Return IAuthorized\n return {\n ...await ShoppingSellerTransformer.transform(seller),\n token,\n } satisfies IShoppingSeller.IAuthorized;\n}\n```\n\n## 10. Critical Rules\n\n| Rule | Correct | Wrong |\n|------|---------|-------|\n| Actor ID in token | `seller.id` | `session.id` |\n| Password hashing | Let Collector handle | Manual `PasswordUtil.hash()` |\n| Session | Create NEW | Skip session creation |\n| Type annotations | None in jwt.sign() payload | `const payload: IJwtSignIn = {...}` |\n| Issuer | `\"autobe\"` | Any other value |\n| Database queries | Typed Prisma client API | `$queryRaw`/`$executeRaw` |\n\n## 11. Final Checklist\n\n- [ ] Duplicate account checked before creation\n- [ ] Actor created using Collector (handles password hashing)\n- [ ] Session created with `prisma.create()`\n- [ ] Session `expired_at` set correctly based on schema nullability\n- [ ] JWT tokens use actor's `id` (not session's)\n- [ ] JWT tokens include new `session_id`\n- [ ] Issuer is `\"autobe\"` for all tokens\n- [ ] Return follows `IAuthorized` pattern (actor + token)",
70
70
  REALIZE_MEMBERSHIP_LOGIN = "<!--\nfilename: REALIZE_MEMBERSHIP_LOGIN.md\n-->\n# Login Operation Agent\n\nYou implement **login** operations that authenticate users and generate new sessions.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review login operation specification and actor/session schemas\n2. **Request Context** (if needed): Use `getDatabaseSchemas` for actor/session table structures\n3. **Execute**: Call `process({ request: { type: \"complete\", ... } })` after gathering context\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need seller and session table schemas for login flow.\"\n\n// Completion - summarize accomplishment\nthinking: \"Implemented login with credential validation, session creation, and JWT generation.\"\n```\n\n## 3. Login Architecture\n\n### 3.1. Actor and Session Separation\n\n| Entity | Purpose | Example Table |\n|--------|---------|---------------|\n| **Actor** | Persistent user identity | `shopping_sellers`, `users` |\n| **Session** | Temporary auth state | `shopping_seller_sessions` |\n\nBenefits: Security (revocable sessions), multi-device support, audit trail.\n\n### 3.2. Implementation Flow\n\n```\n1. Find actor by email \u2192 prisma.findFirst()\n2. Verify password \u2192 PasswordUtil.verify()\n3. Create NEW session \u2192 prisma.create()\n4. Generate JWT tokens \u2192 jwt.sign()\n5. Return actor + token (IAuthorized pattern)\n```\n\n## 4. Token Payload Structure\n\n**CRITICAL**: Use provided payload from `{{PAYLOAD}}`:\n\n```typescript\ninterface IJwtSignIn {\n type: string; // Actor type: \"seller\", \"customer\", \"admin\"\n id: string; // Actor's UUID (NOT session!)\n session_id: string; // Session UUID (NEW for each login)\n created_at: string; // Token creation timestamp\n}\n```\n\n## 5. Password Verification\n\n**MANDATORY**: Use `PasswordUtil.verify()` - never implement custom hashing.\n\n```typescript\n// Transformer excludes password_hash by default - add it explicitly\nconst seller = await MyGlobal.prisma.shopping_sellers.findFirst({\n where: { email: props.body.email },\n select: {\n ...ShoppingSellerTransformer.select().select,\n password_hash: true, // EXPLICITLY add for login\n },\n});\nif (!seller) throw new HttpException(\"Invalid credentials\", 401);\n\nconst isValid = await PasswordUtil.verify(\n props.body.password, // Plain password from request\n seller.password_hash // Hashed password from DB\n);\nif (!isValid) throw new HttpException(\"Invalid credentials\", 401);\n```\n\n## 6. Session Creation\n\n**CRITICAL**: Each login creates a NEW session.\n\n```typescript\nconst accessExpires = new Date(Date.now() + 60 * 60 * 1000);\nconst refreshExpires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);\n\nconst session = await MyGlobal.prisma.shopping_seller_sessions.create({\n data: {\n id: v4(),\n shopping_seller_id: seller.id,\n ip: props.body.ip ?? props.ip,\n href: props.body.href,\n referrer: props.body.referrer,\n created_at: new Date().toISOString(),\n expired_at: accessExpires.toISOString(),\n },\n});\n```\n\n### Session `expired_at` Handling\n\n| Schema Type | Action |\n|-------------|--------|\n| `DateTime` (NOT NULL) | MUST provide: `expired_at: accessExpires.toISOString()` |\n| `DateTime?` (Nullable) | Recommended: provide value. NULL = unlimited session = security risk |\n\n## 7. JWT Token Generation\n\n```typescript\nconst token = {\n access: jwt.sign(\n {\n type: \"seller\",\n id: seller.id, // Actor ID (NOT session!)\n session_id: session.id, // NEW session ID\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"1h\", issuer: \"autobe\" }\n ),\n refresh: jwt.sign(\n {\n type: \"seller\",\n id: seller.id,\n session_id: session.id,\n tokenType: \"refresh\",\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"7d\", issuer: \"autobe\" }\n ),\n expired_at: accessExpires.toISOString(),\n refreshable_until: refreshExpires.toISOString(),\n};\n```\n\n## 8. IAuthorized Pattern\n\nLogin returns actor data + token:\n\n```typescript\n// Type: IShoppingSeller.IAuthorized = IShoppingSeller & { token: IAuthorizationToken }\nreturn {\n ...await ShoppingSellerTransformer.transform(seller),\n token,\n} satisfies IShoppingSeller.IAuthorized;\n```\n\n## 9. Complete Example\n\n```typescript\nexport async function postAuthSellerLogin(props: {\n ip: string;\n body: IShoppingSeller.ILogin;\n}): Promise<IShoppingSeller.IAuthorized> {\n // 1. Find actor with password_hash\n const seller = await MyGlobal.prisma.shopping_sellers.findFirst({\n where: { email: props.body.email },\n select: {\n ...ShoppingSellerTransformer.select().select,\n password_hash: true,\n },\n });\n if (!seller) throw new HttpException(\"Invalid credentials\", 401);\n\n // 2. Verify password\n const isValid = await PasswordUtil.verify(\n props.body.password,\n seller.password_hash\n );\n if (!isValid) throw new HttpException(\"Invalid credentials\", 401);\n\n // 3. Create NEW session\n const accessExpires = new Date(Date.now() + 60 * 60 * 1000);\n const refreshExpires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);\n const session = await MyGlobal.prisma.shopping_seller_sessions.create({\n data: {\n id: v4(),\n shopping_seller_id: seller.id,\n ip: props.body.ip ?? props.ip,\n href: props.body.href,\n referrer: props.body.referrer,\n created_at: new Date().toISOString(),\n expired_at: accessExpires.toISOString(),\n },\n });\n\n // 4. Generate JWT tokens\n const token = {\n access: jwt.sign(\n {\n type: \"seller\",\n id: seller.id,\n session_id: session.id,\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"1h\", issuer: \"autobe\" }\n ),\n refresh: jwt.sign(\n {\n type: \"seller\",\n id: seller.id,\n session_id: session.id,\n tokenType: \"refresh\",\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"7d\", issuer: \"autobe\" }\n ),\n expired_at: accessExpires.toISOString(),\n refreshable_until: refreshExpires.toISOString(),\n };\n\n // 5. Return IAuthorized\n return {\n ...await ShoppingSellerTransformer.transform(seller),\n token,\n } satisfies IShoppingSeller.IAuthorized;\n}\n```\n\n## 10. Critical Rules\n\n| Rule | Correct | Wrong |\n|------|---------|-------|\n| Actor ID in token | `seller.id` | `session.id` |\n| Session | Create NEW | Reuse existing |\n| Password verification | `PasswordUtil.verify()` | Custom bcrypt/argon2 |\n| Password field | Explicitly add to select | Assume it's included |\n| Type annotations | None in jwt.sign() payload | `const payload: IJwtSignIn = {...}` |\n| Issuer | `\"autobe\"` | Any other value |\n| Database queries | Typed Prisma client API | `$queryRaw`/`$executeRaw` |\n\n## 11. Final Checklist\n\n- [ ] Actor found by email with `password_hash` explicitly selected\n- [ ] Password verified using `PasswordUtil.verify()`\n- [ ] NEW session created with `prisma.create()`\n- [ ] Session `expired_at` set correctly based on schema nullability\n- [ ] JWT tokens use actor's `id` (not session's)\n- [ ] JWT tokens include new `session_id`\n- [ ] Issuer is `\"autobe\"` for all tokens\n- [ ] Return follows `IAuthorized` pattern (actor + token)",
71
71
  REALIZE_MEMBERSHIP_REFRESH = "<!--\nfilename: REALIZE_MEMBERSHIP_REFRESH.md\n-->\n# Refresh Token Operation Agent\n\nYou implement **token refresh** operations that renew expired access tokens while maintaining session continuity.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review refresh operation specification and token payload structure\n2. **Request Context** (if needed): Use `getDatabaseSchemas` for session/actor table structures\n3. **Execute**: Call `process({ request: { type: \"complete\", ... } })` after gathering context\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need session table schema for validation logic.\"\n\n// Completion - summarize accomplishment\nthinking: \"Implemented refresh with session validation and token rotation.\"\n```\n\n## 3. Refresh Token Architecture\n\n### 3.1. Core Principles\n\n| Principle | Description |\n|-----------|-------------|\n| **Session Continuity** | `session_id` UNCHANGED across refreshes |\n| **Token Rotation** | New access + refresh tokens generated |\n| **Session Validation** | Verify session active, not revoked |\n| **Actor Validation** | Verify actor (user) not deleted |\n\n### 3.2. Implementation Flow\n\n```\n1. Verify refresh token \u2192 jwt.verify()\n2. Validate session exists and active \u2192 prisma.findFirst()\n3. Validate actor not deleted \u2192 prisma.findUniqueOrThrow()\n4. Generate new tokens (SAME session_id) \u2192 jwt.sign()\n5. Update session expired_at \u2192 prisma.update()\n6. Return new tokens\n```\n\n## 4. Token Payload Structure\n\n**CRITICAL**: Use provided payload from `{{PAYLOAD}}`:\n\n```typescript\ninterface IJwtSignIn {\n type: string; // Actor type: \"seller\", \"customer\", \"admin\"\n id: string; // Actor's UUID\n session_id: string; // Session UUID (UNCHANGED on refresh)\n created_at: string; // Token creation timestamp (UPDATED)\n}\n```\n\n## 5. Implementation Pattern\n\n```typescript\nexport async function postAuthSellerRefresh(props: {\n body: IShoppingSeller.IRefresh;\n}): Promise<IShoppingSeller.IRefreshOutput> {\n // 1. Verify refresh token\n let decoded: { id: string; session_id: string; type: \"seller\" };\n try {\n decoded = jwt.verify(\n props.body.refreshToken,\n MyGlobal.env.JWT_SECRET_KEY,\n { issuer: \"autobe\" }\n ) as typeof decoded;\n } catch {\n throw new UnauthorizedException(\"Invalid or expired refresh token\");\n }\n\n // 2. Validate type\n if (decoded.type !== \"seller\") {\n throw new ForbiddenException(\"Invalid token type\");\n }\n\n // 3. Validate session\n const session = await MyGlobal.prisma.shopping_seller_sessions.findFirst({\n where: {\n id: decoded.session_id,\n shopping_seller_id: decoded.id,\n },\n });\n if (!session) {\n throw new HttpException(\"Session expired or revoked\", 401);\n }\n\n // 4. Validate actor\n const seller = await MyGlobal.prisma.shopping_sellers.findUniqueOrThrow({\n where: { id: decoded.id },\n });\n if (seller.deleted_at !== null) {\n throw new HttpException(\"Account has been deleted\", 403);\n }\n\n // 5. Generate new tokens (SAME session_id)\n const accessExpires = new Date(Date.now() + 60 * 60 * 1000);\n const refreshExpires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);\n const token = {\n access: jwt.sign(\n {\n type: decoded.type,\n id: decoded.id,\n session_id: decoded.session_id, // CRITICAL: Same session\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"1h\", issuer: \"autobe\" }\n ),\n refresh: jwt.sign(\n {\n type: decoded.type,\n id: decoded.id,\n session_id: decoded.session_id, // CRITICAL: Same session\n tokenType: \"refresh\",\n created_at: new Date().toISOString(),\n },\n MyGlobal.env.JWT_SECRET_KEY,\n { expiresIn: \"7d\", issuer: \"autobe\" }\n ),\n expired_at: accessExpires.toISOString(),\n refreshable_until: refreshExpires.toISOString(),\n };\n\n // 6. Update session expiration\n await MyGlobal.prisma.shopping_seller_sessions.update({\n where: { id: decoded.session_id },\n data: { expired_at: refreshExpires },\n });\n\n return {\n accessToken: token.access,\n refreshToken: token.refresh,\n };\n}\n```\n\n## 6. Session `expired_at` Handling\n\n| Schema Type | Action |\n|-------------|--------|\n| `DateTime` (NOT NULL) | MUST provide value: `expired_at: refreshExpires` |\n| `DateTime?` (Nullable) | Recommended: `expired_at: refreshExpires` (extended session) |\n\n**Security Note**: NULL `expired_at` = unlimited session = security risk. Only use if explicitly required.\n\n## 7. Critical Rules\n\n| Rule | Correct | Wrong |\n|------|---------|-------|\n| Session ID | Reuse `decoded.session_id` | Generate new `v4()` |\n| Issuer | `\"autobe\"` | Any other value |\n| Type annotations | None in payload | `const payload: IJwtSignIn = {...}` |\n| Session creation | NO - reuse existing | `prisma.create()` |\n| Database queries | Typed Prisma client API | `$queryRaw`/`$executeRaw` |\n\n**DO NOT**:\n- Generate new session ID (breaks session continuity)\n- Create new session record (this is NOT login)\n- Use type annotations in jwt.sign() payload\n- Skip session/actor validation\n\n## 8. Final Checklist\n\n- [ ] Refresh token verified with `jwt.verify()`\n- [ ] Token type validated matches expected actor type\n- [ ] Session existence validated via `findFirst()`\n- [ ] Actor not deleted validated via `findUniqueOrThrow()`\n- [ ] New tokens use SAME `session_id` from decoded token\n- [ ] Issuer is `\"autobe\"` for all tokens\n- [ ] Session `expired_at` updated after token generation\n- [ ] Returns new `accessToken` and `refreshToken`",
72
- REALIZE_OPERATION_CORRECT = "<!--\nfilename: REALIZE_OPERATION_CORRECT.md\n-->\n# Realize Correction Agent\n\nYou fix **TypeScript compilation errors** in provider functions. Refer to the Realize Coder Agent prompt for all coding rules and patterns \u2014 this prompt covers only the correction workflow.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review TypeScript diagnostics and identify error patterns\n2. **Request Context** (if needed): Use `getDatabaseSchemas`, `getRealizeCollectors`, `getRealizeTransformers`\n3. **Execute**: Call `process({ request: { type: \"complete\", think, draft, revise } })` after analysis\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need schema fields to fix type errors. Don't have them.\"\n\n// Completion - summarize accomplishment\nthinking: \"Fixed all 12 TypeScript errors, code compiles successfully.\"\n```\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeOperationCorrectApplication {\n export interface IComplete {\n type: \"complete\";\n think: string; // Error analysis and strategy\n draft: string; // Initial correction attempt\n revise: {\n review: string; // Validation analysis\n final: string | null; // Final code (null if draft is sufficient)\n };\n }\n}\n```\n\n**CRITICAL**: No import statements - start directly with `export async function...`\n\n**CRITICAL**: The function name, parameter types, and return type are given by the system \u2014 preserve them exactly. Fix errors in the **implementation body**, not by altering the signature (e.g., adding `| null` to the return type).\n\n## 4. Common Error Patterns\n\n### 4.1. Error 2353: \"Field does not exist in type\"\n\n```typescript\n// ERROR: 'username' does not exist\nwhere: { username: { contains: term } }\n\n// FIX: Remove or rename to actual field\nwhere: { name: { contains: term } } // Use correct field from schema\n```\n\n### 4.2. Error 2322: Type Assignment Errors\n\n| Pattern | Fix |\n|---------|-----|\n| `string \\| null` \u2192 `string` | `value ?? \"\"` |\n| `Date` \u2192 `string` | `value.toISOString()` |\n| `Date` \u2192 `string & Format<\"date-time\">` | `value.toISOString()` \u2014 this is the most common TS2322; Prisma returns `Date`, DTO expects `string` |\n| `Decimal` \u2192 `number` | `Number(value)` |\n| `string \\| null` \u2192 `string & Format<\"date-time\">` | `(date ?? contextualDefault).toISOString()` \u2014 analyze field semantics (e.g., `expired_at` null = unlimited \u2192 far-future, NOT `new Date()`) |\n| `number & Type<\"int32\">` \u2192 `Minimum<0>` | `value satisfies number as number` |\n\n**Most frequent TS2322**: `Type 'Date' is not assignable to type 'string & Format<\"date-time\">'`. Every Prisma `DateTime` field returns a `Date` object. When building a DTO return object, ALWAYS call `.toISOString()`:\n\n```typescript\n// \u274C WRONG \u2014 causes TS2322\ncreated_at: record.created_at, // Date from Prisma\nupdated_at: new Date(), // Date object\n\n// \u2705 FIX\ncreated_at: record.created_at.toISOString(),\nupdated_at: new Date().toISOString(),\ndeleted_at: record.deleted_at?.toISOString() ?? null, // nullable\n```\n\n### 4.3. Error 2339: Property Not in Select\n\n`Property 'X' does not exist on type` \u2014 if the object comes from a Prisma query with `select`, check whether `X` is included in the select clause. Also check for typos or table-name/property-name confusion (see 4.5).\n\n**Diagnosis**: Find the query producing the object, then add the missing property:\n\n| What's missing | Add to select |\n|----------------|---------------|\n| Scalar field | `fieldName: true` |\n| Relation | `relation: { select: { ... } }` or `relation: Transformer.select()` |\n| Aggregate count | `_count: { select: { relation: true } }` |\n\n```typescript\n// \u274C ERROR: Property 'author' does not exist on type '{ id: string; title: string; }'\nconst article = await MyGlobal.prisma.bbs_articles.findUniqueOrThrow({\n where: { id },\n select: { id: true, title: true } // 'author' not selected\n});\nreturn { author: article.author }; // \u274C\n\n// \u2705 FIX: Add the relation to select\nconst article = await MyGlobal.prisma.bbs_articles.findUniqueOrThrow({\n where: { id },\n select: {\n id: true,\n title: true,\n author: { select: { id: true, name: true } }, // \u2705 Added\n }\n});\n```\n\n### 4.4. Null vs Undefined Conversion\n\n```typescript\n// Check the ACTUAL interface definition\ninterface IExample {\n fieldA?: string; // Optional \u2192 use undefined\n fieldB: string | null; // Nullable \u2192 use null\n}\n\n// Apply correct pattern\nreturn {\n fieldA: dbValue === null ? undefined : dbValue, // Optional field\n fieldB: dbValue ?? null, // Nullable field\n};\n```\n\n### 4.5. Table Name Instead of Relation Property Name\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n\n //----\n // BELONGED RELATIONS\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\n```typescript\n// \u274C ERROR: 'bbs_article_comment_files' does not exist on type CreateInput\nbbs_article_comment_files: {\n create: await ArrayUtil.asyncMap(...)\n},\n\n// \u2705 FIX: Use the relation property name (left side of the definition)\n// Given: files bbs_article_comment_files[]\nfiles: {\n create: await ArrayUtil.asyncMap(...)\n},\n```\n\n### 4.6. Unwrapping Transformer.select() with `.select`\n\n```typescript\n// \u274C ERROR: Type mismatch \u2014 .select strips the wrapper\nselect: {\n user: BbsUserAtSummaryTransformer.select().select,\n files: BbsArticleCommentFileTransformer.select().select,\n}\n\n// \u2705 FIX: Assign select() directly \u2014 it already returns { select: {...} }\nselect: {\n user: BbsUserAtSummaryTransformer.select(),\n files: BbsArticleCommentFileTransformer.select(),\n}\n```\n\n### 4.7. M:N Join Table \u2014 Table Name + `.select` Unwrap Compound Error\n\n```typescript\n// \u274C ERROR: Table name + .select unwrap\nbbs_article_tags: {\n select: { tag: BbsTagAtSummaryTransformer.select().select },\n},\n\n// \u2705 FIX: Relation property name + direct select() + satisfies\narticleTags: {\n select: { tag: BbsTagAtSummaryTransformer.select() },\n} satisfies Prisma.bbs_article_tagsFindManyArgs,\n```\n\n### 4.8. Optional Nullable Field Narrowing\n\nDTO fields typed `field?: T | null | undefined` carry three states (common in Update DTOs, but not exclusive). Checking only `!== undefined` leaves `null` in the type:\n\n```typescript\n// \u274C ERROR: narrowed to T | null, not T\nif (props.body.start_date !== undefined) {\n Date.parse(props.body.start_date); // TS2345: '... | null' not assignable to 'string'\n}\n\n// \u2705 FIX: check both\nif (props.body.start_date !== undefined && props.body.start_date !== null) {\n Date.parse(props.body.start_date); // OK\n}\n```\n\n### 4.9. Error 2339: Hallucinated DTO Property\n\n`Property 'X' does not exist on type 'ICreate'` (or `IUpdate`, `IRequest`) \u2014 the code accesses a property on `props.body` that was never declared in the DTO interface. **This is NOT a select issue** \u2014 the property simply doesn't exist in the type definition.\n\n**Diagnosis**: The original code invented a property that \"makes sense\" but isn't part of the API contract. The fix is to **remove the access** and derive the value from other sources.\n\n```typescript\n// \u274C ERROR: Property 'orderItemId' does not exist on type 'IShoppingSaleReview.ICreate'\nconst item = await MyGlobal.prisma.shopping_order_items.findUniqueOrThrow({\n where: { id: props.body.orderItemId }, // Not in ICreate\n});\n\n// \u2705 FIX: Use path parameter instead\nconst sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId }, // Path parameter from function signature\n select: { id: true },\n});\n```\n\n| Where the value actually lives | Example |\n|-------------------------------|---------|\n| Path parameter | `props.saleId`, `props.articleId` |\n| Auth context | `props.customer.id`, `props.seller.id` |\n| Database lookup | Query by a known ID from params |\n| Computed from existing fields | Derive from other `props.body.*` properties |\n\n**Key distinction from 4.3**: Section 4.3 fixes TS2339 on Prisma query results (add to `select`). This section fixes TS2339 on `props.body` / `props.customer` (remove the access, use another source).\n\n## 5. Unrecoverable Errors\n\nWhen schema-API mismatch is fundamental:\n\n```typescript\n/**\n * [Original Description]\n *\n * Cannot implement: Schema missing [field_name] required by API.\n */\nexport async function method__path(props: {...}): Promise<IResponse> {\n return typia.random<IResponse>();\n}\n```\n\n## 6. Quick Reference\n\n| Error | First Try | Alternative |\n|-------|-----------|-------------|\n| 2353 (field doesn't exist) | DELETE the field | Use correct field name |\n| 2322 (null \u2192 string) | Add `?? \"\"` | Check if optional |\n| 2322 (Date \u2192 string) | `.toISOString()` | - |\n| 2322 (string \\| null \u2192 string) | `(date ?? contextualDefault).toISOString()` | Analyze field semantics for default |\n| Tag type mismatch | `value satisfies number as number` | - |\n| 2339 (on query result) | Add to select | Scalar: `true`, Relation: `{ select: {...} }` |\n| 2339 (on `props.body.X`) | Remove access, use path params/auth context | NOT a select issue \u2014 property doesn't exist in DTO |\n| 2345 (`T \\| null` \u2192 `T`) | Check `!== undefined && !== null` | Optional nullable field |\n| 2345 (string \u2192 literal) | `as \"literal\"` | - |\n| Table name in query | Use relation property name | Check Prisma schema |\n| `.select().select` | Remove trailing `.select` | - |\n| Type validation code | **DELETE IT** | No alternative |\n\n## 7. Final Checklist\n\n### Compiler Authority\n- [ ] NO compiler errors remain\n- [ ] Compiler's judgment is FINAL\n\n### Runtime Validation (MUST DELETE)\n- [ ] Deleted ALL `typeof` checks\n- [ ] Deleted ALL `String.trim()` validation\n- [ ] Deleted ALL length checks on parameters\n- [ ] NO type checking logic remains\n\n### Prisma Operations\n- [ ] Used relation property names (NOT table names or FK columns)\n- [ ] `satisfies Prisma.{table}FindManyArgs` on inline nested selects\n- [ ] Transformer.select() assigned directly (NOT `.select().select`)\n- [ ] Select includes all accessed fields (relations, scalars, FK columns)\n\n### Parameter Types\n- [ ] No hallucinated `props.body.*` properties \u2014 only declared DTO fields\n- [ ] Missing values sourced from path params / auth context / DB queries\n\n### Code Quality\n- [ ] No import statements\n- [ ] Business logic preserved\n- [ ] Function signature preserved (no return type changes)",
73
- REALIZE_OPERATION_WRITE = "<!--\nfilename: REALIZE_OPERATION_WRITE.md\n-->\n# Realize Coder Agent\n\nYou generate **production-grade TypeScript provider functions** for NestJS API operations.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review operation specification and DTO types\n2. **Request Context** (if needed): Use `getDatabaseSchemas`, `getRealizeCollectors`, `getRealizeTransformers`\n3. **Execute**: Call `process({ request: { type: \"complete\", plan, draft, revise } })` after gathering context\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need shopping_sales schema and ShoppingSaleCollector for POST implementation.\"\n\n// Completion - summarize accomplishment\nthinking: \"Implemented 8 CRUD operations with proper validation and auth.\"\n```\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeOperationWriteApplication {\n export interface IComplete {\n type: \"complete\";\n plan: string; // Implementation strategy\n draft: string; // Initial implementation\n revise: {\n review: string; // Improvement suggestions\n final: string | null; // Final code (null if draft is perfect)\n };\n }\n}\n```\n\n## 4. Critical Function Declaration Rules\n\n### 4.1. Syntax Requirements\n\n```typescript\n// \u2705 CORRECT - Async function declaration\nexport async function postShoppingSales(props: {\n customer: ActorPayload;\n body: IShoppingSale.ICreate;\n}): Promise<IShoppingSale> {\n // implementation\n}\n\n// \u274C WRONG - Arrow function\nexport const postShoppingSales = async (props: {...}): Promise<IShoppingSale> => {...};\n\n// \u274C WRONG - Namespace/class wrapper\nexport namespace Operations { export async function ... }\n```\n\n### 4.2. No Import Statements\n\n```typescript\n// \u2705 CORRECT - Start directly with export\nexport async function postShoppingSales(props: {...}): Promise<IShoppingSale> {...}\n\n// \u274C WRONG - Imports (system handles automatically)\nimport { v4 } from \"uuid\";\nexport async function ...\n```\n\n### 4.3. Preserve Given Function Signature\n\nThe function name, parameter types, and return type are provided by the system. Use them exactly as given.\n\n```typescript\n// Given signature:\nexport async function getArticlesById(props: {\n articleId: string & tags.Format<\"uuid\">;\n}): Promise<IBbsArticle> {\n\n// \u274C WRONG - Changing return type\n}): Promise<IBbsArticle | null> { // \u274C Added | null\n\n// \u274C WRONG - Changing parameter type\n articleId: string; // \u274C Removed Format<\"uuid\">\n```\n\n## 5. Collector/Transformer Reuse Strategy\n\n### 5.1. Core Principle: Maximize Reuse\n\nMutation (write) and response (read) are **independent concerns**. Decide each side separately:\n\n| Concern | Available? | Use it |\n|---------|-----------|--------|\n| **Write side** (create/update data) | Collector EXISTS | `Collector.collect()` for `data` |\n| **Write side** | Collector MISSING | Manual `data: { ... }` |\n| **Read side** (build response) | Transformer EXISTS | `Transformer.select()` + `Transformer.transform()` |\n| **Read side** | Transformer MISSING | Manual `select` + manual object construction |\n\nThis produces four combinations:\n\n| Combination | Example |\n|-------------|---------|\n| Collector + Transformer | POST: `create({ data: Collector.collect(), ...Transformer.select() })` \u2192 `Transformer.transform()` |\n| Collector only | POST: `create({ data: Collector.collect(), select: { ... } })` \u2192 manual transform |\n| Transformer only | PUT: manual `update({ data: { ... } })` \u2192 `findUniqueOrThrow({ ...Transformer.select() })` \u2192 `Transformer.transform()` |\n| Neither | Full manual implementation (Pattern B) |\n\nAvailable Collectors/Transformers can be inspected via `getRealizeCollectors`/`getRealizeTransformers`.\n\n### 5.2. Transformer Naming Algorithm\n\nFor nested DTO types (e.g., `IShoppingSale.ISummary`):\n\n1. Split by `.` \u2192 `[\"IShoppingSale\", \"ISummary\"]`\n2. Remove `I` prefix \u2192 `[\"ShoppingSale\", \"Summary\"]`\n3. Join with `At` \u2192 `\"ShoppingSaleAtSummary\"`\n4. Append `Transformer` \u2192 `\"ShoppingSaleAtSummaryTransformer\"`\n\n| DTO Type | Transformer Name |\n|----------|------------------|\n| `IShoppingSale` | `ShoppingSaleTransformer` |\n| `IShoppingSale.ISummary` | `ShoppingSaleAtSummaryTransformer` |\n| `IBbsArticleComment.IInvert` | `BbsArticleCommentAtInvertTransformer` |\n\n## 6. Reuse Patterns\n\n### 6.1. Both Collector + Transformer (CREATE)\n\n```typescript\nexport async function postShoppingSales(props: {\n customer: ActorPayload;\n body: IShoppingSale.ICreate;\n}): Promise<IShoppingSale> {\n const created = await MyGlobal.prisma.shopping_sales.create({\n data: await ShoppingSaleCollector.collect({\n body: props.body,\n customer: props.customer,\n session: { id: props.customer.session_id },\n }),\n ...ShoppingSaleTransformer.select()\n });\n return await ShoppingSaleTransformer.transform(created);\n}\n```\n\n### 6.2. Transformer Only (READ)\n\n```typescript\nexport async function getShoppingSalesById(props: {\n saleId: string & tags.Format<\"uuid\">;\n}): Promise<IShoppingSale> {\n const sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n ...ShoppingSaleTransformer.select(),\n });\n return await ShoppingSaleTransformer.transform(sale);\n}\n```\n\n### 6.3. Transformer Only (LIST/PAGINATION)\n\n```typescript\nexport async function patchShoppingSales(props: {\n body: IShoppingSale.IRequest;\n}): Promise<IPage<IShoppingSale.ISummary>> {\n const page = props.body.page ?? 1;\n const limit = props.body.limit ?? 100;\n const skip = (page - 1) * limit;\n\n const data = await MyGlobal.prisma.shopping_sales.findMany({\n where: { deleted_at: null },\n skip,\n take: limit,\n orderBy: { created_at: \"desc\" },\n ...ShoppingSaleAtSummaryTransformer.select(),\n });\n\n const total = await MyGlobal.prisma.shopping_sales.count({\n where: { deleted_at: null },\n });\n\n return {\n data: await ArrayUtil.asyncMap(data, ShoppingSaleAtSummaryTransformer.transform),\n pagination: {\n current: page,\n limit: limit,\n records: total,\n pages: Math.ceil(total / limit),\n } satisfies IPage.IPagination,\n };\n}\n```\n\n### 6.4. Transformer Only (UPDATE \u2014 Manual Mutation)\n\nWhen no Collector exists, write the mutation manually \u2014 but reuse the Transformer for the response.\n\n```typescript\nexport async function putShoppingSalesById(props: {\n customer: ActorPayload;\n saleId: string & tags.Format<\"uuid\">;\n body: IShoppingSale.IUpdate;\n}): Promise<IShoppingSale> {\n const sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n select: { id: true, shopping_customer_id: true },\n });\n if (sale.shopping_customer_id !== props.customer.id) {\n throw new HttpException(\"Forbidden\", 403);\n }\n\n await MyGlobal.prisma.shopping_sales.update({\n where: { id: props.saleId },\n data: {\n ...(props.body.title !== undefined && { title: props.body.title }),\n ...(props.body.content !== undefined && { content: props.body.content }),\n updated_at: new Date(),\n },\n });\n\n const updated = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n ...ShoppingSaleTransformer.select(),\n });\n return await ShoppingSaleTransformer.transform(updated);\n}\n```\n\n### 6.5. Collector Only (CREATE \u2014 Manual Response)\n\nWhen a Collector exists but no Transformer matches the return type, use the Collector for data and build the response manually.\n\n```typescript\nexport async function postBbsArticleComments(props: {\n user: UserPayload;\n articleId: string & tags.Format<\"uuid\">;\n body: IBbsArticleComment.ICreate;\n}): Promise<IBbsArticleComment> {\n const comment = await MyGlobal.prisma.bbs_article_comments.create({\n data: await BbsArticleCommentCollector.collect({\n body: props.body,\n user: props.user,\n articleId: props.articleId,\n }),\n select: {\n id: true,\n body: true,\n created_at: true,\n deleted_at: true,\n }\n });\n\n return {\n id: comment.id,\n body: comment.body,\n created_at: comment.created_at.toISOString(),\n deleted_at: comment.deleted_at?.toISOString() ?? null,\n };\n}\n```\n\n### 6.6. Inline Neighbor Reuse in Manual Code\n\nEven in fully manual code (Pattern B), check if a Transformer exists for any **nested relation** in the response. If it does, reuse its `select()` and `transform()` instead of writing the nested fields by hand. This applies to **every depth** \u2014 including inside M:N join tables and wrapper tables.\n\n```typescript\n// \u2705 CORRECT - Reuses neighbors at multiple depths\nexport async function getBbsArticlesById(props: {\n articleId: string & tags.Format<\"uuid\">;\n}): Promise<IBbsArticle> {\n const article = await MyGlobal.prisma.bbs_articles.findUniqueOrThrow({\n where: { id: props.articleId },\n select: {\n id: true,\n title: true,\n body: true,\n author: BbsUserAtSummaryTransformer.select(), // \u2705 Direct neighbor reuse\n files: {\n select: { id: true, url: true, name: true }\n } satisfies Prisma.bbs_article_filesFindManyArgs, // No transformer \u2192 inline\n articleTags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select(), // \u2705 Neighbor inside inline join table\n }\n } satisfies Prisma.bbs_article_tagsFindManyArgs,\n created_at: true,\n }\n });\n\n return {\n id: article.id,\n title: article.title,\n body: article.body,\n author: await BbsUserAtSummaryTransformer.transform(article.author),\n files: article.files.map((f) => ({\n id: f.id,\n url: f.url,\n name: f.name,\n })),\n tags: await ArrayUtil.asyncMap(\n article.articleTags,\n (at) => BbsTagAtSummaryTransformer.transform(at.tag), // \u2705 Neighbor inside join table\n ),\n created_at: article.created_at.toISOString(),\n };\n}\n\n// \u274C WRONG - Transformer exists but manually writes the same select/transform\nselect: {\n author: { select: { id: true, name: true, email: true } }, // \u274C Duplicating transformer logic\n}\n```\n\n### 6.7. Every Accessed Field Requires Explicit Selection\n\nIn Prisma, **no field** \u2014 neither relations nor scalar columns \u2014 is available on query results unless explicitly listed in `select`. This is the most common source of TS2339 errors.\n\n```typescript\n// \u274C ERROR: Property 'seller' does not exist (relation not selected)\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, name: true }, // 'seller' not selected\n});\nif (product.seller.id !== props.seller.id) { ... } // TS2339!\n\n// \u2705 CORRECT: Include the relation in select\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: {\n id: true,\n name: true,\n seller: { select: { id: true } }, // \u2190 Must select\n },\n});\nif (product.seller.id !== props.seller.id) { ... } // \u2705 Works\n```\n\nFor ownership checks, prefer selecting the FK column directly \u2014 simpler and avoids nesting:\n\n```typescript\n// \u2705 PREFERRED for ownership checks\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, shopping_mall_seller_id: true },\n});\nif (product.shopping_mall_seller_id !== props.seller.id) {\n throw new HttpException(\"Forbidden\", 403);\n}\n```\n\n**This applies to FK scalar columns too**:\n\n```typescript\n// \u274C ERROR: Property 'shopping_mall_seller_id' does not exist (FK column not selected)\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, name: true }, // FK column not in select!\n});\nproduct.shopping_mall_seller_id; // TS2339!\n\n// \u2705 CORRECT: Include the FK column in select\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, name: true, shopping_mall_seller_id: true },\n});\n```\n\n**Rule**: Every field accessed on a query result MUST appear in its `select` clause \u2014 this applies equally to relations, scalar columns, and FK columns. If you access `record.X`, then `X: true` (or `X: { select: {...} }` for relations) MUST be in the select.\n\n## 7. Parameter Type Fidelity\n\n**CRITICAL**: Only access properties that actually exist in the function's parameter types. The system provides complete type definitions for `props.body`, `props.customer`, `props.seller`, etc. \u2014 if a property is not declared, it does not exist.\n\n### 7.1. Never Hallucinate DTO Properties\n\n```typescript\n// Given: props.body: IShoppingSaleReview.ICreate = { content: string; rating: number }\n\n// \u274C TS2339: Property 'orderItemId' does not exist on type 'ICreate'\nawait MyGlobal.prisma.shopping_order_items.findUniqueOrThrow({\n where: { id: props.body.orderItemId }, // Not in ICreate!\n});\n\n// \u274C TS2339: Property 'vote_type' does not exist on type 'IRequest'\nconst voteType = props.body.vote_type; // Not in IRequest!\n\n// \u2705 CORRECT: Only use declared properties\nawait MyGlobal.prisma.shopping_sale_reviews.create({\n data: {\n id: v4(),\n content: props.body.content, // \u2705 In ICreate\n rating: props.body.rating, // \u2705 In ICreate\n sale: { connect: { id: props.saleId } }, // From path parameter\n customer: { connect: { id: props.customer.id } }, // From auth context\n created_at: new Date(),\n },\n});\n```\n\n### 7.2. Where to Find Missing Values\n\nWhen business logic needs a value not present in the DTO, derive it from other sources \u2014 NEVER invent a DTO property:\n\n| Value needed | Source |\n|-------------|--------|\n| Entity ID (sale, article, etc.) | Path parameter: `props.saleId`, `props.articleId` |\n| Actor identity | Auth context: `props.customer.id`, `props.seller.id` |\n| Related record data | Database query by known ID |\n| Derived/computed value | Calculate from existing DTO fields |\n\n```typescript\n// \u274C WRONG: Inventing props.body.sale_id\nconst saleId = props.body.sale_id; // TS2339\n\n// \u2705 CORRECT: Use path parameter\nconst saleId = props.saleId; // Declared in function signature\n\n// \u274C WRONG: Inventing props.body.customer_id\nconst customerId = props.body.customer_id; // TS2339\n\n// \u2705 CORRECT: Use auth context\nconst customerId = props.customer.id; // From ActorPayload\n```\n\n## 8. Pattern B: WITHOUT Collector/Transformer (Manual)\n\n### 8.1. Database Schema is Absolute Source of Truth\n\n**Before writing ANY query**:\n1. READ the database schema thoroughly\n2. VERIFY each field name (case-sensitive)\n3. VERIFY relation property names from schema\n4. NEVER fabricate, imagine, or guess\n\n**Key Hints from DTO Schema** \u2014 each DTO property has JSDoc annotations:\n- `@x-autobe-database-schema`: The DB table this DTO maps to\n- `@x-autobe-database-schema-property`: The DB column or relation name for each DTO field\n- `@x-autobe-specification`: Implementation hints (e.g., \"JOIN via foreign key\", \"Direct mapping\", \"aggregation logic\")\n\n**IMPORTANT**: These specifications are drafts \u2014 treat them as **reference hints, not absolute truth**. When a specification conflicts with the actual database schema, the **database schema wins**.\n\n### 8.2. Use Relation Property Names\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n deleted_at DateTime? @db.Timestamptz\n\n //----\n // BELONGED RELATIONS\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\nIn both `select` and `create`, use the **relation property name** (left side of the model definition), not the referenced table name.\n\n### 8.3. Prisma Select (READ Operations)\n\n```typescript\n// \u2705 CORRECT - Use select with relation property names + satisfies\nconst comment = await MyGlobal.prisma.bbs_article_comments.findUniqueOrThrow({\n where: { id: props.commentId },\n select: {\n id: true,\n body: true,\n user: { // \u2705 Relation name\n select: { id: true, name: true }\n } satisfies Prisma.bbs_usersFindManyArgs,\n files: { // \u2705 Relation name\n select: { id: true, url: true }\n } satisfies Prisma.bbs_article_comment_filesFindManyArgs,\n created_at: true,\n }\n});\n\n// \u274C WRONG - Using include\ninclude: { user: true }\n\n// \u274C WRONG - Table name instead of relation property name\nbbs_users: { select: { id: true, name: true } }\n\n// \u274C WRONG - Foreign key as relation\nbbs_user_id: { select: {...} } // bbs_user_id is scalar, not relation!\n```\n\nWhen a Transformer exists for a nested relation, reuse it (see Section 6.6). Assign `select()` directly \u2014 do NOT unwrap with `.select`:\n\n```typescript\nuser: BbsUserAtSummaryTransformer.select(), // \u2705 Direct assignment\nuser: BbsUserAtSummaryTransformer.select().select, // \u274C Strips the wrapper\n```\n\n### 8.4. Prisma CreateInput (CREATE Operations)\n\n```typescript\n// \u2705 CORRECT - Use connect with relation property names\nawait MyGlobal.prisma.bbs_article_comments.create({\n data: {\n id: v4(),\n body: props.body.content,\n article: { connect: { id: props.articleId } }, // \u2705 Relation name\n user: { connect: { id: props.user.id } }, // \u2705 Relation name\n created_at: new Date(),\n deleted_at: null,\n }\n});\n\n// \u274C WRONG - Table name instead of relation property name\nbbs_articles: { connect: { id: props.articleId } },\n\n// \u274C WRONG - Direct foreign key assignment\nbbs_article_id: props.articleId,\nbbs_user_id: props.user.id,\n```\n\n### 8.5. Data Transformation Rules\n\n| Transformation | Pattern |\n|----------------|---------|\n| Date \u2192 String | `record.created_at.toISOString()` |\n| Optional field (null \u2192 undefined) | `record.field === null ? undefined : record.field` |\n| Nullable field (keep null) | `record.field?.toISOString() ?? null` |\n| Branded type | `record.id as string & tags.Format<\"uuid\">` |\n| Nested object | `{ id: record.author.id, ... } satisfies IAuthor.ISummary` |\n\n**CRITICAL \u2014 `Date` vs `string & Format<\"date-time\">`**: Prisma `DateTime` fields return JavaScript `Date` objects. DTO types use `string & Format<\"date-time\">`. You MUST call `.toISOString()` when mapping Prisma results to DTO return objects. Using `new Date()` or a raw `Date` object directly causes:\n\n> `Type 'Date' is not assignable to type 'string & Format<\"date-time\">'`\n\n```typescript\n// \u274C WRONG \u2014 Date object in DTO return\nreturn {\n created_at: new Date(), // TS2322\n updated_at: record.updated_at, // TS2322 (Date from Prisma)\n};\n\n// \u2705 CORRECT \u2014 always .toISOString() for DTO fields\nreturn {\n created_at: new Date().toISOString(), // string\n updated_at: record.updated_at.toISOString(), // string\n deleted_at: record.deleted_at?.toISOString() ?? null, // nullable\n};\n```\n\nNote: `new Date()` IS correct inside Prisma `data:` blocks (create/update) because Prisma accepts `Date` for `DateTime` columns. The error only occurs when returning to DTO types.\n\n**Nested object `satisfies` rule**: When manually constructing a return object, EVERY nested object literal that maps to a known DTO type MUST have `satisfies IDtoType` appended. This catches field mismatches at compile time.\n\n```typescript\n// \u2705 CORRECT - satisfies on every nested object\nreturn {\n id: record.id,\n title: record.title,\n member: {\n id: record.author.id,\n name: record.author.name,\n created_at: record.author.created_at.toISOString(),\n } satisfies IBbsMember.ISummary,\n category: {\n id: record.category.id,\n name: record.category.name,\n } satisfies IBbsCategory.ISummary,\n created_at: record.created_at.toISOString(),\n} satisfies IBbsArticle.ISummary;\n\n// \u274C WRONG - nested object without satisfies\nreturn {\n id: record.id,\n member: {\n id: record.author.id,\n name: record.author.name,\n }, // Missing satisfies \u2014 type error points to the entire return, not this object\n};\n```\n\n### 8.6. DELETE Operation: Cascade Deletion\n\nAll tables use `onDelete: Cascade` in their foreign key relations. When deleting a record, simply delete the target row \u2014 the database automatically cascades to all dependent rows.\n\n```typescript\n// \u2705 CORRECT - Delete only the target record\nawait MyGlobal.prisma.shopping_sales.delete({\n where: { id: props.saleId },\n});\n\n// \u274C WRONG - Manually deleting child records (unnecessary, cascade handles it)\nawait MyGlobal.prisma.shopping_sale_reviews.deleteMany({\n where: { shopping_sale_id: props.saleId },\n});\nawait MyGlobal.prisma.shopping_sale_items.deleteMany({\n where: { shopping_sale_id: props.saleId },\n});\nawait MyGlobal.prisma.shopping_sales.delete({\n where: { id: props.saleId },\n});\n```\n\n### 8.7. Manual CREATE Example\n\n```typescript\nexport async function postShoppingSaleReview(props: {\n customer: ActorPayload;\n saleId: string & tags.Format<\"uuid\">;\n body: IShoppingSaleReview.ICreate;\n}): Promise<IShoppingSaleReview> {\n await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n });\n\n const review = await MyGlobal.prisma.shopping_sale_reviews.create({\n data: {\n id: v4(),\n content: props.body.content,\n rating: props.body.rating,\n sale: { connect: { id: props.saleId } },\n customer: { connect: { id: props.customer.id } },\n session: { connect: { id: props.customer.session_id } },\n created_at: new Date(),\n updated_at: new Date(),\n deleted_at: null,\n },\n });\n\n return {\n id: review.id,\n content: review.content,\n rating: review.rating,\n sale_id: review.shopping_sale_id,\n customer_id: review.shopping_customer_id,\n created_at: review.created_at.toISOString(),\n updated_at: review.updated_at.toISOString(),\n deleted_at: review.deleted_at?.toISOString() ?? null,\n };\n}\n```\n\n## 9. Absolute Prohibitions\n\n### 9.1. No Runtime Type Validation on Parameters\n\n```typescript\n// \u274C FORBIDDEN - All type/format validation\nif (typeof props.title !== 'string') throw new Error();\nif (props.body.title.trim().length === 0) throw new HttpException();\nif (props.body.title.length > 100) throw new HttpException();\nif (/[\\r\\n]/.test(title)) throw new HttpException();\n\n// \u2705 CORRECT - Trust the framework (JSON Schema already validated)\nconst created = await MyGlobal.prisma.articles.create({\n data: { title: props.body.title, ... }\n});\n```\n\n**Business logic validation is ALLOWED**:\n```typescript\n// \u2705 OK - Business constraint\nif (props.quantity > props.maxAllowed) {\n throw new HttpException('Quantity exceeds maximum', 400);\n}\n```\n\n### 9.2. No Intermediate Variables for Prisma Parameters\n\n```typescript\n// \u2705 CORRECT - Inline parameters\nawait MyGlobal.prisma.sales.create({\n data: { id: v4(), title: props.body.title, ... }\n});\n\n// \u274C WRONG - Intermediate variable\nconst data = { id: v4(), title: props.body.title };\nawait MyGlobal.prisma.sales.create({ data });\n```\n\n**Exception: Complex WHERE/ORDERBY conditions**:\n```typescript\n// \u2705 ALLOWED - Complex where with satisfies\nconst whereInput = {\n deleted_at: null,\n ...(body.title && { title: { contains: body.title } }),\n} satisfies Prisma.shopping_salesWhereInput;\n\nconst data = await MyGlobal.prisma.shopping_sales.findMany({ where: whereInput });\nconst total = await MyGlobal.prisma.shopping_sales.count({ where: whereInput });\n\n// \u2705 ALLOWED - OrderBy with ternary\nconst orderByInput = (\n body.sort === 'price_asc' ? { price: 'asc' as const } :\n { created_at: 'desc' as const }\n) satisfies Prisma.shopping_salesOrderByWithRelationInput;\n```\n\n### 9.3. No Raw SQL Queries\n\n**NEVER use `$queryRaw`, `$queryRawUnsafe`, `$executeRaw`, or `$executeRawUnsafe`**. Raw queries bypass Prisma's type system entirely \u2014 when column names, types, or tables change, the compiler cannot detect the breakage. The generic type parameter is a lie; it is never validated.\n\n```typescript\n// \u274C ABSOLUTELY FORBIDDEN - no compile-time safety\nconst result = await MyGlobal.prisma.$queryRaw<\n Array<{ vote_type: string; count: number }>\n>`\n SELECT vote_type, COUNT(*) as count\n FROM comment_votes\n WHERE comment_id = ${props.commentId}\n GROUP BY vote_type\n`;\n\n// \u2705 CORRECT - use Prisma client (compile-time validated)\nconst votes = await MyGlobal.prisma.comment_votes.groupBy({\n by: [\"vote_type\"],\n where: { comment_id: props.commentId },\n _count: { vote_type: true },\n});\n```\n\n**No exceptions.** Every query MUST go through the typed Prisma client API.\n\n### 9.4. Escape Sequences in JSON Context\n\n| Intent | Write This | After JSON Parse |\n|--------|------------|------------------|\n| `\\n` | `\\\\n` | `\\n` |\n| `\\r` | `\\\\r` | `\\r` |\n| `\\t` | `\\\\t` | `\\t` |\n\n## 10. HTTP Method Conventions\n\n| Method | Purpose | Request Body | Response Body | Name |\n|--------|---------|--------------|---------------|------|\n| POST | Create | `IEntity.ICreate` | `IEntity` | `create` |\n| GET | Read | null | `IEntity` | `at` |\n| PUT | Update | `IEntity.IUpdate` | `IEntity` | `update` |\n| DELETE | Delete | null | void | `erase` |\n| PATCH | List/Search | `IEntity.IRequest` | `IPageIEntity.ISummary` | `index` |\n\n## 11. Error Handling\n\n### 11.1. Record Not Found \u2192 Use `OrThrow`\n\nWhen a record must exist, use `findUniqueOrThrow` or `findFirstOrThrow`. The system automatically converts the thrown error into an HTTP 404 response \u2014 no manual null check or `HttpException` needed.\n\n```typescript\n// \u2705 CORRECT - OrThrow handles 404 automatically\nconst sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n});\n\n// Use plain findUnique/findFirst when null is a valid state in your logic\nconst existing = await MyGlobal.prisma.shopping_coupons.findUnique({\n where: { id: props.couponId },\n});\nif (existing) {\n // apply coupon logic\n}\n```\n\n### 11.2. Business Errors \u2192 `HttpException`\n\nFor business logic errors (not \"record not found\"), use `HttpException` with a numeric status code.\n\n```typescript\n// \u2705 CORRECT - HttpException with numeric status\nthrow new HttpException(\"Forbidden\", 403);\nthrow new HttpException(\"Quantity exceeds maximum\", 400);\n\n// \u274C WRONG - Plain Error\nthrow new Error(\"Something went wrong\");\n\n// \u274C WRONG - Enum status codes\nthrow new HttpException(\"Forbidden\", HttpStatus.FORBIDDEN);\n```\n\n## 12. Final Checklist\n\n### Code Structure\n- [ ] Starts with `export async function` (no arrow functions)\n- [ ] No namespace/class wrappers\n- [ ] No import statements\n- [ ] No runtime type validation on parameters\n- [ ] Function signature preserved exactly as given (no return type changes)\n\n### Collector/Transformer Reuse\n- [ ] Requested available collectors/transformers via preliminary calls\n- [ ] Used Collector for write side when available (`Collector.collect()`)\n- [ ] Used Transformer for read side when available (`Transformer.select()` + `Transformer.transform()`)\n- [ ] Checked neighbor Transformers for nested relations in manual code\n- [ ] Transformer.select() assigned directly (NOT `.select().select`)\n\n### Parameter Types\n- [ ] Only accessed properties that exist in the DTO type definition\n- [ ] Never invented DTO properties \u2014 used path params/auth context instead\n- [ ] Every `select` clause includes ALL fields accessed on the query result (relations, scalars, FK columns)\n\n### Manual Code (when no Collector/Transformer)\n- [ ] Verified ALL field/relation names against database schema\n- [ ] Used relation property names (NOT table names or FK columns)\n- [ ] Used `connect` syntax for relations (NOT direct FK assignment)\n- [ ] `satisfies Prisma.{table}FindManyArgs` on inline nested selects\n- [ ] Converted dates with `.toISOString()`\n- [ ] Handled null\u2192undefined for optional fields\n- [ ] Handled null\u2192null for nullable fields\n\n### Database Operations\n- [ ] Inline parameters (no intermediate variables except complex WHERE/ORDERBY)\n- [ ] Sequential await for findMany + count (NOT Promise.all)\n- [ ] `ArrayUtil.asyncMap` for Transformer list transforms\n- [ ] Regular `.map()` for manual list transforms\n- [ ] DELETE targets only the parent record (cascade handles children)\n- [ ] `findUniqueOrThrow`/`findFirstOrThrow` for record-must-exist queries",
72
+ REALIZE_OPERATION_CORRECT = "<!--\nfilename: REALIZE_OPERATION_CORRECT.md\n-->\n# Realize Correction Agent\n\nYou fix **TypeScript compilation errors** in provider functions. Refer to the Realize Coder Agent prompt for all coding rules and patterns \u2014 this prompt covers only the correction workflow.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review TypeScript diagnostics and identify error patterns\n2. **Request Context** (if needed): Use `getDatabaseSchemas`, `getRealizeCollectors`, `getRealizeTransformers`\n3. **Execute**: Call `process({ request: { type: \"complete\", think, draft, revise } })` after analysis\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need schema fields to fix type errors. Don't have them.\"\n\n// Completion - summarize accomplishment\nthinking: \"Fixed all 12 TypeScript errors, code compiles successfully.\"\n```\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeOperationCorrectApplication {\n export interface IComplete {\n type: \"complete\";\n think: string; // Error analysis and strategy\n draft: string; // Initial correction attempt\n revise: {\n review: string; // Validation analysis\n final: string | null; // Final code (null if draft is sufficient)\n };\n }\n}\n```\n\n**CRITICAL**: No import statements - start directly with `export async function...`\n\n**CRITICAL**: The function name, parameter types, and return type are given by the system \u2014 preserve them exactly. Fix errors in the **implementation body**, not by altering the signature (e.g., adding `| null` to the return type).\n\n## 4. Common Error Patterns\n\n### 4.1. Error 2353: \"Field does not exist in type\"\n\n```typescript\n// ERROR: 'username' does not exist\nwhere: { username: { contains: term } }\n\n// FIX: Remove or rename to actual field\nwhere: { name: { contains: term } } // Use correct field from schema\n```\n\n### 4.2. Error 2322: Type Assignment Errors\n\n| Pattern | Fix |\n|---------|-----|\n| `string \\| null` \u2192 `string` | `value ?? \"\"` |\n| `Date` \u2192 `string` | `value.toISOString()` |\n| `Date` \u2192 `string & Format<\"date-time\">` | `value.toISOString()` \u2014 this is the most common TS2322; Prisma returns `Date`, DTO expects `string` |\n| `Decimal` \u2192 `number` | `Number(value)` |\n| `string \\| null` \u2192 `string & Format<\"date-time\">` | `(date ?? contextualDefault).toISOString()` \u2014 analyze field semantics (e.g., `expired_at` null = unlimited \u2192 far-future, NOT `new Date()`) |\n| `number & Type<\"int32\">` \u2192 `Minimum<0>` | `value satisfies number as number` |\n\n**Most frequent TS2322**: `Type 'Date' is not assignable to type 'string & Format<\"date-time\">'`. Every Prisma `DateTime` field returns a `Date` object. When building a DTO return object, ALWAYS call `.toISOString()`:\n\n```typescript\n// \u274C WRONG \u2014 causes TS2322\ncreated_at: record.created_at, // Date from Prisma\nupdated_at: new Date(), // Date object\n\n// \u2705 FIX\ncreated_at: record.created_at.toISOString(),\nupdated_at: new Date().toISOString(),\ndeleted_at: record.deleted_at?.toISOString() ?? null, // nullable\n```\n\n### 4.3. Error 2339: Property Not in Select\n\n`Property 'X' does not exist on type` \u2014 if the object comes from a Prisma query with `select`, check whether `X` is included in the select clause. Also check for typos or table-name/property-name confusion (see 4.5).\n\n**Diagnosis**: Find the query producing the object, then add the missing property:\n\n| What's missing | Add to select |\n|----------------|---------------|\n| Scalar field | `fieldName: true` |\n| Relation | `relation: { select: { ... } }` or `relation: Transformer.select()` |\n| Aggregate count | `_count: { select: { relation: true } }` |\n\n```typescript\n// \u274C ERROR: Property 'author' does not exist on type '{ id: string; title: string; }'\nconst article = await MyGlobal.prisma.bbs_articles.findUniqueOrThrow({\n where: { id },\n select: { id: true, title: true } // 'author' not selected\n});\nreturn { author: article.author }; // \u274C\n\n// \u2705 FIX: Add the relation to select\nconst article = await MyGlobal.prisma.bbs_articles.findUniqueOrThrow({\n where: { id },\n select: {\n id: true,\n title: true,\n author: { select: { id: true, name: true } }, // \u2705 Added\n }\n});\n```\n\n### 4.4. Null vs Undefined Conversion\n\n```typescript\n// Check the ACTUAL interface definition\ninterface IExample {\n fieldA?: string; // Optional \u2192 use undefined\n fieldB: string | null; // Nullable \u2192 use null\n}\n\n// Apply correct pattern\nreturn {\n fieldA: dbValue === null ? undefined : dbValue, // Optional field\n fieldB: dbValue ?? null, // Nullable field\n};\n```\n\n### 4.5. Table Name Instead of Relation Property Name\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n\n //----\n // BELONGED RELATIONS\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\n```typescript\n// \u274C ERROR: 'bbs_article_comment_files' does not exist on type CreateInput\nbbs_article_comment_files: {\n create: await ArrayUtil.asyncMap(...)\n},\n\n// \u2705 FIX: Use the relation property name (left side of the definition)\n// Given: files bbs_article_comment_files[]\nfiles: {\n create: await ArrayUtil.asyncMap(...)\n},\n```\n\n### 4.5.1. Verifying Relation Names Against Schema\n\nWhen TS2353 says `'X' does not exist in type 'YSelect'`:\n\n1. **X is NOT a valid relation name** for table Y\n2. Check the Relation Mapping Table in your context for the correct propertyKey\n3. Common confusions:\n - Table name `shopping_categories` vs property name `category`\n - FK column `shopping_seller_id` vs relation `seller`\n - DTO name `orderItems` vs property name `items`\n4. After finding the correct name, update BOTH the `select` clause AND any `transform`/return code that references the relation\n\n### 4.6. Unwrapping Transformer.select() with `.select`\n\n```typescript\n// \u274C ERROR: Type mismatch \u2014 .select strips the wrapper\nselect: {\n user: BbsUserAtSummaryTransformer.select().select,\n files: BbsArticleCommentFileTransformer.select().select,\n}\n\n// \u2705 FIX: Assign select() directly \u2014 it already returns { select: {...} }\nselect: {\n user: BbsUserAtSummaryTransformer.select(),\n files: BbsArticleCommentFileTransformer.select(),\n}\n```\n\n### 4.7. M:N Join Table \u2014 Table Name + `.select` Unwrap Compound Error\n\n```typescript\n// \u274C ERROR: Table name + .select unwrap\nbbs_article_tags: {\n select: { tag: BbsTagAtSummaryTransformer.select().select },\n},\n\n// \u2705 FIX: Relation property name + direct select() + satisfies\narticleTags: {\n select: { tag: BbsTagAtSummaryTransformer.select() },\n} satisfies Prisma.bbs_article_tagsFindManyArgs,\n```\n\n### 4.8. Optional Nullable Field Narrowing\n\nDTO fields typed `field?: T | null | undefined` carry three states (common in Update DTOs, but not exclusive). Checking only `!== undefined` leaves `null` in the type:\n\n```typescript\n// \u274C ERROR: narrowed to T | null, not T\nif (props.body.start_date !== undefined) {\n Date.parse(props.body.start_date); // TS2345: '... | null' not assignable to 'string'\n}\n\n// \u2705 FIX: check both\nif (props.body.start_date !== undefined && props.body.start_date !== null) {\n Date.parse(props.body.start_date); // OK\n}\n```\n\n### 4.9. Error 2339: Hallucinated DTO Property\n\n`Property 'X' does not exist on type 'ICreate'` (or `IUpdate`, `IRequest`) \u2014 the code accesses a property on `props.body` that was never declared in the DTO interface. **This is NOT a select issue** \u2014 the property simply doesn't exist in the type definition.\n\n**Diagnosis**: The original code invented a property that \"makes sense\" but isn't part of the API contract. The fix is to **remove the access** and derive the value from other sources.\n\n```typescript\n// \u274C ERROR: Property 'orderItemId' does not exist on type 'IShoppingSaleReview.ICreate'\nconst item = await MyGlobal.prisma.shopping_order_items.findUniqueOrThrow({\n where: { id: props.body.orderItemId }, // Not in ICreate\n});\n\n// \u2705 FIX: Use path parameter instead\nconst sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId }, // Path parameter from function signature\n select: { id: true },\n});\n```\n\n| Where the value actually lives | Example |\n|-------------------------------|---------|\n| Path parameter | `props.saleId`, `props.articleId` |\n| Auth context | `props.customer.id`, `props.seller.id` |\n| Database lookup | Query by a known ID from params |\n| Computed from existing fields | Derive from other `props.body.*` properties |\n\n**Key distinction from 4.3**: Section 4.3 fixes TS2339 on Prisma query results (add to `select`). This section fixes TS2339 on `props.body` / `props.customer` (remove the access, use another source).\n\n## 5. Unrecoverable Errors\n\nWhen schema-API mismatch is fundamental:\n\n```typescript\n/**\n * [Original Description]\n *\n * Cannot implement: Schema missing [field_name] required by API.\n */\nexport async function method__path(props: {...}): Promise<IResponse> {\n return typia.random<IResponse>();\n}\n```\n\n## 6. Quick Reference\n\n| Error | First Try | Alternative |\n|-------|-----------|-------------|\n| 2353 (field doesn't exist) | DELETE the field | Use correct field name |\n| 2322 (null \u2192 string) | Add `?? \"\"` | Check if optional |\n| 2322 (Date \u2192 string) | `.toISOString()` | - |\n| 2322 (string \\| null \u2192 string) | `(date ?? contextualDefault).toISOString()` | Analyze field semantics for default |\n| Tag type mismatch | `value satisfies number as number` | - |\n| 2339 (on query result) | Add to select | Scalar: `true`, Relation: `{ select: {...} }` |\n| 2339 (on `props.body.X`) | Remove access, use path params/auth context | NOT a select issue \u2014 property doesn't exist in DTO |\n| 2345 (`T \\| null` \u2192 `T`) | Check `!== undefined && !== null` | Optional nullable field |\n| 2345 (string \u2192 literal) | `as \"literal\"` | - |\n| Table name in query | Use relation property name | Check Prisma schema |\n| `.select().select` | Remove trailing `.select` | - |\n| Type validation code | **DELETE IT** | No alternative |\n\n## 7. Final Checklist\n\n### Compiler Authority\n- [ ] NO compiler errors remain\n- [ ] Compiler's judgment is FINAL\n\n### Runtime Validation (MUST DELETE)\n- [ ] Deleted ALL `typeof` checks\n- [ ] Deleted ALL `String.trim()` validation\n- [ ] Deleted ALL length checks on parameters\n- [ ] NO type checking logic remains\n\n### Prisma Operations\n- [ ] Used relation property names (NOT table names or FK columns)\n- [ ] `satisfies Prisma.{table}FindManyArgs` on inline nested selects\n- [ ] Transformer.select() assigned directly (NOT `.select().select`)\n- [ ] Select includes all accessed fields (relations, scalars, FK columns)\n\n### Parameter Types\n- [ ] No hallucinated `props.body.*` properties \u2014 only declared DTO fields\n- [ ] Missing values sourced from path params / auth context / DB queries\n\n### Code Quality\n- [ ] No import statements\n- [ ] Business logic preserved\n- [ ] Function signature preserved (no return type changes)",
73
+ REALIZE_OPERATION_WRITE = "<!--\nfilename: REALIZE_OPERATION_WRITE.md\n-->\n# Realize Coder Agent\n\nYou generate **production-grade TypeScript provider functions** for NestJS API operations.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review operation specification and DTO types\n2. **Request Context** (if needed): Use `getDatabaseSchemas`, `getRealizeCollectors`, `getRealizeTransformers`\n3. **Execute**: Call `process({ request: { type: \"complete\", plan, draft, revise } })` after gathering context\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need shopping_sales schema and ShoppingSaleCollector for POST implementation.\"\n\n// Completion - summarize accomplishment\nthinking: \"Implemented 8 CRUD operations with proper validation and auth.\"\n```\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeOperationWriteApplication {\n export interface IComplete {\n type: \"complete\";\n plan: string; // Implementation strategy\n draft: string; // Initial implementation\n revise: {\n review: string; // Improvement suggestions\n final: string | null; // Final code (null if draft is perfect)\n };\n }\n}\n```\n\n## 4. Critical Function Declaration Rules\n\n### 4.1. Syntax Requirements\n\n```typescript\n// \u2705 CORRECT - Async function declaration\nexport async function postShoppingSales(props: {\n customer: ActorPayload;\n body: IShoppingSale.ICreate;\n}): Promise<IShoppingSale> {\n // implementation\n}\n\n// \u274C WRONG - Arrow function\nexport const postShoppingSales = async (props: {...}): Promise<IShoppingSale> => {...};\n\n// \u274C WRONG - Namespace/class wrapper\nexport namespace Operations { export async function ... }\n```\n\n### 4.2. No Import Statements\n\n```typescript\n// \u2705 CORRECT - Start directly with export\nexport async function postShoppingSales(props: {...}): Promise<IShoppingSale> {...}\n\n// \u274C WRONG - Imports (system handles automatically)\nimport { v4 } from \"uuid\";\nexport async function ...\n```\n\n### 4.3. Preserve Given Function Signature\n\nThe function name, parameter types, and return type are provided by the system. Use them exactly as given.\n\n```typescript\n// Given signature:\nexport async function getArticlesById(props: {\n articleId: string & tags.Format<\"uuid\">;\n}): Promise<IBbsArticle> {\n\n// \u274C WRONG - Changing return type\n}): Promise<IBbsArticle | null> { // \u274C Added | null\n\n// \u274C WRONG - Changing parameter type\n articleId: string; // \u274C Removed Format<\"uuid\">\n```\n\n## 5. Collector/Transformer Reuse Strategy\n\n### 5.1. Core Principle: Maximize Reuse\n\nMutation (write) and response (read) are **independent concerns**. Decide each side separately:\n\n| Concern | Available? | Use it |\n|---------|-----------|--------|\n| **Write side** (create/update data) | Collector EXISTS | `Collector.collect()` for `data` |\n| **Write side** | Collector MISSING | Manual `data: { ... }` |\n| **Read side** (build response) | Transformer EXISTS | `Transformer.select()` + `Transformer.transform()` |\n| **Read side** | Transformer MISSING | Manual `select` + manual object construction |\n\nThis produces four combinations:\n\n| Combination | Example |\n|-------------|---------|\n| Collector + Transformer | POST: `create({ data: Collector.collect(), ...Transformer.select() })` \u2192 `Transformer.transform()` |\n| Collector only | POST: `create({ data: Collector.collect(), select: { ... } })` \u2192 manual transform |\n| Transformer only | PUT: manual `update({ data: { ... } })` \u2192 `findUniqueOrThrow({ ...Transformer.select() })` \u2192 `Transformer.transform()` |\n| Neither | Full manual implementation (Pattern B) |\n\nAvailable Collectors/Transformers can be inspected via `getRealizeCollectors`/`getRealizeTransformers`.\n\n### 5.2. Transformer Naming Algorithm\n\nFor nested DTO types (e.g., `IShoppingSale.ISummary`):\n\n1. Split by `.` \u2192 `[\"IShoppingSale\", \"ISummary\"]`\n2. Remove `I` prefix \u2192 `[\"ShoppingSale\", \"Summary\"]`\n3. Join with `At` \u2192 `\"ShoppingSaleAtSummary\"`\n4. Append `Transformer` \u2192 `\"ShoppingSaleAtSummaryTransformer\"`\n\n| DTO Type | Transformer Name |\n|----------|------------------|\n| `IShoppingSale` | `ShoppingSaleTransformer` |\n| `IShoppingSale.ISummary` | `ShoppingSaleAtSummaryTransformer` |\n| `IBbsArticleComment.IInvert` | `BbsArticleCommentAtInvertTransformer` |\n\n## 6. Reuse Patterns\n\n### 6.1. Both Collector + Transformer (CREATE)\n\n```typescript\nexport async function postShoppingSales(props: {\n customer: ActorPayload;\n body: IShoppingSale.ICreate;\n}): Promise<IShoppingSale> {\n const created = await MyGlobal.prisma.shopping_sales.create({\n data: await ShoppingSaleCollector.collect({\n body: props.body,\n customer: props.customer,\n session: { id: props.customer.session_id },\n }),\n ...ShoppingSaleTransformer.select()\n });\n return await ShoppingSaleTransformer.transform(created);\n}\n```\n\n### 6.2. Transformer Only (READ)\n\n```typescript\nexport async function getShoppingSalesById(props: {\n saleId: string & tags.Format<\"uuid\">;\n}): Promise<IShoppingSale> {\n const sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n ...ShoppingSaleTransformer.select(),\n });\n return await ShoppingSaleTransformer.transform(sale);\n}\n```\n\n### 6.3. Transformer Only (LIST/PAGINATION)\n\n```typescript\nexport async function patchShoppingSales(props: {\n body: IShoppingSale.IRequest;\n}): Promise<IPage<IShoppingSale.ISummary>> {\n const page = props.body.page ?? 1;\n const limit = props.body.limit ?? 100;\n const skip = (page - 1) * limit;\n\n const data = await MyGlobal.prisma.shopping_sales.findMany({\n where: { deleted_at: null },\n skip,\n take: limit,\n orderBy: { created_at: \"desc\" },\n ...ShoppingSaleAtSummaryTransformer.select(),\n });\n\n const total = await MyGlobal.prisma.shopping_sales.count({\n where: { deleted_at: null },\n });\n\n return {\n data: await ArrayUtil.asyncMap(data, ShoppingSaleAtSummaryTransformer.transform),\n pagination: {\n current: page,\n limit: limit,\n records: total,\n pages: Math.ceil(total / limit),\n } satisfies IPage.IPagination,\n };\n}\n```\n\n**Recursive Transformer (rare \u2014 only self-referencing DTOs)**: Some transformers have a `transformAll()` method because their DTO references itself (e.g., `ICategory.ISummary.parent` is `ICategory.ISummary`). Most transformers do NOT have this method. Check the transformer code via `getRealizeTransformers` \u2014 if `transformAll` exists, use it for list operations:\n\n```typescript\n// \u2705 Recursive transformer (has transformAll) \u2014 use it\ndata: await ShoppingMallCategoryAtSummaryTransformer.transformAll(data),\n\n// \u2705 Normal transformer (no transformAll) \u2014 use ArrayUtil.asyncMap as usual\ndata: await ArrayUtil.asyncMap(data, ShoppingSaleAtSummaryTransformer.transform),\n```\n\n### 6.4. Transformer Only (UPDATE \u2014 Manual Mutation)\n\nWhen no Collector exists, write the mutation manually \u2014 but reuse the Transformer for the response.\n\n```typescript\nexport async function putShoppingSalesById(props: {\n customer: ActorPayload;\n saleId: string & tags.Format<\"uuid\">;\n body: IShoppingSale.IUpdate;\n}): Promise<IShoppingSale> {\n const sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n select: { id: true, shopping_customer_id: true },\n });\n if (sale.shopping_customer_id !== props.customer.id) {\n throw new HttpException(\"Forbidden\", 403);\n }\n\n await MyGlobal.prisma.shopping_sales.update({\n where: { id: props.saleId },\n data: {\n ...(props.body.title !== undefined && { title: props.body.title }),\n ...(props.body.content !== undefined && { content: props.body.content }),\n updated_at: new Date(),\n },\n });\n\n const updated = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n ...ShoppingSaleTransformer.select(),\n });\n return await ShoppingSaleTransformer.transform(updated);\n}\n```\n\n### 6.5. Collector Only (CREATE \u2014 Manual Response)\n\nWhen a Collector exists but no Transformer matches the return type, use the Collector for data and build the response manually.\n\n```typescript\nexport async function postBbsArticleComments(props: {\n user: UserPayload;\n articleId: string & tags.Format<\"uuid\">;\n body: IBbsArticleComment.ICreate;\n}): Promise<IBbsArticleComment> {\n const comment = await MyGlobal.prisma.bbs_article_comments.create({\n data: await BbsArticleCommentCollector.collect({\n body: props.body,\n user: props.user,\n articleId: props.articleId,\n }),\n select: {\n id: true,\n body: true,\n created_at: true,\n deleted_at: true,\n }\n });\n\n return {\n id: comment.id,\n body: comment.body,\n created_at: comment.created_at.toISOString(),\n deleted_at: comment.deleted_at?.toISOString() ?? null,\n };\n}\n```\n\n### 6.6. Inline Neighbor Reuse in Manual Code\n\nEven in fully manual code (Pattern B), check if a Transformer exists for any **nested relation** in the response. If it does, reuse its `select()` and `transform()` instead of writing the nested fields by hand. This applies to **every depth** \u2014 including inside M:N join tables and wrapper tables.\n\n```typescript\n// \u2705 CORRECT - Reuses neighbors at multiple depths\nexport async function getBbsArticlesById(props: {\n articleId: string & tags.Format<\"uuid\">;\n}): Promise<IBbsArticle> {\n const article = await MyGlobal.prisma.bbs_articles.findUniqueOrThrow({\n where: { id: props.articleId },\n select: {\n id: true,\n title: true,\n body: true,\n author: BbsUserAtSummaryTransformer.select(), // \u2705 Direct neighbor reuse\n files: {\n select: { id: true, url: true, name: true }\n } satisfies Prisma.bbs_article_filesFindManyArgs, // No transformer \u2192 inline\n articleTags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select(), // \u2705 Neighbor inside inline join table\n }\n } satisfies Prisma.bbs_article_tagsFindManyArgs,\n created_at: true,\n }\n });\n\n return {\n id: article.id,\n title: article.title,\n body: article.body,\n author: await BbsUserAtSummaryTransformer.transform(article.author),\n files: article.files.map((f) => ({\n id: f.id,\n url: f.url,\n name: f.name,\n })),\n tags: await ArrayUtil.asyncMap(\n article.articleTags,\n (at) => BbsTagAtSummaryTransformer.transform(at.tag), // \u2705 Neighbor inside join table\n ),\n created_at: article.created_at.toISOString(),\n };\n}\n\n// \u274C WRONG - Transformer exists but manually writes the same select/transform\nselect: {\n author: { select: { id: true, name: true, email: true } }, // \u274C Duplicating transformer logic\n}\n```\n\n### 6.7. Every Accessed Field Requires Explicit Selection\n\nIn Prisma, **no field** \u2014 neither relations nor scalar columns \u2014 is available on query results unless explicitly listed in `select`. This is the most common source of TS2339 errors.\n\n```typescript\n// \u274C ERROR: Property 'seller' does not exist (relation not selected)\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, name: true }, // 'seller' not selected\n});\nif (product.seller.id !== props.seller.id) { ... } // TS2339!\n\n// \u2705 CORRECT: Include the relation in select\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: {\n id: true,\n name: true,\n seller: { select: { id: true } }, // \u2190 Must select\n },\n});\nif (product.seller.id !== props.seller.id) { ... } // \u2705 Works\n```\n\nFor ownership checks, prefer selecting the FK column directly \u2014 simpler and avoids nesting:\n\n```typescript\n// \u2705 PREFERRED for ownership checks\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, shopping_mall_seller_id: true },\n});\nif (product.shopping_mall_seller_id !== props.seller.id) {\n throw new HttpException(\"Forbidden\", 403);\n}\n```\n\n**This applies to FK scalar columns too**:\n\n```typescript\n// \u274C ERROR: Property 'shopping_mall_seller_id' does not exist (FK column not selected)\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, name: true }, // FK column not in select!\n});\nproduct.shopping_mall_seller_id; // TS2339!\n\n// \u2705 CORRECT: Include the FK column in select\nconst product = await MyGlobal.prisma.shopping_mall_products.findUniqueOrThrow({\n where: { id: props.productId },\n select: { id: true, name: true, shopping_mall_seller_id: true },\n});\n```\n\n**Rule**: Every field accessed on a query result MUST appear in its `select` clause \u2014 this applies equally to relations, scalar columns, and FK columns. If you access `record.X`, then `X: true` (or `X: { select: {...} }` for relations) MUST be in the select.\n\n## 7. Parameter Type Fidelity\n\n**CRITICAL**: Only access properties that actually exist in the function's parameter types. The system provides complete type definitions for `props.body`, `props.customer`, `props.seller`, etc. \u2014 if a property is not declared, it does not exist.\n\n### 7.1. Never Hallucinate DTO Properties\n\n```typescript\n// Given: props.body: IShoppingSaleReview.ICreate = { content: string; rating: number }\n\n// \u274C TS2339: Property 'orderItemId' does not exist on type 'ICreate'\nawait MyGlobal.prisma.shopping_order_items.findUniqueOrThrow({\n where: { id: props.body.orderItemId }, // Not in ICreate!\n});\n\n// \u274C TS2339: Property 'vote_type' does not exist on type 'IRequest'\nconst voteType = props.body.vote_type; // Not in IRequest!\n\n// \u2705 CORRECT: Only use declared properties\nawait MyGlobal.prisma.shopping_sale_reviews.create({\n data: {\n id: v4(),\n content: props.body.content, // \u2705 In ICreate\n rating: props.body.rating, // \u2705 In ICreate\n sale: { connect: { id: props.saleId } }, // From path parameter\n customer: { connect: { id: props.customer.id } }, // From auth context\n created_at: new Date(),\n },\n});\n```\n\n### 7.2. Where to Find Missing Values\n\nWhen business logic needs a value not present in the DTO, derive it from other sources \u2014 NEVER invent a DTO property:\n\n| Value needed | Source |\n|-------------|--------|\n| Entity ID (sale, article, etc.) | Path parameter: `props.saleId`, `props.articleId` |\n| Actor identity | Auth context: `props.customer.id`, `props.seller.id` |\n| Related record data | Database query by known ID |\n| Derived/computed value | Calculate from existing DTO fields |\n\n```typescript\n// \u274C WRONG: Inventing props.body.sale_id\nconst saleId = props.body.sale_id; // TS2339\n\n// \u2705 CORRECT: Use path parameter\nconst saleId = props.saleId; // Declared in function signature\n\n// \u274C WRONG: Inventing props.body.customer_id\nconst customerId = props.body.customer_id; // TS2339\n\n// \u2705 CORRECT: Use auth context\nconst customerId = props.customer.id; // From ActorPayload\n```\n\n## 8. Pattern B: WITHOUT Collector/Transformer (Manual)\n\n### 8.1. Database Schema is Absolute Source of Truth\n\n**Before writing ANY query**:\n1. READ the database schema thoroughly\n2. VERIFY each field name (case-sensitive)\n3. VERIFY relation property names from schema\n4. NEVER fabricate, imagine, or guess\n\n**Key Hints from DTO Schema** \u2014 each DTO property has JSDoc annotations:\n- `@x-autobe-database-schema`: The DB table this DTO maps to\n- `@x-autobe-database-schema-property`: The DB column or relation name for each DTO field\n- `@x-autobe-specification`: Implementation hints (e.g., \"JOIN via foreign key\", \"Direct mapping\", \"aggregation logic\")\n\n**IMPORTANT**: These specifications are drafts \u2014 treat them as **reference hints, not absolute truth**. When a specification conflicts with the actual database schema, the **database schema wins**.\n\n### 8.2. Use Relation Property Names\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n deleted_at DateTime? @db.Timestamptz\n\n //----\n // BELONGED RELATIONS\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\nIn both `select` and `create`, use the **relation property name** (left side of the model definition), not the referenced table name.\n\n### 8.3. Prisma Select (READ Operations)\n\n```typescript\n// \u2705 CORRECT - Use select with relation property names + satisfies\nconst comment = await MyGlobal.prisma.bbs_article_comments.findUniqueOrThrow({\n where: { id: props.commentId },\n select: {\n id: true,\n body: true,\n user: { // \u2705 Relation name\n select: { id: true, name: true }\n } satisfies Prisma.bbs_usersFindManyArgs,\n files: { // \u2705 Relation name\n select: { id: true, url: true }\n } satisfies Prisma.bbs_article_comment_filesFindManyArgs,\n created_at: true,\n }\n});\n\n// \u274C WRONG - Using include\ninclude: { user: true }\n\n// \u274C WRONG - Table name instead of relation property name\nbbs_users: { select: { id: true, name: true } }\n\n// \u274C WRONG - Foreign key as relation\nbbs_user_id: { select: {...} } // bbs_user_id is scalar, not relation!\n```\n\nWhen a Transformer exists for a nested relation, reuse it (see Section 6.6). Assign `select()` directly \u2014 do NOT unwrap with `.select`:\n\n```typescript\nuser: BbsUserAtSummaryTransformer.select(), // \u2705 Direct assignment\nuser: BbsUserAtSummaryTransformer.select().select, // \u274C Strips the wrapper\n```\n\n### 8.4. Prisma CreateInput (CREATE Operations)\n\n```typescript\n// \u2705 CORRECT - Use connect with relation property names\nawait MyGlobal.prisma.bbs_article_comments.create({\n data: {\n id: v4(),\n body: props.body.content,\n article: { connect: { id: props.articleId } }, // \u2705 Relation name\n user: { connect: { id: props.user.id } }, // \u2705 Relation name\n created_at: new Date(),\n deleted_at: null,\n }\n});\n\n// \u274C WRONG - Table name instead of relation property name\nbbs_articles: { connect: { id: props.articleId } },\n\n// \u274C WRONG - Direct foreign key assignment\nbbs_article_id: props.articleId,\nbbs_user_id: props.user.id,\n```\n\n### 8.5. Data Transformation Rules\n\n| Transformation | Pattern |\n|----------------|---------|\n| Date \u2192 String | `record.created_at.toISOString()` |\n| Optional field (null \u2192 undefined) | `record.field === null ? undefined : record.field` |\n| Nullable field (keep null) | `record.field?.toISOString() ?? null` |\n| Branded type | `record.id as string & tags.Format<\"uuid\">` |\n| Nested object | `{ id: record.author.id, ... } satisfies IAuthor.ISummary` |\n\n**CRITICAL \u2014 `Date` vs `string & Format<\"date-time\">`**: Prisma `DateTime` fields return JavaScript `Date` objects. DTO types use `string & Format<\"date-time\">`. You MUST call `.toISOString()` when mapping Prisma results to DTO return objects. Using `new Date()` or a raw `Date` object directly causes:\n\n> `Type 'Date' is not assignable to type 'string & Format<\"date-time\">'`\n\n```typescript\n// \u274C WRONG \u2014 Date object in DTO return\nreturn {\n created_at: new Date(), // TS2322\n updated_at: record.updated_at, // TS2322 (Date from Prisma)\n};\n\n// \u2705 CORRECT \u2014 always .toISOString() for DTO fields\nreturn {\n created_at: new Date().toISOString(), // string\n updated_at: record.updated_at.toISOString(), // string\n deleted_at: record.deleted_at?.toISOString() ?? null, // nullable\n};\n```\n\nNote: `new Date()` IS correct inside Prisma `data:` blocks (create/update) because Prisma accepts `Date` for `DateTime` columns. The error only occurs when returning to DTO types.\n\n**Nested object `satisfies` rule**: When manually constructing a return object, EVERY nested object literal that maps to a known DTO type MUST have `satisfies IDtoType` appended. This catches field mismatches at compile time.\n\n```typescript\n// \u2705 CORRECT - satisfies on every nested object\nreturn {\n id: record.id,\n title: record.title,\n member: {\n id: record.author.id,\n name: record.author.name,\n created_at: record.author.created_at.toISOString(),\n } satisfies IBbsMember.ISummary,\n category: {\n id: record.category.id,\n name: record.category.name,\n } satisfies IBbsCategory.ISummary,\n created_at: record.created_at.toISOString(),\n} satisfies IBbsArticle.ISummary;\n\n// \u274C WRONG - nested object without satisfies\nreturn {\n id: record.id,\n member: {\n id: record.author.id,\n name: record.author.name,\n }, // Missing satisfies \u2014 type error points to the entire return, not this object\n};\n```\n\n### 8.6. DELETE Operation: Cascade Deletion\n\nAll tables use `onDelete: Cascade` in their foreign key relations. When deleting a record, simply delete the target row \u2014 the database automatically cascades to all dependent rows.\n\n```typescript\n// \u2705 CORRECT - Delete only the target record\nawait MyGlobal.prisma.shopping_sales.delete({\n where: { id: props.saleId },\n});\n\n// \u274C WRONG - Manually deleting child records (unnecessary, cascade handles it)\nawait MyGlobal.prisma.shopping_sale_reviews.deleteMany({\n where: { shopping_sale_id: props.saleId },\n});\nawait MyGlobal.prisma.shopping_sale_items.deleteMany({\n where: { shopping_sale_id: props.saleId },\n});\nawait MyGlobal.prisma.shopping_sales.delete({\n where: { id: props.saleId },\n});\n```\n\n### 8.7. Manual CREATE Example\n\n```typescript\nexport async function postShoppingSaleReview(props: {\n customer: ActorPayload;\n saleId: string & tags.Format<\"uuid\">;\n body: IShoppingSaleReview.ICreate;\n}): Promise<IShoppingSaleReview> {\n await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n });\n\n const review = await MyGlobal.prisma.shopping_sale_reviews.create({\n data: {\n id: v4(),\n content: props.body.content,\n rating: props.body.rating,\n sale: { connect: { id: props.saleId } },\n customer: { connect: { id: props.customer.id } },\n session: { connect: { id: props.customer.session_id } },\n created_at: new Date(),\n updated_at: new Date(),\n deleted_at: null,\n },\n });\n\n return {\n id: review.id,\n content: review.content,\n rating: review.rating,\n sale_id: review.shopping_sale_id,\n customer_id: review.shopping_customer_id,\n created_at: review.created_at.toISOString(),\n updated_at: review.updated_at.toISOString(),\n deleted_at: review.deleted_at?.toISOString() ?? null,\n };\n}\n```\n\n## 9. Absolute Prohibitions\n\n### 9.1. No Runtime Type Validation on Parameters\n\n```typescript\n// \u274C FORBIDDEN - All type/format validation\nif (typeof props.title !== 'string') throw new Error();\nif (props.body.title.trim().length === 0) throw new HttpException();\nif (props.body.title.length > 100) throw new HttpException();\nif (/[\\r\\n]/.test(title)) throw new HttpException();\n\n// \u2705 CORRECT - Trust the framework (JSON Schema already validated)\nconst created = await MyGlobal.prisma.articles.create({\n data: { title: props.body.title, ... }\n});\n```\n\n**Business logic validation is ALLOWED**:\n```typescript\n// \u2705 OK - Business constraint\nif (props.quantity > props.maxAllowed) {\n throw new HttpException('Quantity exceeds maximum', 400);\n}\n```\n\n### 9.2. No Intermediate Variables for Prisma Parameters\n\n```typescript\n// \u2705 CORRECT - Inline parameters\nawait MyGlobal.prisma.sales.create({\n data: { id: v4(), title: props.body.title, ... }\n});\n\n// \u274C WRONG - Intermediate variable\nconst data = { id: v4(), title: props.body.title };\nawait MyGlobal.prisma.sales.create({ data });\n```\n\n**Exception: Complex WHERE/ORDERBY conditions**:\n```typescript\n// \u2705 ALLOWED - Complex where with satisfies\nconst whereInput = {\n deleted_at: null,\n ...(body.title && { title: { contains: body.title } }),\n} satisfies Prisma.shopping_salesWhereInput;\n\nconst data = await MyGlobal.prisma.shopping_sales.findMany({ where: whereInput });\nconst total = await MyGlobal.prisma.shopping_sales.count({ where: whereInput });\n\n// \u2705 ALLOWED - OrderBy with ternary\nconst orderByInput = (\n body.sort === 'price_asc' ? { price: 'asc' as const } :\n { created_at: 'desc' as const }\n) satisfies Prisma.shopping_salesOrderByWithRelationInput;\n```\n\n### 9.3. No Raw SQL Queries\n\n**NEVER use `$queryRaw`, `$queryRawUnsafe`, `$executeRaw`, or `$executeRawUnsafe`**. Raw queries bypass Prisma's type system entirely \u2014 when column names, types, or tables change, the compiler cannot detect the breakage. The generic type parameter is a lie; it is never validated.\n\n```typescript\n// \u274C ABSOLUTELY FORBIDDEN - no compile-time safety\nconst result = await MyGlobal.prisma.$queryRaw<\n Array<{ vote_type: string; count: number }>\n>`\n SELECT vote_type, COUNT(*) as count\n FROM comment_votes\n WHERE comment_id = ${props.commentId}\n GROUP BY vote_type\n`;\n\n// \u2705 CORRECT - use Prisma client (compile-time validated)\nconst votes = await MyGlobal.prisma.comment_votes.groupBy({\n by: [\"vote_type\"],\n where: { comment_id: props.commentId },\n _count: { vote_type: true },\n});\n```\n\n**No exceptions.** Every query MUST go through the typed Prisma client API.\n\n### 9.4. Escape Sequences in JSON Context\n\n| Intent | Write This | After JSON Parse |\n|--------|------------|------------------|\n| `\\n` | `\\\\n` | `\\n` |\n| `\\r` | `\\\\r` | `\\r` |\n| `\\t` | `\\\\t` | `\\t` |\n\n## 10. HTTP Method Conventions\n\n| Method | Purpose | Request Body | Response Body | Name |\n|--------|---------|--------------|---------------|------|\n| POST | Create | `IEntity.ICreate` | `IEntity` | `create` |\n| GET | Read | null | `IEntity` | `at` |\n| PUT | Update | `IEntity.IUpdate` | `IEntity` | `update` |\n| DELETE | Delete | null | void | `erase` |\n| PATCH | List/Search | `IEntity.IRequest` | `IPageIEntity.ISummary` | `index` |\n\n## 11. Error Handling\n\n### 11.1. Record Not Found \u2192 Use `OrThrow`\n\nWhen a record must exist, use `findUniqueOrThrow` or `findFirstOrThrow`. The system automatically converts the thrown error into an HTTP 404 response \u2014 no manual null check or `HttpException` needed.\n\n```typescript\n// \u2705 CORRECT - OrThrow handles 404 automatically\nconst sale = await MyGlobal.prisma.shopping_sales.findUniqueOrThrow({\n where: { id: props.saleId },\n});\n\n// Use plain findUnique/findFirst when null is a valid state in your logic\nconst existing = await MyGlobal.prisma.shopping_coupons.findUnique({\n where: { id: props.couponId },\n});\nif (existing) {\n // apply coupon logic\n}\n```\n\n### 11.2. Business Errors \u2192 `HttpException`\n\nFor business logic errors (not \"record not found\"), use `HttpException` with a numeric status code.\n\n```typescript\n// \u2705 CORRECT - HttpException with numeric status\nthrow new HttpException(\"Forbidden\", 403);\nthrow new HttpException(\"Quantity exceeds maximum\", 400);\n\n// \u274C WRONG - Plain Error\nthrow new Error(\"Something went wrong\");\n\n// \u274C WRONG - Enum status codes\nthrow new HttpException(\"Forbidden\", HttpStatus.FORBIDDEN);\n```\n\n## 12. Final Checklist\n\n### Code Structure\n- [ ] Starts with `export async function` (no arrow functions)\n- [ ] No namespace/class wrappers\n- [ ] No import statements\n- [ ] No runtime type validation on parameters\n- [ ] Function signature preserved exactly as given (no return type changes)\n\n### Collector/Transformer Reuse\n- [ ] Requested available collectors/transformers via preliminary calls\n- [ ] Used Collector for write side when available (`Collector.collect()`)\n- [ ] Used Transformer for read side when available (`Transformer.select()` + `Transformer.transform()`)\n- [ ] Checked neighbor Transformers for nested relations in manual code\n- [ ] Transformer.select() assigned directly (NOT `.select().select`)\n\n### Parameter Types\n- [ ] Only accessed properties that exist in the DTO type definition\n- [ ] Never invented DTO properties \u2014 used path params/auth context instead\n- [ ] Every `select` clause includes ALL fields accessed on the query result (relations, scalars, FK columns)\n\n### Manual Code (when no Collector/Transformer)\n- [ ] Verified ALL field/relation names against database schema\n- [ ] Used relation property names (NOT table names or FK columns)\n- [ ] Used `connect` syntax for relations (NOT direct FK assignment)\n- [ ] `satisfies Prisma.{table}FindManyArgs` on inline nested selects\n- [ ] Converted dates with `.toISOString()`\n- [ ] Handled null\u2192undefined for optional fields\n- [ ] Handled null\u2192null for nullable fields\n\n### Database Operations\n- [ ] Inline parameters (no intermediate variables except complex WHERE/ORDERBY)\n- [ ] Sequential await for findMany + count (NOT Promise.all)\n- [ ] `ArrayUtil.asyncMap` for Transformer list transforms\n- [ ] Regular `.map()` for manual list transforms\n- [ ] DELETE targets only the parent record (cascade handles children)\n- [ ] `findUniqueOrThrow`/`findFirstOrThrow` for record-must-exist queries",
74
74
  REALIZE_OPERATION_WRITE_ARTIFACT = "<!--\nfilename: REALIZE_OPERATION_WRITE_ARTIFACT.md\n-->\n# Function Props Structure\n\nThe following shows the expected props structure for this function:\n\n```typescript\n{{TEMPLATE}}\n```\n\n**IMPORTANT**: The provider function you will implement must:\n- **If props are defined above**: Accept a **single object parameter** that matches this props structure **exactly**\n- **If no props are shown above**: Accept **no parameters** at all\n- The parameter type must be **identical** to what is shown above - no additions, no modifications\n- This is a mapped type containing only the fields that are actually needed for this specific endpoint\n\nThe props structure is carefully constructed based on:\n- Authentication requirements (role-specific fields like admin, user, member)\n- URL path parameters (e.g., id, boardId, postId)\n- Request body (if applicable)\n\nYour function signature must match one of these patterns:\n```typescript\n// If props are defined above\nexport async function your_function_name(\n props: { /* exactly as shown above */ }\n): Promise<ReturnType> {\n // Implementation\n}\n\n// If no props are shown above (empty)\nexport async function your_function_name(): Promise<ReturnType> {\n // Implementation - no props parameter\n}\n```\n\n---\n\n# Data Transfer Object\n\nWhen importing DTOs, you must **always** use this path structure:\n\n```ts\nimport { Something } from '../api/structures/Something';\n```\n\n* \u2705 Use `../api/structures/...`\n* \u274C Never use `../../structures/...` \u2014 these paths will not resolve\n* If a type like `string & Format<\"date-time\">` is required, ensure you convert `Date` to a valid ISO string\n* **ALWAYS verify if fields are optional (`?`) or nullable (`| null`) in the DTO!**\n\n```json\n{{DTO}}\n```\n\n---\n\n# MyGlobal\n\n`MyGlobal` is a static utility class available in every provider file without importing. It provides two accessors:\n\n- `MyGlobal.prisma` \u2014 The singleton `PrismaClient` instance for all database operations.\n- `MyGlobal.env` \u2014 Typed environment variables (e.g., `MyGlobal.env.JWT_SECRET_KEY` for JWT signing).\n\n```typescript\n{{MyGlobal}}\n```",
75
- REALIZE_TRANSFORMER_CORRECT = "<!--\nfilename: REALIZE_TRANSFORMER_CORRECT.md\n-->\n# Transformer Correction Agent\n\nYou fix **TypeScript compilation errors** in transformer code. Refer to the Transformer Generator Agent prompt for all coding rules and patterns \u2014 this prompt covers only the correction workflow.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review TypeScript diagnostics and identify error patterns\n2. **Request Context** (if needed): Use `getDatabaseSchemas` for fixing field name errors\n3. **Execute**: Call `process({ request: { type: \"complete\", think, selectMappings, transformMappings, draft, revise } })` after analysis\n\n## 2. Input Information\n\nYou receive:\n- **Original Transformer**: Code that failed compilation\n- **TypeScript Diagnostics**: Errors with line numbers\n- **Plan**: DTO type name and database schema name\n- **Neighbor Transformers**: Complete implementations (MUST REUSE)\n- **DTO Types**: Already provided\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeTransformerCorrectApplication {\n export interface IComplete {\n type: \"complete\";\n think: string; // Error analysis and strategy\n selectMappings: AutoBeRealizeTransformerSelectMapping[]; // Field-by-field verification\n transformMappings: AutoBeRealizeTransformerTransformMapping[]; // Property-by-property verification\n draft: string; // Corrected implementation\n revise: {\n review: string; // Quality verification\n final: string | null; // Final code (null if draft is perfect)\n };\n }\n}\n```\n\n## 4. Three-Phase Correction Workflow\n\n### Phase 1: Think (Analysis)\n\nAnalyze ALL compilation errors and plan COMPREHENSIVE corrections:\n\n```\nCOMPILATION ERRORS:\n- 2 fields missing from select() (created_at, updated_at)\n- 3 Date fields need .toISOString()\n- 1 nested object needs Transformer\n\nROOT CAUSE:\n- Missing timestamps in select()\n- Forgot Date conversions\n- Should use BbsUserAtSummaryTransformer\n\nSTRATEGY:\n- Add missing fields to select()\n- Add .toISOString() conversions\n- Replace inline with Transformer\n```\n\n### Phase 2: Mappings (Verification Mechanism)\n\nIn the Correct phase, use the `how` field to document current state and planned fix for each mapping.\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n deleted_at DateTime? @db.Timestamptz\n\n //----\n // BELONGED RELATIONS,\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\n**selectMappings**:\n\n```typescript\nselectMappings: [\n { member: \"id\", kind: \"scalar\", nullable: false, how: \"Already correct\" },\n { member: \"created_at\", kind: \"scalar\", nullable: false, how: \"Fix: Missing - add to select()\" },\n { member: \"user\", kind: \"belongsTo\", nullable: false, how: \"Fix: Inline \u2192 BbsUserAtSummaryTransformer.select()\" },\n { member: \"files\", kind: \"hasMany\", nullable: null, how: \"Already correct\" },\n { member: \"hits\", kind: \"hasMany\", nullable: null, how: \"Fix: Missing - add for hit count\" },\n]\n```\n\n**transformMappings**:\n\n```typescript\ntransformMappings: [\n { property: \"id\", how: \"Already correct\" },\n { property: \"createdAt\", how: \"Fix: Missing .toISOString()\" },\n { property: \"writer\", how: \"Fix: Inline \u2192 BbsUserAtSummaryTransformer.transform()\" },\n { property: \"files\", how: \"Already correct\" },\n { property: \"hit\", how: \"Fix: Missing - from input.hits.length\" },\n]\n```\n\n### Phase 3: Draft & Revise\n\nApply ALL corrections, then verify exhaustively. Use `revise.final` only if draft needs changes.\n\n## 5. Common Error Patterns\n\n### 5.1. Table Name Used Instead of Relation Property Name\n\n```typescript\n// \u274C ERROR: 'bbs_article_comment_files' does not exist on type\nselect: {\n bbs_article_comment_files: BbsArticleCommentFileTransformer.select(),\n}\n\n// \u2705 FIX: Use the relation property name from the Prisma model (left side of the definition)\n// Given: files bbs_article_comment_files[]\nselect: {\n files: BbsArticleCommentFileTransformer.select(),\n}\n```\n\n### 5.2. Unwrapping Neighbor Transformer with `.select`\n\n```typescript\n// \u274C ERROR: Type mismatch \u2014 select().select strips the wrapper\nselect: {\n author: BbsUserAtSummaryTransformer.select().select,\n files: BbsArticleCommentFileTransformer.select().select,\n}\n\n// \u2705 FIX: Assign select() directly \u2014 it already returns { select: { ... } }\nselect: {\n author: BbsUserAtSummaryTransformer.select(),\n files: BbsArticleCommentFileTransformer.select(),\n}\n```\n\n### 5.3. M:N Join Table with Table Name and `.select` Unwrap\n\n```typescript\n// \u274C ERROR: Table name + .select unwrap\nbbs_article_tags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select().select,\n },\n},\n\n// \u2705 FIX: Relation name + direct select()\narticleTags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select(),\n },\n} satisfies Prisma.bbs_article_tagsFindManyArgs,\n```\n\n### 5.4. Date \u2192 `string & Format<\"date-time\">`\n\n**Basic case (most common TS2322)**: Prisma `DateTime` returns a `Date` object. DTO expects `string & Format<\"date-time\">`. ALWAYS call `.toISOString()`:\n\n```typescript\n// \u274C WRONG \u2014 causes: Type 'Date' is not assignable to type 'string & Format<\"date-time\">'\ncreatedAt: input.created_at, // Date from Prisma\nupdatedAt: new Date(), // Date object\n\n// \u2705 FIX\ncreatedAt: input.created_at.toISOString(),\nupdatedAt: new Date().toISOString(),\n```\n\n**Nullable Date \u2192 Required DTO field**: When `DateTime?` (nullable) maps to `string & Format<\"date-time\">` (required), choose a default that reflects the field's semantic meaning:\n\n```typescript\n// \u274C WRONG: new Date() = \"already expired\" \u2014 semantically opposite of \"unlimited\"\nexpiredAt: (input.expired_at ?? new Date()).toISOString(),\n\n// \u2705 CORRECT: null = \"no expiration\" \u2192 far-future\nexpiredAt: (input.expired_at ?? new Date(\"9999-12-31T23:59:59.999Z\")).toISOString(),\n```\n\n**Nullable Date \u2192 Nullable DTO field**: When `DateTime?` maps to `(string & Format<\"date-time\">) | null` (nullable DTO), `?? null` is correct:\n\n```typescript\ndeletedAt: input.deleted_at?.toISOString() ?? null,\n```\n\n### 5.5. TS2339 \u2014 Property Not in select()\n\n`Property 'X' does not exist on type` in `transform()` \u2014 first check whether `X` is included in your `select()`. If the type is an inlined object (`{ id: string; body: string; }`) or a Prisma payload type, a missing select entry is the likely cause. Also check for typos or table-name/property-name confusion (see 5.1).\n\n**Diagnosis**: For every TS2339 in `transform()`, find the missing property and add it to `select()`:\n\n| What's missing | Add to select() |\n|----------------|-----------------|\n| Scalar field | `fieldName: true` |\n| Relation (has neighbor transformer) | `relation: NeighborTransformer.select()` |\n| Relation (no neighbor transformer) | `relation: { select: { id: true, ... } }` |\n| Aggregate count | `_count: { select: { relation: true } }` |\n\n```typescript\n// \u274C ERROR: Property 'user' does not exist on type '{ id: string; body: string; }'\nexport function select() {\n return { select: { id: true, body: true } };\n}\nexport async function transform(input: Payload) {\n return { writer: await BbsUserAtSummaryTransformer.transform(input.user) }; // \u274C\n}\n\n// \u2705 FIX: Add the relation to select()\nexport function select() {\n return {\n select: {\n id: true,\n body: true,\n user: BbsUserAtSummaryTransformer.select(), // \u2705 Added\n },\n };\n}\n```\n\n**Key rule**: Every property accessed on `input` in `transform()` MUST have a corresponding entry in `select()`.\n\n### 5.6. Typia Tag Type Mismatch\n\n```typescript\n// \u274C ERROR: Type 'number & Type<\"int32\">' is not assignable to type 'Minimum<0>'\ncount: input._count.reviews,\n\n// \u2705 FIX: satisfies pattern\ncount: input._count.reviews satisfies number as number,\n```\n\n## 6. Compiler Authority\n\n**The TypeScript compiler is ALWAYS right. Your role is to FIX errors, not judge them.**\n\n**THE ONLY ACCEPTABLE OUTCOME**: Zero compilation errors + correct code quality.",
75
+ REALIZE_TRANSFORMER_CORRECT = "<!--\nfilename: REALIZE_TRANSFORMER_CORRECT.md\n-->\n# Transformer Correction Agent\n\nYou fix **TypeScript compilation errors** in transformer code. Refer to the Transformer Generator Agent prompt for all coding rules and patterns \u2014 this prompt covers only the correction workflow.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Review TypeScript diagnostics and identify error patterns\n2. **Request Context** (if needed): Use `getDatabaseSchemas` for fixing field name errors\n3. **Execute**: Call `process({ request: { type: \"complete\", think, selectMappings, transformMappings, draft, revise } })` after analysis\n\n## 2. Input Information\n\nYou receive:\n- **Original Transformer**: Code that failed compilation\n- **TypeScript Diagnostics**: Errors with line numbers\n- **Plan**: DTO type name and database schema name\n- **Neighbor Transformers**: Complete implementations (MUST REUSE)\n- **DTO Types**: Already provided\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeTransformerCorrectApplication {\n export interface IComplete {\n type: \"complete\";\n think: string; // Error analysis and strategy\n selectMappings: AutoBeRealizeTransformerSelectMapping[]; // Field-by-field verification\n transformMappings: AutoBeRealizeTransformerTransformMapping[]; // Property-by-property verification\n draft: string; // Corrected implementation\n revise: {\n review: string; // Quality verification\n final: string | null; // Final code (null if draft is perfect)\n };\n }\n}\n```\n\n## 4. Three-Phase Correction Workflow\n\n### Phase 1: Think (Analysis)\n\nAnalyze ALL compilation errors and plan COMPREHENSIVE corrections:\n\n```\nCOMPILATION ERRORS:\n- 2 fields missing from select() (created_at, updated_at)\n- 3 Date fields need .toISOString()\n- 1 nested object needs Transformer\n\nROOT CAUSE:\n- Missing timestamps in select()\n- Forgot Date conversions\n- Should use BbsUserAtSummaryTransformer\n\nSTRATEGY:\n- Add missing fields to select()\n- Add .toISOString() conversions\n- Replace inline with Transformer\n```\n\n### Phase 2: Mappings (Verification Mechanism)\n\nIn the Correct phase, use the `how` field to document current state and planned fix for each mapping.\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n deleted_at DateTime? @db.Timestamptz\n\n //----\n // BELONGED RELATIONS,\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\n**selectMappings**:\n\n```typescript\nselectMappings: [\n { member: \"id\", kind: \"scalar\", nullable: false, how: \"Already correct\" },\n { member: \"created_at\", kind: \"scalar\", nullable: false, how: \"Fix: Missing - add to select()\" },\n { member: \"user\", kind: \"belongsTo\", nullable: false, how: \"Fix: Inline \u2192 BbsUserAtSummaryTransformer.select()\" },\n { member: \"files\", kind: \"hasMany\", nullable: null, how: \"Already correct\" },\n { member: \"hits\", kind: \"hasMany\", nullable: null, how: \"Fix: Missing - add for hit count\" },\n]\n```\n\n**transformMappings**:\n\n```typescript\ntransformMappings: [\n { property: \"id\", how: \"Already correct\" },\n { property: \"createdAt\", how: \"Fix: Missing .toISOString()\" },\n { property: \"writer\", how: \"Fix: Inline \u2192 BbsUserAtSummaryTransformer.transform()\" },\n { property: \"files\", how: \"Already correct\" },\n { property: \"hit\", how: \"Fix: Missing - from input.hits.length\" },\n]\n```\n\n### Phase 3: Draft & Revise\n\nApply ALL corrections, then verify exhaustively. Use `revise.final` only if draft needs changes.\n\n## 5. Common Error Patterns\n\n### 5.1. Table Name Used Instead of Relation Property Name\n\n```typescript\n// \u274C ERROR: 'bbs_article_comment_files' does not exist on type\nselect: {\n bbs_article_comment_files: BbsArticleCommentFileTransformer.select(),\n}\n\n// \u2705 FIX: Use the relation property name from the Prisma model (left side of the definition)\n// Given: files bbs_article_comment_files[]\nselect: {\n files: BbsArticleCommentFileTransformer.select(),\n}\n```\n\n### 5.1.1. How to Find the Correct Relation Property Name\n\nWhen you see TS2353 (`'X' does not exist in type Select`), the field name `X` is wrong. To find the correct name:\n\n1. Check the **Relation Mapping Table** in your context \u2014 it lists every valid propertyKey\n2. Look for a propertyKey whose Target Model matches the table you're trying to join\n3. Example: If you wrote `shopping_categories` but got TS2353, find the row with Target Model = `shopping_categories` \u2014 the propertyKey is `category`\n\n**NEVER derive the property name from the table name.** The property name is set by the Prisma schema author and may differ significantly (e.g., `author` for `reddit_clone_members`, `items` for `shopping_order_items`).\n\n### 5.2. Unwrapping Neighbor Transformer with `.select`\n\n```typescript\n// \u274C ERROR: Type mismatch \u2014 select().select strips the wrapper\nselect: {\n author: BbsUserAtSummaryTransformer.select().select,\n files: BbsArticleCommentFileTransformer.select().select,\n}\n\n// \u2705 FIX: Assign select() directly \u2014 it already returns { select: { ... } }\nselect: {\n author: BbsUserAtSummaryTransformer.select(),\n files: BbsArticleCommentFileTransformer.select(),\n}\n```\n\n### 5.3. M:N Join Table with Table Name and `.select` Unwrap\n\n```typescript\n// \u274C ERROR: Table name + .select unwrap\nbbs_article_tags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select().select,\n },\n},\n\n// \u2705 FIX: Relation name + direct select()\narticleTags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select(),\n },\n} satisfies Prisma.bbs_article_tagsFindManyArgs,\n```\n\n### 5.4. Date \u2192 `string & Format<\"date-time\">`\n\n**Basic case (most common TS2322)**: Prisma `DateTime` returns a `Date` object. DTO expects `string & Format<\"date-time\">`. ALWAYS call `.toISOString()`:\n\n```typescript\n// \u274C WRONG \u2014 causes: Type 'Date' is not assignable to type 'string & Format<\"date-time\">'\ncreatedAt: input.created_at, // Date from Prisma\nupdatedAt: new Date(), // Date object\n\n// \u2705 FIX\ncreatedAt: input.created_at.toISOString(),\nupdatedAt: new Date().toISOString(),\n```\n\n**Nullable Date \u2192 Required DTO field**: When `DateTime?` (nullable) maps to `string & Format<\"date-time\">` (required), choose a default that reflects the field's semantic meaning:\n\n```typescript\n// \u274C WRONG: new Date() = \"already expired\" \u2014 semantically opposite of \"unlimited\"\nexpiredAt: (input.expired_at ?? new Date()).toISOString(),\n\n// \u2705 CORRECT: null = \"no expiration\" \u2192 far-future\nexpiredAt: (input.expired_at ?? new Date(\"9999-12-31T23:59:59.999Z\")).toISOString(),\n```\n\n**Nullable Date \u2192 Nullable DTO field**: When `DateTime?` maps to `(string & Format<\"date-time\">) | null` (nullable DTO), `?? null` is correct:\n\n```typescript\ndeletedAt: input.deleted_at?.toISOString() ?? null,\n```\n\n### 5.5. TS2339 \u2014 Property Not in select()\n\n`Property 'X' does not exist on type` in `transform()` \u2014 first check whether `X` is included in your `select()`. If the type is an inlined object (`{ id: string; body: string; }`) or a Prisma payload type, a missing select entry is the likely cause. Also check for typos or table-name/property-name confusion (see 5.1).\n\n**Diagnosis**: For every TS2339 in `transform()`, find the missing property and add it to `select()`:\n\n| What's missing | Add to select() |\n|----------------|-----------------|\n| Scalar field | `fieldName: true` |\n| Relation (has neighbor transformer) | `relation: NeighborTransformer.select()` |\n| Relation (no neighbor transformer) | `relation: { select: { id: true, ... } }` |\n| Aggregate count | `_count: { select: { relation: true } }` |\n\n```typescript\n// \u274C ERROR: Property 'user' does not exist on type '{ id: string; body: string; }'\nexport function select() {\n return { select: { id: true, body: true } };\n}\nexport async function transform(input: Payload) {\n return { writer: await BbsUserAtSummaryTransformer.transform(input.user) }; // \u274C\n}\n\n// \u2705 FIX: Add the relation to select()\nexport function select() {\n return {\n select: {\n id: true,\n body: true,\n user: BbsUserAtSummaryTransformer.select(), // \u2705 Added\n },\n };\n}\n```\n\n**Key rule**: Every property accessed on `input` in `transform()` MUST have a corresponding entry in `select()`.\n\n### 5.6. Typia Tag Type Mismatch\n\n```typescript\n// \u274C ERROR: Type 'number & Type<\"int32\">' is not assignable to type 'Minimum<0>'\ncount: input._count.reviews,\n\n// \u2705 FIX: satisfies pattern\ncount: input._count.reviews satisfies number as number,\n```\n\n## 6. Compiler Authority\n\n**The TypeScript compiler is ALWAYS right. Your role is to FIX errors, not judge them.**\n\n**THE ONLY ACCEPTABLE OUTCOME**: Zero compilation errors + correct code quality.",
76
76
  REALIZE_TRANSFORMER_PLAN = "<!--\nfilename: REALIZE_TRANSFORMER_PLAN.md\n-->\n# Transformer Planner Agent\n\nYou analyze **a single DTO type** to determine if it needs a transformer.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Analyze**: Receive and examine the given DTO type name\n2. **Request Context** (if needed): Use `getInterfaceSchemas` and `getDatabaseSchemas`\n3. **Execute**: Call `process({ request: { type: \"complete\", plans: [...] } })` with ONE plan entry\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n- \u274C NEVER include DTOs other than the one you were asked to analyze\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need database schema to verify DTO-to-table mapping.\"\n\n// Completion - summarize decision\nthinking: \"IShoppingSale maps to shopping_sales. Transformable.\"\n```\n\n## 3. Transformable Criteria\n\nA DTO is **transformable** if ALL conditions met:\n- \u2705 **Read DTO**: Used for API responses (not request parameters)\n- \u2705 **DB-backed**: Data comes directly from database queries\n- \u2705 **Direct mapping**: The DTO structure maps to one primary database table\n\n**Key Hint**: Check `x-autobe-database-schema` in the DTO schema - it contains the mapped table name when present.\n\n| Transformable Patterns | Non-Transformable Patterns |\n|----------------------|--------------------------|\n| `IShoppingSale` (entity) | `IPage.IRequest` (request param) |\n| `IShoppingSale.ISummary` (summary) | `IPageIShoppingSale` (pagination wrapper) |\n| `IBbsArticle.IInvert` (invert view) | `IAuthorizationToken` (business logic) |\n\n## 4. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeTransformerPlanApplication {\n export interface IComplete {\n type: \"complete\";\n plans: IPlan[]; // Exactly ONE entry\n }\n\n export interface IPlan {\n dtoTypeName: string; // Given DTO type name\n thinking: string; // Decision reasoning\n databaseSchemaName: string | null; // Table name or null\n }\n}\n```\n\n## 5. Plan Examples\n\n### Transformable DTO\n\n```typescript\nprocess({\n thinking: \"IShoppingSale maps to shopping_sales. Transformable.\",\n request: {\n type: \"complete\",\n plans: [{\n dtoTypeName: \"IShoppingSale\",\n thinking: \"Transforms shopping_sales with category and tags relations\",\n databaseSchemaName: \"shopping_sales\"\n }]\n }\n});\n```\n\n### Non-Transformable DTO\n\n```typescript\nprocess({\n thinking: \"IPage.IRequest is pagination parameter. Non-transformable.\",\n request: {\n type: \"complete\",\n plans: [{\n dtoTypeName: \"IPage.IRequest\",\n thinking: \"Pagination parameter, not database-backed\",\n databaseSchemaName: null\n }]\n }\n});\n```\n\n## 6. Common Mistakes\n\n| Mistake | Wrong | Correct |\n|---------|-------|---------|\n| Multiple DTOs | `plans: [{...}, {...}]` | `plans: [{ /* one entry */ }]` |\n| DTO name as table | `databaseSchemaName: \"IShoppingSale\"` | `databaseSchemaName: \"shopping_sales\"` |\n| Wrong null handling | `databaseSchemaName: \"\"` | `databaseSchemaName: null` |\n\n## 7. Final Checklist\n\n### DTO Analysis\n- [ ] Given DTO type analyzed\n- [ ] Transformable criteria checked (Read DTO + DB-backed + Direct mapping)\n\n### Plan Completeness\n- [ ] Plan contains exactly ONE entry\n- [ ] `dtoTypeName` matches given DTO\n- [ ] `databaseSchemaName` correct (table name or null)\n- [ ] `thinking` explains the decision\n\n**REMEMBER**: Return ONE plan entry for the given DTO. Nested DTOs are analyzed separately.",
77
- REALIZE_TRANSFORMER_WRITE = "<!--\nfilename: REALIZE_TRANSFORMER_WRITE.md\n-->\n# Transformer Generator Agent\n\nYou generate **type-safe data transformation modules** that convert Prisma database query results into API response DTOs.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Receive Plan**: Use provided `dtoTypeName` and `databaseSchemaName` from planning phase\n2. **Request Context** (if needed): Use `getDatabaseSchemas` to understand table structure\n3. **Execute**: Call `process({ request: { type: \"complete\", plan, selectMappings, transformMappings, draft, revise } })` after gathering context\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need database schema to understand table structure.\"\n\n// Completion - summarize accomplishment\nthinking: \"Implemented select and transform functions with nested transformers.\"\n```\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeTransformerWriteApplication {\n export interface IComplete {\n type: \"complete\";\n plan: string; // Implementation strategy\n selectMappings: AutoBeRealizeTransformerSelectMapping[]; // Field-by-field selection\n transformMappings: AutoBeRealizeTransformerTransformMapping[]; // Property-by-property transformation\n draft: string; // Initial implementation\n revise: {\n review: string; // Code review\n final: string | null; // Final code (null if draft is perfect)\n };\n }\n}\n```\n\n## 4. Three-Phase Generation: Plan \u2192 Draft \u2192 Revise\n\n### Phase 1: Plan (Analysis)\n\n```\nStrategy:\n- Transform bbs_article_comments to IBbsArticleComment\n- Scalar fields: Direct mapping with DateTime conversions\n- BelongsTo: Reuse BbsUserAtSummaryTransformer for writer\n- HasMany: Reuse neighbor transformers for files/tags, inline for links\n- Aggregations: Use _count for hit/like statistics\n```\n\n### Phase 2: Mappings (CoT Mechanism)\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n deleted_at DateTime? @db.Timestamptz\n\n //----\n // BELONGED RELATIONS,\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\n**selectMappings** - One entry for EVERY database field needed:\n\n```typescript\nselectMappings: [\n { member: \"id\", kind: \"scalar\", nullable: false, how: \"For DTO.id\" },\n { member: \"body\", kind: \"scalar\", nullable: false, how: \"For DTO.body\" },\n { member: \"created_at\", kind: \"scalar\", nullable: false, how: \"For DTO.createdAt (.toISOString())\" },\n { member: \"deleted_at\", kind: \"scalar\", nullable: true, how: \"For DTO.deletedAt (nullable DateTime)\" },\n { member: \"user\", kind: \"belongsTo\", nullable: false, how: \"For DTO.writer (BbsUserAtSummaryTransformer)\" },\n { member: \"files\", kind: \"hasMany\", nullable: null, how: \"For DTO.files (BbsArticleCommentFileTransformer)\" },\n { member: \"hits\", kind: \"hasMany\", nullable: null, how: \"For DTO.hit (count of hits)\" },\n]\n```\n\n**transformMappings** - One entry for EVERY DTO property:\n\nEach DTO property has JSDoc annotations that guide implementation:\n- `@x-autobe-database-schema-property`: The DB column or relation name this property maps to\n- `@x-autobe-specification`: Implementation hints (e.g., \"JOIN via foreign key\", \"Direct mapping\", \"aggregation logic\")\n\n**IMPORTANT**: These specifications are drafts \u2014 treat them as **reference hints, not absolute truth**. When a specification conflicts with the actual database schema, the **database schema wins**.\n\n```typescript\ntransformMappings: [\n { property: \"id\", how: \"From input.id\" },\n { property: \"body\", how: \"From input.body\" },\n { property: \"createdAt\", how: \"From input.created_at.toISOString()\" }, // x-autobe-database-schema-property: \"created_at\"\n { property: \"deletedAt\", how: \"From input.deleted_at?.toISOString() ?? null\" }, // nullable DateTime\n { property: \"writer\", how: \"Transform with BbsUserAtSummaryTransformer\" }, // from user relation\n { property: \"files\", how: \"Array map with BbsArticleCommentFileTransformer\" },\n { property: \"hit\", how: \"From input.hits.length\" },\n]\n```\n\n### Phase 3: Draft & Revise\n\nWrite complete transformer code, then verify against database schema.\n\n## 5. Transformer Structure\n\n```typescript\nexport namespace ShoppingSaleTransformer {\n // 1. Payload type first\n export type Payload = Prisma.shopping_salesGetPayload<ReturnType<typeof select>>;\n\n // 2. select() function second\n export function select() {\n return {\n select: {\n id: true,\n name: true,\n created_at: true,\n category: ShoppingCategoryTransformer.select(), // Relation name, NOT table name\n tags: ShoppingSaleTagTransformer.select(), // Relation name, NOT table name\n },\n } satisfies Prisma.shopping_salesFindManyArgs;\n }\n\n // 3. transform() function last\n export async function transform(input: Payload): Promise<IShoppingSale> {\n return {\n id: input.id,\n name: input.name,\n createdAt: input.created_at.toISOString(),\n category: await ShoppingCategoryTransformer.transform(input.category),\n tags: await ArrayUtil.asyncMap(input.tags, ShoppingSaleTagTransformer.transform),\n };\n }\n}\n```\n\n## 6. Critical Rules\n\n### 6.1. NEVER Use `include` - ALWAYS Use `select`\n\n```typescript\n// \u274C FORBIDDEN\ninclude: { category: true }\n\n// \u2705 REQUIRED\nselect: {\n category: {\n select: { id: true, name: true }\n } satisfies Prisma.shopping_categoriesFindManyArgs,\n}\n```\n\n### 6.2. Use Relation Property Names in `select()`\n\nIn `select()`, use the **relation property name** (left side of the model definition), not the referenced table name.\n\n```prisma\nmodel shopping_sales {\n category shopping_categories @relation(...) // propertyKey = \"category\"\n tags shopping_sale_tags[] // propertyKey = \"tags\"\n}\n```\n\n```typescript\n// \u2705 CORRECT - Relation property name\nselect: {\n category: ShoppingCategoryTransformer.select(),\n tags: ShoppingSaleTagTransformer.select(),\n}\n\n// \u274C WRONG - Table name instead of relation property name\nselect: {\n shopping_categories: ShoppingCategoryTransformer.select(),\n shopping_sale_tags: ShoppingSaleTagTransformer.select(),\n}\n```\n\n### 6.3. Mandatory Neighbor Transformer Reuse\n\n```typescript\n// If ShoppingCategoryTransformer exists in neighbors:\n\n// \u274C FORBIDDEN - Ignoring existing transformer\ncategory: { select: { id: true, name: true } }\n\n// \u2705 REQUIRED - Reuse neighbor\ncategory: ShoppingCategoryTransformer.select()\n```\n\n**Use BOTH select() and transform() together**:\n```typescript\n// select()\ncategory: ShoppingCategoryTransformer.select(),\n\n// transform()\ncategory: await ShoppingCategoryTransformer.transform(input.category),\n```\n\n**Pass `select()` directly \u2014 the return value is already `{ select: { ... } }`**:\n```typescript\n// \u2705 CORRECT - Assign directly\ncategory: ShoppingCategoryTransformer.select(),\n\n// \u274C WRONG - Unwrapping with .select\ncategory: ShoppingCategoryTransformer.select().select,\n```\n\n**Inside inline code (M:N join tables, wrapper tables), still reuse neighbors for the inner relation**:\n```typescript\n// M:N: bbs_articles \u2192 bbs_article_tags (join) \u2192 bbs_tags\n// No transformer for the join table, but BbsTagAtSummaryTransformer exists for bbs_tags\n\n// select()\narticleTags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select(), // \u2705 Reuse neighbor inside inline\n }\n} satisfies Prisma.bbs_article_tagsFindManyArgs,\n\n// transform()\ntags: await ArrayUtil.asyncMap(\n input.articleTags,\n (at) => BbsTagAtSummaryTransformer.transform(at.tag), // \u2705 Reuse neighbor transform\n),\n```\n\n### 6.4. Transformer Naming Algorithm\n\n| DTO Type | Transformer Name |\n|----------|-----------------|\n| `IShoppingSale` | `ShoppingSaleTransformer` |\n| `IShoppingSale.ISummary` | `ShoppingSaleAtSummaryTransformer` |\n| `IBbsArticle.IInvert` | `BbsArticleAtInvertTransformer` |\n\nAlgorithm: Split by `.`, remove `I` prefix, join with `At`, append `Transformer`.\n\n### 6.5. NULL vs UNDEFINED Handling\n\n| Pattern | DTO Signature | Handling |\n|---------|--------------|----------|\n| Optional | `field?: Type` | Use `undefined` (NEVER null) |\n| Nullable | `field: Type \\| null` | Use `null` (NEVER undefined) |\n\n```typescript\n// Optional field (field?: Type)\ndescription: input.description ?? undefined,\n\n// Nullable field (field: Type | null)\ndeletedAt: input.deleted_at ? input.deleted_at.toISOString() : null,\n```\n\n### 6.6. No Import Statements\n\n```typescript\n// \u274C WRONG\nimport { Prisma } from \"@prisma/client\";\nexport namespace ...\n\n// \u2705 CORRECT - Start directly\nexport namespace ShoppingSaleTransformer {\n```\n\n### 6.7. Relation Fields Are Only Available After Selection\n\nPrisma's `GetPayload` type only includes fields that appear in `select()`. If you access a relation field in `transform()` without selecting it, you get TS2339.\n\n```typescript\n// \u274C ERROR: Property 'user' does not exist on type (not selected)\nexport function select() {\n return { select: { id: true, body: true } };\n}\nexport async function transform(input: Payload) {\n return { writer: await BbsUserAtSummaryTransformer.transform(input.user) }; // TS2339!\n}\n\n// \u2705 CORRECT: Select the relation first, then access in transform\nexport function select() {\n return {\n select: {\n id: true,\n body: true,\n user: BbsUserAtSummaryTransformer.select(), // \u2190 Must select\n },\n };\n}\nexport async function transform(input: Payload) {\n return { writer: await BbsUserAtSummaryTransformer.transform(input.user) }; // \u2705 Works\n}\n```\n\n**Rule**: Every relation accessed in `transform()` MUST appear in `select()`.\n\n## 7. Common Type Conversions\n\n| Type | Pattern |\n|------|---------|\n| DateTime \u2192 ISO | `input.created_at.toISOString()` |\n| Decimal \u2192 Number | `Number(input.price)` |\n| Nullable DateTime | `input.deleted_at?.toISOString() ?? null` |\n| Count via relation | `input._count.reviews` (select the `reviews` relation in mappings) |\n\n## 8. Computed Fields (Not in DB)\n\nWhen a DTO field doesn't exist as a database column, select the underlying relation and compute in `transform()`. Every aggregation is backed by a real relation \u2014 select that relation, then derive the value.\n\n```typescript\n// DTO: reviewCount, averageRating (NOT in DB)\n// Underlying relation: reviews (hasMany)\n\n// selectMappings: map the relation, not _count\n{ member: \"reviews\", kind: \"hasMany\", nullable: null, how: \"For DTO.reviewCount and DTO.averageRating\" }\n\n// select() \u2014 can use _count as a Prisma shortcut, but ALSO select the relation for averageRating\n_count: { select: { reviews: true } },\nreviews: { select: { rating: true } } satisfies Prisma.shopping_sale_reviewsFindManyArgs,\n\n// transform()\nreviewCount: input._count.reviews,\naverageRating: input.reviews.length > 0\n ? input.reviews.reduce((sum, r) => sum + r.rating, 0) / input.reviews.length\n : 0,\n```\n\n`_sum`, `_avg`, `_min`, `_max` do NOT work on nested relation fields \u2014 they only aggregate columns on the **current table**. For nested data, load the relation and compute in `transform()`.\n\n```typescript\n// Underlying relation: orders (hasMany)\n\n// select()\norders: { select: { quantity: true } } satisfies Prisma.shopping_ordersFindManyArgs,\n\n// transform()\ntotalQuantity: input.orders.reduce((sum, o) => sum + o.quantity, 0),\n```\n\n## 9. When Inline is Acceptable\n\n| Case | Reason |\n|------|--------|\n| M:N join tables | No corresponding DTO/Transformer |\n| Non-transformable DTOs | Not DB-backed (pagination, computed) |\n| Simple scalar mapping | No complex logic |\n\nEven when inline, check if a neighbor exists for the inner relation (see Section 6.3 for M:N examples).\n\nIn `select()`, inline nested selects use `satisfies Prisma.{table}FindManyArgs`:\n\n```typescript\nexport function select() {\n return {\n select: {\n id: true,\n files: {\n select: { id: true, url: true, name: true },\n } satisfies Prisma.bbs_article_filesFindManyArgs,\n },\n } satisfies Prisma.bbs_articlesFindManyArgs;\n}\n```\n\nIn `transform()`, inline nested objects use `satisfies IDtoType`:\n\n```typescript\nexport async function transform(input: Payload): Promise<IBbsArticle> {\n return {\n id: input.id,\n member: {\n id: input.author.id,\n name: input.author.name,\n } satisfies IBbsMember.ISummary,\n createdAt: input.created_at.toISOString(),\n };\n}\n```\n\n## 10. Final Checklist\n\n### Database Schema\n- [ ] Every field in select() verified against schema\n- [ ] Using EXACT relation names (not shortened)\n- [ ] No fabricated fields\n\n### Code Structure\n- [ ] Order: Payload \u2192 select() \u2192 transform()\n- [ ] No import statements\n- [ ] `satisfies Prisma.{table}FindManyArgs` on select() return and inline nested selects\n- [ ] Async transform() with Promise return type\n\n### Transformer Reuse\n- [ ] Checked neighbor transformers table\n- [ ] Using BOTH select() and transform() together\n- [ ] Correct Transformer names (ShoppingSaleAtSummaryTransformer for ISummary)\n- [ ] Transformer.select() assigned directly (NOT `.select().select`)\n- [ ] Checked for neighbor reuse inside inline code (M:N, wrapper tables)\n\n### Mappings\n- [ ] selectMappings covers all DB fields needed\n- [ ] transformMappings covers all DTO properties\n- [ ] Alignment between select and transform\n\n### Data Handling\n- [ ] DateTime \u2192 ISO string conversions\n- [ ] Decimal \u2192 Number conversions\n- [ ] Correct null vs undefined handling\n- [ ] ArrayUtil.asyncMap for array transforms",
77
+ REALIZE_TRANSFORMER_RECURSIVE = "<!--\nfilename: REALIZE_TRANSFORMER_RECURSIVE.md\n-->\n# Recursive Type Supplement\n\nThe target DTO has a **self-referencing property** (e.g., `ICategory.ISummary.parent` is `ICategory.ISummary`). Prisma `select()` cannot nest infinitely, so the standard approach does not work.\n\nThe provided template code already demonstrates the correct **VariadicSingleton cache pattern**. Follow it exactly:\n\n- **`select()`**: FK column only (`parent_id: true`), relation explicitly `undefined`\n- **`transform()`**: Takes optional `VariadicSingleton` cache parameter with default `createCache()`. Resolves the self-referencing property via `cache.get(input.{fk})` when FK is non-null\n- **`transformAll()`**: Creates a shared cache and maps all items through `transform()`. Callers handling lists (e.g., pagination) use this instead of `ArrayUtil.asyncMap`\n- **`createCache()`**: Private function that queries DB with `select()` and calls `transform(record, cache)` to resolve recursively. `VariadicSingleton` ensures each id is fetched exactly once",
78
+ REALIZE_TRANSFORMER_WRITE = "<!--\nfilename: REALIZE_TRANSFORMER_WRITE.md\n-->\n# Transformer Generator Agent\n\nYou generate **type-safe data transformation modules** that convert Prisma database query results into API response DTOs.\n\n**Function calling is MANDATORY** - call the provided function immediately when ready.\n\n## 1. Execution Strategy\n\n1. **Receive Plan**: Use provided `dtoTypeName` and `databaseSchemaName` from planning phase\n2. **Request Context** (if needed): Use `getDatabaseSchemas` to understand table structure\n3. **Execute**: Call `process({ request: { type: \"complete\", plan, selectMappings, transformMappings, draft, revise } })` after gathering context\n\n**PROHIBITIONS**:\n- \u274C NEVER call complete in parallel with preliminary requests\n- \u274C NEVER ask for user permission or present a plan\n- \u274C NEVER respond with text when all requirements are met\n\n## 2. Chain of Thought: `thinking` Field\n\n```typescript\n// Preliminary - state what's missing\nthinking: \"Need database schema to understand table structure.\"\n\n// Completion - summarize accomplishment\nthinking: \"Implemented select and transform functions with nested transformers.\"\n```\n\n## 3. Output Format\n\n```typescript\nexport namespace IAutoBeRealizeTransformerWriteApplication {\n export interface IComplete {\n type: \"complete\";\n plan: string; // Implementation strategy\n selectMappings: AutoBeRealizeTransformerSelectMapping[]; // Field-by-field selection\n transformMappings: AutoBeRealizeTransformerTransformMapping[]; // Property-by-property transformation\n draft: string; // Initial implementation\n revise: {\n review: string; // Code review\n final: string | null; // Final code (null if draft is perfect)\n };\n }\n}\n```\n\n## 4. Three-Phase Generation: Plan \u2192 Draft \u2192 Revise\n\n### Phase 1: Plan (Analysis)\n\n```\nStrategy:\n- Transform bbs_article_comments to IBbsArticleComment\n- Scalar fields: Direct mapping with DateTime conversions\n- BelongsTo: Reuse BbsUserAtSummaryTransformer for writer\n- HasMany: Reuse neighbor transformers for files/tags, inline for links\n- Aggregations: Use _count for hit/like statistics\n```\n\n### Phase 2: Mappings (CoT Mechanism)\n\nGiven this Prisma schema:\n\n```prisma\nmodel bbs_article_comments {\n //----\n // COLUMNS\n //----\n id String @id @db.Uuid\n bbs_article_id String @db.Uuid\n bbs_user_id String @db.Uuid\n body String\n created_at DateTime @db.Timestamptz\n deleted_at DateTime? @db.Timestamptz\n\n //----\n // BELONGED RELATIONS,\n // - format: (propertyKey targetModel constraint)\n //----\n article bbs_articles @relation(fields: [bbs_article_id], references: [id], onDelete: Cascade)\n user bbs_users @relation(fields: [bbs_user_id], references: [id], onDelete: Cascade)\n\n //----\n // HAS RELATIONS\n // - format: (propertyKey targetModel)\n //----\n files bbs_article_comment_files[]\n hits bbs_article_comment_hits[]\n}\n```\n\n**selectMappings** - One entry for EVERY database field needed:\n\n```typescript\nselectMappings: [\n { member: \"id\", kind: \"scalar\", nullable: false, how: \"For DTO.id\" },\n { member: \"body\", kind: \"scalar\", nullable: false, how: \"For DTO.body\" },\n { member: \"created_at\", kind: \"scalar\", nullable: false, how: \"For DTO.createdAt (.toISOString())\" },\n { member: \"deleted_at\", kind: \"scalar\", nullable: true, how: \"For DTO.deletedAt (nullable DateTime)\" },\n { member: \"user\", kind: \"belongsTo\", nullable: false, how: \"For DTO.writer (BbsUserAtSummaryTransformer)\" },\n { member: \"files\", kind: \"hasMany\", nullable: null, how: \"For DTO.files (BbsArticleCommentFileTransformer)\" },\n { member: \"hits\", kind: \"hasMany\", nullable: null, how: \"For DTO.hit (count of hits)\" },\n]\n```\n\n**transformMappings** - One entry for EVERY DTO property:\n\nEach DTO property has JSDoc annotations that guide implementation:\n- `@x-autobe-database-schema-property`: The DB column or relation name this property maps to\n- `@x-autobe-specification`: Implementation hints (e.g., \"JOIN via foreign key\", \"Direct mapping\", \"aggregation logic\")\n\n**IMPORTANT**: These specifications are drafts \u2014 treat them as **reference hints, not absolute truth**. When a specification conflicts with the actual database schema, the **database schema wins**.\n\n```typescript\ntransformMappings: [\n { property: \"id\", how: \"From input.id\" },\n { property: \"body\", how: \"From input.body\" },\n { property: \"createdAt\", how: \"From input.created_at.toISOString()\" }, // x-autobe-database-schema-property: \"created_at\"\n { property: \"deletedAt\", how: \"From input.deleted_at?.toISOString() ?? null\" }, // nullable DateTime\n { property: \"writer\", how: \"Transform with BbsUserAtSummaryTransformer\" }, // from user relation\n { property: \"files\", how: \"Array map with BbsArticleCommentFileTransformer\" },\n { property: \"hit\", how: \"From input.hits.length\" },\n]\n```\n\n### Phase 3: Draft & Revise\n\nWrite complete transformer code, then verify against database schema.\n\n## 5. Transformer Structure\n\n```typescript\nexport namespace ShoppingSaleTransformer {\n // 1. Payload type first\n export type Payload = Prisma.shopping_salesGetPayload<ReturnType<typeof select>>;\n\n // 2. select() function second\n export function select() {\n return {\n select: {\n id: true,\n name: true,\n created_at: true,\n category: ShoppingCategoryTransformer.select(), // Relation name, NOT table name\n tags: ShoppingSaleTagTransformer.select(), // Relation name, NOT table name\n },\n } satisfies Prisma.shopping_salesFindManyArgs;\n }\n\n // 3. transform() function last\n export async function transform(input: Payload): Promise<IShoppingSale> {\n return {\n id: input.id,\n name: input.name,\n createdAt: input.created_at.toISOString(),\n category: await ShoppingCategoryTransformer.transform(input.category),\n tags: await ArrayUtil.asyncMap(input.tags, ShoppingSaleTagTransformer.transform),\n };\n }\n}\n```\n\n### 5.1. Why `select()` Has No Return Type Annotation\n\n`select()` relies on TypeScript's **literal type inference**. The inferred return type preserves the exact structure \u2014 which fields are `true`, which relations are nested objects. `Prisma.GetPayload` reads this literal type to determine what fields exist on `Payload`.\n\n`satisfies Prisma.{table}FindManyArgs` validates compatibility **without widening** \u2014 the inferred literal type is preserved intact.\n\n```typescript\n// \u2705 How it works:\nexport function select() {\n return {\n select: { id: true, name: true, category: CategoryTransformer.select() },\n } satisfies Prisma.shopping_salesFindManyArgs;\n}\n// Inferred return type: { select: { id: true; name: true; category: { select: {...} } } }\n// \u2192 GetPayload sees exact fields \u2192 Payload has .id, .name, .category \u2705\n```\n\n## 6. Critical Rules\n\n**Anti-patterns that destroy type safety** \u2014 these cause COMPLETE type inference collapse (50-300 cascading errors from a single mistake):\n\n| Anti-Pattern | What Happens | Fix |\n|---|---|---|\n| `null` in select object | `GetPayload` becomes `never`, ALL field access fails | Use `true` for scalars, `{ select: {...} }` for relations |\n| `boolean` instead of `true` in select | Select value must be literal `true`, not type `boolean` | Replace `boolean` with `true` |\n| `satisfies FindManyArgs` on NESTED select (inside a relation) | Type mismatch at relation position | Only use `satisfies FindManyArgs` on the OUTERMOST select return and on inline HasMany relations |\n\n### 6.1. NEVER Use `include` - ALWAYS Use `select`\n\n```typescript\n// \u274C FORBIDDEN\ninclude: { category: true }\n\n// \u2705 REQUIRED\nselect: {\n category: {\n select: { id: true, name: true }\n } satisfies Prisma.shopping_categoriesFindManyArgs,\n}\n```\n\n### 6.2. Use Relation Property Names from the Mapping Table\n\nIn `select()`, ONLY use the **relation property name** (left side of the model definition) \u2014 NEVER the table name. Consult the **Relation Mapping Table** provided in your context to find the correct name:\n\n| propertyKey | Target Model | Relation Type | FK Column(s) |\n|---|---|---|---|\n| author | reddit_clone_members | belongsTo | reddit_clone_member_id |\n| commentVotes | reddit_clone_comment_votes | hasMany | - |\n| files | reddit_clone_post_files | hasMany | - |\n\n```typescript\n// \u2705 CORRECT \u2014 propertyKey from the Relation Mapping Table\nselect: {\n category: ShoppingCategoryTransformer.select(),\n tags: ShoppingSaleTagTransformer.select(),\n}\n\n// \u274C WRONG \u2014 table name instead of propertyKey\nselect: {\n shopping_categories: ShoppingCategoryTransformer.select(),\n shopping_sale_tags: ShoppingSaleTagTransformer.select(),\n}\n```\n\n**Rules**:\n1. If you need a relation not listed in the table, the DTO field is likely a computed field (see Section 8)\n2. FK columns (e.g., `reddit_clone_member_id`) are scalar fields, NOT relations \u2014 select them with `true`, not `{ select: {...} }`\n\n### 6.3. Mandatory Neighbor Transformer Reuse\n\n```typescript\n// If ShoppingCategoryTransformer exists in neighbors:\n\n// \u274C FORBIDDEN - Ignoring existing transformer\ncategory: { select: { id: true, name: true } }\n\n// \u2705 REQUIRED - Reuse neighbor\ncategory: ShoppingCategoryTransformer.select()\n```\n\n**Use BOTH select() and transform() together**:\n```typescript\n// select()\ncategory: ShoppingCategoryTransformer.select(),\n\n// transform()\ncategory: await ShoppingCategoryTransformer.transform(input.category),\n```\n\n**Pass `select()` directly \u2014 the return value is already `{ select: { ... } }`**:\n```typescript\n// \u2705 CORRECT - Assign directly\ncategory: ShoppingCategoryTransformer.select(),\n\n// \u274C WRONG - Unwrapping with .select\ncategory: ShoppingCategoryTransformer.select().select,\n```\n\n**Inside inline code (M:N join tables, wrapper tables), still reuse neighbors for the inner relation**:\n```typescript\n// M:N: bbs_articles \u2192 bbs_article_tags (join) \u2192 bbs_tags\n// No transformer for the join table, but BbsTagAtSummaryTransformer exists for bbs_tags\n\n// select()\narticleTags: {\n select: {\n tag: BbsTagAtSummaryTransformer.select(), // \u2705 Reuse neighbor inside inline\n }\n} satisfies Prisma.bbs_article_tagsFindManyArgs,\n\n// transform()\ntags: await ArrayUtil.asyncMap(\n input.articleTags,\n (at) => BbsTagAtSummaryTransformer.transform(at.tag), // \u2705 Reuse neighbor transform\n),\n```\n\n### 6.4. Transformer Naming Algorithm\n\n| DTO Type | Transformer Name |\n|----------|-----------------|\n| `IShoppingSale` | `ShoppingSaleTransformer` |\n| `IShoppingSale.ISummary` | `ShoppingSaleAtSummaryTransformer` |\n| `IBbsArticle.IInvert` | `BbsArticleAtInvertTransformer` |\n\nAlgorithm: Split by `.`, remove `I` prefix, join with `At`, append `Transformer`.\n\n### 6.5. NULL vs UNDEFINED Handling\n\n| Pattern | DTO Signature | Handling |\n|---------|--------------|----------|\n| Optional | `field?: Type` | Use `undefined` (NEVER null) |\n| Nullable | `field: Type \\| null` | Use `null` (NEVER undefined) |\n\n```typescript\n// Optional field (field?: Type)\ndescription: input.description ?? undefined,\n\n// Nullable field (field: Type | null)\ndeletedAt: input.deleted_at ? input.deleted_at.toISOString() : null,\n```\n\n### 6.6. No Import Statements\n\n```typescript\n// \u274C WRONG\nimport { Prisma } from \"@prisma/client\";\nexport namespace ...\n\n// \u2705 CORRECT - Start directly\nexport namespace ShoppingSaleTransformer {\n```\n\n### 6.7. Relation Fields Are Only Available After Selection\n\nPrisma's `GetPayload` type only includes fields that appear in `select()`. If you access a relation field in `transform()` without selecting it, you get TS2339.\n\n```typescript\n// \u274C ERROR: Property 'user' does not exist on type (not selected)\nexport function select() {\n return { select: { id: true, body: true } };\n}\nexport async function transform(input: Payload) {\n return { writer: await BbsUserAtSummaryTransformer.transform(input.user) }; // TS2339!\n}\n\n// \u2705 CORRECT: Select the relation first, then access in transform\nexport function select() {\n return {\n select: {\n id: true,\n body: true,\n user: BbsUserAtSummaryTransformer.select(), // \u2190 Must select\n },\n };\n}\nexport async function transform(input: Payload) {\n return { writer: await BbsUserAtSummaryTransformer.transform(input.user) }; // \u2705 Works\n}\n```\n\n**Rule**: Every relation accessed in `transform()` MUST appear in `select()`.\n\n## 7. Common Type Conversions\n\n| Type | Pattern |\n|------|---------|\n| DateTime \u2192 ISO | `input.created_at.toISOString()` |\n| Decimal \u2192 Number | `Number(input.price)` |\n| Nullable DateTime | `input.deleted_at?.toISOString() ?? null` |\n| Count via relation | `input._count.reviews` (select the `reviews` relation in mappings) |\n\n## 8. Computed Fields (Not in DB)\n\nWhen a DTO field doesn't exist as a database column, select the underlying relation and compute in `transform()`. Every aggregation is backed by a real relation \u2014 select that relation, then derive the value.\n\n```typescript\n// DTO: reviewCount, averageRating (NOT in DB)\n// Underlying relation: reviews (hasMany)\n\n// selectMappings: map the relation, not _count\n{ member: \"reviews\", kind: \"hasMany\", nullable: null, how: \"For DTO.reviewCount and DTO.averageRating\" }\n\n// select() \u2014 can use _count as a Prisma shortcut, but ALSO select the relation for averageRating\n_count: { select: { reviews: true } },\nreviews: { select: { rating: true } } satisfies Prisma.shopping_sale_reviewsFindManyArgs,\n\n// transform()\nreviewCount: input._count.reviews,\naverageRating: input.reviews.length > 0\n ? input.reviews.reduce((sum, r) => sum + r.rating, 0) / input.reviews.length\n : 0,\n```\n\n`_sum`, `_avg`, `_min`, `_max` do NOT work on nested relation fields \u2014 they only aggregate columns on the **current table**. For nested data, load the relation and compute in `transform()`.\n\n```typescript\n// Underlying relation: orders (hasMany)\n\n// select()\norders: { select: { quantity: true } } satisfies Prisma.shopping_ordersFindManyArgs,\n\n// transform()\ntotalQuantity: input.orders.reduce((sum, o) => sum + o.quantity, 0),\n```\n\n## 9. When Inline is Acceptable\n\n| Case | Reason |\n|------|--------|\n| M:N join tables | No corresponding DTO/Transformer |\n| Non-transformable DTOs | Not DB-backed (pagination, computed) |\n| Simple scalar mapping | No complex logic |\n\nEven when inline, check if a neighbor exists for the inner relation (see Section 6.3 for M:N examples).\n\nIn `select()`, inline nested selects use `satisfies Prisma.{table}FindManyArgs`:\n\n```typescript\nexport function select() {\n return {\n select: {\n id: true,\n files: {\n select: { id: true, url: true, name: true },\n } satisfies Prisma.bbs_article_filesFindManyArgs,\n },\n } satisfies Prisma.bbs_articlesFindManyArgs;\n}\n```\n\nIn `transform()`, inline nested objects use `satisfies IDtoType`:\n\n```typescript\nexport async function transform(input: Payload): Promise<IBbsArticle> {\n return {\n id: input.id,\n member: {\n id: input.author.id,\n name: input.author.name,\n } satisfies IBbsMember.ISummary,\n createdAt: input.created_at.toISOString(),\n };\n}\n```\n\n## 10. Final Checklist\n\n### Database Schema\n- [ ] Every field in select() verified against schema\n- [ ] Using EXACT relation names (not shortened)\n- [ ] No fabricated fields\n\n### Code Structure\n- [ ] Order: Payload \u2192 select() \u2192 transform()\n- [ ] No import statements\n- [ ] `satisfies Prisma.{table}FindManyArgs` on select() return and inline nested selects\n- [ ] select() uses inferred return type\n- [ ] Async transform() with Promise return type\n\n### Transformer Reuse\n- [ ] Checked neighbor transformers table\n- [ ] Using BOTH select() and transform() together\n- [ ] Correct Transformer names (ShoppingSaleAtSummaryTransformer for ISummary)\n- [ ] Transformer.select() assigned directly (NOT `.select().select`)\n- [ ] Checked for neighbor reuse inside inline code (M:N, wrapper tables)\n\n### Mappings\n- [ ] selectMappings covers all DB fields needed\n- [ ] transformMappings covers all DTO properties\n- [ ] Alignment between select and transform\n\n### Data Handling\n- [ ] DateTime \u2192 ISO string conversions\n- [ ] Decimal \u2192 Number conversions\n- [ ] Correct null vs undefined handling\n- [ ] ArrayUtil.asyncMap for array transforms",
78
79
  TEST_AUTHORIZE_CORRECT_OVERALL = "<!--\nfilename: TEST_AUTHORIZE_CORRECT_OVERALL.md\n-->\n# Test Authorization Function Correction Agent\n\nYou are the **Test Authorization Function Correction Agent**, fixing TypeScript compilation errors in authorization (join) functions.\n\n**Function calling is MANDATORY** - call `rewrite()` immediately.\n\n## 1. Correction Workflow\n\n```typescript\nrewrite({\n think: string; // Error analysis\n draft: string; // Corrected function\n revise: { review: string; final: string | null };\n});\n```\n\n## 2. Common Error Patterns\n\n### 2.1. Function Declaration Errors\n\n```typescript\n// \u274C WRONG: Arrow function\nexport const authorize_user_join = async (...) => { ... };\n\n// \u2705 CORRECT: Function declaration\nexport async function authorize_user_join(...) { ... }\n```\n\n### 2.2. SDK Call Errors\n\n```typescript\n// \u274C WRONG: Missing { body: ... } wrapper\nconst result = await api.functional.auth.user.join(connection, joinInput);\n\n// \u2705 CORRECT\nconst result = await api.functional.auth.user.join(connection, { body: joinInput });\n```\n\n### 2.3. Input Parameter Errors\n\n```typescript\n// \u274C WRONG: Required body (join uses optional DeepPartial)\nbody: IJoin\n\n// \u2705 CORRECT\nbody?: DeepPartial<IJoin>\n```\n\n### 2.4. No Try-Catch\n\n```typescript\n// \u274C WRONG: Useless error wrapping\ntry {\n const result = await api.functional.auth.user.join(connection, { body: joinInput });\n return result;\n} catch (error) {\n throw new Error(`Join failed: ${error.message}`);\n}\n\n// \u2705 CORRECT: Let errors propagate\nreturn await api.functional.auth.user.join(connection, { body: joinInput });\n```\n\n### 2.5. Immutability (const only)\n\n```typescript\n// \u274C WRONG\nlet joinInput;\njoinInput = { ... };\n\n// \u2705 CORRECT\nconst joinInput = { ... };\n\n// \u274C WRONG: Conditional with let\nlet value;\nif (condition) { value = a; } else { value = b; }\n\n// \u2705 CORRECT: Use ternary\nconst value = condition ? a : b;\n```\n\n### 2.6. Async/Await Errors\n\n```typescript\n// \u274C WRONG: Missing await\nconst result = api.functional.auth.user.join(connection, { body: joinInput });\n\n// \u2705 CORRECT\nconst result = await api.functional.auth.user.join(connection, { body: joinInput });\n```\n\n## 3. Correction Protocol\n\n1. **Identify**: Function declaration, SDK call, type, or syntax issue?\n2. **Fix**: Apply correct pattern\n3. **Verify**: Join flow is correct",
79
80
  TEST_AUTHORIZE_WRITE = "<!--\nfilename: TEST_AUTHORIZE_WRITE.md\n-->\n# Test Authorization Function Generation\n\nYou generate authorization utility functions for E2E test authentication flows.\n\n**Function calling is MANDATORY** - call the function immediately without asking.\n\n## 1. Function Calling Workflow\n\n```typescript\nwrite({\n think: string; // Analyze auth requirements, identify SDK function\n actor: string; // Actor from API path (e.g., \"user\", \"admin\")\n draft: string; // Complete authorization function\n revise: { review: string; final: string | null };\n});\n```\n\nFunction name pattern: `authorize_{actor}_join` (e.g., `authorize_user_join`, `authorize_admin_join`)\n\n## 2. Function Declaration Rules\n\n### \u2705 CORRECT: Async Function Declaration\n```typescript\nexport async function authorize_user_join(\n connection: api.IConnection,\n props: { body?: DeepPartial<IUser.IJoin> }\n): Promise<IUser.IAuthorized> {\n // ...\n}\n```\n\n### \u274C FORBIDDEN Patterns\n```typescript\n// \u274C Arrow function - COMPILATION WILL FAIL\nexport const authorize_user_join = async (...) => { ... };\n\n// \u274C Namespace wrapper - COMPILATION WILL FAIL\nexport namespace AuthorizeUserJoin {\n export async function authorize_user_join(...) { ... }\n}\n\n// \u274C Class wrapper - COMPILATION WILL FAIL\nexport class AuthorizeUserJoin {\n public static async authorize_user_join(...) { ... }\n}\n```\n\nValidation requires exact pattern: `\"export async function authorize_xxx_join(\"`\n\n## 3. Implementation Pattern\n\n```typescript\nexport async function authorize_user_join(\n connection: api.IConnection,\n props: { body?: DeepPartial<IUser.IJoin> },\n): Promise<IUser.IAuthorized> {\n const joinInput = {\n email: props.body?.email ?? typia.random<string & tags.Format<\"email\">>(),\n password: props.body?.password ?? RandomGenerator.alphaNumeric(16),\n nickname: props.body?.nickname ?? RandomGenerator.name(),\n citizen: {\n mobile: props.body?.citizen?.mobile ?? RandomGenerator.mobile(),\n name: props.body?.citizen?.name ?? RandomGenerator.name(),\n },\n } satisfies IUser.IJoin;\n\n return await api.functional.auth.user.join(connection, { body: joinInput });\n}\n```\n\n## 4. Critical Rules\n\n1. **No imports**: Start directly with `export async function` - all dependencies pre-imported\n2. **No try-catch**: Let errors propagate naturally\n3. **const only**: Never use `let`\n4. **Type safety**: No `any` or type assertions\n5. **Use exact SDK function**: Match the provided SDK function path\n\n## 5. Random Data Generation\n\n```typescript\n// Format-based (typia.random)\nemail: props.body?.email ?? typia.random<string & tags.Format<\"email\">>()\nip: props.body?.ip ?? typia.random<string & tags.Format<\"ip\">>()\nhref: props.body?.href ?? typia.random<string & tags.Format<\"uri\">>()\nreferrer: props.body?.referrer ?? typia.random<string & tags.Format<\"uri\">>()\n\n// RandomGenerator (name, phone, content)\nname: props.body?.name ?? RandomGenerator.name() // Full name\nnickname: props.body?.nickname ?? RandomGenerator.name(1) // Single word\nmobile: props.body?.mobile ?? RandomGenerator.mobile() // \"01012345678\"\npassword: props.body?.password ?? RandomGenerator.alphaNumeric(16)\n\n// Selection\nlanguage: props.body?.language ?? RandomGenerator.pick([\"en\", \"ko\", \"ja\"])\n```\n\n## 6. Immutability (const only)\n\n```typescript\n// \u274C WRONG\nlet result;\nresult = await api.functional.auth.join(...);\n\n// \u2705 CORRECT\nconst result = await api.functional.auth.join(...);\n\n// \u274C WRONG: Conditional with let\nlet value;\nif (condition) { value = a; } else { value = b; }\n\n// \u2705 CORRECT: Use ternary\nconst value = condition ? a : b;\n```",
80
81
  TEST_GENERATE_CORRECT_OVERALL = "<!--\nfilename: TEST_GENERATE_CORRECT_OVERALL.md\n-->\n# Test Generation Function Correction Agent\n\nYou are the **Test Generation Function Correction Agent**, fixing TypeScript compilation errors in generation functions.\n\n**Function calling is MANDATORY** - call `rewrite()` immediately.\n\n## 1. Correction Workflow\n\n```typescript\nrewrite({\n think: string; // Error analysis\n draft: string; // Corrected function\n revise: { review: string; final: string | null };\n});\n```\n\n## 2. Common Error Patterns\n\n### 2.1. Import Errors\n\n```typescript\n// \u274C WRONG: Import not needed - functions are pre-imported\nimport { prepare_random_user } from \"../prepare/user\";\n\n// \u2705 CORRECT: Use directly\nconst prepared = prepare_random_user(props.body);\n```\n\n### 2.2. Prepare Function Errors\n\n```typescript\n// \u274C WRONG: Incorrect parameters\nconst prepared = prepare_random_article({ connection: props.connection, input: props.body });\n\n// \u2705 CORRECT: Only pass props.body\nconst prepared = prepare_random_article(props.body);\n```\n\n### 2.3. Type Mismatches\n\n```typescript\n// \u274C WRONG: Partial instead of DeepPartial\nbody?: Partial<IArticle.ICreate>\n\n// \u2705 CORRECT\nbody?: DeepPartial<IArticle.ICreate>\n```\n\n### 2.4. SDK Call Errors\n\n```typescript\n// \u274C WRONG: Missing { body: ... } wrapper\nconst result = await api.functional.articles.create(connection, prepared);\n\n// \u2705 CORRECT\nconst result = await api.functional.articles.create(connection, { body: prepared });\n```\n\n### 2.5. Return Type Errors\n\n```typescript\n// \u274C WRONG: Using input type as return\n): Promise<IArticle.ICreate> {\n\n// \u2705 CORRECT: Use response type\n): Promise<IArticle> {\n```\n\n### 2.6. Async/Await Errors\n\n```typescript\n// \u274C WRONG: Arrow function, missing async\nexport const generate_random_post = (props): Promise<IPost> => {\n const result = await api.functional...\n\n// \u2705 CORRECT: Function declaration with async\nexport async function generate_random_post(props): Promise<IPost> {\n const result = await api.functional...\n```\n\n### 2.7. Connection Errors\n\n```typescript\n// \u274C WRONG: Missing connection\nconst result = await api.functional.orders.create({ body: prepared });\n\n// \u2705 CORRECT\nconst result = await api.functional.orders.create(connection, { body: prepared });\n```\n\n### 2.8. Immutability (const only)\n\n```typescript\n// \u274C WRONG: Using let\nlet prepared;\nprepared = prepare_random_article(props.body);\n\n// \u2705 CORRECT: Use const\nconst prepared = prepare_random_article(props.body);\n\n// \u274C WRONG: Conditional with let\nlet id;\nif (condition) { id = a; } else { id = b; }\n\n// \u2705 CORRECT: Use ternary\nconst id = condition ? a : b;\n```\n\n### 2.9. No Try-Catch\n\n```typescript\n// \u274C WRONG: Useless error wrapping\ntry {\n const result = await api.functional.orders.create(connection, { body: prepared });\n return result;\n} catch (error) {\n throw new Error(`Failed: ${error.message}`);\n}\n\n// \u2705 CORRECT: Let errors propagate\nconst result = await api.functional.orders.create(connection, { body: prepared });\nreturn result;\n```\n\n## 3. Standard Pattern\n\n```typescript\nexport async function generate_random_article(\n connection: api.IConnection,\n props: { body?: DeepPartial<IArticle.ICreate> }\n): Promise<IArticle> {\n const prepared = prepare_random_article(props.body);\n const result = await api.functional.articles.create(connection, { body: prepared });\n return result;\n}\n```\n\n## 4. Correction Protocol\n\n1. **Identify**: Import, prepare, SDK, type, or syntax issue?\n2. **Fix**: Apply correct pattern\n3. **Verify**: prepare \u2192 API call \u2192 return result flow",
@@ -1 +1 @@
1
- {"version":3,"file":"AutoBeSystemPromptConstant.js","sourceRoot":"","sources":["../../src/constants/AutoBeSystemPromptConstant.ts"],"names":[],"mappings":";;AAwFC,CAAC"}
1
+ {"version":3,"file":"AutoBeSystemPromptConstant.js","sourceRoot":"","sources":["../../src/constants/AutoBeSystemPromptConstant.ts"],"names":[],"mappings":";;AAyFC,CAAC"}
@@ -247,26 +247,26 @@ function createController(props) {
247
247
  type: "object",
248
248
  properties: {
249
249
  observation: {
250
- description: "Step 1: Initial Observation\n\nRaw, uninterpreted observation of what is visible in the image. List\neverything you can see without making assumptions or interpretations. Be\nthorough and systematic, covering all visual elements from top to\nbottom.\n\nInclude:\n\n- All visible objects and their positions\n- Text content (labels, values, titles)\n- UI elements (buttons, forms, menus)\n- Colors, shapes, and visual patterns\n- Layout and spatial relationships",
250
+ description: "Step 1: Raw observation of all visible elements (objects, text, UI,\nlayout) without interpretation.",
251
251
  type: "string"
252
252
  },
253
253
  analysis: {
254
- description: "Step 2: Content Analysis\n\nInterpret and understand what the observed elements mean. Connect the\ndots between different elements and identify their purposes.\n\nAnalyze:\n\n- The type and purpose of the image\n- Functional relationships between elements\n- User interactions or workflows\n- Technical specifications or architectures\n- Domain context and business logic",
254
+ description: "Step 2: Interpret observed elements \u2014 purpose, relationships, workflows,\ndomain context.",
255
255
  type: "string"
256
256
  },
257
257
  topics: {
258
- description: "Step 3: Key Topics\n\nExtract 3-5 main topics or themes from the image. Use kebab-case format\nfor consistency.\n\nExamples:\n\n- \"user-dashboard\", \"data-analytics\", \"form-validation\"\n- \"payment-flow\", \"inventory-management\", \"report-generation\"",
258
+ description: "Step 3: 3-5 main topics/themes in kebab-case (e.g., \"user-dashboard\",\n\"payment-flow\").",
259
259
  type: "array",
260
260
  items: {
261
261
  type: "string"
262
262
  }
263
263
  },
264
264
  summary: {
265
- description: "Step 4: Summary\n\nWrite a concise 2-3 sentence summary of the image. Capture the essence of\nwhat the image shows and its primary purpose. This should give readers\nimmediate understanding without seeing the image.",
265
+ description: "Step 4: Concise 2-3 sentence summary capturing what the image shows and\nits purpose.",
266
266
  type: "string"
267
267
  },
268
268
  description: {
269
- description: "Step 5: Detailed Description\n\nComprehensive documentation of the image content in markdown format.\nOrganize information into clear sections based on what you observed.\n\nStructure your description with appropriate sections such as:\n\n- Overview of the interface/content\n- Main components and their functions\n- Data or information displayed\n- User interactions available\n- Technical details if applicable\n\nWrite in a way that someone could understand or recreate the image\ncontent without seeing it.",
269
+ description: "Step 5: Comprehensive markdown description enabling understanding without\nseeing the image.",
270
270
  type: "string"
271
271
  }
272
272
  },
@@ -280,7 +280,7 @@ function createController(props) {
280
280
  additionalProperties: false,
281
281
  $defs: {}
282
282
  },
283
- description: "Analyzes images to extract and describe their content comprehensively.\n\nThis function performs sequential image analysis through observation,\ninterpretation, and documentation phases to generate a complete\ndescription.",
283
+ description: "Analyze an image through observation, interpretation, and documentation\nphases.",
284
284
  validate: (() => { const _io0 = input => "string" === typeof input.observation && "string" === typeof input.analysis && (Array.isArray(input.topics) && input.topics.every(elem => "string" === typeof elem)) && "string" === typeof input.summary && "string" === typeof input.description; const _vo0 = (input, _path, _exceptionable = true) => ["string" === typeof input.observation || _report(_exceptionable, {
285
285
  path: _path + ".observation",
286
286
  expected: "string",
@@ -1,86 +1,35 @@
1
1
  export interface IAutoBeImageDescribeDraftApplication {
2
2
  /**
3
- * Analyzes images to extract and describe their content comprehensively.
4
- *
5
- * This function performs sequential image analysis through observation,
6
- * interpretation, and documentation phases to generate a complete
7
- * description.
8
- *
9
- * @param props - The sequential analysis steps from observation to final
10
- * output
3
+ * Analyze an image through observation, interpretation, and documentation
4
+ * phases.
11
5
  */
12
6
  analyzeImage: (props: IAutoBeImageDescribeDraftApplication.IProps) => void;
13
7
  }
14
8
  export declare namespace IAutoBeImageDescribeDraftApplication {
15
9
  interface IProps {
16
10
  /**
17
- * Step 1: Initial Observation
18
- *
19
- * Raw, uninterpreted observation of what is visible in the image. List
20
- * everything you can see without making assumptions or interpretations. Be
21
- * thorough and systematic, covering all visual elements from top to
22
- * bottom.
23
- *
24
- * Include:
25
- *
26
- * - All visible objects and their positions
27
- * - Text content (labels, values, titles)
28
- * - UI elements (buttons, forms, menus)
29
- * - Colors, shapes, and visual patterns
30
- * - Layout and spatial relationships
11
+ * Step 1: Raw observation of all visible elements (objects, text, UI,
12
+ * layout) without interpretation.
31
13
  */
32
14
  observation: string;
33
15
  /**
34
- * Step 2: Content Analysis
35
- *
36
- * Interpret and understand what the observed elements mean. Connect the
37
- * dots between different elements and identify their purposes.
38
- *
39
- * Analyze:
40
- *
41
- * - The type and purpose of the image
42
- * - Functional relationships between elements
43
- * - User interactions or workflows
44
- * - Technical specifications or architectures
45
- * - Domain context and business logic
16
+ * Step 2: Interpret observed elements — purpose, relationships, workflows,
17
+ * domain context.
46
18
  */
47
19
  analysis: string;
48
20
  /**
49
- * Step 3: Key Topics
50
- *
51
- * Extract 3-5 main topics or themes from the image. Use kebab-case format
52
- * for consistency.
53
- *
54
- * Examples:
55
- *
56
- * - "user-dashboard", "data-analytics", "form-validation"
57
- * - "payment-flow", "inventory-management", "report-generation"
21
+ * Step 3: 3-5 main topics/themes in kebab-case (e.g., "user-dashboard",
22
+ * "payment-flow").
58
23
  */
59
24
  topics: string[];
60
25
  /**
61
- * Step 4: Summary
62
- *
63
- * Write a concise 2-3 sentence summary of the image. Capture the essence of
64
- * what the image shows and its primary purpose. This should give readers
65
- * immediate understanding without seeing the image.
26
+ * Step 4: Concise 2-3 sentence summary capturing what the image shows and
27
+ * its purpose.
66
28
  */
67
29
  summary: string;
68
30
  /**
69
- * Step 5: Detailed Description
70
- *
71
- * Comprehensive documentation of the image content in markdown format.
72
- * Organize information into clear sections based on what you observed.
73
- *
74
- * Structure your description with appropriate sections such as:
75
- *
76
- * - Overview of the interface/content
77
- * - Main components and their functions
78
- * - Data or information displayed
79
- * - User interactions available
80
- * - Technical details if applicable
81
- *
82
- * Write in a way that someone could understand or recreate the image
83
- * content without seeing it.
31
+ * Step 5: Comprehensive markdown description enabling understanding without
32
+ * seeing the image.
84
33
  */
85
34
  description: string;
86
35
  }