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,431 @@
1
+ /**
2
+ * `snapshot ⊕ overlays == table`, recomputed and compared (#3433, criterion 10).
3
+ *
4
+ * Per-build verification checks a base against the table it was built FROM:
5
+ * the chunks are read back, their digests match, their id sequences cover the
6
+ * ranges. What it cannot check is the other half of the contract — that
7
+ * folding the overlays onto that base, the way a CLIENT folds them, arrives at
8
+ * the document the server holds. A fold that means something slightly
9
+ * different on the two ends puts records into a client's authoritative table
10
+ * that the server never wrote, silently, because on a format-2 document there
11
+ * is no whole-document comparison left downstream to catch it.
12
+ *
13
+ * So this runs OUTSIDE the Durable Object, on the CLI:
14
+ *
15
+ * 0. Read the document's schema, which is the same permission the table pages
16
+ * need. The chain export takes the app-admin arm and the pages take the
17
+ * console arm or a read grant on the document, so a caller holding only the
18
+ * first is refused here rather than after downloading the whole chain
19
+ * (3433-C08).
20
+ * 1. Export the chain — the newest complete base, every overlay sealed after
21
+ * it, and the open epoch's overlay inline.
22
+ * 2. Load the base through the checked-in loader into a local record store,
23
+ * then fold each overlay in order with the client's own fold.
24
+ * 3. Page the authoritative table through the records API and compare it,
25
+ * record by record, with the recomputed view.
26
+ *
27
+ * Running it inside the room would need a scratch copy of up to 2 GB of rows
28
+ * and a new multi-tick state machine; running it with the SERVER's fold would
29
+ * make it agree with the room by construction.
30
+ *
31
+ * ## The fence, and why there is one
32
+ *
33
+ * The chain export captures the open overlay once (`Y.encodeStateAsUpdate` at
34
+ * one moment); each records page is an independent query of the live table
35
+ * later (3433-R03). An ordinary write in between would read as corruption. The
36
+ * export is therefore its own fence: after the last page the chain is exported
37
+ * AGAIN and the open epoch number and a fingerprint of the inline overlay are
38
+ * compared with the capture. The fingerprint is the overlay's state vector AND
39
+ * its delete set, because a Yjs deletion creates no struct and therefore never
40
+ * moves a state vector (3433-C05) — and a record deleted under the comparison
41
+ * is precisely what a divergence looks like. The epoch moves on every
42
+ * rotation, so it is checked on its own. Either moving means the document
43
+ * changed under the comparison: that attempt yields NO VERDICT and is retried
44
+ * from a fresh capture; a document that moves on every attempt is reported as
45
+ * `none` rather than as a divergence.
46
+ */
47
+ import { chunkAddressOf, } from "./snapshot-manifest-layout.js";
48
+ /** The server refused to export a chain; there is nothing to audit. */
49
+ export const EXPORT_CHAIN_INCOMPLETE = "EXPORT_CHAIN_INCOMPLETE";
50
+ /**
51
+ * The stringset fields a schema response declares, per model.
52
+ *
53
+ * `GET documents/:id/schema` answers `{ schema: { models: { Note: { fields:
54
+ * { tags: { type: "stringset" } } } } } }` — the declarations the document's
55
+ * `_meta_` maps carry, which is where a field added after the base snapshot
56
+ * says what it is. A model with no stringset is left out rather than mapped to
57
+ * an empty list, so the union with the manifest's is a plain spread.
58
+ */
59
+ export function stringSetFieldsFromSchema(schema) {
60
+ const models = schema?.schema?.models ?? schema?.models ?? {};
61
+ // A model's name is DATA — an undeclared model is whatever `_type` the
62
+ // records route was handed — so `constructor` and `toString` are names this
63
+ // dictionary can be asked for. On a plain object either answers a function
64
+ // off the prototype rather than `undefined`, which the caller's `?? []`
65
+ // cannot see and its spread cannot iterate (3433-C11). Nothing is inherited
66
+ // here, so a lookup answers only what a schema actually declared.
67
+ const out = Object.create(null);
68
+ for (const [model, declaration] of Object.entries(models)) {
69
+ const fields = declaration?.fields ?? {};
70
+ const sets = Object.entries(fields)
71
+ .filter(([, field]) => String(field?.type ?? "").toLowerCase() === "stringset")
72
+ .map(([name]) => name);
73
+ if (sets.length > 0)
74
+ out[model] = sets;
75
+ }
76
+ return out;
77
+ }
78
+ const DEFAULT_MAX_DIVERGENCES = 20;
79
+ const DEFAULT_RETRIES = 3;
80
+ const DEFAULT_PAGE_SIZE = 200;
81
+ function decodeBase64(value) {
82
+ const binary = Buffer.from(value, "base64");
83
+ return new Uint8Array(binary.buffer, binary.byteOffset, binary.byteLength);
84
+ }
85
+ /**
86
+ * The value of one field, in a form two sides can be compared by.
87
+ *
88
+ * Canonical JSON — object keys sorted — because the two sides reach the same
89
+ * record by different routes (one out of SQLite's `json_patch`, one through
90
+ * the records route's serialisation) and key order is not a difference a
91
+ * reader would call corruption.
92
+ */
93
+ function canonical(value) {
94
+ if (value === null || typeof value !== "object")
95
+ return JSON.stringify(value) ?? "null";
96
+ if (Array.isArray(value))
97
+ return `[${value.map(canonical).join(",")}]`;
98
+ const entries = Object.entries(value).sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
99
+ return `{${entries.map(([key, inner]) => `${JSON.stringify(key)}:${canonical(inner)}`).join(",")}}`;
100
+ }
101
+ /** A stringset is a SET: the order its members come back in means nothing. */
102
+ function canonicalSet(value) {
103
+ if (!Array.isArray(value))
104
+ return canonical(value);
105
+ return `[${[...value].map(canonical).sort().join(",")}]`;
106
+ }
107
+ /**
108
+ * The fields of a record that mean something to a comparison.
109
+ *
110
+ * `id` is the key both sides are looked up by, not a field; a `_`-prefixed key
111
+ * is the route's own bookkeeping (`_type`, `_meta_doc_id`), not the record.
112
+ * `type` is the ORM's own column for the model name — written beside `id` on
113
+ * every projected row and reserved from a model's fields — so it is dropped
114
+ * when it says what the model already says, and compared like any other field
115
+ * when it does not.
116
+ */
117
+ function comparableFields(record, model) {
118
+ const out = {};
119
+ for (const [field, value] of Object.entries(record)) {
120
+ if (field === "id" || field.startsWith("_"))
121
+ continue;
122
+ if (field === "type" && value === model)
123
+ continue;
124
+ if (value === undefined)
125
+ continue;
126
+ out[field] = value;
127
+ }
128
+ return out;
129
+ }
130
+ /** Which fields of two records disagree. */
131
+ function differingFields(left, right, stringSets) {
132
+ const fields = new Set([...Object.keys(left), ...Object.keys(right)]);
133
+ const out = [];
134
+ for (const field of Array.from(fields).sort()) {
135
+ const render = stringSets.has(field) ? canonicalSet : canonical;
136
+ if (render(left[field]) !== render(right[field]))
137
+ out.push(field);
138
+ }
139
+ return out;
140
+ }
141
+ /** The stringset fields declared for one model, and nothing inherited. */
142
+ function declaredFields(declared, model) {
143
+ const fields = Object.prototype.hasOwnProperty.call(declared, model)
144
+ ? declared[model]
145
+ : undefined;
146
+ return Array.isArray(fields) ? fields : [];
147
+ }
148
+ /**
149
+ * A read of the server that did not finish — never a divergence (3433-C10).
150
+ *
151
+ * Exit 1 means "the table is not the chain". A page the server refused, an
152
+ * artifact that would not download, a grant withdrawn mid-run: none of them
153
+ * says anything whatever about that, and an error escaping this library used
154
+ * to reach the CLI's top-level handler and exit 1 all the same. Tagged here,
155
+ * caught at the attempt, and answered as the third verdict with its reason and
156
+ * no per-model report.
157
+ */
158
+ class AuditSourceError extends Error {
159
+ what;
160
+ failure;
161
+ constructor(what, failure) {
162
+ super(`${what}: ${failure?.message ?? String(failure)}`);
163
+ this.what = what;
164
+ this.failure = failure;
165
+ this.name = "AuditSourceError";
166
+ }
167
+ /** Why there is no verdict, in the operator's terms. */
168
+ describe() {
169
+ const detail = this.failure?.message ?? String(this.failure);
170
+ const status = this.failure?.statusCode ?? this.failure?.status;
171
+ if (status === 403) {
172
+ return `${this.what} could not be read: ${missingGrant(detail)}`;
173
+ }
174
+ return `${this.what} could not be read: ${detail}`;
175
+ }
176
+ }
177
+ /** The permission the comparison needs, which the chain export does not give. */
178
+ function missingGrant(detail) {
179
+ return (`this account may export the document's chain but not read its table: ` +
180
+ `comparing them needs the console-admin arm or a read grant on this ` +
181
+ `document (${detail})`);
182
+ }
183
+ /** One read of the server, tagged so a failure is no verdict rather than one. */
184
+ async function read(what, run) {
185
+ try {
186
+ return await run();
187
+ }
188
+ catch (error) {
189
+ throw new AuditSourceError(what, error);
190
+ }
191
+ }
192
+ /** The id the records route gives a record. */
193
+ function recordId(item) {
194
+ const id = item.id ?? item._id;
195
+ return typeof id === "string" || typeof id === "number" ? String(id) : null;
196
+ }
197
+ /**
198
+ * Recompute a document's chain locally and compare it with its table.
199
+ *
200
+ * Returns a verdict rather than throwing: a divergence is the answer the
201
+ * command exists to give, and "no verdict" is a third answer the validation
202
+ * child scripts on, not an error to catch.
203
+ */
204
+ export async function auditSnapshotChain(source, options) {
205
+ const retries = Math.max(1, options.retries ?? DEFAULT_RETRIES);
206
+ const maxDivergences = options.maxDivergences ?? DEFAULT_MAX_DIVERGENCES;
207
+ const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;
208
+ const none = (reason, attempts) => ({
209
+ verdict: "none",
210
+ attempts,
211
+ reason,
212
+ buildId: null,
213
+ epoch: null,
214
+ models: [],
215
+ });
216
+ let attempts = 0;
217
+ let lastMoved = "";
218
+ for (let attempt = 0; attempt < retries; attempt++) {
219
+ attempts++;
220
+ // The table FIRST, before anything is exported (3433-C08).
221
+ //
222
+ // The audit is two reads with two different answers: the chain export
223
+ // takes the app-admin arm, and the records pages take the console arm or a
224
+ // read grant on the document, because the documents surface grants no
225
+ // app-role bypass on a read (#3279, D3279-002). Reading the schema is the
226
+ // same permission the pages need, so a caller who would be refused halfway
227
+ // is refused here — with the grant named, and with nothing downloaded.
228
+ let tableModels;
229
+ try {
230
+ tableModels = await source.tableModels();
231
+ }
232
+ catch (error) {
233
+ const status = error?.statusCode ?? error?.status;
234
+ const reason = status === 403
235
+ ? missingGrant(error?.message ?? "forbidden")
236
+ : `the document's table could not be read: ${error?.message ?? String(error)}`;
237
+ return none(reason, attempts);
238
+ }
239
+ let captured;
240
+ try {
241
+ captured = await source.chain();
242
+ }
243
+ catch (error) {
244
+ // The server's own refusal, not a shape this library decides. A chain it
245
+ // will not export is no verdict — never a divergence.
246
+ const code = error?.code ?? error?.body?.code;
247
+ const reason = code === EXPORT_CHAIN_INCOMPLETE
248
+ ? `the server will not export this document's chain (${EXPORT_CHAIN_INCOMPLETE}): ${error?.message ?? "incomplete"}`
249
+ : `the chain could not be exported: ${error?.message ?? String(error)}`;
250
+ return none(reason, attempts);
251
+ }
252
+ if (captured.documentFormat !== undefined && Number(captured.documentFormat) !== 2) {
253
+ return none("this is an ordinary document: it has no snapshot chain to recompute", attempts);
254
+ }
255
+ if (!captured.base) {
256
+ return none("this document has no completed base snapshot yet, so there is nothing to fold onto", attempts);
257
+ }
258
+ const fence = {
259
+ epoch: Number(captured.current?.epoch ?? captured.epoch),
260
+ fingerprint: options.fingerprint(decodeBase64(captured.current.update)),
261
+ };
262
+ const store = await options.store();
263
+ // A failure inside the loader's own callback can reach the catch below
264
+ // through the loader rather than as itself, so the tag is carried here too.
265
+ let carried = null;
266
+ const chainArtifact = async (path) => {
267
+ try {
268
+ return await read("an artifact of the chain", () => source.download(path));
269
+ }
270
+ catch (error) {
271
+ if (error instanceof AuditSourceError)
272
+ carried = error;
273
+ throw error;
274
+ }
275
+ };
276
+ try {
277
+ const manifest = JSON.parse(Buffer.from(await chainArtifact(captured.base.download.path)).toString("utf-8"));
278
+ const basePath = captured.base.download.path;
279
+ await store.loadSnapshot(manifest, async (chunk) => {
280
+ // Addressed by the entry's own path within the granted build — the
281
+ // own-build `{model}/{n}` or the `{epoch}-{buildId}/{model}/{n}` of a
282
+ // chunk carried forward — never re-derived from the key, which for a
283
+ // reused entry names a DIFFERENT build's object (the real cause of
284
+ // what was escalated as 3433-C01).
285
+ return await chainArtifact(`${basePath}/${chunkAddressOf(chunk).path}`);
286
+ });
287
+ // Every overlay sealed after the base, then the open one, in order: a
288
+ // fold applied out of order is a different document.
289
+ for (const overlay of captured.overlays) {
290
+ await store.applyOverlay(await chainArtifact(overlay.download.path));
291
+ }
292
+ await store.applyOverlay(decodeBase64(captured.current.update));
293
+ // The model list is the UNION. A model the table holds and the chain
294
+ // does not is exactly the case an audit exists to catch, and a model the
295
+ // chain holds and the table does not is its mirror; taking either side
296
+ // alone would skip one of them (3433-R04).
297
+ const models = Array.from(new Set([...tableModels, ...(await store.models())])).sort();
298
+ // What the document declares a stringset NOW, beside what the base
299
+ // manifest recorded: a field declared after the base is a set on both
300
+ // sides and an ordered array to nobody (3433-C06).
301
+ const declaredSets = source.stringSetFields
302
+ ? await read("the document's schema", () => source.stringSetFields())
303
+ : {};
304
+ const reports = [];
305
+ for (const model of models) {
306
+ const stringSets = new Set([
307
+ ...store.stringSetFields(model),
308
+ ...declaredFields(declaredSets, model),
309
+ ]);
310
+ reports.push(await compareModel(source, store, model, pageSize, maxDivergences, stringSets));
311
+ }
312
+ // The fence: nothing may have moved between the capture and here.
313
+ let after;
314
+ try {
315
+ after = await source.chain();
316
+ }
317
+ catch (error) {
318
+ return none(`the chain could not be re-exported to confirm the document held still: ${error?.message ?? String(error)}`, attempts);
319
+ }
320
+ const moved = fenceMoved(fence, after, options.fingerprint);
321
+ if (moved) {
322
+ lastMoved = moved;
323
+ continue;
324
+ }
325
+ const diverged = reports.some((report) => report.onlyRecomputed.length > 0 ||
326
+ report.onlyTable.length > 0 ||
327
+ report.differing.length > 0);
328
+ return {
329
+ verdict: diverged ? "divergence" : "match",
330
+ attempts,
331
+ buildId: captured.base.buildId,
332
+ epoch: captured.base.epoch,
333
+ models: reports,
334
+ };
335
+ }
336
+ catch (error) {
337
+ // A side that could not be read to the end is no verdict, and the
338
+ // partial comparison behind it is thrown away with the attempt: nothing
339
+ // it found could be said to cover one state of the document.
340
+ const failure = error instanceof AuditSourceError ? error : carried;
341
+ if (!failure)
342
+ throw error;
343
+ return none(failure.describe(), attempts);
344
+ }
345
+ finally {
346
+ await store.close();
347
+ }
348
+ }
349
+ return none(`the document changed during every attempt (${lastMoved}), so no comparison ` +
350
+ `covers one state of it`, attempts);
351
+ }
352
+ /** Where the document moved between the capture and the re-export, if it did. */
353
+ function fenceMoved(captured, after, fingerprint) {
354
+ const epoch = Number(after.current?.epoch ?? after.epoch);
355
+ if (epoch !== captured.epoch) {
356
+ // A seal with no write still moves the epoch, and the new open overlay's
357
+ // state vector is empty — so the epoch is checked on its own (edge E14).
358
+ return `the open epoch moved from ${captured.epoch} to ${epoch}`;
359
+ }
360
+ if (fingerprint(decodeBase64(after.current.update)) !== captured.fingerprint) {
361
+ // A write or a deletion: the fingerprint covers the delete set, which a
362
+ // state vector does not move for (3433-C05).
363
+ return "the open overlay changed";
364
+ }
365
+ return null;
366
+ }
367
+ /** One model's two sides, compared a page at a time. */
368
+ async function compareModel(source, store, model, pageSize, maxDivergences, stringSets) {
369
+ const report = {
370
+ model,
371
+ compared: 0,
372
+ onlyRecomputed: [],
373
+ onlyTable: [],
374
+ differing: [],
375
+ truncated: false,
376
+ };
377
+ const note = (list, id) => {
378
+ if (list.length >= maxDivergences) {
379
+ report.truncated = true;
380
+ return;
381
+ }
382
+ list.push(id);
383
+ };
384
+ let cursor;
385
+ for (;;) {
386
+ const page = await read("the document's table", () => source.readPage(model, cursor));
387
+ const items = page.items ?? [];
388
+ const ids = [];
389
+ const byId = new Map();
390
+ for (const item of items) {
391
+ const id = recordId(item);
392
+ if (id === null)
393
+ continue;
394
+ ids.push(id);
395
+ byId.set(id, item);
396
+ }
397
+ const recomputed = await store.take(model, ids);
398
+ for (const id of ids) {
399
+ const local = recomputed.get(id);
400
+ if (!local) {
401
+ note(report.onlyTable, id);
402
+ continue;
403
+ }
404
+ report.compared++;
405
+ const fields = differingFields(comparableFields(local, model), comparableFields(byId.get(id), model), stringSets);
406
+ if (fields.length === 0)
407
+ continue;
408
+ if (report.differing.length >= maxDivergences)
409
+ report.truncated = true;
410
+ else
411
+ report.differing.push({ id, fields });
412
+ }
413
+ if (!page.nextCursor || items.length === 0)
414
+ break;
415
+ cursor = page.nextCursor;
416
+ }
417
+ // What the recomputed view holds that no page ever showed.
418
+ let after = null;
419
+ for (;;) {
420
+ const rows = await store.remaining(model, after, pageSize);
421
+ if (rows.length === 0)
422
+ break;
423
+ for (const row of rows)
424
+ note(report.onlyRecomputed, row.id);
425
+ after = rows[rows.length - 1].id;
426
+ if (rows.length < pageSize)
427
+ break;
428
+ }
429
+ return report;
430
+ }
431
+ //# sourceMappingURL=snapshot-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-audit.js","sourceRoot":"","sources":["../../../src/lib/snapshot-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * What `documents snapshots get` shows an operator, as data (#3435).
3
+ *
4
+ * The rows were composed inline in the command's action, which made the only
5
+ * way to check one a spawned CLI against a live server with a build in exactly
6
+ * the right state. They are a pure function of the payload now, so what a
7
+ * terminal shows is checkable where the decision is made; the command still
8
+ * owns the printing, and the live suite still owns "a real terminal really
9
+ * shows this".
10
+ *
11
+ * Label and value, in the order they print. A row that would say nothing is
12
+ * not emitted at all rather than emitted empty: an operator who learns that a
13
+ * block is usually blank stops reading the block.
14
+ */
15
+ /** One printed row: its label and the value beside it. */
16
+ export type SnapshotBuildRow = [string, unknown];
17
+ /**
18
+ * The payload `GET .../snapshots/{buildId}` answers with.
19
+ *
20
+ * Every field past the first block is optional here because a build row
21
+ * written before that field existed carries none, and an operator inspecting
22
+ * an old build should see the build rather than a crash.
23
+ */
24
+ export interface SnapshotBuildPayload {
25
+ buildId: string;
26
+ epoch: number;
27
+ state: string;
28
+ source: string;
29
+ manifestVersion: number;
30
+ startedAt: number;
31
+ completedAt?: number | null;
32
+ rows: number;
33
+ bytes: number;
34
+ chunks: number;
35
+ baseBuildId?: string | null;
36
+ chunksReused?: number;
37
+ rowsWalked?: number;
38
+ /** The bulk-load session this base was built for (#3435); never its ranges. */
39
+ ingestSessionId?: string | null;
40
+ verification?: {
41
+ state: string;
42
+ checkedAt: number;
43
+ chunksChecked: number;
44
+ chunksReused?: number;
45
+ code?: string;
46
+ reason?: string;
47
+ } | null;
48
+ failure?: {
49
+ at: number;
50
+ chunk?: {
51
+ model: string;
52
+ ordinal: number;
53
+ };
54
+ } | null;
55
+ timings?: {
56
+ ticks: number;
57
+ totals?: Record<string, number>;
58
+ };
59
+ }
60
+ export declare function snapshotBuildRows(build: SnapshotBuildPayload): SnapshotBuildRow[];
@@ -0,0 +1,87 @@
1
+ /**
2
+ * What `documents snapshots get` shows an operator, as data (#3435).
3
+ *
4
+ * The rows were composed inline in the command's action, which made the only
5
+ * way to check one a spawned CLI against a live server with a build in exactly
6
+ * the right state. They are a pure function of the payload now, so what a
7
+ * terminal shows is checkable where the decision is made; the command still
8
+ * owns the printing, and the live suite still owns "a real terminal really
9
+ * shows this".
10
+ *
11
+ * Label and value, in the order they print. A row that would say nothing is
12
+ * not emitted at all rather than emitted empty: an operator who learns that a
13
+ * block is usually blank stops reading the block.
14
+ */
15
+ import { formatDate } from "./output.js";
16
+ /** The per-stage timing rows, in the order a tick spends them. */
17
+ const STAGES = [
18
+ ["Read (ms)", "readMs"],
19
+ ["Encode (ms)", "encodeMs"],
20
+ ["Compress (ms)", "compressMs"],
21
+ ["Hash (ms)", "hashMs"],
22
+ ["Upload (ms)", "uploadMs"],
23
+ ["Manifest (ms)", "manifestMs"],
24
+ ["Verify read (ms)", "verifyReadMs"],
25
+ ["Verify digest (ms)", "verifyDigestMs"],
26
+ ["Verify coverage (ms)", "verifyCoverageMs"],
27
+ ];
28
+ export function snapshotBuildRows(build) {
29
+ const rows = [
30
+ ["Build", build.buildId],
31
+ ["Epoch", build.epoch],
32
+ ["State", build.state],
33
+ ["Source", build.source],
34
+ ["Manifest version", build.manifestVersion],
35
+ ["Started", formatDate(build.startedAt)],
36
+ [
37
+ "Completed",
38
+ build.completedAt
39
+ ? formatDate(build.completedAt)
40
+ : "—",
41
+ ],
42
+ ["Rows", build.rows],
43
+ ["Bytes", build.bytes],
44
+ ["Chunks", build.chunks],
45
+ // #3433 — what this build reused from an earlier one, and what the walk
46
+ // cost: on an incremental rebuild the two together say why it was cheap.
47
+ ["Base build", build.baseBuildId ?? "—"],
48
+ ["Chunks reused", build.chunksReused ?? 0],
49
+ ["Rows walked", build.rowsWalked ?? 0],
50
+ ];
51
+ // #3435 — which bulk load this base was built for, when it was one. Only
52
+ // when present: "why did this document rebuild itself whole" has a different
53
+ // answer when the answer is "a bulk load swapped it", and a row reading "—"
54
+ // on every ordinary build teaches an operator to skip it.
55
+ if (build.ingestSessionId) {
56
+ rows.push(["Ingest session", build.ingestSessionId]);
57
+ }
58
+ const verification = build.verification;
59
+ rows.push(["Verification", verification ? verification.state : "not started"]);
60
+ if (verification) {
61
+ rows.push(["Checked at", formatDate(verification.checkedAt)]);
62
+ rows.push(["Chunks checked", verification.chunksChecked]);
63
+ if (verification.chunksReused !== undefined) {
64
+ rows.push(["Chunks trusted", verification.chunksReused]);
65
+ }
66
+ if (verification.code)
67
+ rows.push(["Code", verification.code]);
68
+ if (verification.reason)
69
+ rows.push(["Reason", verification.reason]);
70
+ }
71
+ if (build.failure) {
72
+ rows.push(["Failed at", formatDate(build.failure.at)]);
73
+ if (build.failure.chunk) {
74
+ rows.push([
75
+ "Failed on",
76
+ `${build.failure.chunk.model} chunk ${build.failure.chunk.ordinal}`,
77
+ ]);
78
+ }
79
+ }
80
+ const timings = build.timings ?? { ticks: 0, totals: {} };
81
+ rows.push(["Ticks", timings.ticks]);
82
+ for (const [label, key] of STAGES) {
83
+ rows.push([label, timings.totals?.[key] ?? 0]);
84
+ }
85
+ return rows;
86
+ }
87
+ //# sourceMappingURL=snapshot-build-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-build-rows.js","sourceRoot":"","sources":["../../../src/lib/snapshot-build-rows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
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
+ /** The two calls driving a request; `ApiClient` supplies them in the verb. */
18
+ export interface SnapshotBuildDriverClient {
19
+ requestSnapshot(documentId: string): Promise<any>;
20
+ getSnapshot(documentId: string, buildId: string): Promise<any>;
21
+ }
22
+ export interface DriveSnapshotBuildOptions {
23
+ client: SnapshotBuildDriverClient;
24
+ documentId: string;
25
+ /** Poll until the build settles; `--wait` sets this. */
26
+ wait?: boolean;
27
+ /** `--timeout`, in milliseconds; null waits indefinitely. */
28
+ timeoutMs?: number | null;
29
+ /** Ctrl-C. */
30
+ signal?: AbortSignal;
31
+ /** State changes and progress; stderr in the verb. */
32
+ onProgress?: (line: string) => void;
33
+ now?: () => number;
34
+ sleep?: (ms: number) => Promise<void>;
35
+ }
36
+ /** What the run settled on. */
37
+ export interface SnapshotBuildOutcome {
38
+ /** 0 verified, 1 the build failed, 124 timed out, 130 interrupted. */
39
+ exitCode: number;
40
+ /** The route's answer, as received. */
41
+ response: any;
42
+ /** The terminal build view, when the wait read one. */
43
+ build: any | null;
44
+ /** The reason, for stderr. */
45
+ message?: string;
46
+ }
47
+ /**
48
+ * Ask for a snapshot, and watch the build if the caller asked to (#3666).
49
+ */
50
+ export declare function driveSnapshotBuild(options: DriveSnapshotBuildOptions): Promise<SnapshotBuildOutcome>;