@tailor-platform/sdk 2.0.0-next.0 → 2.0.0-next.10

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 (497) hide show
  1. package/CHANGELOG.md +972 -0
  2. package/README.md +9 -9
  3. package/agent-skills/{tailor-sdk → tailor}/SKILL.md +3 -1
  4. package/dist/aigateway-DR4Kwuik.mjs +9 -0
  5. package/dist/aigateway-DR4Kwuik.mjs.map +1 -0
  6. package/dist/application-DArFTTJ9.mjs +3 -0
  7. package/dist/{application-76hhIhnJ.mjs → application-miwiXtB4.mjs} +1963 -1953
  8. package/dist/application-miwiXtB4.mjs.map +1 -0
  9. package/dist/{assert-CKfwrmCV.mjs → assert-DBxo8jPo.mjs} +1 -2
  10. package/dist/{assert-CKfwrmCV.mjs.map → assert-DBxo8jPo.mjs.map} +1 -1
  11. package/dist/authconnection-CZvi9ANm.mjs +9 -0
  12. package/dist/authconnection-CZvi9ANm.mjs.map +1 -0
  13. package/dist/{brand-DlnJ375c.mjs → brand-Eo4pLXPJ.mjs} +1 -2
  14. package/dist/brand-Eo4pLXPJ.mjs.map +1 -0
  15. package/dist/cli/cache/bundle-cache.d.mts +2 -0
  16. package/dist/cli/cache/store.d.mts +1 -0
  17. package/dist/cli/cache/types.d.mts +1 -0
  18. package/dist/cli/commands/api/api-call.d.mts +19 -0
  19. package/dist/cli/commands/api/index.d.mts +4 -0
  20. package/dist/cli/commands/deploy/aigateway.d.mts +5 -0
  21. package/dist/cli/commands/deploy/application.d.mts +7 -0
  22. package/dist/cli/commands/deploy/apply-phases.d.mts +14 -0
  23. package/dist/cli/commands/deploy/auth.d.mts +5 -0
  24. package/dist/cli/commands/deploy/deploy.d.mts +34 -0
  25. package/dist/cli/commands/deploy/executor.d.mts +7 -0
  26. package/dist/cli/commands/deploy/function-registry-types.d.mts +12 -0
  27. package/dist/cli/commands/deploy/function-registry.d.mts +7 -0
  28. package/dist/cli/commands/deploy/idp.d.mts +5 -0
  29. package/dist/cli/commands/deploy/resolver.d.mts +5 -0
  30. package/dist/cli/commands/deploy/secret-manager.d.mts +5 -0
  31. package/dist/cli/commands/deploy/staticwebsite.d.mts +5 -0
  32. package/dist/cli/commands/deploy/tailordb/index.d.mts +9 -0
  33. package/dist/cli/commands/deploy/types.d.mts +3 -0
  34. package/dist/cli/commands/deploy/workflow-execution-policy.d.mts +3 -0
  35. package/dist/cli/commands/deploy/workflow.d.mts +4 -0
  36. package/dist/cli/commands/executor/get.d.mts +28 -0
  37. package/dist/cli/commands/executor/jobs.d.mts +122 -0
  38. package/dist/cli/commands/executor/list.d.mts +18 -0
  39. package/dist/cli/commands/executor/transform.d.mts +42 -0
  40. package/dist/cli/commands/executor/trigger.d.mts +40 -0
  41. package/dist/cli/commands/executor/webhook.d.mts +21 -0
  42. package/dist/cli/commands/function/get.d.mts +17 -0
  43. package/dist/cli/commands/function/list.d.mts +21 -0
  44. package/dist/cli/commands/function/transform.d.mts +12 -0
  45. package/dist/cli/commands/generate/options.d.mts +6 -0
  46. package/dist/cli/commands/generate/seed/bundler.d.mts +26 -0
  47. package/dist/cli/commands/generate/service.d.mts +15 -0
  48. package/dist/cli/commands/machineuser/list.d.mts +26 -0
  49. package/dist/cli/commands/machineuser/token.d.mts +21 -0
  50. package/dist/cli/commands/oauth2client/get.d.mts +17 -0
  51. package/dist/cli/commands/oauth2client/list.d.mts +19 -0
  52. package/dist/cli/commands/oauth2client/transform.d.mts +21 -0
  53. package/dist/cli/commands/organization/folder/create.d.mts +17 -0
  54. package/dist/cli/commands/organization/folder/delete.d.mts +15 -0
  55. package/dist/cli/commands/organization/folder/get.d.mts +16 -0
  56. package/dist/cli/commands/organization/folder/list.d.mts +21 -0
  57. package/dist/cli/commands/organization/folder/update.d.mts +17 -0
  58. package/dist/cli/commands/organization/get.d.mts +15 -0
  59. package/dist/cli/commands/organization/list.d.mts +14 -0
  60. package/dist/cli/commands/organization/transform.d.mts +29 -0
  61. package/dist/cli/commands/organization/tree.d.mts +24 -0
  62. package/dist/cli/commands/organization/update.d.mts +16 -0
  63. package/dist/cli/commands/remove.d.mts +15 -0
  64. package/dist/cli/commands/show.d.mts +39 -0
  65. package/dist/cli/commands/staticwebsite/deploy.d.mts +19 -0
  66. package/dist/cli/commands/tailordb/migrate/bundler.d.mts +29 -0
  67. package/dist/cli/commands/tailordb/migrate/config.d.mts +18 -0
  68. package/dist/cli/commands/tailordb/migrate/diff-calculator.d.mts +246 -0
  69. package/dist/cli/commands/tailordb/migrate/generate.d.mts +16 -0
  70. package/dist/cli/commands/tailordb/migrate/snapshot-types.d.mts +208 -0
  71. package/dist/cli/commands/tailordb/migrate/snapshot.d.mts +98 -0
  72. package/dist/cli/commands/tailordb/migrate/types.d.mts +7 -0
  73. package/dist/cli/commands/tailordb/truncate.d.mts +18 -0
  74. package/dist/cli/commands/workflow/executions.d.mts +74 -0
  75. package/dist/cli/commands/workflow/get.d.mts +30 -0
  76. package/dist/cli/commands/workflow/list.d.mts +18 -0
  77. package/dist/cli/commands/workflow/resume.d.mts +22 -0
  78. package/dist/cli/commands/workflow/start.d.mts +60 -0
  79. package/dist/cli/commands/workflow/status.d.mts +6 -0
  80. package/dist/cli/commands/workflow/transform.d.mts +34 -0
  81. package/dist/cli/commands/workflow/wait.d.mts +15 -0
  82. package/dist/cli/commands/workflow/waiter.d.mts +23 -0
  83. package/dist/cli/commands/workspace/app/health.d.mts +17 -0
  84. package/dist/cli/commands/workspace/app/list.d.mts +21 -0
  85. package/dist/cli/commands/workspace/app/transform.d.mts +20 -0
  86. package/dist/cli/commands/workspace/create.d.mts +27 -0
  87. package/dist/cli/commands/workspace/delete.d.mts +14 -0
  88. package/dist/cli/commands/workspace/get.d.mts +16 -0
  89. package/dist/cli/commands/workspace/list.d.mts +17 -0
  90. package/dist/cli/commands/workspace/restore.d.mts +14 -0
  91. package/dist/cli/commands/workspace/transform.d.mts +20 -0
  92. package/dist/cli/commands/workspace/user/invite.d.mts +21 -0
  93. package/dist/cli/commands/workspace/user/list.d.mts +21 -0
  94. package/dist/cli/commands/workspace/user/remove.d.mts +16 -0
  95. package/dist/cli/commands/workspace/user/transform.d.mts +9 -0
  96. package/dist/cli/commands/workspace/user/update.d.mts +21 -0
  97. package/dist/cli/index.mjs +12 -5534
  98. package/dist/cli/lib.d.mts +90 -21180
  99. package/dist/cli/lib.mjs +157 -16
  100. package/dist/cli/lib.mjs.map +1 -1
  101. package/dist/cli/main.d.mts +23 -0
  102. package/dist/cli/main.mjs +6583 -0
  103. package/dist/cli/main.mjs.map +1 -0
  104. package/dist/cli/query/index.d.mts +38 -0
  105. package/dist/cli/services/application.d.mts +12 -0
  106. package/dist/cli/services/auth/service.d.mts +3 -0
  107. package/dist/cli/services/executor/service.d.mts +1 -0
  108. package/dist/cli/services/http-adapter/bundler.d.mts +3 -0
  109. package/dist/cli/services/http-adapter/service.d.mts +2 -0
  110. package/dist/cli/services/resolver/service.d.mts +1 -0
  111. package/dist/cli/services/tailordb/service.d.mts +3 -0
  112. package/dist/cli/services/workflow/bundler.d.mts +2 -0
  113. package/dist/cli/services/workflow/service.d.mts +1 -0
  114. package/dist/cli/shared/args.d.mts +13 -0
  115. package/dist/cli/shared/client.d.mts +1273 -0
  116. package/dist/cli/shared/config-loader.d.mts +25 -0
  117. package/dist/cli/shared/context.d.mts +29 -0
  118. package/dist/cli/shared/error-json.d.mts +23 -0
  119. package/dist/cli/shared/readonly-guard.d.mts +25 -0
  120. package/dist/cli/shared/script-executor.d.mts +77 -0
  121. package/dist/cli/shared/seed-chunker.d.mts +45 -0
  122. package/dist/cli/shared/seed-context.d.mts +49 -0
  123. package/dist/cli/shared/tailordb-namespaces.d.mts +40 -0
  124. package/dist/cli/shared/type-generator.d.mts +19 -0
  125. package/dist/cli/shared/workspace-name.d.mts +1 -0
  126. package/dist/cli/ts-hook.d.mts +4 -0
  127. package/dist/cli/ts-hook.mjs +333 -0
  128. package/dist/completion/zsh-worker.zsh +4223 -0
  129. package/dist/configure/config/index.d.mts +20 -0
  130. package/dist/configure/config/types.d.mts +111 -0
  131. package/dist/configure/index.d.mts +135 -7
  132. package/dist/configure/index.mjs +409 -56
  133. package/dist/configure/index.mjs.map +1 -1
  134. package/dist/configure/services/aigateway/index.d.mts +16 -0
  135. package/dist/configure/services/aigateway/types.d.mts +10 -0
  136. package/dist/configure/services/auth/index.d.mts +33 -0
  137. package/dist/configure/services/auth/types.d.mts +168 -0
  138. package/dist/configure/services/executor/executor.d.mts +70 -0
  139. package/dist/configure/services/executor/index.d.mts +9 -0
  140. package/dist/configure/services/executor/operation.d.mts +50 -0
  141. package/dist/configure/services/executor/trigger/event.d.mts +271 -0
  142. package/dist/configure/services/executor/trigger/index.d.mts +7 -0
  143. package/dist/configure/services/executor/trigger/schedule.d.mts +24 -0
  144. package/dist/configure/services/executor/trigger/webhook.d.mts +43 -0
  145. package/dist/configure/services/executor/types.d.mts +2 -0
  146. package/dist/configure/services/http-adapter/http-adapter.d.mts +124 -0
  147. package/dist/configure/services/http-adapter/index.d.mts +2 -0
  148. package/dist/configure/services/idp/index.d.mts +60 -0
  149. package/dist/configure/services/idp/permission.d.mts +64 -0
  150. package/dist/configure/services/idp/types.d.mts +23 -0
  151. package/dist/configure/services/index.d.mts +40 -0
  152. package/dist/configure/services/resolver/index.d.mts +6 -0
  153. package/dist/configure/services/resolver/permission.d.mts +64 -0
  154. package/dist/configure/services/resolver/resolver.d.mts +88 -0
  155. package/dist/configure/services/resolver/types.d.mts +5 -0
  156. package/dist/configure/services/secrets/index.d.mts +37 -0
  157. package/dist/configure/services/secrets/types.d.mts +10 -0
  158. package/dist/configure/services/staticwebsite/index.d.mts +18 -0
  159. package/dist/configure/services/staticwebsite/types.d.mts +10 -0
  160. package/dist/configure/services/tailordb/index.d.mts +4 -0
  161. package/dist/configure/services/tailordb/permission.d.mts +103 -0
  162. package/dist/configure/services/tailordb/schema.d.mts +486 -0
  163. package/dist/configure/services/tailordb/types.d.mts +198 -0
  164. package/dist/configure/services/workflow/execution-policy.d.mts +70 -0
  165. package/dist/configure/services/workflow/execution-policy.types.d.mts +103 -0
  166. package/dist/configure/services/workflow/index.d.mts +9 -0
  167. package/dist/configure/services/workflow/job.d.mts +83 -0
  168. package/dist/configure/services/workflow/types.d.mts +2 -0
  169. package/dist/configure/services/workflow/wait-point.d.mts +72 -0
  170. package/dist/configure/services/workflow/workflow.d.mts +56 -0
  171. package/dist/configure/types/aigateway-name.d.mts +12 -0
  172. package/dist/configure/types/connection-name.d.mts +12 -0
  173. package/dist/configure/types/field.d.mts +8 -0
  174. package/dist/configure/types/field.types.d.mts +70 -0
  175. package/dist/configure/types/idp-name.d.mts +12 -0
  176. package/dist/configure/types/index.d.mts +5 -0
  177. package/dist/configure/types/machine-user.d.mts +2 -0
  178. package/dist/configure/types/permission-operand.types.d.mts +20 -0
  179. package/dist/configure/types/type.d.mts +73 -0
  180. package/dist/{context-s0lxhu8_.mjs → context-DYQVYWqZ.mjs} +4 -6
  181. package/dist/context-DYQVYWqZ.mjs.map +1 -0
  182. package/dist/{crashreport-BhD0y14F.mjs → crashreport-B5LqCTfF.mjs} +25 -17
  183. package/dist/{crashreport-BhD0y14F.mjs.map → crashreport-B5LqCTfF.mjs.map} +1 -1
  184. package/dist/{crashreport-D1wKBJ8N.mjs → crashreport-eI7ty7ok.mjs} +1 -2
  185. package/dist/{enum-constants-C7DaWeQo.mjs → enum-constants-j9QBF0cB.mjs} +1 -2
  186. package/dist/enum-constants-j9QBF0cB.mjs.map +1 -0
  187. package/dist/{errors-EsY4XO6O.mjs → errors-D7583Zz7.mjs} +18 -3
  188. package/dist/errors-D7583Zz7.mjs.map +1 -0
  189. package/dist/{file-B58Dm-2P.mjs → file-BUcmVIH2.mjs} +12 -23
  190. package/dist/file-BUcmVIH2.mjs.map +1 -0
  191. package/dist/{file-utils-BHPxPXmn.mjs → file-utils-yEiIS4nJ.mjs} +7 -8
  192. package/dist/file-utils-yEiIS4nJ.mjs.map +1 -0
  193. package/dist/{globals-ByrCoDip.mjs → globals-DQotNuwK.mjs} +32 -6
  194. package/dist/globals-DQotNuwK.mjs.map +1 -0
  195. package/dist/iconv-QWaZh0TT.mjs +38 -0
  196. package/dist/iconv-QWaZh0TT.mjs.map +1 -0
  197. package/dist/{idp-Ch95ag8h.mjs → idp-RA_swu-h.mjs} +12 -6
  198. package/dist/idp-RA_swu-h.mjs.map +1 -0
  199. package/dist/{interceptor-DOqRkCya.mjs → interceptor-e33JtsC-.mjs} +2 -3
  200. package/dist/interceptor-e33JtsC-.mjs.map +1 -0
  201. package/dist/kysely/index.d.mts +5 -7
  202. package/dist/kysely/index.mjs +0 -1
  203. package/dist/kysely/index.mjs.map +1 -1
  204. package/dist/{kysely-type-D1e0Vwkd.mjs → kysely-type-DqIRgDYR.mjs} +6 -6
  205. package/dist/kysely-type-DqIRgDYR.mjs.map +1 -0
  206. package/dist/logger-BtX0suGY.mjs +48 -0
  207. package/dist/logger-BtX0suGY.mjs.map +1 -0
  208. package/dist/logger-CXQq9YIp.mjs +317 -0
  209. package/dist/logger-CXQq9YIp.mjs.map +1 -0
  210. package/dist/{multiline-Cf9ODpr1.mjs → multiline-sfHpTZZK.mjs} +1 -2
  211. package/dist/{multiline-Cf9ODpr1.mjs.map → multiline-sfHpTZZK.mjs.map} +1 -1
  212. package/dist/{package-json-DcQApfPQ.mjs → package-json-8b0O9TlX.mjs} +1 -2
  213. package/dist/{package-json-DcQApfPQ.mjs.map → package-json-8b0O9TlX.mjs.map} +1 -1
  214. package/dist/package-json-Cv2Z-TqQ.mjs +3 -0
  215. package/dist/parser/service/auth/index.d.mts +1 -0
  216. package/dist/parser/service/auth/schema.d.mts +3 -0
  217. package/dist/parser/service/http-adapter/index.d.mts +1 -0
  218. package/dist/parser/service/http-adapter/schema.d.mts +1 -0
  219. package/dist/parser/service/idp/types.d.mts +5 -0
  220. package/dist/parser/service/tailordb/type-source.d.mts +10 -0
  221. package/dist/parser/service/tailordb/types.d.mts +131 -0
  222. package/dist/platform-serialize-RoRtBS0v.mjs +46 -0
  223. package/dist/platform-serialize-RoRtBS0v.mjs.map +1 -0
  224. package/dist/plugin/builtin/enum-constants/index.d.mts +15 -1
  225. package/dist/plugin/builtin/enum-constants/index.mjs +1 -2
  226. package/dist/plugin/builtin/file-utils/index.d.mts +15 -1
  227. package/dist/plugin/builtin/file-utils/index.mjs +1 -2
  228. package/dist/plugin/builtin/kysely-type/index.d.mts +15 -1
  229. package/dist/plugin/builtin/kysely-type/index.mjs +1 -2
  230. package/dist/plugin/builtin/seed/index.d.mts +46 -2
  231. package/dist/plugin/builtin/seed/index.mjs +1 -2
  232. package/dist/plugin/builtin/seed/seed-type-processor.d.mts +19 -0
  233. package/dist/plugin/builtin/seed/types.d.mts +2 -0
  234. package/dist/plugin/get-generated-type.d.mts +16 -0
  235. package/dist/plugin/index.d.mts +3 -119
  236. package/dist/plugin/index.mjs +1 -2
  237. package/dist/plugin/index.mjs.map +1 -1
  238. package/dist/plugin/manager.d.mts +2 -0
  239. package/dist/plugin/types.d.mts +242 -0
  240. package/dist/plugin/with-context.d.mts +101 -0
  241. package/dist/{runtime-C7qTBDD2.mjs → register-ts-hook-BAHMwxfG.mjs} +12374 -8672
  242. package/dist/register-ts-hook-BAHMwxfG.mjs.map +1 -0
  243. package/dist/registry-BIGVUrMB.mjs +54 -0
  244. package/dist/registry-BIGVUrMB.mjs.map +1 -0
  245. package/dist/{repl-editor-CJG3sz7A.mjs → repl-editor-BCozyiNq.mjs} +7 -7
  246. package/dist/{repl-editor-CJG3sz7A.mjs.map → repl-editor-BCozyiNq.mjs.map} +1 -1
  247. package/dist/runtime/aigateway.d.mts +25 -0
  248. package/dist/runtime/aigateway.mjs +3 -0
  249. package/dist/runtime/authconnection.d.mts +21 -2
  250. package/dist/runtime/authconnection.mjs +2 -3
  251. package/dist/runtime/context.d.mts +54 -2
  252. package/dist/runtime/context.mjs +2 -3
  253. package/dist/runtime/field-parse.d.mts +10 -0
  254. package/dist/runtime/file.d.mts +170 -2
  255. package/dist/runtime/file.mjs +2 -3
  256. package/dist/runtime/globals.d.mts +38 -53
  257. package/dist/runtime/globals.mjs +0 -1
  258. package/dist/runtime/iconv.d.mts +73 -2
  259. package/dist/runtime/iconv.mjs +2 -3
  260. package/dist/runtime/idp.d.mts +129 -2
  261. package/dist/runtime/idp.mjs +2 -3
  262. package/dist/runtime/index.d.mts +48 -9
  263. package/dist/runtime/index.mjs +10 -9
  264. package/dist/runtime/logger.d.mts +98 -0
  265. package/dist/runtime/logger.mjs +3 -0
  266. package/dist/runtime/secretmanager.d.mts +41 -2
  267. package/dist/runtime/secretmanager.mjs +2 -3
  268. package/dist/runtime/types.d.mts +25 -0
  269. package/dist/runtime/workflow.d.mts +124 -2
  270. package/dist/runtime/workflow.mjs +2 -3
  271. package/dist/{schema-1msIhXwA.mjs → schema--xYWRGfe.mjs} +289 -231
  272. package/dist/schema--xYWRGfe.mjs.map +1 -0
  273. package/dist/{secret-file-CWzF8rry.mjs → secret-file-C3J4Gy8r.mjs} +2 -3
  274. package/dist/{secret-file-CWzF8rry.mjs.map → secret-file-C3J4Gy8r.mjs.map} +1 -1
  275. package/dist/secretmanager-CYlpffsz.mjs +13 -0
  276. package/dist/secretmanager-CYlpffsz.mjs.map +1 -0
  277. package/dist/secretmanager-IY4UvinW.mjs +131 -0
  278. package/dist/secretmanager-IY4UvinW.mjs.map +1 -0
  279. package/dist/seed/index.d.mts +4 -4
  280. package/dist/seed/index.mjs +0 -1
  281. package/dist/seed/index.mjs.map +1 -1
  282. package/dist/seed-LUVr7jHL.mjs +444 -0
  283. package/dist/seed-LUVr7jHL.mjs.map +1 -0
  284. package/dist/{service-DMohAx8a2.mjs → service-B5WynBHQ.mjs} +3 -4
  285. package/dist/service-B5WynBHQ.mjs.map +1 -0
  286. package/dist/service-BNtPsK9Q.mjs +837 -0
  287. package/dist/service-BNtPsK9Q.mjs.map +1 -0
  288. package/dist/service-D5jn05ZI.mjs +3 -0
  289. package/dist/service_pb-BwZRiNug.mjs +167 -0
  290. package/dist/service_pb-BwZRiNug.mjs.map +1 -0
  291. package/dist/service_pb-wRkxUta6.mjs +3 -0
  292. package/dist/tailor-proto/src/tailor/v1/aigateway_pb.d.mts +203 -0
  293. package/dist/tailor-proto/src/tailor/v1/aigateway_resource_pb.d.mts +57 -0
  294. package/dist/tailor-proto/src/tailor/v1/application_pb.d.mts +315 -0
  295. package/dist/tailor-proto/src/tailor/v1/application_resource_pb.d.mts +160 -0
  296. package/dist/tailor-proto/src/tailor/v1/auth_pb.d.mts +2069 -0
  297. package/dist/tailor-proto/src/tailor/v1/auth_resource_pb.d.mts +865 -0
  298. package/dist/tailor-proto/src/tailor/v1/events_pb.d.mts +111 -0
  299. package/dist/tailor-proto/src/tailor/v1/events_resource_pb.d.mts +68 -0
  300. package/dist/tailor-proto/src/tailor/v1/executor_pb.d.mts +438 -0
  301. package/dist/tailor-proto/src/tailor/v1/executor_resource_pb.d.mts +563 -0
  302. package/dist/tailor-proto/src/tailor/v1/function_pb.d.mts +144 -0
  303. package/dist/tailor-proto/src/tailor/v1/function_registry_pb.d.mts +450 -0
  304. package/dist/tailor-proto/src/tailor/v1/function_resource_pb.d.mts +191 -0
  305. package/dist/tailor-proto/src/tailor/v1/http_adapter_resource_pb.d.mts +49 -0
  306. package/dist/tailor-proto/src/tailor/v1/idp_pb.d.mts +406 -0
  307. package/dist/tailor-proto/src/tailor/v1/idp_resource_pb.d.mts +429 -0
  308. package/dist/tailor-proto/src/tailor/v1/metadata_pb.d.mts +72 -0
  309. package/dist/tailor-proto/src/tailor/v1/metadata_resource_pb.d.mts +16 -0
  310. package/dist/tailor-proto/src/tailor/v1/meter_pb.d.mts +308 -0
  311. package/dist/tailor-proto/src/tailor/v1/pipeline_pb.d.mts +590 -0
  312. package/dist/tailor-proto/src/tailor/v1/pipeline_resource_pb.d.mts +329 -0
  313. package/dist/tailor-proto/src/tailor/v1/resource_pb.d.mts +112 -0
  314. package/dist/tailor-proto/src/tailor/v1/secret_manager_pb.d.mts +345 -0
  315. package/dist/tailor-proto/src/tailor/v1/secret_manager_resource_pb.d.mts +53 -0
  316. package/dist/tailor-proto/src/tailor/v1/service_pb.d.mts +3575 -0
  317. package/dist/tailor-proto/src/tailor/v1/stateflow_pb.d.mts +186 -0
  318. package/dist/tailor-proto/src/tailor/v1/stateflow_resource_pb.d.mts +28 -0
  319. package/dist/tailor-proto/src/tailor/v1/staticwebsite_pb.d.mts +428 -0
  320. package/dist/tailor-proto/src/tailor/v1/staticwebsite_resource_pb.d.mts +89 -0
  321. package/dist/tailor-proto/src/tailor/v1/tailordb_pb.d.mts +683 -0
  322. package/dist/tailor-proto/src/tailor/v1/tailordb_resource_pb.d.mts +796 -0
  323. package/dist/tailor-proto/src/tailor/v1/telemetryrouter_pb.d.mts +329 -0
  324. package/dist/tailor-proto/src/tailor/v1/telemetryrouter_resource_pb.d.mts +182 -0
  325. package/dist/tailor-proto/src/tailor/v1/workflow_pb.d.mts +861 -0
  326. package/dist/tailor-proto/src/tailor/v1/workflow_resource_pb.d.mts +309 -0
  327. package/dist/tailor-proto/src/tailor/v1/workspace_pb.d.mts +2014 -0
  328. package/dist/tailor-proto/src/tailor/v1/workspace_resource_pb.d.mts +482 -0
  329. package/dist/{telemetry-BQbbVo2t.mjs → telemetry-BRVdwh14.mjs} +4 -5
  330. package/dist/telemetry-BRVdwh14.mjs.map +1 -0
  331. package/dist/telemetry-CkbkeJxl.mjs +3 -0
  332. package/dist/test-env-key-D7UkZp99.mjs +75 -0
  333. package/dist/test-env-key-D7UkZp99.mjs.map +1 -0
  334. package/dist/type-source-DH_LH20p.mjs +13 -0
  335. package/dist/type-source-DH_LH20p.mjs.map +1 -0
  336. package/dist/types/aigateway.generated.d.mts +12 -0
  337. package/dist/types/app-config.generated.d.mts +4 -0
  338. package/dist/types/auth-connection.generated.d.mts +33 -0
  339. package/dist/types/auth.generated.d.mts +188 -0
  340. package/dist/types/executor.generated.d.mts +209 -0
  341. package/dist/types/helpers.d.mts +40 -0
  342. package/dist/types/http-adapter.generated.d.mts +28 -0
  343. package/dist/types/idp.generated.d.mts +626 -0
  344. package/dist/types/resolver.generated.d.mts +82 -0
  345. package/dist/types/secrets.generated.d.mts +14 -0
  346. package/dist/types/staticwebsite.generated.d.mts +14 -0
  347. package/dist/types/tailordb.generated.d.mts +468 -0
  348. package/dist/types/workflow.generated.d.mts +17 -0
  349. package/dist/user-agent-Bgsszb5I.mjs +28 -0
  350. package/dist/user-agent-Bgsszb5I.mjs.map +1 -0
  351. package/dist/utils/test/index.d.mts +6 -99
  352. package/dist/utils/test/index.mjs +60 -40
  353. package/dist/utils/test/index.mjs.map +1 -1
  354. package/dist/utils/test/mock.d.mts +86 -0
  355. package/dist/vitest/environment.d.mts +1 -2
  356. package/dist/vitest/environment.mjs +2 -3
  357. package/dist/vitest/environment.mjs.map +1 -1
  358. package/dist/vitest/index.d.mts +15 -392
  359. package/dist/vitest/index.mjs +1347 -9
  360. package/dist/vitest/index.mjs.map +1 -1
  361. package/dist/vitest/mock-kysely.d.mts +61 -0
  362. package/dist/vitest/mock.d.mts +10 -0
  363. package/dist/vitest/mocks/aigateway.d.mts +40 -0
  364. package/dist/vitest/mocks/authconnection.d.mts +38 -0
  365. package/dist/vitest/mocks/file.d.mts +58 -0
  366. package/dist/vitest/mocks/iconv.d.mts +51 -0
  367. package/dist/vitest/mocks/idp.d.mts +60 -0
  368. package/dist/vitest/mocks/logger.d.mts +45 -0
  369. package/dist/vitest/mocks/secretmanager.d.mts +44 -0
  370. package/dist/vitest/mocks/tailordb.d.mts +115 -0
  371. package/dist/vitest/mocks/workflow.d.mts +157 -0
  372. package/dist/vitest/setup.d.mts +1 -2
  373. package/dist/vitest/setup.mjs +2 -3
  374. package/dist/vitest/setup.mjs.map +1 -1
  375. package/dist/vitest/workflow-local.d.mts +41 -0
  376. package/dist/workflow-CsaQ9qK-.mjs +42 -0
  377. package/dist/workflow-CsaQ9qK-.mjs.map +1 -0
  378. package/dist/{client-CobIRHl-.mjs → workspace_resource_pb-UGK1SSn_.mjs} +55 -616
  379. package/dist/workspace_resource_pb-UGK1SSn_.mjs.map +1 -0
  380. package/docs/cli/application.md +150 -252
  381. package/docs/cli/auth.md +51 -295
  382. package/docs/cli/completion.md +4 -25
  383. package/docs/cli/crashreport.md +3 -63
  384. package/docs/cli/executor.md +72 -183
  385. package/docs/cli/function.md +17 -133
  386. package/docs/cli/organization.md +11 -221
  387. package/docs/cli/plugin.md +29 -0
  388. package/docs/cli/query.md +2 -22
  389. package/docs/cli/secret.md +71 -251
  390. package/docs/cli/setup.md +138 -40
  391. package/docs/cli/skills.md +50 -39
  392. package/docs/cli/staticwebsite.md +32 -180
  393. package/docs/cli/tailordb.md +71 -427
  394. package/docs/cli/upgrade.md +2 -22
  395. package/docs/cli/user.md +78 -247
  396. package/docs/cli/workflow.md +150 -172
  397. package/docs/cli/workspace.md +167 -538
  398. package/docs/cli-reference.md +213 -96
  399. package/docs/configuration.md +40 -8
  400. package/docs/github-actions.md +72 -24
  401. package/docs/migration/v2.md +1316 -0
  402. package/docs/multi-environment.md +29 -7
  403. package/docs/plugin/custom.md +6 -6
  404. package/docs/plugin/index.md +9 -9
  405. package/docs/quickstart.md +8 -7
  406. package/docs/runtime.md +21 -12
  407. package/docs/services/aigateway.md +115 -0
  408. package/docs/services/auth.md +70 -61
  409. package/docs/services/executor.md +8 -5
  410. package/docs/services/http-adapter.md +16 -1
  411. package/docs/services/idp.md +55 -2
  412. package/docs/services/resolver.md +63 -11
  413. package/docs/services/secret.md +11 -11
  414. package/docs/services/staticwebsite.md +8 -2
  415. package/docs/services/tailordb-migration.md +43 -28
  416. package/docs/services/tailordb.md +200 -99
  417. package/docs/services/workflow.md +135 -59
  418. package/docs/testing.md +253 -145
  419. package/package.json +61 -47
  420. package/postinstall.mjs +4 -6
  421. package/dist/actor-J2gJ0eK5.d.mts +0 -24
  422. package/dist/application-76hhIhnJ.mjs.map +0 -1
  423. package/dist/application-av2raLs6.mjs +0 -4
  424. package/dist/authconnection-BIYzEh2p.d.mts +0 -39
  425. package/dist/authconnection-D8SJGMpj.mjs +0 -16
  426. package/dist/authconnection-D8SJGMpj.mjs.map +0 -1
  427. package/dist/brand-DlnJ375c.mjs.map +0 -1
  428. package/dist/chunk-BkoGK1jX.mjs +0 -21
  429. package/dist/cli/erd-viewer-assets/app.js +0 -1181
  430. package/dist/cli/erd-viewer-assets/index.html +0 -73
  431. package/dist/cli/erd-viewer-assets/serve.json +0 -13
  432. package/dist/cli/erd-viewer-assets/styles.css +0 -789
  433. package/dist/cli/index.d.mts +0 -5
  434. package/dist/cli/index.mjs.map +0 -1
  435. package/dist/cli/skills.d.mts +0 -1
  436. package/dist/cli/skills.mjs +0 -22
  437. package/dist/cli/skills.mjs.map +0 -1
  438. package/dist/client-C68VWo4g.mjs +0 -4
  439. package/dist/client-CobIRHl-.mjs.map +0 -1
  440. package/dist/context-CUBwSBq4.d.mts +0 -68
  441. package/dist/context-s0lxhu8_.mjs.map +0 -1
  442. package/dist/enum-constants-C7DaWeQo.mjs.map +0 -1
  443. package/dist/env-B-g-qgE4.d.mts +0 -7
  444. package/dist/errors-EsY4XO6O.mjs.map +0 -1
  445. package/dist/field-C4zdJLW5.mjs +0 -23
  446. package/dist/field-C4zdJLW5.mjs.map +0 -1
  447. package/dist/file-B58Dm-2P.mjs.map +0 -1
  448. package/dist/file-BzK8z3X-.d.mts +0 -250
  449. package/dist/file-utils-BHPxPXmn.mjs.map +0 -1
  450. package/dist/globals-ByrCoDip.mjs.map +0 -1
  451. package/dist/iconv-DreIffeM.mjs +0 -64
  452. package/dist/iconv-DreIffeM.mjs.map +0 -1
  453. package/dist/iconv-kwrmd1U_.d.mts +0 -122
  454. package/dist/idp-BlBPtXJ-.d.mts +0 -160
  455. package/dist/idp-Ch95ag8h.mjs.map +0 -1
  456. package/dist/index-CLxubakC.d.mts +0 -1225
  457. package/dist/index-CPRnOjjt.d.mts +0 -18
  458. package/dist/index-CQZVJ5SX.d.mts +0 -18
  459. package/dist/index-CfRFkXIO.d.mts +0 -47
  460. package/dist/index-DRhMpdnA.d.mts +0 -46
  461. package/dist/index-DUupuPhZ.d.mts +0 -18
  462. package/dist/interceptor-DOqRkCya.mjs.map +0 -1
  463. package/dist/job-BpsFXPbi.mjs +0 -54
  464. package/dist/job-BpsFXPbi.mjs.map +0 -1
  465. package/dist/kysely-type-D1e0Vwkd.mjs.map +0 -1
  466. package/dist/logger-DpJyJvNz.mjs +0 -221
  467. package/dist/logger-DpJyJvNz.mjs.map +0 -1
  468. package/dist/mock-DMgIygjE.mjs +0 -806
  469. package/dist/mock-DMgIygjE.mjs.map +0 -1
  470. package/dist/package-json-wzO6nV9O.mjs +0 -4
  471. package/dist/plugin-C_FyVSdl.d.mts +0 -634
  472. package/dist/registry-D0uB0OrK.mjs +0 -178
  473. package/dist/registry-D0uB0OrK.mjs.map +0 -1
  474. package/dist/runtime-C7qTBDD2.mjs.map +0 -1
  475. package/dist/schema-1msIhXwA.mjs.map +0 -1
  476. package/dist/secretmanager-B9h-U_8U.mjs +0 -25
  477. package/dist/secretmanager-B9h-U_8U.mjs.map +0 -1
  478. package/dist/secretmanager-CKLB3wAQ.d.mts +0 -55
  479. package/dist/seed-BH2FbrPV.mjs +0 -1171
  480. package/dist/seed-BH2FbrPV.mjs.map +0 -1
  481. package/dist/service-BHQIerYh.mjs +0 -4
  482. package/dist/service-DMohAx8a2.mjs.map +0 -1
  483. package/dist/service-wI3Hvrgx.mjs +0 -460
  484. package/dist/service-wI3Hvrgx.mjs.map +0 -1
  485. package/dist/tailordb-BlBGmQK-.d.mts +0 -863
  486. package/dist/telemetry-BQbbVo2t.mjs.map +0 -1
  487. package/dist/telemetry-w92bvGdC.mjs +0 -4
  488. package/dist/types-2Be3wSMc.mjs +0 -5
  489. package/dist/types-CmzfQP_m.mjs +0 -372
  490. package/dist/types-CmzfQP_m.mjs.map +0 -1
  491. package/dist/workflow--aPbA8Uq.mjs +0 -39
  492. package/dist/workflow--aPbA8Uq.mjs.map +0 -1
  493. package/dist/workflow-CMamswkK.d.mts +0 -96
  494. package/dist/workflow.generated-Bf1tWylx.d.mts +0 -1416
  495. package/docs/generator/builtin.md +0 -257
  496. package/docs/generator/custom.md +0 -147
  497. package/docs/generator/index.md +0 -66
@@ -29,7 +29,7 @@ Define TailorDB Types in files matching glob patterns specified in `tailor.confi
29
29
  import { db } from "@tailor-platform/sdk";
30
30
 
31
31
  // Export both value and type
32
- export const user = db.type("User", {
32
+ export const user = db.table("User", {
33
33
  name: db.string(),
34
34
  email: db.string().unique(),
35
35
  age: db.int(),
@@ -38,7 +38,7 @@ export const user = db.type("User", {
38
38
  export type user = typeof user;
39
39
 
40
40
  // You can define multiple types in the same file
41
- export const role = db.type("Role", {
41
+ export const role = db.table("Role", {
42
42
  name: db.string().unique(),
43
43
  });
44
44
  export type role = typeof role;
@@ -47,7 +47,7 @@ export type role = typeof role;
47
47
  Specify plural form by passing an array as first argument:
48
48
 
49
49
  ```typescript
50
- db.type(["User", "UserList"], {
50
+ db.table(["User", "UserList"], {
51
51
  name: db.string(),
52
52
  });
53
53
  ```
@@ -55,7 +55,7 @@ db.type(["User", "UserList"], {
55
55
  Pass a description as second argument:
56
56
 
57
57
  ```typescript
58
- db.type("User", "User in the system", {
58
+ db.table("User", "User in the system", {
59
59
  name: db.string(),
60
60
  });
61
61
  ```
@@ -174,11 +174,11 @@ db.string().unique();
174
174
  Add a relation to field with automatic index and foreign key constraint:
175
175
 
176
176
  ```typescript
177
- const role = db.type("Role", {
177
+ const role = db.table("Role", {
178
178
  name: db.string(),
179
179
  });
180
180
 
181
- const user = db.type("User", {
181
+ const user = db.table("User", {
182
182
  name: db.string(),
183
183
  roleId: db.uuid().relation({
184
184
  type: "n-1",
@@ -190,7 +190,7 @@ const user = db.type("User", {
190
190
  For one-to-one relations, use `type: "1-1"`:
191
191
 
192
192
  ```typescript
193
- const userProfile = db.type("UserProfile", {
193
+ const userProfile = db.table("UserProfile", {
194
194
  userId: db.uuid().relation({
195
195
  type: "1-1",
196
196
  toward: { type: user },
@@ -202,7 +202,7 @@ const userProfile = db.type("UserProfile", {
202
202
  For foreign key constraint without creating a relation, use `type: "keyOnly"`:
203
203
 
204
204
  ```typescript
205
- const user = db.type("User", {
205
+ const user = db.table("User", {
206
206
  roleId: db.uuid().relation({
207
207
  type: "keyOnly",
208
208
  toward: { type: role },
@@ -213,22 +213,25 @@ const user = db.type("User", {
213
213
  Create relations against different fields using `toward.key`:
214
214
 
215
215
  ```typescript
216
- const user = db.type("User", {
216
+ const user = db.table("User", {
217
217
  email: db.string().unique(),
218
218
  });
219
219
 
220
- const userProfile = db.type("UserProfile", {
220
+ const userProfile = db.table("UserProfile", {
221
221
  userEmail: db.string().relation({
222
222
  type: "1-1",
223
- toward: { type: user, key: "email" },
223
+ toward: { type: user, key: "email", as: "user" },
224
224
  }),
225
225
  });
226
226
  ```
227
227
 
228
+ `userEmail` does not end in `ID`, `Id`, or `id`, so this example specifies the forward relation
229
+ name with `toward.as`.
230
+
228
231
  Customize relation names using `toward.as` / `backward` options:
229
232
 
230
233
  ```typescript
231
- const userProfile = db.type("UserProfile", {
234
+ const userProfile = db.table("UserProfile", {
232
235
  userId: db.uuid().relation({
233
236
  type: "1-1",
234
237
  toward: { type: user, as: "base" },
@@ -254,132 +257,166 @@ type User {
254
257
  - `toward.as` - Customizes the field name for accessing the related type from this type
255
258
  - `backward` - Customizes the field name for accessing this type from the related type
256
259
 
257
- ### Hooks
260
+ Relation names share the same GraphQL field namespace as fields, files, and other relations on
261
+ the table. The SDK rejects duplicate or empty relation names. When `toward.as` is omitted, the
262
+ default forward name comes from the relation field name with a trailing `ID`, `Id`, or `id`
263
+ removed. This lets multiple fields point to the same target table with distinct forward names:
258
264
 
259
- Add hooks to execute functions during data creation or update. Hooks receive three arguments:
265
+ ```typescript
266
+ const post = db.table("Post", {
267
+ authorID: db.uuid().relation({
268
+ type: "n-1",
269
+ toward: { type: user },
270
+ backward: "authoredPosts",
271
+ }),
272
+ reviewerID: db.uuid().relation({
273
+ type: "n-1",
274
+ toward: { type: user },
275
+ backward: "reviewedPosts",
276
+ }),
277
+ });
278
+ ```
260
279
 
261
- - `value`: User input if provided, otherwise existing value on update or null on create
262
- - `data`: Entire record data (for accessing other field values)
263
- - `user`: User performing the operation
280
+ These fields generate the forward names `author` and `reviewer`. A relation field without one of
281
+ the recognized ID suffixes needs an explicit `toward.as`, because its generated forward name
282
+ would conflict with the field itself.
283
+
284
+ Use `toward.as` or `backward` when a generated relation name would conflict with an existing
285
+ field, files entry, or relation on the same table.
286
+
287
+ ### Hooks
288
+
289
+ Add hooks to execute functions during data creation or update.
264
290
 
265
291
  #### Field-level Hooks
266
292
 
267
- Set hooks directly on individual fields:
293
+ Set hooks directly on individual fields.
294
+
295
+ Create hooks receive:
296
+
297
+ - `input`: The field value from the input (null when not provided)
298
+ - `invoker`: Principal performing the operation
299
+ - `now`: Operation timestamp (`Date`), shared across all hooks in the same operation
300
+
301
+ Update hooks receive the same arguments plus:
302
+
303
+ - `oldValue`: The previous field value (null only for optional fields)
268
304
 
269
305
  ```typescript
270
306
  db.string().hooks({
271
- create: ({ user }) => user.id,
272
- update: ({ value }) => value,
307
+ create: ({ invoker }) => invoker?.id ?? "",
308
+ update: ({ input, oldValue }) => input ?? oldValue,
273
309
  });
274
310
  ```
275
311
 
276
- **Note:** When setting hooks at the field level, the `data` argument type is `unknown` since the field doesn't know about other fields in the type. Use type-level hooks if you need to access other fields with type safety.
312
+ Field-level hooks operate on a single field and cannot access other fields. Use type-level hooks for cross-field logic.
277
313
 
278
314
  #### Type-level Hooks
279
315
 
280
- Set hooks for multiple fields at once using `db.type().hooks()`:
316
+ Set hooks across multiple fields using `db.table().hooks()`. The hook returns an object with the fields to override. When both field-level and type-level hooks exist for the same field, type-level hooks take priority.
317
+
318
+ Create hooks receive:
319
+
320
+ - `input`: The submitted record data. When field-level hooks or defaults exist, `input` reflects their applied results
321
+ - `invoker`: Principal performing the operation
322
+ - `now`: Operation timestamp (`Date`), shared across all hooks in the same operation
323
+
324
+ Update hooks receive the same arguments plus:
325
+
326
+ - `oldRecord`: The existing record (non-null)
281
327
 
282
328
  ```typescript
283
329
  export const customer = db
284
- .type("Customer", {
330
+ .table("Customer", {
285
331
  firstName: db.string(),
286
332
  lastName: db.string(),
287
333
  fullName: db.string(),
288
334
  })
289
335
  .hooks({
290
- fullName: {
291
- create: ({ data }) => `${data.firstName} ${data.lastName}`,
292
- update: ({ data }) => `${data.firstName} ${data.lastName}`,
293
- },
336
+ create: ({ input }) => ({
337
+ fullName: `${input.firstName} ${input.lastName}`,
338
+ }),
339
+ update: ({ input, oldRecord }) => ({
340
+ fullName: `${input.firstName ?? oldRecord.firstName} ${input.lastName ?? oldRecord.lastName}`,
341
+ }),
294
342
  });
295
343
  ```
296
344
 
297
- **Important:** Field-level and type-level hooks cannot coexist on the same field. TypeScript will prevent this at compile time:
345
+ Use `now` to stamp several fields with the exact same instant:
298
346
 
299
347
  ```typescript
300
- // Compile error - cannot set hooks on the same field twice
301
- export const user = db
302
- .type("User", {
303
- name: db.string().hooks({ create: ({ data }) => data.firstName }), // Field-level
348
+ export const order = db
349
+ .table("Order", {
350
+ createdAt: db.datetime(),
351
+ updatedAt: db.datetime(),
304
352
  })
305
353
  .hooks({
306
- name: { create: ({ data }) => data.lastName }, // Type-level - ERROR
307
- });
308
-
309
- // OK - set hooks on different fields
310
- export const user = db
311
- .type("User", {
312
- firstName: db.string().hooks({ create: () => "John" }), // Field-level on firstName
313
- lastName: db.string(),
314
- })
315
- .hooks({
316
- lastName: { create: () => "Doe" }, // Type-level on lastName
354
+ create: ({ now }) => ({ createdAt: now, updatedAt: now }),
355
+ update: ({ now }) => ({ updatedAt: now }),
317
356
  });
318
357
  ```
319
358
 
359
+ **Note:** `.hooks()` can only be called once on a type. Duplicate type-level calls fail at compile time and throw at runtime.
360
+
320
361
  ### Validation
321
362
 
322
- Add validation rules to fields. Validators receive three arguments (executed after hooks):
363
+ Add validation rules to fields. Validators run after hooks.
323
364
 
324
- - `value`: Field value after hook transformation
325
- - `data`: Entire record data after hook transformations (for accessing other field values)
326
- - `user`: User performing the operation
365
+ **Note:** Custom validators run only when built-in type validation succeeds, so `value` always has the field's declared type. For array fields, the validator is called once with the complete array, not per element:
327
366
 
328
- Validators return `true` for success, `false` for failure. Use array form `[validator, errorMessage]` for custom error messages.
367
+ ```typescript
368
+ // value is string[], not string
369
+ db.string({ array: true }).validate(({ value }) => value.length >= 2);
370
+ ```
329
371
 
330
372
  #### Field-level Validation
331
373
 
332
- Set validators directly on individual fields:
374
+ Set validators directly on individual fields. Each validator receives `{ value }` (the field value after hooks) and returns an error message string to fail, or void to pass:
333
375
 
334
376
  ```typescript
335
377
  db.string().validate(
336
- ({ value }) => value.includes("@"),
337
- [({ value }) => value.length >= 5, "Email must be at least 5 characters"],
378
+ ({ value }) => (value.includes("@") ? undefined : "Must contain @"),
379
+ ({ value }) => (value.length >= 5 ? undefined : "Must be at least 5 characters"),
338
380
  );
339
381
  ```
340
382
 
341
383
  #### Type-level Validation
342
384
 
343
- Set validators for multiple fields at once using `db.type().validate()`:
385
+ Set a validator across all fields using `db.table().validate()`. The validator receives `{ newRecord, oldRecord, invoker }` and an `issues()` callback to report errors per field:
344
386
 
345
387
  ```typescript
346
388
  export const user = db
347
- .type("User", {
389
+ .table("User", {
348
390
  name: db.string(),
349
391
  email: db.string(),
350
392
  })
351
- .validate({
352
- name: [({ value }) => value.length > 5, "Name must be longer than 5 characters"],
353
- email: [
354
- ({ value }) => value.includes("@"),
355
- [({ value }) => value.length >= 5, "Email must be at least 5 characters"],
356
- ],
393
+ .validate(({ newRecord }, issues) => {
394
+ if (newRecord.name.length <= 5) {
395
+ issues("name", "Name must be longer than 5 characters");
396
+ }
397
+ if (!newRecord.email.includes("@")) {
398
+ issues("email", "Must contain @");
399
+ }
357
400
  });
358
401
  ```
359
402
 
360
- **Important:** Field-level and type-level validation cannot coexist on the same field. TypeScript will prevent this at compile time:
403
+ ### Defaults
404
+
405
+ Set a default value for a required field on create. The field becomes optional in the create input — the default fills in when no value is provided:
361
406
 
362
407
  ```typescript
363
- // Compile error - cannot set validation on the same field twice
364
- export const user = db
365
- .type("User", {
366
- name: db.string().validate(({ value }) => value.length > 0), // Field-level
367
- })
368
- .validate({
369
- name: [({ value }) => value.length < 100, "Too long"], // Type-level - ERROR
370
- });
408
+ db.int().default(0);
409
+ db.string().default("pending");
410
+ ```
371
411
 
372
- // OK - set validation on different fields
373
- export const user = db
374
- .type("User", {
375
- name: db.string().validate(({ value }) => value.length > 0), // Field-level on name
376
- email: db.string(),
377
- })
378
- .validate({
379
- email: [({ value }) => value.includes("@"), "Invalid email"], // Type-level on email
380
- });
412
+ For datetime/date/time fields, pass `"now"` to use the operation timestamp:
413
+
414
+ ```typescript
415
+ db.datetime().default("now");
381
416
  ```
382
417
 
418
+ **Note:** `.validate()` can only be called once on a type. Duplicate type-level calls fail at compile time and throw at runtime.
419
+
383
420
  ### Vector Search
384
421
 
385
422
  ```typescript
@@ -403,18 +440,36 @@ db.string().serial({
403
440
  ### Common Fields
404
441
 
405
442
  ```typescript
406
- export const user = db.type("User", {
443
+ export const user = db.table("User", {
407
444
  name: db.string(),
408
445
  ...db.fields.timestamps(),
409
446
  });
410
447
  ```
411
448
 
449
+ `db.fields.timestamps()` adds non-null `createdAt` and `updatedAt` datetime fields. Both fields are populated when a record is created; provided values are preserved so seed data can use historical timestamps. `updatedAt` is also refreshed automatically when a record is updated.
450
+
412
451
  ## Type Modifiers
413
452
 
453
+ Type builder methods that set one type-level configuration can be called only once on the same type. Duplicate calls fail at compile time and throw at runtime. This applies to `.description()`, `.hooks()`, `.validate()`, `.features()`, `.indexes()`, `.files()`, `.permission()`, and `.gqlPermission()`.
454
+
455
+ Conditional assignment is still supported when only one branch calls the method:
456
+
457
+ ```typescript
458
+ let user = db.type("User", {
459
+ name: db.string(),
460
+ });
461
+
462
+ if (enableFiles) {
463
+ user = user.files({
464
+ avatar: "profile image",
465
+ });
466
+ }
467
+ ```
468
+
414
469
  ### Composite Indexes
415
470
 
416
471
  ```typescript
417
- db.type("User", {
472
+ db.table("User", {
418
473
  firstName: db.string(),
419
474
  lastName: db.string(),
420
475
  }).indexes({
@@ -427,7 +482,7 @@ db.type("User", {
427
482
  ### File Fields
428
483
 
429
484
  ```typescript
430
- db.type("User", {
485
+ db.table("User", {
431
486
  name: db.string(),
432
487
  }).files({
433
488
  avatar: "profile image",
@@ -437,7 +492,7 @@ db.type("User", {
437
492
  ### Features
438
493
 
439
494
  ```typescript
440
- db.type("User", {
495
+ db.table("User", {
441
496
  name: db.string(),
442
497
  }).features({
443
498
  aggregation: true,
@@ -450,7 +505,7 @@ db.type("User", {
450
505
  Enable event publishing for a type to trigger executors on record changes:
451
506
 
452
507
  ```typescript
453
- db.type("User", {
508
+ db.table("User", {
454
509
  name: db.string(),
455
510
  }).features({
456
511
  publishEvents: true,
@@ -461,7 +516,7 @@ db.type("User", {
461
516
 
462
517
  - When `publishEvents: true`, record creation/update/deletion events are published
463
518
  - When not specified, it is **automatically set to `true`** if an executor uses this type with `recordCreatedTrigger`, `recordUpdatedTrigger`, or `recordDeletedTrigger`
464
- - When explicitly set to `false` while an executor uses this type, an error is thrown during `tailor apply`
519
+ - When explicitly set to `false` while an executor uses this type, an error is thrown during `tailor deploy`
465
520
 
466
521
  **Use cases:**
467
522
 
@@ -469,7 +524,7 @@ db.type("User", {
469
524
 
470
525
  ```typescript
471
526
  // publishEvents is automatically enabled because an executor uses this type
472
- export const order = db.type("Order", {
527
+ export const order = db.table("Order", {
473
528
  status: db.string(),
474
529
  });
475
530
 
@@ -483,7 +538,7 @@ db.type("User", {
483
538
  2. **Manual enable**: Enable event publishing for external consumers or debugging
484
539
 
485
540
  ```typescript
486
- db.type("AuditLog", {
541
+ db.table("AuditLog", {
487
542
  action: db.string(),
488
543
  }).features({
489
544
  publishEvents: true, // Enable even without executor triggers
@@ -493,13 +548,55 @@ db.type("User", {
493
548
  3. **Explicit disable**: Disable event publishing for a type that doesn't need it (error if executor uses it)
494
549
 
495
550
  ```typescript
496
- db.type("TempData", {
551
+ db.table("TempData", {
497
552
  data: db.string(),
498
553
  }).features({
499
554
  publishEvents: false, // Explicitly disable
500
555
  });
501
556
  ```
502
557
 
558
+ #### GraphQL Operations
559
+
560
+ Control which GraphQL operations (`create`, `update`, `delete`, `read`) are exposed for a type. All operations are enabled by default.
561
+
562
+ ```typescript
563
+ db.type("Order", {
564
+ status: db.string(),
565
+ }).features({
566
+ gqlOperations: {
567
+ delete: false, // Disable the delete mutation
568
+ },
569
+ });
570
+ ```
571
+
572
+ Use the `"query"` alias to disable all mutations at once (read-only type: `create`/`update`/`delete` false, `read` true):
573
+
574
+ ```typescript
575
+ db.type("AuditLog", {
576
+ action: db.string(),
577
+ }).features({
578
+ gqlOperations: "query",
579
+ });
580
+ ```
581
+
582
+ **Namespace-level default**
583
+
584
+ Set a default for every type in a TailorDB namespace in `tailor.config.ts`. A type's own `.features({ gqlOperations })` always takes precedence over this default.
585
+
586
+ ```typescript
587
+ // tailor.config.ts
588
+ export default defineConfig({
589
+ db: {
590
+ tailordb: {
591
+ files: ["./tailordb/*.ts"],
592
+ gqlOperations: { delete: false }, // Default for every type in this namespace
593
+ },
594
+ },
595
+ });
596
+ ```
597
+
598
+ This default is re-evaluated on every `tailor deploy`, so changing it also updates types that already exist on the platform, not only newly created ones.
599
+
503
600
  ### Field Extraction (`pickFields` / `omitFields`)
504
601
 
505
602
  Extract subsets of fields from a `TailorDBType` for reuse in resolvers, executors, seed schemas, etc.
@@ -509,15 +606,15 @@ Extract subsets of fields from a `TailorDBType` for reuse in resolvers, executor
509
606
  Select specific fields and optionally modify their properties:
510
607
 
511
608
  ```typescript
512
- const user = db.type("User", {
609
+ const user = db.table("User", {
513
610
  id: db.uuid(),
514
611
  name: db.string(),
515
612
  email: db.string().unique(),
516
613
  ...db.fields.timestamps(),
517
614
  });
518
615
 
519
- // Pick id and createdAt, making them optional
520
- user.pickFields(["id", "createdAt"], { optional: true });
616
+ // Pick id, createdAt, and updatedAt, making them optional
617
+ user.pickFields(["id", "createdAt", "updatedAt"], { optional: true });
521
618
  ```
522
619
 
523
620
  Available options:
@@ -527,13 +624,15 @@ Available options:
527
624
  | `optional` | Makes the selected fields optional |
528
625
  | `array` | Makes the selected fields array types |
529
626
 
627
+ **Note:** The `array` option cannot change fields with custom validation — their validators expect the original value shape. Define a new field with a matching validator instead.
628
+
530
629
  #### `omitFields(keys)`
531
630
 
532
631
  Return all fields except the specified ones:
533
632
 
534
633
  ```typescript
535
- // All fields except id and createdAt
536
- user.omitFields(["id", "createdAt"]);
634
+ // All fields except id, createdAt, and updatedAt
635
+ user.omitFields(["id", "createdAt", "updatedAt"]);
537
636
  ```
538
637
 
539
638
  #### Common Pattern: Input Schema Composition
@@ -548,9 +647,9 @@ export default createResolver({
548
647
  name: "createUser",
549
648
  operation: "mutation",
550
649
  input: {
551
- // id/createdAt are optional (auto-generated), other fields are required
552
- ...user.pickFields(["id", "createdAt"], { optional: true }),
553
- ...user.omitFields(["id", "createdAt"]),
650
+ // id/createdAt/updatedAt are optional (auto-generated), other fields are required
651
+ ...user.pickFields(["id", "createdAt", "updatedAt"], { optional: true }),
652
+ ...user.omitFields(["id", "createdAt", "updatedAt"]),
554
653
  },
555
654
  output: t.object({ id: t.uuid() }),
556
655
  body: async (context) => {
@@ -567,8 +666,8 @@ import { t } from "@tailor-platform/sdk";
567
666
  import { invoice } from "../../tailordb/invoice";
568
667
 
569
668
  const schemaType = t.object({
570
- ...invoice.pickFields(["id", "createdAt"], { optional: true }),
571
- ...invoice.omitFields(["id", "createdAt", "invoiceNumber", "sequentialId"]),
669
+ ...invoice.pickFields(["id", "createdAt", "updatedAt"], { optional: true }),
670
+ ...invoice.omitFields(["id", "createdAt", "updatedAt", "invoiceNumber", "sequentialId"]),
572
671
  });
573
672
  ```
574
673
 
@@ -578,8 +677,10 @@ Configure Permission and GQLPermission. For details, see the [TailorDB Permissio
578
677
 
579
678
  **Important**: Following the secure-by-default principle, all operations are denied if permissions are not configured. You must explicitly grant permissions for each operation (create, read, update, delete).
580
679
 
680
+ `generate`/`deploy` reject a type that has no `.permission()`, or no `.gqlPermission()` while GraphQL operations are enabled for it (see [GraphQL Operations](#graphql-operations) above). Disable GraphQL exposure entirely with `.features({ gqlOperations: { create: false, update: false, delete: false, read: false } })` if a type only needs record-level permission.
681
+
581
682
  ```typescript
582
- db.type("User", {
683
+ db.table("User", {
583
684
  name: db.string(),
584
685
  role: db.enum(["admin", "user"]).index(),
585
686
  })
@@ -609,7 +710,7 @@ import {
609
710
  unsafeAllowAllGqlPermission,
610
711
  } from "@tailor-platform/sdk";
611
712
 
612
- db.type("User", {
713
+ db.table("User", {
613
714
  name: db.string(),
614
715
  })
615
716
  .permission(unsafeAllowAllTypePermission)
@@ -620,6 +721,6 @@ db.type("User", {
620
721
 
621
722
  ## Migrations
622
723
 
623
- When you change a TailorDB type definition, the SDK can generate a migration that captures the diff and, for breaking changes, runs a data transformation script during `tailor-sdk deploy`. See the [TailorDB Migrations guide](./tailordb-migration.md) for the full workflow, configuration, supported change types, team coordination, and troubleshooting.
724
+ When you change a TailorDB type definition, the SDK can generate a migration that captures the diff and, for breaking changes, runs a data transformation script during `tailor deploy`. See the [TailorDB Migrations guide](./tailordb-migration.md) for the full workflow, configuration, supported change types, team coordination, and troubleshooting.
624
725
 
625
726
  For the CLI command reference, see [`tailordb migration`](../cli/tailordb.md#tailordb-migration).