@harperfast/harper 5.1.20 → 5.2.0-alpha.5

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 (395) hide show
  1. package/agent/operations.ts +13 -16
  2. package/components/Application.ts +188 -7
  3. package/components/ApplicationScope.ts +3 -0
  4. package/components/Scope.ts +12 -0
  5. package/components/anthropic/index.ts +9 -2
  6. package/components/bedrock/index.ts +25 -2
  7. package/components/componentLoader.ts +56 -7
  8. package/components/componentSecrets.ts +451 -0
  9. package/components/deploymentRecorder.ts +7 -1
  10. package/components/mcp/adapters/fastify.ts +3 -0
  11. package/components/mcp/adapters/harperHttp.ts +3 -0
  12. package/components/mcp/audit.ts +21 -6
  13. package/components/mcp/customResourceRegistry.ts +17 -38
  14. package/components/mcp/listChanged.ts +37 -20
  15. package/components/mcp/quota.ts +145 -0
  16. package/components/mcp/rateLimit.ts +152 -14
  17. package/components/mcp/resources.ts +2 -4
  18. package/components/mcp/toolRegistry.ts +73 -4
  19. package/components/mcp/tools/application.ts +77 -8
  20. package/components/mcp/tools/operations.ts +106 -36
  21. package/components/mcp/tools/schemas/operationDescriptions.ts +4 -4
  22. package/components/mcp/tools/schemas/operations.ts +5 -0
  23. package/components/mcp/transport.ts +55 -4
  24. package/components/ollama/index.ts +6 -2
  25. package/components/openai/index.ts +9 -2
  26. package/components/operations.js +204 -10
  27. package/components/operationsValidation.js +173 -0
  28. package/components/secretOperations.ts +498 -0
  29. package/config/configUtils.ts +25 -1
  30. package/config-app.schema.json +81 -0
  31. package/config-root.schema.json +8 -1
  32. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
  33. package/dataLayer/readAuditLog.ts +14 -0
  34. package/dataLayer/schemaDescribe.ts +1 -0
  35. package/dist/agent/operations.d.ts +7 -4
  36. package/dist/agent/operations.js +13 -15
  37. package/dist/agent/operations.js.map +1 -1
  38. package/dist/components/Application.d.ts +25 -2
  39. package/dist/components/Application.js +166 -7
  40. package/dist/components/Application.js.map +1 -1
  41. package/dist/components/ApplicationScope.d.ts +2 -0
  42. package/dist/components/ApplicationScope.js +3 -0
  43. package/dist/components/ApplicationScope.js.map +1 -1
  44. package/dist/components/Scope.d.ts +8 -0
  45. package/dist/components/Scope.js +11 -0
  46. package/dist/components/Scope.js.map +1 -1
  47. package/dist/components/anthropic/index.d.ts +4 -1
  48. package/dist/components/anthropic/index.js +4 -2
  49. package/dist/components/anthropic/index.js.map +1 -1
  50. package/dist/components/bedrock/index.d.ts +4 -1
  51. package/dist/components/bedrock/index.js +22 -2
  52. package/dist/components/bedrock/index.js.map +1 -1
  53. package/dist/components/componentLoader.d.ts +2 -0
  54. package/dist/components/componentLoader.js +52 -10
  55. package/dist/components/componentLoader.js.map +1 -1
  56. package/dist/components/componentSecrets.d.ts +63 -0
  57. package/dist/components/componentSecrets.js +405 -0
  58. package/dist/components/componentSecrets.js.map +1 -0
  59. package/dist/components/deploymentRecorder.d.ts +3 -0
  60. package/dist/components/deploymentRecorder.js +4 -3
  61. package/dist/components/deploymentRecorder.js.map +1 -1
  62. package/dist/components/mcp/adapters/fastify.d.ts +2 -0
  63. package/dist/components/mcp/adapters/fastify.js +1 -0
  64. package/dist/components/mcp/adapters/fastify.js.map +1 -1
  65. package/dist/components/mcp/adapters/harperHttp.d.ts +2 -0
  66. package/dist/components/mcp/adapters/harperHttp.js +1 -0
  67. package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
  68. package/dist/components/mcp/audit.d.ts +2 -2
  69. package/dist/components/mcp/audit.js +20 -5
  70. package/dist/components/mcp/audit.js.map +1 -1
  71. package/dist/components/mcp/customResourceRegistry.d.ts +5 -12
  72. package/dist/components/mcp/customResourceRegistry.js +15 -30
  73. package/dist/components/mcp/customResourceRegistry.js.map +1 -1
  74. package/dist/components/mcp/listChanged.d.ts +7 -2
  75. package/dist/components/mcp/listChanged.js +28 -0
  76. package/dist/components/mcp/listChanged.js.map +1 -1
  77. package/dist/components/mcp/quota.d.ts +31 -0
  78. package/dist/components/mcp/quota.js +155 -0
  79. package/dist/components/mcp/quota.js.map +1 -0
  80. package/dist/components/mcp/rateLimit.d.ts +19 -3
  81. package/dist/components/mcp/rateLimit.js +129 -13
  82. package/dist/components/mcp/rateLimit.js.map +1 -1
  83. package/dist/components/mcp/resources.js.map +1 -1
  84. package/dist/components/mcp/toolRegistry.d.ts +39 -1
  85. package/dist/components/mcp/toolRegistry.js +60 -5
  86. package/dist/components/mcp/toolRegistry.js.map +1 -1
  87. package/dist/components/mcp/tools/application.d.ts +8 -1
  88. package/dist/components/mcp/tools/application.js +65 -5
  89. package/dist/components/mcp/tools/application.js.map +1 -1
  90. package/dist/components/mcp/tools/operations.d.ts +15 -3
  91. package/dist/components/mcp/tools/operations.js +99 -38
  92. package/dist/components/mcp/tools/operations.js.map +1 -1
  93. package/dist/components/mcp/tools/schemas/operationDescriptions.js +4 -4
  94. package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
  95. package/dist/components/mcp/tools/schemas/operations.js +4 -0
  96. package/dist/components/mcp/tools/schemas/operations.js.map +1 -1
  97. package/dist/components/mcp/transport.d.ts +6 -0
  98. package/dist/components/mcp/transport.js +47 -3
  99. package/dist/components/mcp/transport.js.map +1 -1
  100. package/dist/components/ollama/index.d.ts +4 -1
  101. package/dist/components/ollama/index.js +4 -2
  102. package/dist/components/ollama/index.js.map +1 -1
  103. package/dist/components/openai/index.d.ts +4 -1
  104. package/dist/components/openai/index.js +4 -2
  105. package/dist/components/openai/index.js.map +1 -1
  106. package/dist/components/operations.d.ts +39 -0
  107. package/dist/components/operations.js +194 -2
  108. package/dist/components/operations.js.map +1 -1
  109. package/dist/components/operationsValidation.d.ts +38 -0
  110. package/dist/components/operationsValidation.js +155 -0
  111. package/dist/components/operationsValidation.js.map +1 -1
  112. package/dist/components/secretOperations.d.ts +113 -0
  113. package/dist/components/secretOperations.js +475 -0
  114. package/dist/components/secretOperations.js.map +1 -0
  115. package/dist/config/configUtils.d.ts +4 -1
  116. package/dist/config/configUtils.js +18 -1
  117. package/dist/config/configUtils.js.map +1 -1
  118. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
  119. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js.map +1 -1
  120. package/dist/dataLayer/readAuditLog.js +11 -0
  121. package/dist/dataLayer/readAuditLog.js.map +1 -1
  122. package/dist/dataLayer/schemaDescribe.js +2 -0
  123. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  124. package/dist/globals.d.ts +1 -1
  125. package/dist/globals.js +1 -0
  126. package/dist/globals.js.map +1 -1
  127. package/dist/index.d.ts +3 -0
  128. package/dist/index.js +1 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/json/systemSchema.json +38 -0
  131. package/dist/resources/DatabaseTransaction.d.ts +31 -3
  132. package/dist/resources/DatabaseTransaction.js +190 -29
  133. package/dist/resources/DatabaseTransaction.js.map +1 -1
  134. package/dist/resources/LMDBTransaction.d.ts +1 -1
  135. package/dist/resources/LMDBTransaction.js +43 -5
  136. package/dist/resources/LMDBTransaction.js.map +1 -1
  137. package/dist/resources/PrimaryRocksDatabase.d.ts +51 -0
  138. package/dist/resources/PrimaryRocksDatabase.js +194 -0
  139. package/dist/resources/PrimaryRocksDatabase.js.map +1 -0
  140. package/dist/resources/RecordEncoder.d.ts +1 -0
  141. package/dist/resources/RecordEncoder.js +81 -75
  142. package/dist/resources/RecordEncoder.js.map +1 -1
  143. package/dist/resources/RequestTarget.d.ts +19 -0
  144. package/dist/resources/RequestTarget.js.map +1 -1
  145. package/dist/resources/Resource.d.ts +0 -1
  146. package/dist/resources/Resource.js +103 -16
  147. package/dist/resources/Resource.js.map +1 -1
  148. package/dist/resources/ResourceInterface.d.ts +6 -2
  149. package/dist/resources/ResourceInterface.js.map +1 -1
  150. package/dist/resources/Resources.js.map +1 -1
  151. package/dist/resources/Table.d.ts +6 -4
  152. package/dist/resources/Table.js +247 -24
  153. package/dist/resources/Table.js.map +1 -1
  154. package/dist/resources/analytics/read.js +25 -28
  155. package/dist/resources/analytics/read.js.map +1 -1
  156. package/dist/resources/blob.js +165 -22
  157. package/dist/resources/blob.js.map +1 -1
  158. package/dist/resources/crdt.d.ts +2 -0
  159. package/dist/resources/crdt.js +45 -36
  160. package/dist/resources/crdt.js.map +1 -1
  161. package/dist/resources/databases.d.ts +1 -0
  162. package/dist/resources/databases.js +134 -7
  163. package/dist/resources/databases.js.map +1 -1
  164. package/dist/resources/graphql.js +8 -0
  165. package/dist/resources/graphql.js.map +1 -1
  166. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +35 -5
  167. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +239 -14
  168. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  169. package/dist/resources/jsResource.js +6 -0
  170. package/dist/resources/jsResource.js.map +1 -1
  171. package/dist/resources/loadEnv.js +30 -3
  172. package/dist/resources/loadEnv.js.map +1 -1
  173. package/dist/resources/login.js +2 -2
  174. package/dist/resources/login.js.map +1 -1
  175. package/dist/resources/models/Models.js +14 -3
  176. package/dist/resources/models/Models.js.map +1 -1
  177. package/dist/resources/models/embedHook.js +10 -2
  178. package/dist/resources/models/embedHook.js.map +1 -1
  179. package/dist/resources/models/openaiStream.d.ts +56 -0
  180. package/dist/resources/models/openaiStream.js +94 -0
  181. package/dist/resources/models/openaiStream.js.map +1 -0
  182. package/dist/resources/replayLogs.js +4 -3
  183. package/dist/resources/replayLogs.js.map +1 -1
  184. package/dist/resources/search.d.ts +1 -1
  185. package/dist/resources/search.js +104 -11
  186. package/dist/resources/search.js.map +1 -1
  187. package/dist/resources/secretDecryptor.d.ts +54 -0
  188. package/dist/resources/secretDecryptor.js +131 -0
  189. package/dist/resources/secretDecryptor.js.map +1 -0
  190. package/dist/resources/tracked.js +15 -5
  191. package/dist/resources/tracked.js.map +1 -1
  192. package/dist/security/auth.js +71 -8
  193. package/dist/security/auth.js.map +1 -1
  194. package/dist/security/jsLoader.js +11 -0
  195. package/dist/security/jsLoader.js.map +1 -1
  196. package/dist/security/tokenAuthentication.d.ts +9 -1
  197. package/dist/security/tokenAuthentication.js +31 -1
  198. package/dist/security/tokenAuthentication.js.map +1 -1
  199. package/dist/server/DurableSubscriptionsSession.d.ts +1 -1
  200. package/dist/server/DurableSubscriptionsSession.js +8 -4
  201. package/dist/server/DurableSubscriptionsSession.js.map +1 -1
  202. package/dist/server/REST.js +28 -9
  203. package/dist/server/REST.js.map +1 -1
  204. package/dist/server/fastifyRoutes.js +11 -1
  205. package/dist/server/fastifyRoutes.js.map +1 -1
  206. package/dist/server/graphqlQuerying.js +4 -3
  207. package/dist/server/graphqlQuerying.js.map +1 -1
  208. package/dist/server/http.d.ts +40 -2
  209. package/dist/server/http.js +560 -77
  210. package/dist/server/http.js.map +1 -1
  211. package/dist/server/itc/serverHandlers.js +64 -0
  212. package/dist/server/itc/serverHandlers.js.map +1 -1
  213. package/dist/server/liveSubscriptionAuth.d.ts +12 -0
  214. package/dist/server/liveSubscriptionAuth.js +140 -0
  215. package/dist/server/liveSubscriptionAuth.js.map +1 -0
  216. package/dist/server/loadRootComponents.js +2 -1
  217. package/dist/server/loadRootComponents.js.map +1 -1
  218. package/dist/server/middlewareChain.d.ts +44 -1
  219. package/dist/server/middlewareChain.js +86 -10
  220. package/dist/server/middlewareChain.js.map +1 -1
  221. package/dist/server/mqtt.js +2 -1
  222. package/dist/server/mqtt.js.map +1 -1
  223. package/dist/server/operationsServer.js +1 -1
  224. package/dist/server/operationsServer.js.map +1 -1
  225. package/dist/server/serverHelpers/Headers.d.ts +9 -0
  226. package/dist/server/serverHelpers/Headers.js +22 -0
  227. package/dist/server/serverHelpers/Headers.js.map +1 -1
  228. package/dist/server/serverHelpers/JSONStream.js +3 -3
  229. package/dist/server/serverHelpers/JSONStream.js.map +1 -1
  230. package/dist/server/serverHelpers/Request.d.ts +52 -1
  231. package/dist/server/serverHelpers/Request.js +122 -1
  232. package/dist/server/serverHelpers/Request.js.map +1 -1
  233. package/dist/server/serverHelpers/contentTypes.js +3 -8
  234. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  235. package/dist/server/serverHelpers/progressEmitter.d.ts +19 -0
  236. package/dist/server/serverHelpers/progressEmitter.js +52 -4
  237. package/dist/server/serverHelpers/progressEmitter.js.map +1 -1
  238. package/dist/server/serverHelpers/registeredOperations.d.ts +40 -0
  239. package/dist/server/serverHelpers/registeredOperations.js +286 -0
  240. package/dist/server/serverHelpers/registeredOperations.js.map +1 -0
  241. package/dist/server/serverHelpers/serverHandlers.js +11 -5
  242. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  243. package/dist/server/serverHelpers/serverUtilities.d.ts +1 -0
  244. package/dist/server/serverHelpers/serverUtilities.js +67 -5
  245. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  246. package/dist/server/serverHelpers/uwsServer.d.ts +80 -0
  247. package/dist/server/serverHelpers/uwsServer.js +433 -0
  248. package/dist/server/serverHelpers/uwsServer.js.map +1 -0
  249. package/dist/server/static.d.ts +0 -15
  250. package/dist/server/static.js +161 -2
  251. package/dist/server/static.js.map +1 -1
  252. package/dist/server/status/index.d.ts +4 -1
  253. package/dist/server/status/index.js +64 -4
  254. package/dist/server/status/index.js.map +1 -1
  255. package/dist/server/threads/manageThreads.d.ts +10 -0
  256. package/dist/server/threads/manageThreads.js +107 -4
  257. package/dist/server/threads/manageThreads.js.map +1 -1
  258. package/dist/server/threads/socketRouter.js +5 -1
  259. package/dist/server/threads/socketRouter.js.map +1 -1
  260. package/dist/server/threads/threadServer.js +92 -14
  261. package/dist/server/threads/threadServer.js.map +1 -1
  262. package/dist/upgrade/directives/5-2-0.d.ts +7 -0
  263. package/dist/upgrade/directives/5-2-0.js +108 -0
  264. package/dist/upgrade/directives/5-2-0.js.map +1 -0
  265. package/dist/upgrade/directives/directivesController.js +2 -1
  266. package/dist/upgrade/directives/directivesController.js.map +1 -1
  267. package/dist/utility/common_utils.js +5 -0
  268. package/dist/utility/common_utils.js.map +1 -1
  269. package/dist/utility/envFile.d.ts +41 -0
  270. package/dist/utility/envFile.js +221 -0
  271. package/dist/utility/envFile.js.map +1 -0
  272. package/dist/utility/globalSchema.d.ts +9 -0
  273. package/dist/utility/hdbTerms.d.ts +25 -0
  274. package/dist/utility/hdbTerms.js +31 -0
  275. package/dist/utility/hdbTerms.js.map +1 -1
  276. package/dist/utility/logging/harper_logger.d.ts +21 -0
  277. package/dist/utility/logging/harper_logger.js +160 -8
  278. package/dist/utility/logging/harper_logger.js.map +1 -1
  279. package/dist/utility/logging/logRotator.js +29 -17
  280. package/dist/utility/logging/logRotator.js.map +1 -1
  281. package/dist/utility/logging/readLog.d.ts +1 -1
  282. package/dist/utility/logging/readLog.js +305 -2
  283. package/dist/utility/logging/readLog.js.map +1 -1
  284. package/dist/utility/operationPermissions.d.ts +18 -0
  285. package/dist/utility/operationPermissions.js +35 -1
  286. package/dist/utility/operationPermissions.js.map +1 -1
  287. package/dist/utility/operation_authorization.d.ts +17 -0
  288. package/dist/utility/operation_authorization.js +38 -0
  289. package/dist/utility/operation_authorization.js.map +1 -1
  290. package/dist/utility/secretEnvelope.d.ts +30 -0
  291. package/dist/utility/secretEnvelope.js +94 -0
  292. package/dist/utility/secretEnvelope.js.map +1 -0
  293. package/dist/utility/signalling.d.ts +7 -0
  294. package/dist/utility/signalling.js +16 -0
  295. package/dist/utility/signalling.js.map +1 -1
  296. package/dist/validation/configValidator.js +70 -24
  297. package/dist/validation/configValidator.js.map +1 -1
  298. package/index.ts +4 -0
  299. package/json/systemSchema.json +38 -0
  300. package/npm-shrinkwrap.json +15066 -9347
  301. package/package.json +14 -9
  302. package/resources/DESIGN.md +15 -12
  303. package/resources/DatabaseTransaction.ts +206 -37
  304. package/resources/LMDBTransaction.ts +43 -9
  305. package/resources/PrimaryRocksDatabase.ts +201 -0
  306. package/resources/RecordEncoder.ts +81 -69
  307. package/resources/RequestTarget.ts +21 -0
  308. package/resources/Resource.ts +109 -25
  309. package/resources/ResourceInterface.ts +6 -2
  310. package/resources/Resources.ts +1 -3
  311. package/resources/Table.ts +238 -29
  312. package/resources/analytics/read.ts +25 -30
  313. package/resources/blob.ts +159 -23
  314. package/resources/crdt.ts +37 -31
  315. package/resources/databases.ts +143 -6
  316. package/resources/graphql.ts +8 -0
  317. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +251 -17
  318. package/resources/jsResource.ts +6 -0
  319. package/resources/loadEnv.ts +34 -3
  320. package/resources/login.ts +2 -2
  321. package/resources/models/Models.ts +19 -3
  322. package/resources/models/embedHook.ts +13 -2
  323. package/resources/models/openaiStream.ts +133 -0
  324. package/resources/replayLogs.ts +4 -3
  325. package/resources/search.ts +113 -11
  326. package/resources/secretDecryptor.ts +159 -0
  327. package/resources/tracked.ts +24 -17
  328. package/security/auth.ts +70 -10
  329. package/security/jsLoader.ts +12 -0
  330. package/security/tokenAuthentication.ts +42 -1
  331. package/server/DESIGN.md +10 -0
  332. package/server/DurableSubscriptionsSession.ts +8 -4
  333. package/server/REST.ts +26 -9
  334. package/server/fastifyRoutes.ts +10 -1
  335. package/server/graphqlQuerying.ts +4 -3
  336. package/server/http.ts +563 -77
  337. package/server/itc/serverHandlers.js +70 -0
  338. package/server/liveSubscriptionAuth.ts +152 -0
  339. package/server/loadRootComponents.js +2 -1
  340. package/server/middlewareChain.ts +107 -17
  341. package/server/mqtt.ts +2 -1
  342. package/server/operationsServer.ts +2 -2
  343. package/server/serverHelpers/Headers.ts +24 -0
  344. package/server/serverHelpers/JSONStream.ts +3 -3
  345. package/server/serverHelpers/Request.ts +127 -0
  346. package/server/serverHelpers/contentTypes.ts +3 -8
  347. package/server/serverHelpers/progressEmitter.ts +55 -5
  348. package/server/serverHelpers/registeredOperations.ts +259 -0
  349. package/server/serverHelpers/serverHandlers.js +11 -5
  350. package/server/serverHelpers/serverUtilities.ts +88 -5
  351. package/server/serverHelpers/uwsServer.ts +488 -0
  352. package/server/static.ts +180 -2
  353. package/server/status/index.ts +72 -4
  354. package/server/threads/manageThreads.js +102 -4
  355. package/server/threads/socketRouter.ts +5 -1
  356. package/server/threads/threadServer.js +93 -10
  357. package/studio/web/assets/{Chat-SdD1EZca.js → Chat-Cv_2paZE.js} +2 -2
  358. package/studio/web/assets/{Chat-SdD1EZca.js.map → Chat-Cv_2paZE.js.map} +1 -1
  359. package/studio/web/assets/{FloatingChat-GMq6tHK9.js → FloatingChat-CPyPIcVR.js} +4 -4
  360. package/studio/web/assets/{FloatingChat-GMq6tHK9.js.map → FloatingChat-CPyPIcVR.js.map} +1 -1
  361. package/studio/web/assets/{applications-B5hhv7uA.js → applications-C0jT2vdZ.js} +2 -2
  362. package/studio/web/assets/{applications-B5hhv7uA.js.map → applications-C0jT2vdZ.js.map} +1 -1
  363. package/studio/web/assets/{index-VFcpNWgq.js → index-D_GKOkhn.js} +6 -6
  364. package/studio/web/assets/index-D_GKOkhn.js.map +1 -0
  365. package/studio/web/assets/{index.lazy-DgcJojIA.js → index.lazy-CAmCIA65.js} +4 -4
  366. package/studio/web/assets/{index.lazy-DgcJojIA.js.map → index.lazy-CAmCIA65.js.map} +1 -1
  367. package/studio/web/assets/{profile-BqN-8vzm.js → profile-CaF-4aZe.js} +2 -2
  368. package/studio/web/assets/{profile-BqN-8vzm.js.map → profile-CaF-4aZe.js.map} +1 -1
  369. package/studio/web/assets/{setComponentFile-CHFvFq9u.js → setComponentFile-DLW1DHCt.js} +2 -2
  370. package/studio/web/assets/{setComponentFile-CHFvFq9u.js.map → setComponentFile-DLW1DHCt.js.map} +1 -1
  371. package/studio/web/assets/{setup-CQ3vWJSr.js → setup-TGCErIhq.js} +2 -2
  372. package/studio/web/assets/{setup-CQ3vWJSr.js.map → setup-TGCErIhq.js.map} +1 -1
  373. package/studio/web/assets/{status-BsW5fjuh.js → status-DG0Maoao.js} +2 -2
  374. package/studio/web/assets/{status-BsW5fjuh.js.map → status-DG0Maoao.js.map} +1 -1
  375. package/studio/web/assets/{swagger-ui-react-DITdeB9-.js → swagger-ui-react-8T4SgQ1m.js} +2 -2
  376. package/studio/web/assets/{swagger-ui-react-DITdeB9-.js.map → swagger-ui-react-8T4SgQ1m.js.map} +1 -1
  377. package/studio/web/assets/{tsMode-Dyph-OUs.js → tsMode-DJ6Sl24Q.js} +2 -2
  378. package/studio/web/assets/{tsMode-Dyph-OUs.js.map → tsMode-DJ6Sl24Q.js.map} +1 -1
  379. package/studio/web/assets/{useEntityRestURL-D0QTUqex.js → useEntityRestURL-JO2mfWTQ.js} +2 -2
  380. package/studio/web/assets/{useEntityRestURL-D0QTUqex.js.map → useEntityRestURL-JO2mfWTQ.js.map} +1 -1
  381. package/studio/web/index.html +1 -1
  382. package/upgrade/directives/5-2-0.ts +82 -0
  383. package/upgrade/directives/directivesController.ts +2 -1
  384. package/utility/common_utils.ts +5 -0
  385. package/utility/envFile.ts +218 -0
  386. package/utility/hdbTerms.ts +31 -0
  387. package/utility/logging/harper_logger.ts +156 -8
  388. package/utility/logging/logRotator.ts +24 -14
  389. package/utility/logging/readLog.ts +323 -2
  390. package/utility/operationPermissions.ts +35 -1
  391. package/utility/operation_authorization.ts +74 -1
  392. package/utility/secretEnvelope.ts +113 -0
  393. package/utility/signalling.ts +15 -0
  394. package/validation/configValidator.ts +78 -25
  395. package/studio/web/assets/index-VFcpNWgq.js.map +0 -1
@@ -27,6 +27,7 @@ import { deleteRootBlobPathsForDB } from './blob.ts';
27
27
  import { CUSTOM_INDEXES } from './indexes/customIndexes.ts';
28
28
  import { OpenDBIObject } from '../utility/lmdb/OpenDBIObject.ts';
29
29
  import { RocksDatabase, type RocksDatabaseOptions } from '@harperfast/rocksdb-js';
30
+ import { PrimaryRocksDatabase } from './PrimaryRocksDatabase.ts';
30
31
  import { replayLogs } from './replayLogs.ts';
31
32
  import { totalmem } from 'node:os';
32
33
  import { RocksIndexStore } from './RocksIndexStore.ts';
@@ -194,7 +195,7 @@ function openRocksDatabase(path: string, options: RocksDatabaseOptions & { dupSo
194
195
  if (options.dupSort) {
195
196
  db = new RocksIndexStore(path, options).open() as any;
196
197
  } else {
197
- db = RocksDatabase.open(path, options) as any;
198
+ db = new PrimaryRocksDatabase(path, options).open() as unknown as RocksRootDatabase;
198
199
  // the RocksDB put and remove return promises, which masks thrown errors in non-awaiting calls to put/remove,
199
200
  // making them unsafe to replace LMDB methods, which will synchronously throw errors if there is a problem
200
201
  db.put = db.putSync as any;
@@ -582,6 +583,7 @@ function initStores(
582
583
  const expiration = primaryAttribute.expiration;
583
584
  const eviction = primaryAttribute.eviction;
584
585
  const sealed = primaryAttribute.sealed;
586
+ const cacheControl = primaryAttribute.cacheControl;
585
587
  const splitSegments = primaryAttribute.splitSegments;
586
588
  const replicate = primaryAttribute.replicate;
587
589
  if (table && !recreateForEngineChange) {
@@ -614,7 +616,7 @@ function initStores(
614
616
  dbiInit.randomAccessStructure = primaryAttribute.randomAccessFields;
615
617
  if (rootStore instanceof RocksDatabase) {
616
618
  primaryStore = handleLocalTimeForGets(
617
- openRocksDatabase(rootStore.path, { ...dbiInit, name: primaryAttribute.key } as any),
619
+ openRocksDatabase(rootStore.path, { ...dbiInit, name: primaryAttribute.key, cache: true } as any),
618
620
  rootStore
619
621
  );
620
622
  } else {
@@ -720,6 +722,7 @@ function initStores(
720
722
  replicate,
721
723
  expirationMS: expiration && expiration * 1000,
722
724
  evictionMS: eviction && eviction * 1000,
725
+ cacheControl,
723
726
  trackDeletes,
724
727
  tableName,
725
728
  tableId,
@@ -773,6 +776,9 @@ interface TableDefinition {
773
776
  description?: string;
774
777
  properties?: Record<string, any>;
775
778
  hidden?: boolean;
779
+ // default Cache-Control for anonymous REST reads; null = schema explicitly has none (clears a
780
+ // prior value on reload), undefined = caller is not schema-defining (leave the current value)
781
+ cacheControl?: string | null;
776
782
  }
777
783
  /**
778
784
  * Ensure that we have this database object (that holds a set of tables) set up
@@ -932,6 +938,68 @@ export async function dropDatabase(databaseName) {
932
938
 
933
939
  await deleteRootBlobPathsForDB(rootStore);
934
940
  }
941
+ // HNSW_NO_AUTOVERSION kill-switch: when set, a NEW index initializes as legacy rather than
942
+ // versioned. process.env values are strings, so a bare truthiness check would treat "0"/"false"
943
+ // as enabling the switch — the opposite of intent. Treat "" / "0" / "false" (and unset) as NOT set.
944
+ function hnswAutoVersionDisabled(): boolean {
945
+ const value = process.env.HNSW_NO_AUTOVERSION;
946
+ return value != null && value !== '' && value !== '0' && value.toLowerCase() !== 'false';
947
+ }
948
+
949
+ /**
950
+ * Resolve the storage format of a custom-index object store (e.g. HNSW): `'versioned'` (each node
951
+ * value is prefixed with a monotonic version the RocksDB Verification Table can extract → cached,
952
+ * decode-free graph traversal) or `'legacy'` (un-versioned, un-cached).
953
+ *
954
+ * The format is decided ONCE — when the index is created — and persisted on the attribute
955
+ * descriptor (`indexFormat`), so every worker and every reload reads the same authoritative value
956
+ * rather than re-deriving it from the store's current contents. Re-deriving per-open is racy: a
957
+ * store that is non-empty mid-backfill would be mis-read as legacy, and opening a versioned store
958
+ * with the legacy decoder corrupts reads. table() persists the resolved value (and always persists
959
+ * it BEFORE the first node is written, so by the time a store is non-empty its format is on disk).
960
+ *
961
+ * The empty-guard below is only the INITIALIZER for the first open under this feature (no format
962
+ * persisted yet): an empty store will be written versioned; a pre-existing non-empty store holds
963
+ * legacy un-prefixed values (incl. small-int id mappings the versioned decoder would misread) and
964
+ * stays legacy until an explicit reindex rebuilds it. The HNSW_NO_AUTOVERSION kill-switch only
965
+ * blocks a NEW index from initializing as versioned — an already-versioned store is still resolved
966
+ * versioned so its reads stay correct. The resolved value is stamped back onto `attribute` so the
967
+ * caller's attributesDbi.put persists it.
968
+ */
969
+ function resolveIndexFormat(
970
+ dbiKey: string,
971
+ rootStore: RootDatabaseKind,
972
+ dbi: any,
973
+ attribute: any
974
+ ): 'versioned' | 'legacy' {
975
+ const persisted = (rootStore as any).dbisDb?.getSync(dbiKey)?.indexFormat;
976
+ let format: 'versioned' | 'legacy' = persisted ?? attribute.indexFormat;
977
+ if (format == null) {
978
+ format = 'legacy';
979
+ let isEmpty = true;
980
+ // Probe with no start/end so any key type is counted — numeric, string-pk
981
+ // safeKeys, and Symbol/array keys (e.g. entryPoint, KEY_PREFIX) are all
982
+ // included. The old { start: 0, end: Infinity } range missed symbol-array and
983
+ // string keys, misclassifying non-empty stores as empty after a delete-all.
984
+ for (const _key of dbi.getKeys({ limit: 1 })) {
985
+ isEmpty = false;
986
+ break;
987
+ }
988
+ if (isEmpty && !hnswAutoVersionDisabled()) format = 'versioned';
989
+ }
990
+ attribute.indexFormat = format;
991
+ return format;
992
+ }
993
+
994
+ // Arm a custom-index object store for versioned (VT-cacheable) reads and writes: enable the
995
+ // metadata-prefix encode/decode (isRocksDB) and self-versioning (autoVersion) on its encoder.
996
+ // Idempotent — safe to call again on a re-opened or reindexed store.
997
+ function armVersionedIndexEncoder(dbi: any, rootStore: any) {
998
+ if (dbi.encoder?.autoVersion) return;
999
+ handleLocalTimeForGets(dbi, rootStore);
1000
+ if (dbi.encoder) dbi.encoder.autoVersion = true;
1001
+ }
1002
+
935
1003
  // opens an index, consulting with custom indexes that may use alternate store configuration
936
1004
  function openIndex(dbiKey: string, rootStore: RootDatabaseKind, attribute: any) {
937
1005
  const objectStorage =
@@ -953,9 +1021,23 @@ function openIndex(dbiKey: string, rootStore: RootDatabaseKind, attribute: any)
953
1021
  indexNulls?: boolean;
954
1022
  rootStore?: RocksRootDatabase;
955
1023
  });
1024
+ const isCustomObjectIndex = !!(attribute.indexed?.type && CUSTOM_INDEXES[attribute.indexed.type]?.useObjectStore);
956
1025
  if (rootStore instanceof RocksDatabase) {
957
- dbi = openRocksDatabase(rootStore.path, { ...dbiInit, name: dbiKey } as any) as any;
1026
+ // Enable cache (WeakLRUCache + VT) for all custom-object index stores so the VT is
1027
+ // available before resolveIndexFormat decides the format. Versioned stores need the VT
1028
+ // for cached traversal; legacy stores pay a small per-write cache.delete() overhead only.
1029
+ dbi = openRocksDatabase(rootStore.path, { ...dbiInit, name: dbiKey, cache: isCustomObjectIndex } as any) as any;
958
1030
  (dbi as any).rootStore = rootStore;
1031
+ // Custom-index object stores (e.g. HNSW) write graph nodes via plain put() with no staged
1032
+ // transaction timestamp, so their values carry no version and the PrimaryRocksDatabase
1033
+ // Verification-Table cache can't track them. A versioned index initialises its encoder as a
1034
+ // versioned RocksDB store (isRocksDB → metadata-prefix encode/decode) and marks it
1035
+ // self-versioning, so each node gets a monotonic version the VT can extract — enabling cached,
1036
+ // decode-free graph traversal. The format is resolved from the persisted attribute descriptor
1037
+ // (decided once at create — see resolveIndexFormat) so every worker and reload agree on it.
1038
+ if (isCustomObjectIndex && resolveIndexFormat(dbiKey, rootStore, dbi, attribute) === 'versioned') {
1039
+ armVersionedIndexEncoder(dbi, rootStore);
1040
+ }
959
1041
  } else {
960
1042
  dbi = (rootStore as any).openDB(dbiKey, dbiInit as any);
961
1043
  }
@@ -1003,6 +1085,7 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1003
1085
  description,
1004
1086
  properties,
1005
1087
  hidden,
1088
+ cacheControl,
1006
1089
  } = tableDefinition;
1007
1090
  if (!databaseName) databaseName = DEFAULT_DATABASE_NAME;
1008
1091
  const rootStore = database({ database: databaseName, table: tableName });
@@ -1049,6 +1132,8 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1049
1132
  Table.description = description;
1050
1133
  Table.properties = properties;
1051
1134
  Table.hidden = hidden;
1135
+ // undefined means a non-schema caller (add_attribute, cluster schema events) — don't clobber
1136
+ if (cacheControl !== undefined) Table.cacheControl = cacheControl;
1052
1137
  } else {
1053
1138
  const auditStore = rootStore.auditStore;
1054
1139
  primaryKeyAttribute = attributes.find((attribute) => attribute.isPrimaryKey) || {};
@@ -1062,6 +1147,12 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1062
1147
  audit = primaryKeyAttribute.audit = typeof audit === 'boolean' ? audit : envGet(CONFIG_PARAMS.LOGGING_AUDITLOG);
1063
1148
  if (expiration) primaryKeyAttribute.expiration = expiration;
1064
1149
  if (eviction) primaryKeyAttribute.eviction = eviction;
1150
+ // persist cacheControl so all threads (and future boots) see it; undefined callers inherit
1151
+ // a descriptor value carried by cluster schema events; null (schema has no directive)
1152
+ // clears a stale value the carried descriptor may hold
1153
+ if (cacheControl === undefined) cacheControl = primaryKeyAttribute.cacheControl;
1154
+ else if (cacheControl === null) delete primaryKeyAttribute.cacheControl;
1155
+ else primaryKeyAttribute.cacheControl = cacheControl;
1065
1156
  splitSegments ??= false;
1066
1157
  primaryKeyAttribute.splitSegments = splitSegments; // always default to not splitting segments going forward
1067
1158
  if (typeof sealed === 'boolean') primaryKeyAttribute.sealed = sealed;
@@ -1116,7 +1207,7 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1116
1207
  completeInterruptedDrop(rootStore, attributesDbi, databaseName, tableName);
1117
1208
  }
1118
1209
  if (rootStore instanceof RocksDatabase) {
1119
- primaryStore = openRocksDatabase(rootStore.path, { ...dbiInit, name: dbiName } as any);
1210
+ primaryStore = openRocksDatabase(rootStore.path, { ...dbiInit, name: dbiName, cache: true } as any);
1120
1211
  } else {
1121
1212
  primaryStore = (rootStore as any).openDB(dbiName, dbiInit as any);
1122
1213
  }
@@ -1153,6 +1244,7 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1153
1244
  description,
1154
1245
  properties,
1155
1246
  hidden,
1247
+ cacheControl,
1156
1248
  })
1157
1249
  );
1158
1250
  Table.schemaVersion = 1;
@@ -1300,8 +1392,18 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1300
1392
  // on the main thread, where workerData is undefined (and it is initialized to 1).
1301
1393
  const currentRestartGeneration = workerData?.restartNumber ?? manageThreads.restartNumber;
1302
1394
  const dbi = openIndex(dbiKey, rootStore, attribute);
1395
+ // openIndex resolves and stamps attribute.indexFormat for a versioned-capable (RocksDB
1396
+ // custom-object) index. An index created before this field existed has no indexFormat on
1397
+ // disk; persist the resolved value now — even when nothing else changed — so the format is
1398
+ // durable BEFORE any node is written. Otherwise an empty pre-existing index would resolve
1399
+ // 'versioned', write versioned nodes, and on the next load re-derive 'legacy' from the
1400
+ // now-non-empty store, opening versioned data with the legacy decoder (silent corruption).
1401
+ // (Scoped by attribute.indexFormat != null: only RocksDB custom-object indexes set it.)
1402
+ const indexFormatNeedsPersist =
1403
+ attribute.indexFormat != null && attributeDescriptor?.indexFormat !== attribute.indexFormat;
1303
1404
  if (
1304
1405
  changed ||
1406
+ indexFormatNeedsPersist ||
1305
1407
  attributeDescriptor?.indexingFailed ||
1306
1408
  (attributeDescriptor?.indexingPID && attributeDescriptor?.indexingPID !== process.pid) ||
1307
1409
  attributeDescriptor?.restartNumber < currentRestartGeneration
@@ -1336,6 +1438,23 @@ export function table<TableResourceType>(tableDefinition: TableDefinition): Tabl
1336
1438
  attribute.lastIndexedKey = indexOptionsChanged
1337
1439
  ? undefined
1338
1440
  : (attributeDescriptor?.lastIndexedKey ?? undefined);
1441
+ // Explicit reindex is the upgrade path from a legacy (un-versioned) custom-index
1442
+ // object store to the versioned, VT-cacheable format. A full rebuild from scratch
1443
+ // (lastIndexedKey === undefined) clears the store and rewrites every node, so the
1444
+ // new nodes can carry versions: flip the persisted format and re-arm the dbi encoder
1445
+ // (openIndex armed it from the pre-rebuild format, which for a legacy index was
1446
+ // un-versioned). A crash-recovery resume (lastIndexedKey preserved) keeps the
1447
+ // existing format — its partial graph was already written under it.
1448
+ if (
1449
+ rootStore instanceof RocksDatabase &&
1450
+ indexType &&
1451
+ CUSTOM_INDEXES[indexType]?.useObjectStore &&
1452
+ !hnswAutoVersionDisabled() &&
1453
+ attribute.lastIndexedKey === undefined
1454
+ ) {
1455
+ attribute.indexFormat = 'versioned';
1456
+ armVersionedIndexEncoder(dbi, rootStore);
1457
+ }
1339
1458
  attribute.indexingPID = process.pid;
1340
1459
  // Persist the owning restart generation (see currentRestartGeneration above) so
1341
1460
  // the trigger can re-detect an incomplete index after a worker restart even when
@@ -1542,9 +1661,14 @@ async function runIndexing(Table, attributes, indicesToRemove) {
1542
1661
  } catch (error) {
1543
1662
  hadIndexingErrors = true;
1544
1663
  if (!attributeErrorReported[property]) {
1545
- // just report an indexing error once per attribute so we don't spam the logs
1664
+ // just report an indexing error once per attribute so we don't spam the logs.
1665
+ // A store closed by worker shutdown surfaces here as "Database not open"; that is
1666
+ // a benign interruption (the next generation re-runs the backfill), so don't log
1667
+ // it as an error — the outer catch returns quietly once the iterator also throws.
1546
1668
  attributeErrorReported[property] = true;
1547
- logger.error(`Error indexing attribute ${property}`, error);
1669
+ if (Table.primaryStore?.rootStore?.status === 'closed')
1670
+ logger.debug(`Indexing attribute ${property} interrupted by store shutdown`, error);
1671
+ else logger.error(`Error indexing attribute ${property}`, error);
1548
1672
  }
1549
1673
  }
1550
1674
  }
@@ -1638,6 +1762,19 @@ async function runIndexing(Table, attributes, indicesToRemove) {
1638
1762
  logger.info(`Finished indexing ${Table.tableName} attributes`, attributes);
1639
1763
  }
1640
1764
  } catch (error) {
1765
+ // A worker shutting down closes its stores mid-backfill, so the range iterator or a
1766
+ // put throws (e.g. "Database not open" / "Iterator not initialized"). This is an
1767
+ // interruption, not a data error: the next worker generation re-runs the backfill via
1768
+ // the crash-recovery trigger (indexingPID / restartNumber mismatch), and persisting
1769
+ // indexingFailed here would fail anyway against the closed store. Treat it as a benign
1770
+ // interruption instead of logging a misleading error and a "failed to persist" warning.
1771
+ if (Table.primaryStore?.rootStore?.status === 'closed') {
1772
+ logger.debug(
1773
+ `Indexing of ${Table.tableName} interrupted by store shutdown; recovery resumes on the next worker generation`,
1774
+ error
1775
+ );
1776
+ return;
1777
+ }
1641
1778
  logger.error('Error in indexing', error);
1642
1779
  // Persist indexingFailed so the next restart re-triggers the rebuild from an
1643
1780
  // explicitly failed state rather than silently looping. Without this,
@@ -118,6 +118,14 @@ async function processGraphQLSchema(gqlContent, urlPath, filePath, resources) {
118
118
  // Boolean directive args arrive as actual booleans; tolerate string forms too.
119
119
  if (typeDef.randomAccessFields !== undefined)
120
120
  typeDef.randomAccessFields = typeDef.randomAccessFields === true || typeDef.randomAccessFields === 'true';
121
+ // schema is authoritative for cacheControl: null (vs undefined) clears a removed directive on reload;
122
+ // coerce to a header-safe string so a non-string arg or CRLF can't reach the HTTP response
123
+ typeDef.cacheControl =
124
+ typeDef.cacheControl == null
125
+ ? null
126
+ : String(typeDef.cacheControl)
127
+ .replace(/[\r\n]+/g, ' ')
128
+ .trim();
121
129
  tables.push(typeDef);
122
130
  }
123
131
  if (directive.name.value === 'sealed') typeDef.sealed = true;