primitive-admin 1.0.60 → 1.0.62

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 (310) hide show
  1. package/README.md +125 -69
  2. package/assets/skill/skills/primitive-platform/SKILL.md +336 -37
  3. package/dist/bin/primitive.js +29 -14
  4. package/dist/bin/primitive.js.map +1 -1
  5. package/dist/src/commands/admins.js +22 -8
  6. package/dist/src/commands/admins.js.map +1 -1
  7. package/dist/src/commands/analytics.js +96 -16
  8. package/dist/src/commands/analytics.js.map +1 -1
  9. package/dist/src/commands/apps.js +49 -188
  10. package/dist/src/commands/apps.js.map +1 -1
  11. package/dist/src/commands/blob-buckets.js +50 -155
  12. package/dist/src/commands/blob-buckets.js.map +1 -1
  13. package/dist/src/commands/collection-type-configs.js +14 -100
  14. package/dist/src/commands/collection-type-configs.js.map +1 -1
  15. package/dist/src/commands/collections.js +47 -8
  16. package/dist/src/commands/collections.js.map +1 -1
  17. package/dist/src/commands/config.d.ts +46 -0
  18. package/dist/src/commands/config.js +479 -0
  19. package/dist/src/commands/config.js.map +1 -0
  20. package/dist/src/commands/connections.d.ts +2 -0
  21. package/dist/src/commands/connections.js +100 -0
  22. package/dist/src/commands/connections.js.map +1 -0
  23. package/dist/src/commands/cron-triggers.js +84 -176
  24. package/dist/src/commands/cron-triggers.js.map +1 -1
  25. package/dist/src/commands/database-type-configs.d.ts +2 -0
  26. package/dist/src/commands/database-type-configs.js +171 -0
  27. package/dist/src/commands/database-type-configs.js.map +1 -0
  28. package/dist/src/commands/database-types.js +4 -4
  29. package/dist/src/commands/database-types.js.map +1 -1
  30. package/dist/src/commands/databases.d.ts +63 -0
  31. package/dist/src/commands/databases.js +649 -87
  32. package/dist/src/commands/databases.js.map +1 -1
  33. package/dist/src/commands/documents.js +869 -12
  34. package/dist/src/commands/documents.js.map +1 -1
  35. package/dist/src/commands/email-templates.js +18 -125
  36. package/dist/src/commands/email-templates.js.map +1 -1
  37. package/dist/src/commands/env.d.ts +12 -1
  38. package/dist/src/commands/env.js +98 -25
  39. package/dist/src/commands/env.js.map +1 -1
  40. package/dist/src/commands/feature-flags.d.ts +14 -0
  41. package/dist/src/commands/feature-flags.js +116 -0
  42. package/dist/src/commands/feature-flags.js.map +1 -0
  43. package/dist/src/commands/group-type-configs.js +14 -109
  44. package/dist/src/commands/group-type-configs.js.map +1 -1
  45. package/dist/src/commands/init.d.ts +9 -1
  46. package/dist/src/commands/init.js +1058 -279
  47. package/dist/src/commands/init.js.map +1 -1
  48. package/dist/src/commands/integrations.js +136 -421
  49. package/dist/src/commands/integrations.js.map +1 -1
  50. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  51. package/dist/src/commands/metadata-category-configs.js +112 -0
  52. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  53. package/dist/src/commands/metadata.js +33 -141
  54. package/dist/src/commands/metadata.js.map +1 -1
  55. package/dist/src/commands/prompts.js +206 -563
  56. package/dist/src/commands/prompts.js.map +1 -1
  57. package/dist/src/commands/rule-sets.d.ts +1 -1
  58. package/dist/src/commands/rule-sets.js +16 -132
  59. package/dist/src/commands/rule-sets.js.map +1 -1
  60. package/dist/src/commands/scripts.js +67 -234
  61. package/dist/src/commands/scripts.js.map +1 -1
  62. package/dist/src/commands/sessions.d.ts +2 -0
  63. package/dist/src/commands/sessions.js +75 -0
  64. package/dist/src/commands/sessions.js.map +1 -0
  65. package/dist/src/commands/skill.js +2 -2
  66. package/dist/src/commands/skill.js.map +1 -1
  67. package/dist/src/commands/sync-app-settings.d.ts +113 -70
  68. package/dist/src/commands/sync-app-settings.js +193 -242
  69. package/dist/src/commands/sync-app-settings.js.map +1 -1
  70. package/dist/src/commands/sync.d.ts +1932 -49
  71. package/dist/src/commands/sync.js +9584 -1725
  72. package/dist/src/commands/sync.js.map +1 -1
  73. package/dist/src/commands/tokens.js +8 -2
  74. package/dist/src/commands/tokens.js.map +1 -1
  75. package/dist/src/commands/users.js +92 -1
  76. package/dist/src/commands/users.js.map +1 -1
  77. package/dist/src/commands/vars.js +44 -58
  78. package/dist/src/commands/vars.js.map +1 -1
  79. package/dist/src/commands/webhooks.js +318 -156
  80. package/dist/src/commands/webhooks.js.map +1 -1
  81. package/dist/src/commands/workflows.d.ts +49 -12
  82. package/dist/src/commands/workflows.js +652 -1043
  83. package/dist/src/commands/workflows.js.map +1 -1
  84. package/dist/src/lib/access-rule-display.d.ts +21 -0
  85. package/dist/src/lib/access-rule-display.js +34 -0
  86. package/dist/src/lib/access-rule-display.js.map +1 -0
  87. package/dist/src/lib/api-client.d.ts +630 -61
  88. package/dist/src/lib/api-client.js +676 -116
  89. package/dist/src/lib/api-client.js.map +1 -1
  90. package/dist/src/lib/app-settings-descriptor.d.ts +180 -25
  91. package/dist/src/lib/app-settings-descriptor.js +403 -82
  92. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  93. package/dist/src/lib/canonical-json.d.ts +12 -0
  94. package/dist/src/lib/canonical-json.js +35 -0
  95. package/dist/src/lib/canonical-json.js.map +1 -0
  96. package/dist/src/lib/cli-manifest.d.ts +8 -0
  97. package/dist/src/lib/cli-manifest.js +1 -0
  98. package/dist/src/lib/cli-manifest.js.map +1 -1
  99. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +6 -2
  100. package/dist/src/lib/codegen-shared/generatedFiles.js +9 -2
  101. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -1
  102. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +6 -6
  103. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +8 -8
  104. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -1
  105. package/dist/src/lib/config-object-descriptor.d.ts +127 -0
  106. package/dist/src/lib/config-object-descriptor.js +658 -0
  107. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  108. package/dist/src/lib/config-payload.d.ts +85 -0
  109. package/dist/src/lib/config-payload.js +116 -0
  110. package/dist/src/lib/config-payload.js.map +1 -0
  111. package/dist/src/lib/config-surface.d.ts +130 -0
  112. package/dist/src/lib/config-surface.js +300 -0
  113. package/dist/src/lib/config-surface.js.map +1 -0
  114. package/dist/src/lib/credentials-store.d.ts +10 -0
  115. package/dist/src/lib/credentials-store.js +23 -0
  116. package/dist/src/lib/credentials-store.js.map +1 -1
  117. package/dist/src/lib/data-input.d.ts +23 -0
  118. package/dist/src/lib/data-input.js +50 -0
  119. package/dist/src/lib/data-input.js.map +1 -0
  120. package/dist/src/lib/db-codegen/dbTemplates.js +1 -1
  121. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
  122. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +1 -1
  123. package/dist/src/lib/env-resolver-core.d.ts +147 -0
  124. package/dist/src/lib/env-resolver-core.js +265 -0
  125. package/dist/src/lib/env-resolver-core.js.map +1 -0
  126. package/dist/src/lib/env-resolver.d.ts +28 -6
  127. package/dist/src/lib/env-resolver.js +44 -32
  128. package/dist/src/lib/env-resolver.js.map +1 -1
  129. package/dist/src/lib/generated-allowlist.js +13 -0
  130. package/dist/src/lib/generated-allowlist.js.map +1 -1
  131. package/dist/src/lib/generated-config-surfaces.d.ts +682 -0
  132. package/dist/src/lib/generated-config-surfaces.js +4058 -0
  133. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  134. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  135. package/dist/src/lib/generated-template-lint.js +624 -0
  136. package/dist/src/lib/generated-template-lint.js.map +1 -0
  137. package/dist/src/lib/init-adopt.d.ts +16 -0
  138. package/dist/src/lib/init-adopt.js +34 -0
  139. package/dist/src/lib/init-adopt.js.map +1 -0
  140. package/dist/src/lib/init-assets.d.ts +39 -0
  141. package/dist/src/lib/init-assets.js +97 -0
  142. package/dist/src/lib/init-assets.js.map +1 -0
  143. package/dist/src/lib/init-config.d.ts +44 -5
  144. package/dist/src/lib/init-config.js +80 -7
  145. package/dist/src/lib/init-config.js.map +1 -1
  146. package/dist/src/lib/init-ios-links.d.ts +50 -0
  147. package/dist/src/lib/init-ios-links.js +153 -0
  148. package/dist/src/lib/init-ios-links.js.map +1 -0
  149. package/dist/src/lib/init-plan.d.ts +80 -0
  150. package/dist/src/lib/init-plan.js +95 -0
  151. package/dist/src/lib/init-plan.js.map +1 -0
  152. package/dist/src/lib/init-production-env.d.ts +48 -0
  153. package/dist/src/lib/init-production-env.js +59 -0
  154. package/dist/src/lib/init-production-env.js.map +1 -0
  155. package/dist/src/lib/init-schema.d.ts +74 -0
  156. package/dist/src/lib/init-schema.js +358 -0
  157. package/dist/src/lib/init-schema.js.map +1 -0
  158. package/dist/src/lib/init-xcode.d.ts +33 -0
  159. package/dist/src/lib/init-xcode.js +114 -0
  160. package/dist/src/lib/init-xcode.js.map +1 -0
  161. package/dist/src/lib/integration-request-config.d.ts +30 -0
  162. package/dist/src/lib/integration-request-config.js +145 -0
  163. package/dist/src/lib/integration-request-config.js.map +1 -0
  164. package/dist/src/lib/local-state.d.ts +55 -0
  165. package/dist/src/lib/local-state.js +167 -0
  166. package/dist/src/lib/local-state.js.map +1 -0
  167. package/dist/src/lib/log-inspection.d.ts +568 -0
  168. package/dist/src/lib/log-inspection.js +639 -0
  169. package/dist/src/lib/log-inspection.js.map +1 -0
  170. package/dist/src/lib/migration-nag.d.ts +2 -2
  171. package/dist/src/lib/migration-nag.js +3 -3
  172. package/dist/src/lib/object-status-filter.d.ts +22 -0
  173. package/dist/src/lib/object-status-filter.js +45 -0
  174. package/dist/src/lib/object-status-filter.js.map +1 -0
  175. package/dist/src/lib/output.d.ts +24 -1
  176. package/dist/src/lib/output.js +42 -1
  177. package/dist/src/lib/output.js.map +1 -1
  178. package/dist/src/lib/package-manager.d.ts +140 -0
  179. package/dist/src/lib/package-manager.js +305 -0
  180. package/dist/src/lib/package-manager.js.map +1 -0
  181. package/dist/src/lib/paginate.d.ts +50 -0
  182. package/dist/src/lib/paginate.js +53 -0
  183. package/dist/src/lib/paginate.js.map +1 -1
  184. package/dist/src/lib/platform-owned.d.ts +29 -3
  185. package/dist/src/lib/platform-owned.js +42 -3
  186. package/dist/src/lib/platform-owned.js.map +1 -1
  187. package/dist/src/lib/project-config.js +13 -5
  188. package/dist/src/lib/project-config.js.map +1 -1
  189. package/dist/src/lib/query-operators.d.ts +1 -1
  190. package/dist/src/lib/query-operators.js +1 -1
  191. package/dist/src/lib/record-filter.d.ts +18 -0
  192. package/dist/src/lib/record-filter.js +55 -0
  193. package/dist/src/lib/record-filter.js.map +1 -0
  194. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  195. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  196. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  197. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  198. package/dist/src/lib/resolve-init-server.js +77 -0
  199. package/dist/src/lib/resolve-init-server.js.map +1 -0
  200. package/dist/src/lib/resolve-platform.d.ts +43 -14
  201. package/dist/src/lib/resolve-platform.js +74 -12
  202. package/dist/src/lib/resolve-platform.js.map +1 -1
  203. package/dist/src/lib/run-status.d.ts +19 -0
  204. package/dist/src/lib/run-status.generated.d.ts +39 -0
  205. package/dist/src/lib/run-status.generated.js +66 -0
  206. package/dist/src/lib/run-status.generated.js.map +1 -0
  207. package/dist/src/lib/run-status.js +19 -0
  208. package/dist/src/lib/run-status.js.map +1 -0
  209. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  210. package/dist/src/lib/server-text-normalization.js +90 -0
  211. package/dist/src/lib/server-text-normalization.js.map +1 -0
  212. package/dist/src/lib/server-url.d.ts +22 -0
  213. package/dist/src/lib/server-url.js +33 -0
  214. package/dist/src/lib/server-url.js.map +1 -0
  215. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  216. package/dist/src/lib/signing-secret-status.js +116 -0
  217. package/dist/src/lib/signing-secret-status.js.map +1 -0
  218. package/dist/src/lib/skill-installer.d.ts +4 -2
  219. package/dist/src/lib/skill-installer.js +143 -12
  220. package/dist/src/lib/skill-installer.js.map +1 -1
  221. package/dist/src/lib/snapshots.d.ts +2 -2
  222. package/dist/src/lib/snapshots.js +2 -2
  223. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +15 -2
  224. package/dist/src/lib/swift-codegen/dbGenerator.js +250 -18
  225. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -1
  226. package/dist/src/lib/swift-codegen/generator.d.ts +11 -2
  227. package/dist/src/lib/swift-codegen/generator.js +181 -7
  228. package/dist/src/lib/swift-codegen/generator.js.map +1 -1
  229. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +7 -3
  230. package/dist/src/lib/swift-codegen/siblingSymbols.js +4 -1
  231. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -1
  232. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  233. package/dist/src/lib/sync-dir-selector.js +30 -0
  234. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  235. package/dist/src/lib/sync-paths.d.ts +39 -0
  236. package/dist/src/lib/sync-paths.js +70 -2
  237. package/dist/src/lib/sync-paths.js.map +1 -1
  238. package/dist/src/lib/sync-resource-types.d.ts +138 -31
  239. package/dist/src/lib/sync-resource-types.js +241 -47
  240. package/dist/src/lib/sync-resource-types.js.map +1 -1
  241. package/dist/src/lib/sync-selectors.d.ts +95 -0
  242. package/dist/src/lib/sync-selectors.js +228 -0
  243. package/dist/src/lib/sync-selectors.js.map +1 -0
  244. package/dist/src/lib/template.d.ts +62 -4
  245. package/dist/src/lib/template.js +147 -39
  246. package/dist/src/lib/template.js.map +1 -1
  247. package/dist/src/lib/test-case-keys.d.ts +29 -0
  248. package/dist/src/lib/test-case-keys.js +55 -0
  249. package/dist/src/lib/test-case-keys.js.map +1 -0
  250. package/dist/src/lib/test-case-variables.d.ts +15 -0
  251. package/dist/src/lib/test-case-variables.js +29 -0
  252. package/dist/src/lib/test-case-variables.js.map +1 -0
  253. package/dist/src/lib/toml-database-config.d.ts +4 -4
  254. package/dist/src/lib/toml-database-config.js +27 -34
  255. package/dist/src/lib/toml-database-config.js.map +1 -1
  256. package/dist/src/lib/toml-metadata-config.d.ts +9 -5
  257. package/dist/src/lib/toml-metadata-config.js +40 -45
  258. package/dist/src/lib/toml-metadata-config.js.map +1 -1
  259. package/dist/src/lib/toml-native-form.d.ts +1 -1
  260. package/dist/src/lib/toml-native-form.js +1 -1
  261. package/dist/src/lib/toml-params-validator.d.ts +1 -1
  262. package/dist/src/lib/toml-params-validator.js +1 -1
  263. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  264. package/dist/src/lib/toml-scalar-edit.js +283 -0
  265. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  266. package/dist/src/lib/user-selector.d.ts +24 -0
  267. package/dist/src/lib/user-selector.js +33 -0
  268. package/dist/src/lib/user-selector.js.map +1 -0
  269. package/dist/src/lib/version-check.d.ts +25 -0
  270. package/dist/src/lib/version-check.js +77 -8
  271. package/dist/src/lib/version-check.js.map +1 -1
  272. package/dist/src/lib/watch.d.ts +121 -0
  273. package/dist/src/lib/watch.js +169 -0
  274. package/dist/src/lib/watch.js.map +1 -0
  275. package/dist/src/lib/workflow-apply.d.ts +69 -45
  276. package/dist/src/lib/workflow-apply.js +99 -72
  277. package/dist/src/lib/workflow-apply.js.map +1 -1
  278. package/dist/src/lib/workflow-codegen/generator.js +4 -4
  279. package/dist/src/lib/workflow-codegen/generator.js.map +1 -1
  280. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +11 -0
  281. package/dist/src/lib/workflow-codegen/invokerIR.js +5 -0
  282. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -1
  283. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  284. package/dist/src/lib/workflow-config-apply.js +137 -0
  285. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  286. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  287. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  288. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  289. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  290. package/dist/src/lib/workflow-defaults.js +41 -0
  291. package/dist/src/lib/workflow-defaults.js.map +1 -0
  292. package/dist/src/lib/workflow-fragments.d.ts +23 -0
  293. package/dist/src/lib/workflow-fragments.js +229 -8
  294. package/dist/src/lib/workflow-fragments.js.map +1 -1
  295. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  296. package/dist/src/lib/workflow-include-preserve.js +286 -0
  297. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  298. package/dist/src/lib/workflow-payload.d.ts +31 -20
  299. package/dist/src/lib/workflow-payload.js +100 -93
  300. package/dist/src/lib/workflow-payload.js.map +1 -1
  301. package/dist/src/lib/workflow-toml-validator.d.ts +80 -3
  302. package/dist/src/lib/workflow-toml-validator.js +231 -3
  303. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  304. package/dist/src/types/index.d.ts +78 -22
  305. package/dist/src/validators.d.ts +7 -7
  306. package/dist/src/validators.js +6 -6
  307. package/package.json +11 -6
  308. package/dist/src/commands/settings.d.ts +0 -15
  309. package/dist/src/commands/settings.js +0 -102
  310. package/dist/src/commands/settings.js.map +0 -1
@@ -0,0 +1,479 @@
1
+ /**
2
+ * `primitive config` — the whole TOML configuration tree (issues #2645, #2759).
3
+ *
4
+ * #2645 replaced the eleven config-setting flags with three local verbs:
5
+ * `fields` documents the surface that per-flag `--help` used to, `create`
6
+ * scaffolds an object, and `set` edits one key from a script. It put them under
7
+ * `config` rather than under `sync` because none of them touches the network.
8
+ *
9
+ * #2759 removed the other side of that line. Splitting by "does this call the
10
+ * API?" is a transport distinction, not one users think in: authoring was
11
+ * `config` and applying was `sync`, so every real workflow crossed the boundary
12
+ * and this group's own help had to end its example sequence by switching nouns.
13
+ * `config` now carries the reconciliation verbs too (`init`, `pull`, `push`,
14
+ * `diff`, `revert`, `migrate-toml`, `migrate-v2`), registered onto the group
15
+ * returned below by `registerConfigSyncCommands` in `sync.ts` — that module
16
+ * keeps its name and exports; only where its verbs hang changed.
17
+ *
18
+ * The split that remains is the one users do think in: the per-surface groups
19
+ * (`workflows`, `webhooks`, …) read and operate on live objects, `config` owns
20
+ * the files that define them.
21
+ */
22
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
23
+ import { join, basename } from "path";
24
+ import chalk from "chalk";
25
+ import { resolveAppId } from "../lib/config.js";
26
+ import { resolveSyncDir, isAutoResolvedSyncDir } from "../lib/sync-paths.js";
27
+ import { CONFIG_OBJECT_DESCRIPTORS, getConfigObjectDescriptor, } from "../lib/config-object-descriptor.js";
28
+ import { PUSH_PRUNE_SPECS, isSafeSyncFilename, } from "../lib/sync-resource-types.js";
29
+ import { configAuthoringError } from "../lib/platform-owned.js";
30
+ import { filesDeclaringKey } from "../lib/sync-selectors.js";
31
+ import { setTomlScalar, parseScalarLiteral, TomlEditError, } from "../lib/toml-scalar-edit.js";
32
+ import { success, error, info, keyValue, divider, json } from "../lib/output.js";
33
+ function ensureDir(dirPath) {
34
+ if (!existsSync(dirPath)) {
35
+ mkdirSync(dirPath, { recursive: true });
36
+ }
37
+ }
38
+ /**
39
+ * The config slot for a LOCAL command (issue #2645).
40
+ *
41
+ * `config create`, `config set` and `config fields` never call the API, so an
42
+ * explicit `--dir` is enough on its own — resolving an app id first would make
43
+ * them require a login they do not need. Without `--dir` they fall back to the
44
+ * same per-environment slot every other `config` command uses.
45
+ */
46
+ function resolveLocalSyncDir(appId, options) {
47
+ if (options.dir)
48
+ return options.dir;
49
+ // Outside a project there is no per-app slot: `resolveSyncDir` answers
50
+ // `./config` whatever the app id is. Resolving one anyway would exit these
51
+ // commands with "No app specified" for want of a login they never use — and
52
+ // scaffolding a file before you have an app is exactly the order the
53
+ // TOML-only path asks for (`config create`, edit, `config push`).
54
+ if (!isAutoResolvedSyncDir(undefined)) {
55
+ return resolveSyncDir({ appId: "", userDir: undefined });
56
+ }
57
+ const resolvedAppId = resolveAppId(appId, options);
58
+ const configDir = resolveSyncDir({ appId: resolvedAppId, userDir: undefined });
59
+ info(`Using per-environment config directory: ${configDir}`);
60
+ return configDir;
61
+ }
62
+ /**
63
+ * The `--only` selector key for a file — the key `config push` itself derives.
64
+ *
65
+ * Not always the file name: a metadata-category config lives at
66
+ * `<resourceType>.<category>.toml` but is keyed by the `resourceType#category`
67
+ * pair, so telling the user to push `--only metadata-category-config/<basename>`
68
+ * would print a command that resolves to nothing.
69
+ */
70
+ function pushSelectorKey(descriptor, filePath) {
71
+ const spec = PUSH_PRUNE_SPECS.find((s) => s.resourceType.label === descriptor.type);
72
+ return spec ? spec.keyFromFile(filePath) : basename(filePath, ".toml");
73
+ }
74
+ /** Every configurable type name, for an error message. */
75
+ function configTypeList() {
76
+ return CONFIG_OBJECT_DESCRIPTORS.map((d) => d.type).join(", ");
77
+ }
78
+ function requireConfigDescriptor(type) {
79
+ const descriptor = getConfigObjectDescriptor(type);
80
+ if (!descriptor) {
81
+ error(`Unknown configuration type '${type}'. Configurable types: ${configTypeList()}`);
82
+ process.exit(1);
83
+ }
84
+ return descriptor;
85
+ }
86
+ /**
87
+ * Whether `path` names something the type declares.
88
+ *
89
+ * An exact field match is obvious. A declared `table` / `table[]` / `json`
90
+ * field also covers everything BELOW it — `requestConfig.method`,
91
+ * `verification.jwt.header`, `vars.API_BASE_URL` — because those subtrees are
92
+ * free-form by design and enumerating them would be a second, always-stale
93
+ * copy of the server's shape.
94
+ */
95
+ function isDeclaredFieldPath(descriptor, path) {
96
+ // `vars.toml` is a flat table of the app's own keys — every root-level key is
97
+ // legitimate, and the key format is validated by the push preflight.
98
+ if (descriptor.freeFormRootKeys && !path.includes("."))
99
+ return true;
100
+ for (const field of descriptor.fields) {
101
+ if (field.path === path)
102
+ return true;
103
+ if ((field.type === "table" || field.type === "table[]" || field.type === "json") &&
104
+ path.startsWith(`${field.path}.`)) {
105
+ return true;
106
+ }
107
+ }
108
+ return false;
109
+ }
110
+ /**
111
+ * Why `value` cannot be what `path` declares, or `null` when it can.
112
+ *
113
+ * `config set` used to check only that a path was DECLARED, so
114
+ * `integration.timeoutMs=fast` wrote a string into a number field and the
115
+ * mistake surfaced as a server error on the next push. The descriptor exists to
116
+ * carry what per-flag `--help` used to carry (criterion 7), and that has to
117
+ * include the type — otherwise removing the flags traded a fast local error for
118
+ * a slow remote one.
119
+ *
120
+ * Deliberately silent about anything it cannot judge: an undeclared path (the
121
+ * declared-path check owns that message — two errors for one mistake is worse
122
+ * than one), the interior of a `table` / `table[]` / `json` field, and a var
123
+ * file's own keys. Those shapes belong to the server, and mirroring them here
124
+ * would be a second copy that goes stale.
125
+ */
126
+ export function fieldTypeMismatch(descriptor, path, value) {
127
+ const field = descriptor.fields.find((f) => f.path === path);
128
+ if (!field)
129
+ return null;
130
+ const expected = field.type === "number" || field.type === "boolean" || field.type === "string"
131
+ ? field.type
132
+ : null;
133
+ if (!expected || typeof value === expected)
134
+ return null;
135
+ return (`'${path}' is declared ${expected}, but '${value}' is a ${typeof value}. ` +
136
+ `Run 'primitive config fields ${descriptor.type}' to see the surface.`);
137
+ }
138
+ /**
139
+ * Resolve a `config set` target to the file it edits.
140
+ *
141
+ * Accepts `<type>/<key>` for the 13 per-entity types, plus the two root
142
+ * singletons by name: `app` (`app.toml`) and `vars` (`vars.toml`, whose keys
143
+ * are addressed as `vars.<KEY>`).
144
+ *
145
+ * The key is resolved the way `config push --only` resolves it — by the identity
146
+ * the local files DECLARE, falling back to the conventional file name when no
147
+ * file declares it. `config set` and the push that follows it have to agree about
148
+ * which object `<type>/<key>` is; resolving by file name alone meant a renamed
149
+ * file (`custom.toml` declaring `workflow.key = "greeting"`) could not be
150
+ * edited as `workflow/greeting` at all, while `workflow/custom` edited a file
151
+ * push would apply under a different key (issue #2645, review follow-up).
152
+ */
153
+ function resolveSetTarget(selector, configDir) {
154
+ if (selector === "app") {
155
+ return {
156
+ descriptor: requireConfigDescriptor("app"),
157
+ filePath: join(configDir, "app.toml"),
158
+ };
159
+ }
160
+ if (selector === "vars" || selector === "var") {
161
+ return {
162
+ descriptor: requireConfigDescriptor("var"),
163
+ filePath: join(configDir, "vars.toml"),
164
+ };
165
+ }
166
+ const slash = selector.indexOf("/");
167
+ if (slash === -1) {
168
+ error(`'${selector}' is not a configuration object. Use <type>/<key>, app, or vars. Types: ${configTypeList()}`);
169
+ process.exit(1);
170
+ }
171
+ const type = selector.slice(0, slash);
172
+ const key = selector.slice(slash + 1);
173
+ const descriptor = requireConfigDescriptor(type);
174
+ if (!descriptor.resourceType) {
175
+ error(`'${type}' is a single file — use '${type === "app" ? "app" : "vars"}' with no key`);
176
+ process.exit(1);
177
+ }
178
+ if (!key) {
179
+ error(`'${selector}': name the object, e.g. ${type}/<key>`);
180
+ process.exit(1);
181
+ }
182
+ const refusal = configAuthoringError(type, key);
183
+ if (refusal) {
184
+ error(refusal);
185
+ process.exit(1);
186
+ }
187
+ const filename = descriptor.resourceType.fileFromKey(key);
188
+ // The key is a command-line argument, so it must never be able to steer the
189
+ // edit out of the type's directory — `workflow/../app` would otherwise let
190
+ // `config set` rewrite a file the operator did not name. Same guard `config create`
191
+ // applies before a write and prune applies before an unlink. Checked before
192
+ // the directory scan below so a traversing key never reaches the filesystem.
193
+ if (!isSafeSyncFilename(filename)) {
194
+ error(`'${key}' is not a usable key — it would edit outside ${descriptor.resourceType.dir}/.`);
195
+ process.exit(1);
196
+ }
197
+ const declaring = filesDeclaringKey(configDir, descriptor.type, key);
198
+ if (declaring.length > 1) {
199
+ error(`'${selector}' is declared by ${declaring.length} files (${declaring
200
+ .map((p) => basename(p))
201
+ .join(", ")}) — one key, one file. Remove or re-key the duplicates, then retry.`);
202
+ process.exit(1);
203
+ }
204
+ // No local file declares the key: fall back to the conventional path, so the
205
+ // "no local file at …" error names where `config pull` / `config create` would put it.
206
+ const filePath = declaring[0] ?? join(configDir, descriptor.resourceType.dir, filename);
207
+ // A file may declare a key other than its name, including a platform-owned
208
+ // one. Push skips those (#1660), so editing one is an edit that can never be
209
+ // applied — refuse it by the key the file DECLARES, not only by the one the
210
+ // operator typed.
211
+ const declaredKey = pushSelectorKey(descriptor, filePath);
212
+ const declaredRefusal = declaredKey === key
213
+ ? null
214
+ : configAuthoringError(descriptor.type, declaredKey);
215
+ if (declaredRefusal) {
216
+ error(declaredRefusal);
217
+ process.exit(1);
218
+ }
219
+ return { descriptor, filePath };
220
+ }
221
+ /**
222
+ * Register the `config` group and its local authoring verbs, and return the
223
+ * group so `registerConfigSyncCommands` can hang the server-reconciling verbs
224
+ * off the same noun (issue #2759).
225
+ */
226
+ export function registerConfigCommands(program) {
227
+ const config = program
228
+ .command("config")
229
+ .description("Manage app configuration as TOML files — author locally, then pull/diff/push against the server")
230
+ .addHelpText("after", `
231
+ Configuration is authored in TOML and applied with 'primitive config push'.
232
+ 'fields', 'create' and 'set' only read and write local files — nothing there
233
+ contacts the server, so they work before you have an app, and a script can edit
234
+ a file without a login. 'init', 'pull', 'push', 'diff' and 'revert' reconcile
235
+ those files with the server.
236
+
237
+ Examples:
238
+ $ primitive config fields workflow
239
+ $ primitive config create workflow order-intake
240
+ $ primitive config set workflow/order-intake workflow.description="Intake"
241
+ $ primitive config push --only workflow/order-intake
242
+
243
+ Availability is not configuration: a workflow's status is server-owned, so it
244
+ is not a settable key here. Take one out of service with
245
+ 'primitive workflows disable' (and back with 'enable').
246
+
247
+ Directory Structure:
248
+ config/
249
+ .primitive-sync.json # Sync state (auto-managed)
250
+ app.toml # App settings
251
+ integrations/*.toml # Integration configs
252
+ integrations/{key}.tests/*.toml # Integration test cases
253
+ webhooks/*.toml # Webhook configs
254
+ cron-triggers/*.toml # Cron trigger configs
255
+ blob-buckets/*.toml # Blob bucket configs
256
+ prompts/*.toml # Prompt configs
257
+ prompts/{key}.tests/*.toml # Prompt test cases
258
+ workflows/*.toml # Workflow definitions
259
+ workflows/{key}.tests/*.toml # Workflow test cases
260
+ transforms/*.rhai # Rhai transform bodies
261
+ transforms/{name}.tests/*.toml # Transform test cases
262
+ database-type-configs/*.toml # Database type configs + operations
263
+ rule-sets/*.toml # Access rule sets
264
+ group-type-configs/*.toml # Group type configs
265
+ collection-type-configs/*.toml # Collection type configs
266
+ metadata-category-configs/*.toml # Resource-metadata category configs
267
+ email-templates/*.toml # Email template overrides
268
+ `);
269
+ // ── The TOML authoring surface (issue #2645) ─────────────────────────────
270
+ //
271
+ // Server-side configuration is authored in TOML and applied with
272
+ // `config push`. These three commands are what replaced the config-setting
273
+ // flags: `fields` documents the surface that per-flag `--help` used to,
274
+ // `create` scaffolds an object without an API call, and `set` edits one key
275
+ // from a script. None of them touches the network.
276
+ config
277
+ .command("fields")
278
+ .description("List a configuration type's TOML keys, types, required and default")
279
+ .argument("<type>", `Configuration type (${CONFIG_OBJECT_DESCRIPTORS.length} available)`)
280
+ .option("--json", "Output as JSON")
281
+ .addHelpText("after", `
282
+ Types:
283
+ ${CONFIG_OBJECT_DESCRIPTORS.map((d) => `${d.type} — ${d.description}`).join("\n ")}
284
+
285
+ Examples:
286
+ $ primitive config fields workflow
287
+ $ primitive config fields webhook --json
288
+ `)
289
+ .action(async (type, options) => {
290
+ const descriptor = requireConfigDescriptor(type);
291
+ const asJson = (f) => ({
292
+ path: f.path,
293
+ type: f.type,
294
+ required: f.required,
295
+ default: f.default ?? null,
296
+ description: f.description,
297
+ });
298
+ if (options.json) {
299
+ json({
300
+ type: descriptor.type,
301
+ file: descriptor.fileHint,
302
+ description: descriptor.description,
303
+ identity: descriptor.identity ?? null,
304
+ fields: descriptor.fields.map(asJson),
305
+ // A type authored across more than one file reports the other files
306
+ // too — the workflow's named-config sidecars are the whole of what
307
+ // the removed `workflows configs` verbs used to set (issue #2645).
308
+ companionFiles: (descriptor.companionFiles ?? []).map((companion) => ({
309
+ file: companion.fileHint,
310
+ description: companion.description,
311
+ fields: companion.fields.map(asJson),
312
+ })),
313
+ });
314
+ return;
315
+ }
316
+ keyValue("Type", descriptor.type);
317
+ keyValue("File", descriptor.fileHint);
318
+ keyValue("About", descriptor.description);
319
+ divider();
320
+ if (descriptor.freeFormRootKeys) {
321
+ info(`${descriptor.fileHint} is a flat table of your own keys — KEY = "value" at the root, matching ^[A-Z][A-Z0-9_]{0,63}$. There is no fixed field surface.`);
322
+ return;
323
+ }
324
+ if (descriptor.fields.length === 0) {
325
+ info(`${descriptor.fileHint} is a script body, not a table of keys — there is no field surface to list.`);
326
+ return;
327
+ }
328
+ const printField = (field) => {
329
+ const flags = [
330
+ field.required ? "required" : "optional",
331
+ field.default === undefined ? null : `default ${JSON.stringify(field.default)}`,
332
+ ]
333
+ .filter(Boolean)
334
+ .join(", ");
335
+ console.log(` ${chalk.cyan(field.path)} ${chalk.dim(field.type)} ${chalk.dim(`(${flags})`)}`);
336
+ console.log(` ${field.description}`);
337
+ };
338
+ for (const field of descriptor.fields) {
339
+ printField(field);
340
+ }
341
+ // The rest of the object's surface, where it spans more than one file.
342
+ // `config set` addresses the main file only, so these are listed rather
343
+ // than folded in — but leaving them out would under-report exactly what
344
+ // the removed `workflows configs` flags used to document (issue #2645).
345
+ for (const companion of descriptor.companionFiles ?? []) {
346
+ divider();
347
+ keyValue("File", companion.fileHint);
348
+ info(companion.description);
349
+ for (const field of companion.fields) {
350
+ printField(field);
351
+ }
352
+ }
353
+ divider();
354
+ info(`Edit ${descriptor.fileHint}, then run 'primitive config push'.`);
355
+ });
356
+ config
357
+ .command("create")
358
+ .description("Scaffold a configuration file locally (no API call)")
359
+ .argument("<type>", "Configuration type — see 'primitive config fields'")
360
+ .argument("<key>", "The object's key; it becomes the file name")
361
+ .option("--app <app-id>", "App ID")
362
+ .option("--dir <path>", "Config directory (overrides the auto-resolved per-env path)")
363
+ .addHelpText("after", `
364
+ Creates the file from the type's defaults and stops there — nothing is sent to
365
+ the server until you edit the file and run 'primitive config push'.
366
+
367
+ Examples:
368
+ $ primitive config create workflow order-intake
369
+ $ primitive config create webhook stripe-events
370
+ $ primitive config push --only workflow/order-intake
371
+ `)
372
+ .action(async (type, key, options) => {
373
+ const descriptor = requireConfigDescriptor(type);
374
+ if (!descriptor.resourceType) {
375
+ error(`${descriptor.type} is a root singleton (${descriptor.fileHint}) — it is not created per key. Run 'primitive config pull' to write it.`);
376
+ process.exit(1);
377
+ }
378
+ const refusal = configAuthoringError(descriptor.type, key);
379
+ if (refusal) {
380
+ error(refusal);
381
+ process.exit(1);
382
+ }
383
+ const configDir = resolveLocalSyncDir(undefined, options);
384
+ const dir = join(configDir, descriptor.resourceType.dir);
385
+ const filename = descriptor.resourceType.fileFromKey(key);
386
+ // The key comes from the command line, so it must never be able to steer
387
+ // a write out of the slot — the same guard the prune path applies before
388
+ // an unlink.
389
+ if (!isSafeSyncFilename(filename)) {
390
+ error(`'${key}' is not a usable key — it would write outside ${dir}.`);
391
+ process.exit(1);
392
+ }
393
+ const filePath = join(dir, filename);
394
+ if (existsSync(filePath)) {
395
+ error(`${descriptor.resourceType.dir}/${descriptor.resourceType.fileFromKey(key)} already exists — edit it, or pick another key.`);
396
+ process.exit(1);
397
+ }
398
+ ensureDir(dir);
399
+ writeFileSync(filePath, descriptor.scaffold(key));
400
+ success(`Created ${filePath}`);
401
+ info(`Next: edit it, then 'primitive config push --only ${descriptor.type}/${pushSelectorKey(descriptor, filePath)}'.`);
402
+ });
403
+ config
404
+ .command("set")
405
+ .description("Set a field in a configuration file locally (no API call)")
406
+ .argument("<object>", "<type>/<key>, app, or vars")
407
+ .argument("<assignments...>", "One or more <path>=<value>, e.g. workflow.description=\"Intake\"")
408
+ .option("--app <app-id>", "App ID")
409
+ .option("--dir <path>", "Config directory (overrides the auto-resolved per-env path)")
410
+ .addHelpText("after", `
411
+ Edits the file in place, preserving comments and key order, and writes nothing
412
+ to the server. Only scalars are settable — a table or an array is edited in the
413
+ file directly.
414
+
415
+ 'true'/'false' and numeric values are written with those types; wrap a value in
416
+ double quotes to force a string.
417
+
418
+ Examples:
419
+ $ primitive config set workflow/order-intake workflow.description="Intake"
420
+ $ primitive config push --only workflow/order-intake
421
+
422
+ A server-owned key such as status is not settable: availability is changed
423
+ with 'primitive <noun> enable|disable', never through a file.
424
+ `)
425
+ .action(async (object, assignments, options) => {
426
+ const configDir = resolveLocalSyncDir(undefined, options);
427
+ const { descriptor, filePath } = resolveSetTarget(object, configDir);
428
+ if (!existsSync(filePath)) {
429
+ error(`No local file at ${filePath}. Run 'primitive config pull' to fetch it, or 'primitive config create ${descriptor.type} <key>' to create one.`);
430
+ process.exit(1);
431
+ }
432
+ let text = readFileSync(filePath, "utf-8");
433
+ const applied = [];
434
+ for (const assignment of assignments) {
435
+ const eq = assignment.indexOf("=");
436
+ if (eq <= 0) {
437
+ error(`'${assignment}' is not <path>=<value>, e.g. workflow.name="Order intake"`);
438
+ process.exit(1);
439
+ }
440
+ const path = assignment.slice(0, eq).trim();
441
+ const raw = assignment.slice(eq + 1);
442
+ if (!isDeclaredFieldPath(descriptor, path)) {
443
+ error(`'${path}' is not a ${descriptor.type} field. Run 'primitive config fields ${descriptor.type}' to see the surface.`);
444
+ process.exit(1);
445
+ }
446
+ const value = parseScalarLiteral(raw);
447
+ const typeError = fieldTypeMismatch(descriptor, path, value);
448
+ if (typeError) {
449
+ error(typeError);
450
+ process.exit(1);
451
+ }
452
+ try {
453
+ text = setTomlScalar(text, path, value);
454
+ }
455
+ catch (e) {
456
+ if (e instanceof TomlEditError) {
457
+ error(`${filePath}: ${e.message}`);
458
+ process.exit(1);
459
+ }
460
+ throw e;
461
+ }
462
+ applied.push(path);
463
+ }
464
+ writeFileSync(filePath, text);
465
+ success(`Updated ${filePath} (${applied.join(", ")})`);
466
+ // The follow-up has to be a command that actually runs: `--only` takes
467
+ // `app`, `var/<KEY>` per var, or `<type>/<key>` where the key is the one
468
+ // push derives from the file — for a metadata-category config that is the
469
+ // `resourceType#category` pair, not the file name.
470
+ const pushTargets = descriptor.type === "app"
471
+ ? ["app"]
472
+ : descriptor.type === "var"
473
+ ? applied.map((path) => `var/${path}`)
474
+ : [`${descriptor.type}/${pushSelectorKey(descriptor, filePath)}`];
475
+ info(`Next: 'primitive config push --only ${pushTargets.join(",")}' to apply it.`);
476
+ });
477
+ return config;
478
+ }
479
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerConnectionsCommands(program: Command): void;
@@ -0,0 +1,100 @@
1
+ import { Option } from "commander";
2
+ import { ApiClient } from "../lib/api-client.js";
3
+ import { resolveAppId } from "../lib/config.js";
4
+ import { error, info, formatTable, formatDate, json, } from "../lib/output.js";
5
+ import { resolveUserSelector } from "../lib/user-selector.js";
6
+ export function registerConnectionsCommands(program) {
7
+ const connections = program
8
+ .command("connections")
9
+ .description("Inspect the live WebSocket connections the server believes exist")
10
+ .addHelpText("after", `
11
+ Freshness: these are the connections the server believes are live — exact when a
12
+ client disconnects gracefully, otherwise bounded by each row's EXPIRES time.
13
+
14
+ Each row is a single connection-to-subscription binding, so the same CONNECTION
15
+ can appear on more than one row (one per document/database subscription plus the
16
+ user notification channel).
17
+
18
+ Examples:
19
+ $ primitive connections list --document 01HXY...
20
+ $ primitive connections list --user-id 01HXY...
21
+ $ primitive connections list --database 01HXY... --limit 50
22
+ $ primitive connections list --user-id 01HXY... --json
23
+ `);
24
+ connections
25
+ .command("list")
26
+ .description("List live connections for exactly one of a document, user, or database")
27
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
28
+ .option("--document <document-id>", "List connections for this document")
29
+ .option("--user-id <user-id>", "List connections for this user")
30
+ // Deprecated alias of --user-id, kept accepted but out of --help (#2357).
31
+ .addOption(new Option("--user <user-id>", "Deprecated alias of --user-id").hideHelp())
32
+ .option("--database <database-id>", "List database subscriptions for this database")
33
+ .option("--limit <n>", "Maximum rows to return (default 25, max 100)")
34
+ .option("--cursor <cursor>", "Pagination cursor from a previous page")
35
+ .option("--json", "Output as JSON")
36
+ .action(async (options) => {
37
+ const userId = resolveUserSelector(options, "connections list");
38
+ const selectors = [
39
+ options.document ? "document" : null,
40
+ userId ? "user" : null,
41
+ options.database ? "database" : null,
42
+ ].filter(Boolean);
43
+ if (selectors.length === 0) {
44
+ error("Provide exactly one selector: --document, --user-id, or --database.");
45
+ process.exit(1);
46
+ }
47
+ if (selectors.length > 1) {
48
+ error("Provide only one selector: --document, --user-id, or --database (not more than one).");
49
+ process.exit(1);
50
+ }
51
+ const resolvedAppId = resolveAppId(undefined, options);
52
+ const client = new ApiClient();
53
+ const limit = options.limit ? Number(options.limit) : undefined;
54
+ if (options.limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
55
+ error("--limit must be a positive integer.");
56
+ process.exit(1);
57
+ }
58
+ try {
59
+ const { items, nextCursor } = await client.listConnections(resolvedAppId, {
60
+ documentId: options.document,
61
+ userId,
62
+ databaseId: options.database,
63
+ }, { limit, cursor: options.cursor });
64
+ if (options.json) {
65
+ json({ items, nextCursor });
66
+ return;
67
+ }
68
+ if (!items || items.length === 0) {
69
+ info("No live connections found.");
70
+ return;
71
+ }
72
+ // `formatTable`'s per-column `format` receives only the cell value, so
73
+ // derive the composite TARGET column onto each display row up front.
74
+ const rows = items.map((row) => ({
75
+ ...row,
76
+ target: row.kind === "document"
77
+ ? row.documentId
78
+ : row.kind === "database-subscription"
79
+ ? `${row.databaseId} / ${row.subscriptionKey}`
80
+ : "(user channel)",
81
+ }));
82
+ console.log(formatTable(rows, [
83
+ { header: "CONNECTION", key: "connectionId" },
84
+ { header: "KIND", key: "kind" },
85
+ { header: "USER", key: "userId" },
86
+ { header: "TARGET", key: "target" },
87
+ { header: "CONNECTED", key: "connectedAt", format: formatDate },
88
+ { header: "EXPIRES", key: "expiresAt", format: formatDate },
89
+ ]));
90
+ if (nextCursor) {
91
+ info(`More results available. Re-run with --cursor ${nextCursor}`);
92
+ }
93
+ }
94
+ catch (err) {
95
+ error(err.message);
96
+ process.exit(1);
97
+ }
98
+ });
99
+ }
100
+ //# sourceMappingURL=connections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/commands/connections.ts"],"names":[],"mappings":"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"}