@qvac/sdk 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/NOTICE +15 -68
  2. package/dist/client/api/cancel.d.ts +1 -1
  3. package/dist/client/api/cancel.js +1 -1
  4. package/dist/client/api/completion-stream.d.ts +51 -12
  5. package/dist/client/api/completion-stream.js +129 -56
  6. package/dist/client/api/delete-cache.d.ts +1 -0
  7. package/dist/client/api/delete-cache.js +1 -0
  8. package/dist/client/api/diffusion.d.ts +17 -2
  9. package/dist/client/api/diffusion.js +21 -4
  10. package/dist/client/api/embed.d.ts +4 -0
  11. package/dist/client/api/finetune.d.ts +21 -0
  12. package/dist/client/api/get-loaded-model-info.d.ts +25 -0
  13. package/dist/client/api/get-loaded-model-info.js +36 -0
  14. package/dist/client/api/get-model-info.d.ts +9 -1
  15. package/dist/client/api/get-model-info.js +8 -0
  16. package/dist/client/api/heartbeat.d.ts +2 -2
  17. package/dist/client/api/heartbeat.js +2 -2
  18. package/dist/client/api/index.d.ts +3 -1
  19. package/dist/client/api/index.js +3 -1
  20. package/dist/client/api/invoke-plugin.d.ts +16 -0
  21. package/dist/client/api/invoke-plugin.js +16 -0
  22. package/dist/client/api/load-model.d.ts +36 -3
  23. package/dist/client/api/load-model.js +31 -10
  24. package/dist/client/api/provide.d.ts +11 -5
  25. package/dist/client/api/provide.js +11 -6
  26. package/dist/client/api/rag.d.ts +9 -0
  27. package/dist/client/api/rag.js +9 -0
  28. package/dist/client/api/registry.d.ts +26 -0
  29. package/dist/client/api/registry.js +26 -0
  30. package/dist/client/api/resume.d.ts +20 -4
  31. package/dist/client/api/resume.js +20 -4
  32. package/dist/client/api/state.d.ts +23 -0
  33. package/dist/client/api/state.js +29 -0
  34. package/dist/client/api/stop-provider.d.ts +11 -5
  35. package/dist/client/api/stop-provider.js +11 -5
  36. package/dist/client/api/suspend.d.ts +21 -3
  37. package/dist/client/api/suspend.js +21 -3
  38. package/dist/client/api/text-to-speech.d.ts +64 -6
  39. package/dist/client/api/text-to-speech.js +423 -47
  40. package/dist/client/api/transcribe.d.ts +29 -4
  41. package/dist/client/api/transcribe.js +86 -28
  42. package/dist/client/api/translate.d.ts +1 -0
  43. package/dist/client/api/translate.js +1 -0
  44. package/dist/client/rpc/bare-client.js +22 -1
  45. package/dist/client/rpc/expo-rpc-client.d.ts +1 -1
  46. package/dist/client/rpc/expo-rpc-client.js +96 -4
  47. package/dist/client/rpc/node-rpc-client.js +36 -0
  48. package/dist/examples/audio/mic-input.d.ts +9 -0
  49. package/dist/examples/audio/mic-input.js +111 -0
  50. package/dist/examples/completion-events.d.ts +18 -0
  51. package/dist/examples/completion-events.js +79 -0
  52. package/dist/examples/delegated-inference/composite.js +12 -18
  53. package/dist/examples/delegated-inference/consumer-profiled.js +4 -11
  54. package/dist/examples/delegated-inference/consumer.js +8 -13
  55. package/dist/examples/delegated-inference/provider.js +11 -16
  56. package/dist/examples/diffusion-flux2-klein-img2img.d.ts +2 -0
  57. package/dist/examples/diffusion-flux2-klein-img2img.js +60 -0
  58. package/dist/examples/diffusion-flux2-klein.js +1 -0
  59. package/dist/examples/diffusion-img2img.d.ts +2 -0
  60. package/dist/examples/diffusion-img2img.js +49 -0
  61. package/dist/examples/diffusion-txt2img.js +2 -1
  62. package/dist/examples/kv-cache-example.js +11 -12
  63. package/dist/examples/llamacpp-cache.d.ts +2 -0
  64. package/dist/examples/llamacpp-cache.js +107 -0
  65. package/dist/examples/llamacpp-dynamic-tools.d.ts +2 -0
  66. package/dist/examples/llamacpp-dynamic-tools.js +144 -0
  67. package/dist/examples/llamacpp-native-tools.js +2 -8
  68. package/dist/examples/llamacpp-structured-output.d.ts +2 -0
  69. package/dist/examples/llamacpp-structured-output.js +106 -0
  70. package/dist/examples/llamacpp-tools-pythonic.d.ts +2 -0
  71. package/dist/examples/llamacpp-tools-pythonic.js +69 -0
  72. package/dist/examples/plugins.js +4 -4
  73. package/dist/examples/suspend-resume.js +21 -4
  74. package/dist/examples/transcription/parakeet-microphone-record.js +6 -33
  75. package/dist/examples/transcription/whispercpp-filesystem-streaming.js +7 -5
  76. package/dist/examples/transcription/whispercpp-filesystem.js +12 -3
  77. package/dist/examples/transcription/whispercpp-microphone-record.js +6 -29
  78. package/dist/examples/translation/translation-stream.js +5 -5
  79. package/dist/examples/tts/llm-to-tts-streaming.d.ts +16 -0
  80. package/dist/examples/tts/llm-to-tts-streaming.js +143 -0
  81. package/dist/examples/tts/supertonic-multilingual.js +3 -3
  82. package/dist/examples/tts/supertonic.js +3 -3
  83. package/dist/examples/tts/utils.d.ts +11 -1
  84. package/dist/examples/tts/utils.js +70 -17
  85. package/dist/examples/voice-assistant/voice-assistant.d.ts +2 -0
  86. package/dist/examples/voice-assistant/voice-assistant.js +207 -0
  87. package/dist/expo/plugins/withMobileBundle.js +1 -1
  88. package/dist/index.d.ts +2 -2
  89. package/dist/index.js +2 -2
  90. package/dist/logging/logger.d.ts +11 -0
  91. package/dist/logging/logger.js +11 -0
  92. package/dist/logging/types.d.ts +18 -0
  93. package/dist/models/registry/models.d.ts +6620 -6185
  94. package/dist/models/registry/models.js +6296 -5318
  95. package/dist/models/update-models/codegen.js +84 -23
  96. package/dist/models/update-models/companions.d.ts +18 -0
  97. package/dist/models/update-models/companions.js +175 -0
  98. package/dist/models/update-models/naming.js +0 -25
  99. package/dist/models/update-models/registry.js +4 -2
  100. package/dist/models/update-models/types.d.ts +37 -9
  101. package/dist/profiling/index.d.ts +49 -0
  102. package/dist/profiling/index.js +49 -0
  103. package/dist/schemas/cancel.d.ts +6 -2
  104. package/dist/schemas/cancel.js +14 -7
  105. package/dist/schemas/common.d.ts +361 -279
  106. package/dist/schemas/common.js +26 -5
  107. package/dist/schemas/completion-event.d.ts +225 -0
  108. package/dist/schemas/completion-event.js +79 -0
  109. package/dist/schemas/completion-stream.d.ts +122 -31
  110. package/dist/schemas/completion-stream.js +137 -36
  111. package/dist/schemas/delegate.d.ts +0 -2
  112. package/dist/schemas/delegate.js +25 -6
  113. package/dist/schemas/download-asset.d.ts +5 -5
  114. package/dist/schemas/embed.js +21 -9
  115. package/dist/schemas/engine-addon-map.d.ts +11 -1
  116. package/dist/schemas/engine-addon-map.js +2 -2
  117. package/dist/schemas/finetune.d.ts +16 -16
  118. package/dist/schemas/finetune.js +8 -8
  119. package/dist/schemas/get-loaded-model-info.d.ts +52 -0
  120. package/dist/schemas/get-loaded-model-info.js +44 -0
  121. package/dist/schemas/get-model-info.d.ts +2 -2
  122. package/dist/schemas/get-model-info.js +103 -32
  123. package/dist/schemas/heartbeat.d.ts +0 -1
  124. package/dist/schemas/index.d.ts +4 -1
  125. package/dist/schemas/index.js +4 -1
  126. package/dist/schemas/llamacpp-config.d.ts +14 -4
  127. package/dist/schemas/llamacpp-config.js +5 -0
  128. package/dist/schemas/load-model.d.ts +3233 -1260
  129. package/dist/schemas/load-model.js +23 -16
  130. package/dist/schemas/model-src-utils.d.ts +7 -6
  131. package/dist/schemas/model-src-utils.js +27 -1
  132. package/dist/schemas/model-types.d.ts +4 -4
  133. package/dist/schemas/ocr.d.ts +1 -1
  134. package/dist/schemas/plugin.d.ts +27 -3
  135. package/dist/schemas/plugin.js +27 -2
  136. package/dist/schemas/profiling.js +11 -3
  137. package/dist/schemas/provide.d.ts +1 -3
  138. package/dist/schemas/provide.js +0 -3
  139. package/dist/schemas/rag.d.ts +4 -4
  140. package/dist/schemas/registry.d.ts +10 -10
  141. package/dist/schemas/registry.js +36 -14
  142. package/dist/schemas/reload-config.d.ts +73 -7
  143. package/dist/schemas/sdcpp-config.d.ts +16 -8
  144. package/dist/schemas/sdcpp-config.js +118 -25
  145. package/dist/schemas/sdk-config.d.ts +116 -90
  146. package/dist/schemas/sdk-config.js +16 -0
  147. package/dist/schemas/sdk-errors-client.d.ts +3 -0
  148. package/dist/schemas/sdk-errors-client.js +16 -1
  149. package/dist/schemas/sdk-errors-server.d.ts +3 -0
  150. package/dist/schemas/sdk-errors-server.js +23 -0
  151. package/dist/schemas/state.d.ts +23 -0
  152. package/dist/schemas/state.js +14 -0
  153. package/dist/schemas/stop-provide.d.ts +0 -5
  154. package/dist/schemas/stop-provide.js +2 -6
  155. package/dist/schemas/text-to-speech.d.ts +93 -27
  156. package/dist/schemas/text-to-speech.js +27 -0
  157. package/dist/schemas/tools.d.ts +16 -0
  158. package/dist/schemas/tools.js +15 -0
  159. package/dist/schemas/transcription-config.d.ts +8 -8
  160. package/dist/schemas/transcription.d.ts +33 -0
  161. package/dist/schemas/transcription.js +9 -0
  162. package/dist/schemas/translate.js +59 -19
  163. package/dist/schemas/translation-config.d.ts +157 -133
  164. package/dist/schemas/translation-config.js +34 -11
  165. package/dist/server/bare/delegate-rpc-client.d.ts +1 -1
  166. package/dist/server/bare/delegate-rpc-client.js +131 -122
  167. package/dist/server/bare/hyperswarm.d.ts +2 -2
  168. package/dist/server/bare/hyperswarm.js +12 -7
  169. package/dist/server/bare/ops/cancel.js +7 -0
  170. package/dist/server/bare/ops/kv-cache-utils.d.ts +7 -10
  171. package/dist/server/bare/ops/kv-cache-utils.js +31 -40
  172. package/dist/server/bare/ops/load-model.js +0 -1
  173. package/dist/server/bare/ops/transcribe.d.ts +11 -4
  174. package/dist/server/bare/ops/transcribe.js +25 -4
  175. package/dist/server/bare/ops/translate.js +42 -4
  176. package/dist/server/bare/ops/unload-model.js +21 -19
  177. package/dist/server/bare/plugins/llamacpp-completion/ops/cache-logger.js +1 -2
  178. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.d.ts +13 -8
  179. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +257 -85
  180. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.d.ts +101 -0
  181. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.js +135 -0
  182. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +83 -26
  183. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +57 -32
  184. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +10 -16
  185. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +69 -44
  186. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +113 -94
  187. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +1 -1
  188. package/dist/server/bare/plugins/onnx-ocr/plugin.js +1 -2
  189. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech-stream.d.ts +7 -0
  190. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech-stream.js +116 -0
  191. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.d.ts +2 -3
  192. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.js +71 -9
  193. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +41 -13
  194. package/dist/server/bare/plugins/onnx-tts/plugin.js +48 -3
  195. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +15 -7
  196. package/dist/server/bare/plugins/parakeet-transcription/plugin.js +5 -6
  197. package/dist/server/bare/plugins/sdcpp-generation/ops/diffusion.js +6 -0
  198. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +8 -5
  199. package/dist/server/bare/plugins/sdcpp-generation/plugin.js +13 -13
  200. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +17 -1
  201. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +40 -17
  202. package/dist/server/bare/registry/config-registry.js +14 -3
  203. package/dist/server/bare/registry/model-registry.d.ts +8 -10
  204. package/dist/server/bare/registry/model-registry.js +17 -12
  205. package/dist/server/bare/registry/registry-client.js +79 -19
  206. package/dist/server/bare/runtime-lifecycle.d.ts +2 -1
  207. package/dist/server/bare/runtime-lifecycle.js +13 -2
  208. package/dist/server/bare/types/addon-responses.d.ts +8 -3
  209. package/dist/server/bare/utils/transcribe-metadata.d.ts +21 -0
  210. package/dist/server/bare/utils/transcribe-metadata.js +28 -0
  211. package/dist/server/bare/utils/tts-stats.d.ts +22 -0
  212. package/dist/server/bare/utils/tts-stats.js +10 -0
  213. package/dist/server/rpc/create-server.d.ts +4 -1
  214. package/dist/server/rpc/create-server.js +5 -1
  215. package/dist/server/rpc/delegate-transport.js +36 -29
  216. package/dist/server/rpc/handle-request.js +28 -3
  217. package/dist/server/rpc/handler-registry.js +7 -1
  218. package/dist/server/rpc/handler-utils.d.ts +5 -0
  219. package/dist/server/rpc/handler-utils.js +22 -0
  220. package/dist/server/rpc/handlers/cancel-delegated.js +3 -5
  221. package/dist/server/rpc/handlers/cancelHandler.js +4 -5
  222. package/dist/server/rpc/handlers/completion-stream-delegated.js +14 -5
  223. package/dist/server/rpc/handlers/delete-cache.js +8 -3
  224. package/dist/server/rpc/handlers/download-asset.js +3 -24
  225. package/dist/server/rpc/handlers/get-loaded-model-info.d.ts +3 -0
  226. package/dist/server/rpc/handlers/get-loaded-model-info.js +39 -0
  227. package/dist/server/rpc/handlers/get-model-info.js +93 -84
  228. package/dist/server/rpc/handlers/heartbeat-delegated.js +2 -2
  229. package/dist/server/rpc/handlers/index.d.ts +6 -0
  230. package/dist/server/rpc/handlers/index.js +6 -0
  231. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +35 -9
  232. package/dist/server/rpc/handlers/load-model/download-manager.js +142 -38
  233. package/dist/server/rpc/handlers/load-model/download-stats.d.ts +5 -4
  234. package/dist/server/rpc/handlers/load-model/download-stats.js +49 -8
  235. package/dist/server/rpc/handlers/load-model/handler.js +31 -50
  236. package/dist/server/rpc/handlers/load-model/http.d.ts +2 -2
  237. package/dist/server/rpc/handlers/load-model/http.js +97 -142
  238. package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +2 -2
  239. package/dist/server/rpc/handlers/load-model/hyperdrive.js +55 -74
  240. package/dist/server/rpc/handlers/load-model/index.d.ts +0 -1
  241. package/dist/server/rpc/handlers/load-model/index.js +0 -1
  242. package/dist/server/rpc/handlers/load-model/registry-client-options.d.ts +27 -0
  243. package/dist/server/rpc/handlers/load-model/registry-client-options.js +19 -0
  244. package/dist/server/rpc/handlers/load-model/registry-companion-set.d.ts +22 -0
  245. package/dist/server/rpc/handlers/load-model/registry-companion-set.js +208 -0
  246. package/dist/server/rpc/handlers/load-model/registry-download-utils.d.ts +24 -0
  247. package/dist/server/rpc/handlers/load-model/registry-download-utils.js +114 -0
  248. package/dist/server/rpc/handlers/load-model/registry.d.ts +2 -20
  249. package/dist/server/rpc/handlers/load-model/registry.js +109 -381
  250. package/dist/server/rpc/handlers/load-model/resolve-session.d.ts +15 -0
  251. package/dist/server/rpc/handlers/load-model/resolve-session.js +61 -0
  252. package/dist/server/rpc/handlers/load-model/resolve.d.ts +3 -3
  253. package/dist/server/rpc/handlers/load-model/resolve.js +14 -23
  254. package/dist/server/rpc/handlers/load-model/types.d.ts +11 -4
  255. package/dist/server/rpc/handlers/load-model/types.js +28 -1
  256. package/dist/server/rpc/handlers/load-model-delegated.js +2 -4
  257. package/dist/server/rpc/handlers/plugin-dispatch.js +9 -5
  258. package/dist/server/rpc/handlers/plugin-invoke.js +1 -1
  259. package/dist/server/rpc/handlers/provideHandler/connection.js +13 -2
  260. package/dist/server/rpc/handlers/provideHandler/handler.js +42 -29
  261. package/dist/server/rpc/handlers/state.d.ts +3 -0
  262. package/dist/server/rpc/handlers/state.js +7 -0
  263. package/dist/server/rpc/handlers/stopProvideHandler.d.ts +2 -2
  264. package/dist/server/rpc/handlers/stopProvideHandler.js +12 -7
  265. package/dist/server/rpc/handlers/text-to-speech-stream.d.ts +3 -0
  266. package/dist/server/rpc/handlers/text-to-speech-stream.js +4 -0
  267. package/dist/server/rpc/handlers/unload-model-delegated.js +3 -3
  268. package/dist/server/rpc/profiling/operation-metrics.js +20 -0
  269. package/dist/server/rpc/rpc-utils.js +1 -1
  270. package/dist/server/rpc/transport-selector.d.ts +3 -0
  271. package/dist/server/rpc/transport-selector.js +18 -0
  272. package/dist/server/utils/cache/auto-history.d.ts +4 -0
  273. package/dist/server/utils/cache/auto-history.js +22 -0
  274. package/dist/server/utils/{cache.d.ts → cache/paths.d.ts} +22 -5
  275. package/dist/server/utils/{cache.js → cache/paths.js} +36 -20
  276. package/dist/server/utils/cache/types.d.ts +8 -0
  277. package/dist/server/utils/cache/types.js +1 -0
  278. package/dist/server/utils/checksum.d.ts +2 -2
  279. package/dist/server/utils/checksum.js +1 -1
  280. package/dist/server/utils/clear-storage.d.ts +5 -0
  281. package/dist/server/utils/clear-storage.js +17 -0
  282. package/dist/server/utils/completion-normalizer.d.ts +17 -0
  283. package/dist/server/utils/completion-normalizer.js +301 -0
  284. package/dist/server/utils/expand-gguf-shards.d.ts +3 -0
  285. package/dist/server/utils/expand-gguf-shards.js +22 -0
  286. package/dist/server/utils/formatting.js +1 -1
  287. package/dist/server/utils/index.d.ts +4 -2
  288. package/dist/server/utils/index.js +4 -2
  289. package/dist/server/utils/qvac-paths.d.ts +2 -0
  290. package/dist/server/utils/qvac-paths.js +5 -0
  291. package/dist/server/utils/response-format.d.ts +3 -0
  292. package/dist/server/utils/response-format.js +20 -0
  293. package/dist/server/utils/tool-integration.d.ts +15 -4
  294. package/dist/server/utils/tool-integration.js +21 -41
  295. package/dist/server/utils/tools/dialect.d.ts +8 -0
  296. package/dist/server/utils/tools/dialect.js +12 -0
  297. package/dist/server/utils/tools/index.d.ts +3 -0
  298. package/dist/server/utils/tools/index.js +2 -0
  299. package/dist/server/utils/tools/parser.d.ts +6 -0
  300. package/dist/server/utils/tools/parser.js +40 -0
  301. package/dist/server/utils/tools/parsers/hermes.d.ts +4 -0
  302. package/dist/server/utils/tools/parsers/hermes.js +100 -0
  303. package/dist/server/utils/tools/parsers/json.d.ts +6 -0
  304. package/dist/server/utils/tools/parsers/json.js +115 -0
  305. package/dist/server/utils/tools/parsers/pythonic.d.ts +4 -0
  306. package/dist/server/utils/tools/parsers/pythonic.js +267 -0
  307. package/dist/server/utils/tools/shared.d.ts +18 -0
  308. package/dist/server/utils/tools/shared.js +54 -0
  309. package/dist/server/utils/worker-lock.d.ts +3 -0
  310. package/dist/server/utils/worker-lock.js +67 -0
  311. package/dist/server/worker-core.d.ts +16 -1
  312. package/dist/server/worker-core.js +114 -14
  313. package/dist/utils/aggregate-events.d.ts +16 -0
  314. package/dist/utils/aggregate-events.js +52 -0
  315. package/dist/utils/cache-normalize.d.ts +10 -0
  316. package/dist/utils/cache-normalize.js +23 -0
  317. package/dist/utils/encoding.d.ts +8 -0
  318. package/dist/utils/encoding.js +13 -0
  319. package/dist/utils/errors-client.d.ts +12 -0
  320. package/dist/utils/errors-client.js +20 -0
  321. package/dist/utils/errors-server.d.ts +14 -0
  322. package/dist/utils/errors-server.js +31 -0
  323. package/dist/utils/load-model-validation.d.ts +7 -0
  324. package/dist/utils/load-model-validation.js +18 -0
  325. package/expo/plugins/patches/android-link.mjs +1 -1
  326. package/expo/plugins/patches/ios-link.mjs +1 -1
  327. package/package.json +15 -19
  328. package/dist/examples/translation/translation-opus.d.ts +0 -2
  329. package/dist/examples/translation/translation-opus.js +0 -33
  330. package/dist/server/bare/utils/loader-adapter.d.ts +0 -7
  331. package/dist/server/bare/utils/loader-adapter.js +0 -9
  332. package/dist/server/utils/model-path.d.ts +0 -5
  333. package/dist/server/utils/model-path.js +0 -7
  334. package/dist/server/utils/tool-parser.d.ts +0 -7
  335. package/dist/server/utils/tool-parser.js +0 -248
@@ -0,0 +1,4 @@
1
+ import type { Tool } from "../../../../schemas/index";
2
+ import { type ParserResult } from "../shared";
3
+ export declare function parseHermesFormat(text: string, tools: Tool[]): ParserResult;
4
+ //# sourceMappingURL=hermes.d.ts.map
@@ -0,0 +1,100 @@
1
+ import { generateStableToolCallId, isValidToolCall, validateToolArguments, } from "../shared.js";
2
+ // Hermes-style: JSON payload wrapped in `<tool_call>...</tool_call>` tags
3
+ export function parseHermesFormat(text, tools) {
4
+ const toolCalls = [];
5
+ const errors = [];
6
+ if (!text.includes("<tool_call>")) {
7
+ return { matched: false, toolCalls, errors };
8
+ }
9
+ // Incomplete frame: open marker without close (cutoff/abort). Recover
10
+ // the inner buffer here — fallthrough to JSON parsers can't strip the
11
+ // `<tool_call>` prefix on its own.
12
+ if (!text.includes("</tool_call>")) {
13
+ return recoverIncompleteHermesFrame(text, tools);
14
+ }
15
+ const toolCallRegex = /<tool_call>\s*({[\s\S]*?})\s*<\/tool_call>/g;
16
+ const matches = Array.from(text.matchAll(toolCallRegex));
17
+ for (const match of matches) {
18
+ const callJson = match[1];
19
+ if (!callJson)
20
+ continue;
21
+ const trimmedJson = callJson.trim();
22
+ let callItem;
23
+ try {
24
+ callItem = JSON.parse(trimmedJson);
25
+ }
26
+ catch (error) {
27
+ errors.push({
28
+ code: "PARSE_ERROR",
29
+ message: `Failed to parse Hermes tool call: ${error instanceof Error ? error.message : String(error)}`,
30
+ raw: trimmedJson,
31
+ });
32
+ continue;
33
+ }
34
+ if (!isValidToolCall(callItem)) {
35
+ errors.push({
36
+ code: "PARSE_ERROR",
37
+ message: "Hermes tool call is missing name/arguments",
38
+ raw: trimmedJson,
39
+ });
40
+ continue;
41
+ }
42
+ const call = callItem;
43
+ const validation = validateToolArguments(call.name, call.arguments, tools);
44
+ if (!validation.isValid && validation.error) {
45
+ errors.push({
46
+ ...validation.error,
47
+ raw: trimmedJson,
48
+ });
49
+ continue;
50
+ }
51
+ toolCalls.push({
52
+ id: call.id || generateStableToolCallId(call.name, call.arguments),
53
+ name: call.name,
54
+ arguments: call.arguments,
55
+ raw: trimmedJson,
56
+ });
57
+ }
58
+ return { matched: true, toolCalls, errors };
59
+ }
60
+ // Strips a possible truncated close-tag tail (`</tool`, `</tool_c`)
61
+ // before parsing. Bounded to buffers that actually contain the open marker.
62
+ function recoverIncompleteHermesFrame(text, tools) {
63
+ const openIdx = text.indexOf("<tool_call>");
64
+ const inner = text.slice(openIdx + "<tool_call>".length).trim();
65
+ const partialCloseIdx = inner.search(/<\/tool/);
66
+ const candidate = partialCloseIdx === -1 ? inner : inner.slice(0, partialCloseIdx).trim();
67
+ if (candidate.length === 0) {
68
+ return { matched: false, toolCalls: [], errors: [] };
69
+ }
70
+ let parsed;
71
+ try {
72
+ parsed = JSON.parse(candidate);
73
+ }
74
+ catch {
75
+ return { matched: false, toolCalls: [], errors: [] };
76
+ }
77
+ if (!isValidToolCall(parsed)) {
78
+ return { matched: false, toolCalls: [], errors: [] };
79
+ }
80
+ const validation = validateToolArguments(parsed.name, parsed.arguments, tools);
81
+ if (!validation.isValid && validation.error) {
82
+ return {
83
+ matched: true,
84
+ toolCalls: [],
85
+ errors: [{ ...validation.error, raw: candidate }],
86
+ };
87
+ }
88
+ return {
89
+ matched: true,
90
+ toolCalls: [
91
+ {
92
+ id: parsed.id || generateStableToolCallId(parsed.name, parsed.arguments),
93
+ name: parsed.name,
94
+ arguments: parsed.arguments,
95
+ raw: candidate,
96
+ },
97
+ ],
98
+ errors: [],
99
+ };
100
+ }
@@ -0,0 +1,6 @@
1
+ import type { Tool } from "../../../../schemas/index";
2
+ import { type ParserResult } from "../shared";
3
+ export declare function parseGemmaFormat(text: string, tools: Tool[]): ParserResult;
4
+ export declare function parseLlamacppFormat(text: string, tools: Tool[]): ParserResult;
5
+ export declare function parseGenericFormat(text: string, tools: Tool[]): ParserResult;
6
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1,115 @@
1
+ import { generateStableToolCallId, isValidToolCall, validateToolArguments, } from "../shared.js";
2
+ export function parseGemmaFormat(text, tools) {
3
+ const toolCalls = [];
4
+ const errors = [];
5
+ let parsed;
6
+ try {
7
+ parsed = JSON.parse(text);
8
+ }
9
+ catch {
10
+ return { matched: false, toolCalls, errors };
11
+ }
12
+ if (!parsed ||
13
+ typeof parsed !== "object" ||
14
+ !("tool_calls" in parsed) ||
15
+ !Array.isArray(parsed.tool_calls)) {
16
+ return { matched: false, toolCalls, errors };
17
+ }
18
+ for (const callItem of parsed.tool_calls) {
19
+ if (!isValidToolCall(callItem)) {
20
+ errors.push({
21
+ code: "PARSE_ERROR",
22
+ message: "Gemma tool_calls entry is missing name/arguments",
23
+ raw: JSON.stringify(callItem),
24
+ });
25
+ continue;
26
+ }
27
+ const call = callItem;
28
+ const validation = validateToolArguments(call.name, call.arguments, tools);
29
+ if (!validation.isValid && validation.error) {
30
+ errors.push({
31
+ ...validation.error,
32
+ raw: JSON.stringify(call),
33
+ });
34
+ continue;
35
+ }
36
+ toolCalls.push({
37
+ id: call.id || generateStableToolCallId(call.name, call.arguments),
38
+ name: call.name,
39
+ arguments: call.arguments,
40
+ raw: JSON.stringify(call),
41
+ });
42
+ }
43
+ return { matched: true, toolCalls, errors };
44
+ }
45
+ export function parseLlamacppFormat(text, tools) {
46
+ const toolCalls = [];
47
+ const errors = [];
48
+ let parsedItem;
49
+ try {
50
+ parsedItem = JSON.parse(text);
51
+ }
52
+ catch {
53
+ return { matched: false, toolCalls, errors };
54
+ }
55
+ if (!isValidToolCall(parsedItem)) {
56
+ return { matched: false, toolCalls, errors };
57
+ }
58
+ const parsed = parsedItem;
59
+ const validation = validateToolArguments(parsed.name, parsed.arguments, tools);
60
+ if (!validation.isValid && validation.error) {
61
+ errors.push({
62
+ ...validation.error,
63
+ raw: text,
64
+ });
65
+ }
66
+ else {
67
+ toolCalls.push({
68
+ id: parsed.id || generateStableToolCallId(parsed.name, parsed.arguments),
69
+ name: parsed.name,
70
+ arguments: parsed.arguments,
71
+ raw: text,
72
+ });
73
+ }
74
+ return { matched: true, toolCalls, errors };
75
+ }
76
+ // Last-resort fallback: loose JSON `{"name":..., "arguments":...}` objects
77
+ // anywhere in the text. Runs after dialect-specific parsers all miss.
78
+ export function parseGenericFormat(text, tools) {
79
+ const toolCalls = [];
80
+ const errors = [];
81
+ const jsonObjectRegex = /\{[\s\S]*?"name"[\s\S]*?"arguments"[\s\S]*?\}/g;
82
+ let match;
83
+ let matched = false;
84
+ while ((match = jsonObjectRegex.exec(text)) !== null) {
85
+ matched = true;
86
+ try {
87
+ const objItem = JSON.parse(match[0]);
88
+ if (isValidToolCall(objItem)) {
89
+ const obj = objItem;
90
+ const validation = validateToolArguments(obj.name, obj.arguments, tools);
91
+ if (!validation.isValid && validation.error) {
92
+ errors.push({
93
+ ...validation.error,
94
+ raw: match[0],
95
+ });
96
+ continue;
97
+ }
98
+ toolCalls.push({
99
+ id: obj.id || generateStableToolCallId(obj.name, obj.arguments),
100
+ name: obj.name,
101
+ arguments: obj.arguments,
102
+ raw: match[0],
103
+ });
104
+ }
105
+ }
106
+ catch (error) {
107
+ errors.push({
108
+ code: "PARSE_ERROR",
109
+ message: `Failed to parse generic tool call: ${error instanceof Error ? error.message : String(error)}`,
110
+ raw: match[0],
111
+ });
112
+ }
113
+ }
114
+ return { matched, toolCalls, errors };
115
+ }
@@ -0,0 +1,4 @@
1
+ import type { Tool } from "../../../../schemas/index";
2
+ import { type ParserResult } from "../shared";
3
+ export declare function parsePythonicFormat(text: string, tools: Tool[]): ParserResult;
4
+ //# sourceMappingURL=pythonic.d.ts.map
@@ -0,0 +1,267 @@
1
+ import { generateStableToolCallId, validateToolArguments, } from "../shared.js";
2
+ // Pythonic `[name(k=v), ...]` arrays. LFM 2.x is auto-routed; Llama-style
3
+ // tokens are kept for callers that opt in via `completion({ toolDialect:
4
+ // "pythonic" })` for a model known to emit Pythonic. Pure string parsing —
5
+ // no eval/vm/Function (untrusted model output).
6
+ const PYTHONIC_LFM_OPEN = "<|tool_call_start|>";
7
+ const PYTHONIC_LFM_CLOSE = "<|tool_call_end|>";
8
+ const PYTHONIC_LLAMA_OPEN = "<|start_header_id|>tool_call<|end_header_id|>";
9
+ const PYTHONIC_LLAMA_CLOSE = "<|eot_id|>";
10
+ function locatePythonicCallList(text) {
11
+ const lfmStart = text.indexOf(PYTHONIC_LFM_OPEN);
12
+ if (lfmStart !== -1) {
13
+ const after = text.slice(lfmStart + PYTHONIC_LFM_OPEN.length);
14
+ const end = after.indexOf(PYTHONIC_LFM_CLOSE);
15
+ return end === -1 ? after : after.slice(0, end);
16
+ }
17
+ const llamaStart = text.indexOf(PYTHONIC_LLAMA_OPEN);
18
+ if (llamaStart !== -1) {
19
+ const after = text.slice(llamaStart + PYTHONIC_LLAMA_OPEN.length);
20
+ const end = after.indexOf(PYTHONIC_LLAMA_CLOSE);
21
+ return end === -1 ? after : after.slice(0, end);
22
+ }
23
+ // Identifier+`(` requirement rejects JSON arrays and plain bracketed lists.
24
+ const bareMatch = /\[\s*[A-Za-z_]\w*\s*\(/.exec(text);
25
+ if (bareMatch)
26
+ return text.slice(bareMatch.index);
27
+ return null;
28
+ }
29
+ function pyPeek(s, offset = 0) {
30
+ return s.text[s.pos + offset] ?? "";
31
+ }
32
+ function pyConsume(s) {
33
+ const c = s.text[s.pos] ?? "";
34
+ s.pos++;
35
+ return c;
36
+ }
37
+ function pySkipWs(s) {
38
+ while (/\s/.test(pyPeek(s)))
39
+ s.pos++;
40
+ }
41
+ function pyParseString(s) {
42
+ const quote = pyConsume(s);
43
+ let out = "";
44
+ while (s.pos < s.text.length && pyPeek(s) !== quote) {
45
+ if (pyPeek(s) === "\\") {
46
+ s.pos++;
47
+ const esc = pyConsume(s);
48
+ switch (esc) {
49
+ case "n":
50
+ out += "\n";
51
+ break;
52
+ case "t":
53
+ out += "\t";
54
+ break;
55
+ case "r":
56
+ out += "\r";
57
+ break;
58
+ case "\\":
59
+ out += "\\";
60
+ break;
61
+ case "'":
62
+ out += "'";
63
+ break;
64
+ case '"':
65
+ out += '"';
66
+ break;
67
+ case "0":
68
+ out += "\0";
69
+ break;
70
+ default:
71
+ out += esc;
72
+ break;
73
+ }
74
+ }
75
+ else {
76
+ out += pyConsume(s);
77
+ }
78
+ }
79
+ if (s.pos >= s.text.length) {
80
+ throw new Error("Unterminated string literal");
81
+ }
82
+ pyConsume(s);
83
+ return out;
84
+ }
85
+ function pyParseNumber(s) {
86
+ const start = s.pos;
87
+ if (pyPeek(s) === "-" || pyPeek(s) === "+")
88
+ s.pos++;
89
+ while (/\d/.test(pyPeek(s)))
90
+ s.pos++;
91
+ if (pyPeek(s) === ".") {
92
+ s.pos++;
93
+ while (/\d/.test(pyPeek(s)))
94
+ s.pos++;
95
+ }
96
+ if (pyPeek(s) === "e" || pyPeek(s) === "E") {
97
+ s.pos++;
98
+ if (pyPeek(s) === "-" || pyPeek(s) === "+")
99
+ s.pos++;
100
+ while (/\d/.test(pyPeek(s)))
101
+ s.pos++;
102
+ }
103
+ const literal = s.text.slice(start, s.pos);
104
+ const n = Number(literal);
105
+ if (Number.isNaN(n) || literal.length === 0) {
106
+ throw new Error(`Invalid number literal: ${JSON.stringify(literal)}`);
107
+ }
108
+ return n;
109
+ }
110
+ function pyParseIdentifier(s) {
111
+ if (!/[A-Za-z_]/.test(pyPeek(s))) {
112
+ throw new Error(`Expected identifier, got ${JSON.stringify(pyPeek(s))}`);
113
+ }
114
+ const start = s.pos;
115
+ while (/[\w]/.test(pyPeek(s)))
116
+ s.pos++;
117
+ return s.text.slice(start, s.pos);
118
+ }
119
+ // Identifier-as-string fallback: any bare word that isn't `True`/`False`/`None`
120
+ // is returned as a string, so `[get_weather(city=Paris)]` still produces
121
+ // `{ city: "Paris" }`. Side-effect: lowercase `null` / `true` / `false` from
122
+ // JS-trained models also coerce to strings — validate against your tool schema.
123
+ function pyParseValue(s) {
124
+ pySkipWs(s);
125
+ const c = pyPeek(s);
126
+ if (c === '"' || c === "'")
127
+ return pyParseString(s);
128
+ if (c === "[")
129
+ return pyParseList(s);
130
+ if (c === "{")
131
+ return pyParseDict(s);
132
+ if (c === "-" || c === "+" || /\d/.test(c))
133
+ return pyParseNumber(s);
134
+ if (/[A-Za-z_]/.test(c)) {
135
+ const id = pyParseIdentifier(s);
136
+ if (id === "True")
137
+ return true;
138
+ if (id === "False")
139
+ return false;
140
+ if (id === "None")
141
+ return null;
142
+ return id;
143
+ }
144
+ throw new Error(`Unexpected character: ${JSON.stringify(c)}`);
145
+ }
146
+ // Drives `parseItem, sep, parseItem, sep, ..., close` loops with trailing-
147
+ // comma tolerance. Assumes the open delimiter was already consumed.
148
+ function pyParseDelimited(s, close, context, parseItem) {
149
+ pySkipWs(s);
150
+ if (pyPeek(s) === close) {
151
+ pyConsume(s);
152
+ return;
153
+ }
154
+ for (;;) {
155
+ pySkipWs(s);
156
+ parseItem();
157
+ pySkipWs(s);
158
+ const sep = pyPeek(s);
159
+ if (sep === ",") {
160
+ pyConsume(s);
161
+ pySkipWs(s);
162
+ if (pyPeek(s) === close) {
163
+ pyConsume(s);
164
+ return;
165
+ }
166
+ }
167
+ else if (sep === close) {
168
+ pyConsume(s);
169
+ return;
170
+ }
171
+ else {
172
+ throw new Error(`Expected , or ${close} in ${context}, got ${JSON.stringify(sep)}`);
173
+ }
174
+ }
175
+ }
176
+ function pyParseList(s) {
177
+ pyConsume(s);
178
+ const items = [];
179
+ pyParseDelimited(s, "]", "list", () => {
180
+ items.push(pyParseValue(s));
181
+ });
182
+ return items;
183
+ }
184
+ function pyParseDict(s) {
185
+ pyConsume(s);
186
+ const obj = {};
187
+ pyParseDelimited(s, "}", "dict", () => {
188
+ const c = pyPeek(s);
189
+ let key;
190
+ if (c === '"' || c === "'")
191
+ key = pyParseString(s);
192
+ else if (/[A-Za-z_]/.test(c))
193
+ key = pyParseIdentifier(s);
194
+ else
195
+ throw new Error(`Expected dict key, got ${JSON.stringify(c)}`);
196
+ pySkipWs(s);
197
+ if (pyConsume(s) !== ":") {
198
+ throw new Error(`Expected : after dict key "${key}"`);
199
+ }
200
+ obj[key] = pyParseValue(s);
201
+ });
202
+ return obj;
203
+ }
204
+ function pyParseArgList(s) {
205
+ const args = {};
206
+ pyParseDelimited(s, ")", "args", () => {
207
+ const key = pyParseIdentifier(s);
208
+ pySkipWs(s);
209
+ if (pyConsume(s) !== "=") {
210
+ throw new Error(`Expected = after arg name "${key}"`);
211
+ }
212
+ args[key] = pyParseValue(s);
213
+ });
214
+ return args;
215
+ }
216
+ function pyParseCallList(text) {
217
+ const s = { text, pos: 0 };
218
+ pySkipWs(s);
219
+ if (pyConsume(s) !== "[") {
220
+ throw new Error("Expected [ at start of call list");
221
+ }
222
+ const calls = [];
223
+ pyParseDelimited(s, "]", "call list", () => {
224
+ const name = pyParseIdentifier(s);
225
+ pySkipWs(s);
226
+ if (pyConsume(s) !== "(") {
227
+ throw new Error(`Expected ( after call name "${name}"`);
228
+ }
229
+ calls.push({ name, arguments: pyParseArgList(s) });
230
+ });
231
+ return calls;
232
+ }
233
+ export function parsePythonicFormat(text, tools) {
234
+ const toolCalls = [];
235
+ const errors = [];
236
+ const slice = locatePythonicCallList(text);
237
+ if (slice === null) {
238
+ return { matched: false, toolCalls, errors };
239
+ }
240
+ let calls;
241
+ try {
242
+ calls = pyParseCallList(slice);
243
+ }
244
+ catch (error) {
245
+ errors.push({
246
+ code: "PARSE_ERROR",
247
+ message: `Failed to parse Pythonic tool call list: ${error instanceof Error ? error.message : String(error)}`,
248
+ raw: slice,
249
+ });
250
+ return { matched: true, toolCalls, errors };
251
+ }
252
+ for (const call of calls) {
253
+ const raw = `${call.name}(${JSON.stringify(call.arguments)})`;
254
+ const validation = validateToolArguments(call.name, call.arguments, tools);
255
+ if (!validation.isValid && validation.error) {
256
+ errors.push({ ...validation.error, raw });
257
+ continue;
258
+ }
259
+ toolCalls.push({
260
+ id: generateStableToolCallId(call.name, call.arguments),
261
+ name: call.name,
262
+ arguments: call.arguments,
263
+ raw,
264
+ });
265
+ }
266
+ return { matched: true, toolCalls, errors };
267
+ }
@@ -0,0 +1,18 @@
1
+ import type { Tool, ToolCall, ToolCallError } from "../../../schemas/index";
2
+ export type ParserResult = {
3
+ matched: boolean;
4
+ toolCalls: ToolCall[];
5
+ errors: ToolCallError[];
6
+ };
7
+ export declare function stripThinkingBlocks(text: string): string;
8
+ export declare function generateStableToolCallId(name: string, args: Record<string, unknown>): string;
9
+ export declare function isValidToolCall(obj: unknown): obj is {
10
+ name: string;
11
+ arguments: Record<string, unknown>;
12
+ id?: string;
13
+ };
14
+ export declare function validateToolArguments(toolName: string, args: Record<string, unknown>, tools: Tool[]): {
15
+ isValid: boolean;
16
+ error?: ToolCallError;
17
+ };
18
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1,54 @@
1
+ export function stripThinkingBlocks(text) {
2
+ return text.replace(/<think>[\s\S]*?<\/think>/gi, "");
3
+ }
4
+ let toolCallSequence = 0;
5
+ export function generateStableToolCallId(name, args) {
6
+ const content = `${name}:${JSON.stringify(args)}`;
7
+ let hash = 0;
8
+ for (let i = 0; i < content.length; i++) {
9
+ const char = content.charCodeAt(i);
10
+ hash = (hash << 5) - hash + char;
11
+ hash = hash & hash;
12
+ }
13
+ const sequence = toolCallSequence++;
14
+ return `call_${Math.abs(hash).toString(36)}_${sequence}`;
15
+ }
16
+ export function isValidToolCall(obj) {
17
+ if (!obj || typeof obj !== "object") {
18
+ return false;
19
+ }
20
+ if (!("name" in obj) || typeof obj.name !== "string") {
21
+ return false;
22
+ }
23
+ if (!("arguments" in obj) ||
24
+ typeof obj.arguments !== "object" ||
25
+ obj.arguments === null) {
26
+ return false;
27
+ }
28
+ return true;
29
+ }
30
+ export function validateToolArguments(toolName, args, tools) {
31
+ const tool = tools.find((t) => t.name === toolName);
32
+ if (!tool) {
33
+ return {
34
+ isValid: false,
35
+ error: {
36
+ code: "UNKNOWN_TOOL",
37
+ message: `Tool "${toolName}" not found in available tools`,
38
+ },
39
+ };
40
+ }
41
+ const required = tool.parameters.required || [];
42
+ for (const requiredParam of required) {
43
+ if (!(requiredParam in args)) {
44
+ return {
45
+ isValid: false,
46
+ error: {
47
+ code: "VALIDATION_ERROR",
48
+ message: `Missing required parameter "${requiredParam}" for tool "${toolName}"`,
49
+ },
50
+ };
51
+ }
52
+ }
53
+ return { isValid: true };
54
+ }
@@ -0,0 +1,3 @@
1
+ export declare function acquireWorkerLock(): void;
2
+ export declare function releaseWorkerLock(): void;
3
+ //# sourceMappingURL=worker-lock.d.ts.map
@@ -0,0 +1,67 @@
1
+ import fs from "bare-fs";
2
+ import path from "bare-path";
3
+ import process from "bare-process";
4
+ import { getServerLogger } from "../../logging/index.js";
5
+ import { getQvacPath } from "./qvac-paths.js";
6
+ const logger = getServerLogger();
7
+ const LOCK_FILENAME = ".worker.lock";
8
+ function getLockFilePath() {
9
+ return getQvacPath(LOCK_FILENAME);
10
+ }
11
+ function isProcessAlive(pid) {
12
+ try {
13
+ process.kill(pid, 0);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ function readLockFile(lockPath) {
21
+ try {
22
+ if (!fs.existsSync(lockPath))
23
+ return null;
24
+ const raw = fs.readFileSync(lockPath, "utf-8");
25
+ return JSON.parse(raw);
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ export function acquireWorkerLock() {
32
+ const lockPath = getLockFilePath();
33
+ const existing = readLockFile(lockPath);
34
+ if (existing) {
35
+ if (isProcessAlive(existing.pid)) {
36
+ logger.warn(`Another worker (PID ${existing.pid}) is still running — lock file exists at ${lockPath}`);
37
+ }
38
+ else {
39
+ logger.warn(`Stale lock file detected (PID ${existing.pid} is dead, started ${existing.startedAt}). Removing.`);
40
+ }
41
+ }
42
+ const content = {
43
+ pid: process.pid,
44
+ startedAt: new Date().toISOString(),
45
+ };
46
+ try {
47
+ fs.mkdirSync(path.dirname(lockPath), { recursive: true });
48
+ fs.writeFileSync(lockPath, JSON.stringify(content));
49
+ logger.debug(`Worker lock acquired (PID ${process.pid})`);
50
+ }
51
+ catch (error) {
52
+ logger.error("Failed to write worker lock file:", error instanceof Error ? error.message : String(error));
53
+ }
54
+ }
55
+ export function releaseWorkerLock() {
56
+ const lockPath = getLockFilePath();
57
+ try {
58
+ const existing = readLockFile(lockPath);
59
+ if (existing && existing.pid === process.pid) {
60
+ fs.unlinkSync(lockPath);
61
+ logger.debug("Worker lock released");
62
+ }
63
+ }
64
+ catch {
65
+ // Best-effort — may already be gone
66
+ }
67
+ }
@@ -3,6 +3,21 @@ export declare function initializeWorkerCore(): {
3
3
  };
4
4
  export declare function ensureRPCSetup(): void;
5
5
  export declare function isCoreInitialized(): boolean;
6
- export type BareDirectShutdownReason = "signal" | "rpc-close";
6
+ export type BareDirectShutdownReason = "signal" | "rpc-close" | "uncaught-exception" | "unhandled-rejection" | "ipc-disconnect";
7
+ /**
8
+ * Pre-terminate cleanup, callable while the worker is still alive.
9
+ *
10
+ * On platforms where the worker lives in the same OS process as the JS host
11
+ * (i.e. mobile via react-native-bare-kit Worklet), `process.exit()` would
12
+ * kill the entire app. This path runs the same registry/model cleanup as
13
+ * `shutdownBareDirectWorker` but skips the lock release + exit, leaving the
14
+ * caller (typically the SDK client about to call `worklet.terminate()`)
15
+ * responsible for tearing the worker down.
16
+ *
17
+ * Critical for clean termination: addons hold static state with js_ref_t
18
+ * handles into the current V8 isolate; without this cleanup, those refs
19
+ * survive into the next worklet's isolate and crash on first access.
20
+ */
21
+ export declare function cleanupForTerminate(): Promise<void>;
7
22
  export declare function shutdownBareDirectWorker(reason: BareDirectShutdownReason): Promise<void>;
8
23
  //# sourceMappingURL=worker-core.d.ts.map