@harperfast/harper 5.2.0-beta.4 → 5.2.1

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 (320) hide show
  1. package/bin/backup.ts +169 -0
  2. package/bin/cliOperations.ts +92 -73
  3. package/bin/copyDb.ts +21 -4
  4. package/bin/harper.ts +43 -55
  5. package/bin/help.ts +216 -0
  6. package/components/Application.ts +236 -46
  7. package/components/ApplicationScope.ts +26 -0
  8. package/components/EntryHandler.ts +410 -105
  9. package/components/RuntimeModuleTracker.ts +189 -0
  10. package/components/Scope.ts +120 -30
  11. package/components/componentLoader.ts +177 -25
  12. package/components/deployLifecycle.ts +119 -33
  13. package/components/mcp/toolRegistry.ts +10 -0
  14. package/components/mcp/tools/application.ts +12 -5
  15. package/components/mcp/tools/operations.ts +9 -0
  16. package/components/mcp/tools/schemas/operationDescriptions.ts +3 -0
  17. package/components/mcp/tools/schemas/operations.ts +9 -0
  18. package/components/operations.js +5 -6
  19. package/components/operationsValidation.js +32 -2
  20. package/components/scopeMount.ts +150 -0
  21. package/config/configUtils.ts +12 -9
  22. package/config-root.schema.json +14 -0
  23. package/dataLayer/backupManifest.ts +102 -0
  24. package/dataLayer/blobBackup.ts +286 -0
  25. package/dataLayer/harperBridge/ResourceBridge.ts +69 -5
  26. package/dataLayer/hdbInfoController.ts +8 -0
  27. package/dataLayer/restoreMarker.ts +276 -0
  28. package/dataLayer/rocksdbBackup.ts +1100 -0
  29. package/dataLayer/schemaDescribe.ts +2 -1
  30. package/dist/bin/backup.d.ts +9 -0
  31. package/dist/bin/backup.js +192 -0
  32. package/dist/bin/backup.js.map +1 -0
  33. package/dist/bin/cliOperations.d.ts +13 -0
  34. package/dist/bin/cliOperations.js +89 -70
  35. package/dist/bin/cliOperations.js.map +1 -1
  36. package/dist/bin/copyDb.js +13 -2
  37. package/dist/bin/copyDb.js.map +1 -1
  38. package/dist/bin/harper.d.ts +13 -0
  39. package/dist/bin/harper.js +45 -56
  40. package/dist/bin/harper.js.map +1 -1
  41. package/dist/bin/help.d.ts +8 -0
  42. package/dist/bin/help.js +192 -0
  43. package/dist/bin/help.js.map +1 -0
  44. package/dist/components/Application.d.ts +16 -1
  45. package/dist/components/Application.js +210 -38
  46. package/dist/components/Application.js.map +1 -1
  47. package/dist/components/ApplicationScope.d.ts +7 -0
  48. package/dist/components/ApplicationScope.js +22 -0
  49. package/dist/components/ApplicationScope.js.map +1 -1
  50. package/dist/components/EntryHandler.d.ts +4 -4
  51. package/dist/components/EntryHandler.js +386 -95
  52. package/dist/components/EntryHandler.js.map +1 -1
  53. package/dist/components/RuntimeModuleTracker.d.ts +11 -0
  54. package/dist/components/RuntimeModuleTracker.js +189 -0
  55. package/dist/components/RuntimeModuleTracker.js.map +1 -0
  56. package/dist/components/Scope.d.ts +38 -1
  57. package/dist/components/Scope.js +117 -28
  58. package/dist/components/Scope.js.map +1 -1
  59. package/dist/components/componentLoader.d.ts +2 -6
  60. package/dist/components/componentLoader.js +160 -18
  61. package/dist/components/componentLoader.js.map +1 -1
  62. package/dist/components/deployLifecycle.d.ts +6 -2
  63. package/dist/components/deployLifecycle.js +109 -31
  64. package/dist/components/deployLifecycle.js.map +1 -1
  65. package/dist/components/mcp/toolRegistry.d.ts +7 -0
  66. package/dist/components/mcp/toolRegistry.js +10 -0
  67. package/dist/components/mcp/toolRegistry.js.map +1 -1
  68. package/dist/components/mcp/tools/application.js +11 -5
  69. package/dist/components/mcp/tools/application.js.map +1 -1
  70. package/dist/components/mcp/tools/operations.js +9 -0
  71. package/dist/components/mcp/tools/operations.js.map +1 -1
  72. package/dist/components/mcp/tools/schemas/operationDescriptions.js +2 -0
  73. package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
  74. package/dist/components/mcp/tools/schemas/operations.js +9 -0
  75. package/dist/components/mcp/tools/schemas/operations.js.map +1 -1
  76. package/dist/components/operations.js +6 -6
  77. package/dist/components/operations.js.map +1 -1
  78. package/dist/components/operationsValidation.js +34 -2
  79. package/dist/components/operationsValidation.js.map +1 -1
  80. package/dist/components/scopeMount.d.ts +86 -0
  81. package/dist/components/scopeMount.js +131 -0
  82. package/dist/components/scopeMount.js.map +1 -0
  83. package/dist/config/configUtils.js +13 -9
  84. package/dist/config/configUtils.js.map +1 -1
  85. package/dist/dataLayer/backupManifest.d.ts +26 -0
  86. package/dist/dataLayer/backupManifest.js +97 -0
  87. package/dist/dataLayer/backupManifest.js.map +1 -0
  88. package/dist/dataLayer/blobBackup.d.ts +87 -0
  89. package/dist/dataLayer/blobBackup.js +282 -0
  90. package/dist/dataLayer/blobBackup.js.map +1 -0
  91. package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +3 -0
  92. package/dist/dataLayer/harperBridge/ResourceBridge.js +45 -5
  93. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  94. package/dist/dataLayer/hdbInfoController.js +4 -0
  95. package/dist/dataLayer/hdbInfoController.js.map +1 -1
  96. package/dist/dataLayer/restoreMarker.d.ts +122 -0
  97. package/dist/dataLayer/restoreMarker.js +261 -0
  98. package/dist/dataLayer/restoreMarker.js.map +1 -0
  99. package/dist/dataLayer/rocksdbBackup.d.ts +127 -0
  100. package/dist/dataLayer/rocksdbBackup.js +1039 -0
  101. package/dist/dataLayer/rocksdbBackup.js.map +1 -0
  102. package/dist/dataLayer/schemaDescribe.js +2 -1
  103. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  104. package/dist/resources/DatabaseTransaction.d.ts +55 -0
  105. package/dist/resources/DatabaseTransaction.js +282 -109
  106. package/dist/resources/DatabaseTransaction.js.map +1 -1
  107. package/dist/resources/ResourceInterface.d.ts +8 -5
  108. package/dist/resources/ResourceInterface.js.map +1 -1
  109. package/dist/resources/Resources.js +22 -4
  110. package/dist/resources/Resources.js.map +1 -1
  111. package/dist/resources/Table.d.ts +6 -5
  112. package/dist/resources/Table.js +114 -37
  113. package/dist/resources/Table.js.map +1 -1
  114. package/dist/resources/analytics/write.js +6 -6
  115. package/dist/resources/analytics/write.js.map +1 -1
  116. package/dist/resources/blob.d.ts +8 -1
  117. package/dist/resources/blob.js +31 -14
  118. package/dist/resources/blob.js.map +1 -1
  119. package/dist/resources/databases.d.ts +59 -1
  120. package/dist/resources/databases.js +386 -41
  121. package/dist/resources/databases.js.map +1 -1
  122. package/dist/resources/jsResource.d.ts +4 -26
  123. package/dist/resources/jsResource.js +5 -59
  124. package/dist/resources/jsResource.js.map +1 -1
  125. package/dist/resources/models/Models.d.ts +11 -1
  126. package/dist/resources/models/Models.js +10 -1
  127. package/dist/resources/models/Models.js.map +1 -1
  128. package/dist/resources/models/backendRegistry.d.ts +9 -0
  129. package/dist/resources/models/backendRegistry.js +10 -0
  130. package/dist/resources/models/backendRegistry.js.map +1 -1
  131. package/dist/resources/models/openaiStream.d.ts +16 -1
  132. package/dist/resources/models/openaiStream.js +113 -21
  133. package/dist/resources/models/openaiStream.js.map +1 -1
  134. package/dist/resources/models/v1/chatCompletions.d.ts +54 -0
  135. package/dist/resources/models/v1/chatCompletions.js +115 -0
  136. package/dist/resources/models/v1/chatCompletions.js.map +1 -0
  137. package/dist/resources/models/v1/embeddings.d.ts +11 -0
  138. package/dist/resources/models/v1/embeddings.js +71 -0
  139. package/dist/resources/models/v1/embeddings.js.map +1 -0
  140. package/dist/resources/models/v1/errors.d.ts +54 -0
  141. package/dist/resources/models/v1/errors.js +130 -0
  142. package/dist/resources/models/v1/errors.js.map +1 -0
  143. package/dist/resources/models/v1/index.d.ts +36 -0
  144. package/dist/resources/models/v1/index.js +75 -0
  145. package/dist/resources/models/v1/index.js.map +1 -0
  146. package/dist/resources/models/v1/models.d.ts +26 -0
  147. package/dist/resources/models/v1/models.js +44 -0
  148. package/dist/resources/models/v1/models.js.map +1 -0
  149. package/dist/resources/models/v1/translation.d.ts +133 -0
  150. package/dist/resources/models/v1/translation.js +298 -0
  151. package/dist/resources/models/v1/translation.js.map +1 -0
  152. package/dist/resources/roles.d.ts +1 -1
  153. package/dist/resources/roles.js +54 -7
  154. package/dist/resources/roles.js.map +1 -1
  155. package/dist/resources/transaction.js +0 -3
  156. package/dist/resources/transaction.js.map +1 -1
  157. package/dist/security/jsLoader.js +84 -33
  158. package/dist/security/jsLoader.js.map +1 -1
  159. package/dist/security/role.js +4 -0
  160. package/dist/security/role.js.map +1 -1
  161. package/dist/security/superUserGuard.d.ts +7 -0
  162. package/dist/security/superUserGuard.js +23 -0
  163. package/dist/security/superUserGuard.js.map +1 -0
  164. package/dist/security/tokenAuthentication.d.ts +0 -1
  165. package/dist/security/tokenAuthentication.js +6 -2
  166. package/dist/security/tokenAuthentication.js.map +1 -1
  167. package/dist/security/user.d.ts +6 -1
  168. package/dist/security/user.js +23 -1
  169. package/dist/security/user.js.map +1 -1
  170. package/dist/server/REST.js +25 -9
  171. package/dist/server/REST.js.map +1 -1
  172. package/dist/server/fastifyRoutes.js +15 -1
  173. package/dist/server/fastifyRoutes.js.map +1 -1
  174. package/dist/server/http.d.ts +23 -2
  175. package/dist/server/http.js +99 -12
  176. package/dist/server/http.js.map +1 -1
  177. package/dist/server/itc/serverHandlers.js +7 -1
  178. package/dist/server/itc/serverHandlers.js.map +1 -1
  179. package/dist/server/jobs/jobProcess.js +20 -1
  180. package/dist/server/jobs/jobProcess.js.map +1 -1
  181. package/dist/server/jobs/jobRunner.js +10 -0
  182. package/dist/server/jobs/jobRunner.js.map +1 -1
  183. package/dist/server/jobs/jobs.js +11 -0
  184. package/dist/server/jobs/jobs.js.map +1 -1
  185. package/dist/server/middlewareChain.d.ts +10 -1
  186. package/dist/server/middlewareChain.js +81 -21
  187. package/dist/server/middlewareChain.js.map +1 -1
  188. package/dist/server/operationsServer.d.ts +0 -2
  189. package/dist/server/operationsServer.js.map +1 -1
  190. package/dist/server/serverHelpers/multipartParser.js +9 -0
  191. package/dist/server/serverHelpers/multipartParser.js.map +1 -1
  192. package/dist/server/serverHelpers/operationAuthorizationState.d.ts +2 -0
  193. package/dist/server/serverHelpers/operationAuthorizationState.js +13 -0
  194. package/dist/server/serverHelpers/operationAuthorizationState.js.map +1 -0
  195. package/dist/server/serverHelpers/registeredOperations.d.ts +3 -2
  196. package/dist/server/serverHelpers/registeredOperations.js +14 -13
  197. package/dist/server/serverHelpers/registeredOperations.js.map +1 -1
  198. package/dist/server/serverHelpers/serverHandlers.js +27 -7
  199. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  200. package/dist/server/serverHelpers/serverUtilities.d.ts +1 -1
  201. package/dist/server/serverHelpers/serverUtilities.js +21 -7
  202. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  203. package/dist/server/static.js +68 -21
  204. package/dist/server/static.js.map +1 -1
  205. package/dist/server/storageReclamation.d.ts +17 -0
  206. package/dist/server/storageReclamation.js +90 -6
  207. package/dist/server/storageReclamation.js.map +1 -1
  208. package/dist/server/threads/socketRouter.js +20 -0
  209. package/dist/server/threads/socketRouter.js.map +1 -1
  210. package/dist/server/threads/threadServer.js +12 -0
  211. package/dist/server/threads/threadServer.js.map +1 -1
  212. package/dist/sqlEngine/diff/differential.js +7 -3
  213. package/dist/sqlEngine/diff/differential.js.map +1 -1
  214. package/dist/sqlTranslator/index.js +6 -1
  215. package/dist/sqlTranslator/index.js.map +1 -1
  216. package/dist/upgrade/upgradePrompt.d.ts +2 -2
  217. package/dist/upgrade/upgradePrompt.js +22 -3
  218. package/dist/upgrade/upgradePrompt.js.map +1 -1
  219. package/dist/utility/OperationFunctionCaller.js +25 -6
  220. package/dist/utility/OperationFunctionCaller.js.map +1 -1
  221. package/dist/utility/errors/commonErrors.d.ts +1 -0
  222. package/dist/utility/errors/commonErrors.js +1 -0
  223. package/dist/utility/errors/commonErrors.js.map +1 -1
  224. package/dist/utility/hdbTerms.d.ts +13 -1
  225. package/dist/utility/hdbTerms.js +13 -1
  226. package/dist/utility/hdbTerms.js.map +1 -1
  227. package/dist/utility/install/installer.js +32 -0
  228. package/dist/utility/install/installer.js.map +1 -1
  229. package/dist/utility/logging/harper_logger.d.ts +47 -0
  230. package/dist/utility/logging/harper_logger.js +803 -38
  231. package/dist/utility/logging/harper_logger.js.map +1 -1
  232. package/dist/utility/operation_authorization.js +13 -3
  233. package/dist/utility/operation_authorization.js.map +1 -1
  234. package/npm-shrinkwrap.json +198 -193
  235. package/package.json +12 -7
  236. package/resources/DESIGN.md +2 -0
  237. package/resources/DatabaseTransaction.ts +310 -104
  238. package/resources/ResourceInterface.ts +8 -5
  239. package/resources/Resources.ts +22 -4
  240. package/resources/Table.ts +341 -263
  241. package/resources/analytics/write.ts +22 -20
  242. package/resources/blob.ts +31 -14
  243. package/resources/databases.ts +387 -46
  244. package/resources/jsResource.ts +5 -62
  245. package/resources/models/Models.ts +14 -1
  246. package/resources/models/backendRegistry.ts +10 -0
  247. package/resources/models/openaiStream.ts +131 -19
  248. package/resources/models/v1/chatCompletions.ts +128 -0
  249. package/resources/models/v1/embeddings.ts +70 -0
  250. package/resources/models/v1/errors.ts +141 -0
  251. package/resources/models/v1/index.ts +72 -0
  252. package/resources/models/v1/models.ts +53 -0
  253. package/resources/models/v1/translation.ts +362 -0
  254. package/resources/roles.ts +67 -7
  255. package/resources/transaction.ts +0 -3
  256. package/security/jsLoader.ts +84 -30
  257. package/security/role.ts +7 -0
  258. package/security/superUserGuard.ts +20 -0
  259. package/security/tokenAuthentication.ts +6 -3
  260. package/security/user.ts +26 -1
  261. package/server/DESIGN.md +61 -34
  262. package/server/REST.ts +25 -9
  263. package/server/fastifyRoutes.ts +20 -1
  264. package/server/http.ts +100 -13
  265. package/server/itc/serverHandlers.js +7 -1
  266. package/server/jobs/jobProcess.ts +18 -1
  267. package/server/jobs/jobRunner.ts +10 -0
  268. package/server/jobs/jobs.ts +11 -0
  269. package/server/middlewareChain.ts +79 -20
  270. package/server/operationsServer.ts +0 -2
  271. package/server/serverHelpers/multipartParser.ts +9 -0
  272. package/server/serverHelpers/operationAuthorizationState.ts +11 -0
  273. package/server/serverHelpers/registeredOperations.ts +19 -15
  274. package/server/serverHelpers/serverHandlers.js +28 -7
  275. package/server/serverHelpers/serverUtilities.ts +29 -7
  276. package/server/static.ts +87 -23
  277. package/server/storageReclamation.ts +104 -8
  278. package/server/threads/socketRouter.ts +20 -0
  279. package/server/threads/threadServer.js +11 -0
  280. package/sqlTranslator/index.ts +6 -1
  281. package/static/defaultConfig.yaml +3 -0
  282. package/studio/web/assets/{Chat-DK3GlWEb.js → Chat-aApwhRmz.js} +2 -2
  283. package/studio/web/assets/{Chat-DK3GlWEb.js.map → Chat-aApwhRmz.js.map} +1 -1
  284. package/studio/web/assets/{FloatingChat-fBcC1Ew_.js → FloatingChat-sC0H91n9.js} +4 -4
  285. package/studio/web/assets/{FloatingChat-fBcC1Ew_.js.map → FloatingChat-sC0H91n9.js.map} +1 -1
  286. package/studio/web/assets/{apiToken-DJo1nakA.js → apiToken-DZ8JhHOI.js} +2 -2
  287. package/studio/web/assets/{apiToken-DJo1nakA.js.map → apiToken-DZ8JhHOI.js.map} +1 -1
  288. package/studio/web/assets/{applications-BDfH8urd.js → applications-9SEVLIO5.js} +2 -2
  289. package/studio/web/assets/{applications-BDfH8urd.js.map → applications-9SEVLIO5.js.map} +1 -1
  290. package/studio/web/assets/{index-BHo3c2Gk.js → index-Dy3uDGXb.js} +6 -6
  291. package/studio/web/assets/index-Dy3uDGXb.js.map +1 -0
  292. package/studio/web/assets/{index.lazy-BTo0y6UM.js → index.lazy-CN1zq4I4.js} +4 -4
  293. package/studio/web/assets/{index.lazy-BTo0y6UM.js.map → index.lazy-CN1zq4I4.js.map} +1 -1
  294. package/studio/web/assets/{notifications-CMxvWNnz.js → notifications-BFAF07xr.js} +2 -2
  295. package/studio/web/assets/{notifications-CMxvWNnz.js.map → notifications-BFAF07xr.js.map} +1 -1
  296. package/studio/web/assets/{notifications-D3GoB26g.js → notifications-CKlYVvVN.js} +2 -2
  297. package/studio/web/assets/{notifications-D3GoB26g.js.map → notifications-CKlYVvVN.js.map} +1 -1
  298. package/studio/web/assets/{profile-Doj5FVDE.js → profile-A1zhEdFG.js} +2 -2
  299. package/studio/web/assets/{profile-Doj5FVDE.js.map → profile-A1zhEdFG.js.map} +1 -1
  300. package/studio/web/assets/{setComponentFile-yinsqJy0.js → setComponentFile-SEtBt_GV.js} +2 -2
  301. package/studio/web/assets/{setComponentFile-yinsqJy0.js.map → setComponentFile-SEtBt_GV.js.map} +1 -1
  302. package/studio/web/assets/{setup-DJwR0BHd.js → setup-BisINqdH.js} +2 -2
  303. package/studio/web/assets/{setup-DJwR0BHd.js.map → setup-BisINqdH.js.map} +1 -1
  304. package/studio/web/assets/{status-Br_AbsJs.js → status-BuQoCc7l.js} +2 -2
  305. package/studio/web/assets/{status-Br_AbsJs.js.map → status-BuQoCc7l.js.map} +1 -1
  306. package/studio/web/assets/{swagger-ui-react-02XH5sVf.js → swagger-ui-react-CAi_s1PC.js} +2 -2
  307. package/studio/web/assets/{swagger-ui-react-02XH5sVf.js.map → swagger-ui-react-CAi_s1PC.js.map} +1 -1
  308. package/studio/web/assets/{tsMode-D1DMKY7h.js → tsMode-DT74tlkM.js} +2 -2
  309. package/studio/web/assets/{tsMode-D1DMKY7h.js.map → tsMode-DT74tlkM.js.map} +1 -1
  310. package/studio/web/assets/{useEntityRestURL-DtRblRgw.js → useEntityRestURL-CGRGc1n7.js} +2 -2
  311. package/studio/web/assets/{useEntityRestURL-DtRblRgw.js.map → useEntityRestURL-CGRGc1n7.js.map} +1 -1
  312. package/studio/web/index.html +1 -1
  313. package/upgrade/upgradePrompt.ts +22 -3
  314. package/utility/OperationFunctionCaller.ts +24 -3
  315. package/utility/errors/commonErrors.ts +2 -0
  316. package/utility/hdbTerms.ts +13 -1
  317. package/utility/install/installer.ts +37 -0
  318. package/utility/logging/harper_logger.ts +786 -41
  319. package/utility/operation_authorization.ts +31 -3
  320. package/studio/web/assets/index-BHo3c2Gk.js.map +0 -1
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAI ↔ Harper internal shape mappers for the `/v1/*` gateway (#631).
4
+ *
5
+ * All functions are pure (no I/O, no side-effects) so they can be unit-tested
6
+ * in isolation without a running Harper instance.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.translateMessages = translateMessages;
10
+ exports.translateTools = translateTools;
11
+ exports.toGenerateInput = toGenerateInput;
12
+ exports.validateChatRequest = validateChatRequest;
13
+ exports.toGenerateOpts = toGenerateOpts;
14
+ exports.toEmbedOpts = toEmbedOpts;
15
+ exports.toChatCompletion = toChatCompletion;
16
+ exports.toEmbedResponse = toEmbedResponse;
17
+ const node_crypto_1 = require("node:crypto");
18
+ // ---------------------------------------------------------------------------
19
+ // OpenAI request → Harper internal
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Map an OpenAI `messages` array to Harper `Message[]`.
23
+ * Normalises `tool_calls[].function.arguments` from JSON strings to parsed
24
+ * objects (Harper's internal contract); maps `tool_call_id` to `toolCallId`.
25
+ */
26
+ function translateMessages(oaiMessages) {
27
+ return oaiMessages.map((m) => {
28
+ // Content parts are flattened to the text Harper's Message.content expects; shapes
29
+ // that cannot be flattened are rejected up front by validateChatRequest.
30
+ const content = Array.isArray(m.content)
31
+ ? m.content.map((part) => part.text).join('')
32
+ : (m.content ?? '');
33
+ const base = {
34
+ // `developer` is OpenAI's successor to `system` (the API itself treats the two
35
+ // identically, converting `system` to `developer` on models that use the newer
36
+ // hierarchy). Harper's internal Message union carries the channel as `system`,
37
+ // which every provider adapter maps to its system-instruction slot — so the
38
+ // instruction's priority is preserved rather than degraded to `user`. Roles
39
+ // outside the union are rejected up front by validateChatRequest, so the cast
40
+ // below is over a vetted set.
41
+ role: m.role === 'developer' ? 'system' : m.role,
42
+ content,
43
+ };
44
+ if (m.tool_calls?.length) {
45
+ base.toolCalls = m.tool_calls.map((tc) => {
46
+ let args;
47
+ try {
48
+ args = JSON.parse(tc.function.arguments);
49
+ }
50
+ catch {
51
+ // Preserve unparseable argument strings under a sentinel key rather
52
+ // than dropping them — backend can decide what to do.
53
+ args = { _raw: tc.function.arguments };
54
+ }
55
+ return { id: tc.id, name: tc.function.name, arguments: args };
56
+ });
57
+ }
58
+ if (m.tool_call_id)
59
+ base.toolCallId = m.tool_call_id;
60
+ return base;
61
+ });
62
+ }
63
+ /** Map OpenAI `tools[]` to Harper `ToolDef[]`. */
64
+ function translateTools(oaiTools) {
65
+ return oaiTools.map((t) => ({
66
+ name: t.function.name,
67
+ description: t.function.description ?? '',
68
+ parameters: t.function.parameters ?? {},
69
+ }));
70
+ }
71
+ /**
72
+ * Build Harper `GenerateInput` from translated messages and tool definitions.
73
+ * Uses the object form `{ messages, tools }` when tools are present, so that
74
+ * tool definitions travel alongside messages per Harper's type contract.
75
+ */
76
+ function toGenerateInput(messages, tools) {
77
+ if (tools?.length)
78
+ return { messages, tools };
79
+ return messages;
80
+ }
81
+ /** `tool_choice` values the internal contract can faithfully represent. */
82
+ function isRepresentableToolChoice(choice) {
83
+ return choice === undefined || choice === null || choice === 'auto' || choice === 'none';
84
+ }
85
+ /**
86
+ * Validate the OpenAI wire shapes this gateway maps, returning a client-facing
87
+ * message for a 400 or `null` when the request is well-formed.
88
+ *
89
+ * Kept separate from the mappers so malformed nested input (`messages: [null]`,
90
+ * `tool_calls: [{}]`, `tools: [{}]`) becomes an OpenAI-shaped 400 instead of a
91
+ * TypeError escaping the handler as an RFC 9457 500.
92
+ */
93
+ function validateChatRequest(body) {
94
+ const req = body;
95
+ // Top-level fields that control routing and framing first: a non-string `model`
96
+ // would silently invoke the configured default model (potentially expensive), and a
97
+ // truthy non-boolean `stream` ("false") would return SSE the client didn't ask for.
98
+ if (req.model !== undefined && typeof req.model !== 'string')
99
+ return "'model' must be a string";
100
+ if (req.stream !== undefined && typeof req.stream !== 'boolean')
101
+ return "'stream' must be a boolean";
102
+ if (req.temperature !== undefined) {
103
+ if (typeof req.temperature !== 'number' || !Number.isFinite(req.temperature)) {
104
+ return "'temperature' must be a finite number";
105
+ }
106
+ if (req.temperature < 0 || req.temperature > 2)
107
+ return "'temperature' must be between 0 and 2";
108
+ }
109
+ for (const field of ['max_tokens', 'max_completion_tokens']) {
110
+ const value = req[field];
111
+ if (value === undefined)
112
+ continue;
113
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {
114
+ return `'${field}' must be a positive integer`;
115
+ }
116
+ }
117
+ if (!Array.isArray(req.messages) || req.messages.length === 0)
118
+ return "'messages' must be a non-empty array";
119
+ for (let i = 0; i < req.messages.length; i++) {
120
+ const m = req.messages[i];
121
+ if (!m || typeof m !== 'object' || Array.isArray(m))
122
+ return `'messages[${i}]' must be an object`;
123
+ if (typeof m.role !== 'string')
124
+ return `'messages[${i}].role' must be a string`;
125
+ // Closed set: translateMessages casts into Harper's Message union, so an
126
+ // unknown role must be a loud 400 here — previously it was cast through and
127
+ // provider adapters degraded it to 'user', silently changing its priority.
128
+ // 'developer' is accepted and carried as 'system' (see translateMessages);
129
+ // the deprecated 'function' role is deliberately not supported.
130
+ if (!['system', 'developer', 'user', 'assistant', 'tool'].includes(m.role)) {
131
+ return `'messages[${i}].role' must be one of 'system', 'developer', 'user', 'assistant', 'tool'`;
132
+ }
133
+ // OpenAI allows content parts: [{ type: 'text', text: '...' }, ...]. Harper's
134
+ // Message.content is a string, so those are flattened in translateMessages; reject
135
+ // shapes we cannot flatten rather than passing a non-string downstream.
136
+ if (m.content !== undefined && m.content !== null && typeof m.content !== 'string') {
137
+ if (!Array.isArray(m.content))
138
+ return `'messages[${i}].content' must be a string, array of parts, or null`;
139
+ for (let p = 0; p < m.content.length; p++) {
140
+ const part = m.content[p];
141
+ if (!part || typeof part !== 'object')
142
+ return `'messages[${i}].content[${p}]' must be an object`;
143
+ if (part.type !== 'text' || typeof part.text !== 'string') {
144
+ return `'messages[${i}].content[${p}]' must be a text part ({ type: 'text', text: string }); other part types are not supported yet`;
145
+ }
146
+ }
147
+ }
148
+ if (m.tool_calls !== undefined) {
149
+ if (!Array.isArray(m.tool_calls))
150
+ return `'messages[${i}].tool_calls' must be an array`;
151
+ for (let j = 0; j < m.tool_calls.length; j++) {
152
+ const tc = m.tool_calls[j];
153
+ const at = `'messages[${i}].tool_calls[${j}]`;
154
+ if (!tc || typeof tc !== 'object')
155
+ return `${at}' must be an object`;
156
+ if (!tc.function || typeof tc.function !== 'object')
157
+ return `${at}.function' is required`;
158
+ if (typeof tc.function.name !== 'string')
159
+ return `${at}.function.name' must be a string`;
160
+ if (typeof tc.function.arguments !== 'string')
161
+ return `${at}.function.arguments' must be a JSON string`;
162
+ }
163
+ }
164
+ }
165
+ if (req.tools !== undefined) {
166
+ if (!Array.isArray(req.tools))
167
+ return "'tools' must be an array";
168
+ for (let i = 0; i < req.tools.length; i++) {
169
+ const t = req.tools[i];
170
+ if (!t || typeof t !== 'object')
171
+ return `'tools[${i}]' must be an object`;
172
+ if (!t.function || typeof t.function !== 'object')
173
+ return `'tools[${i}].function' is required`;
174
+ if (typeof t.function.name !== 'string')
175
+ return `'tools[${i}].function.name' must be a string`;
176
+ }
177
+ }
178
+ if (!isRepresentableToolChoice(req.tool_choice)) {
179
+ // Better a clear 400 than silently downgrading 'required'/named selection to 'auto'.
180
+ return "'tool_choice' supports 'auto' and 'none'; 'required' and named function selection are not supported yet";
181
+ }
182
+ if (req.response_format !== undefined) {
183
+ const rf = req.response_format;
184
+ if (!rf || typeof rf !== 'object' || Array.isArray(rf))
185
+ return "'response_format' must be an object";
186
+ if (rf.type === 'json_schema') {
187
+ const wrapper = rf.json_schema;
188
+ if (!wrapper || typeof wrapper !== 'object') {
189
+ return "'response_format.json_schema' is required when type is 'json_schema'";
190
+ }
191
+ if (!wrapper.schema || typeof wrapper.schema !== 'object') {
192
+ return "'response_format.json_schema.schema' must be a JSON Schema object";
193
+ }
194
+ }
195
+ }
196
+ return null;
197
+ }
198
+ /**
199
+ * Map an OpenAI chat-completion request body to `GenerateOpts`.
200
+ *
201
+ * `tool_choice` is honored by the caller, not here: `'none'` omits tools from the
202
+ * generate input entirely, and unrepresentable choices are rejected up front by
203
+ * `validateChatRequest`. Full in-process tool-call orchestration is #612 (out of
204
+ * scope for #631), so tool calls are always returned to the caller to invoke.
205
+ *
206
+ * Assumes `validateChatRequest` has already passed.
207
+ */
208
+ function toGenerateOpts(body) {
209
+ const opts = { toolMode: 'return' };
210
+ if (typeof body.model === 'string')
211
+ opts.model = body.model;
212
+ if (typeof body.temperature === 'number')
213
+ opts.temperature = body.temperature;
214
+ const maxTokens = body.max_completion_tokens ?? body.max_tokens;
215
+ if (typeof maxTokens === 'number')
216
+ opts.maxTokens = maxTokens;
217
+ if (body.response_format) {
218
+ const rf = body.response_format;
219
+ if (rf.type === 'json_object') {
220
+ opts.responseFormat = 'json';
221
+ }
222
+ else if (rf.type === 'json_schema') {
223
+ // The wire value is a wrapper ({ name, strict, schema }); Harper's contract wants
224
+ // the JSON Schema itself. Passing the wrapper makes the backend wrap it again and
225
+ // send metadata where the provider expects the schema.
226
+ opts.responseFormat = { schema: rf.json_schema.schema };
227
+ }
228
+ else {
229
+ opts.responseFormat = 'text';
230
+ }
231
+ }
232
+ return opts;
233
+ }
234
+ /** Map an OpenAI embeddings request body to `EmbedOpts`. */
235
+ function toEmbedOpts(body) {
236
+ const opts = {};
237
+ if (typeof body.model === 'string')
238
+ opts.model = body.model;
239
+ return opts;
240
+ }
241
+ function toOAIToolCalls(toolCalls) {
242
+ return toolCalls.map((tc) => ({
243
+ id: tc.id,
244
+ type: 'function',
245
+ // Guard against backends that return arguments as a pre-serialised JSON string;
246
+ // passing a string through JSON.stringify would double-encode it.
247
+ function: {
248
+ name: tc.name,
249
+ arguments: typeof tc.arguments === 'string' ? tc.arguments : JSON.stringify(tc.arguments),
250
+ },
251
+ }));
252
+ }
253
+ /** Map a Harper `GenerateResult` to an OpenAI `chat.completion` response object. */
254
+ function toChatCompletion(result, model, id) {
255
+ const completionId = id ?? `chatcmpl-${(0, node_crypto_1.randomUUID)().replaceAll('-', '')}`;
256
+ const hasTools = !!result.toolCalls?.length;
257
+ const message = {
258
+ role: 'assistant',
259
+ // OpenAI sets content to null when there are tool calls and no text content.
260
+ content: result.content || (hasTools ? null : ''),
261
+ };
262
+ if (hasTools)
263
+ message.tool_calls = toOAIToolCalls(result.toolCalls);
264
+ const usage = result.usage ?? {};
265
+ return {
266
+ id: completionId,
267
+ object: 'chat.completion',
268
+ created: Math.floor(Date.now() / 1000),
269
+ model,
270
+ choices: [{ index: 0, message, finish_reason: result.finishReason }],
271
+ usage: {
272
+ prompt_tokens: usage.promptTokens ?? 0,
273
+ completion_tokens: usage.completionTokens ?? 0,
274
+ total_tokens: (usage.promptTokens ?? 0) + (usage.completionTokens ?? 0),
275
+ },
276
+ };
277
+ }
278
+ /** Map `Float32Array[]` from `models.embed()` to an OpenAI embeddings response. */
279
+ function toEmbedResponse(vecs, model, usage) {
280
+ return {
281
+ object: 'list',
282
+ data: vecs.map((vec, index) => ({
283
+ embedding: Array.from(vec),
284
+ index,
285
+ object: 'embedding',
286
+ })),
287
+ model,
288
+ // Embeddings have no completion side, so OpenAI reports the same count in both
289
+ // fields. Harper backends spell it `embeddingTokens` (with `promptTokens` as a
290
+ // fallback for backends that report it that way); mapping must be symmetric —
291
+ // a backend supplying only embeddingTokens must not leave prompt_tokens at 0.
292
+ usage: {
293
+ prompt_tokens: usage?.embeddingTokens ?? usage?.promptTokens ?? 0,
294
+ total_tokens: usage?.embeddingTokens ?? usage?.promptTokens ?? 0,
295
+ },
296
+ };
297
+ }
298
+ //# sourceMappingURL=translation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation.js","sourceRoot":"","sources":["../../../../resources/models/v1/translation.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,4 @@
2
2
  * This is the component for handling role declarations in the Harper system. This will read roles.yaml for role
3
3
  * definitions and ensure that they are created in the system database.
4
4
  */
5
- export declare function handleApplication(scope: import('../components/Scope.ts').Scope): void;
5
+ export declare function handleApplication(scope: import('../components/Scope.ts').Scope, ensureRoleFn?: (role: any) => Promise<unknown>): void;
@@ -14,21 +14,67 @@ const USERS_NOT_DBS = hdbTerms_ts_1.RESERVED_DATABASE_NAMES;
14
14
  * This is the component for handling role declarations in the Harper system. This will read roles.yaml for role
15
15
  * definitions and ensure that they are created in the system database.
16
16
  */
17
- function handleApplication(scope) {
18
- scope.handleEntry(async (entry) => {
19
- if (entry.eventType === 'unlink')
17
+ function handleApplication(scope, ensureRoleFn = ensureRole) {
18
+ const rolesByFile = new Map();
19
+ const contentsByFile = new Map();
20
+ let pending = Promise.resolve();
21
+ const enqueue = (operation) => {
22
+ const queued = pending.then(operation);
23
+ pending = queued.catch(() => { });
24
+ return queued;
25
+ };
26
+ const entryHandler = scope.handleEntry((entry) => enqueue(async () => {
27
+ if (entry.entryType !== 'file')
20
28
  return;
21
- return handleFile(entry.contents);
29
+ const previousRoles = rolesByFile.get(entry.absolutePath) ?? new Set();
30
+ if (entry.eventType === 'unlink') {
31
+ rolesByFile.delete(entry.absolutePath);
32
+ contentsByFile.delete(entry.absolutePath);
33
+ warnForStaleRoles(scope, previousRoles, rolesByFile);
34
+ return;
35
+ }
36
+ contentsByFile.set(entry.absolutePath, entry.contents);
37
+ const currentRoles = await handleFile(entry.contents, ensureRoleFn);
38
+ rolesByFile.set(entry.absolutePath, currentRoles);
39
+ warnForStaleRoles(scope, new Set([...previousRoles].filter((roleName) => !currentRoles.has(roleName))), rolesByFile);
40
+ }));
41
+ if (!entryHandler)
42
+ return;
43
+ scope.on('deploy:end', () => {
44
+ void entryHandler.ready
45
+ .then(() => enqueue(async () => {
46
+ for (const contents of contentsByFile.values()) {
47
+ try {
48
+ await handleFile(contents, ensureRoleFn);
49
+ }
50
+ catch (error) {
51
+ scope.logger.error?.('Could not reconcile a roles file after deploy:', error);
52
+ }
53
+ }
54
+ }))
55
+ .catch((error) => scope.logger.error?.('Could not reconcile roles after deploy:', error));
22
56
  });
23
57
  }
58
+ function warnForStaleRoles(scope, removedRoles, rolesByFile) {
59
+ const stillDeclared = new Set();
60
+ for (const roleNames of rolesByFile.values())
61
+ for (const roleName of roleNames)
62
+ stillDeclared.add(roleName);
63
+ const staleRoles = [...removedRoles].filter((roleName) => !stillDeclared.has(roleName));
64
+ if (staleRoles.length === 0)
65
+ return;
66
+ scope.logger.warn(`Role definitions removed for ${staleRoles.join(', ')}; existing roles and grants remain active until explicitly altered or deleted`);
67
+ }
24
68
  /**
25
69
  * This function will handle the roles.yaml file content that has been read, and ensure that the roles are translated to
26
70
  * the right shape and created in the system database.
27
71
  * @param rolesContent
28
72
  */
29
- async function handleFile(rolesContent) {
73
+ async function handleFile(rolesContent, ensureRoleFn) {
30
74
  let rolesToDefine = (0, yaml_1.parseDocument)(rolesContent.toString(), { simpleKeys: true }).toJSON();
75
+ const roleNames = new Set();
31
76
  for (let roleName in rolesToDefine) {
77
+ roleNames.add(roleName);
32
78
  let role = rolesToDefine[roleName];
33
79
  if (!role.permission) {
34
80
  // we allow the permission object to be collapsed into the root object for convenience
@@ -82,8 +128,9 @@ async function handleFile(rolesContent) {
82
128
  }
83
129
  }
84
130
  role.role = role.id = roleName;
85
- await ensureRole(role);
131
+ await ensureRoleFn(role);
86
132
  }
133
+ return roleNames;
87
134
  }
88
135
  async function ensureRole(role) {
89
136
  const roleTable = (0, databases_ts_1.getDatabases)().system.hdb_role;
@@ -91,10 +138,10 @@ async function ensureRole(role) {
91
138
  for await (let existingRole of roleTable.search([{ attribute: 'role', value: role.role }])) {
92
139
  // use the existing role id so we can update in place. Legacy roles may have a UUID for the id instead of the role name
93
140
  const { __createdtime__, __updatedtime__, ...existingRoleData } = existingRole;
141
+ role.id = existingRole.id;
94
142
  if ((0, lodash_1.isEqual)(existingRoleData, role)) {
95
143
  return;
96
144
  }
97
- role.id = existingRole.id;
98
145
  return (0, role_ts_1.alterRole)(role);
99
146
  }
100
147
  return (0, role_ts_1.addRole)(role);
@@ -1 +1 @@
1
- {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../resources/roles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../resources/roles.ts"],"names":[],"mappings":"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"}
@@ -40,9 +40,6 @@ function transaction(ctx, callback) {
40
40
  if (context.sourceApply)
41
41
  transaction.sourceApply = true;
42
42
  transaction.setContext(context);
43
- // create a resource cache so that multiple requests to the same resource return the same resource
44
- if (!context.resourceCache)
45
- context.resourceCache = new Map();
46
43
  let result;
47
44
  try {
48
45
  result =
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../resources/transaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../resources/transaction.ts"],"names":[],"mappings":"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"}