primitive-admin 1.1.0-alpha.9 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/README.md +523 -109
  2. package/assets/skill/skills/primitive-platform/SKILL.md +289 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +372 -21
  5. package/dist/bin/primitive.js.map +1 -1
  6. package/dist/src/commands/admins.d.ts +2 -0
  7. package/dist/src/commands/admins.js +136 -30
  8. package/dist/src/commands/admins.js.map +1 -1
  9. package/dist/src/commands/analytics.d.ts +2 -0
  10. package/dist/src/commands/analytics.js +713 -55
  11. package/dist/src/commands/analytics.js.map +1 -1
  12. package/dist/src/commands/apps.d.ts +2 -0
  13. package/dist/src/commands/apps.js +65 -100
  14. package/dist/src/commands/apps.js.map +1 -1
  15. package/dist/src/commands/auth-sessions.d.ts +7 -0
  16. package/dist/src/commands/auth-sessions.js +144 -0
  17. package/dist/src/commands/auth-sessions.js.map +1 -0
  18. package/dist/src/commands/auth.d.ts +2 -0
  19. package/dist/src/commands/auth.js +238 -108
  20. package/dist/src/commands/auth.js.map +1 -1
  21. package/dist/src/commands/blob-buckets.d.ts +2 -0
  22. package/dist/src/commands/blob-buckets.js +331 -0
  23. package/dist/src/commands/blob-buckets.js.map +1 -0
  24. package/dist/src/commands/catalog.d.ts +2 -0
  25. package/dist/src/commands/catalog.js +63 -48
  26. package/dist/src/commands/catalog.js.map +1 -1
  27. package/dist/src/commands/collection-type-configs.d.ts +2 -0
  28. package/dist/src/commands/collection-type-configs.js +85 -0
  29. package/dist/src/commands/collection-type-configs.js.map +1 -0
  30. package/dist/src/commands/collections.d.ts +2 -0
  31. package/dist/src/commands/collections.js +1282 -0
  32. package/dist/src/commands/collections.js.map +1 -0
  33. package/dist/src/commands/comparisons.d.ts +2 -0
  34. package/dist/src/commands/comparisons.js +6 -6
  35. package/dist/src/commands/comparisons.js.map +1 -1
  36. package/dist/src/commands/config.d.ts +46 -0
  37. package/dist/src/commands/config.js +465 -0
  38. package/dist/src/commands/config.js.map +1 -0
  39. package/dist/src/commands/connections.d.ts +2 -0
  40. package/dist/src/commands/connections.js +99 -0
  41. package/dist/src/commands/connections.js.map +1 -0
  42. package/dist/src/commands/cron-triggers.d.ts +2 -0
  43. package/dist/src/commands/cron-triggers.js +266 -0
  44. package/dist/src/commands/cron-triggers.js.map +1 -0
  45. package/dist/src/commands/database-type-configs.d.ts +2 -0
  46. package/dist/src/commands/database-type-configs.js +164 -0
  47. package/dist/src/commands/database-type-configs.js.map +1 -0
  48. package/dist/src/commands/database-types.d.ts +2 -0
  49. package/dist/src/commands/database-types.js +471 -0
  50. package/dist/src/commands/database-types.js.map +1 -0
  51. package/dist/src/commands/databases.d.ts +65 -0
  52. package/dist/src/commands/databases.js +1887 -243
  53. package/dist/src/commands/databases.js.map +1 -1
  54. package/dist/src/commands/documents.d.ts +60 -0
  55. package/dist/src/commands/documents.js +2888 -22
  56. package/dist/src/commands/documents.js.map +1 -1
  57. package/dist/src/commands/email-templates.d.ts +2 -0
  58. package/dist/src/commands/email-templates.js +175 -0
  59. package/dist/src/commands/email-templates.js.map +1 -0
  60. package/dist/src/commands/env.d.ts +23 -0
  61. package/dist/src/commands/env.js +395 -0
  62. package/dist/src/commands/env.js.map +1 -0
  63. package/dist/src/commands/feature-flags.d.ts +14 -0
  64. package/dist/src/commands/feature-flags.js +117 -0
  65. package/dist/src/commands/feature-flags.js.map +1 -0
  66. package/dist/src/commands/functions.d.ts +20 -0
  67. package/dist/src/commands/functions.js +1630 -0
  68. package/dist/src/commands/functions.js.map +1 -0
  69. package/dist/src/commands/group-type-configs.d.ts +2 -0
  70. package/dist/src/commands/group-type-configs.js +87 -0
  71. package/dist/src/commands/group-type-configs.js.map +1 -0
  72. package/dist/src/commands/groups.d.ts +2 -0
  73. package/dist/src/commands/groups.js +65 -113
  74. package/dist/src/commands/groups.js.map +1 -1
  75. package/dist/src/commands/guides.d.ts +223 -0
  76. package/dist/src/commands/guides.js +627 -69
  77. package/dist/src/commands/guides.js.map +1 -1
  78. package/dist/src/commands/init.d.ts +37 -0
  79. package/dist/src/commands/init.js +1693 -208
  80. package/dist/src/commands/init.js.map +1 -1
  81. package/dist/src/commands/integrations.d.ts +2 -0
  82. package/dist/src/commands/integrations.js +428 -187
  83. package/dist/src/commands/integrations.js.map +1 -1
  84. package/dist/src/commands/llm.d.ts +2 -0
  85. package/dist/src/commands/llm.js +4 -2
  86. package/dist/src/commands/llm.js.map +1 -1
  87. package/dist/src/commands/locks.d.ts +8 -0
  88. package/dist/src/commands/locks.js +175 -0
  89. package/dist/src/commands/locks.js.map +1 -0
  90. package/dist/src/commands/metadata-category-configs.d.ts +12 -0
  91. package/dist/src/commands/metadata-category-configs.js +113 -0
  92. package/dist/src/commands/metadata-category-configs.js.map +1 -0
  93. package/dist/src/commands/metadata.d.ts +2 -0
  94. package/dist/src/commands/metadata.js +288 -0
  95. package/dist/src/commands/metadata.js.map +1 -0
  96. package/dist/src/commands/prompts.d.ts +2 -0
  97. package/dist/src/commands/prompts.js +322 -634
  98. package/dist/src/commands/prompts.js.map +1 -1
  99. package/dist/src/commands/rule-sets.d.ts +3 -0
  100. package/dist/src/commands/rule-sets.js +139 -148
  101. package/dist/src/commands/rule-sets.js.map +1 -1
  102. package/dist/src/commands/scripts.d.ts +30 -0
  103. package/dist/src/commands/scripts.js +688 -0
  104. package/dist/src/commands/scripts.js.map +1 -0
  105. package/dist/src/commands/secrets.d.ts +2 -0
  106. package/dist/src/commands/secrets.js +109 -0
  107. package/dist/src/commands/secrets.js.map +1 -0
  108. package/dist/src/commands/sessions.d.ts +2 -0
  109. package/dist/src/commands/sessions.js +76 -0
  110. package/dist/src/commands/sessions.js.map +1 -0
  111. package/dist/src/commands/skill.d.ts +2 -0
  112. package/dist/src/commands/skill.js +29 -0
  113. package/dist/src/commands/skill.js.map +1 -0
  114. package/dist/src/commands/sync-app-settings.d.ts +158 -0
  115. package/dist/src/commands/sync-app-settings.js +328 -0
  116. package/dist/src/commands/sync-app-settings.js.map +1 -0
  117. package/dist/src/commands/sync.d.ts +2670 -0
  118. package/dist/src/commands/sync.js +17144 -834
  119. package/dist/src/commands/sync.js.map +1 -1
  120. package/dist/src/commands/tokens.d.ts +2 -0
  121. package/dist/src/commands/tokens.js +132 -22
  122. package/dist/src/commands/tokens.js.map +1 -1
  123. package/dist/src/commands/users.d.ts +2 -0
  124. package/dist/src/commands/users.js +542 -24
  125. package/dist/src/commands/users.js.map +1 -1
  126. package/dist/src/commands/vars.d.ts +8 -0
  127. package/dist/src/commands/vars.js +97 -0
  128. package/dist/src/commands/vars.js.map +1 -0
  129. package/dist/src/commands/waitlist.d.ts +2 -0
  130. package/dist/src/commands/waitlist.js +12 -11
  131. package/dist/src/commands/waitlist.js.map +1 -1
  132. package/dist/src/commands/webhooks.d.ts +31 -0
  133. package/dist/src/commands/webhooks.js +633 -0
  134. package/dist/src/commands/webhooks.js.map +1 -0
  135. package/dist/src/commands/workflows.d.ts +88 -0
  136. package/dist/src/commands/workflows.js +1568 -742
  137. package/dist/src/commands/workflows.js.map +1 -1
  138. package/dist/src/lib/access-rule-display.d.ts +21 -0
  139. package/dist/src/lib/access-rule-display.js +34 -0
  140. package/dist/src/lib/access-rule-display.js.map +1 -0
  141. package/dist/src/lib/api-client.d.ts +2550 -0
  142. package/dist/src/lib/api-client.js +2503 -160
  143. package/dist/src/lib/api-client.js.map +1 -1
  144. package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
  145. package/dist/src/lib/app-settings-descriptor.js +583 -0
  146. package/dist/src/lib/app-settings-descriptor.js.map +1 -0
  147. package/dist/src/lib/auth-flow.d.ts +8 -0
  148. package/dist/src/lib/batch.d.ts +26 -0
  149. package/dist/src/lib/batch.js +32 -0
  150. package/dist/src/lib/batch.js.map +1 -0
  151. package/dist/src/lib/block-layout.d.ts +160 -0
  152. package/dist/src/lib/block-layout.js +451 -0
  153. package/dist/src/lib/block-layout.js.map +1 -0
  154. package/dist/src/lib/block-selector.d.ts +58 -0
  155. package/dist/src/lib/block-selector.js +92 -0
  156. package/dist/src/lib/block-selector.js.map +1 -0
  157. package/dist/src/lib/canonical-json.d.ts +12 -0
  158. package/dist/src/lib/canonical-json.js +35 -0
  159. package/dist/src/lib/canonical-json.js.map +1 -0
  160. package/dist/src/lib/channel.d.ts +30 -0
  161. package/dist/src/lib/channel.js +68 -0
  162. package/dist/src/lib/channel.js.map +1 -0
  163. package/dist/src/lib/cli-manifest.d.ts +68 -0
  164. package/dist/src/lib/cli-manifest.js +71 -0
  165. package/dist/src/lib/cli-manifest.js.map +1 -0
  166. package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
  167. package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
  168. package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
  169. package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
  170. package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
  171. package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
  172. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +38 -0
  173. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +46 -0
  174. package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
  175. package/dist/src/lib/collection-export.d.ts +184 -0
  176. package/dist/src/lib/collection-export.js +252 -0
  177. package/dist/src/lib/collection-export.js.map +1 -0
  178. package/dist/src/lib/config-json-field.d.ts +28 -0
  179. package/dist/src/lib/config-json-field.js +56 -0
  180. package/dist/src/lib/config-json-field.js.map +1 -0
  181. package/dist/src/lib/config-object-descriptor.d.ts +127 -0
  182. package/dist/src/lib/config-object-descriptor.js +740 -0
  183. package/dist/src/lib/config-object-descriptor.js.map +1 -0
  184. package/dist/src/lib/config-payload.d.ts +92 -0
  185. package/dist/src/lib/config-payload.js +161 -0
  186. package/dist/src/lib/config-payload.js.map +1 -0
  187. package/dist/src/lib/config-surface.d.ts +141 -0
  188. package/dist/src/lib/config-surface.js +368 -0
  189. package/dist/src/lib/config-surface.js.map +1 -0
  190. package/dist/src/lib/config-toml.d.ts +10 -0
  191. package/dist/src/lib/config-toml.js +42 -0
  192. package/dist/src/lib/config-toml.js.map +1 -0
  193. package/dist/src/lib/config.d.ts +71 -0
  194. package/dist/src/lib/config.js +71 -68
  195. package/dist/src/lib/config.js.map +1 -1
  196. package/dist/src/lib/confirm-prompt.d.ts +83 -0
  197. package/dist/src/lib/confirm-prompt.js +110 -0
  198. package/dist/src/lib/confirm-prompt.js.map +1 -0
  199. package/dist/src/lib/constants.d.ts +11 -0
  200. package/dist/src/lib/constants.js +12 -0
  201. package/dist/src/lib/constants.js.map +1 -0
  202. package/dist/src/lib/crash-handlers.d.ts +20 -0
  203. package/dist/src/lib/crash-handlers.js +49 -0
  204. package/dist/src/lib/crash-handlers.js.map +1 -0
  205. package/dist/src/lib/credentials-store.d.ts +104 -0
  206. package/dist/src/lib/credentials-store.js +336 -0
  207. package/dist/src/lib/credentials-store.js.map +1 -0
  208. package/dist/src/lib/csv.d.ts +47 -0
  209. package/dist/src/lib/csv.js +172 -0
  210. package/dist/src/lib/csv.js.map +1 -0
  211. package/dist/src/lib/data-input.d.ts +23 -0
  212. package/dist/src/lib/data-input.js +50 -0
  213. package/dist/src/lib/data-input.js.map +1 -0
  214. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  215. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  216. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  217. package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
  218. package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
  219. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  220. package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
  221. package/dist/src/lib/db-codegen/dbNaming.js +180 -0
  222. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  223. package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
  224. package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
  225. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  226. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
  227. package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
  228. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  229. package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
  230. package/dist/src/lib/db-codegen/dbTypeIR.js +525 -0
  231. package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
  232. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
  233. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
  234. package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
  235. package/dist/src/lib/deprecation.d.ts +22 -0
  236. package/dist/src/lib/deprecation.js +43 -0
  237. package/dist/src/lib/deprecation.js.map +1 -0
  238. package/dist/src/lib/document-export-permissions.d.ts +30 -0
  239. package/dist/src/lib/document-export-permissions.js +54 -0
  240. package/dist/src/lib/document-export-permissions.js.map +1 -0
  241. package/dist/src/lib/document-ingest-artifact.d.ts +120 -0
  242. package/dist/src/lib/document-ingest-artifact.js +505 -0
  243. package/dist/src/lib/document-ingest-artifact.js.map +1 -0
  244. package/dist/src/lib/document-ingest-input.d.ts +51 -0
  245. package/dist/src/lib/document-ingest-input.js +132 -0
  246. package/dist/src/lib/document-ingest-input.js.map +1 -0
  247. package/dist/src/lib/document-ingest-rows.d.ts +137 -0
  248. package/dist/src/lib/document-ingest-rows.js +181 -0
  249. package/dist/src/lib/document-ingest-rows.js.map +1 -0
  250. package/dist/src/lib/document-ingest.d.ts +101 -0
  251. package/dist/src/lib/document-ingest.js +384 -0
  252. package/dist/src/lib/document-ingest.js.map +1 -0
  253. package/dist/src/lib/env-resolver-core.d.ts +258 -0
  254. package/dist/src/lib/env-resolver-core.js +447 -0
  255. package/dist/src/lib/env-resolver-core.js.map +1 -0
  256. package/dist/src/lib/env-resolver.d.ts +99 -0
  257. package/dist/src/lib/env-resolver.js +153 -0
  258. package/dist/src/lib/env-resolver.js.map +1 -0
  259. package/dist/src/lib/fetch.d.ts +5 -0
  260. package/dist/src/lib/function-bundle.d.ts +147 -0
  261. package/dist/src/lib/function-bundle.js +341 -0
  262. package/dist/src/lib/function-bundle.js.map +1 -0
  263. package/dist/src/lib/function-collect.d.ts +123 -0
  264. package/dist/src/lib/function-collect.js +610 -0
  265. package/dist/src/lib/function-collect.js.map +1 -0
  266. package/dist/src/lib/function-db-types.d.ts +202 -0
  267. package/dist/src/lib/function-db-types.js +870 -0
  268. package/dist/src/lib/function-db-types.js.map +1 -0
  269. package/dist/src/lib/function-document-types.d.ts +144 -0
  270. package/dist/src/lib/function-document-types.js +370 -0
  271. package/dist/src/lib/function-document-types.js.map +1 -0
  272. package/dist/src/lib/function-grants-preflight.d.ts +64 -0
  273. package/dist/src/lib/function-grants-preflight.js +105 -0
  274. package/dist/src/lib/function-grants-preflight.js.map +1 -0
  275. package/dist/src/lib/function-log-lines.d.ts +76 -0
  276. package/dist/src/lib/function-log-lines.js +160 -0
  277. package/dist/src/lib/function-log-lines.js.map +1 -0
  278. package/dist/src/lib/function-log-row.d.ts +29 -0
  279. package/dist/src/lib/function-log-row.js +73 -0
  280. package/dist/src/lib/function-log-row.js.map +1 -0
  281. package/dist/src/lib/function-log-tail.d.ts +132 -0
  282. package/dist/src/lib/function-log-tail.js +262 -0
  283. package/dist/src/lib/function-log-tail.js.map +1 -0
  284. package/dist/src/lib/function-run.d.ts +289 -0
  285. package/dist/src/lib/function-run.js +389 -0
  286. package/dist/src/lib/function-run.js.map +1 -0
  287. package/dist/src/lib/function-schema-codegen.d.ts +143 -0
  288. package/dist/src/lib/function-schema-codegen.js +420 -0
  289. package/dist/src/lib/function-schema-codegen.js.map +1 -0
  290. package/dist/src/lib/function-sync.d.ts +459 -0
  291. package/dist/src/lib/function-sync.js +1258 -0
  292. package/dist/src/lib/function-sync.js.map +1 -0
  293. package/dist/src/lib/function-trigger-listing.d.ts +27 -0
  294. package/dist/src/lib/function-trigger-listing.js +70 -0
  295. package/dist/src/lib/function-trigger-listing.js.map +1 -0
  296. package/dist/src/lib/function-typecheck.d.ts +86 -0
  297. package/dist/src/lib/function-typecheck.js +370 -0
  298. package/dist/src/lib/function-typecheck.js.map +1 -0
  299. package/dist/src/lib/function-versions.d.ts +122 -0
  300. package/dist/src/lib/function-versions.js +182 -0
  301. package/dist/src/lib/function-versions.js.map +1 -0
  302. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  303. package/dist/src/lib/generated-allowlist.js +281 -0
  304. package/dist/src/lib/generated-allowlist.js.map +1 -0
  305. package/dist/src/lib/generated-config-surfaces.d.ts +2936 -0
  306. package/dist/src/lib/generated-config-surfaces.js +10569 -0
  307. package/dist/src/lib/generated-config-surfaces.js.map +1 -0
  308. package/dist/src/lib/generated-sdk-types.d.ts +12 -0
  309. package/dist/src/lib/generated-sdk-types.js +13 -0
  310. package/dist/src/lib/generated-sdk-types.js.map +1 -0
  311. package/dist/src/lib/generated-template-lint.d.ts +212 -0
  312. package/dist/src/lib/generated-template-lint.js +624 -0
  313. package/dist/src/lib/generated-template-lint.js.map +1 -0
  314. package/dist/src/lib/init-adopt.d.ts +16 -0
  315. package/dist/src/lib/init-adopt.js +34 -0
  316. package/dist/src/lib/init-adopt.js.map +1 -0
  317. package/dist/src/lib/init-assets.d.ts +39 -0
  318. package/dist/src/lib/init-assets.js +97 -0
  319. package/dist/src/lib/init-assets.js.map +1 -0
  320. package/dist/src/lib/init-client-platforms.d.ts +14 -0
  321. package/dist/src/lib/init-client-platforms.js +71 -0
  322. package/dist/src/lib/init-client-platforms.js.map +1 -0
  323. package/dist/src/lib/init-config.d.ts +98 -0
  324. package/dist/src/lib/init-config.js +186 -0
  325. package/dist/src/lib/init-config.js.map +1 -0
  326. package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
  327. package/dist/src/lib/init-email-redirect-uris.js +46 -0
  328. package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
  329. package/dist/src/lib/init-ios-links.d.ts +91 -0
  330. package/dist/src/lib/init-ios-links.js +219 -0
  331. package/dist/src/lib/init-ios-links.js.map +1 -0
  332. package/dist/src/lib/init-plan.d.ts +80 -0
  333. package/dist/src/lib/init-plan.js +95 -0
  334. package/dist/src/lib/init-plan.js.map +1 -0
  335. package/dist/src/lib/init-production-env.d.ts +48 -0
  336. package/dist/src/lib/init-production-env.js +59 -0
  337. package/dist/src/lib/init-production-env.js.map +1 -0
  338. package/dist/src/lib/init-schema.d.ts +74 -0
  339. package/dist/src/lib/init-schema.js +358 -0
  340. package/dist/src/lib/init-schema.js.map +1 -0
  341. package/dist/src/lib/init-xcode.d.ts +34 -0
  342. package/dist/src/lib/init-xcode.js +138 -0
  343. package/dist/src/lib/init-xcode.js.map +1 -0
  344. package/dist/src/lib/integration-request-config.d.ts +30 -0
  345. package/dist/src/lib/integration-request-config.js +145 -0
  346. package/dist/src/lib/integration-request-config.js.map +1 -0
  347. package/dist/src/lib/integration-selector.d.ts +42 -0
  348. package/dist/src/lib/integration-selector.js +46 -0
  349. package/dist/src/lib/integration-selector.js.map +1 -0
  350. package/dist/src/lib/ios-app-id.d.ts +34 -0
  351. package/dist/src/lib/ios-app-id.js +69 -0
  352. package/dist/src/lib/ios-app-id.js.map +1 -0
  353. package/dist/src/lib/list-options.d.ts +68 -0
  354. package/dist/src/lib/list-options.js +89 -0
  355. package/dist/src/lib/list-options.js.map +1 -0
  356. package/dist/src/lib/local-state.d.ts +55 -0
  357. package/dist/src/lib/local-state.js +167 -0
  358. package/dist/src/lib/local-state.js.map +1 -0
  359. package/dist/src/lib/local-test-cases.d.ts +63 -0
  360. package/dist/src/lib/local-test-cases.js +136 -0
  361. package/dist/src/lib/local-test-cases.js.map +1 -0
  362. package/dist/src/lib/log-inspection.d.ts +715 -0
  363. package/dist/src/lib/log-inspection.js +816 -0
  364. package/dist/src/lib/log-inspection.js.map +1 -0
  365. package/dist/src/lib/logout-admin-session.d.ts +33 -0
  366. package/dist/src/lib/logout-admin-session.js +70 -0
  367. package/dist/src/lib/logout-admin-session.js.map +1 -0
  368. package/dist/src/lib/migration-nag.d.ts +49 -0
  369. package/dist/src/lib/migration-nag.js +163 -0
  370. package/dist/src/lib/migration-nag.js.map +1 -0
  371. package/dist/src/lib/object-status-filter.d.ts +22 -0
  372. package/dist/src/lib/object-status-filter.js +45 -0
  373. package/dist/src/lib/object-status-filter.js.map +1 -0
  374. package/dist/src/lib/output.d.ts +124 -0
  375. package/dist/src/lib/output.js +219 -8
  376. package/dist/src/lib/output.js.map +1 -1
  377. package/dist/src/lib/package-manager.d.ts +140 -0
  378. package/dist/src/lib/package-manager.js +305 -0
  379. package/dist/src/lib/package-manager.js.map +1 -0
  380. package/dist/src/lib/paginate.d.ts +98 -0
  381. package/dist/src/lib/paginate.js +112 -0
  382. package/dist/src/lib/paginate.js.map +1 -0
  383. package/dist/src/lib/platform-owned.d.ts +63 -0
  384. package/dist/src/lib/platform-owned.js +85 -0
  385. package/dist/src/lib/platform-owned.js.map +1 -0
  386. package/dist/src/lib/project-config.d.ts +122 -0
  387. package/dist/src/lib/project-config.js +244 -0
  388. package/dist/src/lib/project-config.js.map +1 -0
  389. package/dist/src/lib/prompt-cost-format.d.ts +11 -0
  390. package/dist/src/lib/prompt-cost-format.js +41 -0
  391. package/dist/src/lib/prompt-cost-format.js.map +1 -0
  392. package/dist/src/lib/prompt-schema-codegen.d.ts +147 -0
  393. package/dist/src/lib/prompt-schema-codegen.js +462 -0
  394. package/dist/src/lib/prompt-schema-codegen.js.map +1 -0
  395. package/dist/src/lib/query-operators.d.ts +43 -0
  396. package/dist/src/lib/query-operators.js +80 -0
  397. package/dist/src/lib/query-operators.js.map +1 -0
  398. package/dist/src/lib/record-filter.d.ts +18 -0
  399. package/dist/src/lib/record-filter.js +55 -0
  400. package/dist/src/lib/record-filter.js.map +1 -0
  401. package/dist/src/lib/refresh-admin-credentials.d.ts +73 -0
  402. package/dist/src/lib/refresh-admin-credentials.js +123 -0
  403. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  404. package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
  405. package/dist/src/lib/resolve-init-dev-port.js +55 -0
  406. package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
  407. package/dist/src/lib/resolve-init-server.d.ts +64 -0
  408. package/dist/src/lib/resolve-init-server.js +77 -0
  409. package/dist/src/lib/resolve-init-server.js.map +1 -0
  410. package/dist/src/lib/resolve-owner.d.ts +19 -0
  411. package/dist/src/lib/resolve-owner.js +20 -0
  412. package/dist/src/lib/resolve-owner.js.map +1 -0
  413. package/dist/src/lib/resolve-platform.d.ts +74 -0
  414. package/dist/src/lib/resolve-platform.js +105 -0
  415. package/dist/src/lib/resolve-platform.js.map +1 -0
  416. package/dist/src/lib/run-status.d.ts +19 -0
  417. package/dist/src/lib/run-status.generated.d.ts +39 -0
  418. package/dist/src/lib/run-status.generated.js +66 -0
  419. package/dist/src/lib/run-status.generated.js.map +1 -0
  420. package/dist/src/lib/run-status.js +19 -0
  421. package/dist/src/lib/run-status.js.map +1 -0
  422. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  423. package/dist/src/lib/server-text-normalization.js +90 -0
  424. package/dist/src/lib/server-text-normalization.js.map +1 -0
  425. package/dist/src/lib/server-url.d.ts +22 -0
  426. package/dist/src/lib/server-url.js +33 -0
  427. package/dist/src/lib/server-url.js.map +1 -0
  428. package/dist/src/lib/signing-secret-status.d.ts +81 -0
  429. package/dist/src/lib/signing-secret-status.js +116 -0
  430. package/dist/src/lib/signing-secret-status.js.map +1 -0
  431. package/dist/src/lib/skill-installer.d.ts +71 -0
  432. package/dist/src/lib/skill-installer.js +441 -0
  433. package/dist/src/lib/skill-installer.js.map +1 -0
  434. package/dist/src/lib/snapshot-audit-source.d.ts +45 -0
  435. package/dist/src/lib/snapshot-audit-source.js +58 -0
  436. package/dist/src/lib/snapshot-audit-source.js.map +1 -0
  437. package/dist/src/lib/snapshot-audit-store.d.ts +52 -0
  438. package/dist/src/lib/snapshot-audit-store.js +196 -0
  439. package/dist/src/lib/snapshot-audit-store.js.map +1 -0
  440. package/dist/src/lib/snapshot-audit.d.ts +207 -0
  441. package/dist/src/lib/snapshot-audit.js +431 -0
  442. package/dist/src/lib/snapshot-audit.js.map +1 -0
  443. package/dist/src/lib/snapshot-build-rows.d.ts +60 -0
  444. package/dist/src/lib/snapshot-build-rows.js +87 -0
  445. package/dist/src/lib/snapshot-build-rows.js.map +1 -0
  446. package/dist/src/lib/snapshot-build.d.ts +50 -0
  447. package/dist/src/lib/snapshot-build.js +111 -0
  448. package/dist/src/lib/snapshot-build.js.map +1 -0
  449. package/dist/src/lib/snapshot-manifest-layout.d.ts +61 -0
  450. package/dist/src/lib/snapshot-manifest-layout.js +70 -0
  451. package/dist/src/lib/snapshot-manifest-layout.js.map +1 -0
  452. package/dist/src/lib/snapshots.d.ts +98 -0
  453. package/dist/src/lib/snapshots.js +294 -0
  454. package/dist/src/lib/snapshots.js.map +1 -0
  455. package/dist/src/lib/step-run-table.d.ts +43 -0
  456. package/dist/src/lib/step-run-table.js +129 -0
  457. package/dist/src/lib/step-run-table.js.map +1 -0
  458. package/dist/src/lib/storage-pending-retry.d.ts +26 -0
  459. package/dist/src/lib/storage-pending-retry.js +42 -0
  460. package/dist/src/lib/storage-pending-retry.js.map +1 -0
  461. package/dist/src/lib/swift-codegen/agentGenerator.d.ts +42 -0
  462. package/dist/src/lib/swift-codegen/agentGenerator.js +118 -0
  463. package/dist/src/lib/swift-codegen/agentGenerator.js.map +1 -0
  464. package/dist/src/lib/swift-codegen/banners.d.ts +24 -0
  465. package/dist/src/lib/swift-codegen/banners.js +25 -0
  466. package/dist/src/lib/swift-codegen/banners.js.map +1 -0
  467. package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
  468. package/dist/src/lib/swift-codegen/dbGenerator.js +926 -0
  469. package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
  470. package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
  471. package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
  472. package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
  473. package/dist/src/lib/swift-codegen/functionGenerator.d.ts +139 -0
  474. package/dist/src/lib/swift-codegen/functionGenerator.js +462 -0
  475. package/dist/src/lib/swift-codegen/functionGenerator.js.map +1 -0
  476. package/dist/src/lib/swift-codegen/generator.d.ts +100 -0
  477. package/dist/src/lib/swift-codegen/generator.js +457 -0
  478. package/dist/src/lib/swift-codegen/generator.js.map +1 -0
  479. package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +87 -0
  480. package/dist/src/lib/swift-codegen/schemaToSwift.js +661 -0
  481. package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
  482. package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
  483. package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
  484. package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
  485. package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
  486. package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
  487. package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
  488. package/dist/src/lib/sync-dir-selector.d.ts +21 -0
  489. package/dist/src/lib/sync-dir-selector.js +30 -0
  490. package/dist/src/lib/sync-dir-selector.js.map +1 -0
  491. package/dist/src/lib/sync-paths.d.ts +128 -0
  492. package/dist/src/lib/sync-paths.js +195 -0
  493. package/dist/src/lib/sync-paths.js.map +1 -0
  494. package/dist/src/lib/sync-resource-types.d.ts +563 -0
  495. package/dist/src/lib/sync-resource-types.js +1073 -0
  496. package/dist/src/lib/sync-resource-types.js.map +1 -0
  497. package/dist/src/lib/sync-selectors.d.ts +138 -0
  498. package/dist/src/lib/sync-selectors.js +289 -0
  499. package/dist/src/lib/sync-selectors.js.map +1 -0
  500. package/dist/src/lib/template.d.ts +170 -0
  501. package/dist/src/lib/template.js +484 -68
  502. package/dist/src/lib/template.js.map +1 -1
  503. package/dist/src/lib/test-case-file-names.d.ts +40 -0
  504. package/dist/src/lib/test-case-file-names.js +91 -0
  505. package/dist/src/lib/test-case-file-names.js.map +1 -0
  506. package/dist/src/lib/test-case-keys.d.ts +29 -0
  507. package/dist/src/lib/test-case-keys.js +55 -0
  508. package/dist/src/lib/test-case-keys.js.map +1 -0
  509. package/dist/src/lib/test-case-variables.d.ts +29 -0
  510. package/dist/src/lib/test-case-variables.js +71 -0
  511. package/dist/src/lib/test-case-variables.js.map +1 -0
  512. package/dist/src/lib/token-inject.d.ts +56 -0
  513. package/dist/src/lib/token-inject.js +204 -0
  514. package/dist/src/lib/token-inject.js.map +1 -0
  515. package/dist/src/lib/toml-database-config.d.ts +123 -0
  516. package/dist/src/lib/toml-database-config.js +544 -0
  517. package/dist/src/lib/toml-database-config.js.map +1 -0
  518. package/dist/src/lib/toml-metadata-config.d.ts +151 -0
  519. package/dist/src/lib/toml-metadata-config.js +476 -0
  520. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  521. package/dist/src/lib/toml-native-form.d.ts +46 -0
  522. package/dist/src/lib/toml-native-form.js +78 -0
  523. package/dist/src/lib/toml-native-form.js.map +1 -0
  524. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  525. package/dist/src/lib/toml-params-validator.js +298 -0
  526. package/dist/src/lib/toml-params-validator.js.map +1 -0
  527. package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
  528. package/dist/src/lib/toml-scalar-edit.js +283 -0
  529. package/dist/src/lib/toml-scalar-edit.js.map +1 -0
  530. package/dist/src/lib/user-selector.d.ts +24 -0
  531. package/dist/src/lib/user-selector.js +33 -0
  532. package/dist/src/lib/user-selector.js.map +1 -0
  533. package/dist/src/lib/version-check.d.ts +35 -0
  534. package/dist/src/lib/version-check.js +241 -0
  535. package/dist/src/lib/version-check.js.map +1 -0
  536. package/dist/src/lib/watch.d.ts +121 -0
  537. package/dist/src/lib/watch.js +169 -0
  538. package/dist/src/lib/watch.js.map +1 -0
  539. package/dist/src/lib/web-url.d.ts +40 -0
  540. package/dist/src/lib/web-url.js +76 -0
  541. package/dist/src/lib/web-url.js.map +1 -0
  542. package/dist/src/lib/webhook-deliver.d.ts +209 -0
  543. package/dist/src/lib/webhook-deliver.js +519 -0
  544. package/dist/src/lib/webhook-deliver.js.map +1 -0
  545. package/dist/src/lib/workflow-apply.d.ts +110 -0
  546. package/dist/src/lib/workflow-apply.js +164 -0
  547. package/dist/src/lib/workflow-apply.js.map +1 -0
  548. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
  549. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
  550. package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
  551. package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
  552. package/dist/src/lib/workflow-codegen/generator.js +361 -0
  553. package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
  554. package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
  555. package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
  556. package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
  557. package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
  558. package/dist/src/lib/workflow-codegen/naming.js +81 -0
  559. package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
  560. package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
  561. package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
  562. package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
  563. package/dist/src/lib/workflow-config-apply.d.ts +70 -0
  564. package/dist/src/lib/workflow-config-apply.js +137 -0
  565. package/dist/src/lib/workflow-config-apply.js.map +1 -0
  566. package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
  567. package/dist/src/lib/workflow-config-sidecar.js +96 -0
  568. package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
  569. package/dist/src/lib/workflow-defaults.d.ts +29 -0
  570. package/dist/src/lib/workflow-defaults.js +41 -0
  571. package/dist/src/lib/workflow-defaults.js.map +1 -0
  572. package/dist/src/lib/workflow-fragments.d.ts +64 -0
  573. package/dist/src/lib/workflow-fragments.js +342 -0
  574. package/dist/src/lib/workflow-fragments.js.map +1 -0
  575. package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
  576. package/dist/src/lib/workflow-include-preserve.js +286 -0
  577. package/dist/src/lib/workflow-include-preserve.js.map +1 -0
  578. package/dist/src/lib/workflow-payload.d.ts +98 -0
  579. package/dist/src/lib/workflow-payload.js +178 -0
  580. package/dist/src/lib/workflow-payload.js.map +1 -0
  581. package/dist/src/lib/workflow-toml-validator.d.ts +211 -0
  582. package/dist/src/lib/workflow-toml-validator.js +770 -0
  583. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  584. package/dist/src/lib/workflow-usage.d.ts +196 -0
  585. package/dist/src/lib/workflow-usage.js +310 -0
  586. package/dist/src/lib/workflow-usage.js.map +1 -0
  587. package/dist/src/types/index.d.ts +591 -0
  588. package/dist/src/validators.d.ts +65 -0
  589. package/dist/src/validators.js +64 -0
  590. package/dist/src/validators.js.map +1 -0
  591. package/package.json +34 -9
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Asking for a snapshot and, optionally, watching the build that follows
3
+ * (#3666, criterion 7).
4
+ *
5
+ * The request itself is one call; what this module is for is the waiting.
6
+ * The build does not exist when the route answers — a seal arms the alarm and
7
+ * the alarm's first tick begins the build — so the id the caller holds names
8
+ * nothing for a moment, and a read that says "no such build" is `not yet`
9
+ * rather than a failure.
10
+ *
11
+ * Exit codes follow `documents ingest`, as `docs/cli-design.md` records them:
12
+ * 0 the build verified, 1 it failed, 124 a wait that gave up, 130 Ctrl-C.
13
+ * Both ways of giving up on the WATCHING are 124/130 and both say the build
14
+ * keeps running; only the build itself failing is 1. The word `failed`
15
+ * belongs to the build, so nothing this module prints about giving up uses it.
16
+ */
17
+ const POLL_MS = 2_000;
18
+ /**
19
+ * How long CONSECUTIVE failed build reads may run before the wait gives up,
20
+ * and the backoff between them.
21
+ *
22
+ * #3597's lesson, one route along: a read failing says nothing about the
23
+ * build, and a wait that ends on the first one reports a running build as
24
+ * over. The bound is a wall-clock window and any successful read resets it,
25
+ * so an isolated blip costs nothing and only an outage that never lifts ends
26
+ * the watching — as 124, never 1.
27
+ */
28
+ const READ_FAILURE_WINDOW_MS = 120_000;
29
+ const READ_RETRY_MS = 2_000;
30
+ /** The answer to a request that sealed nothing. */
31
+ function sealedNothing(response) {
32
+ return response?.sealed === false;
33
+ }
34
+ /** A read that says the build has not begun yet, rather than one that broke. */
35
+ function notStartedYet(error) {
36
+ const status = Number(error?.statusCode ?? error?.status);
37
+ return status === 404;
38
+ }
39
+ /** What a failed build should say, from whichever field carries the reason. */
40
+ function failureLine(build) {
41
+ const detail = build?.verification?.state === "failed" ? build.verification : build?.failure;
42
+ const parts = [detail?.code, detail?.reason].filter(Boolean);
43
+ return parts.length > 0
44
+ ? `The snapshot build failed: ${parts.join(" — ")}`
45
+ : "The snapshot build failed.";
46
+ }
47
+ /**
48
+ * Ask for a snapshot, and watch the build if the caller asked to (#3666).
49
+ */
50
+ export async function driveSnapshotBuild(options) {
51
+ const { client, documentId, wait = false, timeoutMs = null, signal, onProgress, } = options;
52
+ const now = options.now ?? (() => Date.now());
53
+ const sleep = options.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
54
+ const response = await client.requestSnapshot(documentId);
55
+ // Nothing was sealed, so there is no build and nothing to watch. Not a
56
+ // failure: the document already has a base that describes it.
57
+ if (sealedNothing(response)) {
58
+ onProgress?.("The open epoch carried nothing, so it was not sealed and no build was started.");
59
+ return { exitCode: 0, response, build: null };
60
+ }
61
+ const buildId = String(response?.buildId ?? "");
62
+ onProgress?.(`Sealed epoch ${response?.sealedEpoch}; build ${buildId}.`);
63
+ if (!wait || !buildId)
64
+ return { exitCode: 0, response, build: null };
65
+ const startedAt = now();
66
+ const stillRunning = `The build is still running as ${buildId}; ` +
67
+ `follow it with \`documents snapshots get ${documentId} ${buildId}\`.`;
68
+ let failingSince = null;
69
+ for (;;) {
70
+ if (signal?.aborted) {
71
+ return { exitCode: 130, response, build: null, message: stillRunning };
72
+ }
73
+ if (timeoutMs !== null && now() - startedAt >= timeoutMs) {
74
+ return { exitCode: 124, response, build: null, message: stillRunning };
75
+ }
76
+ let build;
77
+ try {
78
+ build = await client.getSnapshot(documentId, buildId);
79
+ failingSince = null;
80
+ }
81
+ catch (error) {
82
+ if (notStartedYet(error)) {
83
+ // The alarm has not reached its first tick. Keep waiting, and do NOT
84
+ // count it against the read-failure window: nothing failed.
85
+ failingSince = null;
86
+ await sleep(POLL_MS);
87
+ continue;
88
+ }
89
+ failingSince ??= now();
90
+ if (now() - failingSince >= READ_FAILURE_WINDOW_MS) {
91
+ return {
92
+ exitCode: 124,
93
+ response,
94
+ build: null,
95
+ message: `The build could not be read for ${Math.round(READ_FAILURE_WINDOW_MS / 1000)}s (${error?.message ?? error}). ${stillRunning}`,
96
+ };
97
+ }
98
+ await sleep(READ_RETRY_MS);
99
+ continue;
100
+ }
101
+ const verification = build?.verification;
102
+ if (verification?.state === "passed") {
103
+ return { exitCode: 0, response, build };
104
+ }
105
+ if (verification?.state === "failed" || build?.state === "failed") {
106
+ return { exitCode: 1, response, build, message: failureLine(build) };
107
+ }
108
+ await sleep(POLL_MS);
109
+ }
110
+ }
111
+ //# sourceMappingURL=snapshot-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-build.js","sourceRoot":"","sources":["../../../src/lib/snapshot-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Where a snapshot's chunks are, and where an export puts them (#3432).
3
+ *
4
+ * A manifest entry is addressed within its build's grant by its `path`:
5
+ * `{model}/{n}` for a chunk the build wrote, `{epoch}-{buildId}/{model}/{n}`
6
+ * for one carried forward from an earlier build of the same document. A
7
+ * manifest written before the field existed is addressed by its key. Two
8
+ * entries of one manifest can share `{model}/{n}` (one own, one reused), so
9
+ * an export cannot write them by that pair: it RENUMBERS each model 0..n-1 in
10
+ * manifest order and stores a manifest whose paths and keys say so, which is
11
+ * the layout `documents import` and the ingest CLI read — one on-disk shape
12
+ * whatever the manifest reused.
13
+ */
14
+ /** The fields of a manifest entry this module reads. */
15
+ export interface ManifestChunkLike {
16
+ key: string;
17
+ path?: string;
18
+ ordinal?: number;
19
+ model: string;
20
+ [field: string]: unknown;
21
+ }
22
+ /** The fields of a manifest this module reads and rewrites. */
23
+ export interface ManifestLike<Chunk extends ManifestChunkLike = ManifestChunkLike> {
24
+ version: number;
25
+ epoch: number;
26
+ buildId: string;
27
+ chunks: Chunk[];
28
+ [field: string]: unknown;
29
+ }
30
+ /** Where one chunk is fetched from, within its build's grant. */
31
+ export interface ChunkAddress {
32
+ model: string;
33
+ index: number;
34
+ /** The download path relative to the grant: `{model}/{n}` or the sourced form. */
35
+ path: string;
36
+ source?: {
37
+ epoch: number;
38
+ buildId: string;
39
+ };
40
+ }
41
+ /** A chunk's address: its `path` first, its key for an older manifest. */
42
+ export declare function chunkAddressOf(chunk: ManifestChunkLike): ChunkAddress;
43
+ /** One chunk of an export: where it is fetched from and where it is written. */
44
+ export interface ExportedChunkFile {
45
+ download: string;
46
+ file: string;
47
+ }
48
+ /**
49
+ * The manifest an export stores, and the file each entry's bytes go to.
50
+ *
51
+ * Numbering is per model in manifest order; the stored entry carries the
52
+ * own-build `path`, a key under the build's own prefix that agrees with it,
53
+ * and its resolved `ordinal`. Everything content-addressed — the digest, the
54
+ * counts, the range — is carried verbatim, and a manifest that reused nothing
55
+ * comes out exactly as it went in. The stored version is 2: on disk every
56
+ * chunk is the build's own.
57
+ */
58
+ export declare function renumberManifestForExport<Chunk extends ManifestChunkLike, Manifest extends ManifestLike<Chunk>>(manifest: Manifest): {
59
+ manifest: Manifest;
60
+ files: ExportedChunkFile[];
61
+ };
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Where a snapshot's chunks are, and where an export puts them (#3432).
3
+ *
4
+ * A manifest entry is addressed within its build's grant by its `path`:
5
+ * `{model}/{n}` for a chunk the build wrote, `{epoch}-{buildId}/{model}/{n}`
6
+ * for one carried forward from an earlier build of the same document. A
7
+ * manifest written before the field existed is addressed by its key. Two
8
+ * entries of one manifest can share `{model}/{n}` (one own, one reused), so
9
+ * an export cannot write them by that pair: it RENUMBERS each model 0..n-1 in
10
+ * manifest order and stores a manifest whose paths and keys say so, which is
11
+ * the layout `documents import` and the ingest CLI read — one on-disk shape
12
+ * whatever the manifest reused.
13
+ */
14
+ import { parseSnapshotChunkPath, resolveChunkOrdinal } from "js-bao";
15
+ /** A chunk's address: its `path` first, its key for an older manifest. */
16
+ export function chunkAddressOf(chunk) {
17
+ if (chunk.path !== undefined) {
18
+ const parsed = parseSnapshotChunkPath(chunk.path);
19
+ if (!parsed) {
20
+ throw new Error(`Snapshot manifest names a chunk this CLI cannot address: ${chunk.path}`);
21
+ }
22
+ return {
23
+ model: parsed.model,
24
+ index: parsed.index,
25
+ path: chunk.path,
26
+ ...(parsed.source ? { source: parsed.source } : {}),
27
+ };
28
+ }
29
+ const match = /\/([A-Za-z][A-Za-z0-9_]*)\/(\d+)\.ndjson\.gz$/.exec(String(chunk.key ?? ""));
30
+ if (!match) {
31
+ throw new Error(`Snapshot manifest names a chunk this CLI cannot address: ${chunk.key}`);
32
+ }
33
+ return {
34
+ model: match[1],
35
+ index: Number(match[2]),
36
+ path: `${match[1]}/${match[2]}`,
37
+ };
38
+ }
39
+ /**
40
+ * The manifest an export stores, and the file each entry's bytes go to.
41
+ *
42
+ * Numbering is per model in manifest order; the stored entry carries the
43
+ * own-build `path`, a key under the build's own prefix that agrees with it,
44
+ * and its resolved `ordinal`. Everything content-addressed — the digest, the
45
+ * counts, the range — is carried verbatim, and a manifest that reused nothing
46
+ * comes out exactly as it went in. The stored version is 2: on disk every
47
+ * chunk is the build's own.
48
+ */
49
+ export function renumberManifestForExport(manifest) {
50
+ const perModel = new Map();
51
+ const files = [];
52
+ const chunks = manifest.chunks.map((chunk, index) => {
53
+ const address = chunkAddressOf(chunk);
54
+ const n = perModel.get(chunk.model) ?? 0;
55
+ perModel.set(chunk.model, n + 1);
56
+ files.push({ download: address.path, file: `${chunk.model}/${n}.ndjson.gz` });
57
+ const prefix = String(chunk.key).replace(/\/snapshots\/.*$/, "");
58
+ return {
59
+ ...chunk,
60
+ key: `${prefix}/snapshots/${manifest.epoch}-${manifest.buildId}/${chunk.model}/${n}.ndjson.gz`,
61
+ path: `${chunk.model}/${n}`,
62
+ ordinal: resolveChunkOrdinal(chunk, index),
63
+ };
64
+ });
65
+ return {
66
+ manifest: { ...manifest, version: 2, chunks },
67
+ files,
68
+ };
69
+ }
70
+ //# sourceMappingURL=snapshot-manifest-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-manifest-layout.js","sourceRoot":"","sources":["../../../src/lib/snapshot-manifest-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AA6BrE,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,KAAwB;IACrD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,4DAA4D,KAAK,CAAC,IAAI,EAAE,CACzE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,+CAA+C,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,4DAA4D,KAAK,CAAC,GAAG,EAAE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACf,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;KAChC,CAAC;AACJ,CAAC;AAQD;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAGvC,QAAkB;IAClB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACjE,OAAO;YACL,GAAG,KAAK;YACR,GAAG,EAAE,GAAG,MAAM,cAAc,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,YAAY;YAC9F,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE;YAC3B,OAAO,EAAE,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;SAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE;QAC7C,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Sync snapshots — point-in-time backups of a sync directory taken before a
3
+ * destructive `config pull` overwrites local TOML state (issue #578, Phase 1).
4
+ *
5
+ * A snapshot is a full recursive copy of the live sync tree (including
6
+ * `.sync-state.json`, the content-hash baseline) into a timestamped slot
7
+ * under the snapshots root:
8
+ *
9
+ * <snapshotsRoot>/<YYYY-MM-DDTHH-MM-SS>/
10
+ * <full pre-pull copy of the sync tree, incl. .sync-state.json>
11
+ * .snapshot-complete # integrity marker, written LAST
12
+ * .audit-id # ULID cross-link (Phase 2; absent in P1)
13
+ *
14
+ * The `.snapshot-complete` marker is written last so a partial/interrupted
15
+ * copy is detectable: `restoreSnapshot` refuses any snapshot missing it.
16
+ *
17
+ * Snapshots fail LOUD — `createSnapshot` throws if it can't write a complete
18
+ * snapshot. The caller (config pull) aborts before touching any local file so we
19
+ * never perform a destructive pull without a recoverable backup.
20
+ *
21
+ * Restore is staged-then-swapped: the snapshot is materialized into a sibling
22
+ * temp dir, then the live `configDir` is atomically replaced, so a mid-restore
23
+ * crash never leaves a half-written tree.
24
+ */
25
+ /** Marker file written LAST inside a snapshot to prove it completed. */
26
+ export declare const SNAPSHOT_COMPLETE_MARKER = ".snapshot-complete";
27
+ /** Cross-link to the audit entry that produced the snapshot (Phase 2). */
28
+ export declare const SNAPSHOT_AUDIT_ID_MARKER = ".audit-id";
29
+ export interface SnapshotResult {
30
+ /** Snapshot id — the timestamp directory name (YYYY-MM-DDTHH-MM-SS). */
31
+ id: string;
32
+ /** Absolute path to the snapshot directory. */
33
+ path: string;
34
+ }
35
+ export interface SnapshotInfo {
36
+ /** Snapshot id — the timestamp directory name. */
37
+ id: string;
38
+ /** Absolute path to the snapshot directory. */
39
+ path: string;
40
+ /** Whether the `.snapshot-complete` marker is present. */
41
+ complete: boolean;
42
+ /** The audit entry id this snapshot is cross-linked to, if any. */
43
+ auditId: string | null;
44
+ /** Creation time (from the directory mtime). */
45
+ createdAt: Date;
46
+ }
47
+ /**
48
+ * Snapshot the current `syncDir` into a new timestamped slot under
49
+ * `snapshotsRoot`. Returns the created snapshot, or `null` when there's
50
+ * nothing to back up (missing/empty `syncDir`).
51
+ *
52
+ * Fails LOUD: throws if the copy or marker write fails. The partial snapshot
53
+ * dir is best-effort cleaned up before rethrowing so a failed snapshot never
54
+ * leaves a marker-less husk behind.
55
+ */
56
+ export declare function createSnapshot(syncDir: string, snapshotsRoot: string, opts?: {
57
+ auditId?: string;
58
+ now?: Date;
59
+ }): SnapshotResult | null;
60
+ /**
61
+ * List snapshots under `snapshotsRoot`, newest-first. Returns an empty array
62
+ * if the root doesn't exist. Each entry reports whether it's complete and any
63
+ * cross-linked audit id.
64
+ */
65
+ export declare function listSnapshots(snapshotsRoot: string): SnapshotInfo[];
66
+ /**
67
+ * Resolve a snapshot by id within `snapshotsRoot`. Accepts either the full
68
+ * timestamp directory name OR a unique prefix of at least `minPrefix`
69
+ * characters (default 8). Returns the matching snapshot, or throws a clear
70
+ * error on no-match / ambiguous-prefix.
71
+ *
72
+ * When `id` is omitted, resolves to the most recent COMPLETE snapshot.
73
+ */
74
+ export declare function resolveSnapshot(snapshotsRoot: string, id: string | undefined, minPrefix?: number): SnapshotInfo;
75
+ /**
76
+ * Restore a snapshot into `syncDir`, replacing whatever is there.
77
+ *
78
+ * Refuses to restore a snapshot missing the `.snapshot-complete` marker
79
+ * (partial/corrupted snapshot). The internal marker files (`.snapshot-complete`,
80
+ * `.audit-id`) are NOT copied into the restored tree.
81
+ *
82
+ * Staged-then-swapped: the snapshot is materialized into a sibling temp dir,
83
+ * then `syncDir` is atomically replaced, so a mid-restore crash never leaves a
84
+ * half-written tree.
85
+ *
86
+ * Nothing has to survive the swap. Backups live under the project's
87
+ * machine-local `.primitive/`, outside the committed tree entirely, so the
88
+ * `preserveDir` parameter this took went with `--dir` (#3154) — it existed
89
+ * only for the case where the snapshots root sat inside the directory being
90
+ * replaced.
91
+ */
92
+ export declare function restoreSnapshot(snapshotPath: string, syncDir: string): void;
93
+ /**
94
+ * Prune snapshots older than `retentionDays` from `snapshotsRoot`. Only the
95
+ * given slot is touched (cross-slot retention is independent — each slot has
96
+ * its own snapshots root). No-op if the root doesn't exist.
97
+ */
98
+ export declare function pruneSnapshots(snapshotsRoot: string, retentionDays?: number): void;
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Sync snapshots — point-in-time backups of a sync directory taken before a
3
+ * destructive `config pull` overwrites local TOML state (issue #578, Phase 1).
4
+ *
5
+ * A snapshot is a full recursive copy of the live sync tree (including
6
+ * `.sync-state.json`, the content-hash baseline) into a timestamped slot
7
+ * under the snapshots root:
8
+ *
9
+ * <snapshotsRoot>/<YYYY-MM-DDTHH-MM-SS>/
10
+ * <full pre-pull copy of the sync tree, incl. .sync-state.json>
11
+ * .snapshot-complete # integrity marker, written LAST
12
+ * .audit-id # ULID cross-link (Phase 2; absent in P1)
13
+ *
14
+ * The `.snapshot-complete` marker is written last so a partial/interrupted
15
+ * copy is detectable: `restoreSnapshot` refuses any snapshot missing it.
16
+ *
17
+ * Snapshots fail LOUD — `createSnapshot` throws if it can't write a complete
18
+ * snapshot. The caller (config pull) aborts before touching any local file so we
19
+ * never perform a destructive pull without a recoverable backup.
20
+ *
21
+ * Restore is staged-then-swapped: the snapshot is materialized into a sibling
22
+ * temp dir, then the live `configDir` is atomically replaced, so a mid-restore
23
+ * crash never leaves a half-written tree.
24
+ */
25
+ import { existsSync, readdirSync, statSync, writeFileSync, readFileSync, cpSync, rmSync, renameSync, mkdirSync, } from "fs";
26
+ import { join, dirname } from "path";
27
+ /** Marker file written LAST inside a snapshot to prove it completed. */
28
+ export const SNAPSHOT_COMPLETE_MARKER = ".snapshot-complete";
29
+ /** Cross-link to the audit entry that produced the snapshot (Phase 2). */
30
+ export const SNAPSHOT_AUDIT_ID_MARKER = ".audit-id";
31
+ /**
32
+ * Produce the timestamp directory name for a snapshot, e.g.
33
+ * `2026-06-01T17-42-18`. Colons (illegal on Windows, awkward everywhere) are
34
+ * replaced with hyphens; milliseconds and the trailing `Z` are dropped.
35
+ */
36
+ function snapshotTimestamp(now = new Date()) {
37
+ // 2026-06-01T17:42:18.401Z -> 2026-06-01T17-42-18
38
+ return now.toISOString().replace(/\.\d+Z$/, "").replace(/:/g, "-");
39
+ }
40
+ /**
41
+ * Returns true if `dir` exists and contains at least one entry. A fresh
42
+ * project (no prior sync dir, or an empty one) has nothing to back up.
43
+ */
44
+ function dirHasContent(dir) {
45
+ if (!existsSync(dir))
46
+ return false;
47
+ try {
48
+ return readdirSync(dir).length > 0;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Snapshot the current `syncDir` into a new timestamped slot under
56
+ * `snapshotsRoot`. Returns the created snapshot, or `null` when there's
57
+ * nothing to back up (missing/empty `syncDir`).
58
+ *
59
+ * Fails LOUD: throws if the copy or marker write fails. The partial snapshot
60
+ * dir is best-effort cleaned up before rethrowing so a failed snapshot never
61
+ * leaves a marker-less husk behind.
62
+ */
63
+ export function createSnapshot(syncDir, snapshotsRoot, opts = {}) {
64
+ if (!dirHasContent(syncDir)) {
65
+ return null;
66
+ }
67
+ const id = snapshotTimestamp(opts.now);
68
+ const dest = join(snapshotsRoot, id);
69
+ // Guard against an id collision (two pulls within the same second). Append a
70
+ // numeric suffix until we find a free slot so a rapid second pull can't
71
+ // clobber the first snapshot.
72
+ let finalId = id;
73
+ let finalDest = dest;
74
+ let suffix = 1;
75
+ while (existsSync(finalDest)) {
76
+ finalId = `${id}-${suffix}`;
77
+ finalDest = join(snapshotsRoot, finalId);
78
+ suffix += 1;
79
+ }
80
+ // The backups root is machine-local, under `.primitive/backups/<env>/<appId>/`,
81
+ // and the tree it copies is the committed `primitive/<env>/`. The two are
82
+ // disjoint, so the copy can never recurse into itself — the staged-into-a-
83
+ // temp-dir fork this used to need existed only for `--dir`, whose snapshots
84
+ // root sat INSIDE the tree it was snapshotting (#3154).
85
+ try {
86
+ mkdirSync(snapshotsRoot, { recursive: true });
87
+ // Full recursive copy. `dereference: false` keeps symlinks from being
88
+ // silently followed (edge case: symlinks inside the sync tree).
89
+ cpSync(syncDir, finalDest, { recursive: true, dereference: false });
90
+ if (opts.auditId) {
91
+ writeFileSync(join(finalDest, SNAPSHOT_AUDIT_ID_MARKER), opts.auditId);
92
+ }
93
+ // Integrity marker written LAST — its presence proves the copy finished.
94
+ writeFileSync(join(finalDest, SNAPSHOT_COMPLETE_MARKER), new Date().toISOString());
95
+ }
96
+ catch (err) {
97
+ // Best-effort cleanup of the partial snapshot so we don't leave an
98
+ // incomplete (marker-less) directory around.
99
+ try {
100
+ rmSync(finalDest, { recursive: true, force: true });
101
+ }
102
+ catch {
103
+ // ignore cleanup failure
104
+ }
105
+ throw err;
106
+ }
107
+ return { id: finalId, path: finalDest };
108
+ }
109
+ /**
110
+ * List snapshots under `snapshotsRoot`, newest-first. Returns an empty array
111
+ * if the root doesn't exist. Each entry reports whether it's complete and any
112
+ * cross-linked audit id.
113
+ */
114
+ export function listSnapshots(snapshotsRoot) {
115
+ if (!existsSync(snapshotsRoot))
116
+ return [];
117
+ let names;
118
+ try {
119
+ names = readdirSync(snapshotsRoot);
120
+ }
121
+ catch {
122
+ return [];
123
+ }
124
+ const infos = [];
125
+ for (const name of names) {
126
+ const path = join(snapshotsRoot, name);
127
+ let stat;
128
+ try {
129
+ stat = statSync(path);
130
+ }
131
+ catch {
132
+ continue;
133
+ }
134
+ if (!stat.isDirectory())
135
+ continue;
136
+ const complete = existsSync(join(path, SNAPSHOT_COMPLETE_MARKER));
137
+ let auditId = null;
138
+ const auditPath = join(path, SNAPSHOT_AUDIT_ID_MARKER);
139
+ if (existsSync(auditPath)) {
140
+ try {
141
+ auditId = readFileSync(auditPath, "utf-8").trim() || null;
142
+ }
143
+ catch {
144
+ auditId = null;
145
+ }
146
+ }
147
+ infos.push({ id: name, path, complete, auditId, createdAt: stat.mtime });
148
+ }
149
+ // Newest first. The id is a sortable timestamp string, so a reverse string
150
+ // sort matches chronological order (and stays correct for the `-N` suffixed
151
+ // collision variants within the same second).
152
+ infos.sort((a, b) => (a.id < b.id ? 1 : a.id > b.id ? -1 : 0));
153
+ return infos;
154
+ }
155
+ /**
156
+ * Resolve a snapshot by id within `snapshotsRoot`. Accepts either the full
157
+ * timestamp directory name OR a unique prefix of at least `minPrefix`
158
+ * characters (default 8). Returns the matching snapshot, or throws a clear
159
+ * error on no-match / ambiguous-prefix.
160
+ *
161
+ * When `id` is omitted, resolves to the most recent COMPLETE snapshot.
162
+ */
163
+ export function resolveSnapshot(snapshotsRoot, id, minPrefix = 8) {
164
+ const all = listSnapshots(snapshotsRoot);
165
+ if (all.length === 0) {
166
+ throw new Error(`No snapshots found in ${snapshotsRoot}`);
167
+ }
168
+ if (!id) {
169
+ const mostRecentComplete = all.find((s) => s.complete);
170
+ if (!mostRecentComplete) {
171
+ throw new Error(`No complete snapshots found in ${snapshotsRoot} (all are missing the ${SNAPSHOT_COMPLETE_MARKER} marker).`);
172
+ }
173
+ return mostRecentComplete;
174
+ }
175
+ // Exact match wins.
176
+ const exact = all.find((s) => s.id === id);
177
+ if (exact)
178
+ return exact;
179
+ // Prefix match (must be unique and >= minPrefix chars).
180
+ if (id.length < minPrefix) {
181
+ throw new Error(`Snapshot id "${id}" is too short — provide at least ${minPrefix} characters or the full timestamp.`);
182
+ }
183
+ const matches = all.filter((s) => s.id.startsWith(id));
184
+ if (matches.length === 0) {
185
+ throw new Error(`No snapshot matches "${id}" in ${snapshotsRoot}`);
186
+ }
187
+ if (matches.length > 1) {
188
+ throw new Error(`Snapshot prefix "${id}" is ambiguous (${matches.length} matches: ${matches
189
+ .map((m) => m.id)
190
+ .join(", ")}). Provide more characters.`);
191
+ }
192
+ return matches[0];
193
+ }
194
+ /**
195
+ * Restore a snapshot into `syncDir`, replacing whatever is there.
196
+ *
197
+ * Refuses to restore a snapshot missing the `.snapshot-complete` marker
198
+ * (partial/corrupted snapshot). The internal marker files (`.snapshot-complete`,
199
+ * `.audit-id`) are NOT copied into the restored tree.
200
+ *
201
+ * Staged-then-swapped: the snapshot is materialized into a sibling temp dir,
202
+ * then `syncDir` is atomically replaced, so a mid-restore crash never leaves a
203
+ * half-written tree.
204
+ *
205
+ * Nothing has to survive the swap. Backups live under the project's
206
+ * machine-local `.primitive/`, outside the committed tree entirely, so the
207
+ * `preserveDir` parameter this took went with `--dir` (#3154) — it existed
208
+ * only for the case where the snapshots root sat inside the directory being
209
+ * replaced.
210
+ */
211
+ export function restoreSnapshot(snapshotPath, syncDir) {
212
+ if (!existsSync(snapshotPath)) {
213
+ throw new Error(`Snapshot not found: ${snapshotPath}`);
214
+ }
215
+ if (!existsSync(join(snapshotPath, SNAPSHOT_COMPLETE_MARKER))) {
216
+ throw new Error(`Refusing to restore: snapshot ${snapshotPath} is missing the ${SNAPSHOT_COMPLETE_MARKER} marker (partial/corrupted snapshot).`);
217
+ }
218
+ const parent = dirname(syncDir);
219
+ mkdirSync(parent, { recursive: true });
220
+ const unique = `${Date.now()}-${Math.floor(Math.random() * 1e6)}`;
221
+ const stageDir = join(parent, `.primitive-restore-stage-${unique}`);
222
+ const oldDir = join(parent, `.primitive-restore-old-${unique}`);
223
+ try {
224
+ // Materialize the snapshot into the staging dir.
225
+ cpSync(snapshotPath, stageDir, { recursive: true, dereference: false });
226
+ // Drop the snapshot-internal marker files from the restored tree.
227
+ for (const marker of [SNAPSHOT_COMPLETE_MARKER, SNAPSHOT_AUDIT_ID_MARKER]) {
228
+ const markerPath = join(stageDir, marker);
229
+ if (existsSync(markerPath)) {
230
+ rmSync(markerPath, { force: true });
231
+ }
232
+ }
233
+ // Atomic-ish swap: move the live dir aside, move staging into place, then
234
+ // delete the old dir. Same-filesystem renames are atomic.
235
+ if (existsSync(syncDir)) {
236
+ renameSync(syncDir, oldDir);
237
+ }
238
+ try {
239
+ renameSync(stageDir, syncDir);
240
+ }
241
+ catch (err) {
242
+ // Swap failed — try to roll the original back so we never leave the
243
+ // user with no sync dir at all.
244
+ if (existsSync(oldDir) && !existsSync(syncDir)) {
245
+ try {
246
+ renameSync(oldDir, syncDir);
247
+ }
248
+ catch {
249
+ // ignore rollback failure; original error is more useful
250
+ }
251
+ }
252
+ throw err;
253
+ }
254
+ // Success — remove the displaced original.
255
+ if (existsSync(oldDir)) {
256
+ rmSync(oldDir, { recursive: true, force: true });
257
+ }
258
+ }
259
+ finally {
260
+ // Clean up any leftover staging/old dirs on failure.
261
+ for (const dir of [stageDir, oldDir]) {
262
+ if (existsSync(dir)) {
263
+ try {
264
+ rmSync(dir, { recursive: true, force: true });
265
+ }
266
+ catch {
267
+ // ignore
268
+ }
269
+ }
270
+ }
271
+ }
272
+ }
273
+ /**
274
+ * Prune snapshots older than `retentionDays` from `snapshotsRoot`. Only the
275
+ * given slot is touched (cross-slot retention is independent — each slot has
276
+ * its own snapshots root). No-op if the root doesn't exist.
277
+ */
278
+ export function pruneSnapshots(snapshotsRoot, retentionDays = 28) {
279
+ if (!existsSync(snapshotsRoot))
280
+ return;
281
+ const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
282
+ for (const info of listSnapshots(snapshotsRoot)) {
283
+ if (info.createdAt.getTime() < cutoff) {
284
+ try {
285
+ rmSync(info.path, { recursive: true, force: true });
286
+ }
287
+ catch {
288
+ // Best-effort prune — a failure to delete one stale snapshot must not
289
+ // abort the pull that triggered the prune.
290
+ }
291
+ }
292
+ }
293
+ }
294
+ //# sourceMappingURL=snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../../src/lib/snapshots.ts"],"names":[],"mappings":"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"}