primitive-admin 1.1.0-alpha.7 → 1.1.0-alpha.71

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 (438) hide show
  1. package/README.md +404 -80
  2. package/assets/skill/skills/primitive-platform/SKILL.md +808 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +294 -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 +138 -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 +544 -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 +51 -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 +177 -7
  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 +92 -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 +479 -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 +171 -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 +471 -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 +2140 -112
  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 +1357 -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 +333 -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/group-type-configs.d.ts +2 -0
  64. package/dist/src/commands/group-type-configs.js +86 -0
  65. package/dist/src/commands/group-type-configs.js.map +1 -0
  66. package/dist/src/commands/groups.d.ts +2 -0
  67. package/dist/src/commands/groups.js +38 -99
  68. package/dist/src/commands/groups.js.map +1 -1
  69. package/dist/src/commands/guides.d.ts +223 -0
  70. package/dist/src/commands/guides.js +617 -65
  71. package/dist/src/commands/guides.js.map +1 -1
  72. package/dist/src/commands/init.d.ts +25 -0
  73. package/dist/src/commands/init.js +1605 -208
  74. package/dist/src/commands/init.js.map +1 -1
  75. package/dist/src/commands/integrations.d.ts +2 -0
  76. package/dist/src/commands/integrations.js +380 -178
  77. package/dist/src/commands/integrations.js.map +1 -1
  78. package/dist/src/commands/llm.d.ts +2 -0
  79. package/dist/src/commands/llm.js +4 -2
  80. package/dist/src/commands/llm.js.map +1 -1
  81. package/dist/src/commands/locks.d.ts +8 -0
  82. package/dist/src/commands/locks.js +160 -0
  83. package/dist/src/commands/locks.js.map +1 -0
  84. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  85. package/dist/src/commands/metadata-category-configs.js +112 -0
  86. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  87. package/dist/src/commands/metadata.d.ts +2 -0
  88. package/dist/src/commands/metadata.js +281 -0
  89. package/dist/src/commands/metadata.js.map +1 -0
  90. package/dist/src/commands/prompts.d.ts +2 -0
  91. package/dist/src/commands/prompts.js +225 -584
  92. package/dist/src/commands/prompts.js.map +1 -1
  93. package/dist/src/commands/rule-sets.d.ts +3 -0
  94. package/dist/src/commands/rule-sets.js +272 -0
  95. package/dist/src/commands/rule-sets.js.map +1 -0
  96. package/dist/src/commands/scripts.d.ts +20 -0
  97. package/dist/src/commands/scripts.js +554 -0
  98. package/dist/src/commands/scripts.js.map +1 -0
  99. package/dist/src/commands/secrets.d.ts +2 -0
  100. package/dist/src/commands/secrets.js +108 -0
  101. package/dist/src/commands/secrets.js.map +1 -0
  102. package/dist/src/commands/sessions.d.ts +2 -0
  103. package/dist/src/commands/sessions.js +75 -0
  104. package/dist/src/commands/sessions.js.map +1 -0
  105. package/dist/src/commands/skill.d.ts +2 -0
  106. package/dist/src/commands/skill.js +29 -0
  107. package/dist/src/commands/skill.js.map +1 -0
  108. package/dist/src/commands/sync-app-settings.d.ts +158 -0
  109. package/dist/src/commands/sync-app-settings.js +330 -0
  110. package/dist/src/commands/sync-app-settings.js.map +1 -0
  111. package/dist/src/commands/sync.d.ts +2323 -0
  112. package/dist/src/commands/sync.js +15065 -843
  113. package/dist/src/commands/sync.js.map +1 -1
  114. package/dist/src/commands/tokens.d.ts +2 -0
  115. package/dist/src/commands/tokens.js +130 -21
  116. package/dist/src/commands/tokens.js.map +1 -1
  117. package/dist/src/commands/users.d.ts +2 -0
  118. package/dist/src/commands/users.js +532 -23
  119. package/dist/src/commands/users.js.map +1 -1
  120. package/dist/src/commands/vars.d.ts +8 -0
  121. package/dist/src/commands/vars.js +96 -0
  122. package/dist/src/commands/vars.js.map +1 -0
  123. package/dist/src/commands/waitlist.d.ts +2 -0
  124. package/dist/src/commands/waitlist.js +10 -10
  125. package/dist/src/commands/waitlist.js.map +1 -1
  126. package/dist/src/commands/webhooks.d.ts +2 -0
  127. package/dist/src/commands/webhooks.js +562 -0
  128. package/dist/src/commands/webhooks.js.map +1 -0
  129. package/dist/src/commands/workflows.d.ts +116 -0
  130. package/dist/src/commands/workflows.js +1583 -681
  131. package/dist/src/commands/workflows.js.map +1 -1
  132. package/dist/src/lib/access-rule-display.d.ts +21 -0
  133. package/dist/src/lib/access-rule-display.js +34 -0
  134. package/dist/src/lib/access-rule-display.js.map +1 -0
  135. package/dist/src/lib/api-client.d.ts +1936 -0
  136. package/dist/src/lib/api-client.js +1826 -138
  137. package/dist/src/lib/api-client.js.map +1 -1
  138. package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
  139. package/dist/src/lib/app-settings-descriptor.js +575 -0
  140. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  141. package/dist/src/lib/auth-flow.d.ts +8 -0
  142. package/dist/src/lib/batch.d.ts +26 -0
  143. package/dist/src/lib/batch.js +32 -0
  144. package/dist/src/lib/batch.js.map +1 -0
  145. package/dist/src/lib/block-layout.d.ts +160 -0
  146. package/dist/src/lib/block-layout.js +451 -0
  147. package/dist/src/lib/block-layout.js.map +1 -0
  148. package/dist/src/lib/canonical-json.d.ts +12 -0
  149. package/dist/src/lib/canonical-json.js +35 -0
  150. package/dist/src/lib/canonical-json.js.map +1 -0
  151. package/dist/src/lib/channel.d.ts +30 -0
  152. package/dist/src/lib/channel.js +68 -0
  153. package/dist/src/lib/channel.js.map +1 -0
  154. package/dist/src/lib/cli-manifest.d.ts +68 -0
  155. package/dist/src/lib/cli-manifest.js +71 -0
  156. package/dist/src/lib/cli-manifest.js.map +1 -0
  157. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
  158. package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
  159. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  160. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  161. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  162. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  163. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +68 -0
  164. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +168 -0
  165. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  166. package/dist/src/lib/config-object-descriptor.d.ts +127 -0
  167. package/dist/src/lib/config-object-descriptor.js +658 -0
  168. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  169. package/dist/src/lib/config-payload.d.ts +85 -0
  170. package/dist/src/lib/config-payload.js +116 -0
  171. package/dist/src/lib/config-payload.js.map +1 -0
  172. package/dist/src/lib/config-surface.d.ts +130 -0
  173. package/dist/src/lib/config-surface.js +300 -0
  174. package/dist/src/lib/config-surface.js.map +1 -0
  175. package/dist/src/lib/config-toml.d.ts +10 -0
  176. package/dist/src/lib/config-toml.js +42 -0
  177. package/dist/src/lib/config-toml.js.map +1 -0
  178. package/dist/src/lib/config.d.ts +53 -0
  179. package/dist/src/lib/config.js +92 -53
  180. package/dist/src/lib/config.js.map +1 -1
  181. package/dist/src/lib/confirm-prompt.d.ts +83 -0
  182. package/dist/src/lib/confirm-prompt.js +110 -0
  183. package/dist/src/lib/confirm-prompt.js.map +1 -0
  184. package/dist/src/lib/constants.d.ts +11 -0
  185. package/dist/src/lib/constants.js +12 -0
  186. package/dist/src/lib/constants.js.map +1 -0
  187. package/dist/src/lib/crash-handlers.d.ts +20 -0
  188. package/dist/src/lib/crash-handlers.js +49 -0
  189. package/dist/src/lib/crash-handlers.js.map +1 -0
  190. package/dist/src/lib/credentials-store.d.ts +89 -0
  191. package/dist/src/lib/credentials-store.js +330 -0
  192. package/dist/src/lib/credentials-store.js.map +1 -0
  193. package/dist/src/lib/csv.d.ts +47 -0
  194. package/dist/src/lib/csv.js +172 -0
  195. package/dist/src/lib/csv.js.map +1 -0
  196. package/dist/src/lib/data-input.d.ts +23 -0
  197. package/dist/src/lib/data-input.js +50 -0
  198. package/dist/src/lib/data-input.js.map +1 -0
  199. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  200. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  201. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  202. package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
  203. package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
  204. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  205. package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
  206. package/dist/src/lib/db-codegen/dbNaming.js +180 -0
  207. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  208. package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
  209. package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
  210. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  211. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
  212. package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
  213. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  214. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
  215. package/dist/src/lib/db-codegen/dbTypeIR.js +517 -0
  216. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
  217. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
  218. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
  219. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
  220. package/dist/src/lib/env-resolver-core.d.ts +147 -0
  221. package/dist/src/lib/env-resolver-core.js +265 -0
  222. package/dist/src/lib/env-resolver-core.js.map +1 -0
  223. package/dist/src/lib/env-resolver.d.ts +84 -0
  224. package/dist/src/lib/env-resolver.js +133 -0
  225. package/dist/src/lib/env-resolver.js.map +1 -0
  226. package/dist/src/lib/fetch.d.ts +5 -0
  227. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  228. package/dist/src/lib/generated-allowlist.js +277 -0
  229. package/dist/src/lib/generated-allowlist.js.map +1 -0
  230. package/dist/src/lib/generated-config-surfaces.d.ts +682 -0
  231. package/dist/src/lib/generated-config-surfaces.js +4058 -0
  232. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  233. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  234. package/dist/src/lib/generated-template-lint.js +624 -0
  235. package/dist/src/lib/generated-template-lint.js.map +1 -0
  236. package/dist/src/lib/init-adopt.d.ts +16 -0
  237. package/dist/src/lib/init-adopt.js +34 -0
  238. package/dist/src/lib/init-adopt.js.map +1 -0
  239. package/dist/src/lib/init-assets.d.ts +39 -0
  240. package/dist/src/lib/init-assets.js +97 -0
  241. package/dist/src/lib/init-assets.js.map +1 -0
  242. package/dist/src/lib/init-config.d.ts +98 -0
  243. package/dist/src/lib/init-config.js +186 -0
  244. package/dist/src/lib/init-config.js.map +1 -0
  245. package/dist/src/lib/init-ios-links.d.ts +50 -0
  246. package/dist/src/lib/init-ios-links.js +153 -0
  247. package/dist/src/lib/init-ios-links.js.map +1 -0
  248. package/dist/src/lib/init-plan.d.ts +80 -0
  249. package/dist/src/lib/init-plan.js +95 -0
  250. package/dist/src/lib/init-plan.js.map +1 -0
  251. package/dist/src/lib/init-production-env.d.ts +48 -0
  252. package/dist/src/lib/init-production-env.js +59 -0
  253. package/dist/src/lib/init-production-env.js.map +1 -0
  254. package/dist/src/lib/init-schema.d.ts +74 -0
  255. package/dist/src/lib/init-schema.js +358 -0
  256. package/dist/src/lib/init-schema.js.map +1 -0
  257. package/dist/src/lib/init-xcode.d.ts +33 -0
  258. package/dist/src/lib/init-xcode.js +114 -0
  259. package/dist/src/lib/init-xcode.js.map +1 -0
  260. package/dist/src/lib/integration-request-config.d.ts +30 -0
  261. package/dist/src/lib/integration-request-config.js +145 -0
  262. package/dist/src/lib/integration-request-config.js.map +1 -0
  263. package/dist/src/lib/local-state.d.ts +55 -0
  264. package/dist/src/lib/local-state.js +167 -0
  265. package/dist/src/lib/local-state.js.map +1 -0
  266. package/dist/src/lib/log-inspection.d.ts +568 -0
  267. package/dist/src/lib/log-inspection.js +639 -0
  268. package/dist/src/lib/log-inspection.js.map +1 -0
  269. package/dist/src/lib/migration-nag.d.ts +49 -0
  270. package/dist/src/lib/migration-nag.js +163 -0
  271. package/dist/src/lib/migration-nag.js.map +1 -0
  272. package/dist/src/lib/object-status-filter.d.ts +22 -0
  273. package/dist/src/lib/object-status-filter.js +45 -0
  274. package/dist/src/lib/object-status-filter.js.map +1 -0
  275. package/dist/src/lib/output.d.ts +109 -0
  276. package/dist/src/lib/output.js +191 -8
  277. package/dist/src/lib/output.js.map +1 -1
  278. package/dist/src/lib/package-manager.d.ts +140 -0
  279. package/dist/src/lib/package-manager.js +305 -0
  280. package/dist/src/lib/package-manager.js.map +1 -0
  281. package/dist/src/lib/paginate.d.ts +83 -0
  282. package/dist/src/lib/paginate.js +95 -0
  283. package/dist/src/lib/paginate.js.map +1 -0
  284. package/dist/src/lib/platform-owned.d.ts +63 -0
  285. package/dist/src/lib/platform-owned.js +85 -0
  286. package/dist/src/lib/platform-owned.js.map +1 -0
  287. package/dist/src/lib/project-config.d.ts +97 -0
  288. package/dist/src/lib/project-config.js +217 -0
  289. package/dist/src/lib/project-config.js.map +1 -0
  290. package/dist/src/lib/query-operators.d.ts +43 -0
  291. package/dist/src/lib/query-operators.js +80 -0
  292. package/dist/src/lib/query-operators.js.map +1 -0
  293. package/dist/src/lib/record-filter.d.ts +18 -0
  294. package/dist/src/lib/record-filter.js +55 -0
  295. package/dist/src/lib/record-filter.js.map +1 -0
  296. package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
  297. package/dist/src/lib/refresh-admin-credentials.js +103 -0
  298. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  299. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  300. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  301. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  302. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  303. package/dist/src/lib/resolve-init-server.js +77 -0
  304. package/dist/src/lib/resolve-init-server.js.map +1 -0
  305. package/dist/src/lib/resolve-platform.d.ts +74 -0
  306. package/dist/src/lib/resolve-platform.js +105 -0
  307. package/dist/src/lib/resolve-platform.js.map +1 -0
  308. package/dist/src/lib/run-status.d.ts +19 -0
  309. package/dist/src/lib/run-status.generated.d.ts +39 -0
  310. package/dist/src/lib/run-status.generated.js +66 -0
  311. package/dist/src/lib/run-status.generated.js.map +1 -0
  312. package/dist/src/lib/run-status.js +19 -0
  313. package/dist/src/lib/run-status.js.map +1 -0
  314. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  315. package/dist/src/lib/server-text-normalization.js +90 -0
  316. package/dist/src/lib/server-text-normalization.js.map +1 -0
  317. package/dist/src/lib/server-url.d.ts +22 -0
  318. package/dist/src/lib/server-url.js +33 -0
  319. package/dist/src/lib/server-url.js.map +1 -0
  320. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  321. package/dist/src/lib/signing-secret-status.js +116 -0
  322. package/dist/src/lib/signing-secret-status.js.map +1 -0
  323. package/dist/src/lib/skill-installer.d.ts +25 -0
  324. package/dist/src/lib/skill-installer.js +266 -0
  325. package/dist/src/lib/skill-installer.js.map +1 -0
  326. package/dist/src/lib/snapshots.d.ts +99 -0
  327. package/dist/src/lib/snapshots.js +357 -0
  328. package/dist/src/lib/snapshots.js.map +1 -0
  329. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
  330. package/dist/src/lib/swift-codegen/dbGenerator.js +914 -0
  331. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  332. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  333. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  334. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  335. package/dist/src/lib/swift-codegen/generator.d.ts +94 -0
  336. package/dist/src/lib/swift-codegen/generator.js +440 -0
  337. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  338. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +72 -0
  339. package/dist/src/lib/swift-codegen/schemaToSwift.js +644 -0
  340. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  341. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
  342. package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
  343. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  344. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  345. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  346. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  347. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  348. package/dist/src/lib/sync-dir-selector.js +30 -0
  349. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  350. package/dist/src/lib/sync-paths.d.ts +111 -0
  351. package/dist/src/lib/sync-paths.js +198 -0
  352. package/dist/src/lib/sync-paths.js.map +1 -0
  353. package/dist/src/lib/sync-resource-types.d.ts +544 -0
  354. package/dist/src/lib/sync-resource-types.js +975 -0
  355. package/dist/src/lib/sync-resource-types.js.map +1 -0
  356. package/dist/src/lib/sync-selectors.d.ts +95 -0
  357. package/dist/src/lib/sync-selectors.js +228 -0
  358. package/dist/src/lib/sync-selectors.js.map +1 -0
  359. package/dist/src/lib/template.d.ts +170 -0
  360. package/dist/src/lib/template.js +484 -68
  361. package/dist/src/lib/template.js.map +1 -1
  362. package/dist/src/lib/test-case-keys.d.ts +29 -0
  363. package/dist/src/lib/test-case-keys.js +55 -0
  364. package/dist/src/lib/test-case-keys.js.map +1 -0
  365. package/dist/src/lib/test-case-variables.d.ts +15 -0
  366. package/dist/src/lib/test-case-variables.js +29 -0
  367. package/dist/src/lib/test-case-variables.js.map +1 -0
  368. package/dist/src/lib/token-inject.d.ts +56 -0
  369. package/dist/src/lib/token-inject.js +204 -0
  370. package/dist/src/lib/token-inject.js.map +1 -0
  371. package/dist/src/lib/toml-database-config.d.ts +123 -0
  372. package/dist/src/lib/toml-database-config.js +527 -0
  373. package/dist/src/lib/toml-database-config.js.map +1 -0
  374. package/dist/src/lib/toml-metadata-config.d.ts +151 -0
  375. package/dist/src/lib/toml-metadata-config.js +476 -0
  376. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  377. package/dist/src/lib/toml-native-form.d.ts +46 -0
  378. package/dist/src/lib/toml-native-form.js +78 -0
  379. package/dist/src/lib/toml-native-form.js.map +1 -0
  380. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  381. package/dist/src/lib/toml-params-validator.js +298 -0
  382. package/dist/src/lib/toml-params-validator.js.map +1 -0
  383. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  384. package/dist/src/lib/toml-scalar-edit.js +283 -0
  385. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  386. package/dist/src/lib/user-selector.d.ts +24 -0
  387. package/dist/src/lib/user-selector.js +33 -0
  388. package/dist/src/lib/user-selector.js.map +1 -0
  389. package/dist/src/lib/version-check.d.ts +35 -0
  390. package/dist/src/lib/version-check.js +241 -0
  391. package/dist/src/lib/version-check.js.map +1 -0
  392. package/dist/src/lib/watch.d.ts +121 -0
  393. package/dist/src/lib/watch.js +169 -0
  394. package/dist/src/lib/watch.js.map +1 -0
  395. package/dist/src/lib/workflow-apply.d.ts +110 -0
  396. package/dist/src/lib/workflow-apply.js +164 -0
  397. package/dist/src/lib/workflow-apply.js.map +1 -0
  398. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  399. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  400. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  401. package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
  402. package/dist/src/lib/workflow-codegen/generator.js +361 -0
  403. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  404. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
  405. package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
  406. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  407. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  408. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  409. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  410. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
  411. package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
  412. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  413. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  414. package/dist/src/lib/workflow-config-apply.js +137 -0
  415. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  416. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  417. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  418. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  419. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  420. package/dist/src/lib/workflow-defaults.js +41 -0
  421. package/dist/src/lib/workflow-defaults.js.map +1 -0
  422. package/dist/src/lib/workflow-fragments.d.ts +64 -0
  423. package/dist/src/lib/workflow-fragments.js +342 -0
  424. package/dist/src/lib/workflow-fragments.js.map +1 -0
  425. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  426. package/dist/src/lib/workflow-include-preserve.js +286 -0
  427. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  428. package/dist/src/lib/workflow-payload.d.ts +98 -0
  429. package/dist/src/lib/workflow-payload.js +178 -0
  430. package/dist/src/lib/workflow-payload.js.map +1 -0
  431. package/dist/src/lib/workflow-toml-validator.d.ts +202 -0
  432. package/dist/src/lib/workflow-toml-validator.js +757 -0
  433. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  434. package/dist/src/types/index.d.ts +581 -0
  435. package/dist/src/validators.d.ts +65 -0
  436. package/dist/src/validators.js +64 -0
  437. package/dist/src/validators.js.map +1 -0
  438. package/package.json +32 -8
@@ -1,6 +1,7 @@
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";
4
5
  export function registerUsersCommands(program) {
5
6
  const users = program
6
7
  .command("users")
@@ -8,23 +9,40 @@ export function registerUsersCommands(program) {
8
9
  .addHelpText("after", `
9
10
  Examples:
10
11
  $ primitive users list
12
+ $ primitive users create user@example.com --role admin
11
13
  $ primitive users invite user@example.com --role admin
12
14
  $ primitive users set-role 01HXY... member
15
+ $ primitive users mint-jwt <user-id>
13
16
  `);
14
17
  // List users
15
18
  users
16
19
  .command("list")
17
- .description("List users in an app")
20
+ .description("List users in an app, optionally filtered by --search")
18
21
  .argument("[app-id]", "App ID (uses current app if not specified)")
19
22
  .option("--app <app-id>", "App ID")
23
+ .option("--search <query>", "Filter users. ULID -> userId lookup; contains '@' -> email lookup; otherwise substring name search.")
20
24
  .option("--json", "Output as JSON")
21
25
  .action(async (appId, options) => {
22
26
  const resolvedAppId = resolveAppId(appId, options);
23
27
  const client = new ApiClient();
28
+ const params = {};
29
+ if (options.search) {
30
+ const q = String(options.search).trim();
31
+ // ULID is exactly 26 chars from Crockford's base32 alphabet (excludes I,L,O,U).
32
+ // Match case-insensitively because users paste IDs from various sources.
33
+ const isUlid = /^[0-9A-HJKMNP-TV-Z]{26}$/i.test(q);
34
+ if (isUlid)
35
+ params.userId = q;
36
+ else if (q.includes("@"))
37
+ params.email = q;
38
+ else
39
+ params.name = q;
40
+ }
24
41
  try {
25
- const usersList = await client.listUsers(resolvedAppId);
42
+ const result = await client.listUsers(resolvedAppId, params);
43
+ const usersList = result.items;
26
44
  if (options.json) {
27
- json(usersList);
45
+ json(result);
28
46
  return;
29
47
  }
30
48
  if (!usersList || usersList.length === 0) {
@@ -36,8 +54,98 @@ Examples:
36
54
  { header: "EMAIL", key: "email" },
37
55
  { header: "NAME", key: "name" },
38
56
  { header: "ROLE", key: "role" },
57
+ // #2803 — a disabled user rendered exactly like an active one, so
58
+ // the list said nothing about the state the console could put them
59
+ // in. `disabled` reads plainly next to the role.
60
+ {
61
+ header: "STATUS",
62
+ key: "status",
63
+ format: (value) => String(value || "active") === "disabled" ? "disabled" : "active",
64
+ },
39
65
  { header: "ADDED", key: "addedAt", format: formatDate },
40
66
  ]));
67
+ if (result.nextCursor) {
68
+ info(`(${usersList.length}+ shown — more pages available)`);
69
+ }
70
+ }
71
+ catch (err) {
72
+ error(err.message);
73
+ process.exit(1);
74
+ }
75
+ });
76
+ // Create user (add by email)
77
+ users
78
+ .command("create")
79
+ .description("Create a user in an app (or add an existing user by email)")
80
+ .argument("<email>", "Email address")
81
+ .option("--role <role>", "Role: admin or member", "member")
82
+ .option("--app <app-id>", "App ID")
83
+ .option("--json", "Output as JSON")
84
+ .action(async (email, options) => {
85
+ const resolvedAppId = resolveAppId(undefined, options);
86
+ const client = new ApiClient();
87
+ try {
88
+ const result = await client.addUserByEmail(resolvedAppId, {
89
+ email,
90
+ role: options.role,
91
+ });
92
+ if (options.json) {
93
+ json(result);
94
+ return;
95
+ }
96
+ success(result.message || `User ${email} added.`);
97
+ if (result.userId)
98
+ keyValue("User ID", result.userId);
99
+ if (result.email)
100
+ keyValue("Email", result.email);
101
+ }
102
+ catch (err) {
103
+ error(err.message);
104
+ process.exit(1);
105
+ }
106
+ });
107
+ // Mint test JWT
108
+ users
109
+ .command("mint-jwt")
110
+ .description("Mint a test JWT for a user (dev/test environments only)")
111
+ .argument("<user-id>", "User ID")
112
+ .option("--role <role>", "Role override for the JWT")
113
+ .option("--app <app-id>", "App ID")
114
+ .option("--json", "Output as JSON")
115
+ .action(async (userId, options) => {
116
+ const resolvedAppId = resolveAppId(undefined, options);
117
+ const client = new ApiClient();
118
+ try {
119
+ const result = await client.mintTestJwt(resolvedAppId, userId, options.role);
120
+ if (options.json) {
121
+ json(result);
122
+ return;
123
+ }
124
+ success("JWT minted.");
125
+ console.log(result.token);
126
+ }
127
+ catch (err) {
128
+ error(err.message);
129
+ process.exit(1);
130
+ }
131
+ });
132
+ // Rebuild User._searchText (super-admin only)
133
+ users
134
+ .command("rebuild-search-text")
135
+ .description("Re-save every user in an app to repopulate User._searchText")
136
+ .argument("[app-id]", "App ID (uses current app if not specified)")
137
+ .option("--app <app-id>", "App ID")
138
+ .option("--json", "Output as JSON")
139
+ .action(async (appId, options) => {
140
+ const resolvedAppId = resolveAppId(appId, options);
141
+ const client = new ApiClient();
142
+ try {
143
+ const result = await client.rebuildUserSearchText(resolvedAppId);
144
+ if (options.json) {
145
+ json(result);
146
+ return;
147
+ }
148
+ success(`Reindexed ${result.count} user(s) in ${resolvedAppId}.`);
41
149
  }
42
150
  catch (err) {
43
151
  error(err.message);
@@ -54,6 +162,7 @@ Examples:
54
162
  .option("--role <role>", "Role: admin or member", "member")
55
163
  .option("--send-email", "Send invitation email")
56
164
  .option("--expires-days <days>", "Days until invitation expires", "7")
165
+ .option("--note <note>", "Personal note to include in the invitation email")
57
166
  .option("--json", "Output as JSON")
58
167
  .action(async (appIdOrEmail, emailOrUndefined, options) => {
59
168
  // Handle argument flexibility
@@ -79,11 +188,17 @@ Examples:
79
188
  }
80
189
  const client = new ApiClient();
81
190
  try {
191
+ // When inviting as admin, create the console admin first — the backend
192
+ // enforces the 3-admin limit (single source of truth)
193
+ if (options.role === "admin") {
194
+ await client.addAppAdmin(resolvedAppId, { adminEmail: email });
195
+ }
82
196
  const result = await client.createInvitation(resolvedAppId, {
83
197
  email,
84
198
  role: options.role,
85
199
  expiresInDays: parseInt(options.expiresDays),
86
200
  sendEmail: options.sendEmail || false,
201
+ ...(options.note ? { note: options.note } : {}),
87
202
  });
88
203
  if (options.json) {
89
204
  json(result);
@@ -101,7 +216,7 @@ Examples:
101
216
  // Remove user
102
217
  users
103
218
  .command("remove")
104
- .description("Remove a user from an app")
219
+ .description("Remove a user's membership of an app. To block sign-in without removing them, use `users disable`.")
105
220
  .argument("[app-id]", "App ID (uses current app if not specified)")
106
221
  .argument("<user-id>", "User ID to remove")
107
222
  .option("--app <app-id>", "App ID")
@@ -123,15 +238,14 @@ Examples:
123
238
  process.exit(1);
124
239
  }
125
240
  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
- ]);
241
+ let confirm;
242
+ try {
243
+ confirm = await confirmPrompt(`Remove user ${userId} from app?`);
244
+ }
245
+ catch (err) {
246
+ error(err.message);
247
+ process.exit(1);
248
+ }
135
249
  if (!confirm) {
136
250
  info("Cancelled.");
137
251
  return;
@@ -147,6 +261,89 @@ Examples:
147
261
  process.exit(1);
148
262
  }
149
263
  });
264
+ // #2803 — an app user could be disabled from the console but not from the
265
+ // CLI, and the console could not undo it. Both routes already existed; the
266
+ // operational control just was not reachable. Deliberately distinct from
267
+ // `users remove`, which detaches the membership: disabling blocks the
268
+ // person's auth in this app and is reversible.
269
+ users
270
+ .command("disable")
271
+ .description("Block a user from signing in to an app. Revokes their sessions and API tokens; reversible with `users enable`.")
272
+ .argument("[app-id]", "App ID (uses current app if not specified)")
273
+ .argument("<user-id>", "User ID to disable")
274
+ .option("--app <app-id>", "App ID")
275
+ .option("-y, --yes", "Skip confirmation prompt")
276
+ .action(async (appIdOrUserId, userIdOrUndefined, options) => {
277
+ let resolvedAppId;
278
+ let userId;
279
+ if (userIdOrUndefined) {
280
+ resolvedAppId = resolveAppId(appIdOrUserId, options);
281
+ userId = userIdOrUndefined;
282
+ }
283
+ else {
284
+ resolvedAppId = resolveAppId(undefined, options);
285
+ userId = appIdOrUserId;
286
+ }
287
+ if (!userId) {
288
+ error("User ID is required.");
289
+ process.exit(1);
290
+ }
291
+ if (!options.yes) {
292
+ let confirm;
293
+ try {
294
+ confirm = await confirmPrompt(`Disable user ${userId}? They will be signed out and unable to sign in.`);
295
+ }
296
+ catch (err) {
297
+ error(err.message);
298
+ process.exit(1);
299
+ }
300
+ if (!confirm) {
301
+ info("Cancelled.");
302
+ return;
303
+ }
304
+ }
305
+ const client = new ApiClient();
306
+ try {
307
+ await client.setUserAvailability(resolvedAppId, userId, "disable");
308
+ success(`User ${userId} disabled.`);
309
+ info("Their membership is unchanged — `primitive users enable` restores access.");
310
+ }
311
+ catch (err) {
312
+ error(err.message);
313
+ process.exit(1);
314
+ }
315
+ });
316
+ users
317
+ .command("enable")
318
+ .description("Restore a disabled user's access to an app.")
319
+ .argument("[app-id]", "App ID (uses current app if not specified)")
320
+ .argument("<user-id>", "User ID to enable")
321
+ .option("--app <app-id>", "App ID")
322
+ .action(async (appIdOrUserId, userIdOrUndefined, options) => {
323
+ let resolvedAppId;
324
+ let userId;
325
+ if (userIdOrUndefined) {
326
+ resolvedAppId = resolveAppId(appIdOrUserId, options);
327
+ userId = userIdOrUndefined;
328
+ }
329
+ else {
330
+ resolvedAppId = resolveAppId(undefined, options);
331
+ userId = appIdOrUserId;
332
+ }
333
+ if (!userId) {
334
+ error("User ID is required.");
335
+ process.exit(1);
336
+ }
337
+ const client = new ApiClient();
338
+ try {
339
+ await client.setUserAvailability(resolvedAppId, userId, "enable");
340
+ success(`User ${userId} enabled.`);
341
+ }
342
+ catch (err) {
343
+ error(err.message);
344
+ process.exit(1);
345
+ }
346
+ });
150
347
  // Set user role
151
348
  users
152
349
  .command("set-role")
@@ -218,15 +415,14 @@ Examples:
218
415
  process.exit(1);
219
416
  }
220
417
  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
- ]);
418
+ let confirm;
419
+ try {
420
+ confirm = await confirmPrompt(`Transfer ownership of app to ${target}? This cannot be undone.`);
421
+ }
422
+ catch (err) {
423
+ error(err.message);
424
+ process.exit(1);
425
+ }
230
426
  if (!confirm) {
231
427
  info("Cancelled.");
232
428
  return;
@@ -260,7 +456,8 @@ Examples:
260
456
  const resolvedAppId = resolveAppId(appId, options);
261
457
  const client = new ApiClient();
262
458
  try {
263
- const invitations = await client.listInvitations(resolvedAppId);
459
+ const result = await client.listInvitations(resolvedAppId);
460
+ const invitations = result.items;
264
461
  if (options.json) {
265
462
  json(invitations);
266
463
  return;
@@ -281,5 +478,317 @@ Examples:
281
478
  process.exit(1);
282
479
  }
283
480
  });
481
+ // --- Console admins subcommands ---
482
+ const admins = users
483
+ .command("admins")
484
+ .description("Manage console admins for an app");
485
+ // List console admins
486
+ admins
487
+ .command("list")
488
+ .description("List console admins for an app")
489
+ .argument("[app-id]", "App ID (uses current app if not specified)")
490
+ .option("--app <app-id>", "App ID")
491
+ .option("--json", "Output as JSON")
492
+ .action(async (appId, options) => {
493
+ const resolvedAppId = resolveAppId(appId, options);
494
+ const client = new ApiClient();
495
+ try {
496
+ const adminsList = await client.listAppAdmins(resolvedAppId);
497
+ if (options.json) {
498
+ json(adminsList);
499
+ return;
500
+ }
501
+ if (!adminsList || adminsList.length === 0) {
502
+ info("No console admins found.");
503
+ return;
504
+ }
505
+ console.log(formatTable(adminsList, [
506
+ { header: "ADMIN ID", key: "adminId", format: formatId },
507
+ { header: "EMAIL", key: "email" },
508
+ { header: "NAME", key: "name" },
509
+ { header: "ROLE", key: "role" },
510
+ { header: "ASSIGNED", key: "assignedAt", format: formatDate },
511
+ ]));
512
+ }
513
+ catch (err) {
514
+ error(err.message);
515
+ process.exit(1);
516
+ }
517
+ });
518
+ // Add console admin
519
+ admins
520
+ .command("add")
521
+ .description("Add a console admin to an app (creates invitation if admin account doesn't exist)")
522
+ .argument("[app-id-or-email]", "App ID or admin email")
523
+ .argument("[email]", "Admin email address (if first arg is app ID)")
524
+ .option("--app <app-id>", "App ID")
525
+ .option("--json", "Output as JSON")
526
+ .action(async (appIdOrEmail, emailOrUndefined, options) => {
527
+ let resolvedAppId;
528
+ let email;
529
+ if (emailOrUndefined && !emailOrUndefined.startsWith("-")) {
530
+ resolvedAppId = resolveAppId(appIdOrEmail, options);
531
+ email = emailOrUndefined;
532
+ }
533
+ else if (appIdOrEmail?.includes("@")) {
534
+ resolvedAppId = resolveAppId(undefined, options);
535
+ email = appIdOrEmail;
536
+ }
537
+ else {
538
+ resolvedAppId = resolveAppId(appIdOrEmail, options);
539
+ email = emailOrUndefined;
540
+ }
541
+ if (!email) {
542
+ error("Email is required.");
543
+ process.exit(1);
544
+ }
545
+ const client = new ApiClient();
546
+ try {
547
+ const result = await client.addAppAdmin(resolvedAppId, {
548
+ adminEmail: email,
549
+ });
550
+ // Also create an app-level invitation with role "admin"
551
+ try {
552
+ await client.createInvitation(resolvedAppId, {
553
+ email,
554
+ role: "admin",
555
+ expiresInDays: 7,
556
+ sendEmail: false,
557
+ });
558
+ }
559
+ catch {
560
+ // Non-fatal: console admin was created, app invitation may already exist
561
+ }
562
+ if (options.json) {
563
+ json(result);
564
+ return;
565
+ }
566
+ if (result.status === "invited") {
567
+ success(`Invitation sent to ${email}`);
568
+ if (result.invitation) {
569
+ keyValue("Invitation ID", result.invitation.invitationId);
570
+ if (result.invitation.expiresAt) {
571
+ keyValue("Expires", formatDate(result.invitation.expiresAt));
572
+ }
573
+ }
574
+ }
575
+ else {
576
+ success(result.message || `Admin ${email} added.`);
577
+ if (result.admin) {
578
+ keyValue("Admin ID", result.admin.adminId);
579
+ }
580
+ }
581
+ }
582
+ catch (err) {
583
+ error(err.message);
584
+ process.exit(1);
585
+ }
586
+ });
587
+ // Remove console admin
588
+ admins
589
+ .command("remove")
590
+ .description("Remove a console admin from an app")
591
+ .argument("[app-id-or-admin-id]", "App ID or admin ID")
592
+ .argument("[admin-id]", "Admin ID (if first arg is app ID)")
593
+ .option("--app <app-id>", "App ID")
594
+ .option("-y, --yes", "Skip confirmation prompt")
595
+ .action(async (appIdOrAdminId, adminIdOrUndefined, options) => {
596
+ let resolvedAppId;
597
+ let adminId;
598
+ if (adminIdOrUndefined && !adminIdOrUndefined.startsWith("-")) {
599
+ resolvedAppId = resolveAppId(appIdOrAdminId, options);
600
+ adminId = adminIdOrUndefined;
601
+ }
602
+ else {
603
+ resolvedAppId = resolveAppId(undefined, options);
604
+ adminId = appIdOrAdminId;
605
+ }
606
+ if (!adminId) {
607
+ error("Admin ID is required.");
608
+ process.exit(1);
609
+ }
610
+ if (!options.yes) {
611
+ let confirm;
612
+ try {
613
+ confirm = await confirmPrompt(`Remove admin ${adminId} from app?`);
614
+ }
615
+ catch (err) {
616
+ error(err.message);
617
+ process.exit(1);
618
+ }
619
+ if (!confirm) {
620
+ info("Cancelled.");
621
+ return;
622
+ }
623
+ }
624
+ const client = new ApiClient();
625
+ try {
626
+ await client.removeAppAdmin(resolvedAppId, adminId);
627
+ success(`Admin ${adminId} removed.`);
628
+ }
629
+ catch (err) {
630
+ error(err.message);
631
+ process.exit(1);
632
+ }
633
+ });
634
+ // Transfer ownership
635
+ admins
636
+ .command("transfer-owner")
637
+ .description("Transfer app ownership to another admin")
638
+ .argument("[app-id-or-target]", "App ID or new owner's email/admin ID")
639
+ .argument("[email-or-admin-id]", "New owner's email or admin ID (if first arg is app ID)")
640
+ .option("--app <app-id>", "App ID")
641
+ .option("-y, --yes", "Skip confirmation prompt")
642
+ .action(async (appIdOrTarget, targetOrUndefined, options) => {
643
+ let resolvedAppId;
644
+ let target;
645
+ if (targetOrUndefined && !targetOrUndefined.startsWith("-")) {
646
+ resolvedAppId = resolveAppId(appIdOrTarget, options);
647
+ target = targetOrUndefined;
648
+ }
649
+ else {
650
+ resolvedAppId = resolveAppId(undefined, options);
651
+ target = appIdOrTarget;
652
+ }
653
+ if (!target) {
654
+ error("New owner email or admin ID is required.");
655
+ process.exit(1);
656
+ }
657
+ if (!options.yes) {
658
+ let confirm;
659
+ try {
660
+ confirm = await confirmPrompt(`Transfer ownership of app to ${target}? This cannot be undone.`);
661
+ }
662
+ catch (err) {
663
+ error(err.message);
664
+ process.exit(1);
665
+ }
666
+ if (!confirm) {
667
+ info("Cancelled.");
668
+ return;
669
+ }
670
+ }
671
+ const client = new ApiClient();
672
+ try {
673
+ if (target.includes("@")) {
674
+ await client.transferOwnership(resolvedAppId, target);
675
+ }
676
+ else {
677
+ await client.transferAdminOwnership(resolvedAppId, target);
678
+ }
679
+ success(`Ownership transferred to ${target}`);
680
+ }
681
+ catch (err) {
682
+ error(err.message);
683
+ process.exit(1);
684
+ }
685
+ });
686
+ // --- Admin invitations subcommands ---
687
+ const adminInvitations = users
688
+ .command("admin-invitations")
689
+ .description("Manage console admin invitations for an app");
690
+ // List admin invitations
691
+ adminInvitations
692
+ .command("list")
693
+ .description("List pending console admin invitations")
694
+ .argument("[app-id]", "App ID (uses current app if not specified)")
695
+ .option("--app <app-id>", "App ID")
696
+ .option("--json", "Output as JSON")
697
+ .action(async (appId, options) => {
698
+ const resolvedAppId = resolveAppId(appId, options);
699
+ const client = new ApiClient();
700
+ try {
701
+ const invitationsList = await client.listAppAdminInvitations(resolvedAppId);
702
+ if (options.json) {
703
+ json(invitationsList);
704
+ return;
705
+ }
706
+ if (!invitationsList || invitationsList.length === 0) {
707
+ info("No pending admin invitations.");
708
+ return;
709
+ }
710
+ console.log(formatTable(invitationsList, [
711
+ { header: "ID", key: "invitationId", format: formatId },
712
+ { header: "EMAIL", key: "email" },
713
+ { header: "ROLE", key: "role" },
714
+ { header: "INVITED", key: "invitedAt", format: formatDate },
715
+ { header: "EXPIRES", key: "expiresAt", format: formatDate },
716
+ ]));
717
+ }
718
+ catch (err) {
719
+ error(err.message);
720
+ process.exit(1);
721
+ }
722
+ });
723
+ // Delete admin invitation
724
+ adminInvitations
725
+ .command("delete")
726
+ .description("Delete a pending console admin invitation")
727
+ .argument("[app-id-or-inv-id]", "App ID or invitation ID")
728
+ .argument("[invitation-id]", "Invitation ID (if first arg is app ID)")
729
+ .option("--app <app-id>", "App ID")
730
+ .option("-y, --yes", "Skip confirmation prompt")
731
+ .action(async (appIdOrInvId, invIdOrUndefined, options) => {
732
+ let resolvedAppId;
733
+ let invitationId;
734
+ if (invIdOrUndefined && !invIdOrUndefined.startsWith("-")) {
735
+ resolvedAppId = resolveAppId(appIdOrInvId, options);
736
+ invitationId = invIdOrUndefined;
737
+ }
738
+ else {
739
+ resolvedAppId = resolveAppId(undefined, options);
740
+ invitationId = appIdOrInvId;
741
+ }
742
+ if (!invitationId) {
743
+ error("Invitation ID is required.");
744
+ process.exit(1);
745
+ }
746
+ if (!options.yes) {
747
+ let confirm;
748
+ try {
749
+ confirm = await confirmPrompt(`Delete admin invitation ${invitationId}?`);
750
+ }
751
+ catch (err) {
752
+ error(err.message);
753
+ process.exit(1);
754
+ }
755
+ if (!confirm) {
756
+ info("Cancelled.");
757
+ return;
758
+ }
759
+ }
760
+ const client = new ApiClient();
761
+ try {
762
+ // Look up the admin invitation's email before deleting, so we can cross-delete
763
+ let invEmail;
764
+ try {
765
+ const adminInvitations = await client.listAppAdminInvitations(resolvedAppId);
766
+ const match = adminInvitations.find((inv) => inv.invitationId === invitationId);
767
+ invEmail = match?.email;
768
+ }
769
+ catch {
770
+ // Non-fatal
771
+ }
772
+ await client.deleteAppAdminInvitation(resolvedAppId, invitationId);
773
+ // Cross-delete matching app-level invitations by email
774
+ if (invEmail) {
775
+ try {
776
+ const appInvitations = await client.listInvitations(resolvedAppId);
777
+ const matching = appInvitations.items.filter((inv) => inv.email === invEmail && !inv.accepted);
778
+ for (const inv of matching) {
779
+ await client.deleteInvitation(resolvedAppId, inv.invitationId);
780
+ }
781
+ }
782
+ catch {
783
+ // Non-fatal
784
+ }
785
+ }
786
+ success(`Invitation ${invitationId} deleted.`);
787
+ }
788
+ catch (err) {
789
+ error(err.message);
790
+ process.exit(1);
791
+ }
792
+ });
284
793
  }
285
794
  //# sourceMappingURL=users.js.map