@noodleseed/one 0.8.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +16 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/archive-ops.d.ts +3 -0
  5. package/dist/commands/archive-ops.d.ts.map +1 -0
  6. package/dist/commands/archive-ops.js +168 -0
  7. package/dist/commands/archive-ops.js.map +1 -0
  8. package/dist/commands/author-loop.d.ts.map +1 -1
  9. package/dist/commands/author-loop.js +78 -3
  10. package/dist/commands/author-loop.js.map +1 -1
  11. package/dist/commands/deploy-ops.d.ts +1 -30
  12. package/dist/commands/deploy-ops.d.ts.map +1 -1
  13. package/dist/commands/deploy-ops.js +55 -87
  14. package/dist/commands/deploy-ops.js.map +1 -1
  15. package/dist/commands/deploy-output.d.ts +31 -0
  16. package/dist/commands/deploy-output.d.ts.map +1 -0
  17. package/dist/commands/deploy-output.js +86 -0
  18. package/dist/commands/deploy-output.js.map +1 -0
  19. package/dist/commands/deploy-version-resolution.d.ts +20 -0
  20. package/dist/commands/deploy-version-resolution.d.ts.map +1 -0
  21. package/dist/commands/deploy-version-resolution.js +77 -0
  22. package/dist/commands/deploy-version-resolution.js.map +1 -0
  23. package/dist/commands/docs-mcp.d.ts +32 -0
  24. package/dist/commands/docs-mcp.d.ts.map +1 -0
  25. package/dist/commands/docs-mcp.js +66 -0
  26. package/dist/commands/docs-mcp.js.map +1 -0
  27. package/dist/commands/mcp-apps.d.ts.map +1 -1
  28. package/dist/commands/mcp-apps.js +38 -37
  29. package/dist/commands/mcp-apps.js.map +1 -1
  30. package/dist/commands/org-admin.d.ts +17 -0
  31. package/dist/commands/org-admin.d.ts.map +1 -0
  32. package/dist/commands/org-admin.js +241 -0
  33. package/dist/commands/org-admin.js.map +1 -0
  34. package/dist/commands/policy-ops.d.ts.map +1 -1
  35. package/dist/commands/policy-ops.js +94 -1
  36. package/dist/commands/policy-ops.js.map +1 -1
  37. package/dist/commands/project-setup.d.ts.map +1 -1
  38. package/dist/commands/project-setup.js +29 -0
  39. package/dist/commands/project-setup.js.map +1 -1
  40. package/dist/commands/session.d.ts +1 -15
  41. package/dist/commands/session.d.ts.map +1 -1
  42. package/dist/commands/session.js +15 -170
  43. package/dist/commands/session.js.map +1 -1
  44. package/dist/commands/shared.d.ts +1 -0
  45. package/dist/commands/shared.d.ts.map +1 -1
  46. package/dist/commands/shared.js +21 -9
  47. package/dist/commands/shared.js.map +1 -1
  48. package/dist/commands/update-ops.d.ts +29 -0
  49. package/dist/commands/update-ops.d.ts.map +1 -0
  50. package/dist/commands/update-ops.js +315 -0
  51. package/dist/commands/update-ops.js.map +1 -0
  52. package/dist/config.d.ts +2 -0
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js.map +1 -1
  55. package/dist/deploy-version.d.ts +3 -0
  56. package/dist/deploy-version.d.ts.map +1 -0
  57. package/dist/deploy-version.js +28 -0
  58. package/dist/deploy-version.js.map +1 -0
  59. package/dist/deploy.d.ts +5 -1
  60. package/dist/deploy.d.ts.map +1 -1
  61. package/dist/deploy.js +27 -3
  62. package/dist/deploy.js.map +1 -1
  63. package/dist/devtools-chat.d.ts +76 -0
  64. package/dist/devtools-chat.d.ts.map +1 -0
  65. package/dist/devtools-chat.js +114 -0
  66. package/dist/devtools-chat.js.map +1 -0
  67. package/dist/devtools-env.d.ts +16 -0
  68. package/dist/devtools-env.d.ts.map +1 -0
  69. package/dist/devtools-env.js +71 -0
  70. package/dist/devtools-env.js.map +1 -0
  71. package/dist/devtools-harness.d.ts +28 -0
  72. package/dist/devtools-harness.d.ts.map +1 -0
  73. package/dist/devtools-harness.js +387 -0
  74. package/dist/devtools-harness.js.map +1 -0
  75. package/dist/devtools-preview.d.ts +42 -0
  76. package/dist/devtools-preview.d.ts.map +1 -0
  77. package/dist/devtools-preview.js +394 -0
  78. package/dist/devtools-preview.js.map +1 -0
  79. package/dist/preview-session.d.ts +46 -0
  80. package/dist/preview-session.d.ts.map +1 -0
  81. package/dist/preview-session.js +132 -0
  82. package/dist/preview-session.js.map +1 -0
  83. package/dist/project.d.ts +2 -0
  84. package/dist/project.d.ts.map +1 -1
  85. package/dist/project.js +2 -0
  86. package/dist/project.js.map +1 -1
  87. package/dist/react-widget-build.js +3 -1
  88. package/dist/react-widget-build.js.map +1 -1
  89. package/dist/update-binary.d.ts +38 -0
  90. package/dist/update-binary.d.ts.map +1 -0
  91. package/dist/update-binary.js +144 -0
  92. package/dist/update-binary.js.map +1 -0
  93. package/dist/update-check.d.ts +40 -0
  94. package/dist/update-check.d.ts.map +1 -0
  95. package/dist/update-check.js +212 -0
  96. package/dist/update-check.js.map +1 -0
  97. package/dist/update-render.d.ts +17 -0
  98. package/dist/update-render.d.ts.map +1 -0
  99. package/dist/update-render.js +39 -0
  100. package/dist/update-render.js.map +1 -0
  101. package/dist/update.d.ts +10 -9
  102. package/dist/update.d.ts.map +1 -1
  103. package/dist/update.js +21 -89
  104. package/dist/update.js.map +1 -1
  105. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
  106. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +13 -1
  107. package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
  108. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
  109. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +2 -0
  110. package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
  111. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  112. package/node_modules/@noodle-borg/connector-defs/dist/compile-expr.d.ts +23 -0
  113. package/node_modules/@noodle-borg/connector-defs/dist/compile-expr.d.ts.map +1 -0
  114. package/node_modules/@noodle-borg/connector-defs/dist/compile-expr.js +41 -0
  115. package/node_modules/@noodle-borg/connector-defs/dist/compile-expr.js.map +1 -0
  116. package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts +2 -6
  117. package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts.map +1 -1
  118. package/node_modules/@noodle-borg/connector-defs/dist/compile.js +10 -32
  119. package/node_modules/@noodle-borg/connector-defs/dist/compile.js.map +1 -1
  120. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +16 -0
  121. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts.map +1 -1
  122. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +6 -0
  123. package/node_modules/@noodle-borg/connector-defs/dist/schema.js.map +1 -1
  124. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +7 -0
  125. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts.map +1 -1
  126. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +14 -5
  127. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js.map +1 -1
  128. package/node_modules/@noodle-borg/module/dist/contract.d.ts +12 -0
  129. package/node_modules/@noodle-borg/module/dist/contract.d.ts.map +1 -1
  130. package/node_modules/@noodle-borg/module/dist/contract.js +41 -0
  131. package/node_modules/@noodle-borg/module/dist/contract.js.map +1 -1
  132. package/node_modules/@noodle-borg/service/dist/archive-sweeper.d.ts +43 -0
  133. package/node_modules/@noodle-borg/service/dist/archive-sweeper.d.ts.map +1 -0
  134. package/node_modules/@noodle-borg/service/dist/archive-sweeper.js +122 -0
  135. package/node_modules/@noodle-borg/service/dist/archive-sweeper.js.map +1 -0
  136. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +20 -2
  137. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -1
  138. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +37 -2
  139. package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -1
  140. package/node_modules/@noodle-borg/service/dist/commercial-plans.d.ts +11 -0
  141. package/node_modules/@noodle-borg/service/dist/commercial-plans.d.ts.map +1 -0
  142. package/node_modules/@noodle-borg/service/dist/commercial-plans.js +119 -0
  143. package/node_modules/@noodle-borg/service/dist/commercial-plans.js.map +1 -0
  144. package/node_modules/@noodle-borg/service/dist/deployment-versioning.d.ts +20 -0
  145. package/node_modules/@noodle-borg/service/dist/deployment-versioning.d.ts.map +1 -0
  146. package/node_modules/@noodle-borg/service/dist/deployment-versioning.js +29 -0
  147. package/node_modules/@noodle-borg/service/dist/deployment-versioning.js.map +1 -0
  148. package/node_modules/@noodle-borg/service/dist/index.d.ts +3 -1
  149. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  150. package/node_modules/@noodle-borg/service/dist/index.js +2 -0
  151. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  152. package/node_modules/@noodle-borg/service/dist/main.js +7 -0
  153. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  154. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts.map +1 -1
  155. package/node_modules/@noodle-borg/service/dist/oauth/app.js +2 -1
  156. package/node_modules/@noodle-borg/service/dist/oauth/app.js.map +1 -1
  157. package/node_modules/@noodle-borg/service/dist/oauth/branding.d.ts +30 -0
  158. package/node_modules/@noodle-borg/service/dist/oauth/branding.d.ts.map +1 -0
  159. package/node_modules/@noodle-borg/service/dist/oauth/branding.js +224 -0
  160. package/node_modules/@noodle-borg/service/dist/oauth/branding.js.map +1 -0
  161. package/node_modules/@noodle-borg/service/dist/oauth/consent.d.ts +0 -6
  162. package/node_modules/@noodle-borg/service/dist/oauth/consent.d.ts.map +1 -1
  163. package/node_modules/@noodle-borg/service/dist/oauth/consent.js +23 -34
  164. package/node_modules/@noodle-borg/service/dist/oauth/consent.js.map +1 -1
  165. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.d.ts.map +1 -1
  166. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.js +13 -28
  167. package/node_modules/@noodle-borg/service/dist/oauth/customer-bridge.js.map +1 -1
  168. package/node_modules/@noodle-borg/service/dist/options.d.ts +9 -0
  169. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  170. package/node_modules/@noodle-borg/service/dist/registry-helpers.d.ts +1 -1
  171. package/node_modules/@noodle-borg/service/dist/registry-helpers.d.ts.map +1 -1
  172. package/node_modules/@noodle-borg/service/dist/registry-helpers.js +5 -3
  173. package/node_modules/@noodle-borg/service/dist/registry-helpers.js.map +1 -1
  174. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts +25 -0
  175. package/node_modules/@noodle-borg/service/dist/registry-state.d.ts.map +1 -0
  176. package/node_modules/@noodle-borg/service/dist/registry-state.js +119 -0
  177. package/node_modules/@noodle-borg/service/dist/registry-state.js.map +1 -0
  178. package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts +1 -0
  179. package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts.map +1 -1
  180. package/node_modules/@noodle-borg/service/dist/registry-targets.js +4 -0
  181. package/node_modules/@noodle-borg/service/dist/registry-targets.js.map +1 -1
  182. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +59 -0
  183. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts.map +1 -0
  184. package/node_modules/@noodle-borg/service/dist/registry-types.js +2 -0
  185. package/node_modules/@noodle-borg/service/dist/registry-types.js.map +1 -0
  186. package/node_modules/@noodle-borg/service/dist/registry.d.ts +14 -70
  187. package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
  188. package/node_modules/@noodle-borg/service/dist/registry.js +137 -119
  189. package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
  190. package/node_modules/@noodle-borg/service/dist/routes/access-mode.d.ts +4 -0
  191. package/node_modules/@noodle-borg/service/dist/routes/access-mode.d.ts.map +1 -0
  192. package/node_modules/@noodle-borg/service/dist/routes/access-mode.js +15 -0
  193. package/node_modules/@noodle-borg/service/dist/routes/access-mode.js.map +1 -0
  194. package/node_modules/@noodle-borg/service/dist/routes/archive.d.ts +16 -0
  195. package/node_modules/@noodle-borg/service/dist/routes/archive.d.ts.map +1 -0
  196. package/node_modules/@noodle-borg/service/dist/routes/archive.js +83 -0
  197. package/node_modules/@noodle-borg/service/dist/routes/archive.js.map +1 -0
  198. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts +2 -19
  199. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
  200. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +52 -281
  201. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
  202. package/node_modules/@noodle-borg/service/dist/routes/deployments.d.ts +17 -0
  203. package/node_modules/@noodle-borg/service/dist/routes/deployments.d.ts.map +1 -0
  204. package/node_modules/@noodle-borg/service/dist/routes/deployments.js +88 -0
  205. package/node_modules/@noodle-borg/service/dist/routes/deployments.js.map +1 -0
  206. package/node_modules/@noodle-borg/service/dist/routes/org-admin.d.ts +40 -0
  207. package/node_modules/@noodle-borg/service/dist/routes/org-admin.d.ts.map +1 -0
  208. package/node_modules/@noodle-borg/service/dist/routes/org-admin.js +353 -0
  209. package/node_modules/@noodle-borg/service/dist/routes/org-admin.js.map +1 -0
  210. package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts +15 -0
  211. package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts.map +1 -1
  212. package/node_modules/@noodle-borg/service/dist/routes/paths.js +47 -0
  213. package/node_modules/@noodle-borg/service/dist/routes/paths.js.map +1 -1
  214. package/node_modules/@noodle-borg/service/dist/routes/plans.d.ts +20 -0
  215. package/node_modules/@noodle-borg/service/dist/routes/plans.d.ts.map +1 -0
  216. package/node_modules/@noodle-borg/service/dist/routes/plans.js +159 -0
  217. package/node_modules/@noodle-borg/service/dist/routes/plans.js.map +1 -0
  218. package/node_modules/@noodle-borg/service/dist/routes/policies.d.ts.map +1 -1
  219. package/node_modules/@noodle-borg/service/dist/routes/policies.js +7 -0
  220. package/node_modules/@noodle-borg/service/dist/routes/policies.js.map +1 -1
  221. package/node_modules/@noodle-borg/service/dist/routes/rollback.d.ts.map +1 -1
  222. package/node_modules/@noodle-borg/service/dist/routes/rollback.js +23 -7
  223. package/node_modules/@noodle-borg/service/dist/routes/rollback.js.map +1 -1
  224. package/node_modules/@noodle-borg/service/dist/serve.d.ts +6 -0
  225. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  226. package/node_modules/@noodle-borg/service/dist/serve.js +72 -32
  227. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  228. package/node_modules/@noodle-borg/service/dist/server-auth-bindings.d.ts +7 -0
  229. package/node_modules/@noodle-borg/service/dist/server-auth-bindings.d.ts.map +1 -0
  230. package/node_modules/@noodle-borg/service/dist/server-auth-bindings.js +14 -0
  231. package/node_modules/@noodle-borg/service/dist/server-auth-bindings.js.map +1 -0
  232. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  233. package/node_modules/@noodle-borg/service/dist/service.js +139 -7
  234. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  235. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts +14 -0
  236. package/node_modules/@noodle-borg/service/dist/store/control-plane.d.ts.map +1 -1
  237. package/node_modules/@noodle-borg/service/dist/store/control-plane.js +38 -0
  238. package/node_modules/@noodle-borg/service/dist/store/control-plane.js.map +1 -1
  239. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +25 -0
  240. package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts.map +1 -0
  241. package/node_modules/@noodle-borg/service/dist/store/json-file.js +163 -0
  242. package/node_modules/@noodle-borg/service/dist/store/json-file.js.map +1 -0
  243. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts +14 -0
  244. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.d.ts.map +1 -1
  245. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js +16 -0
  246. package/node_modules/@noodle-borg/service/dist/store/postgres-control-plane.js.map +1 -1
  247. package/node_modules/@noodle-borg/service/dist/store/postgres-rows.d.ts +60 -0
  248. package/node_modules/@noodle-borg/service/dist/store/postgres-rows.d.ts.map +1 -0
  249. package/node_modules/@noodle-borg/service/dist/store/postgres-rows.js +101 -0
  250. package/node_modules/@noodle-borg/service/dist/store/postgres-rows.js.map +1 -0
  251. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
  252. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +21 -2
  253. package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
  254. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +23 -8
  255. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
  256. package/node_modules/@noodle-borg/service/dist/store/postgres.js +112 -128
  257. package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
  258. package/node_modules/@noodle-borg/service/dist/store/records.d.ts +35 -0
  259. package/node_modules/@noodle-borg/service/dist/store/records.d.ts.map +1 -0
  260. package/node_modules/@noodle-borg/service/dist/store/records.js +87 -0
  261. package/node_modules/@noodle-borg/service/dist/store/records.js.map +1 -0
  262. package/node_modules/@noodle-borg/service/dist/store/validate.d.ts +19 -0
  263. package/node_modules/@noodle-borg/service/dist/store/validate.d.ts.map +1 -0
  264. package/node_modules/@noodle-borg/service/dist/store/validate.js +61 -0
  265. package/node_modules/@noodle-borg/service/dist/store/validate.js.map +1 -0
  266. package/node_modules/@noodle-borg/service/dist/store.d.ts +75 -45
  267. package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
  268. package/node_modules/@noodle-borg/service/dist/store.js +61 -224
  269. package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
  270. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +1 -0
  271. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts.map +1 -1
  272. package/node_modules/@noodle-borg/transport-http/dist/handler.js +37 -0
  273. package/node_modules/@noodle-borg/transport-http/dist/handler.js.map +1 -1
  274. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts +1 -1
  275. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts.map +1 -1
  276. package/node_modules/@noodle-borg/transport-http/dist/index.js.map +1 -1
  277. package/package.json +3 -2
@@ -1,6 +1,8 @@
1
1
  import type { HostedPackagedAsset } from '@noodle-borg/compiler';
2
2
  import type { SealedSecret } from '@noodle-borg/runtime';
3
3
  import type { AccessMode } from '@noodle-borg/transport-http';
4
+ export { JsonFileArtifactStore } from './store/json-file.js';
5
+ export { CONFIG_NAME_PATTERN, DEPLOYMENT_ID_PATTERN, DOMAIN_PATTERN, SLUG_PATTERN, validateConfigName, validateConfigScope, validateDomain, validateOrgRole, validateSignupAllowlistKind, validateSlug, validateTenantRef, } from './store/validate.js';
4
6
  /**
5
7
  * Secret values at rest. The compiled runtime keeps plaintext tokens in memory (the broker), but the
6
8
  * *persisted* form is a tagged envelope. `aes-256-gcm` (Slice 26, ADR 0028) holds an AES-256-GCM
@@ -64,6 +66,7 @@ export interface DeployRecord {
64
66
  readonly orgSlug: string;
65
67
  readonly appSlug: string;
66
68
  readonly environment: string;
69
+ readonly serverVersion?: string;
67
70
  readonly deploymentVersion: number;
68
71
  readonly active: boolean;
69
72
  readonly serverName: string;
@@ -81,6 +84,11 @@ export interface DeployRecord {
81
84
  readonly connectors?: string;
82
85
  readonly hostedAssets?: readonly HostedPackagedAsset[];
83
86
  readonly secrets: SecretEnvelope;
87
+ /**
88
+ * App soft-delete stamp (ADR 0117): ISO-8601 time the whole app was archived. Archived records are
89
+ * never served or listed by default, and the sweeper hard-deletes them after the retention window.
90
+ */
91
+ readonly archivedAt?: string;
84
92
  }
85
93
  export interface TenantOidcAuthConfig {
86
94
  readonly kind?: 'oidc' | undefined;
@@ -126,17 +134,39 @@ export interface DeploymentSummary {
126
134
  readonly orgSlug: string;
127
135
  readonly appSlug: string;
128
136
  readonly environment: string;
137
+ readonly serverVersion?: string;
129
138
  readonly active: boolean;
130
139
  readonly serverName: string;
131
140
  readonly createdAt: string;
132
141
  readonly createdByEmail?: string;
133
142
  readonly accessMode: AccessMode;
143
+ /** Present iff the record is archived (ADR 0117); surfaced only on `includeArchived` listings. */
144
+ readonly archivedAt?: string;
145
+ }
146
+ /** Filter for {@link ArtifactStore.listDeployments}. Archived records are excluded unless opted in. */
147
+ export interface DeploymentListFilter {
148
+ readonly org: string;
149
+ readonly app?: string;
150
+ readonly env?: string;
151
+ readonly includeArchived?: boolean;
152
+ }
153
+ /** Outcome of {@link ArtifactStore.archiveApp} (ADR 0117 §5 idempotency semantics). */
154
+ export interface AppArchiveResult {
155
+ /** The stamp that governs retention — the original one when the app was already archived. */
156
+ readonly archivedAt: string;
157
+ readonly archivedDeployments: number;
158
+ readonly alreadyArchived: boolean;
159
+ }
160
+ /** Outcome of {@link ArtifactStore.restoreApp}. `restoredDeployments` is 0 for a no-op restore. */
161
+ export interface AppRestoreResult {
162
+ readonly restoredDeployments: number;
134
163
  }
135
164
  export interface DeploymentStatus {
136
165
  readonly target: TenantRef;
137
166
  readonly deployment: {
138
167
  readonly deploymentId: string;
139
168
  readonly endpointUrl: string;
169
+ readonly serverVersion?: string;
140
170
  readonly active: boolean;
141
171
  readonly serverName: string;
142
172
  readonly createdAt: string;
@@ -200,6 +230,11 @@ export interface ControlPlaneStore {
200
230
  slug: string;
201
231
  displayName?: string;
202
232
  }): Promise<OrgRecord>;
233
+ /** Update an existing org's display name; `undefined` when the org does not exist (never creates). */
234
+ updateOrg(input: {
235
+ slug: string;
236
+ displayName: string;
237
+ }): Promise<OrgRecord | undefined>;
203
238
  listOrgs(): Promise<readonly OrgRecord[]>;
204
239
  listOrgsForSubject(subject: string): Promise<readonly OrgRecord[]>;
205
240
  addOrgMember(input: {
@@ -212,6 +247,12 @@ export interface ControlPlaneStore {
212
247
  org: string;
213
248
  subject: string;
214
249
  }): Promise<boolean>;
250
+ /** Change an existing member's role; `undefined` when the member does not exist (never adds). */
251
+ updateOrgMemberRole(input: {
252
+ org: string;
253
+ subject: string;
254
+ role: OrgRole;
255
+ }): Promise<OrgMemberRecord | undefined>;
215
256
  getOrgMember(input: {
216
257
  org: string;
217
258
  subject: string;
@@ -262,6 +303,19 @@ export interface ControlPlaneStore {
262
303
  consumeOrgInvitation(input: {
263
304
  tokenHash: string;
264
305
  }): Promise<OrgInvitationRecord | undefined>;
306
+ /**
307
+ * Every invitation record for one org (pending, accepted, and expired), newest-first. Callers derive
308
+ * status from `acceptedAt`/`expiresAt`; the raw `tokenHash` must never leave the control plane.
309
+ */
310
+ listOrgInvitations(org: string): Promise<readonly OrgInvitationRecord[]>;
311
+ /**
312
+ * Delete every unaccepted invitation for one email (case-insensitive) in one org, returning how many
313
+ * were revoked. Accepted invitations are membership history and stay in place.
314
+ */
315
+ revokeOrgInvitation(input: {
316
+ org: string;
317
+ email: string;
318
+ }): Promise<number>;
265
319
  }
266
320
  /**
267
321
  * Durable storage for deployed-server records. `append` writes (or replaces) one server's record;
@@ -279,13 +333,21 @@ export interface ArtifactStore {
279
333
  */
280
334
  get(deploymentId: string): Promise<DeployRecord | undefined>;
281
335
  getActiveByTenant(ref: TenantRef): Promise<DeployRecord | undefined>;
336
+ getActiveByTenantVersion(ref: TenantRef, serverVersion: string): Promise<DeployRecord | undefined>;
282
337
  activateDeployment(ref: TenantRef, deploymentId: string): Promise<DeploymentActivationResult | undefined>;
283
- updateActiveAccess(ref: TenantRef, accessMode: AccessMode): Promise<DeployRecord | undefined>;
284
- listDeployments(filter: {
285
- org: string;
286
- app?: string;
287
- env?: string;
288
- }): Promise<readonly DeploymentSummary[]>;
338
+ updateActiveAccess(ref: TenantRef, accessMode: AccessMode, serverVersion?: string): Promise<DeployRecord | undefined>;
339
+ listDeployments(filter: DeploymentListFilter): Promise<readonly DeploymentSummary[]>;
340
+ /**
341
+ * App soft delete (ADR 0117). `getAppArchivedAt` reports the app's archived stamp (defined iff the
342
+ * app has records and every record is stamped). `archiveApp` stamps every record for the app (all
343
+ * environments/versions); `restoreApp` clears the stamps; both resolve `undefined` for an app with
344
+ * no records. `sweepArchived` hard-deletes records archived strictly before `before` and returns
345
+ * them so the caller can reclaim associated config and emit audit events.
346
+ */
347
+ getAppArchivedAt(org: string, app: string): Promise<string | undefined>;
348
+ archiveApp(org: string, app: string, at: string): Promise<AppArchiveResult | undefined>;
349
+ restoreApp(org: string, app: string): Promise<AppRestoreResult | undefined>;
350
+ sweepArchived(before: string): Promise<readonly DeployRecord[]>;
289
351
  }
290
352
  /** In-memory store: keeps records in a Map. Used by tests and as an explicit, non-persistent option. */
291
353
  export declare class InMemoryArtifactStore implements ArtifactStore {
@@ -294,13 +356,14 @@ export declare class InMemoryArtifactStore implements ArtifactStore {
294
356
  loadAll(): Promise<readonly DeployRecord[]>;
295
357
  get(deploymentId: string): Promise<DeployRecord | undefined>;
296
358
  getActiveByTenant(ref: TenantRef): Promise<DeployRecord | undefined>;
359
+ getActiveByTenantVersion(ref: TenantRef, serverVersion: string): Promise<DeployRecord | undefined>;
297
360
  activateDeployment(ref: TenantRef, deploymentId: string): Promise<DeploymentActivationResult | undefined>;
298
- updateActiveAccess(ref: TenantRef, accessMode: AccessMode): Promise<DeployRecord | undefined>;
299
- listDeployments(filter: {
300
- org: string;
301
- app?: string;
302
- env?: string;
303
- }): Promise<readonly DeploymentSummary[]>;
361
+ updateActiveAccess(ref: TenantRef, accessMode: AccessMode, serverVersion?: string): Promise<DeployRecord | undefined>;
362
+ listDeployments(filter: DeploymentListFilter): Promise<readonly DeploymentSummary[]>;
363
+ getAppArchivedAt(org: string, app: string): Promise<string | undefined>;
364
+ archiveApp(org: string, app: string, at: string): Promise<AppArchiveResult | undefined>;
365
+ restoreApp(org: string, app: string): Promise<AppRestoreResult | undefined>;
366
+ sweepArchived(before: string): Promise<readonly DeployRecord[]>;
304
367
  }
305
368
  export declare class InMemoryConfigStore implements ConfigStore {
306
369
  #private;
@@ -316,43 +379,10 @@ export declare class InMemoryConfigStore implements ConfigStore {
316
379
  listConfigValues(kind: ManagedConfigKind, scope: ConfigScope): Promise<readonly ConfigValueMetadata[]>;
317
380
  resolveConfigValues(kind: ManagedConfigKind, scope: ConfigScope): Promise<Record<string, string>>;
318
381
  }
319
- /**
320
- * JSON-file store: one file per deployment at `<dataDir>/deployments/<deploymentId>.json`, written atomically
321
- * (write a temp file, then `rename` over the target — no partial file is ever read). `deploymentId` is a
322
- * slug + random hex suffix (`mintDeploymentId`), so it is a safe, collision-free filename. No new
323
- * dependency — `node:fs/promises` only.
324
- */
325
- export declare class JsonFileArtifactStore implements ArtifactStore {
326
- #private;
327
- constructor(dataDir: string);
328
- append(record: DeployRecord): Promise<void>;
329
- get(deploymentId: string): Promise<DeployRecord | undefined>;
330
- getActiveByTenant(ref: TenantRef): Promise<DeployRecord | undefined>;
331
- updateActiveAccess(ref: TenantRef, accessMode: AccessMode): Promise<DeployRecord | undefined>;
332
- activateDeployment(ref: TenantRef, deploymentId: string): Promise<DeploymentActivationResult | undefined>;
333
- loadAll(): Promise<readonly DeployRecord[]>;
334
- listDeployments(filter: {
335
- org: string;
336
- app?: string;
337
- env?: string;
338
- }): Promise<readonly DeploymentSummary[]>;
339
- }
340
- /** Minted deployment id shape (`mintDeploymentId`): a slug plus a short hex suffix; safe as a filename. */
341
- export declare const DEPLOYMENT_ID_PATTERN: RegExp;
342
- export declare const SLUG_PATTERN: RegExp;
343
- export declare const CONFIG_NAME_PATTERN: RegExp;
344
- export declare const DOMAIN_PATTERN: RegExp;
345
- export declare function validateSlug(kind: 'org' | 'app' | 'env', value: string): string;
346
- export declare function validateTenantRef(ref: TenantRef): TenantRef;
347
- export declare function validateConfigName(name: string): string;
348
- export declare function validateDomain(value: string): string;
349
- export declare function validateSignupAllowlistKind(value: string): SignupAllowlistKind;
350
- export declare function validateConfigScope(scope: ConfigScope): ConfigScope;
351
382
  export declare function resolveConfigScope(input: {
352
383
  readonly org: string;
353
384
  readonly app?: string;
354
385
  readonly env?: string;
355
386
  }): ConfigScope;
356
387
  export declare function scopeChain(scope: ConfigScope): readonly ConfigScope[];
357
- export declare function validateOrgRole(role: string): OrgRole;
358
388
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { mkdir, readdir, readFile, rename, writeFile } from 'node:fs/promises';
3
- import { join } from 'node:path';
1
+ import { normalizeServerVersion } from '@noodle-borg/module';
2
+ import { defaultActiveRecord, sameDeploymentScope, sameTenantRecord, } from './deployment-versioning.js';
3
+ import { appArchivedAt, deploymentSummary, matchesDeploymentFilter, planAppArchive, planAppRestore, validateDeploymentListFilter, withoutArchiveStamp, } from './store/records.js';
4
+ import { validateConfigName, validateConfigScope, validateSlug, validateTenantRef, } from './store/validate.js';
5
+ // Store building blocks extracted by concern (size gate): validators, the JSON-file backend, and the
6
+ // shared record helpers. Re-exported here so `./store.js` stays the single import surface.
7
+ export { JsonFileArtifactStore } from './store/json-file.js';
8
+ export { CONFIG_NAME_PATTERN, DEPLOYMENT_ID_PATTERN, DOMAIN_PATTERN, SLUG_PATTERN, validateConfigName, validateConfigScope, validateDomain, validateOrgRole, validateSignupAllowlistKind, validateSlug, validateTenantRef, } from './store/validate.js';
4
9
  /** In-memory store: keeps records in a Map. Used by tests and as an explicit, non-persistent option. */
5
10
  export class InMemoryArtifactStore {
6
11
  #records = new Map();
@@ -18,11 +23,16 @@ export class InMemoryArtifactStore {
18
23
  return Promise.resolve(this.#records.get(deploymentId));
19
24
  }
20
25
  getActiveByTenant(ref) {
26
+ return Promise.resolve(defaultActiveRecord([...this.#records.values()], validateTenantRef(ref)));
27
+ }
28
+ getActiveByTenantVersion(ref, serverVersion) {
29
+ const safe = validateTenantRef(ref);
30
+ const safeVersion = normalizeServerVersion(serverVersion);
21
31
  return Promise.resolve([...this.#records.values()]
22
32
  .filter((record) => record.active &&
23
- record.orgSlug === ref.org &&
24
- record.appSlug === ref.app &&
25
- record.environment === ref.env)
33
+ record.archivedAt === undefined &&
34
+ sameTenantRecord(record, safe) &&
35
+ record.serverVersion === safeVersion)
26
36
  .sort((a, b) => b.deploymentVersion - a.deploymentVersion)[0]);
27
37
  }
28
38
  activateDeployment(ref, deploymentId) {
@@ -31,7 +41,7 @@ export class InMemoryArtifactStore {
31
41
  if (target === undefined || !sameTenantRecord(target, safe))
32
42
  return Promise.resolve(undefined);
33
43
  const previousActive = [...this.#records.values()]
34
- .filter((record) => record.active && sameTenantRecord(record, safe))
44
+ .filter((record) => record.active && sameDeploymentScope(record, target))
35
45
  .sort((a, b) => b.deploymentVersion - a.deploymentVersion)[0];
36
46
  const alreadyActive = previousActive?.deploymentId === target.deploymentId;
37
47
  if (!alreadyActive) {
@@ -46,13 +56,16 @@ export class InMemoryArtifactStore {
46
56
  }
47
57
  #deactivateTenant(record) {
48
58
  for (const [id, existing] of this.#records) {
49
- if (existing.active && sameTenantRecord(existing, record)) {
59
+ if (existing.active && sameDeploymentScope(existing, record)) {
50
60
  this.#records.set(id, { ...existing, active: false });
51
61
  }
52
62
  }
53
63
  }
54
- updateActiveAccess(ref, accessMode) {
55
- return this.getActiveByTenant(ref).then((record) => {
64
+ updateActiveAccess(ref, accessMode, serverVersion) {
65
+ const recordPromise = serverVersion === undefined
66
+ ? this.getActiveByTenant(ref)
67
+ : this.getActiveByTenantVersion(ref, serverVersion);
68
+ return recordPromise.then((record) => {
56
69
  if (record === undefined)
57
70
  return undefined;
58
71
  const updated = { ...record, accessMode };
@@ -61,16 +74,48 @@ export class InMemoryArtifactStore {
61
74
  });
62
75
  }
63
76
  listDeployments(filter) {
64
- const org = validateSlug('org', filter.org);
65
- const app = filter.app !== undefined ? validateSlug('app', filter.app) : undefined;
66
- const env = filter.env !== undefined ? validateSlug('env', filter.env) : undefined;
77
+ const safe = validateDeploymentListFilter(filter);
67
78
  return Promise.resolve([...this.#records.values()]
68
- .filter((record) => record.orgSlug === org &&
69
- (app === undefined || record.appSlug === app) &&
70
- (env === undefined || record.environment === env))
79
+ .filter((record) => matchesDeploymentFilter(record, safe))
71
80
  .sort((a, b) => b.deploymentVersion - a.deploymentVersion)
72
81
  .map(deploymentSummary));
73
82
  }
83
+ getAppArchivedAt(org, app) {
84
+ return Promise.resolve(appArchivedAt(this.#appRecords(org, app)));
85
+ }
86
+ archiveApp(org, app, at) {
87
+ const plan = planAppArchive(this.#appRecords(org, app), at);
88
+ if (plan === undefined)
89
+ return Promise.resolve(undefined);
90
+ for (const record of plan.stamp) {
91
+ this.#records.set(record.deploymentId, { ...record, archivedAt: plan.result.archivedAt });
92
+ }
93
+ return Promise.resolve(plan.result);
94
+ }
95
+ restoreApp(org, app) {
96
+ const plan = planAppRestore(this.#appRecords(org, app));
97
+ if (plan === undefined)
98
+ return Promise.resolve(undefined);
99
+ for (const record of plan.clear) {
100
+ this.#records.set(record.deploymentId, withoutArchiveStamp(record));
101
+ }
102
+ return Promise.resolve(plan.result);
103
+ }
104
+ sweepArchived(before) {
105
+ const deleted = [];
106
+ for (const [id, record] of this.#records) {
107
+ if (record.archivedAt !== undefined && record.archivedAt < before) {
108
+ deleted.push(record);
109
+ this.#records.delete(id);
110
+ }
111
+ }
112
+ return Promise.resolve(deleted);
113
+ }
114
+ #appRecords(org, app) {
115
+ const safeOrg = validateSlug('org', org);
116
+ const safeApp = validateSlug('app', app);
117
+ return [...this.#records.values()].filter((record) => record.orgSlug === safeOrg && record.appSlug === safeApp);
118
+ }
74
119
  }
75
120
  export class InMemoryConfigStore {
76
121
  #records = new Map();
@@ -110,185 +155,6 @@ export class InMemoryConfigStore {
110
155
  return Promise.resolve(out);
111
156
  }
112
157
  }
113
- /**
114
- * JSON-file store: one file per deployment at `<dataDir>/deployments/<deploymentId>.json`, written atomically
115
- * (write a temp file, then `rename` over the target — no partial file is ever read). `deploymentId` is a
116
- * slug + random hex suffix (`mintDeploymentId`), so it is a safe, collision-free filename. No new
117
- * dependency — `node:fs/promises` only.
118
- */
119
- export class JsonFileArtifactStore {
120
- #dir;
121
- constructor(dataDir) {
122
- this.#dir = join(dataDir, 'deployments');
123
- }
124
- async append(record) {
125
- // Defence in depth: `deploymentId` becomes a filename, so reject anything outside the minted shape
126
- // (`mintDeploymentId` only ever produces `[a-z0-9-]`). Guards this public class against a caller that
127
- // passes an untrusted id (no path traversal, no escaping the data dir).
128
- validateTenantRef({ org: record.orgSlug, app: record.appSlug, env: record.environment });
129
- if (!DEPLOYMENT_ID_PATTERN.test(record.deploymentId)) {
130
- throw new Error(`invalid deploymentId for persistence: "${record.deploymentId}"`);
131
- }
132
- if (record.active) {
133
- const records = await this.loadAll();
134
- await Promise.all(records
135
- .filter((existing) => existing.active && sameTenantRecord(existing, record))
136
- .map((existing) => this.#writeRecord({ ...existing, active: false })));
137
- }
138
- await this.#writeRecord(record);
139
- }
140
- async get(deploymentId) {
141
- // An invalid id can never be a file we wrote; treat as absent (also closes off any traversal).
142
- if (!DEPLOYMENT_ID_PATTERN.test(deploymentId))
143
- return undefined;
144
- try {
145
- const text = await readFile(join(this.#dir, `${deploymentId}.json`), 'utf8');
146
- return JSON.parse(text);
147
- }
148
- catch {
149
- // Fail-soft: ENOENT (no such server) or a corrupt/unreadable file both read as `undefined`.
150
- return undefined;
151
- }
152
- }
153
- async getActiveByTenant(ref) {
154
- validateTenantRef(ref);
155
- return (await this.loadAll())
156
- .filter((record) => record.active &&
157
- record.orgSlug === ref.org &&
158
- record.appSlug === ref.app &&
159
- record.environment === ref.env)
160
- .sort((a, b) => b.deploymentVersion - a.deploymentVersion)[0];
161
- }
162
- async updateActiveAccess(ref, accessMode) {
163
- const record = await this.getActiveByTenant(ref);
164
- if (record === undefined)
165
- return undefined;
166
- const updated = { ...record, accessMode };
167
- await this.append(updated);
168
- return updated;
169
- }
170
- async activateDeployment(ref, deploymentId) {
171
- const safe = validateTenantRef(ref);
172
- if (!DEPLOYMENT_ID_PATTERN.test(deploymentId))
173
- return undefined;
174
- const target = await this.get(deploymentId);
175
- if (target === undefined || !sameTenantRecord(target, safe))
176
- return undefined;
177
- const records = await this.loadAll();
178
- const previousActive = records
179
- .filter((record) => record.active && sameTenantRecord(record, safe))
180
- .sort((a, b) => b.deploymentVersion - a.deploymentVersion)[0];
181
- const alreadyActive = previousActive?.deploymentId === target.deploymentId;
182
- if (!alreadyActive) {
183
- await Promise.all(records
184
- .filter((record) => record.active && sameTenantRecord(record, safe))
185
- .map((record) => this.#writeRecord({ ...record, active: false })));
186
- await this.#writeRecord({ ...target, active: true });
187
- }
188
- return {
189
- active: { ...target, active: true },
190
- ...(previousActive !== undefined ? { previousActive } : {}),
191
- alreadyActive,
192
- };
193
- }
194
- async loadAll() {
195
- let names;
196
- try {
197
- names = await readdir(this.#dir);
198
- }
199
- catch (error) {
200
- if (error.code === 'ENOENT')
201
- return [];
202
- throw error;
203
- }
204
- const records = [];
205
- for (const name of names) {
206
- if (!name.endsWith('.json'))
207
- continue; // skip in-flight *.tmp files
208
- try {
209
- const text = await readFile(join(this.#dir, name), 'utf8');
210
- records.push(JSON.parse(text));
211
- }
212
- catch {
213
- // Fail-soft: a corrupt/unreadable record file must NOT crash startup — skip it and let the
214
- // other servers recover. (Visibility of skipped files lands with structured logging, Slice 27.)
215
- }
216
- }
217
- return records;
218
- }
219
- listDeployments(filter) {
220
- const org = validateSlug('org', filter.org);
221
- const app = filter.app !== undefined ? validateSlug('app', filter.app) : undefined;
222
- const env = filter.env !== undefined ? validateSlug('env', filter.env) : undefined;
223
- return this.loadAll().then((records) => records
224
- .filter((record) => record.orgSlug === org &&
225
- (app === undefined || record.appSlug === app) &&
226
- (env === undefined || record.environment === env))
227
- .sort((a, b) => b.deploymentVersion - a.deploymentVersion)
228
- .map(deploymentSummary));
229
- }
230
- async #writeRecord(record) {
231
- await mkdir(this.#dir, { recursive: true });
232
- const target = join(this.#dir, `${record.deploymentId}.json`);
233
- const tmp = `${target}.${randomUUID()}.tmp`;
234
- await writeFile(tmp, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
235
- await rename(tmp, target);
236
- }
237
- }
238
- /** Minted deployment id shape (`mintDeploymentId`): a slug plus a short hex suffix; safe as a filename. */
239
- export const DEPLOYMENT_ID_PATTERN = /^[a-z0-9-]+$/;
240
- export const SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
241
- export const CONFIG_NAME_PATTERN = /^[A-Za-z0-9_]+$/;
242
- export const DOMAIN_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,62}\.)+[a-z0-9-]{2,63}$/;
243
- const RESERVED_SLUGS = new Set(['deploy', 'healthz', 'readyz', 'v1', 'o', 'mcp']);
244
- export function validateSlug(kind, value) {
245
- if (!SLUG_PATTERN.test(value) || RESERVED_SLUGS.has(value)) {
246
- throw new Error(`invalid ${kind} slug "${value}"; use lowercase letters, numbers, and hyphens only`);
247
- }
248
- return value;
249
- }
250
- export function validateTenantRef(ref) {
251
- return {
252
- org: validateSlug('org', ref.org),
253
- app: validateSlug('app', ref.app),
254
- env: validateSlug('env', ref.env),
255
- };
256
- }
257
- export function validateConfigName(name) {
258
- if (!CONFIG_NAME_PATTERN.test(name)) {
259
- throw new Error(`invalid config name "${name}"; use letters, numbers, and underscores only`);
260
- }
261
- return name;
262
- }
263
- export function validateDomain(value) {
264
- const domain = value.trim().toLowerCase();
265
- if (!DOMAIN_PATTERN.test(domain)) {
266
- throw new Error(`invalid domain "${value}"`);
267
- }
268
- return domain;
269
- }
270
- export function validateSignupAllowlistKind(value) {
271
- if (value !== 'subject' && value !== 'domain')
272
- throw new Error(`invalid signup allowlist kind "${value}"`);
273
- return value;
274
- }
275
- export function validateConfigScope(scope) {
276
- if (scope.level === 'org')
277
- return { level: 'org', org: validateSlug('org', scope.org) };
278
- if (scope.level === 'app') {
279
- return {
280
- level: 'app',
281
- org: validateSlug('org', scope.org),
282
- app: validateSlug('app', scope.app),
283
- };
284
- }
285
- return {
286
- level: 'env',
287
- org: validateSlug('org', scope.org),
288
- app: validateSlug('app', scope.app),
289
- env: validateSlug('env', scope.env),
290
- };
291
- }
292
158
  export function resolveConfigScope(input) {
293
159
  if (input.env !== undefined) {
294
160
  if (input.app === undefined)
@@ -310,35 +176,6 @@ export function scopeChain(scope) {
310
176
  scope,
311
177
  ];
312
178
  }
313
- export function validateOrgRole(role) {
314
- if (role !== 'owner' && role !== 'developer') {
315
- throw new Error(`invalid org role "${role}"`);
316
- }
317
- return role;
318
- }
319
- function deploymentSummary(record) {
320
- return {
321
- deploymentId: record.deploymentId,
322
- orgSlug: record.orgSlug,
323
- appSlug: record.appSlug,
324
- environment: record.environment,
325
- active: record.active,
326
- serverName: record.serverName,
327
- createdAt: record.createdAt,
328
- ...(record.createdByEmail !== undefined ? { createdByEmail: record.createdByEmail } : {}),
329
- accessMode: record.accessMode ?? 'owner-only',
330
- };
331
- }
332
- function sameTenantRecord(record, tenant) {
333
- if ('org' in tenant) {
334
- return (record.orgSlug === tenant.org &&
335
- record.appSlug === tenant.app &&
336
- record.environment === tenant.env);
337
- }
338
- return (record.orgSlug === tenant.orgSlug &&
339
- record.appSlug === tenant.appSlug &&
340
- record.environment === tenant.environment);
341
- }
342
179
  function configKey(kind, scope, name) {
343
180
  return `${kind}/${scopePath(scope)}/${name}`;
344
181
  }