@harperfast/harper 5.0.25 → 5.1.0-beta.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 (1121) hide show
  1. package/README.md +11 -10
  2. package/agent/agent.ts +203 -0
  3. package/agent/loop.ts +205 -0
  4. package/agent/operations.ts +148 -0
  5. package/agent/session.ts +187 -0
  6. package/agent/tools/fsTools.ts +276 -0
  7. package/agent/tools/httpFetchTool.ts +112 -0
  8. package/agent/tools/scheduleTool.ts +68 -0
  9. package/agent/toolset.ts +43 -0
  10. package/agent/types.ts +85 -0
  11. package/bin/{BinObjects.js → BinObjects.ts} +4 -5
  12. package/bin/cliCredentials.ts +133 -0
  13. package/bin/cliOperations.ts +339 -0
  14. package/bin/copyDb.ts +10 -10
  15. package/bin/deployRenderer.ts +196 -0
  16. package/bin/{harper.js → harper.ts} +43 -19
  17. package/bin/{install.js → install.ts} +3 -3
  18. package/bin/lite.ts +2 -0
  19. package/bin/login.ts +168 -0
  20. package/bin/logout.ts +11 -0
  21. package/bin/mcp/client.ts +407 -0
  22. package/bin/mcp/doctor.ts +189 -0
  23. package/bin/mcp/index.ts +80 -0
  24. package/bin/mcp/options.ts +122 -0
  25. package/bin/mcp/printConfig.ts +89 -0
  26. package/bin/multipartBuilder.ts +74 -0
  27. package/bin/{restart.js → restart.ts} +27 -28
  28. package/bin/{run.js → run.ts} +41 -30
  29. package/bin/sseConsumer.ts +126 -0
  30. package/bin/{status.js → status.ts} +10 -10
  31. package/bin/{stop.js → stop.ts} +5 -5
  32. package/bin/upgrade.js +6 -6
  33. package/components/Application.ts +144 -18
  34. package/components/ApplicationScope.ts +2 -2
  35. package/components/ComponentV1.ts +2 -2
  36. package/components/EntryHandler.ts +159 -9
  37. package/components/OptionsWatcher.ts +75 -11
  38. package/components/Scope.ts +125 -15
  39. package/components/anthropic/index.ts +547 -0
  40. package/components/bedrock/index.ts +823 -0
  41. package/components/componentLoader.ts +63 -32
  42. package/components/deployLifecycle.ts +161 -0
  43. package/components/deploymentOperations.ts +173 -0
  44. package/components/deploymentRecorder.ts +402 -0
  45. package/components/deriveURLPath.ts +4 -4
  46. package/components/mcp/adapters/fastify.ts +87 -0
  47. package/components/mcp/adapters/harperHttp.ts +103 -0
  48. package/components/mcp/audit.ts +75 -0
  49. package/components/mcp/index.ts +134 -0
  50. package/components/mcp/jsonrpc.ts +134 -0
  51. package/components/mcp/lifecycle.ts +105 -0
  52. package/components/mcp/listChanged.ts +270 -0
  53. package/components/mcp/rateLimit.ts +217 -0
  54. package/components/mcp/resources.ts +593 -0
  55. package/components/mcp/session.ts +151 -0
  56. package/components/mcp/sessionRegistry.ts +140 -0
  57. package/components/mcp/toolRegistry.ts +292 -0
  58. package/components/mcp/tools/application.ts +603 -0
  59. package/components/mcp/tools/operations.ts +283 -0
  60. package/components/mcp/tools/schemas/derive.ts +256 -0
  61. package/components/mcp/tools/schemas/operations.ts +245 -0
  62. package/components/mcp/transport.ts +517 -0
  63. package/components/ollama/index.ts +316 -0
  64. package/components/openai/index.ts +563 -0
  65. package/components/operations.js +211 -60
  66. package/components/operationsValidation.js +3 -3
  67. package/components/packageComponent.ts +97 -29
  68. package/components/requestRestart.ts +17 -2
  69. package/components/status/crossThread.ts +14 -5
  70. package/components/status/errors.ts +1 -1
  71. package/config/RootConfigWatcher.ts +56 -2
  72. package/config/configUtils.js +29 -8
  73. package/config/harperConfigEnvVars.ts +1 -1
  74. package/config-root.schema.json +74 -0
  75. package/dataLayer/{CreateAttributeObject.js → CreateAttributeObject.ts} +4 -3
  76. package/dataLayer/{CreateTableObject.js → CreateTableObject.ts} +2 -1
  77. package/dataLayer/{DataLayerObjects.js → DataLayerObjects.ts} +17 -9
  78. package/dataLayer/{DeleteBeforeObject.js → DeleteBeforeObject.ts} +2 -1
  79. package/dataLayer/{DeleteObject.js → DeleteObject.ts} +3 -2
  80. package/dataLayer/{DropAttributeObject.js → DropAttributeObject.ts} +2 -1
  81. package/dataLayer/{GetBackupObject.js → GetBackupObject.ts} +3 -2
  82. package/dataLayer/{InsertObject.js → InsertObject.ts} +3 -2
  83. package/dataLayer/{ReadAuditLogObject.js → ReadAuditLogObject.ts} +3 -2
  84. package/dataLayer/{SQLSearch.js → SQLSearch.ts} +97 -43
  85. package/dataLayer/{SearchByConditionsObject.js → SearchByConditionsObject.ts} +5 -6
  86. package/dataLayer/{SearchByHashObject.js → SearchByHashObject.ts} +2 -1
  87. package/dataLayer/{SearchObject.js → SearchObject.ts} +2 -1
  88. package/dataLayer/{SqlSearchObject.js → SqlSearchObject.ts} +2 -1
  89. package/dataLayer/{UpdateObject.js → UpdateObject.ts} +3 -2
  90. package/dataLayer/{UpsertObject.js → UpsertObject.ts} +3 -2
  91. package/dataLayer/{bulkLoad.js → bulkLoad.ts} +40 -49
  92. package/dataLayer/{delete.js → delete.ts} +21 -26
  93. package/dataLayer/{export.js → export.ts} +22 -26
  94. package/dataLayer/{getBackup.js → getBackup.ts} +7 -9
  95. package/dataLayer/harperBridge/BridgeMethods.ts +102 -0
  96. package/dataLayer/harperBridge/ResourceBridge.ts +27 -26
  97. package/dataLayer/harperBridge/TableSizeObject.ts +1 -0
  98. package/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
  99. package/dataLayer/harperBridge/{harperBridge.js → harperBridge.ts} +3 -3
  100. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +8 -6
  101. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
  102. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
  103. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +6 -4
  104. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +5 -4
  105. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
  106. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +6 -5
  107. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +5 -4
  108. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
  109. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
  110. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
  111. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
  112. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +3 -2
  113. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
  114. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +10 -8
  115. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
  116. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +4 -3
  117. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
  118. package/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +6 -5
  119. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +2 -1
  120. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +3 -2
  121. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
  122. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +5 -4
  123. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +6 -3
  124. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.ts +1 -1
  125. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
  126. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
  127. package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
  128. package/dataLayer/{hdbInfoController.js → hdbInfoController.ts} +20 -26
  129. package/dataLayer/{insert.js → insert.ts} +24 -24
  130. package/dataLayer/{readAuditLog.js → readAuditLog.ts} +8 -10
  131. package/dataLayer/{schema.js → schema.ts} +32 -44
  132. package/dataLayer/{schemaDescribe.js → schemaDescribe.ts} +23 -26
  133. package/dataLayer/{search.js → search.ts} +9 -15
  134. package/dataLayer/{transaction.js → transaction.ts} +2 -5
  135. package/dataLayer/{update.js → update.ts} +19 -22
  136. package/dist/agent/agent.d.ts +35 -0
  137. package/dist/agent/agent.js +175 -0
  138. package/dist/agent/agent.js.map +1 -0
  139. package/dist/agent/loop.d.ts +34 -0
  140. package/dist/agent/loop.js +176 -0
  141. package/dist/agent/loop.js.map +1 -0
  142. package/dist/agent/operations.d.ts +17 -0
  143. package/dist/agent/operations.js +137 -0
  144. package/dist/agent/operations.js.map +1 -0
  145. package/dist/agent/session.d.ts +36 -0
  146. package/dist/agent/session.js +182 -0
  147. package/dist/agent/session.js.map +1 -0
  148. package/dist/agent/tools/fsTools.d.ts +19 -0
  149. package/dist/agent/tools/fsTools.js +286 -0
  150. package/dist/agent/tools/fsTools.js.map +1 -0
  151. package/dist/agent/tools/httpFetchTool.d.ts +9 -0
  152. package/dist/agent/tools/httpFetchTool.js +116 -0
  153. package/dist/agent/tools/httpFetchTool.js.map +1 -0
  154. package/dist/agent/tools/scheduleTool.d.ts +22 -0
  155. package/dist/agent/tools/scheduleTool.js +54 -0
  156. package/dist/agent/tools/scheduleTool.js.map +1 -0
  157. package/dist/agent/toolset.d.ts +24 -0
  158. package/dist/agent/toolset.js +33 -0
  159. package/dist/agent/toolset.js.map +1 -0
  160. package/dist/agent/types.d.ts +75 -0
  161. package/dist/agent/types.js +10 -0
  162. package/dist/agent/types.js.map +1 -0
  163. package/dist/bin/BinObjects.d.ts +2 -2
  164. package/dist/bin/BinObjects.js +6 -3
  165. package/dist/bin/BinObjects.js.map +1 -1
  166. package/dist/bin/cliCredentials.d.ts +27 -0
  167. package/dist/bin/cliCredentials.js +130 -0
  168. package/dist/bin/cliCredentials.js.map +1 -0
  169. package/dist/bin/cliOperations.d.ts +7 -7
  170. package/dist/bin/cliOperations.js +251 -37
  171. package/dist/bin/cliOperations.js.map +1 -1
  172. package/dist/bin/copyDb.js +16 -16
  173. package/dist/bin/copyDb.js.map +1 -1
  174. package/dist/bin/deployRenderer.d.ts +47 -0
  175. package/dist/bin/deployRenderer.js +185 -0
  176. package/dist/bin/deployRenderer.js.map +1 -0
  177. package/dist/bin/harper.d.ts +2 -1
  178. package/dist/bin/harper.js +87 -26
  179. package/dist/bin/harper.js.map +1 -1
  180. package/dist/bin/install.d.ts +1 -1
  181. package/dist/bin/install.js +41 -4
  182. package/dist/bin/install.js.map +1 -1
  183. package/dist/bin/lite.js +3 -4
  184. package/dist/bin/lite.js.map +1 -1
  185. package/dist/bin/login.d.ts +4 -0
  186. package/dist/bin/login.js +158 -0
  187. package/dist/bin/login.js.map +1 -0
  188. package/dist/bin/logout.d.ts +4 -0
  189. package/dist/bin/logout.js +16 -0
  190. package/dist/bin/logout.js.map +1 -0
  191. package/dist/bin/mcp/client.d.ts +34 -0
  192. package/dist/bin/mcp/client.js +395 -0
  193. package/dist/bin/mcp/client.js.map +1 -0
  194. package/dist/bin/mcp/doctor.d.ts +11 -0
  195. package/dist/bin/mcp/doctor.js +193 -0
  196. package/dist/bin/mcp/doctor.js.map +1 -0
  197. package/dist/bin/mcp/index.d.ts +10 -0
  198. package/dist/bin/mcp/index.js +81 -0
  199. package/dist/bin/mcp/index.js.map +1 -0
  200. package/dist/bin/mcp/options.d.ts +33 -0
  201. package/dist/bin/mcp/options.js +113 -0
  202. package/dist/bin/mcp/options.js.map +1 -0
  203. package/dist/bin/mcp/printConfig.d.ts +14 -0
  204. package/dist/bin/mcp/printConfig.js +85 -0
  205. package/dist/bin/mcp/printConfig.js.map +1 -0
  206. package/dist/bin/multipartBuilder.d.ts +26 -0
  207. package/dist/bin/multipartBuilder.js +55 -0
  208. package/dist/bin/multipartBuilder.js.map +1 -0
  209. package/dist/bin/restart.d.ts +3 -2
  210. package/dist/bin/restart.js +82 -45
  211. package/dist/bin/restart.js.map +1 -1
  212. package/dist/bin/run.d.ts +13 -9
  213. package/dist/bin/run.js +111 -65
  214. package/dist/bin/run.js.map +1 -1
  215. package/dist/bin/sseConsumer.d.ts +24 -0
  216. package/dist/bin/sseConsumer.js +127 -0
  217. package/dist/bin/sseConsumer.js.map +1 -0
  218. package/dist/bin/status.d.ts +1 -1
  219. package/dist/bin/status.js +48 -11
  220. package/dist/bin/status.js.map +1 -1
  221. package/dist/bin/stop.d.ts +1 -1
  222. package/dist/bin/stop.js +43 -6
  223. package/dist/bin/stop.js.map +1 -1
  224. package/dist/bin/upgrade.js +6 -6
  225. package/dist/components/Application.d.ts +29 -17
  226. package/dist/components/Application.js +134 -28
  227. package/dist/components/Application.js.map +1 -1
  228. package/dist/components/ApplicationScope.js +2 -2
  229. package/dist/components/ComponentV1.d.ts +1 -1
  230. package/dist/components/ComponentV1.js +5 -5
  231. package/dist/components/ComponentV1.js.map +1 -1
  232. package/dist/components/EntryHandler.d.ts +26 -3
  233. package/dist/components/EntryHandler.js +153 -13
  234. package/dist/components/EntryHandler.js.map +1 -1
  235. package/dist/components/OptionsWatcher.d.ts +7 -2
  236. package/dist/components/OptionsWatcher.js +72 -10
  237. package/dist/components/OptionsWatcher.js.map +1 -1
  238. package/dist/components/Scope.d.ts +11 -6
  239. package/dist/components/Scope.js +105 -9
  240. package/dist/components/Scope.js.map +1 -1
  241. package/dist/components/anthropic/index.d.ts +40 -0
  242. package/dist/components/anthropic/index.js +428 -0
  243. package/dist/components/anthropic/index.js.map +1 -0
  244. package/dist/components/bedrock/index.d.ts +79 -0
  245. package/dist/components/bedrock/index.js +734 -0
  246. package/dist/components/bedrock/index.js.map +1 -0
  247. package/dist/components/componentLoader.d.ts +29 -0
  248. package/dist/components/componentLoader.js +63 -38
  249. package/dist/components/componentLoader.js.map +1 -1
  250. package/dist/components/deployLifecycle.d.ts +39 -0
  251. package/dist/components/deployLifecycle.js +156 -0
  252. package/dist/components/deployLifecycle.js.map +1 -0
  253. package/dist/components/deploymentOperations.d.ts +19 -0
  254. package/dist/components/deploymentOperations.js +185 -0
  255. package/dist/components/deploymentOperations.js.map +1 -0
  256. package/dist/components/deploymentRecorder.d.ts +81 -0
  257. package/dist/components/deploymentRecorder.js +401 -0
  258. package/dist/components/deploymentRecorder.js.map +1 -0
  259. package/dist/components/deriveURLPath.d.ts +2 -2
  260. package/dist/components/deriveURLPath.js +2 -2
  261. package/dist/components/deriveURLPath.js.map +1 -1
  262. package/dist/components/mcp/adapters/fastify.d.ts +35 -0
  263. package/dist/components/mcp/adapters/fastify.js +66 -0
  264. package/dist/components/mcp/adapters/fastify.js.map +1 -0
  265. package/dist/components/mcp/adapters/harperHttp.d.ts +38 -0
  266. package/dist/components/mcp/adapters/harperHttp.js +78 -0
  267. package/dist/components/mcp/adapters/harperHttp.js.map +1 -0
  268. package/dist/components/mcp/audit.d.ts +27 -0
  269. package/dist/components/mcp/audit.js +73 -0
  270. package/dist/components/mcp/audit.js.map +1 -0
  271. package/dist/components/mcp/index.d.ts +47 -0
  272. package/dist/components/mcp/index.js +109 -0
  273. package/dist/components/mcp/index.js.map +1 -0
  274. package/dist/components/mcp/jsonrpc.d.ts +71 -0
  275. package/dist/components/mcp/jsonrpc.js +93 -0
  276. package/dist/components/mcp/jsonrpc.js.map +1 -0
  277. package/dist/components/mcp/lifecycle.d.ts +69 -0
  278. package/dist/components/mcp/lifecycle.js +79 -0
  279. package/dist/components/mcp/lifecycle.js.map +1 -0
  280. package/dist/components/mcp/listChanged.d.ts +24 -0
  281. package/dist/components/mcp/listChanged.js +257 -0
  282. package/dist/components/mcp/listChanged.js.map +1 -0
  283. package/dist/components/mcp/rateLimit.d.ts +25 -0
  284. package/dist/components/mcp/rateLimit.js +226 -0
  285. package/dist/components/mcp/rateLimit.js.map +1 -0
  286. package/dist/components/mcp/resources.d.ts +90 -0
  287. package/dist/components/mcp/resources.js +515 -0
  288. package/dist/components/mcp/resources.js.map +1 -0
  289. package/dist/components/mcp/session.d.ts +36 -0
  290. package/dist/components/mcp/session.js +170 -0
  291. package/dist/components/mcp/session.js.map +1 -0
  292. package/dist/components/mcp/sessionRegistry.d.ts +63 -0
  293. package/dist/components/mcp/sessionRegistry.js +124 -0
  294. package/dist/components/mcp/sessionRegistry.js.map +1 -0
  295. package/dist/components/mcp/toolRegistry.d.ts +150 -0
  296. package/dist/components/mcp/toolRegistry.js +176 -0
  297. package/dist/components/mcp/toolRegistry.js.map +1 -0
  298. package/dist/components/mcp/tools/application.d.ts +58 -0
  299. package/dist/components/mcp/tools/application.js +549 -0
  300. package/dist/components/mcp/tools/application.js.map +1 -0
  301. package/dist/components/mcp/tools/operations.d.ts +23 -0
  302. package/dist/components/mcp/tools/operations.js +303 -0
  303. package/dist/components/mcp/tools/operations.js.map +1 -0
  304. package/dist/components/mcp/tools/schemas/derive.d.ts +36 -0
  305. package/dist/components/mcp/tools/schemas/derive.js +216 -0
  306. package/dist/components/mcp/tools/schemas/derive.js.map +1 -0
  307. package/dist/components/mcp/tools/schemas/operations.d.ts +27 -0
  308. package/dist/components/mcp/tools/schemas/operations.js +243 -0
  309. package/dist/components/mcp/tools/schemas/operations.js.map +1 -0
  310. package/dist/components/mcp/transport.d.ts +38 -0
  311. package/dist/components/mcp/transport.js +467 -0
  312. package/dist/components/mcp/transport.js.map +1 -0
  313. package/dist/components/ollama/index.d.ts +46 -0
  314. package/dist/components/ollama/index.js +239 -0
  315. package/dist/components/ollama/index.js.map +1 -0
  316. package/dist/components/openai/index.d.ts +51 -0
  317. package/dist/components/openai/index.js +475 -0
  318. package/dist/components/openai/index.js.map +1 -0
  319. package/dist/components/operations.d.ts +6 -6
  320. package/dist/components/operations.js +198 -52
  321. package/dist/components/operations.js.map +1 -1
  322. package/dist/components/operationsValidation.d.ts +2 -2
  323. package/dist/components/operationsValidation.js +3 -3
  324. package/dist/components/packageComponent.d.ts +28 -6
  325. package/dist/components/packageComponent.js +87 -26
  326. package/dist/components/packageComponent.js.map +1 -1
  327. package/dist/components/requestRestart.d.ts +1 -0
  328. package/dist/components/requestRestart.js +12 -1
  329. package/dist/components/requestRestart.js.map +1 -1
  330. package/dist/components/status/crossThread.d.ts +5 -1
  331. package/dist/components/status/crossThread.js +12 -5
  332. package/dist/components/status/crossThread.js.map +1 -1
  333. package/dist/components/status/errors.js +7 -7
  334. package/dist/config/RootConfigWatcher.d.ts +3 -0
  335. package/dist/config/RootConfigWatcher.js +52 -1
  336. package/dist/config/RootConfigWatcher.js.map +1 -1
  337. package/dist/config/configUtils.js +31 -8
  338. package/dist/config/configUtils.js.map +1 -1
  339. package/dist/config/harperConfigEnvVars.js +1 -1
  340. package/dist/config/harperConfigEnvVars.js.map +1 -1
  341. package/dist/dataLayer/CreateAttributeObject.d.ts +3 -7
  342. package/dist/dataLayer/CreateAttributeObject.js +4 -3
  343. package/dist/dataLayer/CreateAttributeObject.js.map +1 -1
  344. package/dist/dataLayer/CreateTableObject.d.ts +2 -4
  345. package/dist/dataLayer/CreateTableObject.js +2 -1
  346. package/dist/dataLayer/CreateTableObject.js.map +1 -1
  347. package/dist/dataLayer/DataLayerObjects.d.ts +17 -16
  348. package/dist/dataLayer/DataLayerObjects.js +19 -5
  349. package/dist/dataLayer/DataLayerObjects.js.map +1 -1
  350. package/dist/dataLayer/DeleteBeforeObject.d.ts +3 -5
  351. package/dist/dataLayer/DeleteBeforeObject.js +2 -1
  352. package/dist/dataLayer/DeleteBeforeObject.js.map +1 -1
  353. package/dist/dataLayer/DeleteObject.d.ts +3 -7
  354. package/dist/dataLayer/DeleteObject.js +4 -3
  355. package/dist/dataLayer/DeleteObject.js.map +1 -1
  356. package/dist/dataLayer/DropAttributeObject.d.ts +2 -4
  357. package/dist/dataLayer/DropAttributeObject.js +2 -1
  358. package/dist/dataLayer/DropAttributeObject.js.map +1 -1
  359. package/dist/dataLayer/GetBackupObject.d.ts +3 -5
  360. package/dist/dataLayer/GetBackupObject.js +4 -3
  361. package/dist/dataLayer/GetBackupObject.js.map +1 -1
  362. package/dist/dataLayer/InsertObject.d.ts +3 -8
  363. package/dist/dataLayer/InsertObject.js +4 -3
  364. package/dist/dataLayer/InsertObject.js.map +1 -1
  365. package/dist/dataLayer/ReadAuditLogObject.d.ts +3 -7
  366. package/dist/dataLayer/ReadAuditLogObject.js +4 -3
  367. package/dist/dataLayer/ReadAuditLogObject.js.map +1 -1
  368. package/dist/dataLayer/SQLSearch.d.ts +68 -38
  369. package/dist/dataLayer/SQLSearch.js +140 -78
  370. package/dist/dataLayer/SQLSearch.js.map +1 -1
  371. package/dist/dataLayer/SearchByConditionsObject.d.ts +10 -58
  372. package/dist/dataLayer/SearchByConditionsObject.js +5 -7
  373. package/dist/dataLayer/SearchByConditionsObject.js.map +1 -1
  374. package/dist/dataLayer/SearchByHashObject.d.ts +3 -6
  375. package/dist/dataLayer/SearchByHashObject.js +2 -1
  376. package/dist/dataLayer/SearchByHashObject.js.map +1 -1
  377. package/dist/dataLayer/SearchObject.d.ts +3 -12
  378. package/dist/dataLayer/SearchObject.js +2 -1
  379. package/dist/dataLayer/SearchObject.js.map +1 -1
  380. package/dist/dataLayer/SqlSearchObject.d.ts +2 -4
  381. package/dist/dataLayer/SqlSearchObject.js +2 -1
  382. package/dist/dataLayer/SqlSearchObject.js.map +1 -1
  383. package/dist/dataLayer/UpdateObject.d.ts +3 -7
  384. package/dist/dataLayer/UpdateObject.js +4 -3
  385. package/dist/dataLayer/UpdateObject.js.map +1 -1
  386. package/dist/dataLayer/UpsertObject.d.ts +3 -7
  387. package/dist/dataLayer/UpsertObject.js +4 -3
  388. package/dist/dataLayer/UpsertObject.js.map +1 -1
  389. package/dist/dataLayer/bulkLoad.d.ts +4 -4
  390. package/dist/dataLayer/bulkLoad.js +122 -88
  391. package/dist/dataLayer/bulkLoad.js.map +1 -1
  392. package/dist/dataLayer/delete.d.ts +10 -11
  393. package/dist/dataLayer/delete.js +74 -39
  394. package/dist/dataLayer/delete.js.map +1 -1
  395. package/dist/dataLayer/export.d.ts +8 -8
  396. package/dist/dataLayer/export.js +90 -55
  397. package/dist/dataLayer/export.js.map +1 -1
  398. package/dist/dataLayer/getBackup.d.ts +4 -3
  399. package/dist/dataLayer/getBackup.js +43 -11
  400. package/dist/dataLayer/getBackup.js.map +1 -1
  401. package/dist/dataLayer/harperBridge/BridgeMethods.d.ts +39 -21
  402. package/dist/dataLayer/harperBridge/BridgeMethods.js +41 -20
  403. package/dist/dataLayer/harperBridge/BridgeMethods.js.map +1 -1
  404. package/dist/dataLayer/harperBridge/ResourceBridge.d.ts +2 -2
  405. package/dist/dataLayer/harperBridge/ResourceBridge.js +26 -25
  406. package/dist/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
  407. package/dist/dataLayer/harperBridge/TableSizeObject.d.ts +1 -0
  408. package/dist/dataLayer/harperBridge/TableSizeObject.js.map +1 -1
  409. package/dist/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.d.ts +4 -4
  410. package/dist/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
  411. package/dist/dataLayer/harperBridge/harperBridge.d.ts +2 -3
  412. package/dist/dataLayer/harperBridge/harperBridge.js +38 -4
  413. package/dist/dataLayer/harperBridge/harperBridge.js.map +1 -1
  414. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.d.ts +1 -2
  415. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +7 -6
  416. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js.map +1 -1
  417. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.d.ts +1 -2
  418. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
  419. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js.map +1 -1
  420. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
  421. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js.map +1 -1
  422. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +5 -4
  423. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js.map +1 -1
  424. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.d.ts +1 -2
  425. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +4 -4
  426. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js.map +1 -1
  427. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
  428. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.d.ts +1 -2
  429. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +5 -5
  430. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js.map +1 -1
  431. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +4 -4
  432. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js.map +1 -1
  433. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
  434. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js.map +1 -1
  435. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
  436. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
  437. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
  438. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +2 -2
  439. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js.map +1 -1
  440. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
  441. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.d.ts +1 -2
  442. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +8 -8
  443. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js.map +1 -1
  444. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.d.ts +1 -1
  445. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
  446. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.d.ts +1 -2
  447. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +3 -3
  448. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js.map +1 -1
  449. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
  450. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.d.ts +1 -2
  451. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +5 -5
  452. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js.map +1 -1
  453. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.d.ts +1 -2
  454. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +1 -1
  455. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js.map +1 -1
  456. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +2 -2
  457. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js.map +1 -1
  458. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
  459. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +4 -4
  460. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js.map +1 -1
  461. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.d.ts +1 -2
  462. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +5 -3
  463. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js.map +1 -1
  464. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +2 -2
  465. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.d.ts +1 -2
  466. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
  467. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js.map +1 -1
  468. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
  469. package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
  470. package/dist/dataLayer/hdbInfoController.d.ts +4 -8
  471. package/dist/dataLayer/hdbInfoController.js +66 -31
  472. package/dist/dataLayer/hdbInfoController.js.map +1 -1
  473. package/dist/dataLayer/insert.d.ts +14 -26
  474. package/dist/dataLayer/insert.js +63 -28
  475. package/dist/dataLayer/insert.js.map +1 -1
  476. package/dist/dataLayer/readAuditLog.d.ts +1 -3
  477. package/dist/dataLayer/readAuditLog.js +45 -13
  478. package/dist/dataLayer/readAuditLog.js.map +1 -1
  479. package/dist/dataLayer/schema.d.ts +10 -10
  480. package/dist/dataLayer/schema.js +124 -89
  481. package/dist/dataLayer/schema.js.map +1 -1
  482. package/dist/dataLayer/schemaDescribe.d.ts +4 -4
  483. package/dist/dataLayer/schemaDescribe.js +78 -41
  484. package/dist/dataLayer/schemaDescribe.js.map +1 -1
  485. package/dist/dataLayer/search.d.ts +4 -4
  486. package/dist/dataLayer/search.js +12 -13
  487. package/dist/dataLayer/search.js.map +1 -1
  488. package/dist/dataLayer/transaction.d.ts +1 -1
  489. package/dist/dataLayer/transaction.js +3 -4
  490. package/dist/dataLayer/transaction.js.map +1 -1
  491. package/dist/dataLayer/update.d.ts +2 -8
  492. package/dist/dataLayer/update.js +53 -18
  493. package/dist/dataLayer/update.js.map +1 -1
  494. package/dist/globals.d.ts +1 -1
  495. package/dist/globals.js +1 -0
  496. package/dist/globals.js.map +1 -1
  497. package/dist/index.d.ts +4 -0
  498. package/dist/index.js +4 -1
  499. package/dist/index.js.map +1 -1
  500. package/dist/json/systemSchema.json +65 -0
  501. package/dist/launchServiceScripts/launchHarperDB.d.ts +1 -0
  502. package/dist/launchServiceScripts/launchHarperDB.js +3 -0
  503. package/dist/launchServiceScripts/launchHarperDB.js.map +1 -0
  504. package/dist/launchServiceScripts/utility/checkNodeVersion.js +3 -0
  505. package/dist/launchServiceScripts/utility/checkNodeVersion.js.map +1 -1
  506. package/dist/resources/DatabaseTransaction.d.ts +14 -6
  507. package/dist/resources/DatabaseTransaction.js +39 -15
  508. package/dist/resources/DatabaseTransaction.js.map +1 -1
  509. package/dist/resources/ErrorResource.d.ts +1 -1
  510. package/dist/resources/ErrorResource.js +3 -1
  511. package/dist/resources/ErrorResource.js.map +1 -1
  512. package/dist/resources/LMDBTransaction.d.ts +10 -13
  513. package/dist/resources/LMDBTransaction.js +18 -7
  514. package/dist/resources/LMDBTransaction.js.map +1 -1
  515. package/dist/resources/RecordEncoder.d.ts +7 -1
  516. package/dist/resources/RecordEncoder.js +5 -2
  517. package/dist/resources/RecordEncoder.js.map +1 -1
  518. package/dist/resources/RequestTarget.d.ts +1 -0
  519. package/dist/resources/RequestTarget.js.map +1 -1
  520. package/dist/resources/Resource.d.ts +9 -5
  521. package/dist/resources/Resource.js +37 -10
  522. package/dist/resources/Resource.js.map +1 -1
  523. package/dist/resources/ResourceInterface.d.ts +24 -5
  524. package/dist/resources/ResourceInterface.js +20 -0
  525. package/dist/resources/ResourceInterface.js.map +1 -1
  526. package/dist/resources/Resources.d.ts +3 -4
  527. package/dist/resources/Resources.js +7 -6
  528. package/dist/resources/Resources.js.map +1 -1
  529. package/dist/resources/RocksIndexStore.js +3 -0
  530. package/dist/resources/RocksIndexStore.js.map +1 -1
  531. package/dist/resources/RocksTransactionLogStore.d.ts +1 -1
  532. package/dist/resources/RocksTransactionLogStore.js +46 -27
  533. package/dist/resources/RocksTransactionLogStore.js.map +1 -1
  534. package/dist/resources/Table.d.ts +59 -329
  535. package/dist/resources/Table.js +267 -107
  536. package/dist/resources/Table.js.map +1 -1
  537. package/dist/resources/analytics/metadata.d.ts +1 -0
  538. package/dist/resources/analytics/metadata.js +1 -0
  539. package/dist/resources/analytics/metadata.js.map +1 -1
  540. package/dist/resources/analytics/read.d.ts +5 -0
  541. package/dist/resources/analytics/read.js +16 -5
  542. package/dist/resources/analytics/read.js.map +1 -1
  543. package/dist/resources/analytics/write.d.ts +28 -0
  544. package/dist/resources/analytics/write.js +232 -20
  545. package/dist/resources/analytics/write.js.map +1 -1
  546. package/dist/resources/auditStore.d.ts +18 -13
  547. package/dist/resources/auditStore.js +13 -8
  548. package/dist/resources/auditStore.js.map +1 -1
  549. package/dist/resources/blob.d.ts +16 -27
  550. package/dist/resources/blob.js +8 -8
  551. package/dist/resources/blob.js.map +1 -1
  552. package/dist/resources/dataLoader.d.ts +1 -1
  553. package/dist/resources/dataLoader.js +13 -13
  554. package/dist/resources/databases.d.ts +13 -0
  555. package/dist/resources/databases.js +160 -52
  556. package/dist/resources/databases.js.map +1 -1
  557. package/dist/resources/graphql.d.ts +1 -7
  558. package/dist/resources/graphql.js +224 -174
  559. package/dist/resources/graphql.js.map +1 -1
  560. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +16 -1
  561. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +308 -59
  562. package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
  563. package/dist/resources/indexes/vector.d.ts +1 -0
  564. package/dist/resources/indexes/vector.js +14 -0
  565. package/dist/resources/indexes/vector.js.map +1 -1
  566. package/dist/resources/loadEnv.d.ts +2 -5
  567. package/dist/resources/loadEnv.js +21 -18
  568. package/dist/resources/loadEnv.js.map +1 -1
  569. package/dist/resources/login.d.ts +2 -3
  570. package/dist/resources/login.js +5 -4
  571. package/dist/resources/login.js.map +1 -1
  572. package/dist/resources/models/Models.d.ts +45 -0
  573. package/dist/resources/models/Models.js +265 -0
  574. package/dist/resources/models/Models.js.map +1 -0
  575. package/dist/resources/models/TestBackend.d.ts +15 -0
  576. package/dist/resources/models/TestBackend.js +71 -0
  577. package/dist/resources/models/TestBackend.js.map +1 -0
  578. package/dist/resources/models/agentLoop.d.ts +125 -0
  579. package/dist/resources/models/agentLoop.js +746 -0
  580. package/dist/resources/models/agentLoop.js.map +1 -0
  581. package/dist/resources/models/analyticsTable.d.ts +65 -0
  582. package/dist/resources/models/analyticsTable.js +166 -0
  583. package/dist/resources/models/analyticsTable.js.map +1 -0
  584. package/dist/resources/models/backendHelpers.d.ts +57 -0
  585. package/dist/resources/models/backendHelpers.js +109 -0
  586. package/dist/resources/models/backendHelpers.js.map +1 -0
  587. package/dist/resources/models/backendRegistry.d.ts +36 -0
  588. package/dist/resources/models/backendRegistry.js +54 -0
  589. package/dist/resources/models/backendRegistry.js.map +1 -0
  590. package/dist/resources/models/bootstrap.d.ts +24 -0
  591. package/dist/resources/models/bootstrap.js +112 -0
  592. package/dist/resources/models/bootstrap.js.map +1 -0
  593. package/dist/resources/models/embedHook.d.ts +33 -0
  594. package/dist/resources/models/embedHook.js +127 -0
  595. package/dist/resources/models/embedHook.js.map +1 -0
  596. package/dist/resources/models/types.d.ts +301 -0
  597. package/dist/resources/models/types.js +11 -0
  598. package/dist/resources/models/types.js.map +1 -0
  599. package/dist/resources/replayLogs.js +7 -1
  600. package/dist/resources/replayLogs.js.map +1 -1
  601. package/dist/resources/roles.d.ts +1 -7
  602. package/dist/resources/roles.js +67 -71
  603. package/dist/resources/roles.js.map +1 -1
  604. package/dist/resources/search.d.ts +18 -1
  605. package/dist/resources/search.js +349 -140
  606. package/dist/resources/search.js.map +1 -1
  607. package/dist/resources/tracked.d.ts +1 -1
  608. package/dist/resources/tracked.js +14 -14
  609. package/dist/resources/tracked.js.map +1 -1
  610. package/dist/resources/transaction.d.ts +1 -1
  611. package/dist/resources/transaction.js +1 -1
  612. package/dist/resources/transaction.js.map +1 -1
  613. package/dist/resources/transactionBroadcast.d.ts +1 -1
  614. package/dist/resources/transactionBroadcast.js.map +1 -1
  615. package/dist/security/auth.d.ts +1 -5
  616. package/dist/security/auth.js +34 -25
  617. package/dist/security/auth.js.map +1 -1
  618. package/dist/security/certificateVerification/crlVerification.js +7 -1
  619. package/dist/security/certificateVerification/crlVerification.js.map +1 -1
  620. package/dist/security/cryptoHash.d.ts +2 -2
  621. package/dist/security/cryptoHash.js +37 -5
  622. package/dist/security/cryptoHash.js.map +1 -1
  623. package/dist/security/data_objects/PermissionAttributeResponseObject.d.ts +3 -4
  624. package/dist/security/data_objects/PermissionAttributeResponseObject.js +4 -1
  625. package/dist/security/data_objects/PermissionAttributeResponseObject.js.map +1 -1
  626. package/dist/security/data_objects/PermissionResponseObject.d.ts +9 -9
  627. package/dist/security/data_objects/PermissionResponseObject.js +15 -8
  628. package/dist/security/data_objects/PermissionResponseObject.js.map +1 -1
  629. package/dist/security/data_objects/PermissionTableResponseObject.d.ts +5 -6
  630. package/dist/security/data_objects/PermissionTableResponseObject.js +6 -1
  631. package/dist/security/data_objects/PermissionTableResponseObject.js.map +1 -1
  632. package/dist/security/fastifyAuth.d.ts +2 -2
  633. package/dist/security/fastifyAuth.js +131 -22
  634. package/dist/security/fastifyAuth.js.map +1 -1
  635. package/dist/security/impersonation.js +15 -15
  636. package/dist/security/jsLoader.js +18 -5
  637. package/dist/security/jsLoader.js.map +1 -1
  638. package/dist/security/keys.d.ts +45 -48
  639. package/dist/security/keys.js +160 -114
  640. package/dist/security/keys.js.map +1 -1
  641. package/dist/security/permissionsTranslator.js +2 -2
  642. package/dist/security/role.d.ts +5 -5
  643. package/dist/security/role.js +70 -35
  644. package/dist/security/role.js.map +1 -1
  645. package/dist/security/tokenAuthentication.d.ts +13 -0
  646. package/dist/security/tokenAuthentication.js +57 -27
  647. package/dist/security/tokenAuthentication.js.map +1 -1
  648. package/dist/security/user.js +74 -38
  649. package/dist/security/user.js.map +1 -1
  650. package/dist/server/DurableSubscriptionsSession.d.ts +4 -2
  651. package/dist/server/DurableSubscriptionsSession.js +71 -55
  652. package/dist/server/DurableSubscriptionsSession.js.map +1 -1
  653. package/dist/server/REST.d.ts +1 -8
  654. package/dist/server/REST.js +17 -16
  655. package/dist/server/REST.js.map +1 -1
  656. package/dist/server/Server.d.ts +23 -4
  657. package/dist/server/Server.js +1 -1
  658. package/dist/server/Server.js.map +1 -1
  659. package/dist/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
  660. package/dist/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
  661. package/dist/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
  662. package/dist/server/fastifyRoutes.d.ts +1 -4
  663. package/dist/server/fastifyRoutes.js +34 -30
  664. package/dist/server/fastifyRoutes.js.map +1 -1
  665. package/dist/server/graphqlQuerying.d.ts +1 -1
  666. package/dist/server/graphqlQuerying.js +8 -7
  667. package/dist/server/graphqlQuerying.js.map +1 -1
  668. package/dist/server/http.d.ts +9 -4
  669. package/dist/server/http.js +523 -47
  670. package/dist/server/http.js.map +1 -1
  671. package/dist/server/itc/serverHandlers.js +66 -15
  672. package/dist/server/itc/serverHandlers.js.map +1 -1
  673. package/dist/server/jobs/JobObject.d.ts +3 -3
  674. package/dist/server/jobs/JobObject.js +53 -7
  675. package/dist/server/jobs/JobObject.js.map +1 -1
  676. package/dist/server/jobs/jobProcess.js +64 -24
  677. package/dist/server/jobs/jobProcess.js.map +1 -1
  678. package/dist/server/jobs/jobRunner.d.ts +7 -6
  679. package/dist/server/jobs/jobRunner.js +68 -30
  680. package/dist/server/jobs/jobRunner.js.map +1 -1
  681. package/dist/server/jobs/jobs.d.ts +18 -7
  682. package/dist/server/jobs/jobs.js +93 -61
  683. package/dist/server/jobs/jobs.js.map +1 -1
  684. package/dist/server/loadRootComponents.js +1 -1
  685. package/dist/server/middlewareChain.d.ts +80 -0
  686. package/dist/server/middlewareChain.js +252 -0
  687. package/dist/server/middlewareChain.js.map +1 -0
  688. package/dist/server/mqtt.d.ts +1 -8
  689. package/dist/server/mqtt.js +22 -17
  690. package/dist/server/mqtt.js.map +1 -1
  691. package/dist/server/nodeName.js +44 -13
  692. package/dist/server/nodeName.js.map +1 -1
  693. package/dist/server/operationsServer.d.ts +2 -2
  694. package/dist/server/operationsServer.js +106 -33
  695. package/dist/server/operationsServer.js.map +1 -1
  696. package/dist/server/serverHelpers/Headers.d.ts +4 -4
  697. package/dist/server/serverHelpers/Headers.js +2 -0
  698. package/dist/server/serverHelpers/Headers.js.map +1 -1
  699. package/dist/server/serverHelpers/JSONStream.d.ts +7 -1
  700. package/dist/server/serverHelpers/JSONStream.js +12 -3
  701. package/dist/server/serverHelpers/JSONStream.js.map +1 -1
  702. package/dist/server/serverHelpers/Request.d.ts +106 -8
  703. package/dist/server/serverHelpers/Request.js +370 -9
  704. package/dist/server/serverHelpers/Request.js.map +1 -1
  705. package/dist/server/serverHelpers/contentTypes.d.ts +1 -1
  706. package/dist/server/serverHelpers/contentTypes.js +36 -7
  707. package/dist/server/serverHelpers/contentTypes.js.map +1 -1
  708. package/dist/server/serverHelpers/multipartParser.d.ts +21 -0
  709. package/dist/server/serverHelpers/multipartParser.js +142 -0
  710. package/dist/server/serverHelpers/multipartParser.js.map +1 -0
  711. package/dist/server/serverHelpers/progressEmitter.d.ts +25 -0
  712. package/dist/server/serverHelpers/progressEmitter.js +103 -0
  713. package/dist/server/serverHelpers/progressEmitter.js.map +1 -0
  714. package/dist/server/serverHelpers/serverHandlers.d.ts +1 -1
  715. package/dist/server/serverHelpers/serverHandlers.js +38 -7
  716. package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
  717. package/dist/server/serverHelpers/serverUtilities.d.ts +4 -2
  718. package/dist/server/serverHelpers/serverUtilities.js +97 -93
  719. package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
  720. package/dist/server/static.js +8 -5
  721. package/dist/server/static.js.map +1 -1
  722. package/dist/server/status/index.js +3 -3
  723. package/dist/server/storageReclamation.d.ts +10 -0
  724. package/dist/server/storageReclamation.js +68 -9
  725. package/dist/server/storageReclamation.js.map +1 -1
  726. package/dist/server/threads/itc.js +7 -4
  727. package/dist/server/threads/itc.js.map +1 -1
  728. package/dist/server/threads/manageThreads.d.ts +1 -1
  729. package/dist/server/threads/manageThreads.js +110 -26
  730. package/dist/server/threads/manageThreads.js.map +1 -1
  731. package/dist/server/threads/socketRouter.d.ts +0 -1
  732. package/dist/server/threads/socketRouter.js +8 -271
  733. package/dist/server/threads/socketRouter.js.map +1 -1
  734. package/dist/server/threads/threadServer.d.ts +1 -0
  735. package/dist/server/threads/threadServer.js +360 -118
  736. package/dist/server/threads/threadServer.js.map +1 -1
  737. package/dist/server/threads/workerProcessGuard.d.ts +42 -0
  738. package/dist/server/threads/workerProcessGuard.js +114 -0
  739. package/dist/server/threads/workerProcessGuard.js.map +1 -0
  740. package/dist/server/throttle.js +17 -0
  741. package/dist/server/throttle.js.map +1 -1
  742. package/dist/sqlTranslator/SelectValidator.d.ts +21 -24
  743. package/dist/sqlTranslator/SelectValidator.js +86 -47
  744. package/dist/sqlTranslator/SelectValidator.js.map +1 -1
  745. package/dist/sqlTranslator/alasqlFunctionImporter.d.ts +6 -2
  746. package/dist/sqlTranslator/alasqlFunctionImporter.js +40 -3
  747. package/dist/sqlTranslator/alasqlFunctionImporter.js.map +1 -1
  748. package/dist/sqlTranslator/deleteTranslator.d.ts +4 -7
  749. package/dist/sqlTranslator/deleteTranslator.js +48 -14
  750. package/dist/sqlTranslator/deleteTranslator.js.map +1 -1
  751. package/dist/sqlTranslator/index.d.ts +10 -9
  752. package/dist/sqlTranslator/index.js +69 -30
  753. package/dist/sqlTranslator/index.js.map +1 -1
  754. package/dist/sqlTranslator/sql_statement_bucket.d.ts +10 -10
  755. package/dist/sqlTranslator/sql_statement_bucket.js +55 -13
  756. package/dist/sqlTranslator/sql_statement_bucket.js.map +1 -1
  757. package/dist/upgrade/UpgradeObjects.d.ts +2 -3
  758. package/dist/upgrade/UpgradeObjects.js +37 -4
  759. package/dist/upgrade/UpgradeObjects.js.map +1 -1
  760. package/dist/upgrade/directives/5-2-0.d.ts +6 -0
  761. package/dist/upgrade/directives/5-2-0.js +77 -0
  762. package/dist/upgrade/directives/5-2-0.js.map +1 -0
  763. package/dist/upgrade/directives/directivesController.d.ts +10 -10
  764. package/dist/upgrade/directives/directivesController.js +52 -11
  765. package/dist/upgrade/directives/directivesController.js.map +1 -1
  766. package/dist/upgrade/directivesManager.d.ts +1 -1
  767. package/dist/upgrade/directivesManager.js +53 -18
  768. package/dist/upgrade/directivesManager.js.map +1 -1
  769. package/dist/upgrade/upgradePrompt.d.ts +3 -3
  770. package/dist/upgrade/upgradePrompt.js +65 -30
  771. package/dist/upgrade/upgradePrompt.js.map +1 -1
  772. package/dist/upgrade/upgradeUtilities.d.ts +1 -1
  773. package/dist/upgrade/upgradeUtilities.js +37 -5
  774. package/dist/upgrade/upgradeUtilities.js.map +1 -1
  775. package/dist/utility/OperationFunctionCaller.d.ts +1 -1
  776. package/dist/utility/OperationFunctionCaller.js +45 -10
  777. package/dist/utility/OperationFunctionCaller.js.map +1 -1
  778. package/dist/utility/assignCmdEnvVariables.d.ts +1 -2
  779. package/dist/utility/assignCmdEnvVariables.js +8 -4
  780. package/dist/utility/assignCmdEnvVariables.js.map +1 -1
  781. package/dist/utility/common_utils.d.ts +80 -77
  782. package/dist/utility/common_utils.js +140 -79
  783. package/dist/utility/common_utils.js.map +1 -1
  784. package/dist/utility/environment/environmentManager.d.ts +12 -11
  785. package/dist/utility/environment/environmentManager.js +75 -29
  786. package/dist/utility/environment/environmentManager.js.map +1 -1
  787. package/dist/utility/environment/systemInformation.d.ts +4 -0
  788. package/dist/utility/environment/systemInformation.js +27 -16
  789. package/dist/utility/environment/systemInformation.js.map +1 -1
  790. package/dist/utility/errors/commonErrors.d.ts +192 -168
  791. package/dist/utility/errors/commonErrors.js +49 -18
  792. package/dist/utility/errors/commonErrors.js.map +1 -1
  793. package/dist/utility/errors/hdbError.d.ts +37 -51
  794. package/dist/utility/errors/hdbError.js +65 -26
  795. package/dist/utility/errors/hdbError.js.map +1 -1
  796. package/dist/utility/expandEnvVar.d.ts +61 -0
  797. package/dist/utility/expandEnvVar.js +113 -0
  798. package/dist/utility/expandEnvVar.js.map +1 -0
  799. package/dist/utility/functions/geo.js +2 -2
  800. package/dist/utility/functions/sql/alaSQLExtension.js +1 -1
  801. package/dist/utility/globalSchema.d.ts +13 -4
  802. package/dist/utility/globalSchema.js +14 -11
  803. package/dist/utility/globalSchema.js.map +1 -1
  804. package/dist/utility/hdbTerms.d.ts +56 -0
  805. package/dist/utility/hdbTerms.js +56 -0
  806. package/dist/utility/hdbTerms.js.map +1 -1
  807. package/dist/utility/install/checkJWTTokensExist.js +1 -1
  808. package/dist/utility/install/installer.d.ts +9 -12
  809. package/dist/utility/install/installer.js +87 -51
  810. package/dist/utility/install/installer.js.map +1 -1
  811. package/dist/utility/installation.js +3 -3
  812. package/dist/utility/lmdb/DBIDefinition.d.ts +4 -4
  813. package/dist/utility/lmdb/DBIDefinition.js +5 -1
  814. package/dist/utility/lmdb/DBIDefinition.js.map +1 -1
  815. package/dist/utility/lmdb/DeleteRecordsResponseObject.d.ts +3 -6
  816. package/dist/utility/lmdb/DeleteRecordsResponseObject.js +2 -1
  817. package/dist/utility/lmdb/DeleteRecordsResponseObject.js.map +1 -1
  818. package/dist/utility/lmdb/InsertRecordsResponseObject.d.ts +3 -5
  819. package/dist/utility/lmdb/InsertRecordsResponseObject.js +2 -1
  820. package/dist/utility/lmdb/InsertRecordsResponseObject.js.map +1 -1
  821. package/dist/utility/lmdb/OpenDBIObject.d.ts +11 -15
  822. package/dist/utility/lmdb/OpenDBIObject.js +54 -6
  823. package/dist/utility/lmdb/OpenDBIObject.js.map +1 -1
  824. package/dist/utility/lmdb/OpenEnvironmentObject.d.ts +5 -8
  825. package/dist/utility/lmdb/OpenEnvironmentObject.js +52 -4
  826. package/dist/utility/lmdb/OpenEnvironmentObject.js.map +1 -1
  827. package/dist/utility/lmdb/UpdateRecordsResponseObject.d.ts +3 -6
  828. package/dist/utility/lmdb/UpdateRecordsResponseObject.js +2 -1
  829. package/dist/utility/lmdb/UpdateRecordsResponseObject.js.map +1 -1
  830. package/dist/utility/lmdb/UpsertRecordsResponseObject.d.ts +3 -5
  831. package/dist/utility/lmdb/UpsertRecordsResponseObject.js +2 -1
  832. package/dist/utility/lmdb/UpsertRecordsResponseObject.js.map +1 -1
  833. package/dist/utility/lmdb/cleanLMDBMap.d.ts +1 -1
  834. package/dist/utility/lmdb/cleanLMDBMap.js +44 -7
  835. package/dist/utility/lmdb/cleanLMDBMap.js.map +1 -1
  836. package/dist/utility/lmdb/commonUtility.d.ts +8 -9
  837. package/dist/utility/lmdb/commonUtility.js +46 -17
  838. package/dist/utility/lmdb/commonUtility.js.map +1 -1
  839. package/dist/utility/lmdb/deleteUtility.d.ts +2 -3
  840. package/dist/utility/lmdb/deleteUtility.js +51 -16
  841. package/dist/utility/lmdb/deleteUtility.js.map +1 -1
  842. package/dist/utility/lmdb/environmentUtility.d.ts +69 -36
  843. package/dist/utility/lmdb/environmentUtility.js +91 -51
  844. package/dist/utility/lmdb/environmentUtility.js.map +1 -1
  845. package/dist/utility/lmdb/searchCursorFunctions.d.ts +19 -19
  846. package/dist/utility/lmdb/searchCursorFunctions.js +46 -14
  847. package/dist/utility/lmdb/searchCursorFunctions.js.map +1 -1
  848. package/dist/utility/lmdb/searchUtility.d.ts +142 -73
  849. package/dist/utility/lmdb/searchUtility.js +91 -55
  850. package/dist/utility/lmdb/searchUtility.js.map +1 -1
  851. package/dist/utility/lmdb/terms.d.ts +34 -34
  852. package/dist/utility/lmdb/terms.js +12 -22
  853. package/dist/utility/lmdb/terms.js.map +1 -1
  854. package/dist/utility/lmdb/writeUtility.d.ts +3 -6
  855. package/dist/utility/lmdb/writeUtility.js +61 -28
  856. package/dist/utility/lmdb/writeUtility.js.map +1 -1
  857. package/dist/utility/logging/harper_logger.d.ts +87 -103
  858. package/dist/utility/logging/harper_logger.js +176 -81
  859. package/dist/utility/logging/harper_logger.js.map +1 -1
  860. package/dist/utility/logging/logRotator.d.ts +2 -10
  861. package/dist/utility/logging/logRotator.js +65 -28
  862. package/dist/utility/logging/logRotator.js.map +1 -1
  863. package/dist/utility/logging/logger.js +4 -4
  864. package/dist/utility/logging/readLog.d.ts +1 -1
  865. package/dist/utility/logging/readLog.js +54 -17
  866. package/dist/utility/logging/readLog.js.map +1 -1
  867. package/dist/utility/logging/transactionLog.d.ts +2 -2
  868. package/dist/utility/logging/transactionLog.js +51 -16
  869. package/dist/utility/logging/transactionLog.js.map +1 -1
  870. package/dist/utility/mount_hdb.d.ts +1 -2
  871. package/dist/utility/mount_hdb.js +54 -17
  872. package/dist/utility/mount_hdb.js.map +1 -1
  873. package/dist/utility/npmUtilities.d.ts +1 -1
  874. package/dist/utility/npmUtilities.js +54 -19
  875. package/dist/utility/npmUtilities.js.map +1 -1
  876. package/dist/utility/operation_authorization.d.ts +36 -9
  877. package/dist/utility/operation_authorization.js +135 -86
  878. package/dist/utility/operation_authorization.js.map +1 -1
  879. package/dist/utility/packageUtils.d.ts +0 -2
  880. package/dist/utility/packageUtils.js +7 -17
  881. package/dist/utility/packageUtils.js.map +1 -1
  882. package/dist/utility/password.js +2 -2
  883. package/dist/utility/processManagement/processManagement.js +2 -2
  884. package/dist/utility/processManagement/servicesConfig.js +1 -1
  885. package/dist/utility/signalling.d.ts +2 -2
  886. package/dist/utility/signalling.js +51 -16
  887. package/dist/utility/signalling.js.map +1 -1
  888. package/dist/utility/watcherFallback.d.ts +36 -0
  889. package/dist/utility/watcherFallback.js +73 -0
  890. package/dist/utility/watcherFallback.js.map +1 -0
  891. package/dist/validation/analyticsValidator.d.ts +1 -0
  892. package/dist/validation/analyticsValidator.js +79 -0
  893. package/dist/validation/analyticsValidator.js.map +1 -0
  894. package/dist/validation/bulkDeleteValidator.d.ts +1 -2
  895. package/dist/validation/bulkDeleteValidator.js +49 -11
  896. package/dist/validation/bulkDeleteValidator.js.map +1 -1
  897. package/dist/validation/check_permissions.d.ts +1 -2
  898. package/dist/validation/check_permissions.js +38 -3
  899. package/dist/validation/check_permissions.js.map +1 -1
  900. package/dist/validation/common_validators.d.ts +20 -20
  901. package/dist/validation/common_validators.js +62 -31
  902. package/dist/validation/common_validators.js.map +1 -1
  903. package/dist/validation/configValidator.d.ts +4 -4
  904. package/dist/validation/configValidator.js +189 -54
  905. package/dist/validation/configValidator.js.map +1 -1
  906. package/dist/validation/deleteValidator.d.ts +1 -2
  907. package/dist/validation/deleteValidator.js +49 -11
  908. package/dist/validation/deleteValidator.js.map +1 -1
  909. package/dist/validation/fileLoadValidator.d.ts +4 -4
  910. package/dist/validation/fileLoadValidator.js +67 -32
  911. package/dist/validation/fileLoadValidator.js.map +1 -1
  912. package/dist/validation/insertValidator.d.ts +1 -2
  913. package/dist/validation/insertValidator.js +48 -10
  914. package/dist/validation/insertValidator.js.map +1 -1
  915. package/dist/validation/installValidator.d.ts +2 -2
  916. package/dist/validation/installValidator.js +47 -10
  917. package/dist/validation/installValidator.js.map +1 -1
  918. package/dist/validation/readLogValidator.d.ts +1 -2
  919. package/dist/validation/readLogValidator.js +60 -22
  920. package/dist/validation/readLogValidator.js.map +1 -1
  921. package/dist/validation/role_validation.d.ts +3 -3
  922. package/dist/validation/role_validation.js +55 -19
  923. package/dist/validation/role_validation.js.map +1 -1
  924. package/dist/validation/schemaMetadataValidator.d.ts +3 -4
  925. package/dist/validation/schemaMetadataValidator.js +11 -12
  926. package/dist/validation/schemaMetadataValidator.js.map +1 -1
  927. package/dist/validation/searchValidator.d.ts +1 -2
  928. package/dist/validation/searchValidator.js +82 -43
  929. package/dist/validation/searchValidator.js.map +1 -1
  930. package/dist/validation/statusValidator.d.ts +1 -1
  931. package/dist/validation/transactionLogValidator.d.ts +3 -3
  932. package/dist/validation/transactionLogValidator.js +52 -17
  933. package/dist/validation/transactionLogValidator.js.map +1 -1
  934. package/dist/validation/user_validation.d.ts +3 -3
  935. package/dist/validation/user_validation.js +38 -6
  936. package/dist/validation/user_validation.js.map +1 -1
  937. package/dist/validation/validationWrapper.d.ts +3 -3
  938. package/dist/validation/validationWrapper.js +4 -5
  939. package/dist/validation/validationWrapper.js.map +1 -1
  940. package/index.ts +5 -0
  941. package/json/systemSchema.json +65 -0
  942. package/launchServiceScripts/utility/checkNodeVersion.js +2 -0
  943. package/package.json +37 -22
  944. package/resources/DESIGN.md +98 -0
  945. package/resources/DatabaseTransaction.ts +58 -30
  946. package/resources/ErrorResource.ts +2 -1
  947. package/resources/LMDBTransaction.ts +38 -29
  948. package/resources/RecordEncoder.ts +12 -4
  949. package/resources/RequestTarget.ts +2 -0
  950. package/resources/Resource.ts +89 -56
  951. package/resources/ResourceInterface.ts +44 -21
  952. package/resources/Resources.ts +8 -8
  953. package/resources/RocksIndexStore.ts +3 -0
  954. package/resources/RocksTransactionLogStore.ts +47 -28
  955. package/resources/Table.ts +386 -214
  956. package/resources/analytics/metadata.ts +1 -0
  957. package/resources/analytics/read.ts +24 -6
  958. package/resources/analytics/write.ts +240 -17
  959. package/resources/auditStore.ts +28 -19
  960. package/resources/blob.ts +53 -53
  961. package/resources/dataLoader.ts +4 -4
  962. package/resources/databases.ts +190 -71
  963. package/resources/graphql.ts +227 -164
  964. package/resources/indexes/HierarchicalNavigableSmallWorld.ts +294 -65
  965. package/resources/indexes/vector.ts +17 -0
  966. package/resources/loadEnv.ts +21 -17
  967. package/resources/login.ts +5 -3
  968. package/resources/models/Models.ts +304 -0
  969. package/resources/models/TestBackend.ts +83 -0
  970. package/resources/models/agentLoop.ts +895 -0
  971. package/resources/models/analyticsTable.ts +199 -0
  972. package/resources/models/backendHelpers.ts +116 -0
  973. package/resources/models/backendRegistry.ts +66 -0
  974. package/resources/models/bootstrap.ts +135 -0
  975. package/resources/models/embedHook.ts +138 -0
  976. package/resources/models/types.ts +296 -0
  977. package/resources/replayLogs.ts +15 -7
  978. package/resources/roles.ts +62 -67
  979. package/resources/search.ts +355 -135
  980. package/resources/tracked.ts +8 -8
  981. package/resources/transaction.ts +8 -8
  982. package/resources/transactionBroadcast.ts +3 -3
  983. package/security/auth.ts +35 -26
  984. package/security/certificateVerification/crlVerification.ts +11 -4
  985. package/security/{cryptoHash.js → cryptoHash.ts} +3 -8
  986. package/security/data_objects/{PermissionAttributeResponseObject.js → PermissionAttributeResponseObject.ts} +4 -4
  987. package/security/data_objects/{PermissionResponseObject.js → PermissionResponseObject.ts} +12 -11
  988. package/security/data_objects/{PermissionTableResponseObject.js → PermissionTableResponseObject.ts} +6 -4
  989. package/security/{fastifyAuth.js → fastifyAuth.ts} +93 -20
  990. package/security/impersonation.ts +3 -3
  991. package/security/jsLoader.ts +22 -8
  992. package/security/{keys.js → keys.ts} +113 -121
  993. package/security/permissionsTranslator.js +2 -2
  994. package/security/{role.js → role.ts} +26 -33
  995. package/security/tokenAuthentication.ts +34 -7
  996. package/security/user.ts +26 -22
  997. package/server/DESIGN.md +139 -0
  998. package/server/DurableSubscriptionsSession.ts +67 -50
  999. package/server/REST.ts +120 -107
  1000. package/server/Server.ts +31 -12
  1001. package/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
  1002. package/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
  1003. package/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
  1004. package/server/fastifyRoutes.ts +37 -33
  1005. package/server/graphqlQuerying.ts +6 -5
  1006. package/server/http.ts +517 -26
  1007. package/server/itc/serverHandlers.js +75 -14
  1008. package/server/jobs/{JobObject.js → JobObject.ts} +13 -6
  1009. package/server/jobs/{jobProcess.js → jobProcess.ts} +20 -16
  1010. package/server/jobs/{jobRunner.js → jobRunner.ts} +20 -21
  1011. package/server/jobs/{jobs.js → jobs.ts} +41 -44
  1012. package/server/loadRootComponents.js +1 -1
  1013. package/server/middlewareChain.ts +270 -0
  1014. package/server/mqtt.ts +35 -26
  1015. package/server/nodeName.ts +2 -1
  1016. package/server/operationsServer.ts +85 -10
  1017. package/server/serverHelpers/Headers.ts +10 -8
  1018. package/server/serverHelpers/JSONStream.ts +15 -5
  1019. package/server/serverHelpers/Request.ts +370 -13
  1020. package/server/serverHelpers/contentTypes.ts +42 -11
  1021. package/server/serverHelpers/multipartParser.ts +152 -0
  1022. package/server/serverHelpers/progressEmitter.ts +110 -0
  1023. package/server/serverHelpers/serverHandlers.js +43 -7
  1024. package/server/serverHelpers/serverUtilities.ts +40 -30
  1025. package/server/static.ts +9 -6
  1026. package/server/status/index.ts +2 -2
  1027. package/server/storageReclamation.ts +39 -2
  1028. package/server/threads/itc.js +7 -4
  1029. package/server/threads/manageThreads.js +100 -26
  1030. package/server/threads/socketRouter.ts +12 -275
  1031. package/server/threads/threadServer.js +345 -105
  1032. package/server/threads/workerProcessGuard.ts +93 -0
  1033. package/server/throttle.ts +18 -0
  1034. package/sqlTranslator/{SelectValidator.js → SelectValidator.ts} +41 -49
  1035. package/sqlTranslator/{alasqlFunctionImporter.js → alasqlFunctionImporter.ts} +5 -5
  1036. package/sqlTranslator/{deleteTranslator.js → deleteTranslator.ts} +13 -18
  1037. package/sqlTranslator/{index.js → index.ts} +30 -33
  1038. package/sqlTranslator/{sql_statement_bucket.js → sql_statement_bucket.ts} +49 -20
  1039. package/static/README.md +10 -9
  1040. package/studio/web/assets/{index-CmtPP0YO.js → index-COfIkCT-.js} +5 -5
  1041. package/studio/web/assets/index-COfIkCT-.js.map +1 -0
  1042. package/studio/web/assets/{index.lazy-C8jvGtlu.js → index.lazy-CIvl7Fj9.js} +2 -2
  1043. package/studio/web/assets/{index.lazy-C8jvGtlu.js.map → index.lazy-CIvl7Fj9.js.map} +1 -1
  1044. package/studio/web/assets/{profile-O0DYlJUv.js → profile-B2ZVB--r.js} +2 -2
  1045. package/studio/web/assets/{profile-O0DYlJUv.js.map → profile-B2ZVB--r.js.map} +1 -1
  1046. package/studio/web/assets/{status-BIlJkJby.js → status-Db6WBmhf.js} +2 -2
  1047. package/studio/web/assets/{status-BIlJkJby.js.map → status-Db6WBmhf.js.map} +1 -1
  1048. package/studio/web/index.html +1 -1
  1049. package/upgrade/{UpgradeObjects.js → UpgradeObjects.ts} +3 -6
  1050. package/upgrade/directives/5-2-0.ts +49 -0
  1051. package/upgrade/directives/{directivesController.js → directivesController.ts} +16 -16
  1052. package/upgrade/{directivesManager.js → directivesManager.ts} +7 -11
  1053. package/upgrade/{upgradePrompt.js → upgradePrompt.ts} +8 -14
  1054. package/upgrade/{upgradeUtilities.js → upgradeUtilities.ts} +3 -7
  1055. package/utility/{OperationFunctionCaller.js → OperationFunctionCaller.ts} +7 -7
  1056. package/utility/{assignCmdEnvVariables.js → assignCmdEnvVariables.ts} +6 -8
  1057. package/utility/{common_utils.js → common_utils.ts} +113 -139
  1058. package/utility/environment/{environmentManager.js → environmentManager.ts} +34 -33
  1059. package/utility/environment/systemInformation.ts +18 -4
  1060. package/utility/errors/{commonErrors.js → commonErrors.ts} +9 -9
  1061. package/utility/errors/{hdbError.js → hdbError.ts} +39 -45
  1062. package/utility/expandEnvVar.ts +110 -0
  1063. package/utility/functions/geo.js +2 -2
  1064. package/utility/functions/sql/alaSQLExtension.js +1 -1
  1065. package/utility/globalSchema.ts +30 -0
  1066. package/utility/hdbTerms.ts +56 -0
  1067. package/utility/install/checkJWTTokensExist.js +1 -1
  1068. package/utility/install/{installer.js → installer.ts} +38 -39
  1069. package/utility/installation.ts +2 -2
  1070. package/utility/lmdb/{DBIDefinition.js → DBIDefinition.ts} +4 -1
  1071. package/utility/lmdb/{DeleteRecordsResponseObject.js → DeleteRecordsResponseObject.ts} +2 -1
  1072. package/utility/lmdb/{InsertRecordsResponseObject.js → InsertRecordsResponseObject.ts} +2 -1
  1073. package/utility/lmdb/OpenDBIObject.ts +43 -0
  1074. package/utility/lmdb/{OpenEnvironmentObject.js → OpenEnvironmentObject.ts} +19 -6
  1075. package/utility/lmdb/{UpdateRecordsResponseObject.js → UpdateRecordsResponseObject.ts} +2 -1
  1076. package/utility/lmdb/{UpsertRecordsResponseObject.js → UpsertRecordsResponseObject.ts} +2 -1
  1077. package/utility/lmdb/{cleanLMDBMap.js → cleanLMDBMap.ts} +5 -5
  1078. package/utility/lmdb/{commonUtility.js → commonUtility.ts} +13 -21
  1079. package/utility/lmdb/{deleteUtility.js → deleteUtility.ts} +8 -12
  1080. package/utility/lmdb/{environmentUtility.js → environmentUtility.ts} +43 -52
  1081. package/utility/lmdb/{searchCursorFunctions.js → searchCursorFunctions.ts} +12 -26
  1082. package/utility/lmdb/{searchUtility.js → searchUtility.ts} +75 -64
  1083. package/utility/lmdb/{terms.js → terms.ts} +10 -23
  1084. package/utility/lmdb/{writeUtility.js → writeUtility.ts} +37 -22
  1085. package/utility/logging/{harper_logger.js → harper_logger.ts} +136 -89
  1086. package/utility/logging/{logRotator.js → logRotator.ts} +13 -13
  1087. package/utility/logging/logger.ts +1 -1
  1088. package/utility/logging/{readLog.js → readLog.ts} +19 -19
  1089. package/utility/logging/{transactionLog.js → transactionLog.ts} +10 -14
  1090. package/utility/{mount_hdb.js → mount_hdb.ts} +15 -16
  1091. package/utility/{npmUtilities.js → npmUtilities.ts} +14 -17
  1092. package/utility/{operation_authorization.js → operation_authorization.ts} +173 -124
  1093. package/utility/packageUtils.js +7 -16
  1094. package/utility/password.ts +1 -1
  1095. package/utility/processManagement/processManagement.js +2 -2
  1096. package/utility/processManagement/servicesConfig.js +1 -1
  1097. package/utility/{signalling.js → signalling.ts} +6 -11
  1098. package/utility/watcherFallback.ts +74 -0
  1099. package/validation/analyticsValidator.ts +43 -0
  1100. package/validation/{bulkDeleteValidator.js → bulkDeleteValidator.ts} +5 -5
  1101. package/validation/{check_permissions.js → check_permissions.ts} +3 -3
  1102. package/validation/{common_validators.js → common_validators.ts} +12 -24
  1103. package/validation/{configValidator.js → configValidator.ts} +114 -18
  1104. package/validation/{deleteValidator.js → deleteValidator.ts} +5 -5
  1105. package/validation/{fileLoadValidator.js → fileLoadValidator.ts} +12 -19
  1106. package/validation/{insertValidator.js → insertValidator.ts} +5 -5
  1107. package/validation/{installValidator.js → installValidator.ts} +8 -8
  1108. package/validation/{readLogValidator.js → readLogValidator.ts} +10 -10
  1109. package/validation/{role_validation.js → role_validation.ts} +26 -32
  1110. package/validation/{schemaMetadataValidator.js → schemaMetadataValidator.ts} +5 -11
  1111. package/validation/{searchValidator.js → searchValidator.ts} +12 -11
  1112. package/validation/statusValidator.ts +1 -1
  1113. package/validation/{transactionLogValidator.js → transactionLogValidator.ts} +4 -9
  1114. package/validation/{user_validation.js → user_validation.ts} +4 -10
  1115. package/validation/{validationWrapper.js → validationWrapper.ts} +3 -9
  1116. package/bin/cliOperations.js +0 -159
  1117. package/bin/lite.js +0 -5
  1118. package/dataLayer/harperBridge/BridgeMethods.js +0 -85
  1119. package/studio/web/assets/index-CmtPP0YO.js.map +0 -1
  1120. package/utility/globalSchema.js +0 -35
  1121. package/utility/lmdb/OpenDBIObject.js +0 -31
@@ -0,0 +1,895 @@
1
+ /**
2
+ * In-process tool-call agent loop for `Models.generate({ toolMode: 'auto' })`.
3
+ *
4
+ * Each iteration: (1) call `models.generate` with the running message list,
5
+ * (2) if the model emitted tool calls, dispatch each via `opts.toolHandlers`,
6
+ * (3) append the tool results to the message list, repeat. Terminate when the
7
+ * model returns a non-`tool_calls` finish reason or when the iteration cap trips.
8
+ *
9
+ * Analytics: the loop calls back through `models.generate(..., {toolMode: 'return'})`
10
+ * per iteration so each backend round flows the single-shot path in `Models.ts` and
11
+ * writes its own `hdb_model_calls` row. The outer auto call stays out of the table.
12
+ *
13
+ * **Abort wiring** (commit 3). Each invocation creates a loop-level
14
+ * `AbortController` composed with the caller's signal via `AbortSignal.any`. The
15
+ * composed signal flows to both the inner `models.generate` call and the
16
+ * `ToolHandlerContext.signal` handlers receive. Today the loop-level controller is
17
+ * only fired externally (caller aborts → composed signal aborts); commit 4 wires
18
+ * it to also fire on budget trips so an in-flight LLM call cancels cleanly.
19
+ *
20
+ * Streaming auto path + `opts.conversation.append` hook on both sync and streaming.
21
+ * The streaming loop yields each round's content / tool-call deltas to the caller as
22
+ * they arrive, accumulates the round's tool-call assembly internally, and treats
23
+ * `finishReason` as an INTERNAL signal: it is stripped from every forwarded chunk and
24
+ * re-emitted as exactly one terminal chunk AFTER the terminal assistant turn has been
25
+ * persisted, so a consumer that stops on the finish-reason chunk can never race past
26
+ * the conversation append. Tools run between rounds; the next backend stream resumes.
27
+ * Budget / abort / error-mode semantics match the sync path, with one streaming-specific
28
+ * gap: `maxToolTokens` / `maxCostUsd` are not yet enforced for streamed calls because
29
+ * `GenerateChunk` doesn't expose `usage` in v1 (follow-up to extend the chunk shape +
30
+ * backend final-chunk handling).
31
+ *
32
+ * Resilience posture (this module is foundational infra — fail loud, never silent):
33
+ * - Handler lookup uses `Object.hasOwn` + a callable check; a model-emitted tool name
34
+ * that collides with an Object prototype member (`toString`, `constructor`, …) does
35
+ * NOT resolve a built-in as a handler.
36
+ * - Missing handler splits two ways: a name the caller DECLARED in `tools` but didn't
37
+ * supply a handler for is a caller config bug (hard `ClientError(400)`); an UNdeclared
38
+ * name is a model hallucination, surfaced as a recoverable tool error (`toolErrorMode`
39
+ * decides recover-vs-abort).
40
+ * - A token/cost budget set against a backend that reports no `usage` warns once that it
41
+ * is unenforceable rather than silently no-opping.
42
+ * - An incomplete streamed tool call (id without a name) is recorded in the trace + warned,
43
+ * not silently dropped.
44
+ * - `toolErrorMode: 'abort'` throws BEFORE the conversation sink sees the round's tool
45
+ * turns, so the store never holds a recover-style error turn the model never consumed.
46
+ *
47
+ * Modes still deferred to follow-ups throw 501 at entry:
48
+ * - `toolArgValidation: 'strict' | 'lenient'` → JSON Schema validator (TBD)
49
+ * - `maxToolTokens` / `maxCostUsd` (streaming) → backend `usage` on chunks (TBD)
50
+ *
51
+ * Registry seam: v1 dispatches via caller-supplied `opts.toolHandlers`. #615 replaces
52
+ * that lookup with a `scope.resources` resolution using the same call signature — the
53
+ * declared-vs-undeclared split maps onto resolvable-but-misconfigured vs unknown.
54
+ */
55
+ import { ClientError, ServerError } from '../../utility/errors/hdbError.ts';
56
+ import { logger } from '../../utility/logging/logger.ts';
57
+ import type {
58
+ AccountingContext,
59
+ GenerateChunk,
60
+ GenerateInput,
61
+ GenerateOpts,
62
+ GenerateResult,
63
+ Message,
64
+ Models,
65
+ TokenUsage,
66
+ ToolCall,
67
+ ToolDef,
68
+ ToolHandler,
69
+ ToolHandlerContext,
70
+ ToolTraceEntry,
71
+ } from './types.ts';
72
+
73
+ const DEFAULT_MAX_ITERATIONS = 10;
74
+ const DEFAULT_MAX_RESULT_BYTES = 65_536;
75
+
76
+ export interface RunAgentLoopArgs {
77
+ models: Models;
78
+ input: GenerateInput;
79
+ opts: GenerateOpts;
80
+ accounting: AccountingContext;
81
+ signal?: AbortSignal;
82
+ }
83
+
84
+ export async function runAgentLoop(args: RunAgentLoopArgs): Promise<GenerateResult> {
85
+ const { models, opts, accounting, signal: callerSignal } = args;
86
+
87
+ // v1 gates: surface declared on GenerateOpts, runtime fills in incrementally.
88
+ // Throw a clear 501 at entry rather than silently downgrading to default behavior —
89
+ // the alternative (ignore unsupported mode) would mask caller mistakes.
90
+ guardUnsupportedModes(opts);
91
+
92
+ const maxIterations = opts.maxToolIterations ?? DEFAULT_MAX_ITERATIONS;
93
+ const maxResultBytes = opts.toolResultMaxBytes ?? DEFAULT_MAX_RESULT_BYTES;
94
+ const handlers = opts.toolHandlers ?? {};
95
+ const parallelism = opts.toolParallelism ?? 'parallel';
96
+ const errorMode = opts.toolErrorMode ?? 'recover';
97
+ const maxToolTokens = opts.maxToolTokens;
98
+ const maxCostUsd = opts.maxCostUsd;
99
+ const conversation = opts.conversation;
100
+
101
+ const { messages, tools, system } = normalizeInput(args.input);
102
+ // Names the CALLER declared as tools (object-form input). Used to split the
103
+ // missing-handler case: a declared tool with no handler is a caller config bug
104
+ // (hard fail); an UNdeclared name is a model hallucination (recover). See
105
+ // `runSingleToolCall`.
106
+ const declaredToolNames = collectDeclaredToolNames(tools);
107
+ const trace: ToolTraceEntry[] = [];
108
+ // Cumulative usage tallies across all iterations of this loop invocation. Used to
109
+ // trip `maxToolTokens` / `maxCostUsd` after each backend round.
110
+ let totalTokens = 0;
111
+ let totalCostUsd = 0;
112
+ // Warn-once latch: a token/cost budget is set but the backend isn't reporting
113
+ // usage, so the cap can't be measured. We refuse to silently pretend it's enforced.
114
+ let budgetUnmeasurableWarned = false;
115
+
116
+ // `conversation` is a one-way SINK for NEW turns produced by this loop — the loop
117
+ // does NOT re-append the caller's input messages, even when they include user
118
+ // turns. Echoing input back into the caller's store would corrupt it (the caller
119
+ // already added their own prompt) and scramble ordering for multi-turn history.
120
+ // The caller owns turn 0; the loop owns whatever assistant/tool turns it produces.
121
+
122
+ // Loop-level abort controller — fired internally on budget trips (commit 4 wires
123
+ // that) and on every loop exit (success, throw, abort) via the `finally` below.
124
+ // Composed with the caller's signal so an external `caller.abort()` ALSO fires
125
+ // the loop's signal (handlers and the in-flight backend call both react). The
126
+ // composed signal is the only signal that flows to inner calls.
127
+ const loopController = new AbortController();
128
+ const composedSignal = composeAbortSignal(callerSignal, loopController.signal);
129
+
130
+ // Strip loop-only knobs from what flows back into `models.generate`. The `toolMode:
131
+ // 'return'` override is what prevents the outer entry point from re-entering this loop.
132
+ // `signal` is swapped to the composed signal so `Models.generate` (and through it,
133
+ // the backend) see budget-trip and caller-abort cancellations the same way.
134
+ const innerOpts: GenerateOpts = { ...opts, toolMode: 'return', signal: composedSignal };
135
+
136
+ try {
137
+ for (let iteration = 1; iteration <= maxIterations; iteration++) {
138
+ // Pre-iteration abort check — if the caller (or a future budget trip) fired
139
+ // the composed signal between rounds, bail before paying for another backend
140
+ // call. The inner `models.generate` would itself throw on the in-flight check,
141
+ // but throwing here saves the round-trip and the spurious analytics row.
142
+ composedSignal.throwIfAborted();
143
+
144
+ const result = await models.generate(buildInnerInput(messages, tools, system), innerOpts);
145
+
146
+ // Re-check abort the instant the backend round returns, BEFORE any budget
147
+ // accounting, assistant append, or tool dispatch. A well-behaved backend
148
+ // throws on an in-flight abort; an ill-behaved one (community backend that
149
+ // ignores its signal) can resolve normally after the caller aborted. Without
150
+ // this check the loop would run side-effecting handlers for a cancelled
151
+ // request and then misreport the outcome as a budget/tool error instead of
152
+ // an abort.
153
+ composedSignal.throwIfAborted();
154
+
155
+ logger.debug?.(
156
+ `[models] auto-loop iteration ${iteration}: finishReason=${result.finishReason} toolCalls=${result.toolCalls?.length ?? 0} cumulativeTokens=${totalTokens}`
157
+ );
158
+
159
+ // A token/cost budget is only as good as the backend's usage reporting. If a
160
+ // cap is set but this round reported no usage, the cap is unmeasurable — warn
161
+ // once rather than letting the caller believe spend is bounded when it isn't.
162
+ if (
163
+ (maxToolTokens !== undefined || maxCostUsd !== undefined) &&
164
+ result.usage === undefined &&
165
+ !budgetUnmeasurableWarned
166
+ ) {
167
+ budgetUnmeasurableWarned = true;
168
+ logger.warn?.(
169
+ `[models] auto-loop token/cost budget set but backend '${opts.model ?? 'default'}' reported no usage; budget is unenforceable for this run (maxToolIterations still applies)`
170
+ );
171
+ }
172
+
173
+ // Tally this round's usage BEFORE deciding terminal vs continue. A round
174
+ // that crosses the cap trips even if it would otherwise have been the last
175
+ // one — the cap is on what we paid for, not on what we'd have paid for next.
176
+ // Cost trip semantics: `>= cap`, so `maxCostUsd: 0` blocks every call rather
177
+ // than dormantly admitting all of them until a real rate card lands and then
178
+ // abruptly blocking everything. Token trip uses `>=` for symmetry.
179
+ //
180
+ // Discarded-content asymmetry: a TERMINAL round that trips returns
181
+ // BudgetExceededError instead of the final assistant content. The content is
182
+ // in `messages` (the loop's running state) but neither `partialTrace` nor the
183
+ // thrown error surfaces it. Callers that need terminal content even on
184
+ // budget-trip should set `maxToolTokens` / `maxCostUsd` conservatively or read
185
+ // the per-iteration analytics rows (one row per round in `hdb_model_calls`).
186
+ totalTokens += sumTokens(result.usage);
187
+ totalCostUsd += computeCallCostUsd(result.usage, opts.model);
188
+ if (maxToolTokens !== undefined && totalTokens >= maxToolTokens) {
189
+ throw new BudgetExceededError(
190
+ 'tokens',
191
+ `agent loop exceeded maxToolTokens=${maxToolTokens} (cumulative=${totalTokens})`,
192
+ trace
193
+ );
194
+ }
195
+ if (maxCostUsd !== undefined && totalCostUsd >= maxCostUsd) {
196
+ throw new BudgetExceededError(
197
+ 'cost',
198
+ `agent loop exceeded maxCostUsd=${maxCostUsd} (cumulative=${totalCostUsd})`,
199
+ trace
200
+ );
201
+ }
202
+
203
+ const calls = result.toolCalls;
204
+ // Backends (notably OpenAI) leave `content` as `null` / undefined on tool-call
205
+ // rounds. `Message.content` and `ConversationTurn.content` are typed as a
206
+ // required string — coerce to '' at the seam.
207
+ const assistantContent = result.content ?? '';
208
+ if (result.finishReason !== 'tool_calls' || !calls || calls.length === 0) {
209
+ // Terminal: model produced a final answer (stop / length / content_filter), or it
210
+ // signaled tool_calls but emitted none. Append final assistant turn to the
211
+ // conversation hook (if set), then pass the result through; attach the trace
212
+ // when the caller asked for it.
213
+ if (conversation && assistantContent) {
214
+ await conversation.append({ role: 'assistant', content: assistantContent });
215
+ }
216
+ // A `tool_calls` finishReason with no dispatchable calls (e.g. the backend
217
+ // dropped malformed tool-call args) is terminal — coerce it to 'stop' so an
218
+ // auto-mode caller never sees a `tool_calls` finishReason (auto resolves calls
219
+ // internally) pointing at calls that aren't there, and never a `null` content.
220
+ // Mirrors the streaming path's terminalReason fold.
221
+ const terminal: GenerateResult =
222
+ result.finishReason === 'tool_calls'
223
+ ? { ...result, finishReason: 'stop', content: assistantContent }
224
+ : result;
225
+ return opts.includeToolTrace ? { ...terminal, trace } : terminal;
226
+ }
227
+
228
+ messages.push({ role: 'assistant', content: assistantContent, toolCalls: calls });
229
+ if (conversation) {
230
+ await conversation.append({
231
+ role: 'assistant',
232
+ content: assistantContent,
233
+ toolCalls: calls,
234
+ });
235
+ }
236
+
237
+ const ctx: ToolHandlerContext = { signal: composedSignal, accounting };
238
+ const dispatched = await dispatchToolCalls(
239
+ calls,
240
+ handlers,
241
+ declaredToolNames,
242
+ ctx,
243
+ iteration,
244
+ maxResultBytes,
245
+ parallelism
246
+ );
247
+
248
+ // Post-dispatch abort check — covers the LAST-iteration case: if the signal
249
+ // fired during this round's handlers, we'd otherwise skip the top-of-loop check
250
+ // and throw `BudgetExceededError` (misleading: the budget never tripped). Fire
251
+ // the abort here so the caller gets the correct error class. Earlier iterations
252
+ // pick this up on the next round's top-of-loop check.
253
+ composedSignal.throwIfAborted();
254
+
255
+ // Trace + the in-memory message list always record every tool result in CALL
256
+ // order (the trace mirrors what the model emitted, not which handler finished
257
+ // first). The EXTERNAL conversation sink is handled separately below so the
258
+ // abort-mode throw can run BEFORE we persist turns the model never consumes.
259
+ for (const dispatchResult of dispatched) {
260
+ trace.push(dispatchResult.entry);
261
+ messages.push({
262
+ role: 'tool',
263
+ content: dispatchResult.toolMessageContent,
264
+ toolCallId: dispatchResult.entry.toolCallId,
265
+ });
266
+ }
267
+
268
+ // `toolErrorMode: 'abort'`: any handler failure terminates the loop. Throw
269
+ // BEFORE the conversation sink sees this round's tool turns — abort mode
270
+ // returns the error to the caller instead of recovering, so persisting a
271
+ // recover-style tool-error turn the model never reads would leave the store
272
+ // inconsistent with what actually happened. The trace (built above) still
273
+ // carries the failing entry via `ToolHandlerError.partialTrace`.
274
+ if (errorMode === 'abort') {
275
+ const failed = dispatched.find((d) => d.originalError !== undefined);
276
+ if (failed) {
277
+ throw new ToolHandlerError(failed.entry.toolName, failed.entry.toolCallId, trace, failed.originalError);
278
+ }
279
+ }
280
+
281
+ // Continue path: persist this round's tool turns to the conversation sink.
282
+ if (conversation) {
283
+ for (const dispatchResult of dispatched) {
284
+ await conversation.append({
285
+ role: 'tool',
286
+ toolCallId: dispatchResult.entry.toolCallId,
287
+ content: dispatchResult.toolMessageContent,
288
+ });
289
+ }
290
+ }
291
+ }
292
+
293
+ // Hit `maxToolIterations` without a terminal finishReason — the model kept calling tools.
294
+ // Always include the trace on the error path (independent of `includeToolTrace`) so
295
+ // callers can debug an exhausted budget without re-running with tracing on.
296
+ throw new BudgetExceededError('iterations', `agent loop exceeded maxToolIterations=${maxIterations}`, trace);
297
+ } finally {
298
+ // Always abort the loop controller on exit (success, throw, or external abort).
299
+ // Cleans up `AbortSignal.any`'s listener on `callerSignal` so a session-scoped caller
300
+ // signal doesn't accumulate listeners across many `runAgentLoop` invocations, and
301
+ // signals any sibling handlers still running in the background after a Promise.all
302
+ // rejection (missing-handler or aborted-mid-flight) to bail out promptly.
303
+ loopController.abort();
304
+ }
305
+ }
306
+
307
+ interface DispatchedToolCall {
308
+ entry: ToolTraceEntry;
309
+ toolMessageContent: string;
310
+ /**
311
+ * The original thrown value when the handler / serialization failed and recover
312
+ * mode caught it. Preserved alongside the formatted `entry.error` so abort mode
313
+ * can surface the cause unmodified via `ToolHandlerError.cause`. Undefined when
314
+ * the handler succeeded.
315
+ */
316
+ originalError?: unknown;
317
+ }
318
+
319
+ async function dispatchToolCalls(
320
+ calls: ToolCall[],
321
+ handlers: Record<string, ToolHandler>,
322
+ declaredToolNames: Set<string>,
323
+ ctx: ToolHandlerContext,
324
+ iteration: number,
325
+ maxResultBytes: number,
326
+ parallelism: 'parallel' | 'serial'
327
+ ): Promise<DispatchedToolCall[]> {
328
+ // Single-call rounds use the serial path even when 'parallel' is selected — the
329
+ // settled-wrapping path adds nothing on one element and the serial path's stack
330
+ // trace is more readable in errors.
331
+ if (parallelism === 'serial' || calls.length <= 1) {
332
+ const out: DispatchedToolCall[] = [];
333
+ for (const call of calls) {
334
+ out.push(await runSingleToolCall(call, handlers, declaredToolNames, ctx, iteration, maxResultBytes));
335
+ }
336
+ return out;
337
+ }
338
+ // Parallel: handlers race concurrently. `runSingleToolCall` only throws on missing
339
+ // handler or cooperative abort — handler errors are caught inline and surface via
340
+ // `originalError`. `Promise.all` rejects on first throw, which is what we want for
341
+ // those two cases: surface the throw immediately so the loop's `finally` can fire
342
+ // `loopController.abort` and cancel siblings still in flight, instead of waiting
343
+ // for every sibling to complete (which `Promise.allSettled` would force).
344
+ //
345
+ // Concurrent-rejection caveat: when MULTIPLE siblings reject at the same time
346
+ // (e.g. several missing handlers, or several handlers reacting to a cooperative
347
+ // abort), `Promise.all` only awaits the first rejection — the rest become
348
+ // unhandled-rejection warnings (and crash under `--unhandled-rejections=throw`).
349
+ // Attach a no-op catch to each promise so the runtime sees every rejection as
350
+ // handled while still letting `Promise.all` settle on the first one.
351
+ const promises = calls.map((call) =>
352
+ runSingleToolCall(call, handlers, declaredToolNames, ctx, iteration, maxResultBytes)
353
+ );
354
+ for (const p of promises) p.catch(() => {});
355
+ return Promise.all(promises);
356
+ }
357
+
358
+ async function runSingleToolCall(
359
+ call: ToolCall,
360
+ handlers: Record<string, ToolHandler>,
361
+ declaredToolNames: Set<string>,
362
+ ctx: ToolHandlerContext,
363
+ iteration: number,
364
+ maxResultBytes: number
365
+ ): Promise<DispatchedToolCall> {
366
+ const entry: ToolTraceEntry = {
367
+ iteration,
368
+ toolCallId: call.id,
369
+ toolName: call.name,
370
+ // Shallow-copy so the trace's view of "what the model emitted" doesn't shift if a
371
+ // handler mutates its `args` parameter (legitimate pattern). Deep mutations to
372
+ // nested objects can still leak — common-case flat-object args are covered.
373
+ arguments: { ...call.arguments },
374
+ durationMs: 0,
375
+ };
376
+
377
+ // Handler resolution. Use `Object.hasOwn` + a callable check rather than a plain
378
+ // `handlers[call.name]` lookup: a model can emit a tool name that collides with an
379
+ // inherited Object prototype member (`toString`, `constructor`, `__proto__`, ...),
380
+ // and a bare index would resolve that built-in as a "handler" and invoke it. Model
381
+ // output is untrusted input at this boundary — only an own, callable property counts.
382
+ const handler =
383
+ Object.hasOwn(handlers, call.name) && typeof handlers[call.name] === 'function' ? handlers[call.name] : undefined;
384
+ if (!handler) {
385
+ if (declaredToolNames.has(call.name)) {
386
+ // The caller DECLARED this tool but supplied no (callable) handler for it.
387
+ // That's a caller config bug, not something the model can recover from —
388
+ // hard fail. (#615 swaps this lookup for a `scope.resources` registry
389
+ // resolution; same split — resolvable-but-misconfigured stays a hard fail.)
390
+ throw new ClientError(`No handler registered for declared tool '${call.name}' (call id ${call.id})`, 400);
391
+ }
392
+ // Undeclared tool name: the model hallucinated a tool that doesn't exist. This is
393
+ // the EXPECTED failure mode for an LLM, not a caller fault — surface it as a
394
+ // recoverable tool error so `toolErrorMode: 'recover'` feeds it back and the model
395
+ // can self-correct, while `'abort'` (via `originalError`) still stops the loop.
396
+ logger.warn?.(
397
+ `[models] auto-loop: model called unknown tool '${call.name}' (call id ${call.id}); no such tool declared`
398
+ );
399
+ const unknownToolError = new ClientError(`Unknown tool '${call.name}': no such tool is available`, 400);
400
+ entry.error = errorInfo(unknownToolError);
401
+ return {
402
+ entry,
403
+ toolMessageContent: JSON.stringify({ error: entry.error.message }),
404
+ originalError: unknownToolError,
405
+ };
406
+ }
407
+
408
+ const handlerStart = performance.now();
409
+ let toolMessageContent: string;
410
+ let originalError: unknown;
411
+ // Wrap BOTH the handler call AND result serialization in the recover catch.
412
+ // `JSON.stringify` throws on BigInt and circular refs — both trivially produced by
413
+ // handlers that return raw DB rows or Resource instances. Without this, a
414
+ // serialization failure crashes the entire loop instead of becoming a tool error
415
+ // the model can react to (the `toolErrorMode: 'recover'` contract).
416
+ try {
417
+ const handlerOutput = await handler(call.arguments, ctx);
418
+ const serialized = serializeToolResult(handlerOutput, maxResultBytes);
419
+ entry.result = serialized.content;
420
+ if (serialized.truncated) {
421
+ entry.truncated = true;
422
+ entry.totalBytes = serialized.totalBytes;
423
+ }
424
+ toolMessageContent = serialized.content;
425
+ } catch (err) {
426
+ // Cooperative cancellation is NOT a tool error — rethrow so the loop's
427
+ // abort path (top-of-loop / post-dispatch `throwIfAborted`) classifies it
428
+ // correctly. Without this, AbortError would land in `entry.error` and the
429
+ // caller would see `BudgetExceededError` on the last iteration, or a
430
+ // bogus `{error: 'aborted'}` tool message threaded into the conversation.
431
+ // The trace entry is abandoned (the loop builds an aborted-path trace later).
432
+ if (ctx.signal?.aborted) throw err;
433
+ // Handler error. Populate entry.error so the trace records the failure, build
434
+ // the recover-mode tool-message envelope, and stash the original throw so
435
+ // `toolErrorMode: 'abort'` (checked in the main loop after dispatch) can
436
+ // surface the cause unmodified.
437
+ originalError = err;
438
+ entry.error = errorInfo(err);
439
+ toolMessageContent = JSON.stringify({ error: entry.error.message });
440
+ }
441
+ entry.durationMs = performance.now() - handlerStart;
442
+
443
+ return { entry, toolMessageContent, originalError };
444
+ }
445
+
446
+ /**
447
+ * Mirror of `backendHelpers.composeSignal` but composing a caller signal with an
448
+ * INTERNAL controller's signal (not a timeout). Returns the internal signal alone
449
+ * when no caller signal exists, the caller signal alone when no internal controller
450
+ * is needed (today never — we always create one), and a composed signal otherwise.
451
+ *
452
+ * `AbortSignal.any` requires Node 20+, which matches Harper's engines floor.
453
+ */
454
+ function composeAbortSignal(caller: AbortSignal | undefined, internal: AbortSignal): AbortSignal {
455
+ if (!caller) return internal;
456
+ return AbortSignal.any([caller, internal]);
457
+ }
458
+
459
+ export async function* runAgentLoopStream(args: RunAgentLoopArgs): AsyncIterable<GenerateChunk> {
460
+ const { models, opts, accounting, signal: callerSignal } = args;
461
+
462
+ guardUnsupportedModes(opts);
463
+
464
+ const maxIterations = opts.maxToolIterations ?? DEFAULT_MAX_ITERATIONS;
465
+ const maxResultBytes = opts.toolResultMaxBytes ?? DEFAULT_MAX_RESULT_BYTES;
466
+ const handlers = opts.toolHandlers ?? {};
467
+ const parallelism = opts.toolParallelism ?? 'parallel';
468
+ const errorMode = opts.toolErrorMode ?? 'recover';
469
+ const conversation = opts.conversation;
470
+ // Streaming + token/cost budgets: backends don't emit `usage` on `GenerateChunk`
471
+ // in v1 (the type has no `usage` field on chunks), so cumulative usage isn't
472
+ // observable from the stream. The iteration budget still applies. Wiring
473
+ // streaming budgets requires extending `GenerateChunk` and updating each
474
+ // backend's stream-final-chunk handling — a follow-up to this PR.
475
+ if (opts.maxToolTokens !== undefined || opts.maxCostUsd !== undefined) {
476
+ throw new ServerError(
477
+ `maxToolTokens / maxCostUsd are not yet supported for generateStream (streamed usage not exposed in v1)`,
478
+ 501
479
+ );
480
+ }
481
+
482
+ const { messages, tools, system } = normalizeInput(args.input);
483
+ const declaredToolNames = collectDeclaredToolNames(tools);
484
+ const trace: ToolTraceEntry[] = [];
485
+
486
+ const loopController = new AbortController();
487
+ const composedSignal = composeAbortSignal(callerSignal, loopController.signal);
488
+ const innerOpts: GenerateOpts = { ...opts, toolMode: 'return', signal: composedSignal };
489
+
490
+ // `conversation` is a one-way SINK for NEW turns produced by this loop — see
491
+ // `runAgentLoop` for the rationale. Streaming path applies the same contract.
492
+
493
+ try {
494
+ for (let iteration = 1; iteration <= maxIterations; iteration++) {
495
+ composedSignal.throwIfAborted();
496
+
497
+ // Stream this round: yield content + tool-call deltas to the caller as they
498
+ // arrive, while internally assembling the round's content and tool-call shape.
499
+ let accumulatedContent = '';
500
+ const toolCallAssembly = new Map<string, Partial<ToolCall>>();
501
+ let finishReason: GenerateResult['finishReason'] | undefined;
502
+
503
+ const stream = models.generateStream(buildInnerInput(messages, tools, system), innerOpts);
504
+ for await (const chunk of stream) {
505
+ // Defense-in-depth: well-behaved backends honor `opts.signal` via the
506
+ // fetch they hand it to. An ill-behaved community backend that doesn't
507
+ // observe its signal would otherwise keep streaming after a caller abort.
508
+ composedSignal.throwIfAborted();
509
+
510
+ if (chunk.deltaContent !== undefined) {
511
+ accumulatedContent += chunk.deltaContent;
512
+ }
513
+ if (chunk.deltaToolCalls) {
514
+ for (const delta of chunk.deltaToolCalls) {
515
+ mergeToolCallDelta(toolCallAssembly, delta);
516
+ }
517
+ }
518
+ if (chunk.finishReason) {
519
+ finishReason = chunk.finishReason;
520
+ }
521
+ // `finishReason` is an INTERNAL signal — never forward it inline. We re-emit
522
+ // exactly one terminal chunk after the loop, AFTER the terminal turn has been
523
+ // appended to the conversation sink (see below). Forwarding it here would let a
524
+ // consumer that stops on the first finish-reason chunk close this generator at
525
+ // the `yield` before the append runs, delivering a response that never persists.
526
+ // The deltas (content / tool-call shape) still flow through untouched.
527
+ if (chunk.deltaContent !== undefined || chunk.deltaToolCalls) {
528
+ const cleaned: GenerateChunk = {};
529
+ if (chunk.deltaContent !== undefined) cleaned.deltaContent = chunk.deltaContent;
530
+ if (chunk.deltaToolCalls) cleaned.deltaToolCalls = chunk.deltaToolCalls;
531
+ yield cleaned;
532
+ }
533
+ }
534
+
535
+ const finalToolCalls = completeToolCallAssembly(toolCallAssembly);
536
+ // Surface any assembled-but-incomplete tool calls (id arrived, name never did)
537
+ // instead of silently dropping them. `completeToolCallAssembly` keeps only
538
+ // dispatchable (id + name) calls; a missing-name partial usually means a
539
+ // truncated stream. Record it in the trace + warn so the drop is observable.
540
+ if (finalToolCalls.length < toolCallAssembly.size) {
541
+ for (const [id, partial] of toolCallAssembly) {
542
+ if (!partial.name) {
543
+ logger.warn?.(
544
+ `[models] auto-loop: dropping incomplete streamed tool call id=${id} (no tool name assembled; stream likely truncated)`
545
+ );
546
+ trace.push({
547
+ iteration,
548
+ toolCallId: id,
549
+ toolName: '<incomplete>',
550
+ arguments: partial.arguments ?? {},
551
+ durationMs: 0,
552
+ error: { name: 'IncompleteToolCall', message: 'streamed tool call missing name; dropped' },
553
+ });
554
+ }
555
+ }
556
+ }
557
+
558
+ logger.debug?.(
559
+ `[models] auto-loop stream iteration ${iteration}: finishReason=${finishReason ?? 'none'} toolCalls=${finalToolCalls.length}`
560
+ );
561
+
562
+ // Continue-vs-terminal:
563
+ // - Hand off to tool dispatch when calls assembled AND the backend signalled
564
+ // tool_calls OR didn't signal anything at all. The "no finishReason" case
565
+ // covers proxy-truncated streams: every in-tree backend (openai, anthropic,
566
+ // bedrock) emits a tail-flush `deltaToolCalls` without a finishReason when
567
+ // the upstream connection drops mid-stream. Treating that as terminal would
568
+ // silently drop the assembled tool calls — the backend's recovery would be
569
+ // undone by this loop.
570
+ // - Otherwise, terminal: yield a synthetic 'stop' chunk if the consumer didn't
571
+ // receive a terminal finishReason inline (degenerate streams, or the
572
+ // suppressed `tool_calls` finishReason with zero assembled calls).
573
+ const hasToolCalls = finalToolCalls.length > 0;
574
+ const continueWithToolCalls = hasToolCalls && (finishReason === 'tool_calls' || finishReason === undefined);
575
+
576
+ if (!continueWithToolCalls) {
577
+ // Terminal. Persist the final assistant turn to the conversation sink FIRST,
578
+ // then emit exactly one terminal chunk. Because the loop suppressed every
579
+ // inline finishReason, this `yield` is the only finish-reason the consumer
580
+ // sees — and it lands after the append, so a consumer that stops on it cannot
581
+ // race past the persistence.
582
+ if (conversation && accumulatedContent) {
583
+ await conversation.append({ role: 'assistant', content: accumulatedContent });
584
+ }
585
+ // `tool_calls` with zero dispatchable calls can't honestly be reported as the
586
+ // terminal reason (there are no calls); fold it and the no-signal case to 'stop'.
587
+ const terminalReason = finishReason && finishReason !== 'tool_calls' ? finishReason : 'stop';
588
+ yield { finishReason: terminalReason };
589
+ return;
590
+ }
591
+
592
+ // Continue the loop: dispatch tools, append messages, resume on next iteration.
593
+ const assistantMessage: Message = {
594
+ role: 'assistant',
595
+ content: accumulatedContent,
596
+ toolCalls: finalToolCalls,
597
+ };
598
+ messages.push(assistantMessage);
599
+ if (conversation) {
600
+ await conversation.append({
601
+ role: 'assistant',
602
+ content: accumulatedContent,
603
+ toolCalls: finalToolCalls,
604
+ });
605
+ }
606
+
607
+ const ctx: ToolHandlerContext = { signal: composedSignal, accounting };
608
+ const dispatched = await dispatchToolCalls(
609
+ finalToolCalls,
610
+ handlers,
611
+ declaredToolNames,
612
+ ctx,
613
+ iteration,
614
+ maxResultBytes,
615
+ parallelism
616
+ );
617
+
618
+ composedSignal.throwIfAborted();
619
+
620
+ // Trace + in-memory messages always record every result; the external
621
+ // conversation sink is deferred past the abort-mode throw (same rationale as
622
+ // the sync path — don't persist tool turns the model never consumes on abort).
623
+ for (const d of dispatched) {
624
+ trace.push(d.entry);
625
+ messages.push({
626
+ role: 'tool',
627
+ content: d.toolMessageContent,
628
+ toolCallId: d.entry.toolCallId,
629
+ });
630
+ }
631
+
632
+ if (errorMode === 'abort') {
633
+ const failed = dispatched.find((d) => d.originalError !== undefined);
634
+ if (failed) {
635
+ throw new ToolHandlerError(failed.entry.toolName, failed.entry.toolCallId, trace, failed.originalError);
636
+ }
637
+ }
638
+
639
+ if (conversation) {
640
+ for (const d of dispatched) {
641
+ await conversation.append({
642
+ role: 'tool',
643
+ toolCallId: d.entry.toolCallId,
644
+ content: d.toolMessageContent,
645
+ });
646
+ }
647
+ }
648
+ }
649
+
650
+ throw new BudgetExceededError('iterations', `agent loop exceeded maxToolIterations=${maxIterations}`, trace);
651
+ } finally {
652
+ loopController.abort();
653
+ }
654
+ }
655
+
656
+ /**
657
+ * Update the in-flight assembly map with one streamed tool-call delta. Streaming
658
+ * backends may send the same `id` multiple times with partial `name` / `arguments`;
659
+ * we merge them in arrival order. Some backends pre-assemble and send the full
660
+ * call as a single delta — same code path, single update.
661
+ *
662
+ * Backends that stream `arguments` as accumulating JSON string fragments must
663
+ * parse before yielding (delta.arguments is typed as `object`); shape assembly
664
+ * lives in this loop, fragment assembly lives in the backend.
665
+ */
666
+ function mergeToolCallDelta(map: Map<string, Partial<ToolCall>>, delta: Partial<ToolCall>): void {
667
+ if (!delta.id) return;
668
+ const existing: Partial<ToolCall> = map.get(delta.id) ?? { id: delta.id };
669
+ if (delta.name) existing.name = delta.name;
670
+ if (delta.arguments) {
671
+ existing.arguments = { ...existing.arguments, ...delta.arguments };
672
+ }
673
+ map.set(delta.id, existing);
674
+ }
675
+
676
+ function completeToolCallAssembly(map: Map<string, Partial<ToolCall>>): ToolCall[] {
677
+ const out: ToolCall[] = [];
678
+ for (const partial of map.values()) {
679
+ if (partial.id && partial.name) {
680
+ out.push({
681
+ id: partial.id,
682
+ name: partial.name,
683
+ arguments: partial.arguments ?? {},
684
+ });
685
+ }
686
+ }
687
+ return out;
688
+ }
689
+
690
+ function guardUnsupportedModes(opts: GenerateOpts): void {
691
+ const validationMode = opts.toolArgValidation ?? 'none';
692
+ if (validationMode !== 'none') {
693
+ throw new ServerError(
694
+ `toolArgValidation: '${validationMode}' is not yet implemented; v1 supports 'none' only`,
695
+ 501
696
+ );
697
+ }
698
+ }
699
+
700
+ function buildInnerInput(
701
+ messages: Message[],
702
+ tools: ToolDef[] | undefined,
703
+ system: string | undefined
704
+ ): { messages: Message[]; tools?: ToolDef[]; system?: string } {
705
+ const inner: { messages: Message[]; tools?: ToolDef[]; system?: string } = { messages };
706
+ if (tools) inner.tools = tools;
707
+ if (system) inner.system = system;
708
+ return inner;
709
+ }
710
+
711
+ function normalizeInput(input: GenerateInput): {
712
+ messages: Message[];
713
+ tools?: ToolDef[];
714
+ system?: string;
715
+ } {
716
+ if (typeof input === 'string') {
717
+ return { messages: [{ role: 'user', content: input }] };
718
+ }
719
+ if (Array.isArray(input)) {
720
+ return { messages: [...input] };
721
+ }
722
+ return { messages: [...input.messages], tools: input.tools, system: input.system };
723
+ }
724
+
725
+ function collectDeclaredToolNames(tools: ToolDef[] | undefined): Set<string> {
726
+ const names = new Set<string>();
727
+ if (tools) for (const t of tools) names.add(t.name);
728
+ return names;
729
+ }
730
+
731
+ function errorInfo(err: unknown): { name: string; message: string } {
732
+ if (err instanceof Error) {
733
+ return { name: err.name, message: err.message };
734
+ }
735
+ // Some thrown values are plain objects with a `message` field but no Error chain —
736
+ // e.g. Harper's `BigInt.prototype.toJSON` throws `{message: 'Cannot serialize BigInt …'}`
737
+ // (server/serverHelpers/JSONStream.ts) to skip the cost of capturing a stack on a hot
738
+ // serialization path. Surface their message instead of String()-ing the whole object.
739
+ if (err && typeof err === 'object' && 'message' in err) {
740
+ const e = err as { name?: unknown; message?: unknown };
741
+ const name = typeof e.name === 'string' ? e.name : 'Error';
742
+ const message = typeof e.message === 'string' ? e.message : String(e.message);
743
+ return { name, message };
744
+ }
745
+ return { name: 'Error', message: String(err) };
746
+ }
747
+
748
+ interface SerializedResult {
749
+ content: string;
750
+ totalBytes: number;
751
+ truncated: boolean;
752
+ }
753
+
754
+ function serializeToolResult(value: unknown, maxBytes: number): SerializedResult {
755
+ // `JSON.stringify(Symbol())` (and `JSON.stringify(function(){})`) return `undefined`.
756
+ // `value ?? null` only catches null/undefined inputs, not unsupported types — fall
757
+ // back to the string 'null' so downstream `Buffer.byteLength` never sees undefined.
758
+ const json = JSON.stringify(value ?? null) ?? 'null';
759
+ const totalBytes = Buffer.byteLength(json, 'utf8');
760
+ // Common case: result fits. Skip buffer allocation entirely — read byte length
761
+ // without materializing a copy.
762
+ if (totalBytes <= maxBytes) {
763
+ return { content: json, totalBytes, truncated: false };
764
+ }
765
+ // Truncated form: head of the JSON + a marker that names the original size. The
766
+ // content is no longer valid JSON — that's intentional, the model reads it as text
767
+ // alongside the marker. Pre-slice the JSON string by CHARACTERS to `headBudget`
768
+ // before converting to a Buffer — any character takes at least one UTF-8 byte, so
769
+ // the pre-sliced string already fits in (4 * headBudget) bytes worst-case. Without
770
+ // this, a multi-MB JSON result would materialize a multi-MB Buffer copy just to
771
+ // throw away >99 % of it via `subarray`. After conversion, `subarray(0, headBudget)`
772
+ // trims to exact byte budget; `toString('utf8')` folds a split codepoint at the
773
+ // boundary into U+FFFD.
774
+ const marker = `…[truncated; full result is ${totalBytes} bytes]`;
775
+ const markerBytes = Buffer.byteLength(marker, 'utf8');
776
+ const headBudget = Math.max(0, maxBytes - markerBytes);
777
+ const buf = Buffer.from(json.slice(0, headBudget), 'utf8');
778
+ const body = buf.subarray(0, headBudget).toString('utf8');
779
+ return { content: body + marker, totalBytes, truncated: true };
780
+ }
781
+
782
+ /**
783
+ * Loop tripped one of its budgets (iterations, tokens, cost). The trace built so
784
+ * far rides along on `partialTrace` so callers can inspect what already ran. The
785
+ * loop always populates this regardless of `opts.includeToolTrace` so debugging an
786
+ * exhausted budget never needs a second run with tracing turned on.
787
+ *
788
+ * Extends `ClientError` — the caller set the budget, so exceeding it is a 4xx
789
+ * caller-bounds condition, not a Harper-internal fault. Anything that branches on
790
+ * `err instanceof ClientError` (e.g. "don't page on this") classifies it correctly.
791
+ */
792
+ export class BudgetExceededError extends ClientError {
793
+ kind: 'iterations' | 'tokens' | 'cost';
794
+ partialTrace: ToolTraceEntry[];
795
+ constructor(kind: 'iterations' | 'tokens' | 'cost', message: string, partialTrace: ToolTraceEntry[]) {
796
+ // 429 (Too Many Requests) maps cleanest to "you exceeded the budget you set".
797
+ super(message, 429);
798
+ this.name = 'BudgetExceededError';
799
+ this.kind = kind;
800
+ this.partialTrace = partialTrace;
801
+ }
802
+ }
803
+
804
+ /**
805
+ * Surfaced under `toolErrorMode: 'abort'` when a tool handler throws (or its
806
+ * result fails to serialize). Carries the original throw on `.cause` and the
807
+ * partial trace — including the failing entry — on `.partialTrace` so callers
808
+ * always have the full picture on the abort path.
809
+ *
810
+ * `statusCode` mirrors the underlying error when it carries one (e.g. a handler
811
+ * throwing `ClientError(400)` surfaces as `ToolHandlerError(400)`), otherwise
812
+ * defaults to 500.
813
+ *
814
+ * **`instanceof` caveat:** extends `ServerError` regardless of `statusCode`, so a
815
+ * handler-thrown `ClientError(403)` becomes a `ToolHandlerError` whose `statusCode`
816
+ * is 403 but where `instanceof ClientError === false`. Callers that route on
817
+ * client-vs-server class should branch on `err.statusCode` or
818
+ * `err.cause instanceof ClientError`, not on `err instanceof ClientError` directly.
819
+ */
820
+ export class ToolHandlerError extends ServerError {
821
+ toolName: string;
822
+ toolCallId: string;
823
+ partialTrace: ToolTraceEntry[];
824
+ constructor(toolName: string, toolCallId: string, partialTrace: ToolTraceEntry[], cause: unknown) {
825
+ const causeMessage = errorInfo(cause).message;
826
+ const causeStatus =
827
+ cause &&
828
+ typeof cause === 'object' &&
829
+ 'statusCode' in cause &&
830
+ typeof (cause as { statusCode: unknown }).statusCode === 'number'
831
+ ? (cause as { statusCode: number }).statusCode
832
+ : 500;
833
+ super(`Tool handler '${toolName}' (call ${toolCallId}) failed: ${causeMessage}`, causeStatus);
834
+ this.name = 'ToolHandlerError';
835
+ this.toolName = toolName;
836
+ this.toolCallId = toolCallId;
837
+ this.partialTrace = partialTrace;
838
+ this.cause = cause;
839
+ }
840
+ }
841
+
842
+ /**
843
+ * Cost computation hook. v1 returns 0 — no per-model rate card is wired today —
844
+ * so `maxCostUsd` never trips in production. The cap, the trip path, and the
845
+ * `BudgetExceededError({kind: 'cost'})` shape ARE wired and exercised by tests
846
+ * that inject a non-zero function via `_setComputeCallCostUsdForTests`. When the
847
+ * rate card lands, replace this implementation; no surface change needed.
848
+ */
849
+ let computeCallCostUsd: (usage: TokenUsage | undefined, model: string | undefined) => number = () => 0;
850
+
851
+ /**
852
+ * Test-only override. Public callers must not depend on this — it exists so unit
853
+ * tests can prove the `maxCostUsd` trip path works end-to-end before a real rate
854
+ * card lands. Leading underscore marks the intent.
855
+ */
856
+ export function _setComputeCallCostUsdForTests(
857
+ fn: (usage: TokenUsage | undefined, model: string | undefined) => number
858
+ ): void {
859
+ computeCallCostUsd = fn;
860
+ }
861
+
862
+ /**
863
+ * Reset the cost function to the v1 stub. Pair with `_setComputeCallCostUsdForTests`
864
+ * in test `afterEach` so suites don't leak state into each other.
865
+ */
866
+ export function _resetComputeCallCostUsdForTests(): void {
867
+ computeCallCostUsd = () => 0;
868
+ }
869
+
870
+ function sumTokens(usage: TokenUsage | undefined): number {
871
+ if (!usage) return 0;
872
+ let total = 0;
873
+ if (typeof usage.promptTokens === 'number' && usage.promptTokens > 0) total += usage.promptTokens;
874
+ if (typeof usage.completionTokens === 'number' && usage.completionTokens > 0) total += usage.completionTokens;
875
+ return total;
876
+ }
877
+
878
+ /**
879
+ * `toolArgValidation: 'strict'` rejected a tool call's arguments against its
880
+ * declared `parameters` JSON Schema. Surfaces as a 400 — the model produced output
881
+ * that doesn't satisfy the contract the caller declared. Reserved for the
882
+ * validator wiring (currently the strict mode is itself gated at loop entry).
883
+ */
884
+ export class ToolValidationError extends ClientError {
885
+ toolName: string;
886
+ toolCallId: string;
887
+ validationErrors: object[];
888
+ constructor(toolName: string, toolCallId: string, validationErrors: object[], message: string) {
889
+ super(message, 400);
890
+ this.name = 'ToolValidationError';
891
+ this.toolName = toolName;
892
+ this.toolCallId = toolCallId;
893
+ this.validationErrors = validationErrors;
894
+ }
895
+ }