primitive-admin 1.1.0-alpha.9 → 1.1.0

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 (591) hide show
  1. package/README.md +523 -109
  2. package/assets/skill/skills/primitive-platform/SKILL.md +289 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +372 -21
  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 +136 -30
  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 +713 -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 +65 -100
  14. package/dist/src/commands/apps.js.map +1 -1
  15. package/dist/src/commands/auth-sessions.d.ts +7 -0
  16. package/dist/src/commands/auth-sessions.js +144 -0
  17. package/dist/src/commands/auth-sessions.js.map +1 -0
  18. package/dist/src/commands/auth.d.ts +2 -0
  19. package/dist/src/commands/auth.js +238 -108
  20. package/dist/src/commands/auth.js.map +1 -1
  21. package/dist/src/commands/blob-buckets.d.ts +2 -0
  22. package/dist/src/commands/blob-buckets.js +331 -0
  23. package/dist/src/commands/blob-buckets.js.map +1 -0
  24. package/dist/src/commands/catalog.d.ts +2 -0
  25. package/dist/src/commands/catalog.js +63 -48
  26. package/dist/src/commands/catalog.js.map +1 -1
  27. package/dist/src/commands/collection-type-configs.d.ts +2 -0
  28. package/dist/src/commands/collection-type-configs.js +85 -0
  29. package/dist/src/commands/collection-type-configs.js.map +1 -0
  30. package/dist/src/commands/collections.d.ts +2 -0
  31. package/dist/src/commands/collections.js +1282 -0
  32. package/dist/src/commands/collections.js.map +1 -0
  33. package/dist/src/commands/comparisons.d.ts +2 -0
  34. package/dist/src/commands/comparisons.js +6 -6
  35. package/dist/src/commands/comparisons.js.map +1 -1
  36. package/dist/src/commands/config.d.ts +46 -0
  37. package/dist/src/commands/config.js +465 -0
  38. package/dist/src/commands/config.js.map +1 -0
  39. package/dist/src/commands/connections.d.ts +2 -0
  40. package/dist/src/commands/connections.js +99 -0
  41. package/dist/src/commands/connections.js.map +1 -0
  42. package/dist/src/commands/cron-triggers.d.ts +2 -0
  43. package/dist/src/commands/cron-triggers.js +266 -0
  44. package/dist/src/commands/cron-triggers.js.map +1 -0
  45. package/dist/src/commands/database-type-configs.d.ts +2 -0
  46. package/dist/src/commands/database-type-configs.js +164 -0
  47. package/dist/src/commands/database-type-configs.js.map +1 -0
  48. package/dist/src/commands/database-types.d.ts +2 -0
  49. package/dist/src/commands/database-types.js +471 -0
  50. package/dist/src/commands/database-types.js.map +1 -0
  51. package/dist/src/commands/databases.d.ts +65 -0
  52. package/dist/src/commands/databases.js +1887 -243
  53. package/dist/src/commands/databases.js.map +1 -1
  54. package/dist/src/commands/documents.d.ts +60 -0
  55. package/dist/src/commands/documents.js +2888 -22
  56. package/dist/src/commands/documents.js.map +1 -1
  57. package/dist/src/commands/email-templates.d.ts +2 -0
  58. package/dist/src/commands/email-templates.js +175 -0
  59. package/dist/src/commands/email-templates.js.map +1 -0
  60. package/dist/src/commands/env.d.ts +23 -0
  61. package/dist/src/commands/env.js +395 -0
  62. package/dist/src/commands/env.js.map +1 -0
  63. package/dist/src/commands/feature-flags.d.ts +14 -0
  64. package/dist/src/commands/feature-flags.js +117 -0
  65. package/dist/src/commands/feature-flags.js.map +1 -0
  66. package/dist/src/commands/functions.d.ts +20 -0
  67. package/dist/src/commands/functions.js +1630 -0
  68. package/dist/src/commands/functions.js.map +1 -0
  69. package/dist/src/commands/group-type-configs.d.ts +2 -0
  70. package/dist/src/commands/group-type-configs.js +87 -0
  71. package/dist/src/commands/group-type-configs.js.map +1 -0
  72. package/dist/src/commands/groups.d.ts +2 -0
  73. package/dist/src/commands/groups.js +65 -113
  74. package/dist/src/commands/groups.js.map +1 -1
  75. package/dist/src/commands/guides.d.ts +223 -0
  76. package/dist/src/commands/guides.js +627 -69
  77. package/dist/src/commands/guides.js.map +1 -1
  78. package/dist/src/commands/init.d.ts +37 -0
  79. package/dist/src/commands/init.js +1693 -208
  80. package/dist/src/commands/init.js.map +1 -1
  81. package/dist/src/commands/integrations.d.ts +2 -0
  82. package/dist/src/commands/integrations.js +428 -187
  83. package/dist/src/commands/integrations.js.map +1 -1
  84. package/dist/src/commands/llm.d.ts +2 -0
  85. package/dist/src/commands/llm.js +4 -2
  86. package/dist/src/commands/llm.js.map +1 -1
  87. package/dist/src/commands/locks.d.ts +8 -0
  88. package/dist/src/commands/locks.js +175 -0
  89. package/dist/src/commands/locks.js.map +1 -0
  90. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  91. package/dist/src/commands/metadata-category-configs.js +113 -0
  92. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  93. package/dist/src/commands/metadata.d.ts +2 -0
  94. package/dist/src/commands/metadata.js +288 -0
  95. package/dist/src/commands/metadata.js.map +1 -0
  96. package/dist/src/commands/prompts.d.ts +2 -0
  97. package/dist/src/commands/prompts.js +322 -634
  98. package/dist/src/commands/prompts.js.map +1 -1
  99. package/dist/src/commands/rule-sets.d.ts +3 -0
  100. package/dist/src/commands/rule-sets.js +139 -148
  101. package/dist/src/commands/rule-sets.js.map +1 -1
  102. package/dist/src/commands/scripts.d.ts +30 -0
  103. package/dist/src/commands/scripts.js +688 -0
  104. package/dist/src/commands/scripts.js.map +1 -0
  105. package/dist/src/commands/secrets.d.ts +2 -0
  106. package/dist/src/commands/secrets.js +109 -0
  107. package/dist/src/commands/secrets.js.map +1 -0
  108. package/dist/src/commands/sessions.d.ts +2 -0
  109. package/dist/src/commands/sessions.js +76 -0
  110. package/dist/src/commands/sessions.js.map +1 -0
  111. package/dist/src/commands/skill.d.ts +2 -0
  112. package/dist/src/commands/skill.js +29 -0
  113. package/dist/src/commands/skill.js.map +1 -0
  114. package/dist/src/commands/sync-app-settings.d.ts +158 -0
  115. package/dist/src/commands/sync-app-settings.js +328 -0
  116. package/dist/src/commands/sync-app-settings.js.map +1 -0
  117. package/dist/src/commands/sync.d.ts +2670 -0
  118. package/dist/src/commands/sync.js +17144 -834
  119. package/dist/src/commands/sync.js.map +1 -1
  120. package/dist/src/commands/tokens.d.ts +2 -0
  121. package/dist/src/commands/tokens.js +132 -22
  122. package/dist/src/commands/tokens.js.map +1 -1
  123. package/dist/src/commands/users.d.ts +2 -0
  124. package/dist/src/commands/users.js +542 -24
  125. package/dist/src/commands/users.js.map +1 -1
  126. package/dist/src/commands/vars.d.ts +8 -0
  127. package/dist/src/commands/vars.js +97 -0
  128. package/dist/src/commands/vars.js.map +1 -0
  129. package/dist/src/commands/waitlist.d.ts +2 -0
  130. package/dist/src/commands/waitlist.js +12 -11
  131. package/dist/src/commands/waitlist.js.map +1 -1
  132. package/dist/src/commands/webhooks.d.ts +31 -0
  133. package/dist/src/commands/webhooks.js +633 -0
  134. package/dist/src/commands/webhooks.js.map +1 -0
  135. package/dist/src/commands/workflows.d.ts +88 -0
  136. package/dist/src/commands/workflows.js +1568 -742
  137. package/dist/src/commands/workflows.js.map +1 -1
  138. package/dist/src/lib/access-rule-display.d.ts +21 -0
  139. package/dist/src/lib/access-rule-display.js +34 -0
  140. package/dist/src/lib/access-rule-display.js.map +1 -0
  141. package/dist/src/lib/api-client.d.ts +2550 -0
  142. package/dist/src/lib/api-client.js +2503 -160
  143. package/dist/src/lib/api-client.js.map +1 -1
  144. package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
  145. package/dist/src/lib/app-settings-descriptor.js +583 -0
  146. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  147. package/dist/src/lib/auth-flow.d.ts +8 -0
  148. package/dist/src/lib/batch.d.ts +26 -0
  149. package/dist/src/lib/batch.js +32 -0
  150. package/dist/src/lib/batch.js.map +1 -0
  151. package/dist/src/lib/block-layout.d.ts +160 -0
  152. package/dist/src/lib/block-layout.js +451 -0
  153. package/dist/src/lib/block-layout.js.map +1 -0
  154. package/dist/src/lib/block-selector.d.ts +58 -0
  155. package/dist/src/lib/block-selector.js +92 -0
  156. package/dist/src/lib/block-selector.js.map +1 -0
  157. package/dist/src/lib/canonical-json.d.ts +12 -0
  158. package/dist/src/lib/canonical-json.js +35 -0
  159. package/dist/src/lib/canonical-json.js.map +1 -0
  160. package/dist/src/lib/channel.d.ts +30 -0
  161. package/dist/src/lib/channel.js +68 -0
  162. package/dist/src/lib/channel.js.map +1 -0
  163. package/dist/src/lib/cli-manifest.d.ts +68 -0
  164. package/dist/src/lib/cli-manifest.js +71 -0
  165. package/dist/src/lib/cli-manifest.js.map +1 -0
  166. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
  167. package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
  168. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  169. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  170. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  171. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  172. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +38 -0
  173. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +46 -0
  174. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  175. package/dist/src/lib/collection-export.d.ts +184 -0
  176. package/dist/src/lib/collection-export.js +252 -0
  177. package/dist/src/lib/collection-export.js.map +1 -0
  178. package/dist/src/lib/config-json-field.d.ts +28 -0
  179. package/dist/src/lib/config-json-field.js +56 -0
  180. package/dist/src/lib/config-json-field.js.map +1 -0
  181. package/dist/src/lib/config-object-descriptor.d.ts +127 -0
  182. package/dist/src/lib/config-object-descriptor.js +740 -0
  183. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  184. package/dist/src/lib/config-payload.d.ts +92 -0
  185. package/dist/src/lib/config-payload.js +161 -0
  186. package/dist/src/lib/config-payload.js.map +1 -0
  187. package/dist/src/lib/config-surface.d.ts +141 -0
  188. package/dist/src/lib/config-surface.js +368 -0
  189. package/dist/src/lib/config-surface.js.map +1 -0
  190. package/dist/src/lib/config-toml.d.ts +10 -0
  191. package/dist/src/lib/config-toml.js +42 -0
  192. package/dist/src/lib/config-toml.js.map +1 -0
  193. package/dist/src/lib/config.d.ts +71 -0
  194. package/dist/src/lib/config.js +71 -68
  195. package/dist/src/lib/config.js.map +1 -1
  196. package/dist/src/lib/confirm-prompt.d.ts +83 -0
  197. package/dist/src/lib/confirm-prompt.js +110 -0
  198. package/dist/src/lib/confirm-prompt.js.map +1 -0
  199. package/dist/src/lib/constants.d.ts +11 -0
  200. package/dist/src/lib/constants.js +12 -0
  201. package/dist/src/lib/constants.js.map +1 -0
  202. package/dist/src/lib/crash-handlers.d.ts +20 -0
  203. package/dist/src/lib/crash-handlers.js +49 -0
  204. package/dist/src/lib/crash-handlers.js.map +1 -0
  205. package/dist/src/lib/credentials-store.d.ts +104 -0
  206. package/dist/src/lib/credentials-store.js +336 -0
  207. package/dist/src/lib/credentials-store.js.map +1 -0
  208. package/dist/src/lib/csv.d.ts +47 -0
  209. package/dist/src/lib/csv.js +172 -0
  210. package/dist/src/lib/csv.js.map +1 -0
  211. package/dist/src/lib/data-input.d.ts +23 -0
  212. package/dist/src/lib/data-input.js +50 -0
  213. package/dist/src/lib/data-input.js.map +1 -0
  214. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  215. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  216. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  217. package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
  218. package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
  219. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  220. package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
  221. package/dist/src/lib/db-codegen/dbNaming.js +180 -0
  222. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  223. package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
  224. package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
  225. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  226. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
  227. package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
  228. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  229. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
  230. package/dist/src/lib/db-codegen/dbTypeIR.js +525 -0
  231. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
  232. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
  233. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
  234. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
  235. package/dist/src/lib/deprecation.d.ts +22 -0
  236. package/dist/src/lib/deprecation.js +43 -0
  237. package/dist/src/lib/deprecation.js.map +1 -0
  238. package/dist/src/lib/document-export-permissions.d.ts +30 -0
  239. package/dist/src/lib/document-export-permissions.js +54 -0
  240. package/dist/src/lib/document-export-permissions.js.map +1 -0
  241. package/dist/src/lib/document-ingest-artifact.d.ts +120 -0
  242. package/dist/src/lib/document-ingest-artifact.js +505 -0
  243. package/dist/src/lib/document-ingest-artifact.js.map +1 -0
  244. package/dist/src/lib/document-ingest-input.d.ts +51 -0
  245. package/dist/src/lib/document-ingest-input.js +132 -0
  246. package/dist/src/lib/document-ingest-input.js.map +1 -0
  247. package/dist/src/lib/document-ingest-rows.d.ts +137 -0
  248. package/dist/src/lib/document-ingest-rows.js +181 -0
  249. package/dist/src/lib/document-ingest-rows.js.map +1 -0
  250. package/dist/src/lib/document-ingest.d.ts +101 -0
  251. package/dist/src/lib/document-ingest.js +384 -0
  252. package/dist/src/lib/document-ingest.js.map +1 -0
  253. package/dist/src/lib/env-resolver-core.d.ts +258 -0
  254. package/dist/src/lib/env-resolver-core.js +447 -0
  255. package/dist/src/lib/env-resolver-core.js.map +1 -0
  256. package/dist/src/lib/env-resolver.d.ts +99 -0
  257. package/dist/src/lib/env-resolver.js +153 -0
  258. package/dist/src/lib/env-resolver.js.map +1 -0
  259. package/dist/src/lib/fetch.d.ts +5 -0
  260. package/dist/src/lib/function-bundle.d.ts +147 -0
  261. package/dist/src/lib/function-bundle.js +341 -0
  262. package/dist/src/lib/function-bundle.js.map +1 -0
  263. package/dist/src/lib/function-collect.d.ts +123 -0
  264. package/dist/src/lib/function-collect.js +610 -0
  265. package/dist/src/lib/function-collect.js.map +1 -0
  266. package/dist/src/lib/function-db-types.d.ts +202 -0
  267. package/dist/src/lib/function-db-types.js +870 -0
  268. package/dist/src/lib/function-db-types.js.map +1 -0
  269. package/dist/src/lib/function-document-types.d.ts +144 -0
  270. package/dist/src/lib/function-document-types.js +370 -0
  271. package/dist/src/lib/function-document-types.js.map +1 -0
  272. package/dist/src/lib/function-grants-preflight.d.ts +64 -0
  273. package/dist/src/lib/function-grants-preflight.js +105 -0
  274. package/dist/src/lib/function-grants-preflight.js.map +1 -0
  275. package/dist/src/lib/function-log-lines.d.ts +76 -0
  276. package/dist/src/lib/function-log-lines.js +160 -0
  277. package/dist/src/lib/function-log-lines.js.map +1 -0
  278. package/dist/src/lib/function-log-row.d.ts +29 -0
  279. package/dist/src/lib/function-log-row.js +73 -0
  280. package/dist/src/lib/function-log-row.js.map +1 -0
  281. package/dist/src/lib/function-log-tail.d.ts +132 -0
  282. package/dist/src/lib/function-log-tail.js +262 -0
  283. package/dist/src/lib/function-log-tail.js.map +1 -0
  284. package/dist/src/lib/function-run.d.ts +289 -0
  285. package/dist/src/lib/function-run.js +389 -0
  286. package/dist/src/lib/function-run.js.map +1 -0
  287. package/dist/src/lib/function-schema-codegen.d.ts +143 -0
  288. package/dist/src/lib/function-schema-codegen.js +420 -0
  289. package/dist/src/lib/function-schema-codegen.js.map +1 -0
  290. package/dist/src/lib/function-sync.d.ts +459 -0
  291. package/dist/src/lib/function-sync.js +1258 -0
  292. package/dist/src/lib/function-sync.js.map +1 -0
  293. package/dist/src/lib/function-trigger-listing.d.ts +27 -0
  294. package/dist/src/lib/function-trigger-listing.js +70 -0
  295. package/dist/src/lib/function-trigger-listing.js.map +1 -0
  296. package/dist/src/lib/function-typecheck.d.ts +86 -0
  297. package/dist/src/lib/function-typecheck.js +370 -0
  298. package/dist/src/lib/function-typecheck.js.map +1 -0
  299. package/dist/src/lib/function-versions.d.ts +122 -0
  300. package/dist/src/lib/function-versions.js +182 -0
  301. package/dist/src/lib/function-versions.js.map +1 -0
  302. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  303. package/dist/src/lib/generated-allowlist.js +281 -0
  304. package/dist/src/lib/generated-allowlist.js.map +1 -0
  305. package/dist/src/lib/generated-config-surfaces.d.ts +2936 -0
  306. package/dist/src/lib/generated-config-surfaces.js +10569 -0
  307. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  308. package/dist/src/lib/generated-sdk-types.d.ts +12 -0
  309. package/dist/src/lib/generated-sdk-types.js +13 -0
  310. package/dist/src/lib/generated-sdk-types.js.map +1 -0
  311. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  312. package/dist/src/lib/generated-template-lint.js +624 -0
  313. package/dist/src/lib/generated-template-lint.js.map +1 -0
  314. package/dist/src/lib/init-adopt.d.ts +16 -0
  315. package/dist/src/lib/init-adopt.js +34 -0
  316. package/dist/src/lib/init-adopt.js.map +1 -0
  317. package/dist/src/lib/init-assets.d.ts +39 -0
  318. package/dist/src/lib/init-assets.js +97 -0
  319. package/dist/src/lib/init-assets.js.map +1 -0
  320. package/dist/src/lib/init-client-platforms.d.ts +14 -0
  321. package/dist/src/lib/init-client-platforms.js +71 -0
  322. package/dist/src/lib/init-client-platforms.js.map +1 -0
  323. package/dist/src/lib/init-config.d.ts +98 -0
  324. package/dist/src/lib/init-config.js +186 -0
  325. package/dist/src/lib/init-config.js.map +1 -0
  326. package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
  327. package/dist/src/lib/init-email-redirect-uris.js +46 -0
  328. package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
  329. package/dist/src/lib/init-ios-links.d.ts +91 -0
  330. package/dist/src/lib/init-ios-links.js +219 -0
  331. package/dist/src/lib/init-ios-links.js.map +1 -0
  332. package/dist/src/lib/init-plan.d.ts +80 -0
  333. package/dist/src/lib/init-plan.js +95 -0
  334. package/dist/src/lib/init-plan.js.map +1 -0
  335. package/dist/src/lib/init-production-env.d.ts +48 -0
  336. package/dist/src/lib/init-production-env.js +59 -0
  337. package/dist/src/lib/init-production-env.js.map +1 -0
  338. package/dist/src/lib/init-schema.d.ts +74 -0
  339. package/dist/src/lib/init-schema.js +358 -0
  340. package/dist/src/lib/init-schema.js.map +1 -0
  341. package/dist/src/lib/init-xcode.d.ts +34 -0
  342. package/dist/src/lib/init-xcode.js +138 -0
  343. package/dist/src/lib/init-xcode.js.map +1 -0
  344. package/dist/src/lib/integration-request-config.d.ts +30 -0
  345. package/dist/src/lib/integration-request-config.js +145 -0
  346. package/dist/src/lib/integration-request-config.js.map +1 -0
  347. package/dist/src/lib/integration-selector.d.ts +42 -0
  348. package/dist/src/lib/integration-selector.js +46 -0
  349. package/dist/src/lib/integration-selector.js.map +1 -0
  350. package/dist/src/lib/ios-app-id.d.ts +34 -0
  351. package/dist/src/lib/ios-app-id.js +69 -0
  352. package/dist/src/lib/ios-app-id.js.map +1 -0
  353. package/dist/src/lib/list-options.d.ts +68 -0
  354. package/dist/src/lib/list-options.js +89 -0
  355. package/dist/src/lib/list-options.js.map +1 -0
  356. package/dist/src/lib/local-state.d.ts +55 -0
  357. package/dist/src/lib/local-state.js +167 -0
  358. package/dist/src/lib/local-state.js.map +1 -0
  359. package/dist/src/lib/local-test-cases.d.ts +63 -0
  360. package/dist/src/lib/local-test-cases.js +136 -0
  361. package/dist/src/lib/local-test-cases.js.map +1 -0
  362. package/dist/src/lib/log-inspection.d.ts +715 -0
  363. package/dist/src/lib/log-inspection.js +816 -0
  364. package/dist/src/lib/log-inspection.js.map +1 -0
  365. package/dist/src/lib/logout-admin-session.d.ts +33 -0
  366. package/dist/src/lib/logout-admin-session.js +70 -0
  367. package/dist/src/lib/logout-admin-session.js.map +1 -0
  368. package/dist/src/lib/migration-nag.d.ts +49 -0
  369. package/dist/src/lib/migration-nag.js +163 -0
  370. package/dist/src/lib/migration-nag.js.map +1 -0
  371. package/dist/src/lib/object-status-filter.d.ts +22 -0
  372. package/dist/src/lib/object-status-filter.js +45 -0
  373. package/dist/src/lib/object-status-filter.js.map +1 -0
  374. package/dist/src/lib/output.d.ts +124 -0
  375. package/dist/src/lib/output.js +219 -8
  376. package/dist/src/lib/output.js.map +1 -1
  377. package/dist/src/lib/package-manager.d.ts +140 -0
  378. package/dist/src/lib/package-manager.js +305 -0
  379. package/dist/src/lib/package-manager.js.map +1 -0
  380. package/dist/src/lib/paginate.d.ts +98 -0
  381. package/dist/src/lib/paginate.js +112 -0
  382. package/dist/src/lib/paginate.js.map +1 -0
  383. package/dist/src/lib/platform-owned.d.ts +63 -0
  384. package/dist/src/lib/platform-owned.js +85 -0
  385. package/dist/src/lib/platform-owned.js.map +1 -0
  386. package/dist/src/lib/project-config.d.ts +122 -0
  387. package/dist/src/lib/project-config.js +244 -0
  388. package/dist/src/lib/project-config.js.map +1 -0
  389. package/dist/src/lib/prompt-cost-format.d.ts +11 -0
  390. package/dist/src/lib/prompt-cost-format.js +41 -0
  391. package/dist/src/lib/prompt-cost-format.js.map +1 -0
  392. package/dist/src/lib/prompt-schema-codegen.d.ts +147 -0
  393. package/dist/src/lib/prompt-schema-codegen.js +462 -0
  394. package/dist/src/lib/prompt-schema-codegen.js.map +1 -0
  395. package/dist/src/lib/query-operators.d.ts +43 -0
  396. package/dist/src/lib/query-operators.js +80 -0
  397. package/dist/src/lib/query-operators.js.map +1 -0
  398. package/dist/src/lib/record-filter.d.ts +18 -0
  399. package/dist/src/lib/record-filter.js +55 -0
  400. package/dist/src/lib/record-filter.js.map +1 -0
  401. package/dist/src/lib/refresh-admin-credentials.d.ts +73 -0
  402. package/dist/src/lib/refresh-admin-credentials.js +123 -0
  403. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  404. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  405. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  406. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  407. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  408. package/dist/src/lib/resolve-init-server.js +77 -0
  409. package/dist/src/lib/resolve-init-server.js.map +1 -0
  410. package/dist/src/lib/resolve-owner.d.ts +19 -0
  411. package/dist/src/lib/resolve-owner.js +20 -0
  412. package/dist/src/lib/resolve-owner.js.map +1 -0
  413. package/dist/src/lib/resolve-platform.d.ts +74 -0
  414. package/dist/src/lib/resolve-platform.js +105 -0
  415. package/dist/src/lib/resolve-platform.js.map +1 -0
  416. package/dist/src/lib/run-status.d.ts +19 -0
  417. package/dist/src/lib/run-status.generated.d.ts +39 -0
  418. package/dist/src/lib/run-status.generated.js +66 -0
  419. package/dist/src/lib/run-status.generated.js.map +1 -0
  420. package/dist/src/lib/run-status.js +19 -0
  421. package/dist/src/lib/run-status.js.map +1 -0
  422. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  423. package/dist/src/lib/server-text-normalization.js +90 -0
  424. package/dist/src/lib/server-text-normalization.js.map +1 -0
  425. package/dist/src/lib/server-url.d.ts +22 -0
  426. package/dist/src/lib/server-url.js +33 -0
  427. package/dist/src/lib/server-url.js.map +1 -0
  428. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  429. package/dist/src/lib/signing-secret-status.js +116 -0
  430. package/dist/src/lib/signing-secret-status.js.map +1 -0
  431. package/dist/src/lib/skill-installer.d.ts +71 -0
  432. package/dist/src/lib/skill-installer.js +441 -0
  433. package/dist/src/lib/skill-installer.js.map +1 -0
  434. package/dist/src/lib/snapshot-audit-source.d.ts +45 -0
  435. package/dist/src/lib/snapshot-audit-source.js +58 -0
  436. package/dist/src/lib/snapshot-audit-source.js.map +1 -0
  437. package/dist/src/lib/snapshot-audit-store.d.ts +52 -0
  438. package/dist/src/lib/snapshot-audit-store.js +196 -0
  439. package/dist/src/lib/snapshot-audit-store.js.map +1 -0
  440. package/dist/src/lib/snapshot-audit.d.ts +207 -0
  441. package/dist/src/lib/snapshot-audit.js +431 -0
  442. package/dist/src/lib/snapshot-audit.js.map +1 -0
  443. package/dist/src/lib/snapshot-build-rows.d.ts +60 -0
  444. package/dist/src/lib/snapshot-build-rows.js +87 -0
  445. package/dist/src/lib/snapshot-build-rows.js.map +1 -0
  446. package/dist/src/lib/snapshot-build.d.ts +50 -0
  447. package/dist/src/lib/snapshot-build.js +111 -0
  448. package/dist/src/lib/snapshot-build.js.map +1 -0
  449. package/dist/src/lib/snapshot-manifest-layout.d.ts +61 -0
  450. package/dist/src/lib/snapshot-manifest-layout.js +70 -0
  451. package/dist/src/lib/snapshot-manifest-layout.js.map +1 -0
  452. package/dist/src/lib/snapshots.d.ts +98 -0
  453. package/dist/src/lib/snapshots.js +294 -0
  454. package/dist/src/lib/snapshots.js.map +1 -0
  455. package/dist/src/lib/step-run-table.d.ts +43 -0
  456. package/dist/src/lib/step-run-table.js +129 -0
  457. package/dist/src/lib/step-run-table.js.map +1 -0
  458. package/dist/src/lib/storage-pending-retry.d.ts +26 -0
  459. package/dist/src/lib/storage-pending-retry.js +42 -0
  460. package/dist/src/lib/storage-pending-retry.js.map +1 -0
  461. package/dist/src/lib/swift-codegen/agentGenerator.d.ts +42 -0
  462. package/dist/src/lib/swift-codegen/agentGenerator.js +118 -0
  463. package/dist/src/lib/swift-codegen/agentGenerator.js.map +1 -0
  464. package/dist/src/lib/swift-codegen/banners.d.ts +24 -0
  465. package/dist/src/lib/swift-codegen/banners.js +25 -0
  466. package/dist/src/lib/swift-codegen/banners.js.map +1 -0
  467. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
  468. package/dist/src/lib/swift-codegen/dbGenerator.js +926 -0
  469. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  470. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  471. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  472. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  473. package/dist/src/lib/swift-codegen/functionGenerator.d.ts +139 -0
  474. package/dist/src/lib/swift-codegen/functionGenerator.js +462 -0
  475. package/dist/src/lib/swift-codegen/functionGenerator.js.map +1 -0
  476. package/dist/src/lib/swift-codegen/generator.d.ts +100 -0
  477. package/dist/src/lib/swift-codegen/generator.js +457 -0
  478. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  479. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +87 -0
  480. package/dist/src/lib/swift-codegen/schemaToSwift.js +661 -0
  481. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  482. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
  483. package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
  484. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  485. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  486. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  487. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  488. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  489. package/dist/src/lib/sync-dir-selector.js +30 -0
  490. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  491. package/dist/src/lib/sync-paths.d.ts +128 -0
  492. package/dist/src/lib/sync-paths.js +195 -0
  493. package/dist/src/lib/sync-paths.js.map +1 -0
  494. package/dist/src/lib/sync-resource-types.d.ts +563 -0
  495. package/dist/src/lib/sync-resource-types.js +1073 -0
  496. package/dist/src/lib/sync-resource-types.js.map +1 -0
  497. package/dist/src/lib/sync-selectors.d.ts +138 -0
  498. package/dist/src/lib/sync-selectors.js +289 -0
  499. package/dist/src/lib/sync-selectors.js.map +1 -0
  500. package/dist/src/lib/template.d.ts +170 -0
  501. package/dist/src/lib/template.js +484 -68
  502. package/dist/src/lib/template.js.map +1 -1
  503. package/dist/src/lib/test-case-file-names.d.ts +40 -0
  504. package/dist/src/lib/test-case-file-names.js +91 -0
  505. package/dist/src/lib/test-case-file-names.js.map +1 -0
  506. package/dist/src/lib/test-case-keys.d.ts +29 -0
  507. package/dist/src/lib/test-case-keys.js +55 -0
  508. package/dist/src/lib/test-case-keys.js.map +1 -0
  509. package/dist/src/lib/test-case-variables.d.ts +29 -0
  510. package/dist/src/lib/test-case-variables.js +71 -0
  511. package/dist/src/lib/test-case-variables.js.map +1 -0
  512. package/dist/src/lib/token-inject.d.ts +56 -0
  513. package/dist/src/lib/token-inject.js +204 -0
  514. package/dist/src/lib/token-inject.js.map +1 -0
  515. package/dist/src/lib/toml-database-config.d.ts +123 -0
  516. package/dist/src/lib/toml-database-config.js +544 -0
  517. package/dist/src/lib/toml-database-config.js.map +1 -0
  518. package/dist/src/lib/toml-metadata-config.d.ts +151 -0
  519. package/dist/src/lib/toml-metadata-config.js +476 -0
  520. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  521. package/dist/src/lib/toml-native-form.d.ts +46 -0
  522. package/dist/src/lib/toml-native-form.js +78 -0
  523. package/dist/src/lib/toml-native-form.js.map +1 -0
  524. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  525. package/dist/src/lib/toml-params-validator.js +298 -0
  526. package/dist/src/lib/toml-params-validator.js.map +1 -0
  527. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  528. package/dist/src/lib/toml-scalar-edit.js +283 -0
  529. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  530. package/dist/src/lib/user-selector.d.ts +24 -0
  531. package/dist/src/lib/user-selector.js +33 -0
  532. package/dist/src/lib/user-selector.js.map +1 -0
  533. package/dist/src/lib/version-check.d.ts +35 -0
  534. package/dist/src/lib/version-check.js +241 -0
  535. package/dist/src/lib/version-check.js.map +1 -0
  536. package/dist/src/lib/watch.d.ts +121 -0
  537. package/dist/src/lib/watch.js +169 -0
  538. package/dist/src/lib/watch.js.map +1 -0
  539. package/dist/src/lib/web-url.d.ts +40 -0
  540. package/dist/src/lib/web-url.js +76 -0
  541. package/dist/src/lib/web-url.js.map +1 -0
  542. package/dist/src/lib/webhook-deliver.d.ts +209 -0
  543. package/dist/src/lib/webhook-deliver.js +519 -0
  544. package/dist/src/lib/webhook-deliver.js.map +1 -0
  545. package/dist/src/lib/workflow-apply.d.ts +110 -0
  546. package/dist/src/lib/workflow-apply.js +164 -0
  547. package/dist/src/lib/workflow-apply.js.map +1 -0
  548. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  549. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  550. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  551. package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
  552. package/dist/src/lib/workflow-codegen/generator.js +361 -0
  553. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  554. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
  555. package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
  556. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  557. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  558. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  559. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  560. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
  561. package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
  562. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  563. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  564. package/dist/src/lib/workflow-config-apply.js +137 -0
  565. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  566. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  567. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  568. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  569. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  570. package/dist/src/lib/workflow-defaults.js +41 -0
  571. package/dist/src/lib/workflow-defaults.js.map +1 -0
  572. package/dist/src/lib/workflow-fragments.d.ts +64 -0
  573. package/dist/src/lib/workflow-fragments.js +342 -0
  574. package/dist/src/lib/workflow-fragments.js.map +1 -0
  575. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  576. package/dist/src/lib/workflow-include-preserve.js +286 -0
  577. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  578. package/dist/src/lib/workflow-payload.d.ts +98 -0
  579. package/dist/src/lib/workflow-payload.js +178 -0
  580. package/dist/src/lib/workflow-payload.js.map +1 -0
  581. package/dist/src/lib/workflow-toml-validator.d.ts +211 -0
  582. package/dist/src/lib/workflow-toml-validator.js +770 -0
  583. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  584. package/dist/src/lib/workflow-usage.d.ts +196 -0
  585. package/dist/src/lib/workflow-usage.js +310 -0
  586. package/dist/src/lib/workflow-usage.js.map +1 -0
  587. package/dist/src/types/index.d.ts +591 -0
  588. package/dist/src/validators.d.ts +65 -0
  589. package/dist/src/validators.js +64 -0
  590. package/dist/src/validators.js.map +1 -0
  591. package/package.json +34 -9
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Keep `[[include]]` fragment structure alive across `config pull` (issue #2416).
3
+ *
4
+ * Fragments are a CLI-only authoring form: `expandWorkflowTomlData()` splices
5
+ * the referenced fragments into a flat `[[steps]]` list and the server only
6
+ * ever stores that expansion (see `workflow-fragments.ts`). `config pull`
7
+ * serializes the server's flat steps straight back to disk, so before this
8
+ * module a pull unconditionally overwrote a fragment-authored file with its
9
+ * own expansion — the `[[include]]` blocks were gone and had to be rebuilt by
10
+ * hand, even when `config diff` reported the file as synced.
11
+ *
12
+ * `reconcileWorkflowIncludes()` decides what pull should write for one
13
+ * workflow file. It only ever engages for a local file that actually carries
14
+ * an `include` key; everything else takes the unchanged "write what the server
15
+ * gave us" path.
16
+ *
17
+ * - **skip** — the local file expands to exactly what the server is running.
18
+ * There is nothing to apply, so leave the fragment source (and its
19
+ * comments and formatting) untouched. One thing still has to be applied to
20
+ * an otherwise-unchanged file: a retired inline `[[configs]]` list (#2733).
21
+ * Pull rewrites every other workflow file off it, and push rejects a file
22
+ * that still carries one, so a plain skip left the fragment source in a
23
+ * shape push refuses — pull → push of an untouched tree failed. Such a
24
+ * file takes the write-merged path with only the list removed.
25
+ * - **write-merged** — the server drifted, but its step list still *starts*
26
+ * with exactly the steps the local includes expand to. The drift is
27
+ * therefore expressible in fragment form: re-emit the file with the
28
+ * original `[[include]]` blocks and put the remaining server steps in the
29
+ * workflow's own `[[steps]]` list. Re-expanding that file reproduces the
30
+ * server's step list in order, so the next `config diff` reads as synced.
31
+ * - **write-expanded** — the fragment-derived prefix no longer matches what
32
+ * the server is running (a fragment's steps were edited or removed
33
+ * server-side), so no fragment-preserving file could reproduce it. Fall
34
+ * back to the historical behavior — write the fully expanded form — and
35
+ * say why, so the operator knows the fragment source was replaced rather
36
+ * than silently losing it.
37
+ *
38
+ * The order rule comes from the expander: it emits every fragment's steps
39
+ * first (in `include` order) and then the workflow's own `[[steps]]`. So a
40
+ * fragment-preserving file can only represent a server step list whose leading
41
+ * steps are exactly the fragment expansion. Server steps inserted *between*
42
+ * fragment steps are not representable and take the write-expanded path.
43
+ */
44
+ import { parseConfigToml, stringifyConfigToml } from "./config-toml.js";
45
+ import { expandWorkflowTomlData } from "./workflow-fragments.js";
46
+ import { canonicalJsonStringify } from "./canonical-json.js";
47
+ export function reconcileWorkflowIncludes(options) {
48
+ const { workflowKey, localPath, localContent, remoteToml, hashParsedToml } = options;
49
+ const label = `workflows/${workflowKey}.toml`;
50
+ if (localContent === undefined) {
51
+ return { action: "write-expanded" };
52
+ }
53
+ let localParsed;
54
+ try {
55
+ localParsed = parseConfigToml(localContent);
56
+ }
57
+ catch {
58
+ // An unparseable local file carries no structure worth preserving — pull
59
+ // replaces it, exactly as it did before.
60
+ return { action: "write-expanded" };
61
+ }
62
+ if (localParsed === null ||
63
+ typeof localParsed !== "object" ||
64
+ !("include" in localParsed)) {
65
+ return { action: "write-expanded" };
66
+ }
67
+ let expandedLocal;
68
+ try {
69
+ expandedLocal = expandWorkflowTomlData(localParsed, localPath);
70
+ }
71
+ catch (err) {
72
+ return {
73
+ action: "write-expanded",
74
+ message: `${label}: could not expand its [[include]] fragments ` +
75
+ `(${err?.message ?? err}); wrote the fully expanded form from the server.`,
76
+ };
77
+ }
78
+ const remoteParsed = parseConfigToml(remoteToml);
79
+ // Nothing to apply: the fragment source already describes what's running —
80
+ // except for a retired inline `[[configs]]` list, which pull has to take out
81
+ // on its way past (#2733).
82
+ if (hashParsedToml(expandedLocal) === hashParsedToml(remoteParsed)) {
83
+ if (hasRetiredInlineConfigs(localParsed)) {
84
+ return {
85
+ action: "write-merged",
86
+ content: withoutRetiredInlineConfigs({
87
+ localContent,
88
+ localParsed,
89
+ localPath,
90
+ remoteHash: hashParsedToml(remoteParsed),
91
+ hashParsedToml,
92
+ }),
93
+ message: `${label}: removed the retired [[configs]] list (#2645) and kept ` +
94
+ `the local [[include]] fragment source. Named configurations are ` +
95
+ `authored one per file at workflows/${workflowKey}.configs/<name>.toml.`,
96
+ };
97
+ }
98
+ return {
99
+ action: "skip",
100
+ message: `${label}: unchanged — kept the local [[include]] fragment source.`,
101
+ };
102
+ }
103
+ const ownSteps = Array.isArray(localParsed.steps) ? localParsed.steps : [];
104
+ const expandedSteps = Array.isArray(expandedLocal.steps)
105
+ ? expandedLocal.steps
106
+ : [];
107
+ const remoteSteps = Array.isArray(remoteParsed.steps)
108
+ ? remoteParsed.steps
109
+ : [];
110
+ const fragmentCount = expandedSteps.length - ownSteps.length;
111
+ if (fragmentCount < 0) {
112
+ // Defensive: the expander always emits fragment steps plus own steps.
113
+ return { action: "write-expanded" };
114
+ }
115
+ const mismatch = findFragmentPrefixMismatch(expandedSteps.slice(0, fragmentCount), remoteSteps);
116
+ if (mismatch) {
117
+ return {
118
+ action: "write-expanded",
119
+ message: `${label}: the running workflow no longer starts with the steps its ` +
120
+ `[[include]] fragments expand to (${mismatch}), so the fragment ` +
121
+ `structure can't be preserved. Wrote the fully expanded form — ` +
122
+ `re-author the includes by hand if you want them back.`,
123
+ };
124
+ }
125
+ const remainingSteps = remoteSteps.slice(fragmentCount);
126
+ // Rebuild the file from the server's content with the local include blocks
127
+ // spliced back in. `workflow` first, then `include`, then the steps the
128
+ // fragments don't cover, then everything else the server serialized
129
+ // (`configs`, `[expr.cel]`, the declared-access manifest, ...).
130
+ const data = {};
131
+ if ("workflow" in remoteParsed) {
132
+ data.workflow = remoteParsed.workflow;
133
+ }
134
+ data.include = localParsed.include;
135
+ if (remainingSteps.length > 0) {
136
+ data.steps = remainingSteps;
137
+ }
138
+ for (const [key, value] of Object.entries(remoteParsed)) {
139
+ if (!(key in data) && key !== "steps") {
140
+ data[key] = value;
141
+ }
142
+ }
143
+ return {
144
+ action: "write-merged",
145
+ content: stringifyConfigToml(data),
146
+ message: `${label}: kept ${fragmentCount} step(s) from [[include]] fragments; ` +
147
+ `wrote ${remainingSteps.length} server step(s) the fragments don't cover.`,
148
+ };
149
+ }
150
+ /**
151
+ * Whether the local file carries the inline `[[configs]]` list #2645 retired.
152
+ * Matches the push validator's rule exactly (`validateRetiredInlineConfigs` in
153
+ * `workflow-toml-validator.ts`): a non-empty array at the document root. An
154
+ * empty one is not rejected by push, so pull has no reason to touch the file
155
+ * over it.
156
+ */
157
+ function hasRetiredInlineConfigs(localParsed) {
158
+ return Array.isArray(localParsed.configs) && localParsed.configs.length > 0;
159
+ }
160
+ /** A `[[configs]]` header line, the only form a retired list can be authored in as a table array. */
161
+ const RETIRED_CONFIGS_HEADER = /^\[\[\s*configs\s*\]\]\s*(#.*)?$/;
162
+ /** `[configs.x]` / `[[configs.x]]` — a subtable of the entry being removed. */
163
+ const RETIRED_CONFIGS_SUBTABLE = /^\[\[?\s*configs\s*\./;
164
+ /**
165
+ * The local file with its retired `[[configs]]` blocks taken out, preserving
166
+ * every other byte — comments, key order and formatting included. That matters
167
+ * here more than anywhere else in this module: the file is otherwise in sync,
168
+ * so re-emitting it would reformat an operator's hand-authored source for a
169
+ * change that only deletes a block nothing reads.
170
+ *
171
+ * Returns `undefined` when the list is not authored as `[[configs]]` blocks
172
+ * (an inline `configs = [ … ]` array, say), which the caller handles by
173
+ * re-emitting the parsed document instead.
174
+ */
175
+ function stripRetiredInlineConfigsText(content) {
176
+ const kept = [];
177
+ /**
178
+ * Blank and comment lines seen since the last line that definitely belongs to
179
+ * the block being removed. A comment sitting between the retired list and the
180
+ * next table almost always documents *that* table, so it is handed back when
181
+ * the table arrives instead of being deleted with the block; trivia followed
182
+ * by another config line documented the removed entry and is dropped.
183
+ */
184
+ let trivia = [];
185
+ let removing = false;
186
+ let removedAny = false;
187
+ /** Give the pending trivia back, from its first comment line onwards. */
188
+ const keepTrivia = () => {
189
+ const firstComment = trivia.findIndex((line) => line.trim().startsWith("#"));
190
+ // Blank-only trivia is just the separator the removed block left behind.
191
+ if (firstComment >= 0)
192
+ kept.push(...trivia.slice(firstComment));
193
+ trivia = [];
194
+ };
195
+ for (const line of content.split("\n")) {
196
+ const trimmed = line.trim();
197
+ if (RETIRED_CONFIGS_HEADER.test(trimmed)) {
198
+ trivia = [];
199
+ removing = true;
200
+ removedAny = true;
201
+ continue;
202
+ }
203
+ if (removing) {
204
+ // The block runs to the next top-level table header; a `configs.*`
205
+ // subtable belongs to the entry being removed and goes with it.
206
+ if (RETIRED_CONFIGS_SUBTABLE.test(trimmed)) {
207
+ trivia = [];
208
+ continue;
209
+ }
210
+ if (!trimmed.startsWith("[")) {
211
+ if (trimmed === "" || trimmed.startsWith("#"))
212
+ trivia.push(line);
213
+ else
214
+ trivia = [];
215
+ continue;
216
+ }
217
+ keepTrivia();
218
+ removing = false;
219
+ }
220
+ kept.push(line);
221
+ }
222
+ if (removing)
223
+ keepTrivia();
224
+ if (!removedAny)
225
+ return undefined;
226
+ const stripped = kept.join("\n");
227
+ // A block that ran to the end of the file takes the final newline with it.
228
+ return content.endsWith("\n") && !stripped.endsWith("\n")
229
+ ? `${stripped}\n`
230
+ : stripped;
231
+ }
232
+ /**
233
+ * What pull writes for an in-sync fragment source that still carries the
234
+ * retired list: the same file minus the `[[configs]]` blocks.
235
+ *
236
+ * The textual strip is verified before it is used — the result has to parse,
237
+ * carry no `configs` any more, and still expand to exactly the server's
238
+ * content hash. Anything else (an inline-array form, a shape the line scan
239
+ * misreads) falls back to re-emitting the parsed document without its
240
+ * `configs` key, which loses comments but is correct by construction.
241
+ */
242
+ function withoutRetiredInlineConfigs(options) {
243
+ const { localContent, localParsed, localPath, remoteHash, hashParsedToml } = options;
244
+ const stripped = stripRetiredInlineConfigsText(localContent);
245
+ if (stripped !== undefined) {
246
+ try {
247
+ const reparsed = parseConfigToml(stripped);
248
+ if (!hasRetiredInlineConfigs(reparsed) &&
249
+ hashParsedToml(expandWorkflowTomlData(reparsed, localPath)) ===
250
+ remoteHash) {
251
+ return stripped;
252
+ }
253
+ }
254
+ catch {
255
+ // Fall through to the re-emit below.
256
+ }
257
+ }
258
+ const { configs: _retired, ...rest } = localParsed;
259
+ return stringifyConfigToml(rest);
260
+ }
261
+ /**
262
+ * Returns a human-readable description of the first place the server's step
263
+ * list departs from the fragment-derived prefix, or `undefined` when the
264
+ * prefix matches exactly.
265
+ */
266
+ function findFragmentPrefixMismatch(fragmentSteps, remoteSteps) {
267
+ if (remoteSteps.length < fragmentSteps.length) {
268
+ return `the server has ${remoteSteps.length} step(s), fewer than the ${fragmentSteps.length} the fragments produce`;
269
+ }
270
+ for (let i = 0; i < fragmentSteps.length; i++) {
271
+ if (canonicalJsonStringify(fragmentSteps[i]) !==
272
+ canonicalJsonStringify(remoteSteps[i])) {
273
+ const expectedId = describeStepId(fragmentSteps[i]);
274
+ const actualId = describeStepId(remoteSteps[i]);
275
+ return expectedId === actualId
276
+ ? `step ${i + 1} '${expectedId}' differs`
277
+ : `step ${i + 1} is '${actualId}' where the fragments produce '${expectedId}'`;
278
+ }
279
+ }
280
+ return undefined;
281
+ }
282
+ function describeStepId(step) {
283
+ const id = step?.id;
284
+ return typeof id === "string" && id.length > 0 ? id : "<no id>";
285
+ }
286
+ //# sourceMappingURL=workflow-include-preserve.js.map
@@ -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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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Shared TOML → workflow-payload builder (#1177).
3
+ *
4
+ * Background: the CLI built the create/update workflow payload in THREE
5
+ * separate hand-enumerated literals — `workflows create --from-file`
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
+ * PATCH in `cli/src/lib/workflow-apply.ts`). Because each site listed the
9
+ * `[workflow]` fields by hand, they drifted apart: a field added to one path was
10
+ * silently dropped by the others. `status` was the 4th field lost this way
11
+ * (after `syncCallable` #807, `accessRule` #571, `runAs` #1081); the audit also
12
+ * found `capabilities` (#1172) and `perAppMaxRunning` / `perAppMaxQueued` /
13
+ * `queueTtlSeconds` dropped from at least one path.
14
+ *
15
+ * The fix: one shared builder that owns the `[workflow]`-derived field list.
16
+ * All three call-sites spread its output; only the per-field presence coalescing
17
+ * and the create-only `syncCallable` inclusion differ by `mode`, so the field
18
+ * list itself lives in exactly one place and can't drift again. A unit
19
+ * drift-guard asserts the builder's key set (see
20
+ * `cli/tests/unit/workflow-payload-fields.test.ts`).
21
+ *
22
+ * What the builder does NOT own (structural / call-site-specific wiring the
23
+ * callers still attach): `workflowKey`, `steps`, and the `metadataManifest`
24
+ * declared-access manifest (#1304) — the sync paths always attach it, create
25
+ * --from-file never does.
26
+ *
27
+ * Presence semantics, by mode:
28
+ * - create: optional strings coalesce absent/empty → `undefined` (omit; the
29
+ * server default applies). `capabilities` forwards the raw array (absent →
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.
54
+ */
55
+ export type WorkflowPayloadMode = "create" | "update";
56
+ /**
57
+ * Parse a JSON schema field that TOML may present as a string OR (for an inline
58
+ * table) as an already-parsed object. Kept here in `cli/src/lib` so the builder
59
+ * owns its own parse decision rather than importing back into a command module
60
+ * (#1177 dependency-direction decision).
61
+ */
62
+ export declare function safeJsonParse(value: any): any;
63
+ /**
64
+ * #1614 — the workflow-level named `expr.*` definitions payload. Phase 1
65
+ * carries CEL guard definitions only (`cel`); `[expr.template]` is a deferred
66
+ * later phase.
67
+ */
68
+ export type WorkflowExpressionsPayload = {
69
+ cel?: Record<string, string>;
70
+ };
71
+ /**
72
+ * #1614 — extract the top-level `[expr.cel]` table from a parsed workflow TOML
73
+ * into the `expressions` payload the server persists on the R2 steps blob. A
74
+ * structural field (like `steps` / `metadataManifest`), attached alongside the
75
+ * steps write — NOT a `[workflow]`-table field. Returns `undefined` when no
76
+ * `[expr.cel]` table (or no string entries) is present, so a workflow without
77
+ * definitions round-trips a clean drop.
78
+ *
79
+ * `tomlData.expr.cel` is the parsed `[expr.cel]` table: `{ <name>: <cel-string> }`.
80
+ */
81
+ export declare function parseWorkflowExpressionsToml(tomlData: any): WorkflowExpressionsPayload | undefined;
82
+ /**
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.
87
+ */
88
+ export declare function workflowPayloadFields(mode: WorkflowPayloadMode): string[];
89
+ /**
90
+ * Build the workflow payload's `[workflow]`-derived fields from a parsed TOML
91
+ * `[workflow]` table. `workflow` is `tomlData.workflow` (already merged with any
92
+ * explicit CLI flag overrides by the caller). Callers spread the result into
93
+ * the create/update payload and attach the structural fields themselves
94
+ * (`workflowKey`, `steps`, `metadataManifest`).
95
+ */
96
+ export declare function buildWorkflowPayloadFromToml(workflow: any, { mode }: {
97
+ mode: WorkflowPayloadMode;
98
+ }): Record<string, any>;
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Shared TOML → workflow-payload builder (#1177).
3
+ *
4
+ * Background: the CLI built the create/update workflow payload in THREE
5
+ * separate hand-enumerated literals — `workflows create --from-file`
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
+ * PATCH in `cli/src/lib/workflow-apply.ts`). Because each site listed the
9
+ * `[workflow]` fields by hand, they drifted apart: a field added to one path was
10
+ * silently dropped by the others. `status` was the 4th field lost this way
11
+ * (after `syncCallable` #807, `accessRule` #571, `runAs` #1081); the audit also
12
+ * found `capabilities` (#1172) and `perAppMaxRunning` / `perAppMaxQueued` /
13
+ * `queueTtlSeconds` dropped from at least one path.
14
+ *
15
+ * The fix: one shared builder that owns the `[workflow]`-derived field list.
16
+ * All three call-sites spread its output; only the per-field presence coalescing
17
+ * and the create-only `syncCallable` inclusion differ by `mode`, so the field
18
+ * list itself lives in exactly one place and can't drift again. A unit
19
+ * drift-guard asserts the builder's key set (see
20
+ * `cli/tests/unit/workflow-payload-fields.test.ts`).
21
+ *
22
+ * What the builder does NOT own (structural / call-site-specific wiring the
23
+ * callers still attach): `workflowKey`, `steps`, and the `metadataManifest`
24
+ * declared-access manifest (#1304) — the sync paths always attach it, create
25
+ * --from-file never does.
26
+ *
27
+ * Presence semantics, by mode:
28
+ * - create: optional strings coalesce absent/empty → `undefined` (omit; the
29
+ * server default applies). `capabilities` forwards the raw array (absent →
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.
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";
58
+ /**
59
+ * Parse a JSON schema field that TOML may present as a string OR (for an inline
60
+ * table) as an already-parsed object. Kept here in `cli/src/lib` so the builder
61
+ * owns its own parse decision rather than importing back into a command module
62
+ * (#1177 dependency-direction decision).
63
+ */
64
+ export function safeJsonParse(value) {
65
+ if (value === undefined || value === null)
66
+ return undefined;
67
+ if (typeof value === "string")
68
+ return JSON.parse(value);
69
+ return value; // Already an object (TOML parsed it as a table)
70
+ }
71
+ /**
72
+ * #1614 — extract the top-level `[expr.cel]` table from a parsed workflow TOML
73
+ * into the `expressions` payload the server persists on the R2 steps blob. A
74
+ * structural field (like `steps` / `metadataManifest`), attached alongside the
75
+ * steps write — NOT a `[workflow]`-table field. Returns `undefined` when no
76
+ * `[expr.cel]` table (or no string entries) is present, so a workflow without
77
+ * definitions round-trips a clean drop.
78
+ *
79
+ * `tomlData.expr.cel` is the parsed `[expr.cel]` table: `{ <name>: <cel-string> }`.
80
+ */
81
+ export function parseWorkflowExpressionsToml(tomlData) {
82
+ const cel = tomlData?.expr?.cel;
83
+ if (!cel || typeof cel !== "object" || Array.isArray(cel))
84
+ return undefined;
85
+ const out = {};
86
+ for (const [name, body] of Object.entries(cel)) {
87
+ if (typeof body === "string")
88
+ out[name] = body;
89
+ }
90
+ return Object.keys(out).length > 0 ? { cel: out } : undefined;
91
+ }
92
+ /**
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.
123
+ */
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
+ };
149
+ /**
150
+ * Build the workflow payload's `[workflow]`-derived fields from a parsed TOML
151
+ * `[workflow]` table. `workflow` is `tomlData.workflow` (already merged with any
152
+ * explicit CLI flag overrides by the caller). Callers spread the result into
153
+ * the create/update payload and attach the structural fields themselves
154
+ * (`workflowKey`, `steps`, `metadataManifest`).
155
+ */
156
+ export function buildWorkflowPayloadFromToml(workflow, { mode }) {
157
+ const create = mode === "create";
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)
166
+ : create
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);
175
+ }
176
+ return payload;
177
+ }
178
+ //# sourceMappingURL=workflow-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-payload.js","sourceRoot":"","sources":["../../../src/lib/workflow-payload.ts"],"names":[],"mappings":"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"}