primitive-admin 1.1.0-alpha.8 → 1.1.0-alpha.80

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 (522) hide show
  1. package/README.md +444 -106
  2. package/assets/skill/skills/primitive-platform/SKILL.md +811 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +373 -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 +128 -19
  8. package/dist/src/commands/admins.js.map +1 -1
  9. package/dist/src/commands/analytics.d.ts +2 -0
  10. package/dist/src/commands/analytics.js +700 -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 +54 -96
  14. package/dist/src/commands/apps.js.map +1 -1
  15. package/dist/src/commands/auth.d.ts +2 -0
  16. package/dist/src/commands/auth.js +196 -105
  17. package/dist/src/commands/auth.js.map +1 -1
  18. package/dist/src/commands/blob-buckets.d.ts +2 -0
  19. package/dist/src/commands/blob-buckets.js +330 -0
  20. package/dist/src/commands/blob-buckets.js.map +1 -0
  21. package/dist/src/commands/catalog.d.ts +2 -0
  22. package/dist/src/commands/catalog.js +37 -38
  23. package/dist/src/commands/catalog.js.map +1 -1
  24. package/dist/src/commands/collection-type-configs.d.ts +2 -0
  25. package/dist/src/commands/collection-type-configs.js +84 -0
  26. package/dist/src/commands/collection-type-configs.js.map +1 -0
  27. package/dist/src/commands/collections.d.ts +2 -0
  28. package/dist/src/commands/collections.js +565 -0
  29. package/dist/src/commands/collections.js.map +1 -0
  30. package/dist/src/commands/comparisons.d.ts +2 -0
  31. package/dist/src/commands/comparisons.js +6 -6
  32. package/dist/src/commands/comparisons.js.map +1 -1
  33. package/dist/src/commands/config.d.ts +46 -0
  34. package/dist/src/commands/config.js +465 -0
  35. package/dist/src/commands/config.js.map +1 -0
  36. package/dist/src/commands/connections.d.ts +2 -0
  37. package/dist/src/commands/connections.js +100 -0
  38. package/dist/src/commands/connections.js.map +1 -0
  39. package/dist/src/commands/cron-triggers.d.ts +2 -0
  40. package/dist/src/commands/cron-triggers.js +265 -0
  41. package/dist/src/commands/cron-triggers.js.map +1 -0
  42. package/dist/src/commands/database-type-configs.d.ts +2 -0
  43. package/dist/src/commands/database-type-configs.js +163 -0
  44. package/dist/src/commands/database-type-configs.js.map +1 -0
  45. package/dist/src/commands/database-types.d.ts +2 -0
  46. package/dist/src/commands/database-types.js +171 -0
  47. package/dist/src/commands/database-types.js.map +1 -0
  48. package/dist/src/commands/databases.d.ts +65 -0
  49. package/dist/src/commands/databases.js +1859 -238
  50. package/dist/src/commands/databases.js.map +1 -1
  51. package/dist/src/commands/documents.d.ts +2 -0
  52. package/dist/src/commands/documents.js +2062 -19
  53. package/dist/src/commands/documents.js.map +1 -1
  54. package/dist/src/commands/email-templates.d.ts +2 -0
  55. package/dist/src/commands/email-templates.js +174 -0
  56. package/dist/src/commands/email-templates.js.map +1 -0
  57. package/dist/src/commands/env.d.ts +23 -0
  58. package/dist/src/commands/env.js +385 -0
  59. package/dist/src/commands/env.js.map +1 -0
  60. package/dist/src/commands/feature-flags.d.ts +14 -0
  61. package/dist/src/commands/feature-flags.js +116 -0
  62. package/dist/src/commands/feature-flags.js.map +1 -0
  63. package/dist/src/commands/functions.d.ts +20 -0
  64. package/dist/src/commands/functions.js +672 -0
  65. package/dist/src/commands/functions.js.map +1 -0
  66. package/dist/src/commands/group-type-configs.d.ts +2 -0
  67. package/dist/src/commands/group-type-configs.js +86 -0
  68. package/dist/src/commands/group-type-configs.js.map +1 -0
  69. package/dist/src/commands/groups.d.ts +2 -0
  70. package/dist/src/commands/groups.js +39 -108
  71. package/dist/src/commands/groups.js.map +1 -1
  72. package/dist/src/commands/guides.d.ts +223 -0
  73. package/dist/src/commands/guides.js +617 -65
  74. package/dist/src/commands/guides.js.map +1 -1
  75. package/dist/src/commands/init.d.ts +37 -0
  76. package/dist/src/commands/init.js +1693 -208
  77. package/dist/src/commands/init.js.map +1 -1
  78. package/dist/src/commands/integrations.d.ts +2 -0
  79. package/dist/src/commands/integrations.js +402 -182
  80. package/dist/src/commands/integrations.js.map +1 -1
  81. package/dist/src/commands/llm.d.ts +2 -0
  82. package/dist/src/commands/llm.js +13 -8
  83. package/dist/src/commands/llm.js.map +1 -1
  84. package/dist/src/commands/locks.d.ts +8 -0
  85. package/dist/src/commands/locks.js +160 -0
  86. package/dist/src/commands/locks.js.map +1 -0
  87. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  88. package/dist/src/commands/metadata-category-configs.js +112 -0
  89. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  90. package/dist/src/commands/metadata.d.ts +2 -0
  91. package/dist/src/commands/metadata.js +281 -0
  92. package/dist/src/commands/metadata.js.map +1 -0
  93. package/dist/src/commands/prompts.d.ts +2 -0
  94. package/dist/src/commands/prompts.js +275 -621
  95. package/dist/src/commands/prompts.js.map +1 -1
  96. package/dist/src/commands/rule-sets.d.ts +3 -0
  97. package/dist/src/commands/rule-sets.js +137 -147
  98. package/dist/src/commands/rule-sets.js.map +1 -1
  99. package/dist/src/commands/scripts.d.ts +30 -0
  100. package/dist/src/commands/scripts.js +679 -0
  101. package/dist/src/commands/scripts.js.map +1 -0
  102. package/dist/src/commands/secrets.d.ts +2 -0
  103. package/dist/src/commands/secrets.js +108 -0
  104. package/dist/src/commands/secrets.js.map +1 -0
  105. package/dist/src/commands/sessions.d.ts +2 -0
  106. package/dist/src/commands/sessions.js +75 -0
  107. package/dist/src/commands/sessions.js.map +1 -0
  108. package/dist/src/commands/settings.d.ts +18 -0
  109. package/dist/src/commands/settings.js +54 -0
  110. package/dist/src/commands/settings.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 +2514 -0
  118. package/dist/src/commands/sync.js +16106 -848
  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 +130 -21
  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 +532 -23
  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 +96 -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 +10 -10
  131. package/dist/src/commands/waitlist.js.map +1 -1
  132. package/dist/src/commands/webhooks.d.ts +2 -0
  133. package/dist/src/commands/webhooks.js +562 -0
  134. package/dist/src/commands/webhooks.js.map +1 -0
  135. package/dist/src/commands/workflows.d.ts +116 -0
  136. package/dist/src/commands/workflows.js +1638 -729
  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 +2147 -0
  142. package/dist/src/lib/api-client.js +2042 -160
  143. package/dist/src/lib/api-client.js.map +1 -1
  144. package/dist/src/lib/app-match-guard.d.ts +44 -0
  145. package/dist/src/lib/app-match-guard.js +72 -0
  146. package/dist/src/lib/app-match-guard.js.map +1 -0
  147. package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
  148. package/dist/src/lib/app-settings-descriptor.js +584 -0
  149. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  150. package/dist/src/lib/auth-flow.d.ts +8 -0
  151. package/dist/src/lib/batch.d.ts +26 -0
  152. package/dist/src/lib/batch.js +32 -0
  153. package/dist/src/lib/batch.js.map +1 -0
  154. package/dist/src/lib/block-layout.d.ts +160 -0
  155. package/dist/src/lib/block-layout.js +451 -0
  156. package/dist/src/lib/block-layout.js.map +1 -0
  157. package/dist/src/lib/block-selector.d.ts +58 -0
  158. package/dist/src/lib/block-selector.js +92 -0
  159. package/dist/src/lib/block-selector.js.map +1 -0
  160. package/dist/src/lib/canonical-json.d.ts +12 -0
  161. package/dist/src/lib/canonical-json.js +35 -0
  162. package/dist/src/lib/canonical-json.js.map +1 -0
  163. package/dist/src/lib/channel.d.ts +30 -0
  164. package/dist/src/lib/channel.js +68 -0
  165. package/dist/src/lib/channel.js.map +1 -0
  166. package/dist/src/lib/cli-manifest.d.ts +68 -0
  167. package/dist/src/lib/cli-manifest.js +71 -0
  168. package/dist/src/lib/cli-manifest.js.map +1 -0
  169. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
  170. package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
  171. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  172. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  173. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  174. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  175. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +38 -0
  176. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +46 -0
  177. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.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 +696 -0
  183. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  184. package/dist/src/lib/config-payload.d.ts +85 -0
  185. package/dist/src/lib/config-payload.js +116 -0
  186. package/dist/src/lib/config-payload.js.map +1 -0
  187. package/dist/src/lib/config-surface.d.ts +140 -0
  188. package/dist/src/lib/config-surface.js +317 -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 +517 -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/document-export-permissions.d.ts +30 -0
  236. package/dist/src/lib/document-export-permissions.js +54 -0
  237. package/dist/src/lib/document-export-permissions.js.map +1 -0
  238. package/dist/src/lib/env-resolver-core.d.ts +253 -0
  239. package/dist/src/lib/env-resolver-core.js +459 -0
  240. package/dist/src/lib/env-resolver-core.js.map +1 -0
  241. package/dist/src/lib/env-resolver.d.ts +99 -0
  242. package/dist/src/lib/env-resolver.js +153 -0
  243. package/dist/src/lib/env-resolver.js.map +1 -0
  244. package/dist/src/lib/fetch.d.ts +5 -0
  245. package/dist/src/lib/function-bundle.d.ts +141 -0
  246. package/dist/src/lib/function-bundle.js +333 -0
  247. package/dist/src/lib/function-bundle.js.map +1 -0
  248. package/dist/src/lib/function-collect.d.ts +123 -0
  249. package/dist/src/lib/function-collect.js +594 -0
  250. package/dist/src/lib/function-collect.js.map +1 -0
  251. package/dist/src/lib/function-db-types.d.ts +187 -0
  252. package/dist/src/lib/function-db-types.js +782 -0
  253. package/dist/src/lib/function-db-types.js.map +1 -0
  254. package/dist/src/lib/function-document-types.d.ts +50 -0
  255. package/dist/src/lib/function-document-types.js +163 -0
  256. package/dist/src/lib/function-document-types.js.map +1 -0
  257. package/dist/src/lib/function-grants-preflight.d.ts +64 -0
  258. package/dist/src/lib/function-grants-preflight.js +100 -0
  259. package/dist/src/lib/function-grants-preflight.js.map +1 -0
  260. package/dist/src/lib/function-log-tail.d.ts +83 -0
  261. package/dist/src/lib/function-log-tail.js +115 -0
  262. package/dist/src/lib/function-log-tail.js.map +1 -0
  263. package/dist/src/lib/function-schema-codegen.d.ts +118 -0
  264. package/dist/src/lib/function-schema-codegen.js +402 -0
  265. package/dist/src/lib/function-schema-codegen.js.map +1 -0
  266. package/dist/src/lib/function-sync.d.ts +263 -0
  267. package/dist/src/lib/function-sync.js +604 -0
  268. package/dist/src/lib/function-sync.js.map +1 -0
  269. package/dist/src/lib/function-triggers.d.ts +66 -0
  270. package/dist/src/lib/function-triggers.js +285 -0
  271. package/dist/src/lib/function-triggers.js.map +1 -0
  272. package/dist/src/lib/function-typecheck.d.ts +86 -0
  273. package/dist/src/lib/function-typecheck.js +370 -0
  274. package/dist/src/lib/function-typecheck.js.map +1 -0
  275. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  276. package/dist/src/lib/generated-allowlist.js +281 -0
  277. package/dist/src/lib/generated-allowlist.js.map +1 -0
  278. package/dist/src/lib/generated-config-surfaces.d.ts +1445 -0
  279. package/dist/src/lib/generated-config-surfaces.js +5836 -0
  280. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  281. package/dist/src/lib/generated-sdk-types.d.ts +12 -0
  282. package/dist/src/lib/generated-sdk-types.js +13 -0
  283. package/dist/src/lib/generated-sdk-types.js.map +1 -0
  284. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  285. package/dist/src/lib/generated-template-lint.js +624 -0
  286. package/dist/src/lib/generated-template-lint.js.map +1 -0
  287. package/dist/src/lib/generated-workflow-model-fields.d.ts +20 -0
  288. package/dist/src/lib/generated-workflow-model-fields.js +53 -0
  289. package/dist/src/lib/generated-workflow-model-fields.js.map +1 -0
  290. package/dist/src/lib/google-client-secret-status.d.ts +35 -0
  291. package/dist/src/lib/google-client-secret-status.js +56 -0
  292. package/dist/src/lib/google-client-secret-status.js.map +1 -0
  293. package/dist/src/lib/init-adopt.d.ts +16 -0
  294. package/dist/src/lib/init-adopt.js +34 -0
  295. package/dist/src/lib/init-adopt.js.map +1 -0
  296. package/dist/src/lib/init-assets.d.ts +39 -0
  297. package/dist/src/lib/init-assets.js +97 -0
  298. package/dist/src/lib/init-assets.js.map +1 -0
  299. package/dist/src/lib/init-client-platforms.d.ts +14 -0
  300. package/dist/src/lib/init-client-platforms.js +71 -0
  301. package/dist/src/lib/init-client-platforms.js.map +1 -0
  302. package/dist/src/lib/init-config.d.ts +98 -0
  303. package/dist/src/lib/init-config.js +186 -0
  304. package/dist/src/lib/init-config.js.map +1 -0
  305. package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
  306. package/dist/src/lib/init-email-redirect-uris.js +46 -0
  307. package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
  308. package/dist/src/lib/init-ios-links.d.ts +91 -0
  309. package/dist/src/lib/init-ios-links.js +219 -0
  310. package/dist/src/lib/init-ios-links.js.map +1 -0
  311. package/dist/src/lib/init-plan.d.ts +80 -0
  312. package/dist/src/lib/init-plan.js +95 -0
  313. package/dist/src/lib/init-plan.js.map +1 -0
  314. package/dist/src/lib/init-production-env.d.ts +48 -0
  315. package/dist/src/lib/init-production-env.js +59 -0
  316. package/dist/src/lib/init-production-env.js.map +1 -0
  317. package/dist/src/lib/init-schema.d.ts +74 -0
  318. package/dist/src/lib/init-schema.js +358 -0
  319. package/dist/src/lib/init-schema.js.map +1 -0
  320. package/dist/src/lib/init-xcode.d.ts +34 -0
  321. package/dist/src/lib/init-xcode.js +138 -0
  322. package/dist/src/lib/init-xcode.js.map +1 -0
  323. package/dist/src/lib/integration-request-config.d.ts +30 -0
  324. package/dist/src/lib/integration-request-config.js +145 -0
  325. package/dist/src/lib/integration-request-config.js.map +1 -0
  326. package/dist/src/lib/integration-selector.d.ts +42 -0
  327. package/dist/src/lib/integration-selector.js +46 -0
  328. package/dist/src/lib/integration-selector.js.map +1 -0
  329. package/dist/src/lib/ios-app-id.d.ts +34 -0
  330. package/dist/src/lib/ios-app-id.js +69 -0
  331. package/dist/src/lib/ios-app-id.js.map +1 -0
  332. package/dist/src/lib/local-state.d.ts +55 -0
  333. package/dist/src/lib/local-state.js +167 -0
  334. package/dist/src/lib/local-state.js.map +1 -0
  335. package/dist/src/lib/local-test-cases.d.ts +63 -0
  336. package/dist/src/lib/local-test-cases.js +136 -0
  337. package/dist/src/lib/local-test-cases.js.map +1 -0
  338. package/dist/src/lib/log-inspection.d.ts +680 -0
  339. package/dist/src/lib/log-inspection.js +784 -0
  340. package/dist/src/lib/log-inspection.js.map +1 -0
  341. package/dist/src/lib/migration-nag.d.ts +49 -0
  342. package/dist/src/lib/migration-nag.js +164 -0
  343. package/dist/src/lib/migration-nag.js.map +1 -0
  344. package/dist/src/lib/object-status-filter.d.ts +22 -0
  345. package/dist/src/lib/object-status-filter.js +45 -0
  346. package/dist/src/lib/object-status-filter.js.map +1 -0
  347. package/dist/src/lib/output.d.ts +109 -0
  348. package/dist/src/lib/output.js +191 -8
  349. package/dist/src/lib/output.js.map +1 -1
  350. package/dist/src/lib/package-manager.d.ts +140 -0
  351. package/dist/src/lib/package-manager.js +305 -0
  352. package/dist/src/lib/package-manager.js.map +1 -0
  353. package/dist/src/lib/paginate.d.ts +83 -0
  354. package/dist/src/lib/paginate.js +95 -0
  355. package/dist/src/lib/paginate.js.map +1 -0
  356. package/dist/src/lib/platform-owned.d.ts +63 -0
  357. package/dist/src/lib/platform-owned.js +85 -0
  358. package/dist/src/lib/platform-owned.js.map +1 -0
  359. package/dist/src/lib/project-config.d.ts +122 -0
  360. package/dist/src/lib/project-config.js +244 -0
  361. package/dist/src/lib/project-config.js.map +1 -0
  362. package/dist/src/lib/query-operators.d.ts +43 -0
  363. package/dist/src/lib/query-operators.js +80 -0
  364. package/dist/src/lib/query-operators.js.map +1 -0
  365. package/dist/src/lib/record-filter.d.ts +18 -0
  366. package/dist/src/lib/record-filter.js +55 -0
  367. package/dist/src/lib/record-filter.js.map +1 -0
  368. package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
  369. package/dist/src/lib/refresh-admin-credentials.js +103 -0
  370. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  371. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  372. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  373. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  374. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  375. package/dist/src/lib/resolve-init-server.js +77 -0
  376. package/dist/src/lib/resolve-init-server.js.map +1 -0
  377. package/dist/src/lib/resolve-platform.d.ts +74 -0
  378. package/dist/src/lib/resolve-platform.js +105 -0
  379. package/dist/src/lib/resolve-platform.js.map +1 -0
  380. package/dist/src/lib/run-status.d.ts +19 -0
  381. package/dist/src/lib/run-status.generated.d.ts +39 -0
  382. package/dist/src/lib/run-status.generated.js +66 -0
  383. package/dist/src/lib/run-status.generated.js.map +1 -0
  384. package/dist/src/lib/run-status.js +19 -0
  385. package/dist/src/lib/run-status.js.map +1 -0
  386. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  387. package/dist/src/lib/server-text-normalization.js +90 -0
  388. package/dist/src/lib/server-text-normalization.js.map +1 -0
  389. package/dist/src/lib/server-url.d.ts +22 -0
  390. package/dist/src/lib/server-url.js +33 -0
  391. package/dist/src/lib/server-url.js.map +1 -0
  392. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  393. package/dist/src/lib/signing-secret-status.js +116 -0
  394. package/dist/src/lib/signing-secret-status.js.map +1 -0
  395. package/dist/src/lib/skill-installer.d.ts +25 -0
  396. package/dist/src/lib/skill-installer.js +266 -0
  397. package/dist/src/lib/skill-installer.js.map +1 -0
  398. package/dist/src/lib/snapshots.d.ts +98 -0
  399. package/dist/src/lib/snapshots.js +294 -0
  400. package/dist/src/lib/snapshots.js.map +1 -0
  401. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
  402. package/dist/src/lib/swift-codegen/dbGenerator.js +914 -0
  403. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  404. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  405. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  406. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  407. package/dist/src/lib/swift-codegen/generator.d.ts +94 -0
  408. package/dist/src/lib/swift-codegen/generator.js +440 -0
  409. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  410. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
  411. package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
  412. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  413. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
  414. package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
  415. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  416. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  417. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  418. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  419. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  420. package/dist/src/lib/sync-dir-selector.js +30 -0
  421. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  422. package/dist/src/lib/sync-paths.d.ts +123 -0
  423. package/dist/src/lib/sync-paths.js +193 -0
  424. package/dist/src/lib/sync-paths.js.map +1 -0
  425. package/dist/src/lib/sync-resource-types.d.ts +563 -0
  426. package/dist/src/lib/sync-resource-types.js +1073 -0
  427. package/dist/src/lib/sync-resource-types.js.map +1 -0
  428. package/dist/src/lib/sync-selectors.d.ts +95 -0
  429. package/dist/src/lib/sync-selectors.js +228 -0
  430. package/dist/src/lib/sync-selectors.js.map +1 -0
  431. package/dist/src/lib/template.d.ts +170 -0
  432. package/dist/src/lib/template.js +484 -68
  433. package/dist/src/lib/template.js.map +1 -1
  434. package/dist/src/lib/test-case-file-names.d.ts +40 -0
  435. package/dist/src/lib/test-case-file-names.js +91 -0
  436. package/dist/src/lib/test-case-file-names.js.map +1 -0
  437. package/dist/src/lib/test-case-keys.d.ts +29 -0
  438. package/dist/src/lib/test-case-keys.js +55 -0
  439. package/dist/src/lib/test-case-keys.js.map +1 -0
  440. package/dist/src/lib/test-case-variables.d.ts +29 -0
  441. package/dist/src/lib/test-case-variables.js +71 -0
  442. package/dist/src/lib/test-case-variables.js.map +1 -0
  443. package/dist/src/lib/token-inject.d.ts +56 -0
  444. package/dist/src/lib/token-inject.js +204 -0
  445. package/dist/src/lib/token-inject.js.map +1 -0
  446. package/dist/src/lib/toml-database-config.d.ts +123 -0
  447. package/dist/src/lib/toml-database-config.js +544 -0
  448. package/dist/src/lib/toml-database-config.js.map +1 -0
  449. package/dist/src/lib/toml-metadata-config.d.ts +151 -0
  450. package/dist/src/lib/toml-metadata-config.js +476 -0
  451. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  452. package/dist/src/lib/toml-native-form.d.ts +46 -0
  453. package/dist/src/lib/toml-native-form.js +78 -0
  454. package/dist/src/lib/toml-native-form.js.map +1 -0
  455. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  456. package/dist/src/lib/toml-params-validator.js +298 -0
  457. package/dist/src/lib/toml-params-validator.js.map +1 -0
  458. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  459. package/dist/src/lib/toml-scalar-edit.js +283 -0
  460. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  461. package/dist/src/lib/user-selector.d.ts +24 -0
  462. package/dist/src/lib/user-selector.js +33 -0
  463. package/dist/src/lib/user-selector.js.map +1 -0
  464. package/dist/src/lib/version-check.d.ts +35 -0
  465. package/dist/src/lib/version-check.js +241 -0
  466. package/dist/src/lib/version-check.js.map +1 -0
  467. package/dist/src/lib/watch.d.ts +121 -0
  468. package/dist/src/lib/watch.js +169 -0
  469. package/dist/src/lib/watch.js.map +1 -0
  470. package/dist/src/lib/web-url.d.ts +40 -0
  471. package/dist/src/lib/web-url.js +76 -0
  472. package/dist/src/lib/web-url.js.map +1 -0
  473. package/dist/src/lib/workflow-apply.d.ts +110 -0
  474. package/dist/src/lib/workflow-apply.js +164 -0
  475. package/dist/src/lib/workflow-apply.js.map +1 -0
  476. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  477. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  478. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  479. package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
  480. package/dist/src/lib/workflow-codegen/generator.js +361 -0
  481. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  482. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
  483. package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
  484. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  485. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  486. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  487. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  488. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
  489. package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
  490. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  491. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  492. package/dist/src/lib/workflow-config-apply.js +137 -0
  493. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  494. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  495. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  496. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  497. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  498. package/dist/src/lib/workflow-defaults.js +41 -0
  499. package/dist/src/lib/workflow-defaults.js.map +1 -0
  500. package/dist/src/lib/workflow-field-descriptor.d.ts +91 -0
  501. package/dist/src/lib/workflow-field-descriptor.js +153 -0
  502. package/dist/src/lib/workflow-field-descriptor.js.map +1 -0
  503. package/dist/src/lib/workflow-fragments.d.ts +64 -0
  504. package/dist/src/lib/workflow-fragments.js +342 -0
  505. package/dist/src/lib/workflow-fragments.js.map +1 -0
  506. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  507. package/dist/src/lib/workflow-include-preserve.js +286 -0
  508. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  509. package/dist/src/lib/workflow-payload.d.ts +98 -0
  510. package/dist/src/lib/workflow-payload.js +178 -0
  511. package/dist/src/lib/workflow-payload.js.map +1 -0
  512. package/dist/src/lib/workflow-toml-validator.d.ts +207 -0
  513. package/dist/src/lib/workflow-toml-validator.js +762 -0
  514. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  515. package/dist/src/lib/workflow-usage.d.ts +198 -0
  516. package/dist/src/lib/workflow-usage.js +312 -0
  517. package/dist/src/lib/workflow-usage.js.map +1 -0
  518. package/dist/src/types/index.d.ts +591 -0
  519. package/dist/src/validators.d.ts +65 -0
  520. package/dist/src/validators.js +64 -0
  521. package/dist/src/validators.js.map +1 -0
  522. package/package.json +34 -9
@@ -0,0 +1,672 @@
1
+ /**
2
+ * `primitive functions` — server functions' read and operational verbs
3
+ * (#3179, project `server-functions`).
4
+ *
5
+ * A server function is the SIXTH status-carrying type (`docs/cli-design.md`,
6
+ * §Object availability): it exposes a public endpoint, so it carries
7
+ * `active | inactive | archived`, the `enable`/`disable` pair, and the
8
+ * `archive` spelling of the delete flow. It carries no `create`, `update` or
9
+ * `delete` verb — the function is authored in `functions/<key>.toml` beside the
10
+ * TypeScript its `entry` names, applied with `config push`, and prune-by-push
11
+ * stays the only CLI hard-delete path.
12
+ *
13
+ * The rule worth stating loudly here, because a function IS code on a public
14
+ * endpoint: a `config push` to a DISABLED function updates the code and leaves
15
+ * it out of service. `status` has one writer pair and push is not one of them
16
+ * (#2803's resurrection guard) — otherwise shipping a fix would silently put
17
+ * an endpoint an operator had taken down back in service.
18
+ */
19
+ import { existsSync } from "fs";
20
+ import { join } from "path";
21
+ import { ApiClient } from "../lib/api-client.js";
22
+ import { resolveAppId } from "../lib/config.js";
23
+ import { resolveSyncDir } from "../lib/sync-paths.js";
24
+ import { activeVersionMode } from "../lib/function-sync.js";
25
+ import { FunctionSchemaCodegenError } from "../lib/function-schema-codegen.js";
26
+ import { functionTypeWiringProblems, staleFunctionTypeArtifacts, writeFunctionTypeArtifacts, } from "../lib/function-db-types.js";
27
+ import { success, error, info, warn, keyValue, result as printResult, formatTable, formatDate, formatStatus, json, jsonLine, divider, } from "../lib/output.js";
28
+ import { confirmPrompt } from "../lib/confirm-prompt.js";
29
+ import { parseStatusFilter } from "../lib/object-status-filter.js";
30
+ import { followLoop } from "../lib/watch.js";
31
+ import { buildLogFollowSource } from "../lib/function-log-tail.js";
32
+ import { toFunctionLogInspectionRow } from "../lib/log-inspection.js";
33
+ /**
34
+ * How far back one `--follow` tick will page to meet its high-water mark.
35
+ *
36
+ * A bound on one CALL rather than "until you get there": the listing is
37
+ * newest-first, so an unbounded walk on a busy function would page through a
38
+ * whole window of history in one go. Ten pages at the default limit is 250
39
+ * invocations between polls — comfortably past what two seconds of an admitted
40
+ * caller can record. A tail that does fall behind carries its walk into the
41
+ * next call rather than skipping the gap (CR3287-017): the rows between the
42
+ * mark and now are all printed, in order, a bounded number of pages at a time.
43
+ */
44
+ const FOLLOW_MAX_PAGES_PER_TICK = 10;
45
+ /**
46
+ * One invocation, as a human reads it in the table — #3287.
47
+ *
48
+ * The FIRST error line only: a stack is eight kilobytes and a table row is
49
+ * one line, so the row says what happened and `--json` carries the rest.
50
+ */
51
+ function firstErrorLine(row) {
52
+ const message = String(row?.errorMessage ?? "").trim();
53
+ if (message)
54
+ return message.split("\n")[0];
55
+ const stderr = Array.isArray(row?.stderr) ? row.stderr : [];
56
+ return stderr.length > 0 ? String(stderr[0].line ?? "") : "";
57
+ }
58
+ /** The same row, for the follow tail's one-line-per-invocation output. */
59
+ function logRow(row) {
60
+ const when = row?.startedAt ? String(row.startedAt) : "";
61
+ const code = row?.errorCode ? ` ${row.errorCode}` : "";
62
+ const detail = firstErrorLine(row);
63
+ return `${when} ${row?.status ?? ""} ${row?.trigger?.kind ?? ""} ${row?.runId || row?.invocationId || ""}${code}${detail ? ` ${detail}` : ""}`;
64
+ }
65
+ export function registerFunctionsCommands(program) {
66
+ const functions = program
67
+ .command("functions")
68
+ .description("Inspect and operate server functions")
69
+ .addHelpText("after", `
70
+ Examples:
71
+ $ primitive config create function greet # then edit functions/greet.toml and: primitive config push
72
+ $ primitive functions list
73
+ $ primitive functions get 01HXY...
74
+ $ primitive functions disable 01HXY... # out of service; pushes still land
75
+ $ primitive functions archive 01HXY... # retire it (soft delete)
76
+ `);
77
+ // Configuration is authored in TOML and applied with `config push` (#2645):
78
+ // this group carries no config-setting flags, and the code the function runs
79
+ // is the TypeScript beside its file rather than anything a verb can send.
80
+ functions.addHelpText("after", `
81
+ Configuration lives in functions/<key>.toml, and the code beside it:
82
+ $ primitive config fields function # the file's keys, types and defaults
83
+ $ primitive config create function <key> # scaffold one locally
84
+ $ primitive config set function/<key> <path>=<value>
85
+ $ primitive config push --only function/<key>
86
+ `);
87
+ functions
88
+ .command("list")
89
+ .description("List server functions")
90
+ .argument("[app-id]", "App ID (uses current app if not specified)")
91
+ .option("--app <app-id>", "App ID")
92
+ .option("--status <status>", "Filter by status: active, inactive, archived")
93
+ .option("--json", "Output as JSON")
94
+ .action(async (appId, options) => {
95
+ const resolvedAppId = resolveAppId(appId, options);
96
+ const client = new ApiClient();
97
+ try {
98
+ const status = parseStatusFilter("functions", options.status, [
99
+ "active",
100
+ "inactive",
101
+ "archived",
102
+ ]);
103
+ // The admin listing drains `functionsByApp` server-side, so there is no
104
+ // cursor to follow and the filter is applied here.
105
+ const { items } = await client.listFunctions(resolvedAppId);
106
+ const filtered = status
107
+ ? (items || []).filter((f) => String(f.status ?? "active") === status)
108
+ : items || [];
109
+ if (options.json) {
110
+ json(filtered);
111
+ return;
112
+ }
113
+ if (filtered.length === 0) {
114
+ info("No functions found.");
115
+ return;
116
+ }
117
+ console.log(formatTable(filtered, [
118
+ { header: "KEY", key: "functionKey" },
119
+ { header: "ID", key: "functionId" },
120
+ { header: "STATUS", key: "status", format: formatStatus },
121
+ { header: "MODIFIED", key: "modifiedAt", format: formatDate },
122
+ ]));
123
+ }
124
+ catch (err) {
125
+ error(err.message);
126
+ process.exit(1);
127
+ }
128
+ });
129
+ functions
130
+ .command("get")
131
+ .description("Get a server function, and the version it currently runs")
132
+ .argument("<function-id>", "Function ID")
133
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
134
+ .option("--json", "Output as JSON")
135
+ .action(async (functionId, options) => {
136
+ const resolvedAppId = resolveAppId(undefined, options);
137
+ const client = new ApiClient();
138
+ try {
139
+ const record = await client.getFunction(resolvedAppId, functionId);
140
+ // The versions are append-only and nameless; `activeConfigId` is the
141
+ // only thing that says which one runs, so a listing without it would
142
+ // report the newest rather than the live one.
143
+ let active = null;
144
+ if (record?.activeConfigId) {
145
+ const { items } = await client.listFunctionConfigs(resolvedAppId, functionId);
146
+ active =
147
+ (items || []).find((c) => String(c.configId) === String(record.activeConfigId)) ?? null;
148
+ }
149
+ if (options.json) {
150
+ json({ ...record, activeConfig: active });
151
+ return;
152
+ }
153
+ printResult("Function ID", record.functionId);
154
+ printResult("Key", record.functionKey);
155
+ printResult("Description", record.description || "-");
156
+ printResult("Status", formatStatus(record.status));
157
+ printResult("Access", record.access || "-");
158
+ printResult("Input Schema", record.inputSchema || "-");
159
+ printResult("Output Schema", record.outputSchema || "-");
160
+ divider();
161
+ info("Active version:");
162
+ if (!active) {
163
+ printResult(" Version", "none — no code has been pushed yet");
164
+ }
165
+ else {
166
+ printResult(" Config ID", active.configId);
167
+ printResult(" Entry", active.entry);
168
+ printResult(" Content Hash", active.contentHash || "-");
169
+ // #3281 — the mode words. A server that predates `mode` serializes
170
+ // only the `durable` column, which reads the same way.
171
+ printResult(" Mode", activeVersionMode(active));
172
+ printResult(" Limits", active.limits || "-");
173
+ // #3182 — what this version declared: since #3279 the egress
174
+ // allowlist, the secrets that may enter the sandbox and the
175
+ // high-blast opt-ins. Shown here because `functions get` is where an
176
+ // operator asks what a deployed function is configured to reach.
177
+ const capabilities = Array.isArray(active.capabilities)
178
+ ? active.capabilities
179
+ : [];
180
+ printResult(" Capabilities", capabilities.length > 0 ? capabilities.join(", ") : "-");
181
+ }
182
+ // #3181 — the ONE surface a function's triggers are visible on. The
183
+ // hidden `AppWebhook` and `CronTrigger` rows are omitted from
184
+ // `webhooks list`, `cron-triggers list` and `config pull` by design, so
185
+ // without this an operator could not find the receiver URL a provider
186
+ // must be pointed at, or the schedule the platform actually holds.
187
+ divider();
188
+ info("Triggers:");
189
+ const triggers = record.triggers ?? { webhook: null, cron: [] };
190
+ const cronEntries = Array.isArray(triggers.cron)
191
+ ? triggers.cron
192
+ : [];
193
+ // #3184 — the database types this function watches. A change trigger
194
+ // has no standalone surface at all (there is no `database-triggers
195
+ // list`), so this is the only place an operator can see that a write
196
+ // to a type runs this function. A server that predates #3184 sends no
197
+ // `databases` key, which reads as none.
198
+ const databaseEntries = Array.isArray(triggers.databases)
199
+ ? triggers.databases
200
+ : [];
201
+ if (!triggers.webhook &&
202
+ cronEntries.length === 0 &&
203
+ databaseEntries.length === 0) {
204
+ printResult(" Triggers", "none — this function is invoked over HTTP only");
205
+ }
206
+ if (triggers.webhook) {
207
+ printResult(" Webhook", triggers.webhook.webhookId);
208
+ printResult(" URL", triggers.webhook.url || "-");
209
+ printResult(" Scheme", triggers.webhook.verificationScheme || "-");
210
+ printResult(" Status", formatStatus(triggers.webhook.status));
211
+ printResult(" Signing Secret", triggers.webhook.signingSecret || "-");
212
+ printResult(" Last Triggered", triggers.webhook.lastTriggeredAt
213
+ ? formatDate(triggers.webhook.lastTriggeredAt)
214
+ : "never");
215
+ }
216
+ if (cronEntries.length > 0) {
217
+ console.log(formatTable(cronEntries, [
218
+ { header: "NAME", key: "name" },
219
+ { header: "ID", key: "triggerId" },
220
+ { header: "CRON", key: "cron" },
221
+ { header: "TZ", key: "timezone" },
222
+ { header: "STATUS", key: "status", format: formatStatus },
223
+ { header: "NEXT FIRE", key: "nextFireAt", format: formatDate },
224
+ { header: "FIRED", key: "firedCount" },
225
+ { header: "LAST RUN", key: "lastTriggeredRunId" },
226
+ ]));
227
+ }
228
+ if (databaseEntries.length > 0) {
229
+ printResult(" Database changes", "a committed write to one of these types runs this function");
230
+ // A fire carries the rows of every change of the type (the intent's
231
+ // 2026-09-09 decision), so the row says which type and no more —
232
+ // the READ GRANTS column retired with the grant grammar (#3279).
233
+ console.log(formatTable(databaseEntries, [
234
+ { header: "DATABASE TYPE", key: "databaseType" },
235
+ ]));
236
+ }
237
+ // #3187 / #3279 — the ACTIVE version's manifest: what it registered
238
+ // and what it TOUCHES, from the push-time collection. Documentation,
239
+ // never authorization — function code acts as the system, and this
240
+ // is what lets an operator see what a version reaches without opening
241
+ // the bundle (principle 8). A server that predates the manifest block
242
+ // sends only `queries`.
243
+ divider();
244
+ info("Manifest (documentation, not authorization):");
245
+ const manifest = record.manifest && typeof record.manifest === "object"
246
+ ? record.manifest
247
+ : { queries: Array.isArray(record.queries) ? record.queries : [] };
248
+ const queries = Array.isArray(manifest.queries) ? manifest.queries : [];
249
+ const models = Array.isArray(manifest.models) ? manifest.models : [];
250
+ const families = Array.isArray(manifest.families)
251
+ ? manifest.families
252
+ : [];
253
+ if (!record.manifest) {
254
+ printResult(" Manifest", "none recorded — this version was pushed without a manifest");
255
+ }
256
+ else {
257
+ printResult(" Models", (models.length > 0 ? models.join(", ") : "none named") +
258
+ // The marker is the difference between "names none" and "names
259
+ // these, and possibly more" (D3279-006).
260
+ (manifest.dynamicModels === true
261
+ ? " (+ a model name resolved at run time)"
262
+ : ""));
263
+ printResult(" Families", families.length > 0 ? families.join(", ") : "none reached");
264
+ }
265
+ if (queries.length === 0) {
266
+ if (record.manifest)
267
+ printResult(" Queries", "none registered");
268
+ }
269
+ else {
270
+ console.log(formatTable(queries, [
271
+ { header: "NAME", key: "name" },
272
+ { header: "KIND", key: "kind" },
273
+ {
274
+ header: "MODELS",
275
+ key: "models",
276
+ format: (value) => Array.isArray(value) && value.length > 0 ? value.join(", ") : "-",
277
+ },
278
+ {
279
+ header: "SCOPED",
280
+ key: "callerScoped",
281
+ format: (value) => (value ? "$caller" : "no"),
282
+ },
283
+ {
284
+ header: "CACHE",
285
+ key: "cache",
286
+ format: (value) => (value ? `${value.ttlMs}ms` : "off"),
287
+ },
288
+ ]));
289
+ }
290
+ divider();
291
+ printResult("Created", formatDate(record.createdAt));
292
+ printResult("Modified", formatDate(record.modifiedAt));
293
+ }
294
+ catch (err) {
295
+ error(err.message);
296
+ process.exit(1);
297
+ }
298
+ });
299
+ // #3181 — a trigger-fired invocation writes a run row, and a function run has
300
+ // no `workflowId`, so `primitive workflows runs` cannot see it. This verb is
301
+ // the only way to inspect what a webhook or a schedule actually did
302
+ // (principle 8).
303
+ functions
304
+ .command("runs")
305
+ .description("List a server function's runs, newest first")
306
+ .argument("<function-id>", "Function ID")
307
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
308
+ .option("--limit <n>", "Rows per page (default 25, max 100)")
309
+ .option("--cursor <cursor>", "Continue from a previous page")
310
+ .option("--json", "Output as JSON")
311
+ .action(async (functionId, options) => {
312
+ const resolvedAppId = resolveAppId(undefined, options);
313
+ const client = new ApiClient();
314
+ try {
315
+ const { items, nextCursor } = await client.listFunctionRuns(resolvedAppId, functionId, {
316
+ ...(options.limit ? { limit: Number(options.limit) } : {}),
317
+ ...(options.cursor ? { cursor: options.cursor } : {}),
318
+ });
319
+ if (options.json) {
320
+ json({ items, nextCursor });
321
+ return;
322
+ }
323
+ if (!items || items.length === 0) {
324
+ info("No runs found for this function.");
325
+ return;
326
+ }
327
+ console.log(formatTable(items, [
328
+ { header: "RUN ID", key: "runId" },
329
+ { header: "STATUS", key: "status", format: formatStatus },
330
+ { header: "FIRED BY", key: "initiatorKind" },
331
+ // #3280 — FIRED BY already said `function`; this is the half that
332
+ // makes it actionable, so a failed page leads back to the
333
+ // orchestrator that started it. Blank for a root.
334
+ { header: "PARENT", key: "parentFunctionKey" },
335
+ { header: "STARTED", key: "startedAt", format: formatDate },
336
+ { header: "ENDED", key: "endedAt", format: formatDate },
337
+ { header: "CODE", key: "errorCode" },
338
+ ]));
339
+ if (nextCursor) {
340
+ info(`More runs: --cursor ${nextCursor}`);
341
+ }
342
+ }
343
+ catch (err) {
344
+ error(err.message);
345
+ process.exit(1);
346
+ }
347
+ });
348
+ // #3287 — the invocation logs. `runs` above answers what HAPPENED; this
349
+ // answers what the function PRINTED and what it threw, which is the thing
350
+ // an operator reaches for when a function is failing and the response says
351
+ // only that it did.
352
+ functions
353
+ .command("logs")
354
+ .description("List a server function's invocation logs, newest first")
355
+ .argument("<function-id>", "Function ID")
356
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
357
+ .option("--limit <n>", "Rows per page (default 25, max 100)")
358
+ .option("--cursor <cursor>", "Continue from a previous page")
359
+ .option("--follow", "Append new invocations as they are recorded (tail)")
360
+ .option("--interval <seconds>", "Poll interval for --follow (default 2)")
361
+ .option("--json", "Output as JSON")
362
+ .action(async (functionId, options) => {
363
+ const resolvedAppId = resolveAppId(undefined, options);
364
+ const client = new ApiClient();
365
+ const limit = options.limit ? Number(options.limit) : undefined;
366
+ // A cursor names a page in the PAST and a tail starts from now: serving
367
+ // both would mean guessing which the caller meant.
368
+ if (options.follow && options.cursor) {
369
+ error("--follow and --cursor cannot be combined; --follow tails from now.");
370
+ process.exit(1);
371
+ }
372
+ try {
373
+ if (options.follow) {
374
+ const intervalSeconds = options.interval ? Number(options.interval) : 2;
375
+ if (!Number.isFinite(intervalSeconds) || intervalSeconds <= 0) {
376
+ error("--interval must be a positive number of seconds.");
377
+ process.exit(1);
378
+ }
379
+ const controller = new AbortController();
380
+ const onSigint = () => controller.abort();
381
+ process.on("SIGINT", onSigint);
382
+ try {
383
+ // The high-water mark is the newest `invocationId` already seen.
384
+ // It is a ULID, so string order IS creation order and "newer than
385
+ // this" is a comparison rather than a set of ids to remember.
386
+ // The route answers NEWEST first, so a tick walks BACKWARD until
387
+ // it meets the mark rather than reading one page and hoping
388
+ // (CR3287-007). The walk is `buildLogFollowSource`, where it can
389
+ // be put to a test without a server.
390
+ const source = buildLogFollowSource(({ cursor }) => client.listFunctionLogs(resolvedAppId, functionId, {
391
+ ...(limit ? { limit } : {}),
392
+ ...(cursor ? { cursor } : {}),
393
+ }), {
394
+ idOf: (row) => String(row.invocationId),
395
+ maxPagesPerTick: FOLLOW_MAX_PAGES_PER_TICK,
396
+ });
397
+ if (!options.json) {
398
+ info("Following invocations (Ctrl-C to stop)…");
399
+ }
400
+ await followLoop(source, {
401
+ intervalMs: intervalSeconds * 1000,
402
+ signal: controller.signal,
403
+ render: (items) => {
404
+ if (options.json) {
405
+ // One JSON object per line — a tail has no closing bracket
406
+ // to wait for — each in the SHARED inspection item shape,
407
+ // the same items the one-shot envelope carries.
408
+ for (const row of items)
409
+ jsonLine(toFunctionLogInspectionRow(row));
410
+ return;
411
+ }
412
+ for (const row of items)
413
+ console.log(logRow(row));
414
+ },
415
+ });
416
+ }
417
+ finally {
418
+ process.off("SIGINT", onSigint);
419
+ }
420
+ return;
421
+ }
422
+ const { items, nextCursor } = await client.listFunctionLogs(resolvedAppId, functionId, {
423
+ ...(limit ? { limit } : {}),
424
+ ...(options.cursor ? { cursor: options.cursor } : {}),
425
+ });
426
+ if (options.json) {
427
+ // The shared envelope, whose items are the shared inspection shape:
428
+ // a consumer classifies and pivots on `outcome`, `nativeStatus` and
429
+ // `correlation` without knowing which store answered (DSO3287-007).
430
+ json({
431
+ items: items.map((row) => toFunctionLogInspectionRow(row)),
432
+ hasMore: !!nextCursor,
433
+ ...(nextCursor ? { nextCursor } : {}),
434
+ });
435
+ return;
436
+ }
437
+ if (!items || items.length === 0) {
438
+ info("No invocation logs found for this function.");
439
+ return;
440
+ }
441
+ console.log(formatTable(items.map((row) => ({
442
+ startedAt: row.startedAt,
443
+ status: row.status,
444
+ trigger: row.trigger?.kind ?? "",
445
+ // A trigger fire and a task run name their run; a request
446
+ // invocation's key is its own id.
447
+ runOrInvocation: row.runId || row.invocationId,
448
+ errorCode: row.errorCode ?? "",
449
+ firstError: firstErrorLine(row),
450
+ })), [
451
+ { header: "TIME", key: "startedAt", format: formatDate },
452
+ { header: "STATUS", key: "status", format: formatStatus },
453
+ { header: "TRIGGER", key: "trigger" },
454
+ { header: "RUN/INVOCATION ID", key: "runOrInvocation" },
455
+ { header: "CODE", key: "errorCode" },
456
+ { header: "ERROR", key: "firstError" },
457
+ ]));
458
+ if (nextCursor) {
459
+ info(`More logs: --cursor ${nextCursor}`);
460
+ }
461
+ }
462
+ catch (err) {
463
+ error(err.message);
464
+ process.exit(1);
465
+ }
466
+ });
467
+ // #3182 — the typed handle's generated files, and the freshness question a
468
+ // CI job has to be able to ASK. `config push` writes them and `config diff`
469
+ // names the stale ones, but a diff exits 0 whatever it found, so a job that
470
+ // meant to fail on stale types passed and a declaration that disagreed with
471
+ // its schema reached the author as types that quietly lie (F3182-004). The
472
+ // verb and the flag are the two `databases codegen` and `workflows codegen`
473
+ // already use for exactly this.
474
+ functions
475
+ .command("codegen")
476
+ .allowExcessArguments(false)
477
+ .description("Write the generated files into the config tree's functions/ directory: the database-type declaration, the primitive-functions declaration, the functions declaration (<Key>Input/<Key>Output from each function's schemas), the per-function client invokers under generated/, and the tsconfig that wires the declarations into your editor. `config push` does this too; this is the standalone form, with a --check mode for CI.")
478
+ .option("--check", "Exit non-zero if the generated files are out of date or the tsconfig no longer loads them (CI guard); does not write.")
479
+ .option("-o, --out <dir>", "Directory for the per-function client invokers (default: <tree>/functions/generated/)")
480
+ .option("--json", "Output the result summary as JSON")
481
+ .action(async (options) => {
482
+ // A tree command: what it writes is the environment's own directory,
483
+ // which is the only directory it can be asked to write (#3154).
484
+ const configDir = resolveSyncDir();
485
+ if (!existsSync(configDir)) {
486
+ error(`Config directory not found: ${configDir}`);
487
+ process.exit(1);
488
+ }
489
+ if (!existsSync(join(configDir, "functions"))) {
490
+ // Nothing to type: the artifacts exist to serve function sources, and
491
+ // a tree with none needs no compiler wiring. Not a failure — a tree
492
+ // may legitimately have no functions.
493
+ if (options.json)
494
+ json({ ok: true, stale: [], problems: [] });
495
+ else
496
+ info(`No functions/ directory in ${configDir}; nothing to generate.`);
497
+ return;
498
+ }
499
+ // #3281 — the per-key client invokers go beside the declarations unless
500
+ // `-o` names another directory, the `workflows codegen` shape.
501
+ const artifactOptions = options.out ? { invokerDir: String(options.out) } : {};
502
+ // Wiring push cannot repair is checked alongside freshness: a tsconfig
503
+ // that carries comments is never rewritten, so it can be perfectly
504
+ // current and still load none of the declarations (CR3182-003).
505
+ let problems;
506
+ let stale = [];
507
+ try {
508
+ problems = functionTypeWiringProblems(configDir, artifactOptions);
509
+ if (options.check)
510
+ stale = staleFunctionTypeArtifacts(configDir, artifactOptions);
511
+ }
512
+ catch (err) {
513
+ // A malformed schema in a function file: nothing can be generated
514
+ // from it, and the message names the file.
515
+ if (!(err instanceof FunctionSchemaCodegenError))
516
+ throw err;
517
+ if (options.json)
518
+ json({ ok: false, stale: [], problems: [err.message] });
519
+ else
520
+ error(err.message);
521
+ process.exit(1);
522
+ }
523
+ if (options.check) {
524
+ if (stale.length === 0 && problems.length === 0) {
525
+ if (options.json)
526
+ json({ ok: true, stale: [], problems: [] });
527
+ else
528
+ success("Check passed: the function types are up to date.");
529
+ return;
530
+ }
531
+ if (options.json) {
532
+ json({ ok: false, stale, problems });
533
+ }
534
+ else {
535
+ error(`Check failed: ${stale.length} file(s) out of date` +
536
+ (problems.length > 0
537
+ ? `, ${problems.length} wiring problem(s).`
538
+ : "."));
539
+ for (const relative of stale)
540
+ error(` out of date: ${relative}`);
541
+ for (const problem of problems) {
542
+ error(` functions/tsconfig.json: ${problem}`);
543
+ }
544
+ // Name the command that fixes what was just reported, keeping the
545
+ // options that decided WHERE it looked (#2911). The tree itself is
546
+ // no longer one of them (#3154) — only `-o` is left.
547
+ const regenerate = ["primitive functions codegen"];
548
+ if (options.out)
549
+ regenerate.push(`-o ${options.out}`);
550
+ info(`Run \`${regenerate.join(" ")}\` to regenerate.`);
551
+ }
552
+ process.exit(1);
553
+ }
554
+ const written = writeFunctionTypeArtifacts(configDir, undefined, artifactOptions);
555
+ if (options.json) {
556
+ json({ written, problems });
557
+ return;
558
+ }
559
+ success(`Wrote ${written.length} file(s) into ${configDir}/functions/.`);
560
+ for (const relative of written)
561
+ keyValue(" wrote", relative);
562
+ for (const problem of problems) {
563
+ warn(`functions/tsconfig.json: ${problem}`);
564
+ }
565
+ });
566
+ // #2803 — the operational verb pair, and the only writers of `status` besides
567
+ // the delete flow. `config push` is deliberately not one: see the module note.
568
+ functions
569
+ .command("disable")
570
+ .description("Take a server function out of service now. Invocations are refused; the committed configuration and code are unchanged.")
571
+ .argument("<function-id>", "Function ID")
572
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
573
+ .option("--json", "Output as JSON")
574
+ .action(async (functionId, options) => {
575
+ const resolvedAppId = resolveAppId(undefined, options);
576
+ const client = new ApiClient();
577
+ try {
578
+ const result = await client.setFunctionAvailability(resolvedAppId, functionId, "disable");
579
+ if (options.json) {
580
+ json(result);
581
+ return;
582
+ }
583
+ success(`Function disabled: ${result.functionKey || functionId}`);
584
+ info("Invocations are refused. `primitive config push` still updates the code and leaves it out of service — `primitive functions enable` puts it back.");
585
+ }
586
+ catch (err) {
587
+ error(err.message);
588
+ process.exit(1);
589
+ }
590
+ });
591
+ functions
592
+ .command("enable")
593
+ .description("Put a server function back in service.")
594
+ .argument("<function-id>", "Function ID")
595
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
596
+ .option("--json", "Output as JSON")
597
+ .action(async (functionId, options) => {
598
+ const resolvedAppId = resolveAppId(undefined, options);
599
+ const client = new ApiClient();
600
+ try {
601
+ const result = await client.setFunctionAvailability(resolvedAppId, functionId, "enable");
602
+ if (options.json) {
603
+ json(result);
604
+ return;
605
+ }
606
+ success(`Function enabled: ${result.functionKey || functionId}`);
607
+ }
608
+ catch (err) {
609
+ error(err.message);
610
+ process.exit(1);
611
+ }
612
+ });
613
+ // #2907 — the delete flow's CLI spelling. The plain `DELETE` the server has
614
+ // always answered by writing the tombstone; not a second writer of `status`.
615
+ functions
616
+ .command("archive")
617
+ .description("Retire a server function (soft delete). Delete-lifecycle, not `disable`: the row is kept, goes on holding its key, and there is no un-archive.")
618
+ .argument("<function-id>", "Function ID")
619
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
620
+ .option("-y, --yes", "Skip confirmation prompt")
621
+ .option("--json", "Output as JSON")
622
+ .addHelpText("after", `
623
+ What archiving a function costs:
624
+ Invocations are refused, as they are for a disabled function.
625
+ The archived row still holds its key in the app's SINGLE key namespace — no
626
+ new function, workflow, script or webhook may take that key while it stands —
627
+ and pushing code to an archived function is refused.
628
+ \`primitive functions enable\` refuses an archived function; there is no
629
+ un-archive.
630
+
631
+ Reclaiming the key means hard-deleting the row:
632
+ $ rm functions/<key>.toml
633
+ $ primitive config push --prune # confirmed; hard-deletes the row, its
634
+ # versions and their stored bundles
635
+ # or hard-delete it in the console, then re-add the file and push.
636
+ `)
637
+ .action(async (functionId, options) => {
638
+ const resolvedAppId = resolveAppId(undefined, options);
639
+ if (!options.yes) {
640
+ let confirmed;
641
+ try {
642
+ confirmed = await confirmPrompt(`Archive function ${functionId}? Invocations stop, the row keeps its ` +
643
+ `key in the app's single key namespace, and there is no un-archive.`);
644
+ }
645
+ catch (err) {
646
+ error(err.message);
647
+ process.exit(1);
648
+ }
649
+ if (!confirmed) {
650
+ info("Cancelled.");
651
+ return;
652
+ }
653
+ }
654
+ const client = new ApiClient();
655
+ try {
656
+ // The soft delete: no `hard`, so the server writes the tombstone and
657
+ // keeps the reservation. Prune-by-push owns the hard path.
658
+ const result = await client.deleteFunction(resolvedAppId, functionId);
659
+ if (options.json) {
660
+ json(result);
661
+ return;
662
+ }
663
+ success(`Function archived: ${functionId}`);
664
+ info("Invocations are refused and pushes to it are rejected. The row still holds its key — reclaim it by removing its file and running a confirmed `primitive config push --prune`.");
665
+ }
666
+ catch (err) {
667
+ error(err.message);
668
+ process.exit(1);
669
+ }
670
+ });
671
+ }
672
+ //# sourceMappingURL=functions.js.map