add-service.json 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. {
  2. "version": "3.16",
  3. "name": "AddService",
  4. "description": "Add a new backend service domain to an existing project. Creates service .vs file, updates database schema if needed, and updates ProjectMeta.",
  5. "sectionMerge": true,
  6. "registry": {
  7. "params": [
  8. "serviceDescription(STRING)",
  9. "currentMeta(OBJECT)"
  10. ],
  11. "services": [],
  12. "apis": [],
  13. "components": [],
  14. "vars": [
  15. "$updatedMeta(OBJECT)",
  16. "$updatedMetaStr(STRING)",
  17. "$servicePlan(OBJECT)",
  18. "$dbChanges(OBJECT)"
  19. ],
  20. "files": {
  21. "inputs": [
  22. ".vl-code/ProjectMeta.json",
  23. "Database/*"
  24. ],
  25. "artifacts": [
  26. ".vl-code/ProjectMeta.json",
  27. "Database/*",
  28. "Services/*"
  29. ]
  30. },
  31. "docs": {
  32. "1": "VL Syntax Rules",
  33. "100": "Agent-GenDatabase-Prompt",
  34. "102": "Agent-GenServiceDomain-Prompt"
  35. }
  36. },
  37. "steps": [
  38. {
  39. "id": "LLM_010_PlanService",
  40. "meta": {
  41. "title": "1. Plan new service structure"
  42. },
  43. "in": {
  44. "docs": [
  45. "1"
  46. ],
  47. "max_tokens": 32768,
  48. "messages": [
  49. {
  50. "role": "user",
  51. "content": "Current ProjectMeta:"
  52. },
  53. {
  54. "role": "user",
  55. "content": "=currentMeta"
  56. },
  57. {
  58. "role": "user",
  59. "content": "New service request:"
  60. },
  61. {
  62. "role": "user",
  63. "content": "=serviceDescription"
  64. },
  65. {
  66. "role": "user",
  67. "content": "Plan the new service domain. Determine: 1) Service name and methods (CRUD + custom), 2) Database table changes needed (new tables or new columns), 3) API routes. Return JSON with: service(OBJECT with name, methods[], routes[]), dbChanges(OBJECT with newTables[], modifiedTables[]), updatedMeta(full updated ProjectMeta)."
  68. }
  69. ],
  70. "output_config": {
  71. "format": {
  72. "type": "json_object"
  73. }
  74. }
  75. },
  76. "out": {
  77. "$servicePlan": "=_result.service",
  78. "$dbChanges": "=_result.dbChanges",
  79. "$updatedMeta": "=_result.updatedMeta",
  80. "$updatedMetaStr": "=_result.updatedMeta",
  81. "/.vl-code/ProjectMeta.json": "=_result.updatedMeta"
  82. },
  83. "next": "Branch_NeedDBUpdate"
  84. },
  85. {
  86. "id": "Branch_NeedDBUpdate",
  87. "meta": {
  88. "title": "2. Check if DB update needed"
  89. },
  90. "cases": [
  91. {
  92. "condition": "=$dbChanges.newTables.length > 0 || =$dbChanges.modifiedTables.length > 0",
  93. "next": "LLM_020_UpdateDB"
  94. }
  95. ],
  96. "default": "LLM_030_GenService"
  97. },
  98. {
  99. "id": "LLM_020_UpdateDB",
  100. "meta": {
  101. "title": "2a. Update database schema"
  102. },
  103. "in": {
  104. "docs": [
  105. "1",
  106. "100"
  107. ],
  108. "max_tokens": 32768,
  109. "stream": true,
  110. "readFiles": [
  111. "=currentMeta.database.file || ('Database/' + currentMeta.projectName + '.vdb')"
  112. ],
  113. "messages": [
  114. {
  115. "role": "user",
  116. "content": "ProjectMeta:"
  117. },
  118. {
  119. "role": "user",
  120. "content": "=$updatedMetaStr"
  121. },
  122. {
  123. "role": "user",
  124. "content": "Database changes needed:"
  125. },
  126. {
  127. "role": "user",
  128. "content": "=$dbChanges"
  129. },
  130. {
  131. "role": "user",
  132. "content": "Update the .vdb database schema file. Use sectionMerge — only add/modify the affected tables, preserve all existing tables.\n\nIMPORTANT: The file MUST start with '// VL_VERSION:3.7' as the first non-empty line."
  133. }
  134. ]
  135. },
  136. "out": {
  137. "/{currentMeta.database.file || ('Database/' + currentMeta.projectName + '.vdb')}": "=_result"
  138. },
  139. "next": "LLM_030_GenService"
  140. },
  141. {
  142. "id": "LLM_030_GenService",
  143. "meta": {
  144. "title": "3. Generate service domain file"
  145. },
  146. "in": {
  147. "docs": [
  148. "1",
  149. "102"
  150. ],
  151. "max_tokens": 32768,
  152. "stream": true,
  153. "messages": [
  154. {
  155. "role": "user",
  156. "content": "ProjectMeta:"
  157. },
  158. {
  159. "role": "user",
  160. "content": "=$updatedMetaStr"
  161. },
  162. {
  163. "role": "user",
  164. "content": "Generate the .vs service domain file for:"
  165. },
  166. {
  167. "role": "user",
  168. "content": "=$servicePlan\n\nIMPORTANT: The file MUST start with '// VL_VERSION:3.7' as the first non-empty line.\n\nBackend query-safety rules: build filter arrays incrementally. If an optional STRING/INT filter is empty, null, 0, or -1 (used as 'all'), DO NOT include that condition in select/count queries. Never generate conditions like [\"field\",\"*eq\",\"\"] or [\"field\",\"*contains\",\"\"] for optional filters. Prefer `_conditions([]) = []` plus IF checks and `_conditions.push(...)`."
  169. }
  170. ]
  171. },
  172. "out": {
  173. "/{$servicePlan.filePath}": "=_result"
  174. },
  175. "next": "Stop_Done"
  176. },
  177. {
  178. "id": "Stop_Done",
  179. "meta": {
  180. "title": "Done — New service added"
  181. }
  182. }
  183. ]
  184. }