primitive-admin 1.0.60 → 1.0.62

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 (310) hide show
  1. package/README.md +125 -69
  2. package/assets/skill/skills/primitive-platform/SKILL.md +336 -37
  3. package/dist/bin/primitive.js +29 -14
  4. package/dist/bin/primitive.js.map +1 -1
  5. package/dist/src/commands/admins.js +22 -8
  6. package/dist/src/commands/admins.js.map +1 -1
  7. package/dist/src/commands/analytics.js +96 -16
  8. package/dist/src/commands/analytics.js.map +1 -1
  9. package/dist/src/commands/apps.js +49 -188
  10. package/dist/src/commands/apps.js.map +1 -1
  11. package/dist/src/commands/blob-buckets.js +50 -155
  12. package/dist/src/commands/blob-buckets.js.map +1 -1
  13. package/dist/src/commands/collection-type-configs.js +14 -100
  14. package/dist/src/commands/collection-type-configs.js.map +1 -1
  15. package/dist/src/commands/collections.js +47 -8
  16. package/dist/src/commands/collections.js.map +1 -1
  17. package/dist/src/commands/config.d.ts +46 -0
  18. package/dist/src/commands/config.js +479 -0
  19. package/dist/src/commands/config.js.map +1 -0
  20. package/dist/src/commands/connections.d.ts +2 -0
  21. package/dist/src/commands/connections.js +100 -0
  22. package/dist/src/commands/connections.js.map +1 -0
  23. package/dist/src/commands/cron-triggers.js +84 -176
  24. package/dist/src/commands/cron-triggers.js.map +1 -1
  25. package/dist/src/commands/database-type-configs.d.ts +2 -0
  26. package/dist/src/commands/database-type-configs.js +171 -0
  27. package/dist/src/commands/database-type-configs.js.map +1 -0
  28. package/dist/src/commands/database-types.js +4 -4
  29. package/dist/src/commands/database-types.js.map +1 -1
  30. package/dist/src/commands/databases.d.ts +63 -0
  31. package/dist/src/commands/databases.js +649 -87
  32. package/dist/src/commands/databases.js.map +1 -1
  33. package/dist/src/commands/documents.js +869 -12
  34. package/dist/src/commands/documents.js.map +1 -1
  35. package/dist/src/commands/email-templates.js +18 -125
  36. package/dist/src/commands/email-templates.js.map +1 -1
  37. package/dist/src/commands/env.d.ts +12 -1
  38. package/dist/src/commands/env.js +98 -25
  39. package/dist/src/commands/env.js.map +1 -1
  40. package/dist/src/commands/feature-flags.d.ts +14 -0
  41. package/dist/src/commands/feature-flags.js +116 -0
  42. package/dist/src/commands/feature-flags.js.map +1 -0
  43. package/dist/src/commands/group-type-configs.js +14 -109
  44. package/dist/src/commands/group-type-configs.js.map +1 -1
  45. package/dist/src/commands/init.d.ts +9 -1
  46. package/dist/src/commands/init.js +1058 -279
  47. package/dist/src/commands/init.js.map +1 -1
  48. package/dist/src/commands/integrations.js +136 -421
  49. package/dist/src/commands/integrations.js.map +1 -1
  50. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  51. package/dist/src/commands/metadata-category-configs.js +112 -0
  52. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  53. package/dist/src/commands/metadata.js +33 -141
  54. package/dist/src/commands/metadata.js.map +1 -1
  55. package/dist/src/commands/prompts.js +206 -563
  56. package/dist/src/commands/prompts.js.map +1 -1
  57. package/dist/src/commands/rule-sets.d.ts +1 -1
  58. package/dist/src/commands/rule-sets.js +16 -132
  59. package/dist/src/commands/rule-sets.js.map +1 -1
  60. package/dist/src/commands/scripts.js +67 -234
  61. package/dist/src/commands/scripts.js.map +1 -1
  62. package/dist/src/commands/sessions.d.ts +2 -0
  63. package/dist/src/commands/sessions.js +75 -0
  64. package/dist/src/commands/sessions.js.map +1 -0
  65. package/dist/src/commands/skill.js +2 -2
  66. package/dist/src/commands/skill.js.map +1 -1
  67. package/dist/src/commands/sync-app-settings.d.ts +113 -70
  68. package/dist/src/commands/sync-app-settings.js +193 -242
  69. package/dist/src/commands/sync-app-settings.js.map +1 -1
  70. package/dist/src/commands/sync.d.ts +1932 -49
  71. package/dist/src/commands/sync.js +9584 -1725
  72. package/dist/src/commands/sync.js.map +1 -1
  73. package/dist/src/commands/tokens.js +8 -2
  74. package/dist/src/commands/tokens.js.map +1 -1
  75. package/dist/src/commands/users.js +92 -1
  76. package/dist/src/commands/users.js.map +1 -1
  77. package/dist/src/commands/vars.js +44 -58
  78. package/dist/src/commands/vars.js.map +1 -1
  79. package/dist/src/commands/webhooks.js +318 -156
  80. package/dist/src/commands/webhooks.js.map +1 -1
  81. package/dist/src/commands/workflows.d.ts +49 -12
  82. package/dist/src/commands/workflows.js +652 -1043
  83. package/dist/src/commands/workflows.js.map +1 -1
  84. package/dist/src/lib/access-rule-display.d.ts +21 -0
  85. package/dist/src/lib/access-rule-display.js +34 -0
  86. package/dist/src/lib/access-rule-display.js.map +1 -0
  87. package/dist/src/lib/api-client.d.ts +630 -61
  88. package/dist/src/lib/api-client.js +676 -116
  89. package/dist/src/lib/api-client.js.map +1 -1
  90. package/dist/src/lib/app-settings-descriptor.d.ts +180 -25
  91. package/dist/src/lib/app-settings-descriptor.js +403 -82
  92. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  93. package/dist/src/lib/canonical-json.d.ts +12 -0
  94. package/dist/src/lib/canonical-json.js +35 -0
  95. package/dist/src/lib/canonical-json.js.map +1 -0
  96. package/dist/src/lib/cli-manifest.d.ts +8 -0
  97. package/dist/src/lib/cli-manifest.js +1 -0
  98. package/dist/src/lib/cli-manifest.js.map +1 -1
  99. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +6 -2
  100. package/dist/src/lib/codegen-shared/generatedFiles.js +9 -2
  101. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -1
  102. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +6 -6
  103. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +8 -8
  104. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -1
  105. package/dist/src/lib/config-object-descriptor.d.ts +127 -0
  106. package/dist/src/lib/config-object-descriptor.js +658 -0
  107. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  108. package/dist/src/lib/config-payload.d.ts +85 -0
  109. package/dist/src/lib/config-payload.js +116 -0
  110. package/dist/src/lib/config-payload.js.map +1 -0
  111. package/dist/src/lib/config-surface.d.ts +130 -0
  112. package/dist/src/lib/config-surface.js +300 -0
  113. package/dist/src/lib/config-surface.js.map +1 -0
  114. package/dist/src/lib/credentials-store.d.ts +10 -0
  115. package/dist/src/lib/credentials-store.js +23 -0
  116. package/dist/src/lib/credentials-store.js.map +1 -1
  117. package/dist/src/lib/data-input.d.ts +23 -0
  118. package/dist/src/lib/data-input.js +50 -0
  119. package/dist/src/lib/data-input.js.map +1 -0
  120. package/dist/src/lib/db-codegen/dbTemplates.js +1 -1
  121. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
  122. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +1 -1
  123. package/dist/src/lib/env-resolver-core.d.ts +147 -0
  124. package/dist/src/lib/env-resolver-core.js +265 -0
  125. package/dist/src/lib/env-resolver-core.js.map +1 -0
  126. package/dist/src/lib/env-resolver.d.ts +28 -6
  127. package/dist/src/lib/env-resolver.js +44 -32
  128. package/dist/src/lib/env-resolver.js.map +1 -1
  129. package/dist/src/lib/generated-allowlist.js +13 -0
  130. package/dist/src/lib/generated-allowlist.js.map +1 -1
  131. package/dist/src/lib/generated-config-surfaces.d.ts +682 -0
  132. package/dist/src/lib/generated-config-surfaces.js +4058 -0
  133. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  134. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  135. package/dist/src/lib/generated-template-lint.js +624 -0
  136. package/dist/src/lib/generated-template-lint.js.map +1 -0
  137. package/dist/src/lib/init-adopt.d.ts +16 -0
  138. package/dist/src/lib/init-adopt.js +34 -0
  139. package/dist/src/lib/init-adopt.js.map +1 -0
  140. package/dist/src/lib/init-assets.d.ts +39 -0
  141. package/dist/src/lib/init-assets.js +97 -0
  142. package/dist/src/lib/init-assets.js.map +1 -0
  143. package/dist/src/lib/init-config.d.ts +44 -5
  144. package/dist/src/lib/init-config.js +80 -7
  145. package/dist/src/lib/init-config.js.map +1 -1
  146. package/dist/src/lib/init-ios-links.d.ts +50 -0
  147. package/dist/src/lib/init-ios-links.js +153 -0
  148. package/dist/src/lib/init-ios-links.js.map +1 -0
  149. package/dist/src/lib/init-plan.d.ts +80 -0
  150. package/dist/src/lib/init-plan.js +95 -0
  151. package/dist/src/lib/init-plan.js.map +1 -0
  152. package/dist/src/lib/init-production-env.d.ts +48 -0
  153. package/dist/src/lib/init-production-env.js +59 -0
  154. package/dist/src/lib/init-production-env.js.map +1 -0
  155. package/dist/src/lib/init-schema.d.ts +74 -0
  156. package/dist/src/lib/init-schema.js +358 -0
  157. package/dist/src/lib/init-schema.js.map +1 -0
  158. package/dist/src/lib/init-xcode.d.ts +33 -0
  159. package/dist/src/lib/init-xcode.js +114 -0
  160. package/dist/src/lib/init-xcode.js.map +1 -0
  161. package/dist/src/lib/integration-request-config.d.ts +30 -0
  162. package/dist/src/lib/integration-request-config.js +145 -0
  163. package/dist/src/lib/integration-request-config.js.map +1 -0
  164. package/dist/src/lib/local-state.d.ts +55 -0
  165. package/dist/src/lib/local-state.js +167 -0
  166. package/dist/src/lib/local-state.js.map +1 -0
  167. package/dist/src/lib/log-inspection.d.ts +568 -0
  168. package/dist/src/lib/log-inspection.js +639 -0
  169. package/dist/src/lib/log-inspection.js.map +1 -0
  170. package/dist/src/lib/migration-nag.d.ts +2 -2
  171. package/dist/src/lib/migration-nag.js +3 -3
  172. package/dist/src/lib/object-status-filter.d.ts +22 -0
  173. package/dist/src/lib/object-status-filter.js +45 -0
  174. package/dist/src/lib/object-status-filter.js.map +1 -0
  175. package/dist/src/lib/output.d.ts +24 -1
  176. package/dist/src/lib/output.js +42 -1
  177. package/dist/src/lib/output.js.map +1 -1
  178. package/dist/src/lib/package-manager.d.ts +140 -0
  179. package/dist/src/lib/package-manager.js +305 -0
  180. package/dist/src/lib/package-manager.js.map +1 -0
  181. package/dist/src/lib/paginate.d.ts +50 -0
  182. package/dist/src/lib/paginate.js +53 -0
  183. package/dist/src/lib/paginate.js.map +1 -1
  184. package/dist/src/lib/platform-owned.d.ts +29 -3
  185. package/dist/src/lib/platform-owned.js +42 -3
  186. package/dist/src/lib/platform-owned.js.map +1 -1
  187. package/dist/src/lib/project-config.js +13 -5
  188. package/dist/src/lib/project-config.js.map +1 -1
  189. package/dist/src/lib/query-operators.d.ts +1 -1
  190. package/dist/src/lib/query-operators.js +1 -1
  191. package/dist/src/lib/record-filter.d.ts +18 -0
  192. package/dist/src/lib/record-filter.js +55 -0
  193. package/dist/src/lib/record-filter.js.map +1 -0
  194. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  195. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  196. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  197. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  198. package/dist/src/lib/resolve-init-server.js +77 -0
  199. package/dist/src/lib/resolve-init-server.js.map +1 -0
  200. package/dist/src/lib/resolve-platform.d.ts +43 -14
  201. package/dist/src/lib/resolve-platform.js +74 -12
  202. package/dist/src/lib/resolve-platform.js.map +1 -1
  203. package/dist/src/lib/run-status.d.ts +19 -0
  204. package/dist/src/lib/run-status.generated.d.ts +39 -0
  205. package/dist/src/lib/run-status.generated.js +66 -0
  206. package/dist/src/lib/run-status.generated.js.map +1 -0
  207. package/dist/src/lib/run-status.js +19 -0
  208. package/dist/src/lib/run-status.js.map +1 -0
  209. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  210. package/dist/src/lib/server-text-normalization.js +90 -0
  211. package/dist/src/lib/server-text-normalization.js.map +1 -0
  212. package/dist/src/lib/server-url.d.ts +22 -0
  213. package/dist/src/lib/server-url.js +33 -0
  214. package/dist/src/lib/server-url.js.map +1 -0
  215. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  216. package/dist/src/lib/signing-secret-status.js +116 -0
  217. package/dist/src/lib/signing-secret-status.js.map +1 -0
  218. package/dist/src/lib/skill-installer.d.ts +4 -2
  219. package/dist/src/lib/skill-installer.js +143 -12
  220. package/dist/src/lib/skill-installer.js.map +1 -1
  221. package/dist/src/lib/snapshots.d.ts +2 -2
  222. package/dist/src/lib/snapshots.js +2 -2
  223. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +15 -2
  224. package/dist/src/lib/swift-codegen/dbGenerator.js +250 -18
  225. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
  226. package/dist/src/lib/swift-codegen/generator.d.ts +11 -2
  227. package/dist/src/lib/swift-codegen/generator.js +181 -7
  228. package/dist/src/lib/swift-codegen/generator.js.map +1 -1
  229. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +7 -3
  230. package/dist/src/lib/swift-codegen/siblingSymbols.js +4 -1
  231. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -1
  232. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  233. package/dist/src/lib/sync-dir-selector.js +30 -0
  234. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  235. package/dist/src/lib/sync-paths.d.ts +39 -0
  236. package/dist/src/lib/sync-paths.js +70 -2
  237. package/dist/src/lib/sync-paths.js.map +1 -1
  238. package/dist/src/lib/sync-resource-types.d.ts +138 -31
  239. package/dist/src/lib/sync-resource-types.js +241 -47
  240. package/dist/src/lib/sync-resource-types.js.map +1 -1
  241. package/dist/src/lib/sync-selectors.d.ts +95 -0
  242. package/dist/src/lib/sync-selectors.js +228 -0
  243. package/dist/src/lib/sync-selectors.js.map +1 -0
  244. package/dist/src/lib/template.d.ts +62 -4
  245. package/dist/src/lib/template.js +147 -39
  246. package/dist/src/lib/template.js.map +1 -1
  247. package/dist/src/lib/test-case-keys.d.ts +29 -0
  248. package/dist/src/lib/test-case-keys.js +55 -0
  249. package/dist/src/lib/test-case-keys.js.map +1 -0
  250. package/dist/src/lib/test-case-variables.d.ts +15 -0
  251. package/dist/src/lib/test-case-variables.js +29 -0
  252. package/dist/src/lib/test-case-variables.js.map +1 -0
  253. package/dist/src/lib/toml-database-config.d.ts +4 -4
  254. package/dist/src/lib/toml-database-config.js +27 -34
  255. package/dist/src/lib/toml-database-config.js.map +1 -1
  256. package/dist/src/lib/toml-metadata-config.d.ts +9 -5
  257. package/dist/src/lib/toml-metadata-config.js +40 -45
  258. package/dist/src/lib/toml-metadata-config.js.map +1 -1
  259. package/dist/src/lib/toml-native-form.d.ts +1 -1
  260. package/dist/src/lib/toml-native-form.js +1 -1
  261. package/dist/src/lib/toml-params-validator.d.ts +1 -1
  262. package/dist/src/lib/toml-params-validator.js +1 -1
  263. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  264. package/dist/src/lib/toml-scalar-edit.js +283 -0
  265. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  266. package/dist/src/lib/user-selector.d.ts +24 -0
  267. package/dist/src/lib/user-selector.js +33 -0
  268. package/dist/src/lib/user-selector.js.map +1 -0
  269. package/dist/src/lib/version-check.d.ts +25 -0
  270. package/dist/src/lib/version-check.js +77 -8
  271. package/dist/src/lib/version-check.js.map +1 -1
  272. package/dist/src/lib/watch.d.ts +121 -0
  273. package/dist/src/lib/watch.js +169 -0
  274. package/dist/src/lib/watch.js.map +1 -0
  275. package/dist/src/lib/workflow-apply.d.ts +69 -45
  276. package/dist/src/lib/workflow-apply.js +99 -72
  277. package/dist/src/lib/workflow-apply.js.map +1 -1
  278. package/dist/src/lib/workflow-codegen/generator.js +4 -4
  279. package/dist/src/lib/workflow-codegen/generator.js.map +1 -1
  280. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +11 -0
  281. package/dist/src/lib/workflow-codegen/invokerIR.js +5 -0
  282. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -1
  283. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  284. package/dist/src/lib/workflow-config-apply.js +137 -0
  285. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  286. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  287. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  288. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  289. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  290. package/dist/src/lib/workflow-defaults.js +41 -0
  291. package/dist/src/lib/workflow-defaults.js.map +1 -0
  292. package/dist/src/lib/workflow-fragments.d.ts +23 -0
  293. package/dist/src/lib/workflow-fragments.js +229 -8
  294. package/dist/src/lib/workflow-fragments.js.map +1 -1
  295. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  296. package/dist/src/lib/workflow-include-preserve.js +286 -0
  297. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  298. package/dist/src/lib/workflow-payload.d.ts +31 -20
  299. package/dist/src/lib/workflow-payload.js +100 -93
  300. package/dist/src/lib/workflow-payload.js.map +1 -1
  301. package/dist/src/lib/workflow-toml-validator.d.ts +80 -3
  302. package/dist/src/lib/workflow-toml-validator.js +231 -3
  303. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  304. package/dist/src/types/index.d.ts +78 -22
  305. package/dist/src/validators.d.ts +7 -7
  306. package/dist/src/validators.js +6 -6
  307. package/package.json +11 -6
  308. package/dist/src/commands/settings.d.ts +0 -15
  309. package/dist/src/commands/settings.js +0 -102
  310. package/dist/src/commands/settings.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-include-preserve.js","sourceRoot":"","sources":["../../../src/lib/workflow-include-preserve.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * Background: the CLI built the create/update workflow payload in THREE
5
5
  * separate hand-enumerated literals — `workflows create --from-file`
6
- * (`cli/src/commands/workflows.ts`), the `sync push` create branch
7
- * (`cli/src/commands/sync.ts`), and the `sync push` update branch (the metadata
6
+ * (`cli/src/commands/workflows.ts`), the `config push` create branch
7
+ * (`cli/src/commands/sync.ts`), and the `config push` update branch (the metadata
8
8
  * PATCH in `cli/src/lib/workflow-apply.ts`). Because each site listed the
9
9
  * `[workflow]` fields by hand, they drifted apart: a field added to one path was
10
10
  * silently dropped by the others. `status` was the 4th field lost this way
@@ -27,18 +27,30 @@
27
27
  * Presence semantics, by mode:
28
28
  * - create: optional strings coalesce absent/empty → `undefined` (omit; the
29
29
  * server default applies). `capabilities` forwards the raw array (absent →
30
- * omit). Schemas omit when absent.
31
- * - update: optional strings distinguish explicit-clear from leave-unset via
32
- * `x !== undefined ? (x || null) : undefined`. `status` forwards the bare
33
- * value (matching the server's hasOwnProperty path). Schemas send `null`
34
- * when absent so a cleared schema round-trips.
35
- * - booleans (`requiresClientApply`, and `syncCallable` on create) are raw
36
- * pass-through so an explicit `false` is preserved and only a truly-absent
37
- * key drops.
38
- * - `syncCallable` is OMITTED in `mode: "update"`: the server re-validates
39
- * `syncCallable: true` against the CURRENTLY-active steps, so the update
40
- * path must send it as a deferred second PATCH after the new steps are live
41
- * (#807). `applyWorkflowBody` owns that second PATCH.
30
+ * omit). Schemas omit when absent. Booleans are raw pass-through so an
31
+ * explicit `false` is preserved and only a truly-absent key drops.
32
+ * - update: ALWAYS-SEND (#2743). The workflow TOML fully describes the
33
+ * workflow, so every update-mode field carries a definite value and
34
+ * `undefined` never appears: a defaulted scalar (`status`, the queue
35
+ * limits, `dequeueOrder`, `requiresClientApply`) sends its concrete model
36
+ * default when the file omits it, and a nullable field (`description`,
37
+ * `accessRule`, `runAs`, `capabilities`, the schemas, `lock`) sends `null`.
38
+ * Deleting a line from the file therefore CONVERGES the server rather than
39
+ * silently leaving the old value live (#1567's bug class). Optional strings
40
+ * keep their `"" null` coalescing, so an explicit clear and an omission
41
+ * land on the same wire value.
42
+ *
43
+ * Defaulted scalars deliberately travel as their default, not as `null`: a
44
+ * server predating #2743 coerces a queue-limit `null` to `0`, while an
45
+ * explicit default converges identically on both. The shared map lives in
46
+ * `workflow-defaults.ts` (the diff normalizer reads the same copy).
47
+ *
48
+ * Omit-preserve survives only as the SERVER's contract for other clients
49
+ * (web-admin): the PATCH still leaves an absent key alone.
50
+ * - `syncCallable` is OMITTED from the builder in `mode: "update"`: its
51
+ * ordering relative to the steps write is `applyWorkflowBody`'s to decide
52
+ * (#807 — enabling must validate against the NEW steps, so it is deferred
53
+ * to a second PATCH; disabling rides the first PATCH). See that module.
42
54
  */
43
55
  export type WorkflowPayloadMode = "create" | "update";
44
56
  /**
@@ -68,13 +80,12 @@ export type WorkflowExpressionsPayload = {
68
80
  */
69
81
  export declare function parseWorkflowExpressionsToml(tomlData: any): WorkflowExpressionsPayload | undefined;
70
82
  /**
71
- * The `[workflow]`-derived keys the builder emits, per mode. Exported so the
72
- * drift-guard unit test can assert the key set hasn't silently lost a field —
73
- * the recurring bug class this builder closes. `update` omits `syncCallable`
74
- * (deferred second PATCH, #807); everything else is shared.
83
+ * The `[workflow]`-derived keys the builder emits, per mode read from the
84
+ * vendored definition (#2644), not restated here. A field added to
85
+ * `src/config-surface/workflow.ts` is pushed with no edit to this file, which
86
+ * is what closes the recurring "CLI silently drops a new server field" bug.
75
87
  */
76
- export declare const WORKFLOW_PAYLOAD_FIELDS_CREATE: readonly ["name", "description", "status", "accessRule", "runAs", "capabilities", "perUserMaxRunning", "perUserMaxQueued", "perAppMaxRunning", "perAppMaxQueued", "queueTtlSeconds", "dequeueOrder", "requiresClientApply", "inputSchema", "outputSchema", "syncCallable"];
77
- export declare const WORKFLOW_PAYLOAD_FIELDS_UPDATE: ReadonlyArray<string>;
88
+ export declare function workflowPayloadFields(mode: WorkflowPayloadMode): string[];
78
89
  /**
79
90
  * Build the workflow payload's `[workflow]`-derived fields from a parsed TOML
80
91
  * `[workflow]` table. `workflow` is `tomlData.workflow` (already merged with any
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * Background: the CLI built the create/update workflow payload in THREE
5
5
  * separate hand-enumerated literals — `workflows create --from-file`
6
- * (`cli/src/commands/workflows.ts`), the `sync push` create branch
7
- * (`cli/src/commands/sync.ts`), and the `sync push` update branch (the metadata
6
+ * (`cli/src/commands/workflows.ts`), the `config push` create branch
7
+ * (`cli/src/commands/sync.ts`), and the `config push` update branch (the metadata
8
8
  * PATCH in `cli/src/lib/workflow-apply.ts`). Because each site listed the
9
9
  * `[workflow]` fields by hand, they drifted apart: a field added to one path was
10
10
  * silently dropped by the others. `status` was the 4th field lost this way
@@ -27,19 +27,34 @@
27
27
  * Presence semantics, by mode:
28
28
  * - create: optional strings coalesce absent/empty → `undefined` (omit; the
29
29
  * server default applies). `capabilities` forwards the raw array (absent →
30
- * omit). Schemas omit when absent.
31
- * - update: optional strings distinguish explicit-clear from leave-unset via
32
- * `x !== undefined ? (x || null) : undefined`. `status` forwards the bare
33
- * value (matching the server's hasOwnProperty path). Schemas send `null`
34
- * when absent so a cleared schema round-trips.
35
- * - booleans (`requiresClientApply`, and `syncCallable` on create) are raw
36
- * pass-through so an explicit `false` is preserved and only a truly-absent
37
- * key drops.
38
- * - `syncCallable` is OMITTED in `mode: "update"`: the server re-validates
39
- * `syncCallable: true` against the CURRENTLY-active steps, so the update
40
- * path must send it as a deferred second PATCH after the new steps are live
41
- * (#807). `applyWorkflowBody` owns that second PATCH.
30
+ * omit). Schemas omit when absent. Booleans are raw pass-through so an
31
+ * explicit `false` is preserved and only a truly-absent key drops.
32
+ * - update: ALWAYS-SEND (#2743). The workflow TOML fully describes the
33
+ * workflow, so every update-mode field carries a definite value and
34
+ * `undefined` never appears: a defaulted scalar (`status`, the queue
35
+ * limits, `dequeueOrder`, `requiresClientApply`) sends its concrete model
36
+ * default when the file omits it, and a nullable field (`description`,
37
+ * `accessRule`, `runAs`, `capabilities`, the schemas, `lock`) sends `null`.
38
+ * Deleting a line from the file therefore CONVERGES the server rather than
39
+ * silently leaving the old value live (#1567's bug class). Optional strings
40
+ * keep their `"" null` coalescing, so an explicit clear and an omission
41
+ * land on the same wire value.
42
+ *
43
+ * Defaulted scalars deliberately travel as their default, not as `null`: a
44
+ * server predating #2743 coerces a queue-limit `null` to `0`, while an
45
+ * explicit default converges identically on both. The shared map lives in
46
+ * `workflow-defaults.ts` (the diff normalizer reads the same copy).
47
+ *
48
+ * Omit-preserve survives only as the SERVER's contract for other clients
49
+ * (web-admin): the PATCH still leaves an absent key alone.
50
+ * - `syncCallable` is OMITTED from the builder in `mode: "update"`: its
51
+ * ordering relative to the steps write is `applyWorkflowBody`'s to decide
52
+ * (#807 — enabling must validate against the NEW steps, so it is deferred
53
+ * to a second PATCH; disabling rides the first PATCH). See that module.
42
54
  */
55
+ import { writableFieldNames } from "./generated-config-surfaces.js";
56
+ import { WORKFLOW_TABLE } from "./config-surface.js";
57
+ import { WORKFLOW_MODEL_DEFAULTS } from "./workflow-defaults.js";
43
58
  /**
44
59
  * Parse a JSON schema field that TOML may present as a string OR (for an inline
45
60
  * table) as an already-parsed object. Kept here in `cli/src/lib` so the builder
@@ -75,30 +90,62 @@ export function parseWorkflowExpressionsToml(tomlData) {
75
90
  return Object.keys(out).length > 0 ? { cel: out } : undefined;
76
91
  }
77
92
  /**
78
- * The `[workflow]`-derived keys the builder emits, per mode. Exported so the
79
- * drift-guard unit test can assert the key set hasn't silently lost a field —
80
- * the recurring bug class this builder closes. `update` omits `syncCallable`
81
- * (deferred second PATCH, #807); everything else is shared.
93
+ * Fields the SERVER accepts on update but this BUILDER deliberately leaves to
94
+ * the caller. This is a sequencing invariant, not a statement about the server:
95
+ * `syncCallable: true` is re-validated against the CURRENTLY-active steps, so
96
+ * enabling it has to wait for a second PATCH once the new steps are live (#807
97
+ * — `applyWorkflowBody` owns the whole sequence, including the `false` case it
98
+ * puts in the FIRST PATCH). The definition correctly declares
99
+ * `writableOn: ["create", "update"]`; the exception lives here, where the
100
+ * ordering decision is.
101
+ */
102
+ const CREATE_ONLY_ON_THE_WIRE = new Set(["syncCallable"]);
103
+ /**
104
+ * The `[workflow]`-derived keys the builder emits, per mode — read from the
105
+ * vendored definition (#2644), not restated here. A field added to
106
+ * `src/config-surface/workflow.ts` is pushed with no edit to this file, which
107
+ * is what closes the recurring "CLI silently drops a new server field" bug.
108
+ */
109
+ export function workflowPayloadFields(mode) {
110
+ const fields = writableFieldNames(WORKFLOW_TABLE, mode);
111
+ return mode === "create"
112
+ ? fields
113
+ : fields.filter((f) => !CREATE_ONLY_ON_THE_WIRE.has(f));
114
+ }
115
+ /**
116
+ * Per-field value producers, keyed by the definition's field name. A field with
117
+ * no entry is a scalar passthrough: on create the TOML value is forwarded as-is
118
+ * (absent → `undefined`, which `JSON.stringify` drops so the server default
119
+ * applies); on update it converges (absent → the field's model default, or
120
+ * `null` when it has none). That is what makes a passthrough field authorable
121
+ * by editing the definition alone (#2644 criterion 1); the entries below are
122
+ * the fields whose value semantics are genuinely their own.
82
123
  */
83
- export const WORKFLOW_PAYLOAD_FIELDS_CREATE = [
84
- "name",
85
- "description",
86
- "status",
87
- "accessRule",
88
- "runAs",
89
- "capabilities",
90
- "perUserMaxRunning",
91
- "perUserMaxQueued",
92
- "perAppMaxRunning",
93
- "perAppMaxQueued",
94
- "queueTtlSeconds",
95
- "dequeueOrder",
96
- "requiresClientApply",
97
- "inputSchema",
98
- "outputSchema",
99
- "syncCallable",
100
- ];
101
- export const WORKFLOW_PAYLOAD_FIELDS_UPDATE = WORKFLOW_PAYLOAD_FIELDS_CREATE.filter((f) => f !== "syncCallable");
124
+ const PAYLOAD_VALUE = {
125
+ // accessRule / runAs / description — create coalesces absent/empty → omit;
126
+ // update coalesces both an explicit clear ("") and an omission to `null`,
127
+ // because the file is the whole truth (#2743). `value || null` also keeps a
128
+ // whitespace-only value out of the "set" state the server would trim to "".
129
+ accessRule: (value, create) => (create ? value || undefined : value || null),
130
+ runAs: (value, create) => (create ? value || undefined : value || null),
131
+ description: (value, create) => (create ? value : value || null),
132
+ // Schemas — parse a JSON string (or accept an inline table). Create omits
133
+ // when absent; update sends null so a cleared schema round-trips.
134
+ inputSchema: (value, create) => value ? safeJsonParse(value) : create ? undefined : null,
135
+ outputSchema: (value, create) => value ? safeJsonParse(value) : create ? undefined : null,
136
+ // #1972 — declarative run-scoped lock (`[workflow.lock]`, #1518 Phase 3).
137
+ // A TOML-owned nested-object field, mirroring the schemas above. Presence-
138
+ // keyed, not truthiness-keyed: forward the value whenever the KEY is present
139
+ // (`!== undefined`) — the server's create/PATCH accept an object OR a JSON
140
+ // string, so a present-but-malformed falsy value (`lock = false`/`0`) must
141
+ // be forwarded so the server surfaces its validation error, rather than
142
+ // being silently treated as absent (dropped on create, cleared on update).
143
+ // Absent on create → omit (server default: no lock); absent on update →
144
+ // null so removing `[workflow.lock]` clears the server-side lock
145
+ // (config-as-code). Before this the field was dropped from both sync paths,
146
+ // so a pull → push cycle silently lost the lock (#1972).
147
+ lock: (value, create) => value !== undefined ? value : create ? undefined : null,
148
+ };
102
149
  /**
103
150
  * Build the workflow payload's `[workflow]`-derived fields from a parsed TOML
104
151
  * `[workflow]` table. `workflow` is `tomlData.workflow` (already merged with any
@@ -108,63 +155,23 @@ export const WORKFLOW_PAYLOAD_FIELDS_UPDATE = WORKFLOW_PAYLOAD_FIELDS_CREATE.fil
108
155
  */
109
156
  export function buildWorkflowPayloadFromToml(workflow, { mode }) {
110
157
  const create = mode === "create";
111
- const payload = {
112
- name: workflow.name,
113
- description: workflow.description,
114
- // status create coalesces absent/empty → omit (server default `draft`
115
- // applies); update forwards the bare value so it round-trips and an
116
- // explicit "" surfaces the server's validation error rather than a silent
117
- // no-op (matches the pre-existing update path).
118
- status: create ? workflow.status || undefined : workflow.status,
119
- // accessRule / runAs — create coalesces absent/empty → omit; update
120
- // distinguishes explicit clear ("" → null) from leave-unset (absent →
121
- // undefined).
122
- accessRule: create
123
- ? workflow.accessRule || undefined
124
- : workflow.accessRule !== undefined
125
- ? workflow.accessRule || null
126
- : undefined,
127
- runAs: create
128
- ? workflow.runAs || undefined
129
- : workflow.runAs !== undefined
130
- ? workflow.runAs || null
131
- : undefined,
132
- // capabilities — create forwards the raw array (absent → omit); update
133
- // forwards presence-aware so an explicit array round-trips. (The server
134
- // update PATCH persist for capabilities is tracked separately in #1232; the
135
- // round-trip guard asserts capabilities on the create leg only.)
136
- capabilities: create
137
- ? workflow.capabilities
138
- : workflow.capabilities !== undefined
139
- ? workflow.capabilities
140
- : undefined,
141
- // Queue limits — raw numeric pass-through both modes (absent → omit).
142
- perUserMaxRunning: workflow.perUserMaxRunning,
143
- perUserMaxQueued: workflow.perUserMaxQueued,
144
- perAppMaxRunning: workflow.perAppMaxRunning,
145
- perAppMaxQueued: workflow.perAppMaxQueued,
146
- queueTtlSeconds: workflow.queueTtlSeconds,
147
- dequeueOrder: workflow.dequeueOrder,
148
- // requiresClientApply — raw boolean pass-through so an explicit `false` is
149
- // preserved and only a truly-absent key drops (server default applies).
150
- requiresClientApply: workflow.requiresClientApply,
151
- // Schemas — parse a JSON string (or accept an inline table). Create omits
152
- // when absent; update sends null so a cleared schema round-trips.
153
- inputSchema: workflow.inputSchema
154
- ? safeJsonParse(workflow.inputSchema)
155
- : create
156
- ? undefined
157
- : null,
158
- outputSchema: workflow.outputSchema
159
- ? safeJsonParse(workflow.outputSchema)
158
+ const payload = {};
159
+ for (const field of workflowPayloadFields(mode)) {
160
+ const descriptor = WORKFLOW_TABLE.fields.find((f) => f.field === field);
161
+ const tomlKey = descriptor?.tomlKey ?? field;
162
+ const produce = PAYLOAD_VALUE[field];
163
+ const raw = workflow[tomlKey];
164
+ payload[field] = produce
165
+ ? produce(raw, create, workflow)
160
166
  : create
161
- ? undefined
162
- : null,
163
- };
164
- // syncCallable — create includes it (raw boolean pass-through); update omits
165
- // it (deferred second PATCH, #807 see module doc).
166
- if (create) {
167
- payload.syncCallable = workflow.syncCallable;
167
+ ? // Scalar passthrough on create: queue limits, dequeueOrder, name,
168
+ // capabilities, and the boolean flags — raw so an explicit `false`
169
+ // or `0` survives and only a truly-absent key drops.
170
+ raw
171
+ : // Update converges (#2743): a field the file omits sends its concrete
172
+ // model default, or `null` when it has none (`name`, `capabilities`).
173
+ // `??` (not `||`) so an explicit `false` / `0` still wins.
174
+ (raw ?? WORKFLOW_MODEL_DEFAULTS[field] ?? null);
168
175
  }
169
176
  return payload;
170
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-payload.js","sourceRoot":"","sources":["../../../src/lib/workflow-payload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-payload.js","sourceRoot":"","sources":["../../../src/lib/workflow-payload.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,12 @@ export declare const KNOWN_KINDS_FOR_DRIFT_GUARD: ReadonlySet<string>;
54
54
  * errors:
55
55
  * - `__steps_shape__`: `steps` is not an array (table or scalar).
56
56
  * - `__step_shape__`: a step is not an object.
57
+ * - `__workflow_system_access_rule__`: `[workflow] runAs = "system"` with a
58
+ * non-empty `accessRule` — dead config the server rejects (#1447/#1258).
59
+ * A workflow-level error (not tied to a step): `stepIndex: -1, stepId: null`.
60
+ * - `__template_expression__`: a `{{ }}` expression that can never resolve
61
+ * (#2689). The field itself is valid — the `hint` carries the expression's
62
+ * location and the lint's message.
57
63
  * `hint` is a short, user-facing explanation (used by
58
64
  * `formatWorkflowTomlErrors` to render the multi-line diagnostic).
59
65
  * `parentStepId` is set when this error came from a `collect` step's
@@ -70,14 +76,85 @@ export type WorkflowTomlError = {
70
76
  hint: string;
71
77
  parentStepId?: string | null;
72
78
  };
79
+ /**
80
+ * #1447 workflow-identity predicate, extracted (codex review, 2026-07-15) so
81
+ * command sites that apply command-line metadata overrides can re-run it
82
+ * against the merged/effective workflow rather than only the parsed file.
83
+ *
84
+ * `runAs = "system"` + a non-empty `accessRule` is dead config: a system run
85
+ * can only be started by the system and never evaluates its accessRule, so any
86
+ * non-empty rule is inert. The server rejects this at save time (#1258,
87
+ * `src/workflows/definition-store.ts:271-280`); catching it locally keeps
88
+ * `config push` all-or-nothing instead of failing mid-push and leaving partial
89
+ * server state (#1418 drift).
90
+ *
91
+ * Mirrors the server predicate byte-for-byte: returns the sentinel error only
92
+ * when `runAs === "system"` AND `typeof accessRule === "string"` AND
93
+ * `accessRule.trim() !== ""`. Default/unset/empty/whitespace-only runAs or
94
+ * accessRule (and a bare non-string boolean accessRule) return `null`.
95
+ *
96
+ * @param workflow The workflow-metadata object — the `[workflow]` table, or
97
+ * for commands that accept unwrapped root-level metadata, the root TOML
98
+ * object (`tomlData.workflow || tomlData`). Non-object inputs return `null`.
99
+ */
100
+ export declare function validateWorkflowIdentity(workflow: any): WorkflowTomlError | null;
101
+ /**
102
+ * #2643 — `templateMissingMarker` was removed from the platform. A workflow
103
+ * TOML that still sets it is rejected here, before the push, with the same
104
+ * sentence the server returns, rather than being silently dropped.
105
+ */
106
+ export declare const REMOVED_TEMPLATE_MISSING_MARKER_MESSAGE: string;
107
+ /**
108
+ * Non-blocking notes for a workflow TOML — things worth saying on a push that
109
+ * are not errors.
110
+ *
111
+ * #2643: `strict` / `strictParams` are accepted and ignored, because the
112
+ * failure they used to opt into now applies to every workflow. A definition
113
+ * that sets them keeps working unchanged, so this is a note, not an error.
114
+ */
115
+ export declare function collectWorkflowTomlNotes(tomlData: any): string[];
116
+ /** The runAs / accessRule pair the identity lint reads. */
117
+ export interface WorkflowIdentityFields {
118
+ runAs?: unknown;
119
+ accessRule?: unknown;
120
+ }
121
+ /**
122
+ * #1447 (maintainer decision, 2026-07-21): compute the EFFECTIVE workflow
123
+ * identity that an `update --from-file` push will leave on the server — the
124
+ * merge of the persisted record with the incoming file/flags.
125
+ *
126
+ * The merge exists for a caller whose push OMITS one side of the
127
+ * runAs/accessRule pair and lets the server retain it. Linting the incoming
128
+ * payload alone misses the case where the OTHER side is already `system` / a
129
+ * stored rule: an existing `runAs="system"` workflow plus a file adding only an
130
+ * `accessRule`, or a file flipping a workflow with a stored rule to
131
+ * `runAs="system"`. Both pass a payload-only lint and are then rejected by the
132
+ * server's PATCH. Merging the two before `validateWorkflowIdentity` catches
133
+ * them locally at zero extra cost — the persisted record is already fetched at
134
+ * the call site.
135
+ *
136
+ * NOT `config push`, since #2743: its update is always-send, so the file alone IS
137
+ * the effective config (an omitted `accessRule` clears the stored rule rather
138
+ * than inheriting it) and its push-time lint of the file is exact. The merge
139
+ * semantics below are unchanged for any caller that does omit fields: a field
140
+ * PRESENT in `incoming` (including an empty-string clear) overrides the stored
141
+ * value; an ABSENT field (undefined) falls back to what the server keeps.
142
+ */
143
+ export declare function effectiveWorkflowIdentity(existing: WorkflowIdentityFields | null | undefined, incoming: WorkflowIdentityFields | null | undefined): WorkflowIdentityFields;
73
144
  /**
74
145
  * Walk a parsed workflow TOML document and return all unknown-field errors.
75
146
  *
76
147
  * @param tomlData The output of `parseConfigToml()` for a workflow TOML file.
148
+ * @param opts.skipWorkflowIdentity When true, suppress the #1447 workflow
149
+ * identity check (`runAs="system"` + non-empty `accessRule`). Callers that
150
+ * merge command-line overrides after parsing re-run `validateWorkflowIdentity`
151
+ * against the effective metadata themselves.
77
152
  * @returns An array of error objects, one per offending field. Empty if no
78
153
  * errors were found.
79
154
  */
80
- export declare function validateWorkflowToml(tomlData: any): WorkflowTomlError[];
155
+ export declare function validateWorkflowToml(tomlData: any, opts?: {
156
+ skipWorkflowIdentity?: boolean;
157
+ }): WorkflowTomlError[];
81
158
  /**
82
159
  * Render a multi-line diagnostic for a list of errors. Designed for the
83
160
  * shape called out in the issue:
@@ -96,7 +173,7 @@ export declare function formatWorkflowTomlErrors(filePath: string, errors: Workf
96
173
  /**
97
174
  * #1614 — client-side mirror of the server's `validateWorkflowExpressions`
98
175
  * (`src/workflows/definition-store.ts`) for named `expr.*` CEL guards. Returns
99
- * structural errors so `sync push` fails fast with the same class of diagnostic
176
+ * structural errors so `config push` fails fast with the same class of diagnostic
100
177
  * the server would 400 on:
101
178
  * 1. every `expr.<name>` reference — in a definition body OR a step guard
102
179
  * (`runIf` / `successWhen` / switch `when`) — names a DECLARED definition;
@@ -112,7 +189,7 @@ export declare function formatWorkflowTomlErrors(filePath: string, errors: Workf
112
189
  * #1614 — validate the RAW `[expr.cel]` table shape BEFORE
113
190
  * `parseWorkflowExpressionsToml` filters it. That parser drops any entry whose
114
191
  * body is not a string, so a mistyped `ready = true` would vanish and, with no
115
- * references left to fail on, `sync push` would succeed while omitting the whole
192
+ * references left to fail on, `config push` would succeed while omitting the whole
116
193
  * expression table. Surface non-string / empty / wrong-typed bodies (and a
117
194
  * non-table `cel`) as a hard CLI validation error instead. Mirrors the server's
118
195
  * `validateRawExpressionsShape` (`src/workflows/definition-store.ts`).