primitive-admin 1.1.0-alpha.6 → 1.1.0-alpha.60

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 (387) hide show
  1. package/README.md +389 -71
  2. package/assets/skill/skills/primitive-platform/SKILL.md +670 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +287 -17
  5. package/dist/bin/primitive.js.map +1 -1
  6. package/dist/src/commands/admins.d.ts +2 -0
  7. package/dist/src/commands/admins.js +138 -19
  8. package/dist/src/commands/admins.js.map +1 -1
  9. package/dist/src/commands/analytics.d.ts +2 -0
  10. package/dist/src/commands/analytics.js +554 -55
  11. package/dist/src/commands/analytics.js.map +1 -1
  12. package/dist/src/commands/apps.d.ts +2 -0
  13. package/dist/src/commands/apps.js +27 -80
  14. package/dist/src/commands/apps.js.map +1 -1
  15. package/dist/src/commands/auth.d.ts +2 -0
  16. package/dist/src/commands/auth.js +177 -7
  17. package/dist/src/commands/auth.js.map +1 -1
  18. package/dist/src/commands/blob-buckets.d.ts +2 -0
  19. package/dist/src/commands/blob-buckets.js +330 -0
  20. package/dist/src/commands/blob-buckets.js.map +1 -0
  21. package/dist/src/commands/catalog.d.ts +2 -0
  22. package/dist/src/commands/catalog.js +37 -38
  23. package/dist/src/commands/catalog.js.map +1 -1
  24. package/dist/src/commands/collection-type-configs.d.ts +2 -0
  25. package/dist/src/commands/collection-type-configs.js +92 -0
  26. package/dist/src/commands/collection-type-configs.js.map +1 -0
  27. package/dist/src/commands/collections.d.ts +2 -0
  28. package/dist/src/commands/collections.js +526 -0
  29. package/dist/src/commands/collections.js.map +1 -0
  30. package/dist/src/commands/comparisons.d.ts +2 -0
  31. package/dist/src/commands/comparisons.js +6 -6
  32. package/dist/src/commands/comparisons.js.map +1 -1
  33. package/dist/src/commands/config.d.ts +35 -0
  34. package/dist/src/commands/config.js +437 -0
  35. package/dist/src/commands/config.js.map +1 -0
  36. package/dist/src/commands/connections.d.ts +2 -0
  37. package/dist/src/commands/connections.js +100 -0
  38. package/dist/src/commands/connections.js.map +1 -0
  39. package/dist/src/commands/cron-triggers.d.ts +2 -0
  40. package/dist/src/commands/cron-triggers.js +204 -0
  41. package/dist/src/commands/cron-triggers.js.map +1 -0
  42. package/dist/src/commands/database-types.d.ts +2 -0
  43. package/dist/src/commands/database-types.js +171 -0
  44. package/dist/src/commands/database-types.js.map +1 -0
  45. package/dist/src/commands/databases.d.ts +65 -0
  46. package/dist/src/commands/databases.js +2153 -96
  47. package/dist/src/commands/databases.js.map +1 -1
  48. package/dist/src/commands/documents.d.ts +2 -0
  49. package/dist/src/commands/documents.js +1230 -19
  50. package/dist/src/commands/documents.js.map +1 -1
  51. package/dist/src/commands/email-templates.d.ts +2 -0
  52. package/dist/src/commands/email-templates.js +174 -0
  53. package/dist/src/commands/email-templates.js.map +1 -0
  54. package/dist/src/commands/env.d.ts +12 -0
  55. package/dist/src/commands/env.js +260 -0
  56. package/dist/src/commands/env.js.map +1 -0
  57. package/dist/src/commands/group-type-configs.d.ts +2 -0
  58. package/dist/src/commands/group-type-configs.js +86 -0
  59. package/dist/src/commands/group-type-configs.js.map +1 -0
  60. package/dist/src/commands/groups.d.ts +2 -0
  61. package/dist/src/commands/groups.js +38 -99
  62. package/dist/src/commands/groups.js.map +1 -1
  63. package/dist/src/commands/guides.d.ts +223 -0
  64. package/dist/src/commands/guides.js +617 -65
  65. package/dist/src/commands/guides.js.map +1 -1
  66. package/dist/src/commands/init.d.ts +17 -0
  67. package/dist/src/commands/init.js +964 -202
  68. package/dist/src/commands/init.js.map +1 -1
  69. package/dist/src/commands/integrations.d.ts +2 -0
  70. package/dist/src/commands/integrations.js +484 -205
  71. package/dist/src/commands/integrations.js.map +1 -1
  72. package/dist/src/commands/llm.d.ts +2 -0
  73. package/dist/src/commands/llm.js +13 -8
  74. package/dist/src/commands/llm.js.map +1 -1
  75. package/dist/src/commands/locks.d.ts +8 -0
  76. package/dist/src/commands/locks.js +160 -0
  77. package/dist/src/commands/locks.js.map +1 -0
  78. package/dist/src/commands/metadata.d.ts +2 -0
  79. package/dist/src/commands/metadata.js +406 -0
  80. package/dist/src/commands/metadata.js.map +1 -0
  81. package/dist/src/commands/prompts.d.ts +2 -0
  82. package/dist/src/commands/prompts.js +135 -355
  83. package/dist/src/commands/prompts.js.map +1 -1
  84. package/dist/src/commands/rule-sets.d.ts +3 -0
  85. package/dist/src/commands/rule-sets.js +271 -0
  86. package/dist/src/commands/rule-sets.js.map +1 -0
  87. package/dist/src/commands/scripts.d.ts +20 -0
  88. package/dist/src/commands/scripts.js +739 -0
  89. package/dist/src/commands/scripts.js.map +1 -0
  90. package/dist/src/commands/secrets.d.ts +2 -0
  91. package/dist/src/commands/secrets.js +108 -0
  92. package/dist/src/commands/secrets.js.map +1 -0
  93. package/dist/src/commands/sessions.d.ts +2 -0
  94. package/dist/src/commands/sessions.js +75 -0
  95. package/dist/src/commands/sessions.js.map +1 -0
  96. package/dist/src/commands/settings.d.ts +18 -0
  97. package/dist/src/commands/settings.js +54 -0
  98. package/dist/src/commands/settings.js.map +1 -0
  99. package/dist/src/commands/skill.d.ts +2 -0
  100. package/dist/src/commands/skill.js +29 -0
  101. package/dist/src/commands/skill.js.map +1 -0
  102. package/dist/src/commands/sync-app-settings.d.ts +125 -0
  103. package/dist/src/commands/sync-app-settings.js +380 -0
  104. package/dist/src/commands/sync-app-settings.js.map +1 -0
  105. package/dist/src/commands/sync.d.ts +958 -0
  106. package/dist/src/commands/sync.js +8954 -812
  107. package/dist/src/commands/sync.js.map +1 -1
  108. package/dist/src/commands/tokens.d.ts +2 -0
  109. package/dist/src/commands/tokens.js +130 -21
  110. package/dist/src/commands/tokens.js.map +1 -1
  111. package/dist/src/commands/users.d.ts +2 -0
  112. package/dist/src/commands/users.js +440 -22
  113. package/dist/src/commands/users.js.map +1 -1
  114. package/dist/src/commands/vars.d.ts +8 -0
  115. package/dist/src/commands/vars.js +96 -0
  116. package/dist/src/commands/vars.js.map +1 -0
  117. package/dist/src/commands/waitlist.d.ts +2 -0
  118. package/dist/src/commands/waitlist.js +10 -10
  119. package/dist/src/commands/waitlist.js.map +1 -1
  120. package/dist/src/commands/webhooks.d.ts +2 -0
  121. package/dist/src/commands/webhooks.js +442 -0
  122. package/dist/src/commands/webhooks.js.map +1 -0
  123. package/dist/src/commands/workflows.d.ts +94 -0
  124. package/dist/src/commands/workflows.js +1581 -448
  125. package/dist/src/commands/workflows.js.map +1 -1
  126. package/dist/src/lib/api-client.d.ts +1814 -0
  127. package/dist/src/lib/api-client.js +1655 -103
  128. package/dist/src/lib/api-client.js.map +1 -1
  129. package/dist/src/lib/app-settings-descriptor.d.ts +130 -0
  130. package/dist/src/lib/app-settings-descriptor.js +262 -0
  131. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  132. package/dist/src/lib/auth-flow.d.ts +8 -0
  133. package/dist/src/lib/batch.d.ts +26 -0
  134. package/dist/src/lib/batch.js +32 -0
  135. package/dist/src/lib/batch.js.map +1 -0
  136. package/dist/src/lib/block-layout.d.ts +160 -0
  137. package/dist/src/lib/block-layout.js +451 -0
  138. package/dist/src/lib/block-layout.js.map +1 -0
  139. package/dist/src/lib/canonical-json.d.ts +12 -0
  140. package/dist/src/lib/canonical-json.js +35 -0
  141. package/dist/src/lib/canonical-json.js.map +1 -0
  142. package/dist/src/lib/channel.d.ts +30 -0
  143. package/dist/src/lib/channel.js +68 -0
  144. package/dist/src/lib/channel.js.map +1 -0
  145. package/dist/src/lib/cli-manifest.d.ts +68 -0
  146. package/dist/src/lib/cli-manifest.js +71 -0
  147. package/dist/src/lib/cli-manifest.js.map +1 -0
  148. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +97 -0
  149. package/dist/src/lib/codegen-shared/generatedFiles.js +184 -0
  150. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  151. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  152. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  153. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  154. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +68 -0
  155. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +168 -0
  156. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  157. package/dist/src/lib/config-object-descriptor.d.ts +108 -0
  158. package/dist/src/lib/config-object-descriptor.js +607 -0
  159. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  160. package/dist/src/lib/config-payload.d.ts +85 -0
  161. package/dist/src/lib/config-payload.js +105 -0
  162. package/dist/src/lib/config-payload.js.map +1 -0
  163. package/dist/src/lib/config-surface.d.ts +93 -0
  164. package/dist/src/lib/config-surface.js +178 -0
  165. package/dist/src/lib/config-surface.js.map +1 -0
  166. package/dist/src/lib/config-toml.d.ts +10 -0
  167. package/dist/src/lib/config-toml.js +42 -0
  168. package/dist/src/lib/config-toml.js.map +1 -0
  169. package/dist/src/lib/config.d.ts +53 -0
  170. package/dist/src/lib/config.js +92 -53
  171. package/dist/src/lib/config.js.map +1 -1
  172. package/dist/src/lib/confirm-prompt.d.ts +83 -0
  173. package/dist/src/lib/confirm-prompt.js +110 -0
  174. package/dist/src/lib/confirm-prompt.js.map +1 -0
  175. package/dist/src/lib/constants.d.ts +11 -0
  176. package/dist/src/lib/constants.js +12 -0
  177. package/dist/src/lib/constants.js.map +1 -0
  178. package/dist/src/lib/crash-handlers.d.ts +20 -0
  179. package/dist/src/lib/crash-handlers.js +49 -0
  180. package/dist/src/lib/crash-handlers.js.map +1 -0
  181. package/dist/src/lib/credentials-store.d.ts +89 -0
  182. package/dist/src/lib/credentials-store.js +330 -0
  183. package/dist/src/lib/credentials-store.js.map +1 -0
  184. package/dist/src/lib/csv.d.ts +47 -0
  185. package/dist/src/lib/csv.js +172 -0
  186. package/dist/src/lib/csv.js.map +1 -0
  187. package/dist/src/lib/data-input.d.ts +23 -0
  188. package/dist/src/lib/data-input.js +50 -0
  189. package/dist/src/lib/data-input.js.map +1 -0
  190. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  191. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  192. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  193. package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
  194. package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
  195. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  196. package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
  197. package/dist/src/lib/db-codegen/dbNaming.js +180 -0
  198. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  199. package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
  200. package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
  201. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  202. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
  203. package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
  204. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  205. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
  206. package/dist/src/lib/db-codegen/dbTypeIR.js +517 -0
  207. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
  208. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
  209. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
  210. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
  211. package/dist/src/lib/env-resolver.d.ts +62 -0
  212. package/dist/src/lib/env-resolver.js +121 -0
  213. package/dist/src/lib/env-resolver.js.map +1 -0
  214. package/dist/src/lib/fetch.d.ts +5 -0
  215. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  216. package/dist/src/lib/generated-allowlist.js +266 -0
  217. package/dist/src/lib/generated-allowlist.js.map +1 -0
  218. package/dist/src/lib/generated-config-surfaces.d.ts +578 -0
  219. package/dist/src/lib/generated-config-surfaces.js +3630 -0
  220. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  221. package/dist/src/lib/generated-template-lint.d.ts +206 -0
  222. package/dist/src/lib/generated-template-lint.js +589 -0
  223. package/dist/src/lib/generated-template-lint.js.map +1 -0
  224. package/dist/src/lib/generated-workflow-model-fields.d.ts +20 -0
  225. package/dist/src/lib/generated-workflow-model-fields.js +53 -0
  226. package/dist/src/lib/generated-workflow-model-fields.js.map +1 -0
  227. package/dist/src/lib/google-client-secret-status.d.ts +35 -0
  228. package/dist/src/lib/google-client-secret-status.js +56 -0
  229. package/dist/src/lib/google-client-secret-status.js.map +1 -0
  230. package/dist/src/lib/init-config.d.ts +81 -0
  231. package/dist/src/lib/init-config.js +149 -0
  232. package/dist/src/lib/init-config.js.map +1 -0
  233. package/dist/src/lib/log-inspection.d.ts +568 -0
  234. package/dist/src/lib/log-inspection.js +639 -0
  235. package/dist/src/lib/log-inspection.js.map +1 -0
  236. package/dist/src/lib/migration-nag.d.ts +49 -0
  237. package/dist/src/lib/migration-nag.js +163 -0
  238. package/dist/src/lib/migration-nag.js.map +1 -0
  239. package/dist/src/lib/output.d.ts +109 -0
  240. package/dist/src/lib/output.js +191 -8
  241. package/dist/src/lib/output.js.map +1 -1
  242. package/dist/src/lib/package-manager.d.ts +140 -0
  243. package/dist/src/lib/package-manager.js +305 -0
  244. package/dist/src/lib/package-manager.js.map +1 -0
  245. package/dist/src/lib/paginate.d.ts +83 -0
  246. package/dist/src/lib/paginate.js +95 -0
  247. package/dist/src/lib/paginate.js.map +1 -0
  248. package/dist/src/lib/platform-owned.d.ts +51 -0
  249. package/dist/src/lib/platform-owned.js +64 -0
  250. package/dist/src/lib/platform-owned.js.map +1 -0
  251. package/dist/src/lib/project-config.d.ts +97 -0
  252. package/dist/src/lib/project-config.js +219 -0
  253. package/dist/src/lib/project-config.js.map +1 -0
  254. package/dist/src/lib/query-operators.d.ts +43 -0
  255. package/dist/src/lib/query-operators.js +80 -0
  256. package/dist/src/lib/query-operators.js.map +1 -0
  257. package/dist/src/lib/record-filter.d.ts +18 -0
  258. package/dist/src/lib/record-filter.js +55 -0
  259. package/dist/src/lib/record-filter.js.map +1 -0
  260. package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
  261. package/dist/src/lib/refresh-admin-credentials.js +103 -0
  262. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  263. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  264. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  265. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  266. package/dist/src/lib/resolve-init-server.d.ts +71 -0
  267. package/dist/src/lib/resolve-init-server.js +94 -0
  268. package/dist/src/lib/resolve-init-server.js.map +1 -0
  269. package/dist/src/lib/resolve-platform.d.ts +45 -0
  270. package/dist/src/lib/resolve-platform.js +43 -0
  271. package/dist/src/lib/resolve-platform.js.map +1 -0
  272. package/dist/src/lib/run-status.d.ts +19 -0
  273. package/dist/src/lib/run-status.generated.d.ts +39 -0
  274. package/dist/src/lib/run-status.generated.js +66 -0
  275. package/dist/src/lib/run-status.generated.js.map +1 -0
  276. package/dist/src/lib/run-status.js +19 -0
  277. package/dist/src/lib/run-status.js.map +1 -0
  278. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  279. package/dist/src/lib/signing-secret-status.js +116 -0
  280. package/dist/src/lib/signing-secret-status.js.map +1 -0
  281. package/dist/src/lib/skill-installer.d.ts +25 -0
  282. package/dist/src/lib/skill-installer.js +266 -0
  283. package/dist/src/lib/skill-installer.js.map +1 -0
  284. package/dist/src/lib/snapshots.d.ts +99 -0
  285. package/dist/src/lib/snapshots.js +357 -0
  286. package/dist/src/lib/snapshots.js.map +1 -0
  287. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +100 -0
  288. package/dist/src/lib/swift-codegen/dbGenerator.js +682 -0
  289. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  290. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  291. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  292. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  293. package/dist/src/lib/swift-codegen/generator.d.ts +85 -0
  294. package/dist/src/lib/swift-codegen/generator.js +266 -0
  295. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  296. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
  297. package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
  298. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  299. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +90 -0
  300. package/dist/src/lib/swift-codegen/siblingSymbols.js +152 -0
  301. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  302. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  303. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  304. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  305. package/dist/src/lib/sync-paths.d.ts +72 -0
  306. package/dist/src/lib/sync-paths.js +130 -0
  307. package/dist/src/lib/sync-paths.js.map +1 -0
  308. package/dist/src/lib/sync-resource-types.d.ts +445 -0
  309. package/dist/src/lib/sync-resource-types.js +812 -0
  310. package/dist/src/lib/sync-resource-types.js.map +1 -0
  311. package/dist/src/lib/sync-selectors.d.ts +95 -0
  312. package/dist/src/lib/sync-selectors.js +228 -0
  313. package/dist/src/lib/sync-selectors.js.map +1 -0
  314. package/dist/src/lib/template.d.ts +121 -0
  315. package/dist/src/lib/template.js +447 -67
  316. package/dist/src/lib/template.js.map +1 -1
  317. package/dist/src/lib/token-inject.d.ts +56 -0
  318. package/dist/src/lib/token-inject.js +204 -0
  319. package/dist/src/lib/token-inject.js.map +1 -0
  320. package/dist/src/lib/toml-database-config.d.ts +123 -0
  321. package/dist/src/lib/toml-database-config.js +527 -0
  322. package/dist/src/lib/toml-database-config.js.map +1 -0
  323. package/dist/src/lib/toml-metadata-config.d.ts +151 -0
  324. package/dist/src/lib/toml-metadata-config.js +476 -0
  325. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  326. package/dist/src/lib/toml-native-form.d.ts +46 -0
  327. package/dist/src/lib/toml-native-form.js +78 -0
  328. package/dist/src/lib/toml-native-form.js.map +1 -0
  329. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  330. package/dist/src/lib/toml-params-validator.js +298 -0
  331. package/dist/src/lib/toml-params-validator.js.map +1 -0
  332. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  333. package/dist/src/lib/toml-scalar-edit.js +283 -0
  334. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  335. package/dist/src/lib/user-selector.d.ts +24 -0
  336. package/dist/src/lib/user-selector.js +33 -0
  337. package/dist/src/lib/user-selector.js.map +1 -0
  338. package/dist/src/lib/version-check.d.ts +35 -0
  339. package/dist/src/lib/version-check.js +241 -0
  340. package/dist/src/lib/version-check.js.map +1 -0
  341. package/dist/src/lib/watch.d.ts +121 -0
  342. package/dist/src/lib/watch.js +169 -0
  343. package/dist/src/lib/watch.js.map +1 -0
  344. package/dist/src/lib/workflow-apply.d.ts +51 -0
  345. package/dist/src/lib/workflow-apply.js +89 -0
  346. package/dist/src/lib/workflow-apply.js.map +1 -0
  347. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  348. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  349. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  350. package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
  351. package/dist/src/lib/workflow-codegen/generator.js +361 -0
  352. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  353. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +83 -0
  354. package/dist/src/lib/workflow-codegen/invokerIR.js +71 -0
  355. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  356. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  357. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  358. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  359. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
  360. package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
  361. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  362. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  363. package/dist/src/lib/workflow-config-apply.js +137 -0
  364. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  365. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  366. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  367. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  368. package/dist/src/lib/workflow-field-descriptor.d.ts +91 -0
  369. package/dist/src/lib/workflow-field-descriptor.js +153 -0
  370. package/dist/src/lib/workflow-field-descriptor.js.map +1 -0
  371. package/dist/src/lib/workflow-fragments.d.ts +64 -0
  372. package/dist/src/lib/workflow-fragments.js +342 -0
  373. package/dist/src/lib/workflow-fragments.js.map +1 -0
  374. package/dist/src/lib/workflow-include-preserve.d.ts +71 -0
  375. package/dist/src/lib/workflow-include-preserve.js +153 -0
  376. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  377. package/dist/src/lib/workflow-payload.d.ts +86 -0
  378. package/dist/src/lib/workflow-payload.js +168 -0
  379. package/dist/src/lib/workflow-payload.js.map +1 -0
  380. package/dist/src/lib/workflow-toml-validator.d.ts +199 -0
  381. package/dist/src/lib/workflow-toml-validator.js +754 -0
  382. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  383. package/dist/src/types/index.d.ts +533 -0
  384. package/dist/src/validators.d.ts +65 -0
  385. package/dist/src/validators.js +64 -0
  386. package/dist/src/validators.js.map +1 -0
  387. package/package.json +32 -6
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Shared poll-based tailing helpers for `--watch` / `--follow` (#1969).
3
+ *
4
+ * Two render modes over one abortable poll loop:
5
+ * - `--watch` → periodic full-snapshot redraw (a repeated `list`/`get`).
6
+ * - `--follow` → append-only tail: fetch rows after an opaque server-owned
7
+ * `resumeAfter` checkpoint each tick.
8
+ *
9
+ * The loop is endpoint-agnostic. `--follow` consumers supply a {@link FollowSource}
10
+ * that knows how to fetch the page after a checkpoint; `--watch` consumers supply
11
+ * a `snapshot()` and a renderer. The renderer is injected (there is no `json`
12
+ * flag in the options) so this file never decides output shape or clears the
13
+ * terminal — that is entirely the caller's renderer.
14
+ *
15
+ * `--follow` is near-lossless observed-version tailing: it re-emits a row when a
16
+ * newer version is observed, holds no per-item dedup state, and asserts only
17
+ * forward progress — never a total-order or exactly-once property (the
18
+ * underlying GSI sorts by `modifiedAt` alone and is eventually consistent). See
19
+ * the design in #1969.
20
+ *
21
+ * Unit-tested against fake sources (the `cli/src/lib/paginate.ts` pattern) with
22
+ * no server.
23
+ */
24
+ /** Interval floor: reject anything below this (prevents a request storm). */
25
+ export declare const MIN_INTERVAL_SECONDS = 1;
26
+ /** Default poll interval when `--interval` is omitted. */
27
+ export declare const DEFAULT_INTERVAL_SECONDS = 2;
28
+ /**
29
+ * Default cap on how many pages `followLoop` drains within a single tick when a
30
+ * burst is larger than one page. Bounds the within-tick work and, with the
31
+ * non-advancing-checkpoint guard, prevents an infinite drain.
32
+ */
33
+ export declare const DEFAULT_MAX_PAGES_PER_TICK = 20;
34
+ /**
35
+ * Validate an `--interval` value (in seconds). Returns the interval in seconds,
36
+ * or throws with a clear message for a missing/NaN/sub-floor value. Command
37
+ * handlers call this and surface the error; the library loops take a validated
38
+ * `intervalMs`.
39
+ */
40
+ export declare function parseIntervalSeconds(raw: string | undefined): number;
41
+ /**
42
+ * Sleep for `ms`, resolving early (never rejecting) if `signal` aborts. The
43
+ * timer and abort listener are always cleaned up, so a resolved delay leaves no
44
+ * dangling timer. Used by every poll loop so Ctrl-C stops promptly between
45
+ * ticks.
46
+ */
47
+ export declare function delay(ms: number, signal?: AbortSignal): Promise<void>;
48
+ /** Error policy for the poll loops: keep polling, or throw out of the loop. */
49
+ export type PollErrorPolicy = "continue" | "throw";
50
+ export interface PollUntilOptions<T> {
51
+ /** Validated poll interval in milliseconds. */
52
+ intervalMs: number;
53
+ /** Abort signal (Ctrl-C at the command level). */
54
+ signal: AbortSignal;
55
+ /** What to do when `probe` throws. Default `"throw"`. */
56
+ onError?: PollErrorPolicy;
57
+ /** Called with each probed value (e.g. to report progress). */
58
+ onValue?: (value: T) => void;
59
+ }
60
+ /**
61
+ * Delay-then-probe until `done(value)` is true or the signal aborts. Returns
62
+ * the last probed value. Delay-first (not probe-first) so a caller that already
63
+ * holds a fresh value — the batch-status loops — keeps its "poll every N
64
+ * seconds" cadence with no extra immediate request.
65
+ */
66
+ export declare function pollUntil<T>(probe: () => Promise<T>, done: (value: T) => boolean, options: PollUntilOptions<T>): Promise<T>;
67
+ /** One page of follow results, carrying the opaque next checkpoint. */
68
+ export interface FollowPage<T> {
69
+ items: T[];
70
+ /** More rows remain past this page right now (drives the within-tick drain). */
71
+ hasMore: boolean;
72
+ /** Opaque server-owned checkpoint; always present, even on an empty page. */
73
+ resumeAfter: string;
74
+ }
75
+ /**
76
+ * A source of follow pages. `fetchAfter(undefined)` is the bootstrap poll — it
77
+ * establishes the baseline checkpoint and its items are NOT emitted (tail
78
+ * semantics: "show me what happens from now"). `fetchAfter(<token>)` returns the
79
+ * bounded page after that checkpoint.
80
+ */
81
+ export interface FollowSource<T> {
82
+ fetchAfter: (resumeAfter: string | undefined) => Promise<FollowPage<T>>;
83
+ /**
84
+ * Max pages to drain within one tick when a burst exceeds one page. Defaults
85
+ * to {@link DEFAULT_MAX_PAGES_PER_TICK}. The drain also stops early if the
86
+ * checkpoint fails to advance (non-advancing-checkpoint guard).
87
+ */
88
+ maxPagesPerTick?: number;
89
+ }
90
+ export interface FollowOptions<T> {
91
+ intervalMs: number;
92
+ signal: AbortSignal;
93
+ /** What to do when a poll throws. Default `"continue"` (keep tailing). */
94
+ onError?: PollErrorPolicy;
95
+ /** Render newly-observed rows (server-ascending; no client sort). */
96
+ render: (items: T[]) => void;
97
+ }
98
+ export interface WatchOptions<T> {
99
+ intervalMs: number;
100
+ signal: AbortSignal;
101
+ /** What to do when a poll throws. Default `"continue"`. */
102
+ onError?: PollErrorPolicy;
103
+ /**
104
+ * Render the full snapshot. The renderer owns any clearing/redraw — the loop
105
+ * never clears the terminal itself.
106
+ */
107
+ render: (items: T[]) => void;
108
+ }
109
+ /**
110
+ * Append-only tail. Bootstraps the baseline checkpoint (emitting nothing), then
111
+ * each tick drains forward while `hasMore` (bounded by `maxPagesPerTick`,
112
+ * stopping if the checkpoint fails to advance), rendering rows server-ascending.
113
+ * Holds no per-item state — the only carried state is the single opaque
114
+ * `resumeAfter` string.
115
+ */
116
+ export declare function followLoop<T>(source: FollowSource<T>, options: FollowOptions<T>): Promise<void>;
117
+ /**
118
+ * Snapshot redraw. Each tick fetches the full current snapshot and hands it to
119
+ * the renderer, which owns any clearing/redraw. No checkpoint, no dedup.
120
+ */
121
+ export declare function watchLoop<T>(snapshot: () => Promise<T[]>, options: WatchOptions<T>): Promise<void>;
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Shared poll-based tailing helpers for `--watch` / `--follow` (#1969).
3
+ *
4
+ * Two render modes over one abortable poll loop:
5
+ * - `--watch` → periodic full-snapshot redraw (a repeated `list`/`get`).
6
+ * - `--follow` → append-only tail: fetch rows after an opaque server-owned
7
+ * `resumeAfter` checkpoint each tick.
8
+ *
9
+ * The loop is endpoint-agnostic. `--follow` consumers supply a {@link FollowSource}
10
+ * that knows how to fetch the page after a checkpoint; `--watch` consumers supply
11
+ * a `snapshot()` and a renderer. The renderer is injected (there is no `json`
12
+ * flag in the options) so this file never decides output shape or clears the
13
+ * terminal — that is entirely the caller's renderer.
14
+ *
15
+ * `--follow` is near-lossless observed-version tailing: it re-emits a row when a
16
+ * newer version is observed, holds no per-item dedup state, and asserts only
17
+ * forward progress — never a total-order or exactly-once property (the
18
+ * underlying GSI sorts by `modifiedAt` alone and is eventually consistent). See
19
+ * the design in #1969.
20
+ *
21
+ * Unit-tested against fake sources (the `cli/src/lib/paginate.ts` pattern) with
22
+ * no server.
23
+ */
24
+ /** Interval floor: reject anything below this (prevents a request storm). */
25
+ export const MIN_INTERVAL_SECONDS = 1;
26
+ /** Default poll interval when `--interval` is omitted. */
27
+ export const DEFAULT_INTERVAL_SECONDS = 2;
28
+ /**
29
+ * Default cap on how many pages `followLoop` drains within a single tick when a
30
+ * burst is larger than one page. Bounds the within-tick work and, with the
31
+ * non-advancing-checkpoint guard, prevents an infinite drain.
32
+ */
33
+ export const DEFAULT_MAX_PAGES_PER_TICK = 20;
34
+ /**
35
+ * Validate an `--interval` value (in seconds). Returns the interval in seconds,
36
+ * or throws with a clear message for a missing/NaN/sub-floor value. Command
37
+ * handlers call this and surface the error; the library loops take a validated
38
+ * `intervalMs`.
39
+ */
40
+ export function parseIntervalSeconds(raw) {
41
+ if (raw === undefined)
42
+ return DEFAULT_INTERVAL_SECONDS;
43
+ const n = Number(raw);
44
+ if (!Number.isFinite(n) || n < MIN_INTERVAL_SECONDS) {
45
+ throw new Error(`--interval must be a number of seconds >= ${MIN_INTERVAL_SECONDS}`);
46
+ }
47
+ return n;
48
+ }
49
+ /**
50
+ * Sleep for `ms`, resolving early (never rejecting) if `signal` aborts. The
51
+ * timer and abort listener are always cleaned up, so a resolved delay leaves no
52
+ * dangling timer. Used by every poll loop so Ctrl-C stops promptly between
53
+ * ticks.
54
+ */
55
+ export function delay(ms, signal) {
56
+ return new Promise((resolve) => {
57
+ if (signal?.aborted) {
58
+ resolve();
59
+ return;
60
+ }
61
+ const timer = setTimeout(() => {
62
+ cleanup();
63
+ resolve();
64
+ }, ms);
65
+ const onAbort = () => {
66
+ clearTimeout(timer);
67
+ cleanup();
68
+ resolve();
69
+ };
70
+ const cleanup = () => signal?.removeEventListener("abort", onAbort);
71
+ signal?.addEventListener("abort", onAbort, { once: true });
72
+ });
73
+ }
74
+ /**
75
+ * Delay-then-probe until `done(value)` is true or the signal aborts. Returns
76
+ * the last probed value. Delay-first (not probe-first) so a caller that already
77
+ * holds a fresh value — the batch-status loops — keeps its "poll every N
78
+ * seconds" cadence with no extra immediate request.
79
+ */
80
+ export async function pollUntil(probe, done, options) {
81
+ const onError = options.onError ?? "throw";
82
+ let last;
83
+ let haveValue = false;
84
+ while (!options.signal.aborted) {
85
+ await delay(options.intervalMs, options.signal);
86
+ if (options.signal.aborted)
87
+ break;
88
+ try {
89
+ last = await probe();
90
+ haveValue = true;
91
+ }
92
+ catch (err) {
93
+ if (onError === "continue")
94
+ continue;
95
+ throw err;
96
+ }
97
+ options.onValue?.(last);
98
+ if (done(last))
99
+ return last;
100
+ }
101
+ // Aborted before `done`: return the last probed value (probe once if we never
102
+ // got one, so the return type holds).
103
+ if (!haveValue)
104
+ last = await probe();
105
+ return last;
106
+ }
107
+ /**
108
+ * Append-only tail. Bootstraps the baseline checkpoint (emitting nothing), then
109
+ * each tick drains forward while `hasMore` (bounded by `maxPagesPerTick`,
110
+ * stopping if the checkpoint fails to advance), rendering rows server-ascending.
111
+ * Holds no per-item state — the only carried state is the single opaque
112
+ * `resumeAfter` string.
113
+ */
114
+ export async function followLoop(source, options) {
115
+ const onError = options.onError ?? "continue";
116
+ const maxPages = source.maxPagesPerTick ?? DEFAULT_MAX_PAGES_PER_TICK;
117
+ // Bootstrap: establish the baseline; do not emit its rows.
118
+ let resumeAfter;
119
+ try {
120
+ resumeAfter = (await source.fetchAfter(undefined)).resumeAfter;
121
+ }
122
+ catch (err) {
123
+ if (onError !== "continue")
124
+ throw err;
125
+ resumeAfter = ""; // fall through to polling; the next tick retries
126
+ }
127
+ while (!options.signal.aborted) {
128
+ try {
129
+ let pages = 0;
130
+ while (pages < maxPages && !options.signal.aborted) {
131
+ const page = await source.fetchAfter(resumeAfter || undefined);
132
+ if (page.items.length > 0)
133
+ options.render(page.items);
134
+ const advanced = page.resumeAfter !== resumeAfter;
135
+ resumeAfter = page.resumeAfter;
136
+ pages++;
137
+ // Stop the within-tick drain when the burst is drained, or if the
138
+ // checkpoint didn't advance (guards against an endless drain).
139
+ if (!page.hasMore || !advanced)
140
+ break;
141
+ }
142
+ }
143
+ catch (err) {
144
+ if (onError !== "continue")
145
+ throw err;
146
+ // continue: swallow and retry next tick
147
+ }
148
+ await delay(options.intervalMs, options.signal);
149
+ }
150
+ }
151
+ /**
152
+ * Snapshot redraw. Each tick fetches the full current snapshot and hands it to
153
+ * the renderer, which owns any clearing/redraw. No checkpoint, no dedup.
154
+ */
155
+ export async function watchLoop(snapshot, options) {
156
+ const onError = options.onError ?? "continue";
157
+ while (!options.signal.aborted) {
158
+ try {
159
+ const items = await snapshot();
160
+ options.render(items);
161
+ }
162
+ catch (err) {
163
+ if (onError !== "continue")
164
+ throw err;
165
+ }
166
+ await delay(options.intervalMs, options.signal);
167
+ }
168
+ }
169
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/lib/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Shared "apply a TOML body to an existing workflow" helper.
3
+ *
4
+ * Extracted from the `sync push` update-existing path (#1249, Fork 4) so that
5
+ * both `sync push` and `workflows update --from-file` push a revised body the
6
+ * same way. A second inlined copy would regress #807: the update is
7
+ * ordering-sensitive and a naive metadata-then-body sequence rejects valid
8
+ * sync-callable edits.
9
+ *
10
+ * Ordering invariant (#807 / codex review):
11
+ * 1. metadata PATCH — WITHOUT `syncCallable`. The server re-validates
12
+ * `syncCallable: true` against the workflow's CURRENTLY-active server
13
+ * steps (`loadCurrentActiveSteps`, src/admin-api.ts:4734), not the steps
14
+ * being pushed in the same call. So enabling sync-callable in the first
15
+ * PATCH would validate against the stale active steps and be rejected.
16
+ * 2. body write — steps to the active config (config-model) or the legacy
17
+ * draft slot (no active config).
18
+ * 3. a SECOND `syncCallable` PATCH — issued AFTER the new steps are active,
19
+ * so it validates against the new (compatible) steps.
20
+ */
21
+ import type { ApiClient } from "./api-client.js";
22
+ import { safeJsonParse } from "./workflow-payload.js";
23
+ export { safeJsonParse };
24
+ export interface ApplyWorkflowBodyOptions {
25
+ /** Optimistic-concurrency guard for the metadata + syncCallable PATCHes. */
26
+ expectedModifiedAt?: string;
27
+ /**
28
+ * Active config to overwrite in place (config-model workflows). When absent,
29
+ * the body falls back to the legacy draft slot — non-live for config-model
30
+ * workflows, which the server rejects with 409 WORKFLOW_CONFIG_MODEL.
31
+ */
32
+ activeConfigId?: string;
33
+ /** When true, skip the optimistic-concurrency check (mirrors `--force`). */
34
+ force?: boolean;
35
+ }
36
+ export interface ApplyWorkflowBodyResult {
37
+ /** The freshest workflow `modifiedAt` after all PATCHes (for sync state). */
38
+ latestModifiedAt?: string;
39
+ /** Which slot the steps landed in: "active config" or "draft (legacy)". */
40
+ updateSlotLabel: string;
41
+ /** A fresh `getWorkflow` result so callers can read back configs/state. */
42
+ fullWorkflow: any;
43
+ }
44
+ /**
45
+ * Apply a parsed workflow body (metadata + steps) to an existing workflow,
46
+ * preserving the key/id. `workflow` is the TOML's `[workflow]` table (already
47
+ * merged with any explicit CLI flag overrides by the caller); `steps` is the
48
+ * TOML's `steps` array. The function performs the three-step ordered update
49
+ * and returns the latest `modifiedAt`, the slot label, and a fresh workflow.
50
+ */
51
+ export declare function applyWorkflowBody(client: ApiClient, appId: string, workflowId: string, workflow: any, steps: any[], opts?: ApplyWorkflowBodyOptions): Promise<ApplyWorkflowBodyResult>;
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Shared "apply a TOML body to an existing workflow" helper.
3
+ *
4
+ * Extracted from the `sync push` update-existing path (#1249, Fork 4) so that
5
+ * both `sync push` and `workflows update --from-file` push a revised body the
6
+ * same way. A second inlined copy would regress #807: the update is
7
+ * ordering-sensitive and a naive metadata-then-body sequence rejects valid
8
+ * sync-callable edits.
9
+ *
10
+ * Ordering invariant (#807 / codex review):
11
+ * 1. metadata PATCH — WITHOUT `syncCallable`. The server re-validates
12
+ * `syncCallable: true` against the workflow's CURRENTLY-active server
13
+ * steps (`loadCurrentActiveSteps`, src/admin-api.ts:4734), not the steps
14
+ * being pushed in the same call. So enabling sync-callable in the first
15
+ * PATCH would validate against the stale active steps and be rejected.
16
+ * 2. body write — steps to the active config (config-model) or the legacy
17
+ * draft slot (no active config).
18
+ * 3. a SECOND `syncCallable` PATCH — issued AFTER the new steps are active,
19
+ * so it validates against the new (compatible) steps.
20
+ */
21
+ import { buildWorkflowPayloadFromToml, safeJsonParse } from "./workflow-payload.js";
22
+ // #1177: `safeJsonParse` now lives in the shared `workflow-payload` lib module
23
+ // (the builder needs it too); re-exported here so existing importers of this
24
+ // module keep working. Both `cli/src/lib` modules; no dep-direction problem.
25
+ export { safeJsonParse };
26
+ /**
27
+ * Apply a parsed workflow body (metadata + steps) to an existing workflow,
28
+ * preserving the key/id. `workflow` is the TOML's `[workflow]` table (already
29
+ * merged with any explicit CLI flag overrides by the caller); `steps` is the
30
+ * TOML's `steps` array. The function performs the three-step ordered update
31
+ * and returns the latest `modifiedAt`, the slot label, and a fresh workflow.
32
+ */
33
+ export async function applyWorkflowBody(client, appId, workflowId, workflow, steps, opts = {}) {
34
+ const { expectedModifiedAt, activeConfigId, force } = opts;
35
+ // 1. Metadata PATCH — note: NO `syncCallable` here (deferred to step 3). The
36
+ // shared builder (#1177, `mode: "update"`) omits `syncCallable` for exactly
37
+ // this reason and applies the presence-aware clear-vs-leave semantics for
38
+ // `accessRule` / `runAs` / `capabilities` / schemas. `requiresClientApply`
39
+ // has no step-dependent validation, so the builder keeps it here. The
40
+ // `metadataManifest` declared-access manifest (#1304) is call-site-specific
41
+ // and attached below, not owned by the shared builder.
42
+ const updated = await client.updateWorkflow(appId, workflowId, {
43
+ ...buildWorkflowPayloadFromToml(workflow, { mode: "update" }),
44
+ // #1304 (P-C): declared-access manifest. Absent key → undefined (server's
45
+ // hasOwnProperty guard leaves it untouched); a parsed value/null is
46
+ // forwarded so a pull → push round-trips it (null clears). `sync push`
47
+ // always attaches this (null when the TOML drops `[metadata]`); the
48
+ // `workflows update --from-file` caller may leave it undefined.
49
+ metadataManifest: workflow.metadataManifest !== undefined ? workflow.metadataManifest : undefined,
50
+ }, expectedModifiedAt);
51
+ // The first PATCH bumps `modifiedAt`; the syncCallable PATCH (if any) bumps
52
+ // it again. The config/step update does NOT touch the workflow definition's
53
+ // `modifiedAt`.
54
+ let latestModifiedAt = updated?.workflow?.modifiedAt;
55
+ // 2. Body write — active config (config-model) or legacy draft slot. #1614 —
56
+ // the named `expr.*` definitions live on the same R2 steps payload as the
57
+ // steps, so they travel with the steps write here (not the metadata PATCH
58
+ // above). Attached by the caller onto `workflow.expressions` (structural,
59
+ // like `metadataManifest`); absent → undefined so a workflow without
60
+ // definitions round-trips a clean drop.
61
+ const expressions = workflow.expressions ?? undefined;
62
+ let updateSlotLabel = "active config";
63
+ if (activeConfigId) {
64
+ await client.updateWorkflowConfig(appId, workflowId, activeConfigId, {
65
+ steps,
66
+ expressions,
67
+ });
68
+ }
69
+ else {
70
+ await client.updateWorkflowDraft(appId, workflowId, {
71
+ steps,
72
+ expressions,
73
+ inputSchema: workflow.inputSchema ? safeJsonParse(workflow.inputSchema) : null,
74
+ });
75
+ updateSlotLabel = "draft (legacy)";
76
+ }
77
+ // 3. Deferred `syncCallable` PATCH — now that the new steps are active (#807).
78
+ // Only sent when the TOML actually carries the key; an absent key stays
79
+ // `undefined` and the call is skipped, preserving no-clobber discipline.
80
+ if (workflow.syncCallable !== undefined) {
81
+ const syncCallableUpdated = await client.updateWorkflow(appId, workflowId, { syncCallable: workflow.syncCallable }, force ? undefined : latestModifiedAt);
82
+ if (syncCallableUpdated?.workflow?.modifiedAt) {
83
+ latestModifiedAt = syncCallableUpdated.workflow.modifiedAt;
84
+ }
85
+ }
86
+ const fullWorkflow = await client.getWorkflow(appId, workflowId);
87
+ return { latestModifiedAt, updateSlotLabel, fullWorkflow };
88
+ }
89
+ //# sourceMappingURL=workflow-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-apply.js","sourceRoot":"","sources":["../../../src/lib/workflow-apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,4BAA4B,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEpF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,OAAO,EAAE,aAAa,EAAE,CAAC;AAwBzB;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAiB,EACjB,KAAa,EACb,UAAkB,EAClB,QAAa,EACb,KAAY,EACZ,OAAiC,EAAE;IAEnC,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3D,6EAA6E;IAC7E,+EAA+E;IAC/E,6EAA6E;IAC7E,8EAA8E;IAC9E,yEAAyE;IACzE,+EAA+E;IAC/E,0DAA0D;IAC1D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CACzC,KAAK,EACL,UAAU,EACV;QACE,GAAG,4BAA4B,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC7D,0EAA0E;QAC1E,oEAAoE;QACpE,uEAAuE;QACvE,oEAAoE;QACpE,gEAAgE;QAChE,gBAAgB,EACd,QAAQ,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;KAClF,EACD,kBAAkB,CACnB,CAAC;IAEF,4EAA4E;IAC5E,4EAA4E;IAC5E,gBAAgB;IAChB,IAAI,gBAAgB,GAAuB,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;IAEzE,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,wEAAwE;IACxE,2CAA2C;IAC3C,MAAM,WAAW,GAAI,QAAgB,CAAC,WAAW,IAAI,SAAS,CAAC;IAC/D,IAAI,eAAe,GAAG,eAAe,CAAC;IACtC,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE;YACnE,KAAK;YACL,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE;YAClD,KAAK;YACL,WAAW;YACX,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;SAC/E,CAAC,CAAC;QACH,eAAe,GAAG,gBAAgB,CAAC;IACrC,CAAC;IAED,+EAA+E;IAC/E,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,mBAAmB,GAAG,MAAM,MAAM,CAAC,cAAc,CACrD,KAAK,EACL,UAAU,EACV,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,EACvC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CACrC,CAAC;QACF,IAAI,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YAC9C,gBAAgB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACjE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * GENERATED FILE — DO NOT EDIT BY HAND.
3
+ *
4
+ * Vendored byte-for-byte from the canonical server module
5
+ * `src/workflows/schema-descriptor.ts` — the SAME interpretation the server
6
+ * validator (`validateValue`) enforces. The CLI cannot import server `src/`
7
+ * at runtime, so `workflows codegen`'s type converter imports this committed
8
+ * copy instead.
9
+ *
10
+ * Regenerate with:
11
+ * node cli/scripts/gen-workflow-schema-descriptor.mjs (runs at CLI prebuild)
12
+ *
13
+ * A CI freshness guard
14
+ * (`cli/scripts/gen-workflow-schema-descriptor.mjs --check`, also asserted by
15
+ * `cli/tests/unit/workflow-codegen-descriptor-drift-guard.test.ts`) fails if
16
+ * this committed copy does not match the source — see issue #1442 / #998.
17
+ */
18
+ /**
19
+ * Canonical interpretation of the JSON-Schema subset the workflow platform
20
+ * supports (issue #1442).
21
+ *
22
+ * The server validator (`validateValue` in `schema-validation.ts`) and the CLI
23
+ * `workflows codegen` type converter (`workflow-codegen/schemaToTs.ts`) must
24
+ * agree EXACTLY on how a workflow `inputSchema`/`outputSchema` is interpreted —
25
+ * otherwise a generated `<Key>Input` type promises a shape the runtime does not
26
+ * enforce (or rejects a value the runtime accepts). Previously the converter
27
+ * re-derived those interpretation decisions by hand, which drifts from the
28
+ * validator over time.
29
+ *
30
+ * This module is the single source of that interpretation. Both consumers read
31
+ * from `describeSchema` + `isType`:
32
+ *
33
+ * - the type gate is checked before `enum` (a value failing `type` is
34
+ * rejected before `enum` is consulted);
35
+ * - a type UNION (`type: ["string","null"]`) never descends into
36
+ * `properties`/`items` — only the exact string types `"object"`/`"array"`
37
+ * do;
38
+ * - `integer` means `Number.isInteger`;
39
+ * - `additionalProperties` only closes an object; it is not a nested schema.
40
+ *
41
+ * It is deliberately dependency-free (no imports) so the CLI can vendor a
42
+ * byte-for-byte copy as a committed artifact via
43
+ * `cli/scripts/gen-workflow-schema-descriptor.mjs` (the #998 gen-allowlist
44
+ * pattern). A drift-guard test runs that generator in `--check` mode, so a
45
+ * change here that isn't regenerated into the CLI artifact fails CI. The CLI
46
+ * never imports server `src/` at runtime — only the build-time generator reads
47
+ * this file.
48
+ */
49
+ /** Does a value satisfy a JSON-schema `type` name? `integer` = `Number.isInteger`. */
50
+ export declare function isType(value: any, type: string): boolean;
51
+ /**
52
+ * The interpretation of a single schema node, normalized so both the validator
53
+ * and the type converter can consume it without re-reading raw schema fields.
54
+ */
55
+ export interface SchemaDescriptor {
56
+ /** True when `schema.type` is an array (a type union). */
57
+ isUnion: boolean;
58
+ /** `schema.type` when it is a single string; null for a union or absent type. */
59
+ singularType: string | null;
60
+ /**
61
+ * The declared type(s) normalized to an array. An array `type` is kept as-is;
62
+ * a single string becomes a one-element array; an absent/falsy type is `[]`
63
+ * (no type gate). Matches the validator's `allowedTypes` normalization.
64
+ */
65
+ types: string[];
66
+ /** The `enum` array when present, else null. */
67
+ enumValues: any[] | null;
68
+ /**
69
+ * Object descent info — non-null ONLY when `schema.type` is exactly the
70
+ * string `"object"` AND `properties` is a declared object (matching the
71
+ * validator's `schema.type === "object" && schema.properties` descent gate).
72
+ * A type UNION containing `"object"` never descends.
73
+ */
74
+ object: {
75
+ /** The raw `properties` map (child schemas). May be empty `{}`. */
76
+ properties: Record<string, any>;
77
+ /** The raw `required` list (unfiltered, as the validator reads it). */
78
+ required: any[];
79
+ /** True when `additionalProperties === false` (a closed object). */
80
+ additionalPropertiesClosed: boolean;
81
+ } | null;
82
+ /**
83
+ * Array descent info — non-null ONLY when `schema.type` is exactly the string
84
+ * `"array"` AND `items` is present (matching the validator's
85
+ * `schema.type === "array" && schema.items` descent gate).
86
+ */
87
+ array: {
88
+ /** The raw `items` schema (may be a tuple array the validator no-ops on). */
89
+ items: any;
90
+ } | null;
91
+ /**
92
+ * Discriminated-union (tagged-union) interpretation of a `oneOf` node (#1511).
93
+ *
94
+ * Populated ONLY when the node carries a `oneOf` (or `anyOf`) array whose
95
+ * members are ALL `type: "object"` — a clearly-intended tagged union. A
96
+ * `oneOf`/`anyOf` with any non-object member is NOT a tagged union: `oneOf`
97
+ * stays `null` here and is ignored (renders `unknown` / validates
98
+ * permissively) exactly as before, preserving backward compatibility.
99
+ *
100
+ * - `kind: "valid"` — a clean discriminated union: ≥2 object members sharing
101
+ * exactly one discriminator property declared as a single-literal `enum`
102
+ * in every member with distinct literals across members. The validator
103
+ * branch-selects by `discriminant` and validates only the matched member;
104
+ * the type converter renders the `|`-union of member object types.
105
+ * - `kind: "invalid"` — an all-object-member union that LOOKS like a tagged
106
+ * union but is defective (fewer than 2 members, no/ambiguous discriminator,
107
+ * or `anyOf` — unsupported in v1). `reason` is the codegen error message.
108
+ * The runtime validator ignores this (stays permissive); the codegen
109
+ * converter throws `reason` (Fork 3 = strict, resolved by the maintainer).
110
+ */
111
+ oneOf: {
112
+ kind: "valid";
113
+ /** The auto-detected discriminator property name. */
114
+ discriminant: string;
115
+ /** One entry per member: its discriminant literal + raw member schema. */
116
+ members: Array<{
117
+ discriminantValue: any;
118
+ schema: any;
119
+ }>;
120
+ } | {
121
+ kind: "invalid";
122
+ reason: string;
123
+ } | null;
124
+ }
125
+ /**
126
+ * Interpret a parsed schema node. A non-object schema (null, array, scalar)
127
+ * enforces nothing → the empty descriptor.
128
+ */
129
+ export declare function describeSchema(schema: any): SchemaDescriptor;