@harperfast/harper 5.3.0-beta.4 → 5.3.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 (314) hide show
  1. package/bin/backup.ts +6 -1
  2. package/components/Application.ts +486 -115
  3. package/components/DESIGN.md +109 -21
  4. package/components/deploymentProvenance.ts +28 -0
  5. package/components/operations.js +14 -7
  6. package/components/packageComponent.ts +5 -1
  7. package/config-root.schema.json +1 -1
  8. package/dataLayer/DESIGN.md +35 -7
  9. package/dataLayer/blobBackup.ts +71 -30
  10. package/dataLayer/harperBridge/ResourceBridge.ts +16 -2
  11. package/dataLayer/rocksdbBackup.ts +88 -34
  12. package/dataLayer/schemaDescribe.ts +45 -1
  13. package/dist/bin/backup.js +1 -1
  14. package/dist/bin/backup.js.map +1 -1
  15. package/dist/components/Application.d.ts +11 -21
  16. package/dist/components/Application.js +436 -105
  17. package/dist/components/Application.js.map +1 -1
  18. package/dist/components/deploymentProvenance.d.ts +4 -0
  19. package/dist/components/deploymentProvenance.js +32 -0
  20. package/dist/components/deploymentProvenance.js.map +1 -0
  21. package/dist/components/operations.js +14 -7
  22. package/dist/components/operations.js.map +1 -1
  23. package/dist/components/packageComponent.js +6 -1
  24. package/dist/components/packageComponent.js.map +1 -1
  25. package/dist/dataLayer/blobBackup.d.ts +30 -3
  26. package/dist/dataLayer/blobBackup.js +73 -36
  27. package/dist/dataLayer/blobBackup.js.map +1 -1
  28. package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +1 -0
  29. package/dist/dataLayer/harperBridge/ResourceBridge.js +15 -3
  30. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  31. package/dist/dataLayer/rocksdbBackup.d.ts +4 -1
  32. package/dist/dataLayer/rocksdbBackup.js +74 -36
  33. package/dist/dataLayer/rocksdbBackup.js.map +1 -1
  34. package/dist/dataLayer/schemaDescribe.js +45 -1
  35. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  36. package/dist/resources/DatabaseTransaction.d.ts +1 -0
  37. package/dist/resources/DatabaseTransaction.js +33 -8
  38. package/dist/resources/DatabaseTransaction.js.map +1 -1
  39. package/dist/resources/ResourceInterface.d.ts +7 -3
  40. package/dist/resources/ResourceInterface.js +2 -0
  41. package/dist/resources/ResourceInterface.js.map +1 -1
  42. package/dist/resources/Table.d.ts +151 -445
  43. package/dist/resources/Table.js +209 -8
  44. package/dist/resources/Table.js.map +1 -1
  45. package/dist/resources/analytics/write.d.ts +11 -0
  46. package/dist/resources/analytics/write.js +3 -0
  47. package/dist/resources/analytics/write.js.map +1 -1
  48. package/dist/resources/blob.d.ts +30 -0
  49. package/dist/resources/blob.js +189 -1
  50. package/dist/resources/blob.js.map +1 -1
  51. package/dist/resources/databases.d.ts +1 -0
  52. package/dist/resources/databases.js +80 -15
  53. package/dist/resources/databases.js.map +1 -1
  54. package/dist/resources/derivedIndexRuntime.d.ts +13 -0
  55. package/dist/resources/derivedIndexRuntime.js +57 -5
  56. package/dist/resources/derivedIndexRuntime.js.map +1 -1
  57. package/dist/resources/derivedIndexes.d.ts +1 -0
  58. package/dist/resources/derivedIndexes.js +116 -15
  59. package/dist/resources/derivedIndexes.js.map +1 -1
  60. package/dist/resources/fullTextSchema.d.ts +5 -3
  61. package/dist/resources/fullTextSchema.js +48 -5
  62. package/dist/resources/fullTextSchema.js.map +1 -1
  63. package/dist/resources/fullTextSchemaLifecycle.d.ts +2 -0
  64. package/dist/resources/fullTextSchemaLifecycle.js +33 -0
  65. package/dist/resources/fullTextSchemaLifecycle.js.map +1 -1
  66. package/dist/resources/graphql.js +30 -12
  67. package/dist/resources/graphql.js.map +1 -1
  68. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +21 -1
  69. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +114 -5
  70. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  71. package/dist/resources/indexes/fullTextDerivedIndex.d.ts +11 -2
  72. package/dist/resources/indexes/fullTextDerivedIndex.js +187 -24
  73. package/dist/resources/indexes/fullTextDerivedIndex.js.map +1 -1
  74. package/dist/resources/indexes/fullTextNativeBinding.d.ts +99 -1
  75. package/dist/resources/indexes/fullTextNativeBinding.js +35 -1
  76. package/dist/resources/indexes/fullTextNativeBinding.js.map +1 -1
  77. package/dist/resources/indexes/fullTextQueryIndex.d.ts +58 -0
  78. package/dist/resources/indexes/fullTextQueryIndex.js +943 -0
  79. package/dist/resources/indexes/fullTextQueryIndex.js.map +1 -0
  80. package/dist/resources/indexes/fullTextQueryProtocol.d.ts +6 -0
  81. package/dist/resources/indexes/fullTextQueryProtocol.js +32 -0
  82. package/dist/resources/indexes/fullTextQueryProtocol.js.map +1 -0
  83. package/dist/resources/indexes/nativeFullTextDerivedIndexLifecycle.d.ts +4 -1
  84. package/dist/resources/indexes/nativeFullTextDerivedIndexLifecycle.js +30 -7
  85. package/dist/resources/indexes/nativeFullTextDerivedIndexLifecycle.js.map +1 -1
  86. package/dist/resources/search.d.ts +41 -0
  87. package/dist/resources/search.js +468 -26
  88. package/dist/resources/search.js.map +1 -1
  89. package/dist/resources/transactionBroadcast.js +101 -50
  90. package/dist/resources/transactionBroadcast.js.map +1 -1
  91. package/dist/resources/typeParity.d.ts +9 -0
  92. package/dist/resources/typeParity.js +3 -0
  93. package/dist/resources/typeParity.js.map +1 -0
  94. package/dist/server/REST.js.map +1 -1
  95. package/dist/server/itc/serverHandlers.js +48 -8
  96. package/dist/server/itc/serverHandlers.js.map +1 -1
  97. package/dist/server/serverHelpers/contentTypes.d.ts +7 -0
  98. package/dist/server/serverHelpers/contentTypes.js +36 -23
  99. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  100. package/dist/server/serverHelpers/uwsServer.js +28 -5
  101. package/dist/server/serverHelpers/uwsServer.js.map +1 -1
  102. package/dist/server/threads/itc.js +19 -0
  103. package/dist/server/threads/itc.js.map +1 -1
  104. package/dist/server/threads/manageThreads.d.ts +3 -0
  105. package/dist/server/threads/manageThreads.js +90 -23
  106. package/dist/server/threads/manageThreads.js.map +1 -1
  107. package/dist/utility/operation_authorization.js +25 -7
  108. package/dist/utility/operation_authorization.js.map +1 -1
  109. package/dist/utility/signalling.js +3 -0
  110. package/dist/utility/signalling.js.map +1 -1
  111. package/dist/validation/searchValidator.js +22 -2
  112. package/dist/validation/searchValidator.js.map +1 -1
  113. package/npm-shrinkwrap.json +22 -22
  114. package/package.json +2 -4
  115. package/resources/DESIGN.md +19 -2
  116. package/resources/DatabaseTransaction.ts +40 -10
  117. package/resources/FULL_TEXT.md +97 -0
  118. package/resources/ResourceInterface.ts +8 -2
  119. package/resources/Table.ts +767 -17
  120. package/resources/analytics/write.ts +3 -3
  121. package/resources/blob.ts +183 -1
  122. package/resources/databases.ts +126 -14
  123. package/resources/derivedIndexRuntime.ts +79 -6
  124. package/resources/derivedIndexes.ts +142 -18
  125. package/resources/fullTextSchema.ts +55 -9
  126. package/resources/fullTextSchemaLifecycle.ts +45 -0
  127. package/resources/graphql.ts +33 -12
  128. package/resources/indexes/DESIGN.md +167 -15
  129. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +125 -5
  130. package/resources/indexes/fullTextDerivedIndex.ts +216 -32
  131. package/resources/indexes/fullTextNativeBinding.ts +133 -3
  132. package/resources/indexes/fullTextQueryIndex.ts +1120 -0
  133. package/resources/indexes/fullTextQueryProtocol.ts +35 -0
  134. package/resources/indexes/nativeFullTextDerivedIndexLifecycle.ts +28 -8
  135. package/resources/search.ts +513 -26
  136. package/resources/transactionBroadcast.ts +86 -47
  137. package/resources/typeParity.ts +20 -0
  138. package/schema.graphql +18 -5
  139. package/server/DESIGN.md +18 -0
  140. package/server/REST.ts +1 -1
  141. package/server/itc/serverHandlers.js +61 -8
  142. package/server/serverHelpers/contentTypes.ts +31 -26
  143. package/server/serverHelpers/uwsServer.ts +35 -7
  144. package/server/threads/itc.js +21 -0
  145. package/server/threads/manageThreads.js +95 -21
  146. package/studio/web/assets/{Chat-Bq60AO-g.js → Chat-CNEKMllJ.js} +13 -13
  147. package/studio/web/assets/FloatingChat-CEnWhHeR.js +23 -0
  148. package/studio/web/assets/SearchDialog-CwhJdEdY.js +1 -0
  149. package/studio/web/assets/{abnfDiagram-O67JEVCF-DpPZWMOf.js → abnfDiagram-O67JEVCF-raXE027J.js} +1 -1
  150. package/studio/web/assets/alertDialog-BbWD9Xxa.js +1 -0
  151. package/studio/web/assets/apiToken-DC5vsaaO.js +1 -0
  152. package/studio/web/assets/applications-DQZxDy0x.js +296 -0
  153. package/studio/web/assets/architecture-7GRP2DOG-DDmz3hpI.js +1 -0
  154. package/studio/web/assets/{architectureDiagram-NJMV4G6O-OmgLraID.js → architectureDiagram-NJMV4G6O-C8_Eet7w.js} +1 -1
  155. package/studio/web/assets/arrow-up-D2g_57vT.js +1 -0
  156. package/studio/web/assets/authStore-CJCaADw9.js +3 -0
  157. package/studio/web/assets/{blockDiagram-BEXU5L5S-Cv7CD3Ai.js → blockDiagram-BEXU5L5S-DR6S5-1D.js} +1 -1
  158. package/studio/web/assets/{button-MFP9n8Ck.js → button-DWwfgGWI.js} +2 -2
  159. package/studio/web/assets/{c4Diagram-YGBWAQC7-Ds1vKYnN.js → c4Diagram-YGBWAQC7-BAfZ1G01.js} +1 -1
  160. package/studio/web/assets/channel-D0AkPjJ8.js +1 -0
  161. package/studio/web/assets/{chevron-up-CFe8x5Bp.js → chevron-up-CFxbMGv2.js} +1 -1
  162. package/studio/web/assets/{chunk-3FUC2YCW-DpnBPH8B.js → chunk-3FUC2YCW-DuRp-j19.js} +1 -1
  163. package/studio/web/assets/{chunk-5DYCD2WN-LLLCQSzg.js → chunk-5DYCD2WN-BceBfIHT.js} +1 -1
  164. package/studio/web/assets/{chunk-742MDFTN-BL8J_pIO.js → chunk-742MDFTN-CIkt8ijt.js} +1 -1
  165. package/studio/web/assets/{chunk-7INBJB4K-C-hJHiiK.js → chunk-7INBJB4K-BpeAXyOi.js} +1 -1
  166. package/studio/web/assets/{chunk-7M6MHVWA-C6ZqkFbA.js → chunk-7M6MHVWA-h6WlaTzO.js} +1 -1
  167. package/studio/web/assets/{chunk-7PRAP22T-CUXM8BG6.js → chunk-7PRAP22T-KyqX6x3f.js} +1 -1
  168. package/studio/web/assets/{chunk-GTNCS2PH-DJ2BFvS1.js → chunk-GTNCS2PH-DGHLXyow.js} +1 -1
  169. package/studio/web/assets/{chunk-GWA4HPMP-C42bSqLL.js → chunk-GWA4HPMP-DsejB6gA.js} +1 -1
  170. package/studio/web/assets/{chunk-MBY4JIJT-C-5jz6Lo.js → chunk-MBY4JIJT-BwSGweQP.js} +1 -1
  171. package/studio/web/assets/{chunk-NETBCI7D-D-bzlN4r.js → chunk-NETBCI7D-C8UnOw_f.js} +1 -1
  172. package/studio/web/assets/{chunk-O7XYJQB3-ep14zA23.js → chunk-O7XYJQB3-CBS3nZYV.js} +1 -1
  173. package/studio/web/assets/{chunk-UA2S7LBM-BMRWRHED.js → chunk-UA2S7LBM-BHpEdH8D.js} +1 -1
  174. package/studio/web/assets/{chunk-WEXAMYUT-DdLYVdX1.js → chunk-WEXAMYUT-BAIhTwyh.js} +1 -1
  175. package/studio/web/assets/{chunk-Z7XXMR3K-BmKEDjcP.js → chunk-Z7XXMR3K-DSHbImdf.js} +1 -1
  176. package/studio/web/assets/{chunk-ZIGJFQKS-DLZgdNxA.js → chunk-ZIGJFQKS-Cs8fUn7y.js} +1 -1
  177. package/studio/web/assets/{classDiagram-v2-NBCMYWYE-DOI5vgKT.js → classDiagram-v2-NBCMYWYE-DmDPkt2u.js} +1 -1
  178. package/studio/web/assets/cn-6T8VranJ.js +1 -0
  179. package/studio/web/assets/{codicon-Brq4_Ui5.ttf → codicon-DF1abBS2.ttf} +0 -0
  180. package/studio/web/assets/{createLucideIcon-bziYxJli.js → createLucideIcon-fO5dL7D5.js} +1 -1
  181. package/studio/web/assets/{css.worker-l1psR_wG.js → css.worker-DoT-OOzx.js} +36 -36
  182. package/studio/web/assets/{cssMode-DJyc9mHj.js → cssMode-Dz2DxF4e.js} +1 -1
  183. package/studio/web/assets/{cynefin-OW5HDTMX-BSW-DB7S.js → cynefin-OW5HDTMX-DIvbXLSj.js} +1 -1
  184. package/studio/web/assets/{cynefinDiagram-VND7K2PF-CbAHEwxt.js → cynefinDiagram-VND7K2PF-BdtaXiCE.js} +1 -1
  185. package/studio/web/assets/{dagre-6A5THRUB-Csxewgs4.js → dagre-6A5THRUB-C7RUWHyz.js} +1 -1
  186. package/studio/web/assets/{diagram-22UHCM2B-a0rt8tY4.js → diagram-22UHCM2B-DJCvcaWP.js} +1 -1
  187. package/studio/web/assets/{diagram-3UASUU5V-lEj2SVNh.js → diagram-3UASUU5V-Du6VKWln.js} +1 -1
  188. package/studio/web/assets/{diagram-ATOU4E4O-HcrAeB-q.js → diagram-ATOU4E4O-dxRfeG4B.js} +1 -1
  189. package/studio/web/assets/{diagram-CDSNMT55-CYxiuyEx.js → diagram-CDSNMT55-l5Ga0u-W.js} +1 -1
  190. package/studio/web/assets/{diagram-MLGK6HIB-ChbCJTgJ.js → diagram-MLGK6HIB-CNQY47LA.js} +1 -1
  191. package/studio/web/assets/{diagram-MPIPVDR6-DaX9Y-N3.js → diagram-MPIPVDR6-7prveD1B.js} +1 -1
  192. package/studio/web/assets/{dist-Cz2Y6-6G.js → dist-BrRuMUzt.js} +1 -1
  193. package/studio/web/assets/{download-CtostjYn.js → download-Cn6tPG4L.js} +1 -1
  194. package/studio/web/assets/{ebnfDiagram-ZINNZB2B-CwAsENB1.js → ebnfDiagram-ZINNZB2B-5OnkTpfi.js} +1 -1
  195. package/studio/web/assets/{editor-DDIsQfj6.js → editor-B3mjd3tz.js} +1 -1
  196. package/studio/web/assets/editor.worker-Yd1NR0QT.js +33 -0
  197. package/studio/web/assets/{elk-276RUBZZ-Hexg9E4D.js → elk-276RUBZZ-DxDQPjQT.js} +1 -1
  198. package/studio/web/assets/{erDiagram-OPXOYQCR-CeC-wwO1.js → erDiagram-OPXOYQCR-CQlCX84D.js} +1 -1
  199. package/studio/web/assets/eventmodeling-NTZA5JFV-DONQf5aG.js +1 -0
  200. package/studio/web/assets/flowDiagram-KWPJA3E3-BoZ8_QR1.js +1 -0
  201. package/studio/web/assets/{ganttDiagram-FUAMR5RP-C2_Hhl1-.js → ganttDiagram-FUAMR5RP-bloX3Voy.js} +1 -1
  202. package/studio/web/assets/{getAnalytics-CjthMQqF.js → getAnalytics-C0FHjtdQ.js} +1 -1
  203. package/studio/web/assets/{gitGraph-4MIJSDKK-xIk5Vuew.js → gitGraph-4MIJSDKK-BrXWmJt2.js} +1 -1
  204. package/studio/web/assets/{gitGraphDiagram-X574FWY7-CMxJ34up.js → gitGraphDiagram-X574FWY7-C2KnnZeY.js} +1 -1
  205. package/studio/web/assets/{html-g1BJHxLy.js → html-BsRGM7tp.js} +1 -1
  206. package/studio/web/assets/{html.worker-DdwM4IrA.js → html.worker-B1dwY0Ay.js} +27 -27
  207. package/studio/web/assets/{htmlMode-Vh5IglCQ.js → htmlMode-tUKJaA3o.js} +1 -1
  208. package/studio/web/assets/index-72cEH474.css +1 -0
  209. package/studio/web/assets/index-BuqFjN5K.js +828 -0
  210. package/studio/web/assets/index.lazy-CcpfQFY_.js +2 -0
  211. package/studio/web/assets/{info-A6RAGUB7-o49TEbj-.js → info-A6RAGUB7-BhzBHe4U.js} +1 -1
  212. package/studio/web/assets/{infoDiagram-VRGFBTTK-Cjhh7yzZ.js → infoDiagram-VRGFBTTK-B0J1132p.js} +1 -1
  213. package/studio/web/assets/{ishikawaDiagram-OU5B5YK6-C63aXRmh.js → ishikawaDiagram-OU5B5YK6-BNk0tuQx.js} +1 -1
  214. package/studio/web/assets/{javascript-5VIolqf7.js → javascript-BZ_uRGHl.js} +1 -1
  215. package/studio/web/assets/{journeyDiagram-ZHPQQLJL-D_o0P5Mu.js → journeyDiagram-ZHPQQLJL-Be79RMQM.js} +1 -1
  216. package/studio/web/assets/json.worker-BQqXGI3X.js +65 -0
  217. package/studio/web/assets/{jsonMode-DG4zQraI.js → jsonMode-DgB-aFMj.js} +1 -1
  218. package/studio/web/assets/{kanban-definition-PNTS6WVX-CTI9SSxY.js → kanban-definition-PNTS6WVX-4uuoQP9W.js} +1 -1
  219. package/studio/web/assets/{languageServices-t5FBpX-i.js → languageServices-BleuBw17.js} +1 -1
  220. package/studio/web/assets/localStorageKeys-etzFY_xV.js +1 -0
  221. package/studio/web/assets/{lspLanguageFeatures-DgVnNPh-.js → lspLanguageFeatures-ByVYLSsQ.js} +1 -1
  222. package/studio/web/assets/{mermaid-parser.core-C2lcH_jP.js → mermaid-parser.core-V1UYMeXV.js} +3 -3
  223. package/studio/web/assets/{mermaid.core-BG5bjfIG.js → mermaid.core-1PX6R49U.js} +4 -4
  224. package/studio/web/assets/{mindmap-definition-NLK3R4M7-BK7ho6JD.js → mindmap-definition-NLK3R4M7-C70Ctm0J.js} +1 -1
  225. package/studio/web/assets/notifications-D1Nf-Edn.js +1 -0
  226. package/studio/web/assets/notifications-TuzN0IMi.js +1 -0
  227. package/studio/web/assets/{packet-AYTQ26CC-BHPy6KBV.js → packet-AYTQ26CC-DWbXHx5g.js} +1 -1
  228. package/studio/web/assets/{pegDiagram-GJSIUBJH-DzjwG3jO.js → pegDiagram-GJSIUBJH-d6z1cc7W.js} +1 -1
  229. package/studio/web/assets/{pie-WAS4IAKB-D0cP-DTU.js → pie-WAS4IAKB-DjoTm3yr.js} +1 -1
  230. package/studio/web/assets/{pieDiagram-5QR66LMP-C_hOP9Lv.js → pieDiagram-5QR66LMP-Dz3RHpDA.js} +1 -1
  231. package/studio/web/assets/profile-D7C7Lupz.js +1 -0
  232. package/studio/web/assets/{quadrantDiagram-O4NWA36T-CZW8PbV1.js → quadrantDiagram-O4NWA36T-CIF5Qkou.js} +1 -1
  233. package/studio/web/assets/{radar-RG4KPBEZ-C8fk0U81.js → radar-RG4KPBEZ-CVBgjCOj.js} +1 -1
  234. package/studio/web/assets/{railroad-74A4TZTK-B60FWm17.js → railroad-74A4TZTK-BdhXw10Q.js} +1 -1
  235. package/studio/web/assets/railroad-abnf-HS5TGJTU-BcoQPN39.js +1 -0
  236. package/studio/web/assets/railroad-ebnf-LZEXJU2U-B1Lke2JN.js +1 -0
  237. package/studio/web/assets/railroad-peg-WCYAUIDC-D-oJFkiV.js +1 -0
  238. package/studio/web/assets/{railroadDiagram-XR7U4H2S-DyyNmgbU.js → railroadDiagram-XR7U4H2S-y3Jv2U6N.js} +1 -1
  239. package/studio/web/assets/regions-nGQCm-v8.js +1 -0
  240. package/studio/web/assets/register-C3x9Ze6P.js +909 -0
  241. package/studio/web/assets/register-DjpsE8to.css +1 -0
  242. package/studio/web/assets/{requirementDiagram-PLB6GJNP-C4H-mLKu.js → requirementDiagram-PLB6GJNP-ChINZEmu.js} +1 -1
  243. package/studio/web/assets/restartGate-nHAFLDh-.js +1 -0
  244. package/studio/web/assets/{sankeyDiagram-IPEJSGJF-DHDyga4c.js → sankeyDiagram-IPEJSGJF-D9AyLce2.js} +1 -1
  245. package/studio/web/assets/{sequenceDiagram-PO4LG4MO-CdNcHXRI.js → sequenceDiagram-PO4LG4MO-hfk4aIEm.js} +1 -1
  246. package/studio/web/assets/{setComponentFile-z4-qJCbA.js → setComponentFile-DpjrRqeG.js} +1 -1
  247. package/studio/web/assets/{setup-CS50uJ4x.js → setup-CGiKLZ9e.js} +2 -2
  248. package/studio/web/assets/{stateDiagram-v2-GCMORJYK-CpKuXq15.js → stateDiagram-v2-GCMORJYK-Bs8RIb9K.js} +1 -1
  249. package/studio/web/assets/status-CGJwrNPH.js +61 -0
  250. package/studio/web/assets/{swimlanes-2SLR337P-NRHa2D8I.js → swimlanes-2SLR337P-B52xrf6t.js} +1 -1
  251. package/studio/web/assets/swimlanesDiagram-TC7HE7FX-DfN7BAP5.js +8 -0
  252. package/studio/web/assets/tabs-BCTQzoQK.js +1 -0
  253. package/studio/web/assets/{timeline-definition-EJHVYXUP-D39Y-xpq.js → timeline-definition-EJHVYXUP-DJSITpQX.js} +1 -1
  254. package/studio/web/assets/toggleHighContrast-C-Ne6P7T.js +51 -0
  255. package/studio/web/assets/toggleHighContrast-n7clI0si.css +1 -0
  256. package/studio/web/assets/{treeView-Q6P3EWNA-CRWR9OqD.js → treeView-Q6P3EWNA-C-epdxRo.js} +1 -1
  257. package/studio/web/assets/{treemap-WGGIJYW6-ZfXyJgLO.js → treemap-WGGIJYW6-DOVyp_zw.js} +1 -1
  258. package/studio/web/assets/{ts.worker-DDMUrpqh.js → ts.worker-Clm12uY6.js} +131 -131
  259. package/studio/web/assets/{tsMode-D83Gg3cq.js → tsMode-CSreYTys.js} +1 -1
  260. package/studio/web/assets/{typescript-Dfp-GrNq.js → typescript-MnxBk89W.js} +1 -1
  261. package/studio/web/assets/{useEntityRestURL-BKetlINf.js → useEntityRestURL-TNrh77-s.js} +1 -1
  262. package/studio/web/assets/{usecaseDiagram-POWQR4AR-jf-zIDZ_.js → usecaseDiagram-POWQR4AR-B6252cbq.js} +1 -1
  263. package/studio/web/assets/{vendor-core-BdkdbUek.js → vendor-core-6LhfJlRC.js} +1 -1
  264. package/studio/web/assets/vendor-datadog-ozKf-pts.js +6 -0
  265. package/studio/web/assets/{vendor-react-izWchTRL.js → vendor-react-BOliS0BL.js} +1 -1
  266. package/studio/web/assets/vendor-tanstack-Bntfka-M.js +2 -0
  267. package/studio/web/assets/vendor-ui-9EYYDgoN.js +41 -0
  268. package/studio/web/assets/{vennDiagram-UO4OBE2U-BKYAZUh_.js → vennDiagram-UO4OBE2U-DZTsDA4k.js} +1 -1
  269. package/studio/web/assets/{wardley-WFR3VGLG-BO7f36ci.js → wardley-WFR3VGLG-Cfqoe6z4.js} +1 -1
  270. package/studio/web/assets/{wardleyDiagram-VNRHLVJA-Djb0JDQc.js → wardleyDiagram-VNRHLVJA-qu_f7Tvl.js} +1 -1
  271. package/studio/web/assets/{workers-CCvmDLH3.js → workers-BfZlUNVI.js} +3 -3
  272. package/studio/web/assets/{xml-06pZp00U.js → xml-BHd6qGH7.js} +1 -1
  273. package/studio/web/assets/{xychartDiagram-PMCCYNJV-BQh9ubvb.js → xychartDiagram-PMCCYNJV-UrOKRsmR.js} +1 -1
  274. package/studio/web/assets/{yaml-iSnWMVlV.js → yaml-C53R8OQq.js} +1 -1
  275. package/studio/web/assets/{yaml.worker-DAK2o_H1.js → yaml.worker-D9JekGdp.js} +183 -183
  276. package/studio/web/index.html +15 -15
  277. package/utility/operation_authorization.ts +27 -7
  278. package/utility/signalling.ts +3 -0
  279. package/validation/searchValidator.ts +22 -13
  280. package/studio/web/assets/FloatingChat-D4560T0p.js +0 -23
  281. package/studio/web/assets/alertDialog-UrbiMgQt.js +0 -1
  282. package/studio/web/assets/apiToken-BEvbFPMc.js +0 -1
  283. package/studio/web/assets/applications-CSUVTH4E.js +0 -296
  284. package/studio/web/assets/architecture-7GRP2DOG-11l4Ny1l.js +0 -1
  285. package/studio/web/assets/authStore-5jSS5pTW.js +0 -3
  286. package/studio/web/assets/channel-BDtouPd6.js +0 -1
  287. package/studio/web/assets/dialog-DTepachC.js +0 -1
  288. package/studio/web/assets/editor.worker-CkkvdXvO.js +0 -33
  289. package/studio/web/assets/eventmodeling-NTZA5JFV-CFb03e0o.js +0 -1
  290. package/studio/web/assets/flowDiagram-KWPJA3E3-Cidi00_Y.js +0 -1
  291. package/studio/web/assets/index-CPoDzQTe.css +0 -1
  292. package/studio/web/assets/index-DGRAzvO4.js +0 -824
  293. package/studio/web/assets/index.lazy-vgSic7et.js +0 -2
  294. package/studio/web/assets/json.worker-CSi2hF-a.js +0 -65
  295. package/studio/web/assets/notifications-BeWcX04m.js +0 -1
  296. package/studio/web/assets/notifications-DUGWrWoO.js +0 -1
  297. package/studio/web/assets/profile-BvUEDBzW.js +0 -1
  298. package/studio/web/assets/railroad-abnf-HS5TGJTU-CLMVZvH0.js +0 -1
  299. package/studio/web/assets/railroad-ebnf-LZEXJU2U--tlwFoVB.js +0 -1
  300. package/studio/web/assets/railroad-peg-WCYAUIDC-Dpuslblm.js +0 -1
  301. package/studio/web/assets/regions-CB-_2m7M.js +0 -1
  302. package/studio/web/assets/register-1w1Zr3b2.js +0 -848
  303. package/studio/web/assets/register-jjEx9u7D.css +0 -1
  304. package/studio/web/assets/setLocalStorage-D_kflv4U.js +0 -1
  305. package/studio/web/assets/status-CI0wOdOE.js +0 -61
  306. package/studio/web/assets/swimlanesDiagram-TC7HE7FX-BBk4t4hO.js +0 -8
  307. package/studio/web/assets/tabs-CnQ_zenf.js +0 -1
  308. package/studio/web/assets/toggleHighContrast--ixms01u.css +0 -1
  309. package/studio/web/assets/toggleHighContrast-BsAE4jPe.js +0 -49
  310. package/studio/web/assets/useLocalStorage-BYoZF60G.js +0 -1
  311. package/studio/web/assets/vendor-datadog-fCQhBHGk.js +0 -6
  312. package/studio/web/assets/vendor-tanstack-CQ1aRjVa.js +0 -2
  313. package/studio/web/assets/vendor-ui-aE1tHcW7.js +0 -41
  314. package/studio/web/assets/x-vYntCxm4.js +0 -1
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
+ import { randomUUID } from 'node:crypto';
3
4
  import { createReadStream, existsSync, readdirSync } from 'node:fs';
4
- import { open, readdir, writeFile } from 'node:fs/promises';
5
+ import { open, writeFile } from 'node:fs/promises';
5
6
  import { join, relative, resolve, sep } from 'node:path';
6
7
  import { PassThrough, Writable } from 'node:stream';
7
8
  import { pipeline } from 'node:stream/promises';
@@ -27,12 +28,14 @@ import { SchemaEventMsg } from '../server/threads/itc.js';
27
28
  import { beginRestore, completeRestore, abandonRestore, checkRestoreState, type RestoreLock } from './restoreMarker.ts';
28
29
  import {
29
30
  assertBlobSnapshotRestorable,
31
+ assertEngineOnlyRestoreAllowed,
30
32
  blobSnapshotDir,
31
33
  blobsReadmeContent,
32
34
  deleteBlobSnapshot,
33
35
  purgeBlobSnapshots,
34
36
  restoreBlobSnapshot,
35
37
  snapshotBlobs,
38
+ walkBlobFiles,
36
39
  } from './blobBackup.ts';
37
40
  import {
38
41
  deleteBackupManifest,
@@ -165,7 +168,7 @@ function requireBackupId(backupId: any): number {
165
168
  return backupId;
166
169
  }
167
170
 
168
- function requireBooleanOption(value: any, name: string): boolean {
171
+ export function requireBooleanOption(value: any, name: string): boolean {
169
172
  if (value !== undefined && typeof value !== 'boolean') {
170
173
  throw new ClientError(`'${name}' must be a boolean`);
171
174
  }
@@ -439,6 +442,13 @@ the backup (blobs are restored automatically). Restore the latest backup in plac
439
442
 
440
443
  harper restore_backup database=${databaseName} backup_id=<id>
441
444
 
445
+ A backup created with \`exclude_blobs\` carries no blobs, so restoring one is refused unless you pass
446
+ \`allow_engine_only=true\`. The restored records address whichever blobs are on disk now: if the
447
+ database still has blob files a record can resolve to one that no longer belongs to it, and if it has
448
+ none the blob ids start over at 1 and the next blob written lands on a path a restored record already
449
+ references. Restoring into a new database is **not** a way around this — its blob roots are empty for
450
+ the same reason. Restore a backup that includes blobs, or accept the mixed result explicitly.
451
+
442
452
  A database held open by a loaded component — and always the \`system\` database — cannot be restored
443
453
  while Harper is running; stop the server and run the same command offline. Offline you can also
444
454
  restore into a *copy*, leaving the original untouched:
@@ -491,6 +501,7 @@ export async function verifyBackup(request: any) {
491
501
 
492
502
  export async function validateRestoreBackup(request: any) {
493
503
  requireSuperUser(request, OPERATIONS_ENUM.RESTORE_BACKUP);
504
+ requireBooleanOption(request.allow_engine_only, 'allow_engine_only');
494
505
  const databaseName = getDatabaseName(request);
495
506
  if (databaseName === 'system') {
496
507
  throw new ClientError(
@@ -558,13 +569,25 @@ export async function restoreBackup(request: any) {
558
569
  : resolveDatabasePath(databaseName);
559
570
  // reject a backup with more blob roots than the current config *before* anything destructive —
560
571
  // restoring it would mis-address blobs (records persist their root index)
561
- await assertBlobSnapshotRestorable(backupDir, backupId, getBlobPathsForDatabaseName(databaseName));
572
+ const blobRoots = getBlobPathsForDatabaseName(databaseName);
573
+ await assertBlobSnapshotRestorable(backupDir, backupId, blobRoots);
574
+ const allowEngineOnly = requireBooleanOption(request.allow_engine_only, 'allow_engine_only');
575
+ // Once is enough: the decision reads the manifest and the opt-in, never the destination, so no
576
+ // concurrent writer can change the answer between here and the purge.
577
+ assertEngineOnlyRestoreAllowed(databaseName, { backupHasBlobs: manifest.blobs, allowEngineOnly });
562
578
  const lock = beginRestoreForDatabase(databaseDir, databaseName);
579
+ const restoreToken = randomUUID();
563
580
  let destructionStarted = false;
564
581
  try {
565
- // close the database across all worker threads (each thread also rescans, and the
566
- // restoring marker keeps the scan from reloading it mid-restore)
567
- await signalling.signalSchemaChange(new SchemaEventMsg(process.pid, OPERATIONS_ENUM.RESTORE_BACKUP, databaseName));
582
+ // Block new blob saves, drain in-flight saves, and close the database across all worker threads.
583
+ // Each thread also rescans, and the restoring marker keeps it from reloading mid-restore.
584
+ try {
585
+ await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'close', restoreToken));
586
+ } catch {
587
+ throw new BackupInProgressError(
588
+ `Cannot restore database '${databaseName}': not every worker completed the blob-save barrier before the acknowledgement deadline. Retry the restore after the stalled work has cleared.`
589
+ );
590
+ }
568
591
  // A live component (or the system database) can hold its own handle on the database that
569
592
  // Harper does not track and cannot close, so verify actual process-wide closure before
570
593
  // purging — restoring under an open instance would corrupt it. If handles remain, fail
@@ -587,6 +610,19 @@ export async function restoreBackup(request: any) {
587
610
  // before any destruction is safe to clear.
588
611
  if (destructionStarted || lock.preexisting) {
589
612
  abandonRestore(lock);
613
+ // The restore is over even though it failed, so release the workers' blob fence. Without this
614
+ // the fence outlives the attempt: the marker keeps the database from loading, but an operator
615
+ // who gives up and drops/recreates the name instead of rerunning gets a database whose writes
616
+ // are refused by a fence no restore owns any more. Treated as a replaced generation because
617
+ // destruction may have begun -- forgoing a deletion only leaks a file for the orphan sweep,
618
+ // while performing a stale one destroys restored bytes.
619
+ try {
620
+ await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'reload', restoreToken, true));
621
+ } catch (releaseError) {
622
+ // Never mask the restore failure with a broadcast failure; the fence is worker-local state
623
+ // and a process restart clears it regardless.
624
+ logger.error(`Could not release the blob fence after a failed restore of '${databaseName}'`, releaseError);
625
+ }
590
626
  // wrap rather than mutate error.message: a frozen/library error can have a non-writable
591
627
  // message (assigning it throws TypeError under 'use strict')
592
628
  throw new Error(
@@ -597,13 +633,33 @@ export async function restoreBackup(request: any) {
597
633
  // nothing destructive happened and the marker was fresh — clear it and let every thread reload
598
634
  // the intact database
599
635
  completeRestore(lock);
600
- await signalling.signalSchemaChange(new SchemaEventMsg(process.pid, OPERATIONS_ENUM.RESTORE_BACKUP, databaseName));
636
+ await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'reload', restoreToken, false));
601
637
  throw error;
602
638
  }
603
639
  completeRestore(lock);
604
640
  // signal again: with the marker gone, every thread's rescan reloads the restored database
605
- await signalling.signalSchemaChange(new SchemaEventMsg(process.pid, OPERATIONS_ENUM.RESTORE_BACKUP, databaseName));
606
- return { database: databaseName, backup_id: backupId };
641
+ await signalling.signalSchemaChange(restoreSchemaEvent(databaseName, 'reload', restoreToken));
642
+ return { database: databaseName, backup_id: backupId, ...(allowEngineOnly ? { allow_engine_only: true } : {}) };
643
+ }
644
+
645
+ /**
646
+ * `restoreToken` identifies the restore that owns the blob fence. Two restores of the same database
647
+ * can overlap, so a worker releases the fence only for the token that established it -- see
648
+ * `resumeBlobSavesAfterRestore`.
649
+ */
650
+ function restoreSchemaEvent(
651
+ databaseName: string,
652
+ restorePhase: 'close' | 'reload',
653
+ restoreToken: string,
654
+ generationReplaced = true
655
+ ) {
656
+ const message: any = new SchemaEventMsg(process.pid, OPERATIONS_ENUM.RESTORE_BACKUP, databaseName);
657
+ message.restorePhase = restorePhase;
658
+ message.restoreToken = restoreToken;
659
+ // Tells a worker whether the blob roots it fenced were actually replaced. A restore that failed its
660
+ // admission checks destroyed nothing, so that worker's queued reclamations are still valid.
661
+ message.generationReplaced = generationReplaced;
662
+ return message;
607
663
  }
608
664
 
609
665
  // After the close broadcast is acknowledged, every worker thread has released its Harper-managed
@@ -820,28 +876,11 @@ function writeWithBackpressure(dest: PassThrough, chunk: Buffer): Promise<void>
820
876
  async function appendBlobEntries(pack: Pack, blobRoots: string[]): Promise<void> {
821
877
  for (let index = 0; index < blobRoots.length; index++) {
822
878
  const root = blobRoots[index];
823
- if (!existsSync(root)) continue;
824
- const stack: string[] = [root];
825
- while (stack.length > 0) {
826
- const dir = stack.pop() as string;
827
- let entries;
828
- try {
829
- entries = await readdir(dir, { withFileTypes: true });
830
- } catch (error: any) {
831
- if (error.code === 'ENOENT') continue;
832
- throw error;
833
- }
834
- for (const entry of entries) {
835
- const filePath = join(dir, entry.name);
836
- if (entry.isDirectory()) {
837
- stack.push(filePath);
838
- } else if (entry.isFile()) {
839
- // tar entry names are always POSIX-separated; relative() yields `\` on Windows, which
840
- // would otherwise become literal filename characters when extracted on POSIX
841
- const relativePath = relative(root, filePath).split(sep).join('/');
842
- await appendBlobEntry(pack, filePath, `blobs/${index}/${relativePath}`);
843
- }
844
- }
879
+ for await (const filePath of walkBlobFiles(root)) {
880
+ // tar entry names are always POSIX-separated; relative() yields `\` on Windows, which
881
+ // would otherwise become literal filename characters when extracted on POSIX
882
+ const relativePath = relative(root, filePath).split(sep).join('/');
883
+ await appendBlobEntry(pack, filePath, `blobs/${index}/${relativePath}`);
845
884
  }
846
885
  }
847
886
  }
@@ -996,7 +1035,15 @@ export async function createBackupOffline(databaseName: string, excludeBlobs = f
996
1035
  * server start. `targetDatabase` restores into a different database directory (non-destructive
997
1036
  * for the source database); the server picks it up on next start via normal engine detection.
998
1037
  */
999
- export async function restoreBackupOffline(databaseName: string, backupId?: number, targetDatabase?: string) {
1038
+ export async function restoreBackupOffline(
1039
+ databaseName: string,
1040
+ backupId?: number,
1041
+ targetDatabase?: string,
1042
+ allowEngineOnlyOption?: boolean
1043
+ ) {
1044
+ // Validated the same way the online path validates it, so a malformed opt-in is refused rather than
1045
+ // silently read as "no". The CLI JSON-parses `key=value`, so a typo arrives here as a string.
1046
+ const allowEngineOnly = requireBooleanOption(allowEngineOnlyOption, 'allow_engine_only');
1000
1047
  validateDatabaseName(databaseName);
1001
1048
  const backupDir = backupDirForDatabase(databaseName);
1002
1049
  // resolve to the latest complete backup (or the requested id, rejected if incomplete)
@@ -1014,7 +1061,9 @@ export async function restoreBackupOffline(databaseName: string, backupId?: numb
1014
1061
  }
1015
1062
  // reject a backup with more blob roots than the target's current config before anything
1016
1063
  // destructive (records persist their root index, so collapsing would mis-address blobs)
1017
- await assertBlobSnapshotRestorable(backupDir, backupId, getBlobPathsForDatabaseName(targetDatabase ?? databaseName));
1064
+ const blobRoots = getBlobPathsForDatabaseName(targetDatabase ?? databaseName);
1065
+ await assertBlobSnapshotRestorable(backupDir, backupId, blobRoots);
1066
+ assertEngineOnlyRestoreAllowed(targetDatabase ?? databaseName, { backupHasBlobs: manifest.blobs, allowEngineOnly });
1018
1067
  // Take the restore lock + marker BEFORE probing so a server that starts after this point sees the
1019
1068
  // marker and refuses to load the database (closing the window between the probe and the purge).
1020
1069
  const lock = beginRestoreForDatabase(databaseDir, targetDatabase ?? databaseName);
@@ -1069,7 +1118,12 @@ export async function restoreBackupOffline(databaseName: string, backupId?: numb
1069
1118
  throw error;
1070
1119
  }
1071
1120
  completeRestore(lock);
1072
- return { database: databaseName, backup_id: backupId, restored_to: databaseDir };
1121
+ return {
1122
+ database: databaseName,
1123
+ backup_id: backupId,
1124
+ restored_to: databaseDir,
1125
+ ...(allowEngineOnly ? { allow_engine_only: true } : {}),
1126
+ };
1073
1127
  }
1074
1128
 
1075
1129
  function isMissingOrEmptyDir(path: string): boolean {
@@ -181,11 +181,15 @@ async function descTable(describeTableObject: any, attrPerms?: any) {
181
181
  }
182
182
 
183
183
  let attributes = [];
184
- if (tableAttrPerms) {
184
+ let readableAttributes: Set<string> | undefined;
185
+ if (tableAttrPerms?.length) {
185
186
  let permittedAttr = {};
187
+ let readableAttr = {};
186
188
  tableAttrPerms.forEach((a) => {
187
189
  if (a.describe) permittedAttr[a.attribute_name] = true;
190
+ if (a.read) readableAttr[a.attribute_name] = true;
188
191
  });
192
+ readableAttributes = new Set(Object.keys(readableAttr));
189
193
 
190
194
  tableObj.attributes.forEach((a) => {
191
195
  if (permittedAttr[a.name]) pushAtt(a);
@@ -220,6 +224,46 @@ async function descTable(describeTableObject: any, attrPerms?: any) {
220
224
  tableResult.sources = (tableObj as any).sources
221
225
  .map((source: any) => source.name)
222
226
  .filter((source: any) => source && source !== 'Replicator');
227
+ if (tableObj.fullTextIndexes?.length > 0) {
228
+ const { fullTextDerivedIndexReadiness } = await import('../resources/derivedIndexes.ts');
229
+ tableResult.full_text_indexes = tableObj.fullTextIndexes
230
+ .map((definition: any) => {
231
+ const fields = definition.fields.filter(
232
+ (field: any) => !readableAttributes || readableAttributes.has(field.name)
233
+ );
234
+ if (fields.length === 0) return;
235
+ const readiness = fullTextDerivedIndexReadiness(tableObj, definition.name);
236
+ return {
237
+ name: definition.name,
238
+ fields: fields.map(({ name, weight, mediaType, highlight }: any) => ({
239
+ name,
240
+ weight,
241
+ ...(mediaType ? { media_type: mediaType } : null),
242
+ ...(highlight ? { highlight: true } : null),
243
+ })),
244
+ analyzer: definition.analyzer,
245
+ stop_words: definition.stopWords,
246
+ positions: definition.positions,
247
+ surface_terms: definition.surfaceTerms,
248
+ synonyms: definition.synonyms,
249
+ highlighting: definition.highlighting ?? false,
250
+ query_modes: [
251
+ 'any',
252
+ 'all',
253
+ 'fuzzy',
254
+ ...(definition.positions ? ['phrase'] : []),
255
+ ...(definition.surfaceTerms ? ['prefix', 'fuzzy-prefix'] : []),
256
+ ],
257
+ readiness: {
258
+ state: readiness.state,
259
+ ...(readiness.reason ? { reason: readiness.reason } : null),
260
+ owner_epoch: readiness.ownerEpoch.toString(),
261
+ rebuild_attempts: readiness.rebuildAttempts,
262
+ },
263
+ };
264
+ })
265
+ .filter(Boolean);
266
+ }
223
267
 
224
268
  try {
225
269
  // `getRecordCount` scans the table's primary store, which dominates describe latency on large
@@ -99,7 +99,7 @@ async function runBackupCommand(command) {
99
99
  result = await (0, rocksdbBackup_ts_1.purgeBackupsOffline)(databaseName, request.keep_count);
100
100
  break;
101
101
  case OPERATIONS_ENUM.RESTORE_BACKUP:
102
- result = await (0, rocksdbBackup_ts_1.restoreBackupOffline)(databaseName, request.backup_id, request.target_database);
102
+ result = await (0, rocksdbBackup_ts_1.restoreBackupOffline)(databaseName, request.backup_id, request.target_database, request.allow_engine_only);
103
103
  break;
104
104
  default:
105
105
  throw new Error(`Unknown backup command '${command}'`);
@@ -1 +1 @@
1
- {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../bin/backup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../bin/backup.ts"],"names":[],"mappings":"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"}
@@ -137,13 +137,13 @@ type DormantBuild = {
137
137
  * cannot hold or miss a slot. Never throws: a failure must neither fail a component closed nor replace a
138
138
  * deploy's own error.
139
139
  *
140
- * `pinnedDeploymentId` is never evicted. A delayed activation runs this preamble under the same lock it is
141
- * about to activate under, so without the pin retention would delete the artifact the request named —
142
- * immediately, when the knob is `0`. The pin is applied after the kept set is chosen, so a pinned build in
143
- * the eviction tail leaves `maxCount + 1` on disk for the life of the request; the next preamble that does
144
- * not pin it brings the count back down.
140
+ * A `pinned` id is never evicted. A delayed activation runs this preamble under the same lock it is about to
141
+ * activate under, so without the pin retention would delete the artifact the request named — immediately, when the
142
+ * knob is `0` — and a settlement's pins keep the releases it just put back. Pins are applied after the kept set is
143
+ * chosen, so each pinned build in the eviction tail leaves one more than `maxCount` on disk until a pass that does
144
+ * not pin it.
145
145
  */
146
- export declare function pruneDormantBuilds(componentName: string, builds: DormantBuild[], maxCount: number, pinnedDeploymentId?: string): Promise<void>;
146
+ export declare function pruneDormantBuilds(componentName: string, builds: DormantBuild[], maxCount: number, pinned?: string | readonly string[]): Promise<void>;
147
147
  export type ArtifactDescriptor = {
148
148
  v: number;
149
149
  component: string;
@@ -159,21 +159,10 @@ export declare function makeRollbackPlaceholderMovable(applicationDirPath: strin
159
159
  ino: bigint;
160
160
  } | undefined): Promise<void>;
161
161
  /**
162
- * Name the component that owns a deployment directory THIS CALL created, and take the directory back if that
163
- * cannot be recorded.
164
- *
165
- * Ownership is published as part of the claim rather than at certification, because resolving and packing can
166
- * take minutes and until a tree exists to infer an owner from, a directory answering to nobody is one another
167
- * component will take for abandoned. Unattributed is a permanent refusal, though, so a failure here — a full
168
- * disk, an EIO on the temp write or its sync — would burn this deployment id for good, every retry refused by
169
- * its own wreckage. The removal is scoped to the directory this invocation made, and deliberately not
170
- * broadened to one found by EEXIST: that directory may be another claimant's, and removing it is the race the
171
- * refusal exists to prevent. Best-effort, because the claim failure is what the caller needs to see.
172
- *
173
- * `write` is a parameter so the failure is testable without a filesystem that can be made to fail on exactly
174
- * this write and nothing else.
162
+ * The claim names no id yet, so a failure burns nothing. `write` is a parameter so the failure is testable without a
163
+ * filesystem that can be made to fail on exactly this write.
175
164
  */
176
- export declare function publishClaimOwnership(deploymentDirPath: string, componentName: string, write?: (filePath: string, contents: string) => Promise<void>): Promise<void>;
165
+ export declare function publishClaimOwnership(claimDirPath: string, componentName: string, write?: (filePath: string, contents: string) => Promise<void>): Promise<void>;
177
166
  /**
178
167
  * The components a deployment's evidence implicates, when its journal and its ownership sidecar disagree
179
168
  * about whose it is — or `undefined` when there is no disagreement to act on.
@@ -218,7 +207,7 @@ export declare function recoverInterruptedActivations(componentsRootDirPath: str
218
207
  * dormant. The lock is taken only when there is something to do; a lock a live deploy holds is the same
219
208
  * deferral the residue branch records.
220
209
  */
221
- export declare function reconcileDormantBuilds(componentsRootDirPath: string, owner: string, builds: DormantBuild[], maxCount: number): Promise<Map<string, Error>>;
210
+ export declare function reconcileDormantBuilds(componentsRootDirPath: string, owner: string, builds: DormantBuild[], maxCount: number, pinned?: readonly string[]): Promise<Map<string, Error>>;
222
211
  export declare function markCandidateComplete(componentDirPath: string, deploymentId: string, componentName: string): Promise<void>;
223
212
  /**
224
213
  * Make a built and validated candidate live, as one transaction over three effects: the live tree moves
@@ -322,6 +311,7 @@ export declare class Application {
322
311
  isNewComponent: boolean;
323
312
  packageMetadataChanged: boolean;
324
313
  installationIsOpaque: boolean;
314
+ alreadyActive: boolean;
325
315
  constructor({ name, payload, packageIdentifier, install, onInstallLine, credentials }: ApplicationOptions);
326
316
  writeTransientNpmrc(): Promise<void>;
327
317
  get gitCredentialEnv(): Record<string, string> | undefined;