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,519 @@
1
+ /**
2
+ * Deliver a signed preview through a webhook's real receive path (#3321).
3
+ *
4
+ * `primitive webhooks test --deliver` adds no server dispatch surface. It
5
+ * composes two capabilities that already exist:
6
+ *
7
+ * 1. the admin-gated preview `POST /admin/api/apps/{appId}/webhooks/{id}/test`,
8
+ * which signs a payload with the same rule the receiver verifies with, and
9
+ * 2. the public receive endpoint `POST /app/{appId}/webhook/{webhookKey}`,
10
+ * the unauthenticated path a provider posts to.
11
+ *
12
+ * So the delivery is a real delivery: the body cap, the availability check, the
13
+ * IP allowlist, signature verification, handshake rules, deduplication, the run
14
+ * row and the delivery log all run exactly as they do for a provider. Nobody
15
+ * gains authority they did not have — only someone who can already administer
16
+ * the app can obtain a signature — and nothing bypasses verification, because
17
+ * the signature is checked for real at the receive endpoint.
18
+ *
19
+ * ── What this module owes the caller ──────────────────────────────────────
20
+ *
21
+ * An honest report. The receive endpoint answers `{received: true}` and
22
+ * discloses nothing else (it must not: it is unauthenticated), so "did the
23
+ * function actually run?" is answered from the delivery log and the runs
24
+ * surface, and only positive evidence may be reported as a dispatch:
25
+ *
26
+ * - **Correlation is one rule.** A delivery-log row NEWER than a baseline
27
+ * snapshot taken before the POST, whose `dedupKey` equals the one the
28
+ * preview returned. That key hashes the whole signed payload including its
29
+ * timestamp prefix, so it is unique to this request rather than a
30
+ * heuristic; the baseline is what keeps a replay of the same signed bytes
31
+ * from being attributed here. There is no body-hash fallback: identical
32
+ * bodies collide, and attributing another request's row is worse than
33
+ * declining to.
34
+ * - **The key names dispatched deliveries only.** The receiver writes
35
+ * `dedupKey` on an `accepted` row that really dispatched and OMITS it
36
+ * everywhere else — on a handshake row, a duplicate, a rejection, a 202
37
+ * non-dispatch, and on the `accepted` row of a delivery whose target was
38
+ * not found (`webhook-receiver.ts`, `logEvent`). That omission is what
39
+ * keeps the `eventsByDedupKey` index holding exactly the deliveries that
40
+ * may suppress a later one, so it is load-bearing, not incidental. The
41
+ * consequence here: a delivery the receiver did not dispatch has no row
42
+ * this correlator can reach, and is reported as unconfirmed — with what
43
+ * the absence of the key means — rather than named from a row.
44
+ * - **A run is confirmed, not assumed.** An `accepted` row names a run id
45
+ * before the run finishes, and the legacy workflow branch keeps its
46
+ * `accepted` row and its HTTP 200 even when the launch is skipped or
47
+ * throws. So the named run is looked up on the authenticated runs surface
48
+ * before dispatch is claimed.
49
+ * - **Everything else is named for what it was** — a suppressed replay, a
50
+ * 410/403/401 refusal, each of which the receive endpoint reports for
51
+ * itself — or reported as "dispatch unconfirmed", which is where a
52
+ * handshake short-circuit (it can legally answer 200 `{received:true}`
53
+ * before any dispatch) and a 202 non-dispatch land, since neither records
54
+ * a correlatable row. Only a confirmed dispatch exits `0`.
55
+ */
56
+ import { fetchWithTLS } from "./fetch.js";
57
+ /** ~5 attempts over ~4 s: the accepted row is written before execution ends. */
58
+ export const DELIVER_POLL_ATTEMPTS = 5;
59
+ export const DELIVER_POLL_INTERVAL_MS = 800;
60
+ /** Cursor pages walked per attempt, so a busy log cannot outrun the poll. */
61
+ export const DELIVER_PAGE_CAP = 10;
62
+ export const DELIVER_PAGE_LIMIT = 25;
63
+ /** The same bound on the runs surface, where runs start while this one waits. */
64
+ export const DELIVER_RUN_PAGE_CAP = 5;
65
+ export const DELIVER_RUN_PAGE_LIMIT = 50;
66
+ /** Comfortably above the sync-function ceiling. */
67
+ export const DELIVER_TIMEOUT_MS = 60_000;
68
+ /**
69
+ * What the user is told before a delivery happens, in the terminal rather than
70
+ * only in the guide: a diagnostic that mutates the app has to say so where the
71
+ * user is looking (criterion 4).
72
+ */
73
+ export function deliveryNotice(scheme) {
74
+ const lines = [
75
+ "This is a real delivery: the signed body is posted to the webhook's " +
76
+ "receive endpoint, a real event row is written to the delivery log, and " +
77
+ "the signed body's dedup key is spent — delivering these exact bytes " +
78
+ "again is suppressed as a replay.",
79
+ ];
80
+ if (scheme === "github") {
81
+ lines.push("On the 'github' scheme dedup entries never expire, so this body can " +
82
+ "never be delivered to this webhook again. Vary the payload between " +
83
+ "test deliveries.");
84
+ }
85
+ return lines;
86
+ }
87
+ const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
88
+ /**
89
+ * The one correlation rule: the newest row above `baselineEventId` whose
90
+ * `dedupKey` equals this preview's.
91
+ *
92
+ * The walk is newest-first and follows `nextCursor`, stopping at the baseline
93
+ * row (every row below it predates this delivery) or at `pageCap`. A null
94
+ * baseline means the log was empty when the snapshot was taken, so every row
95
+ * walked is a candidate.
96
+ */
97
+ export async function findDeliveryEvent(input) {
98
+ const pageCap = input.pageCap ?? DELIVER_PAGE_CAP;
99
+ const pageLimit = input.pageLimit ?? DELIVER_PAGE_LIMIT;
100
+ let cursor;
101
+ for (let page = 0; page < pageCap; page++) {
102
+ const result = await input.client.listWebhookEvents(input.appId, input.webhookId, { limit: pageLimit, ...(cursor ? { cursor } : {}) });
103
+ for (const row of result.items || []) {
104
+ if (input.baselineEventId && row.eventId === input.baselineEventId) {
105
+ return null;
106
+ }
107
+ if (row.dedupKey && row.dedupKey === input.dedupKey)
108
+ return row;
109
+ }
110
+ if (!result.nextCursor)
111
+ return null;
112
+ cursor = result.nextCursor;
113
+ }
114
+ return null;
115
+ }
116
+ /**
117
+ * Poll `findDeliveryEvent` within the budget — the row lands asynchronously.
118
+ *
119
+ * A failed read is retried rather than thrown: the delivery has already
120
+ * happened by the time this runs, so a network blip or an expired credential
121
+ * on the way to the log must not abort the command and lose the report of what
122
+ * was delivered. The last error is returned alongside an unresolved row so the
123
+ * caller can say why it is unconfirmed.
124
+ */
125
+ async function pollForDeliveryEvent(input) {
126
+ let error = null;
127
+ for (let attempt = 0; attempt < input.attempts; attempt++) {
128
+ try {
129
+ const found = await findDeliveryEvent(input);
130
+ if (found)
131
+ return { event: found, error: null };
132
+ error = null;
133
+ }
134
+ catch (err) {
135
+ error = messageOf(err);
136
+ }
137
+ if (attempt < input.attempts - 1)
138
+ await input.sleep(input.intervalMs);
139
+ }
140
+ return { event: null, error };
141
+ }
142
+ function messageOf(err) {
143
+ return err?.message ? String(err.message) : String(err);
144
+ }
145
+ /**
146
+ * Confirm the run an `accepted` row names really exists.
147
+ *
148
+ * A function-owned row is confirmed on `functions/{id}/runs`, the only surface
149
+ * that lists a function run. A legacy row is confirmed on the workflow runs
150
+ * surface, which needs the webhook's `workflowId` — a legacy row is visible to
151
+ * `webhooks get`, so that read is available (a function-owned row's is not,
152
+ * which is why the preview publishes `functionId`).
153
+ */
154
+ async function confirmRun(input) {
155
+ const { client, appId, event } = input;
156
+ const runId = (event.workflowRunId || event.workflowRunKey || null);
157
+ if (!runId) {
158
+ return {
159
+ runId: null,
160
+ confirmed: false,
161
+ surface: null,
162
+ reason: "the accepted delivery row names no run",
163
+ };
164
+ }
165
+ const matches = (row) => row?.runId === runId ||
166
+ row?.runKey === runId ||
167
+ (event.workflowRunKey && row?.runKey === event.workflowRunKey) ||
168
+ (event.workflowRunId && row?.runId === event.workflowRunId);
169
+ if (input.functionId) {
170
+ try {
171
+ const found = await findRun((params) => client.listFunctionRuns(appId, input.functionId, params), matches, input);
172
+ return {
173
+ runId,
174
+ confirmed: found,
175
+ surface: "function",
176
+ reason: found ? null : `run ${runId} is not on the function's runs`,
177
+ };
178
+ }
179
+ catch (err) {
180
+ return {
181
+ runId,
182
+ confirmed: false,
183
+ surface: "function",
184
+ reason: `the runs surface could not be read: ${messageOf(err)}`,
185
+ };
186
+ }
187
+ }
188
+ try {
189
+ const webhook = await client.getWebhook(appId, input.webhookId);
190
+ const workflowId = webhook?.workflowId;
191
+ if (!workflowId) {
192
+ return {
193
+ runId,
194
+ confirmed: false,
195
+ surface: null,
196
+ reason: "the webhook names no workflow to confirm the run against",
197
+ };
198
+ }
199
+ const found = await findRun((params) => client.listWorkflowRuns(appId, workflowId, params), matches, input);
200
+ return {
201
+ runId,
202
+ confirmed: found,
203
+ surface: "workflow",
204
+ reason: found ? null : `run ${runId} is not on the workflow's runs`,
205
+ };
206
+ }
207
+ catch (err) {
208
+ return {
209
+ runId,
210
+ confirmed: false,
211
+ surface: "workflow",
212
+ reason: `the runs surface could not be read: ${messageOf(err)}`,
213
+ };
214
+ }
215
+ }
216
+ /**
217
+ * Walk a runs listing, newest first, for the run the delivery row names.
218
+ *
219
+ * Both runs surfaces are cursor-paginated and newest-first, and a synchronous
220
+ * delivery holds this flow open while other runs start, so the newest page is
221
+ * not a safe place to stop looking: enough newer runs push this one off it and
222
+ * a real, inspectable run reads as unconfirmed. Following the cursor within a
223
+ * bounded page budget is the same shape the delivery log walk uses, and for the
224
+ * same reason.
225
+ */
226
+ async function findRun(list, matches, bounds) {
227
+ const pageCap = bounds.runPageCap ?? DELIVER_RUN_PAGE_CAP;
228
+ const pageLimit = bounds.runPageLimit ?? DELIVER_RUN_PAGE_LIMIT;
229
+ let cursor;
230
+ for (let page = 0; page < pageCap; page++) {
231
+ const result = await list({
232
+ limit: pageLimit,
233
+ ...(cursor ? { cursor } : {}),
234
+ });
235
+ if ((result.items || []).some(matches))
236
+ return true;
237
+ if (!result.nextCursor)
238
+ return false;
239
+ cursor = result.nextCursor;
240
+ }
241
+ return false;
242
+ }
243
+ const eventsHint = (webhookId) => `Read the delivery log with \`primitive webhooks events ${webhookId}\`.`;
244
+ /**
245
+ * The transport the delivery goes out on.
246
+ *
247
+ * The same one every other CLI request uses: a local dev server may speak
248
+ * HTTPS on localhost with a self-signed certificate, which `fetchWithTLS`
249
+ * accepts and bare `fetch` rejects. Sending the delivery on a different
250
+ * transport from the preview would fail exactly where this command is most
251
+ * used, and report it as "sent, dispatch unconfirmed" — the request never left.
252
+ * The receive endpoint is unauthenticated, so nothing else about the request
253
+ * changes: only the preview's bytes and its signature headers go out.
254
+ */
255
+ const deliveryFetch = (url, init) => fetchWithTLS(url, init);
256
+ /** POST the preview's bytes to the receive endpoint, verbatim. */
257
+ async function postDelivery(input) {
258
+ const attempt = {
259
+ url: input.url,
260
+ sent: true,
261
+ status: null,
262
+ body: null,
263
+ duplicate: false,
264
+ error: null,
265
+ };
266
+ const controller = typeof AbortController === "function" ? new AbortController() : null;
267
+ // Two bounds, because the localhost-HTTPS transport issues its own request
268
+ // and honours no abort signal: the signal stops a `fetch`, and losing the
269
+ // race stops the wait either way.
270
+ let timer = null;
271
+ const expiry = new Promise((_, reject) => {
272
+ timer = setTimeout(() => {
273
+ controller?.abort();
274
+ reject(new Error(`no response within ${input.timeoutMs}ms`));
275
+ }, input.timeoutMs);
276
+ });
277
+ try {
278
+ const response = await Promise.race([
279
+ input.fetchImpl(input.url, {
280
+ method: "POST",
281
+ headers: { ...input.preview.signatureHeaders },
282
+ body: input.preview.rawBody,
283
+ ...(controller ? { signal: controller.signal } : {}),
284
+ }),
285
+ expiry,
286
+ ]);
287
+ attempt.status = response?.status ?? null;
288
+ const text = typeof response?.text === "function" ? await response.text() : "";
289
+ try {
290
+ attempt.body = text ? JSON.parse(text) : null;
291
+ }
292
+ catch {
293
+ attempt.body = text || null;
294
+ }
295
+ attempt.duplicate = attempt.body?.duplicate === true;
296
+ }
297
+ catch (err) {
298
+ attempt.error = messageOf(err);
299
+ }
300
+ finally {
301
+ if (timer)
302
+ clearTimeout(timer);
303
+ }
304
+ return attempt;
305
+ }
306
+ /**
307
+ * Preview, deliver, correlate, confirm — the whole flow, as one result a caller
308
+ * renders however it likes.
309
+ */
310
+ export async function deliverWebhookTest(input, deps) {
311
+ const client = deps.client;
312
+ const fetchImpl = deps.fetchImpl ?? deliveryFetch;
313
+ const sleep = deps.sleep ?? defaultSleep;
314
+ const base = {
315
+ outcome: "unconfirmed",
316
+ headline: "",
317
+ details: [],
318
+ notice: [],
319
+ preview: null,
320
+ refusal: null,
321
+ delivery: null,
322
+ event: null,
323
+ run: null,
324
+ };
325
+ // 1. The correlation baseline, BEFORE anything is delivered. Its job is to
326
+ // scope the match to rows this delivery could have written, so a row left
327
+ // by an earlier delivery of the same signed bytes is never claimed here.
328
+ // Never the client clock: server and client clocks are not synchronized.
329
+ let baselineEventId = null;
330
+ try {
331
+ const page = await client.listWebhookEvents(input.appId, input.webhookId, {
332
+ limit: 1,
333
+ });
334
+ baselineEventId = page.items?.[0]?.eventId ?? null;
335
+ }
336
+ catch (err) {
337
+ return {
338
+ ...base,
339
+ outcome: "refused",
340
+ refusal: { message: messageOf(err), code: err?.code ?? null },
341
+ headline: "The delivery log could not be read, so a delivery could not be " +
342
+ `correlated to its event row. Nothing was delivered: ${messageOf(err)}`,
343
+ };
344
+ }
345
+ // 2. The preview, unchanged — every existing refusal propagates as it does
346
+ // without `--deliver`, and refuses before anything is delivered.
347
+ let preview;
348
+ try {
349
+ preview = (await client.testWebhook(input.appId, input.webhookId, input.payload ?? {}));
350
+ }
351
+ catch (err) {
352
+ return {
353
+ ...base,
354
+ outcome: "refused",
355
+ refusal: { message: messageOf(err), code: err?.code ?? null },
356
+ headline: `The preview was refused, so nothing was delivered: ${messageOf(err)}`,
357
+ };
358
+ }
359
+ // 3. The receive path. `webhooks get` answers 404 for a function-owned
360
+ // trigger row, so the preview is normally where the key comes from; the
361
+ // fallback is for a server that predates #3321.
362
+ let webhookKey = preview.webhookKey ?? null;
363
+ if (!webhookKey) {
364
+ try {
365
+ const webhook = await client.getWebhook(input.appId, input.webhookId);
366
+ webhookKey = webhook?.webhookKey ?? null;
367
+ }
368
+ catch {
369
+ webhookKey = null;
370
+ }
371
+ }
372
+ if (!webhookKey) {
373
+ return {
374
+ ...base,
375
+ preview,
376
+ outcome: "refused",
377
+ refusal: {
378
+ message: "this server's webhook preview does not report the receive path " +
379
+ "for this webhook, so --deliver cannot address it — upgrade the " +
380
+ "platform, or post the signed body from `--json` to " +
381
+ "`/app/{appId}/webhook/{webhookKey}` yourself",
382
+ code: "WEBHOOK_DELIVER_UNSUPPORTED",
383
+ },
384
+ headline: "Nothing was delivered: this server does not report the webhook's " +
385
+ "receive path, so --deliver cannot address it. Upgrade the platform.",
386
+ };
387
+ }
388
+ const notice = deliveryNotice(preview.verificationScheme);
389
+ deps.onBeforeDeliver?.(notice);
390
+ const url = `${input.serverUrl.replace(/\/$/, "")}/app/${input.appId}/webhook/${webhookKey}`;
391
+ const delivery = await postDelivery({
392
+ url,
393
+ preview,
394
+ fetchImpl,
395
+ timeoutMs: deps.timeoutMs ?? DELIVER_TIMEOUT_MS,
396
+ });
397
+ const resolved = { ...base, notice, preview, delivery };
398
+ // 4. The refusals the receive path reports for itself. Each is positive
399
+ // evidence that nothing was dispatched, so none of them needs the log.
400
+ const refusalHeadline = (message, details = []) => ({
401
+ ...resolved,
402
+ outcome: "refused",
403
+ headline: message,
404
+ details,
405
+ });
406
+ if (delivery.status === 410) {
407
+ return refusalHeadline("The receive endpoint refused the delivery: this webhook is not in " +
408
+ "service (410), so nothing ran.", [
409
+ `Put it back in service with \`primitive webhooks enable ${input.webhookId}\`, ` +
410
+ "or, for a function's trigger, re-push its config.",
411
+ ]);
412
+ }
413
+ if (delivery.status === 403) {
414
+ return refusalHeadline("The receive endpoint refused the delivery (403): this client's IP is " +
415
+ "not on the webhook's IP allowlist, so nothing ran.");
416
+ }
417
+ if (delivery.status === 401) {
418
+ return refusalHeadline("The receive endpoint rejected the delivery's signature (401), so " +
419
+ "nothing ran.", [eventsHint(input.webhookId)]);
420
+ }
421
+ if (delivery.duplicate) {
422
+ return refusalHeadline("The delivery was suppressed as a replay (duplicate): these signed " +
423
+ "bytes were delivered to this webhook before, so nothing ran.", preview.verificationScheme === "github"
424
+ ? [
425
+ "On the 'github' scheme dedup entries never expire, so this body " +
426
+ "can never be delivered to this webhook again — vary the payload.",
427
+ eventsHint(input.webhookId),
428
+ ]
429
+ : [eventsHint(input.webhookId)]);
430
+ }
431
+ // 5. Correlate. One rule, and it needs the preview's key: scheme `none`
432
+ // derives one only from a caller-supplied `X-Webhook-Event-Id`, so a
433
+ // `none` delivery is reported uncorrelated rather than guessed at.
434
+ const unconfirmed = (reason, details = []) => ({
435
+ ...resolved,
436
+ outcome: "unconfirmed",
437
+ headline: `The delivery was sent, but dispatch is unconfirmed: ${reason}`,
438
+ details: [...details, eventsHint(input.webhookId)],
439
+ });
440
+ const httpSummary = delivery.error
441
+ ? `the request was sent but no response was observed (${delivery.error})`
442
+ : `the receive endpoint answered ${delivery.status}`;
443
+ if (!preview.dedupKey) {
444
+ return unconfirmed(`the '${preview.verificationScheme}' scheme derives no dedup key, so ` +
445
+ `this delivery's event row cannot be identified — ${httpSummary}.`);
446
+ }
447
+ const { event, error: logError } = await pollForDeliveryEvent({
448
+ client,
449
+ appId: input.appId,
450
+ webhookId: input.webhookId,
451
+ dedupKey: preview.dedupKey,
452
+ baselineEventId,
453
+ attempts: deps.pollAttempts ?? DELIVER_POLL_ATTEMPTS,
454
+ intervalMs: deps.pollIntervalMs ?? DELIVER_POLL_INTERVAL_MS,
455
+ pageCap: deps.pageCap ?? DELIVER_PAGE_CAP,
456
+ pageLimit: deps.pageLimit ?? DELIVER_PAGE_LIMIT,
457
+ sleep,
458
+ });
459
+ if (!event) {
460
+ // The read itself failed — say that, rather than implying the receiver
461
+ // recorded nothing.
462
+ if (logError) {
463
+ return unconfirmed(`the delivery log could not be read (${logError}) — ${httpSummary}.`);
464
+ }
465
+ // The log was read and holds no row carrying this key. That is more than
466
+ // "not found": the receiver records the key ONLY on a delivery it accepted
467
+ // and dispatched, so this delivery was not dispatched — unless its row has
468
+ // yet to become visible, which is the one thing this cannot rule out.
469
+ return unconfirmed(`no dispatched-delivery row carrying this request's dedup key became ` +
470
+ `visible — ${httpSummary}.`, [
471
+ "The receiver records that key only on a delivery it accepted and " +
472
+ "dispatched, so this one was most likely short-circuited by a " +
473
+ "handshake rule, suppressed as a replay, or acknowledged without " +
474
+ "dispatch (a 202 with its reason). The delivery log names which.",
475
+ ]);
476
+ }
477
+ resolved.event = event;
478
+ // 6. Claim a dispatch only with a run behind it. A row carrying the key is
479
+ // an `accepted`, dispatched row by the receiver's own contract; the guard
480
+ // is here so a server that ever widened the key reads as unconfirmed
481
+ // rather than as a dispatch nobody checked.
482
+ if (event.status !== "accepted") {
483
+ const reason = event.rejectionReason || event.status || "no reason recorded";
484
+ return unconfirmed(`the correlated row (event ${event.eventId}) is recorded as ` +
485
+ `'${event.status}', not as a dispatched delivery: ${reason}.`);
486
+ }
487
+ const run = await confirmRun({
488
+ client,
489
+ appId: input.appId,
490
+ webhookId: input.webhookId,
491
+ functionId: preview.functionId,
492
+ event,
493
+ ...(deps.runPageCap !== undefined ? { runPageCap: deps.runPageCap } : {}),
494
+ ...(deps.runPageLimit !== undefined
495
+ ? { runPageLimit: deps.runPageLimit }
496
+ : {}),
497
+ });
498
+ resolved.run = run;
499
+ if (!run.confirmed) {
500
+ return {
501
+ ...resolved,
502
+ outcome: "unconfirmed",
503
+ headline: `The delivery was accepted (event ${event.eventId}), but dispatch is ` +
504
+ `unconfirmed: ${run.reason}.`,
505
+ details: [eventsHint(input.webhookId)],
506
+ };
507
+ }
508
+ const inspect = preview.functionId
509
+ ? `Inspect it with \`primitive functions runs ${preview.functionId}\`.`
510
+ : "Inspect it with `primitive workflows runs <workflow-id>`.";
511
+ return {
512
+ ...resolved,
513
+ outcome: "dispatched",
514
+ headline: `Delivered through the real webhook path. Event ${event.eventId} ` +
515
+ `dispatched; run ${run.runId} records the outcome.`,
516
+ details: [inspect],
517
+ };
518
+ }
519
+ //# sourceMappingURL=webhook-deliver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-deliver.js","sourceRoot":"","sources":["../../../src/lib/webhook-deliver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Shared "apply a TOML body to an existing workflow" helper.
3
+ *
4
+ * Extracted from the `config push` update-existing path (#1249, Fork 4) so that
5
+ * both `config push` and `workflows update --from-file` push a revised body the
6
+ * same way. A second inlined copy would regress #807: the update is
7
+ * ordering-sensitive and a naive metadata-then-body sequence rejects valid
8
+ * sync-callable edits.
9
+ *
10
+ * Ordering invariant (#807 / codex review, revised by #2743). `syncCallable` is
11
+ * sequenced BY TARGET VALUE, because the two directions have opposite
12
+ * constraints:
13
+ * 1. metadata PATCH — carries `syncCallable: false` when the target is false
14
+ * (the TOML omits the key or sets it to `false`), and NOTHING when the
15
+ * target is true. Enabling here would be validated against the workflow's
16
+ * CURRENTLY-active server steps (`loadCurrentActiveSteps`,
17
+ * src/admin-api.ts), not the steps being pushed in the same call, so it
18
+ * would be rejected on the stale list. Disabling has no such check — the
19
+ * server re-validates steps only when flipping TO true — and it must
20
+ * happen here, because the step-write endpoints
21
+ * (`updateWorkflowDraft` / `updateWorkflowConfig`) reject
22
+ * sync-incompatible steps while the STORED flag is still true. Clearing
23
+ * the flag first is what lets a single push both drop `syncCallable` and
24
+ * introduce an incompatible step.
25
+ * 2. body write — steps to the active config (config-model) or the legacy
26
+ * draft slot (no active config).
27
+ * 3. a SECOND `syncCallable` PATCH, for ENABLING only — issued AFTER the new
28
+ * steps are active, so it validates against the new (compatible) steps.
29
+ * Skipped when the first PATCH's response already reports the flag on;
30
+ * sent unconditionally when that response is unreadable (fail closed
31
+ * toward convergence).
32
+ *
33
+ * #2743 also removed the "only send it when the TOML carries the key"
34
+ * no-clobber rule: the file fully describes the workflow, so deleting
35
+ * `syncCallable = true` from it disables the flag in one push.
36
+ */
37
+ import type { ApiClient } from "./api-client.js";
38
+ import { safeJsonParse } from "./workflow-payload.js";
39
+ export { safeJsonParse };
40
+ export interface ApplyWorkflowBodyOptions {
41
+ /** Optimistic-concurrency guard for the metadata + syncCallable PATCHes. */
42
+ expectedModifiedAt?: string;
43
+ /**
44
+ * Active config to overwrite in place (config-model workflows). When absent,
45
+ * the body falls back to the legacy draft slot — non-live for config-model
46
+ * workflows, which the server rejects with 409 WORKFLOW_CONFIG_MODEL.
47
+ */
48
+ activeConfigId?: string;
49
+ /** When true, skip the optimistic-concurrency check (mirrors `--force`). */
50
+ force?: boolean;
51
+ }
52
+ /** The slot label a body gets when the workflow has no active config. */
53
+ export declare const LEGACY_DRAFT_SLOT_LABEL = "draft (legacy)";
54
+ /** What the push knows about the workflow once every write has landed. */
55
+ export interface LegacyDraftSlotState {
56
+ /** The workflow's active configuration once the push finished, if any. */
57
+ activeConfigId?: string | null;
58
+ /**
59
+ * Whether THIS push activated that configuration — the TOML carried a
60
+ * sidecar plus `activeConfigName`, so the authored body is what runs now.
61
+ */
62
+ activatedByPush?: boolean;
63
+ /** The workflow's latest legacy revision, when it has one. */
64
+ latestRevision?: string | null;
65
+ }
66
+ /**
67
+ * The warning a push owes the user when its body landed in the legacy draft
68
+ * slot and is NOT what the workflow runs (#2768).
69
+ *
70
+ * `workflows publish`, the one thing that promoted that slot, is gone, so those
71
+ * steps sit there unread — a silent no-op otherwise, since the push reports
72
+ * success either way.
73
+ *
74
+ * Reading a workflow is not neutral, which is why this takes more than an
75
+ * active config id. `getAppWorkflow` (src/admin-api.ts) auto-migrates a
76
+ * workflow that has NO configurations: it copies the latest revision — or, only
77
+ * when there is none, the draft slot — into a configuration and activates it.
78
+ * `applyWorkflowBody` reads the workflow immediately after writing the draft,
79
+ * so a legacy workflow WITH a published revision comes back carrying a
80
+ * brand-new `activeConfigId` holding the OLD body. Keyed on that id alone, the
81
+ * warning stayed silent for exactly the population it exists for. So:
82
+ *
83
+ * - the push activated a configuration itself (sidecar + `activeConfigName`):
84
+ * silent — that push IS the migration;
85
+ * - an active configuration and no revision behind it: silent — the server
86
+ * adopted the draft this push just wrote, and it is live;
87
+ * - an active configuration with a revision behind it: warn — that revision is
88
+ * what runs, not the pushed steps;
89
+ * - no active configuration at all: warn, and name the TOML migration.
90
+ *
91
+ * Exported for testability — the end-to-end path needs a workflow that can no
92
+ * longer be created through the API.
93
+ */
94
+ export declare function legacyDraftSlotWarning(updateSlotLabel: string, state: LegacyDraftSlotState): string | null;
95
+ export interface ApplyWorkflowBodyResult {
96
+ /** The freshest workflow `modifiedAt` after all PATCHes (for sync state). */
97
+ latestModifiedAt?: string;
98
+ /** Which slot the steps landed in: "active config" or "draft (legacy)". */
99
+ updateSlotLabel: string;
100
+ /** A fresh `getWorkflow` result so callers can read back configs/state. */
101
+ fullWorkflow: any;
102
+ }
103
+ /**
104
+ * Apply a parsed workflow body (metadata + steps) to an existing workflow,
105
+ * preserving the key/id. `workflow` is the TOML's `[workflow]` table (already
106
+ * merged with any explicit CLI flag overrides by the caller); `steps` is the
107
+ * TOML's `steps` array. The function performs the three-step ordered update
108
+ * and returns the latest `modifiedAt`, the slot label, and a fresh workflow.
109
+ */
110
+ export declare function applyWorkflowBody(client: ApiClient, appId: string, workflowId: string, workflow: any, steps: any[], opts?: ApplyWorkflowBodyOptions): Promise<ApplyWorkflowBodyResult>;