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
@@ -1,6 +1,10 @@
1
1
  import { ApiClient } from "../lib/api-client.js";
2
2
  import { resolveAppId } from "../lib/config.js";
3
3
  import { success, error, info, keyValue, formatTable, formatId, formatDate, json, } from "../lib/output.js";
4
+ import { confirmPrompt } from "../lib/confirm-prompt.js";
5
+ import { warnDeprecated } from "../lib/deprecation.js";
6
+ import { pageCursorOption, pageLimitOption, parsePageLimit, printEmptyPage, printPageHint, } from "../lib/list-options.js";
7
+ import { normalizeCliListEnvelope, wholeListEnvelope, } from "../lib/paginate.js";
4
8
  export function registerUsersCommands(program) {
5
9
  const users = program
6
10
  .command("users")
@@ -8,27 +12,51 @@ export function registerUsersCommands(program) {
8
12
  .addHelpText("after", `
9
13
  Examples:
10
14
  $ primitive users list
15
+ $ primitive users create user@example.com --role admin
11
16
  $ primitive users invite user@example.com --role admin
12
17
  $ primitive users set-role 01HXY... member
18
+ $ primitive users mint-jwt <user-id>
13
19
  `);
14
20
  // List users
15
21
  users
16
22
  .command("list")
17
- .description("List users in an app")
23
+ .description("List users in an app, optionally filtered by --search")
18
24
  .argument("[app-id]", "App ID (uses current app if not specified)")
19
25
  .option("--app <app-id>", "App ID")
26
+ .option("--search <query>", "Filter users. ULID -> userId lookup; contains '@' -> email lookup; otherwise substring name search.")
27
+ .addOption(pageLimitOption())
28
+ .addOption(pageCursorOption())
20
29
  .option("--json", "Output as JSON")
21
30
  .action(async (appId, options) => {
31
+ const limit = parsePageLimit(options.limit);
22
32
  const resolvedAppId = resolveAppId(appId, options);
23
33
  const client = new ApiClient();
34
+ const params = {};
35
+ if (limit !== undefined)
36
+ params.limit = limit;
37
+ if (options.cursor)
38
+ params.cursor = options.cursor;
39
+ if (options.search) {
40
+ const q = String(options.search).trim();
41
+ // ULID is exactly 26 chars from Crockford's base32 alphabet (excludes I,L,O,U).
42
+ // Match case-insensitively because users paste IDs from various sources.
43
+ const isUlid = /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(q);
44
+ if (isUlid)
45
+ params.userId = q;
46
+ else if (q.includes("@"))
47
+ params.email = q;
48
+ else
49
+ params.name = q;
50
+ }
24
51
  try {
25
- const usersList = await client.listUsers(resolvedAppId);
52
+ const page = normalizeCliListEnvelope(await client.listUsers(resolvedAppId, params));
53
+ const usersList = page.items;
26
54
  if (options.json) {
27
- json(usersList);
55
+ json(page);
28
56
  return;
29
57
  }
30
58
  if (!usersList || usersList.length === 0) {
31
- info("No users found.");
59
+ printEmptyPage(page, "users");
32
60
  return;
33
61
  }
34
62
  console.log(formatTable(usersList, [
@@ -36,8 +64,96 @@ Examples:
36
64
  { header: "EMAIL", key: "email" },
37
65
  { header: "NAME", key: "name" },
38
66
  { header: "ROLE", key: "role" },
67
+ // #2803 — a disabled user rendered exactly like an active one, so
68
+ // the list said nothing about the state the console could put them
69
+ // in. `disabled` reads plainly next to the role.
70
+ {
71
+ header: "STATUS",
72
+ key: "status",
73
+ format: (value) => String(value || "active") === "disabled" ? "disabled" : "active",
74
+ },
39
75
  { header: "ADDED", key: "addedAt", format: formatDate },
40
76
  ]));
77
+ printPageHint(page);
78
+ }
79
+ catch (err) {
80
+ error(err.message);
81
+ process.exit(1);
82
+ }
83
+ });
84
+ // Create user (add by email)
85
+ users
86
+ .command("create")
87
+ .description("Create a user in an app (or add an existing user by email)")
88
+ .argument("<email>", "Email address")
89
+ .option("--role <role>", "Role: admin or member", "member")
90
+ .option("--app <app-id>", "App ID")
91
+ .option("--json", "Output as JSON")
92
+ .action(async (email, options) => {
93
+ const resolvedAppId = resolveAppId(undefined, options);
94
+ const client = new ApiClient();
95
+ try {
96
+ const result = await client.addUserByEmail(resolvedAppId, {
97
+ email,
98
+ role: options.role,
99
+ });
100
+ if (options.json) {
101
+ json(result);
102
+ return;
103
+ }
104
+ success(result.message || `User ${email} added.`);
105
+ if (result.userId)
106
+ keyValue("User ID", result.userId);
107
+ if (result.email)
108
+ keyValue("Email", result.email);
109
+ }
110
+ catch (err) {
111
+ error(err.message);
112
+ process.exit(1);
113
+ }
114
+ });
115
+ // Mint test JWT
116
+ users
117
+ .command("mint-jwt")
118
+ .description("Mint a test JWT for a user (dev/test environments only)")
119
+ .argument("<user-id>", "User ID")
120
+ .option("--role <role>", "Role override for the JWT")
121
+ .option("--app <app-id>", "App ID")
122
+ .option("--json", "Output as JSON")
123
+ .action(async (userId, options) => {
124
+ const resolvedAppId = resolveAppId(undefined, options);
125
+ const client = new ApiClient();
126
+ try {
127
+ const result = await client.mintTestJwt(resolvedAppId, userId, options.role);
128
+ if (options.json) {
129
+ json(result);
130
+ return;
131
+ }
132
+ success("JWT minted.");
133
+ console.log(result.token);
134
+ }
135
+ catch (err) {
136
+ error(err.message);
137
+ process.exit(1);
138
+ }
139
+ });
140
+ // Rebuild User._searchText (super-admin only)
141
+ users
142
+ .command("rebuild-search-text")
143
+ .description("Re-save every user in an app to repopulate User._searchText")
144
+ .argument("[app-id]", "App ID (uses current app if not specified)")
145
+ .option("--app <app-id>", "App ID")
146
+ .option("--json", "Output as JSON")
147
+ .action(async (appId, options) => {
148
+ const resolvedAppId = resolveAppId(appId, options);
149
+ const client = new ApiClient();
150
+ try {
151
+ const result = await client.rebuildUserSearchText(resolvedAppId);
152
+ if (options.json) {
153
+ json(result);
154
+ return;
155
+ }
156
+ success(`Reindexed ${result.count} user(s) in ${resolvedAppId}.`);
41
157
  }
42
158
  catch (err) {
43
159
  error(err.message);
@@ -54,6 +170,7 @@ Examples:
54
170
  .option("--role <role>", "Role: admin or member", "member")
55
171
  .option("--send-email", "Send invitation email")
56
172
  .option("--expires-days <days>", "Days until invitation expires", "7")
173
+ .option("--note <note>", "Personal note to include in the invitation email")
57
174
  .option("--json", "Output as JSON")
58
175
  .action(async (appIdOrEmail, emailOrUndefined, options) => {
59
176
  // Handle argument flexibility
@@ -79,11 +196,17 @@ Examples:
79
196
  }
80
197
  const client = new ApiClient();
81
198
  try {
199
+ // When inviting as admin, create the console admin first — the backend
200
+ // enforces the 3-admin limit (single source of truth)
201
+ if (options.role === "admin") {
202
+ await client.addAppAdmin(resolvedAppId, { adminEmail: email });
203
+ }
82
204
  const result = await client.createInvitation(resolvedAppId, {
83
205
  email,
84
206
  role: options.role,
85
207
  expiresInDays: parseInt(options.expiresDays),
86
208
  sendEmail: options.sendEmail || false,
209
+ ...(options.note ? { note: options.note } : {}),
87
210
  });
88
211
  if (options.json) {
89
212
  json(result);
@@ -101,12 +224,13 @@ Examples:
101
224
  // Remove user
102
225
  users
103
226
  .command("remove")
104
- .description("Remove a user from an app")
227
+ .description("(deprecated: use users disable) Remove a user's membership of an app. To block sign-in without removing them, use `users disable`.")
105
228
  .argument("[app-id]", "App ID (uses current app if not specified)")
106
229
  .argument("<user-id>", "User ID to remove")
107
230
  .option("--app <app-id>", "App ID")
108
231
  .option("-y, --yes", "Skip confirmation prompt")
109
232
  .action(async (appIdOrUserId, userIdOrUndefined, options) => {
233
+ warnDeprecated("primitive users remove", "`primitive users disable`", 518);
110
234
  // Handle argument flexibility
111
235
  let resolvedAppId;
112
236
  let userId;
@@ -123,15 +247,14 @@ Examples:
123
247
  process.exit(1);
124
248
  }
125
249
  if (!options.yes) {
126
- const inquirer = await import("inquirer");
127
- const { confirm } = await inquirer.default.prompt([
128
- {
129
- type: "confirm",
130
- name: "confirm",
131
- message: `Remove user ${userId} from app?`,
132
- default: false,
133
- },
134
- ]);
250
+ let confirm;
251
+ try {
252
+ confirm = await confirmPrompt(`Remove user ${userId} from app?`);
253
+ }
254
+ catch (err) {
255
+ error(err.message);
256
+ process.exit(1);
257
+ }
135
258
  if (!confirm) {
136
259
  info("Cancelled.");
137
260
  return;
@@ -147,6 +270,89 @@ Examples:
147
270
  process.exit(1);
148
271
  }
149
272
  });
273
+ // #2803 — an app user could be disabled from the console but not from the
274
+ // CLI, and the console could not undo it. Both routes already existed; the
275
+ // operational control just was not reachable. Deliberately distinct from
276
+ // `users remove`, which detaches the membership: disabling blocks the
277
+ // person's auth in this app and is reversible.
278
+ users
279
+ .command("disable")
280
+ .description("Block a user from signing in to an app. Revokes their sessions and API tokens; reversible with `users enable`.")
281
+ .argument("[app-id]", "App ID (uses current app if not specified)")
282
+ .argument("<user-id>", "User ID to disable")
283
+ .option("--app <app-id>", "App ID")
284
+ .option("-y, --yes", "Skip confirmation prompt")
285
+ .action(async (appIdOrUserId, userIdOrUndefined, options) => {
286
+ let resolvedAppId;
287
+ let userId;
288
+ if (userIdOrUndefined) {
289
+ resolvedAppId = resolveAppId(appIdOrUserId, options);
290
+ userId = userIdOrUndefined;
291
+ }
292
+ else {
293
+ resolvedAppId = resolveAppId(undefined, options);
294
+ userId = appIdOrUserId;
295
+ }
296
+ if (!userId) {
297
+ error("User ID is required.");
298
+ process.exit(1);
299
+ }
300
+ if (!options.yes) {
301
+ let confirm;
302
+ try {
303
+ confirm = await confirmPrompt(`Disable user ${userId}? They will be signed out and unable to sign in.`);
304
+ }
305
+ catch (err) {
306
+ error(err.message);
307
+ process.exit(1);
308
+ }
309
+ if (!confirm) {
310
+ info("Cancelled.");
311
+ return;
312
+ }
313
+ }
314
+ const client = new ApiClient();
315
+ try {
316
+ await client.setUserAvailability(resolvedAppId, userId, "disable");
317
+ success(`User ${userId} disabled.`);
318
+ info("Their membership is unchanged — `primitive users enable` restores access.");
319
+ }
320
+ catch (err) {
321
+ error(err.message);
322
+ process.exit(1);
323
+ }
324
+ });
325
+ users
326
+ .command("enable")
327
+ .description("Restore a disabled user's access to an app.")
328
+ .argument("[app-id]", "App ID (uses current app if not specified)")
329
+ .argument("<user-id>", "User ID to enable")
330
+ .option("--app <app-id>", "App ID")
331
+ .action(async (appIdOrUserId, userIdOrUndefined, options) => {
332
+ let resolvedAppId;
333
+ let userId;
334
+ if (userIdOrUndefined) {
335
+ resolvedAppId = resolveAppId(appIdOrUserId, options);
336
+ userId = userIdOrUndefined;
337
+ }
338
+ else {
339
+ resolvedAppId = resolveAppId(undefined, options);
340
+ userId = appIdOrUserId;
341
+ }
342
+ if (!userId) {
343
+ error("User ID is required.");
344
+ process.exit(1);
345
+ }
346
+ const client = new ApiClient();
347
+ try {
348
+ await client.setUserAvailability(resolvedAppId, userId, "enable");
349
+ success(`User ${userId} enabled.`);
350
+ }
351
+ catch (err) {
352
+ error(err.message);
353
+ process.exit(1);
354
+ }
355
+ });
150
356
  // Set user role
151
357
  users
152
358
  .command("set-role")
@@ -218,15 +424,14 @@ Examples:
218
424
  process.exit(1);
219
425
  }
220
426
  if (!options.yes) {
221
- const inquirer = await import("inquirer");
222
- const { confirm } = await inquirer.default.prompt([
223
- {
224
- type: "confirm",
225
- name: "confirm",
226
- message: `Transfer ownership of app to ${target}? This cannot be undone.`,
227
- default: false,
228
- },
229
- ]);
427
+ let confirm;
428
+ try {
429
+ confirm = await confirmPrompt(`Transfer ownership of app to ${target}? This cannot be undone.`);
430
+ }
431
+ catch (err) {
432
+ error(err.message);
433
+ process.exit(1);
434
+ }
230
435
  if (!confirm) {
231
436
  info("Cancelled.");
232
437
  return;
@@ -260,7 +465,8 @@ Examples:
260
465
  const resolvedAppId = resolveAppId(appId, options);
261
466
  const client = new ApiClient();
262
467
  try {
263
- const invitations = await client.listInvitations(resolvedAppId);
468
+ const result = await client.listInvitations(resolvedAppId);
469
+ const invitations = result.items;
264
470
  if (options.json) {
265
471
  json(invitations);
266
472
  return;
@@ -281,5 +487,317 @@ Examples:
281
487
  process.exit(1);
282
488
  }
283
489
  });
490
+ // --- Console admins subcommands ---
491
+ const admins = users
492
+ .command("admins")
493
+ .description("Manage console admins for an app");
494
+ // List console admins
495
+ admins
496
+ .command("list")
497
+ .description("List console admins for an app")
498
+ .argument("[app-id]", "App ID (uses current app if not specified)")
499
+ .option("--app <app-id>", "App ID")
500
+ .option("--json", "Output as JSON")
501
+ .action(async (appId, options) => {
502
+ const resolvedAppId = resolveAppId(appId, options);
503
+ const client = new ApiClient();
504
+ try {
505
+ const adminsList = await client.listAppAdmins(resolvedAppId);
506
+ if (options.json) {
507
+ json(wholeListEnvelope(adminsList));
508
+ return;
509
+ }
510
+ if (!adminsList || adminsList.length === 0) {
511
+ info("No console admins found.");
512
+ return;
513
+ }
514
+ console.log(formatTable(adminsList, [
515
+ { header: "ADMIN ID", key: "adminId", format: formatId },
516
+ { header: "EMAIL", key: "email" },
517
+ { header: "NAME", key: "name" },
518
+ { header: "ROLE", key: "role" },
519
+ { header: "ASSIGNED", key: "assignedAt", format: formatDate },
520
+ ]));
521
+ }
522
+ catch (err) {
523
+ error(err.message);
524
+ process.exit(1);
525
+ }
526
+ });
527
+ // Add console admin
528
+ admins
529
+ .command("add")
530
+ .description("Add a console admin to an app (creates invitation if admin account doesn't exist)")
531
+ .argument("[app-id-or-email]", "App ID or admin email")
532
+ .argument("[email]", "Admin email address (if first arg is app ID)")
533
+ .option("--app <app-id>", "App ID")
534
+ .option("--json", "Output as JSON")
535
+ .action(async (appIdOrEmail, emailOrUndefined, options) => {
536
+ let resolvedAppId;
537
+ let email;
538
+ if (emailOrUndefined && !emailOrUndefined.startsWith("-")) {
539
+ resolvedAppId = resolveAppId(appIdOrEmail, options);
540
+ email = emailOrUndefined;
541
+ }
542
+ else if (appIdOrEmail?.includes("@")) {
543
+ resolvedAppId = resolveAppId(undefined, options);
544
+ email = appIdOrEmail;
545
+ }
546
+ else {
547
+ resolvedAppId = resolveAppId(appIdOrEmail, options);
548
+ email = emailOrUndefined;
549
+ }
550
+ if (!email) {
551
+ error("Email is required.");
552
+ process.exit(1);
553
+ }
554
+ const client = new ApiClient();
555
+ try {
556
+ const result = await client.addAppAdmin(resolvedAppId, {
557
+ adminEmail: email,
558
+ });
559
+ // Also create an app-level invitation with role "admin"
560
+ try {
561
+ await client.createInvitation(resolvedAppId, {
562
+ email,
563
+ role: "admin",
564
+ expiresInDays: 7,
565
+ sendEmail: false,
566
+ });
567
+ }
568
+ catch {
569
+ // Non-fatal: console admin was created, app invitation may already exist
570
+ }
571
+ if (options.json) {
572
+ json(result);
573
+ return;
574
+ }
575
+ if (result.status === "invited") {
576
+ success(`Invitation sent to ${email}`);
577
+ if (result.invitation) {
578
+ keyValue("Invitation ID", result.invitation.invitationId);
579
+ if (result.invitation.expiresAt) {
580
+ keyValue("Expires", formatDate(result.invitation.expiresAt));
581
+ }
582
+ }
583
+ }
584
+ else {
585
+ success(result.message || `Admin ${email} added.`);
586
+ if (result.admin) {
587
+ keyValue("Admin ID", result.admin.adminId);
588
+ }
589
+ }
590
+ }
591
+ catch (err) {
592
+ error(err.message);
593
+ process.exit(1);
594
+ }
595
+ });
596
+ // Remove console admin
597
+ admins
598
+ .command("remove")
599
+ .description("Remove a console admin from an app")
600
+ .argument("[app-id-or-admin-id]", "App ID or admin ID")
601
+ .argument("[admin-id]", "Admin ID (if first arg is app ID)")
602
+ .option("--app <app-id>", "App ID")
603
+ .option("-y, --yes", "Skip confirmation prompt")
604
+ .action(async (appIdOrAdminId, adminIdOrUndefined, options) => {
605
+ let resolvedAppId;
606
+ let adminId;
607
+ if (adminIdOrUndefined && !adminIdOrUndefined.startsWith("-")) {
608
+ resolvedAppId = resolveAppId(appIdOrAdminId, options);
609
+ adminId = adminIdOrUndefined;
610
+ }
611
+ else {
612
+ resolvedAppId = resolveAppId(undefined, options);
613
+ adminId = appIdOrAdminId;
614
+ }
615
+ if (!adminId) {
616
+ error("Admin ID is required.");
617
+ process.exit(1);
618
+ }
619
+ if (!options.yes) {
620
+ let confirm;
621
+ try {
622
+ confirm = await confirmPrompt(`Remove admin ${adminId} from app?`);
623
+ }
624
+ catch (err) {
625
+ error(err.message);
626
+ process.exit(1);
627
+ }
628
+ if (!confirm) {
629
+ info("Cancelled.");
630
+ return;
631
+ }
632
+ }
633
+ const client = new ApiClient();
634
+ try {
635
+ await client.removeAppAdmin(resolvedAppId, adminId);
636
+ success(`Admin ${adminId} removed.`);
637
+ }
638
+ catch (err) {
639
+ error(err.message);
640
+ process.exit(1);
641
+ }
642
+ });
643
+ // Transfer ownership
644
+ admins
645
+ .command("transfer-owner")
646
+ .description("Transfer app ownership to another admin")
647
+ .argument("[app-id-or-target]", "App ID or new owner's email/admin ID")
648
+ .argument("[email-or-admin-id]", "New owner's email or admin ID (if first arg is app ID)")
649
+ .option("--app <app-id>", "App ID")
650
+ .option("-y, --yes", "Skip confirmation prompt")
651
+ .action(async (appIdOrTarget, targetOrUndefined, options) => {
652
+ let resolvedAppId;
653
+ let target;
654
+ if (targetOrUndefined && !targetOrUndefined.startsWith("-")) {
655
+ resolvedAppId = resolveAppId(appIdOrTarget, options);
656
+ target = targetOrUndefined;
657
+ }
658
+ else {
659
+ resolvedAppId = resolveAppId(undefined, options);
660
+ target = appIdOrTarget;
661
+ }
662
+ if (!target) {
663
+ error("New owner email or admin ID is required.");
664
+ process.exit(1);
665
+ }
666
+ if (!options.yes) {
667
+ let confirm;
668
+ try {
669
+ confirm = await confirmPrompt(`Transfer ownership of app to ${target}? This cannot be undone.`);
670
+ }
671
+ catch (err) {
672
+ error(err.message);
673
+ process.exit(1);
674
+ }
675
+ if (!confirm) {
676
+ info("Cancelled.");
677
+ return;
678
+ }
679
+ }
680
+ const client = new ApiClient();
681
+ try {
682
+ if (target.includes("@")) {
683
+ await client.transferOwnership(resolvedAppId, target);
684
+ }
685
+ else {
686
+ await client.transferAdminOwnership(resolvedAppId, target);
687
+ }
688
+ success(`Ownership transferred to ${target}`);
689
+ }
690
+ catch (err) {
691
+ error(err.message);
692
+ process.exit(1);
693
+ }
694
+ });
695
+ // --- Admin invitations subcommands ---
696
+ const adminInvitations = users
697
+ .command("admin-invitations")
698
+ .description("Manage console admin invitations for an app");
699
+ // List admin invitations
700
+ adminInvitations
701
+ .command("list")
702
+ .description("List pending console admin invitations")
703
+ .argument("[app-id]", "App ID (uses current app if not specified)")
704
+ .option("--app <app-id>", "App ID")
705
+ .option("--json", "Output as JSON")
706
+ .action(async (appId, options) => {
707
+ const resolvedAppId = resolveAppId(appId, options);
708
+ const client = new ApiClient();
709
+ try {
710
+ const invitationsList = await client.listAppAdminInvitations(resolvedAppId);
711
+ if (options.json) {
712
+ json(wholeListEnvelope(invitationsList));
713
+ return;
714
+ }
715
+ if (!invitationsList || invitationsList.length === 0) {
716
+ info("No pending admin invitations.");
717
+ return;
718
+ }
719
+ console.log(formatTable(invitationsList, [
720
+ { header: "ID", key: "invitationId", format: formatId },
721
+ { header: "EMAIL", key: "email" },
722
+ { header: "ROLE", key: "role" },
723
+ { header: "INVITED", key: "invitedAt", format: formatDate },
724
+ { header: "EXPIRES", key: "expiresAt", format: formatDate },
725
+ ]));
726
+ }
727
+ catch (err) {
728
+ error(err.message);
729
+ process.exit(1);
730
+ }
731
+ });
732
+ // Delete admin invitation
733
+ adminInvitations
734
+ .command("delete")
735
+ .description("Delete a pending console admin invitation")
736
+ .argument("[app-id-or-inv-id]", "App ID or invitation ID")
737
+ .argument("[invitation-id]", "Invitation ID (if first arg is app ID)")
738
+ .option("--app <app-id>", "App ID")
739
+ .option("-y, --yes", "Skip confirmation prompt")
740
+ .action(async (appIdOrInvId, invIdOrUndefined, options) => {
741
+ let resolvedAppId;
742
+ let invitationId;
743
+ if (invIdOrUndefined && !invIdOrUndefined.startsWith("-")) {
744
+ resolvedAppId = resolveAppId(appIdOrInvId, options);
745
+ invitationId = invIdOrUndefined;
746
+ }
747
+ else {
748
+ resolvedAppId = resolveAppId(undefined, options);
749
+ invitationId = appIdOrInvId;
750
+ }
751
+ if (!invitationId) {
752
+ error("Invitation ID is required.");
753
+ process.exit(1);
754
+ }
755
+ if (!options.yes) {
756
+ let confirm;
757
+ try {
758
+ confirm = await confirmPrompt(`Delete admin invitation ${invitationId}?`);
759
+ }
760
+ catch (err) {
761
+ error(err.message);
762
+ process.exit(1);
763
+ }
764
+ if (!confirm) {
765
+ info("Cancelled.");
766
+ return;
767
+ }
768
+ }
769
+ const client = new ApiClient();
770
+ try {
771
+ // Look up the admin invitation's email before deleting, so we can cross-delete
772
+ let invEmail;
773
+ try {
774
+ const adminInvitations = await client.listAppAdminInvitations(resolvedAppId);
775
+ const match = adminInvitations.find((inv) => inv.invitationId === invitationId);
776
+ invEmail = match?.email;
777
+ }
778
+ catch {
779
+ // Non-fatal
780
+ }
781
+ await client.deleteAppAdminInvitation(resolvedAppId, invitationId);
782
+ // Cross-delete matching app-level invitations by email
783
+ if (invEmail) {
784
+ try {
785
+ const appInvitations = await client.listInvitations(resolvedAppId);
786
+ const matching = appInvitations.items.filter((inv) => inv.email === invEmail && !inv.accepted);
787
+ for (const inv of matching) {
788
+ await client.deleteInvitation(resolvedAppId, inv.invitationId);
789
+ }
790
+ }
791
+ catch {
792
+ // Non-fatal
793
+ }
794
+ }
795
+ success(`Invitation ${invitationId} deleted.`);
796
+ }
797
+ catch (err) {
798
+ error(err.message);
799
+ process.exit(1);
800
+ }
801
+ });
284
802
  }
285
803
  //# sourceMappingURL=users.js.map