@bendyline/gezel-inference 1.0.2 → 1.0.4

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 (297) hide show
  1. package/dist/catalog/chat-models/de/deepseek-v4.1-flash-552b-q2/manifest.json +120 -0
  2. package/dist/catalog/chat-models/de/deepseek-v4.1-flash-552b-q2/versions/1.0.0/manifest.json +21 -0
  3. package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +6 -5
  4. package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.2/manifest.json +27 -0
  5. package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.3/manifest.json +27 -0
  6. package/dist/catalog/chat-models/index.json +1 -1
  7. package/dist/catalog/chat-models/na/nanbeige4.2-3b-q4/manifest.json +1 -1
  8. package/dist/catalog/chat-models/ne/nemotron3.5-bolt-74b-iq2/manifest.json +157 -0
  9. package/dist/catalog/chat-models/ne/nemotron3.5-bolt-74b-iq2/versions/1.0.0/manifest.json +30 -0
  10. package/dist/catalog/chat-models/ne/nemotron3.5-bolt-e4b-q4/manifest.json +142 -0
  11. package/dist/catalog/chat-models/ne/nemotron3.5-bolt-e4b-q4/versions/1.0.0/manifest.json +14 -0
  12. package/dist/catalog/chat-models/ne/nemotron3.5-bolt-e4b-q4/versions/1.0.1/manifest.json +14 -0
  13. package/dist/catalog/chat-models/ne/nemotron3.5-super-vl-120b-nvfp4/manifest.json +156 -0
  14. package/dist/catalog/chat-models/ne/nemotron3.5-super-vl-120b-nvfp4/versions/1.0.0/manifest.json +28 -0
  15. package/dist/catalog/chat-models/raw-index.json +1 -1
  16. package/dist/catalog/image-models/an/animagine-xl-4/manifest.json +40 -0
  17. package/dist/catalog/image-models/an/animagine-xl-4/versions/4.0.0/manifest.json +10 -0
  18. package/dist/catalog/image-models/an/animagine-xl-4/versions/4.0.1/manifest.json +16 -0
  19. package/dist/catalog/image-models/fl/flux-2-klein-4b-q4/manifest.json +44 -0
  20. package/dist/catalog/image-models/fl/flux-2-klein-4b-q4/versions/1.0.0/manifest.json +23 -0
  21. package/dist/catalog/image-models/fl/flux-2-klein-4b-q4/versions/1.0.1/manifest.json +29 -0
  22. package/dist/catalog/image-models/index.json +1 -0
  23. package/dist/catalog/image-models/ir/iris-3b-f32/manifest.json +41 -0
  24. package/dist/catalog/image-models/ir/iris-3b-f32/versions/1.0.0/manifest.json +19 -0
  25. package/dist/catalog/image-models/ir/iris-3b-f32/versions/1.0.1/manifest.json +25 -0
  26. package/dist/catalog/image-models/ir/iris-3b-f32/versions/1.0.2/manifest.json +25 -0
  27. package/dist/catalog/image-models/kr/krea-2-turbo-q4/manifest.json +42 -0
  28. package/dist/catalog/image-models/kr/krea-2-turbo-q4/versions/1.0.0/manifest.json +23 -0
  29. package/dist/catalog/image-models/kr/krea-2-turbo-q4/versions/1.0.1/manifest.json +29 -0
  30. package/dist/catalog/image-models/kr/krea-2-turbo-q6/manifest.json +42 -0
  31. package/dist/catalog/image-models/kr/krea-2-turbo-q6/versions/1.0.0/manifest.json +23 -0
  32. package/dist/catalog/image-models/kr/krea-2-turbo-q6/versions/1.0.1/manifest.json +29 -0
  33. package/dist/catalog/image-models/kr/krea-2-turbo-q8/manifest.json +42 -0
  34. package/dist/catalog/image-models/kr/krea-2-turbo-q8/versions/1.0.0/manifest.json +23 -0
  35. package/dist/catalog/image-models/kr/krea-2-turbo-q8/versions/1.0.1/manifest.json +29 -0
  36. package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/manifest.json +41 -0
  37. package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.0/manifest.json +31 -0
  38. package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.1/manifest.json +50 -0
  39. package/dist/catalog/image-models/mi/ming-image-0.1-design-bf16/versions/1.0.2/manifest.json +50 -0
  40. package/dist/catalog/image-models/mo/moss-image-sft-q4/manifest.json +40 -0
  41. package/dist/catalog/image-models/mo/moss-image-sft-q4/versions/1.0.0/manifest.json +37 -0
  42. package/dist/catalog/image-models/mo/moss-image-sft-q4/versions/1.0.1/manifest.json +37 -0
  43. package/dist/catalog/image-models/raw-index.json +1 -0
  44. package/dist/catalog/image-models/sd/sd-1.5/manifest.json +40 -0
  45. package/dist/catalog/image-models/sd/sd-1.5/versions/1.0.0/manifest.json +10 -0
  46. package/dist/catalog/image-models/sd/sd-1.5/versions/1.0.1/manifest.json +16 -0
  47. package/dist/catalog/image-models/sd/sd-turbo/manifest.json +40 -0
  48. package/dist/catalog/image-models/sd/sd-turbo/versions/1.0.0/manifest.json +10 -0
  49. package/dist/catalog/image-models/sd/sd-turbo/versions/1.0.1/manifest.json +16 -0
  50. package/dist/catalog/image-models/sd/sdxl-base-1.0/manifest.json +39 -0
  51. package/dist/catalog/image-models/sd/sdxl-base-1.0/versions/1.0.0/manifest.json +10 -0
  52. package/dist/catalog/image-models/sd/sdxl-base-1.0/versions/1.0.1/manifest.json +16 -0
  53. package/dist/catalog/image-models/sd/sdxl-lightning-4step/manifest.json +40 -0
  54. package/dist/catalog/image-models/sd/sdxl-lightning-4step/versions/1.0.0/manifest.json +10 -0
  55. package/dist/catalog/image-models/sd/sdxl-lightning-4step/versions/1.0.1/manifest.json +16 -0
  56. package/dist/catalog/image-models/sd/sdxl-turbo/manifest.json +41 -0
  57. package/dist/catalog/image-models/sd/sdxl-turbo/versions/1.0.0/manifest.json +10 -0
  58. package/dist/catalog/image-models/sd/sdxl-turbo/versions/1.0.1/manifest.json +16 -0
  59. package/dist/catalog/knowledge-catalogs/be/bendyline-how-to-books/keywords.json +56 -0
  60. package/dist/catalog/knowledge-catalogs/ca/caselaw-alaska-part-0001/keywords.json +12 -0
  61. package/dist/catalog/knowledge-catalogs/ca/caselaw-nevada-part-0001/keywords.json +13 -0
  62. package/dist/catalog/knowledge-catalogs/ca/caselaw-us-300-399-part-0001/keywords.json +14 -0
  63. package/dist/catalog/knowledge-catalogs/ca/caselaw-us-347-349/keywords.json +17 -0
  64. package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0001/keywords.json +12 -0
  65. package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0002/keywords.json +12 -0
  66. package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0001/keywords.json +12 -0
  67. package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0002/keywords.json +12 -0
  68. package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0003/keywords.json +12 -0
  69. package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0004/keywords.json +12 -0
  70. package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0005/keywords.json +12 -0
  71. package/dist/catalog/knowledge-catalogs/ca/caselaw-wyoming-part-0001/keywords.json +12 -0
  72. package/dist/catalog/knowledge-catalogs/index.json +1 -1
  73. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-aspnet-core-en/keywords.json +21 -0
  74. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-ai-platform-en/keywords.json +27 -0
  75. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-apps-compute-en/keywords.json +23 -0
  76. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-data-aiot-en/keywords.json +26 -0
  77. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-management-hybrid-en/keywords.json +28 -0
  78. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-network-security-en/keywords.json +29 -0
  79. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-dotnet-en/keywords.json +21 -0
  80. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-entity-framework-en/keywords.json +14 -0
  81. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-microsoft-365-en/keywords.json +20 -0
  82. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-powershell-en/keywords.json +24 -0
  83. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-sql-server-en/keywords.json +27 -0
  84. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-apps-en/keywords.json +18 -0
  85. package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-server-en/keywords.json +28 -0
  86. package/dist/catalog/knowledge-catalogs/raw-index.json +1 -1
  87. package/dist/catalog/knowledge-catalogs/re/regional-american-south/keywords.json +1700 -0
  88. package/dist/catalog/knowledge-catalogs/re/regional-american-south/versions/2026.10.5/manifest.json +133 -0
  89. package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/keywords.json +750 -0
  90. package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/versions/2026.10.5/manifest.json +133 -0
  91. package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/keywords.json +1281 -0
  92. package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/versions/2026.10.5/manifest.json +133 -0
  93. package/dist/catalog/knowledge-catalogs/re/regional-brazil/keywords.json +1125 -0
  94. package/dist/catalog/knowledge-catalogs/re/regional-brazil/versions/2026.10.5/manifest.json +133 -0
  95. package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/keywords.json +3287 -0
  96. package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/versions/2026.10.5/manifest.json +133 -0
  97. package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/keywords.json +1835 -0
  98. package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/versions/2026.10.5/manifest.json +133 -0
  99. package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/keywords.json +1184 -0
  100. package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/versions/2026.10.5/manifest.json +133 -0
  101. package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/keywords.json +1503 -0
  102. package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/versions/2026.10.5/manifest.json +133 -0
  103. package/dist/catalog/knowledge-catalogs/re/regional-east-asia/keywords.json +2836 -0
  104. package/dist/catalog/knowledge-catalogs/re/regional-east-asia/versions/2026.10.5/manifest.json +133 -0
  105. package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/keywords.json +813 -0
  106. package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/versions/2026.10.5/manifest.json +133 -0
  107. package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/keywords.json +2082 -0
  108. package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/versions/2026.10.5/manifest.json +133 -0
  109. package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/keywords.json +1481 -0
  110. package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/versions/2026.10.5/manifest.json +133 -0
  111. package/dist/catalog/knowledge-catalogs/re/regional-middle-east/keywords.json +1272 -0
  112. package/dist/catalog/knowledge-catalogs/re/regional-middle-east/versions/2026.10.5/manifest.json +133 -0
  113. package/dist/catalog/knowledge-catalogs/re/regional-midwest/keywords.json +758 -0
  114. package/dist/catalog/knowledge-catalogs/re/regional-midwest/versions/2026.10.5/manifest.json +133 -0
  115. package/dist/catalog/knowledge-catalogs/re/regional-north-africa/keywords.json +896 -0
  116. package/dist/catalog/knowledge-catalogs/re/regional-north-africa/versions/2026.10.5/manifest.json +133 -0
  117. package/dist/catalog/knowledge-catalogs/re/regional-northeast/keywords.json +1281 -0
  118. package/dist/catalog/knowledge-catalogs/re/regional-northeast/versions/2026.10.5/manifest.json +133 -0
  119. package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/keywords.json +346 -0
  120. package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/versions/2026.10.5/manifest.json +133 -0
  121. package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/keywords.json +2688 -0
  122. package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/versions/2026.10.5/manifest.json +133 -0
  123. package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/keywords.json +973 -0
  124. package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/versions/2026.10.5/manifest.json +133 -0
  125. package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/keywords.json +937 -0
  126. package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/versions/2026.10.5/manifest.json +133 -0
  127. package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/keywords.json +608 -0
  128. package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/versions/2026.10.5/manifest.json +133 -0
  129. package/dist/catalog/knowledge-catalogs/re/regional-south-asia/keywords.json +633 -0
  130. package/dist/catalog/knowledge-catalogs/re/regional-south-asia/versions/2026.10.5/manifest.json +133 -0
  131. package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/keywords.json +2697 -0
  132. package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/versions/2026.10.5/manifest.json +133 -0
  133. package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/keywords.json +606 -0
  134. package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/versions/2026.10.5/manifest.json +133 -0
  135. package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/keywords.json +564 -0
  136. package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/versions/2026.10.5/manifest.json +133 -0
  137. package/dist/catalog/knowledge-catalogs/re/regional-western-europe/keywords.json +3247 -0
  138. package/dist/catalog/knowledge-catalogs/re/regional-western-europe-east/manifest.json +47 -0
  139. package/dist/catalog/knowledge-catalogs/re/regional-western-europe-east/versions/2026.10.5/manifest.json +133 -0
  140. package/dist/catalog/knowledge-catalogs/re/regional-western-europe-west/manifest.json +47 -0
  141. package/dist/catalog/knowledge-catalogs/re/regional-western-europe-west/versions/2026.10.5/manifest.json +133 -0
  142. package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/keywords.json +5437 -0
  143. package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/manifest.json +1 -1
  144. package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/versions/2026.10.1/manifest.json +181 -0
  145. package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/keywords.json +4009 -0
  146. package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/manifest.json +1 -1
  147. package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/versions/2026.10.1/manifest.json +181 -0
  148. package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/keywords.json +4009 -0
  149. package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/manifest.json +1 -1
  150. package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/versions/2026.10.1/manifest.json +217 -0
  151. package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/keywords.json +5583 -0
  152. package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/manifest.json +1 -1
  153. package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/versions/2026.10.1/manifest.json +197 -0
  154. package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/keywords.json +6386 -0
  155. package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/manifest.json +2 -2
  156. package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/versions/2026.10.1/manifest.json +197 -0
  157. package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/keywords.json +4009 -0
  158. package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/manifest.json +1 -1
  159. package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/versions/2026.10.1/manifest.json +185 -0
  160. package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/keywords.json +5672 -0
  161. package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/manifest.json +1 -1
  162. package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/versions/2026.10.1/manifest.json +137 -0
  163. package/dist/catalog/knowledge-catalogs/wi/wikipedia-geography/manifest.json +68 -0
  164. package/dist/catalog/knowledge-catalogs/wi/wikipedia-geography/versions/2026.10.1/manifest.json +217 -0
  165. package/dist/catalog/knowledge-catalogs/wi/wikipedia-history/manifest.json +68 -0
  166. package/dist/catalog/knowledge-catalogs/wi/wikipedia-history/versions/2026.10.1/manifest.json +217 -0
  167. package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/keywords.json +4009 -0
  168. package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/manifest.json +1 -1
  169. package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/versions/2026.10.1/manifest.json +141 -0
  170. package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/keywords.json +4009 -0
  171. package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/manifest.json +1 -1
  172. package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/versions/2026.10.1/manifest.json +185 -0
  173. package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/keywords.json +5719 -0
  174. package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/manifest.json +1 -1
  175. package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/versions/2026.10.1/manifest.json +193 -0
  176. package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/keywords.json +4009 -0
  177. package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/manifest.json +1 -1
  178. package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/versions/2026.10.1/manifest.json +189 -0
  179. package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/keywords.json +16009 -0
  180. package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/manifest.json +1 -1
  181. package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/versions/2026.10.1/manifest.json +185 -0
  182. package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/keywords.json +5843 -0
  183. package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/manifest.json +1 -1
  184. package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/versions/2026.10.1/manifest.json +189 -0
  185. package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/keywords.json +6264 -0
  186. package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/manifest.json +1 -1
  187. package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/versions/2026.10.1/manifest.json +197 -0
  188. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-arts/manifest.json +66 -0
  189. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-arts/versions/2026.10.1/manifest.json +209 -0
  190. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-business/manifest.json +61 -0
  191. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-business/versions/2026.10.1/manifest.json +189 -0
  192. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-entertainment/manifest.json +64 -0
  193. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-entertainment/versions/2026.10.1/manifest.json +201 -0
  194. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-military/manifest.json +60 -0
  195. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-military/versions/2026.10.1/manifest.json +185 -0
  196. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-other/manifest.json +55 -0
  197. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-other/versions/2026.10.1/manifest.json +165 -0
  198. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-politics/manifest.json +63 -0
  199. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-politics/versions/2026.10.1/manifest.json +197 -0
  200. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-religion/manifest.json +64 -0
  201. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-religion/versions/2026.10.1/manifest.json +201 -0
  202. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-science/manifest.json +65 -0
  203. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-science/versions/2026.10.1/manifest.json +205 -0
  204. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-sports/manifest.json +73 -0
  205. package/dist/catalog/knowledge-catalogs/wi/wikipedia-people-sports/versions/2026.10.1/manifest.json +237 -0
  206. package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/keywords.json +5447 -0
  207. package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/manifest.json +1 -1
  208. package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/versions/2026.10.1/manifest.json +197 -0
  209. package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/keywords.json +4009 -0
  210. package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/manifest.json +1 -1
  211. package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/versions/2026.10.1/manifest.json +189 -0
  212. package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/keywords.json +4009 -0
  213. package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/manifest.json +1 -1
  214. package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/versions/2026.10.1/manifest.json +185 -0
  215. package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/keywords.json +5209 -0
  216. package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/manifest.json +1 -1
  217. package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/versions/2026.10.1/manifest.json +193 -0
  218. package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/keywords.json +6537 -0
  219. package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/manifest.json +1 -1
  220. package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/versions/2026.10.1/manifest.json +185 -0
  221. package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/keywords.json +5989 -0
  222. package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/manifest.json +1 -1
  223. package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/versions/2026.10.1/manifest.json +189 -0
  224. package/dist/catalog/provenance.json +2 -1
  225. package/dist/engines/native-file-manifest.json +198 -118
  226. package/dist/engines/native-manifest.d.ts +4 -4
  227. package/dist/engines/native-manifest.js +36 -34
  228. package/dist/engines/resolver.js +12 -1
  229. package/dist/fs/atomic.d.ts +4 -1
  230. package/dist/fs/atomic.js +7 -1
  231. package/dist/http/openai-compat/chat-target.d.ts +1 -1
  232. package/dist/http/openai-compat/chat-target.js +1 -1
  233. package/dist/http/openai-compat/engine-failure.js +7 -2
  234. package/dist/http/routes/v1-chat.js +1 -1
  235. package/dist/http/routes/v1-images.d.ts +44 -0
  236. package/dist/http/routes/v1-images.js +370 -0
  237. package/dist/http/routes/v1-knowledge.js +4 -0
  238. package/dist/http/routes/v1-responses.d.ts +1 -1
  239. package/dist/inference-service.d.ts +9 -1
  240. package/dist/inference-service.js +44 -11
  241. package/dist/knowledge/manager.d.ts +7 -0
  242. package/dist/knowledge/manager.js +32 -1
  243. package/dist/kokoro-lexicon/manifest.json +6 -3
  244. package/dist/models/image-fit.d.ts +83 -0
  245. package/dist/models/image-fit.js +163 -0
  246. package/dist/models/weight-facts.d.ts +36 -0
  247. package/dist/models/weight-facts.js +171 -0
  248. package/dist/perf/responsiveness.js +4 -3
  249. package/dist/providers/audio/kokoro-frontend.js +1 -1
  250. package/dist/providers/ds4/build-provider.js +34 -21
  251. package/dist/providers/ds4/dspark.d.ts +23 -5
  252. package/dist/providers/ds4/dspark.js +36 -8
  253. package/dist/providers/image/img2img-support.d.ts +40 -0
  254. package/dist/providers/image/img2img-support.js +74 -0
  255. package/dist/providers/image/local-engine.d.ts +31 -0
  256. package/dist/providers/image/local-engine.js +47 -0
  257. package/dist/providers/image/local-factory.d.ts +95 -0
  258. package/dist/providers/image/local-factory.js +270 -0
  259. package/dist/providers/image/mock.d.ts +23 -0
  260. package/dist/providers/image/mock.js +151 -0
  261. package/dist/providers/image/pull-registry.d.ts +106 -0
  262. package/dist/providers/image/pull-registry.js +227 -0
  263. package/dist/providers/image/sd-cpp.d.ts +200 -0
  264. package/dist/providers/image/sd-cpp.js +845 -0
  265. package/dist/providers/image/types.d.ts +235 -0
  266. package/dist/providers/image/types.js +20 -0
  267. package/dist/providers/llama-cpp/backend-health.d.ts +7 -0
  268. package/dist/providers/llama-cpp/backend-health.js +41 -1
  269. package/dist/providers/llama-cpp/build-provider.js +107 -56
  270. package/dist/providers/llama-cpp/cache-adapter.d.ts +7 -1
  271. package/dist/providers/llama-cpp/cache-adapter.js +9 -0
  272. package/dist/providers/llama-cpp/devices.d.ts +13 -2
  273. package/dist/providers/llama-cpp/devices.js +43 -6
  274. package/dist/providers/llama-cpp/models.js +4 -1
  275. package/dist/providers/llama-cpp/offload-planner.d.ts +23 -0
  276. package/dist/providers/llama-cpp/offload-planner.js +27 -0
  277. package/dist/providers/llama-cpp/provider.d.ts +14 -3
  278. package/dist/providers/llama-cpp/provider.js +35 -2
  279. package/dist/providers/mlx/provider.js +15 -5
  280. package/dist/providers/mlx/reasoning-stream.d.ts +15 -0
  281. package/dist/providers/mlx/reasoning-stream.js +35 -0
  282. package/dist/providers/native/capacity-broker.js +9 -3
  283. package/dist/providers/native/local-engine-runtime.js +15 -12
  284. package/dist/providers/native/supervisor.d.ts +8 -0
  285. package/dist/providers/native/supervisor.js +55 -5
  286. package/dist/providers/project-macro-loop-bail.js +5 -3
  287. package/dist/providers/provider-lifecycle.d.ts +21 -0
  288. package/dist/providers/provider-lifecycle.js +83 -0
  289. package/dist/providers/queue.d.ts +9 -2
  290. package/dist/providers/queue.js +17 -2
  291. package/dist/providers/retirement-gate.d.ts +20 -0
  292. package/dist/providers/retirement-gate.js +55 -0
  293. package/dist/providers/session-hooks.d.ts +4 -1
  294. package/dist/system/memory.js +6 -0
  295. package/dist/utils/image-meta.d.ts +12 -0
  296. package/dist/utils/image-meta.js +77 -0
  297. package/package.json +6 -6
@@ -40,12 +40,12 @@
40
40
  * but logs that it could not anchor to a baked-in digest.
41
41
  */
42
42
  /** Native release version this build pins. Placeholder until first public release. */
43
- export declare const NATIVE_ENGINE_RELEASE = "0.1.51";
43
+ export declare const NATIVE_ENGINE_RELEASE = "0.1.54";
44
44
  /** sha256 of the pinned release's `SHA256SUMS` asset. All-zeros = unpinned. */
45
- export declare const SHA256SUMS_DIGEST = "499a87aa18e113cdb52ee277bff71365e9176b63b536dbea7f3c2aa5ff5dbe68";
46
- /** Exact SHA256 values for every engine archive published by native-v0.1.51. */
45
+ export declare const SHA256SUMS_DIGEST = "087215a12096127a779b20e0dcb7d2ed9ce5dda1c81f33fdeb6b6eb730485b20";
46
+ /** Exact SHA256 values for every engine archive published by native-v0.1.54. */
47
47
  export declare const NATIVE_ENGINE_ARCHIVE_SHA256: Readonly<Record<string, string>>;
48
- /** Download size in bytes of every engine archive published by native-v0.1.51. */
48
+ /** Download size in bytes of every engine archive published by native-v0.1.54. */
49
49
  export declare const NATIVE_ENGINE_ARCHIVE_BYTES: Readonly<Record<string, number>>;
50
50
  /**
51
51
  * True only when the pinned release's standalone macOS archives were
@@ -40,45 +40,47 @@
40
40
  * but logs that it could not anchor to a baked-in digest.
41
41
  */
42
42
  /** Native release version this build pins. Placeholder until first public release. */
43
- export const NATIVE_ENGINE_RELEASE = '0.1.51';
43
+ export const NATIVE_ENGINE_RELEASE = '0.1.54';
44
44
  /** sha256 of the pinned release's `SHA256SUMS` asset. All-zeros = unpinned. */
45
- export const SHA256SUMS_DIGEST = '499a87aa18e113cdb52ee277bff71365e9176b63b536dbea7f3c2aa5ff5dbe68';
45
+ export const SHA256SUMS_DIGEST = '087215a12096127a779b20e0dcb7d2ed9ce5dda1c81f33fdeb6b6eb730485b20';
46
46
  // BEGIN PINNED NATIVE ARCHIVE HASHES
47
- /** Exact SHA256 values for every engine archive published by native-v0.1.51. */
47
+ /** Exact SHA256 values for every engine archive published by native-v0.1.54. */
48
48
  export const NATIVE_ENGINE_ARCHIVE_SHA256 = Object.freeze({
49
- 'gezel-native-0.1.51-darwin-arm64-metal.tar.gz': '5abbfd156fbcc717da96c89dc5baa507a56d2b55b501f1a975803a763e6414c4',
50
- 'gezel-native-0.1.51-darwin-arm64.tar.gz': '799bca88b0ea10aeb2dad9ed3065c9396f42383a6fd5c7347ed76abf0706f128',
51
- 'gezel-native-0.1.51-linux-arm64-cpu.tar.gz': '1612e5928693262884bcc2c60ba3975af4dc4267c2bd75597ef91e83681fa96e',
52
- 'gezel-native-0.1.51-linux-arm64-cuda.tar.gz': '4a457df5dbb8475ca0eb2f1a2373f1960bbb3f86a0ecd938a407f884cd6026a2',
53
- 'gezel-native-0.1.51-linux-arm64.tar.gz': '2aaead65bfd42ffef9a1f45a70fa24095bc2814842750536989cbcb7a9a0db24',
54
- 'gezel-native-0.1.51-linux-x64-cpu.tar.gz': '7453d6a3ef2de7ece967a033d5bd634789e41edefa4a823b580329f0ad98abb0',
55
- 'gezel-native-0.1.51-linux-x64-cuda.tar.gz': 'ac1054a33339bcf6167c309b867f5671def58e036bb612978c4a434cd7ac39d6',
56
- 'gezel-native-0.1.51-linux-x64-vulkan.tar.gz': '6739c9dca6cbcf53fb5d69dbd342ac6be49fe2f0d86471d66975e61a64c95e9f',
57
- 'gezel-native-0.1.51-linux-x64.tar.gz': 'a176ac570131db874e0a81fdec939415dd161a639827219a82f2a610f5ebd8d3',
58
- 'gezel-native-0.1.51-win32-arm64-cpu.zip': 'f79c0c8490d46f2d60e73fd948bf74ae93dfc7c650a878f7db5e227bbdbb85b9',
59
- 'gezel-native-0.1.51-win32-arm64.zip': 'c829c9c1fd08756aff9e677ea1addcf80a8739f13df3c9b6788a6237e53efacb',
60
- 'gezel-native-0.1.51-win32-x64-cpu.zip': 'f8e0ffeacc8aeea1f2fc91024382bdcdaeeeb65b8a45935af422acb4d7027190',
61
- 'gezel-native-0.1.51-win32-x64-cuda.zip': '6bd7dc2c43443a847058a4c4f1c53281c99563c214394a92470281a70f725d1e',
62
- 'gezel-native-0.1.51-win32-x64-vulkan.zip': 'e20fb148c854f267aa50981525e337c38d3ee496fd483393a676251d9c0a496f',
63
- 'gezel-native-0.1.51-win32-x64.zip': 'ca5d7866fa2ff2e89da9267fcb409eb9aff01ef1c43ed726327e4967d3ed5e56',
49
+ 'gezel-native-0.1.54-darwin-arm64-metal.tar.gz': 'f2990970303b954af2fd2e2bd31efef7d1c231bea16e026e0cdc0a7f9cc17842',
50
+ 'gezel-native-0.1.54-darwin-arm64.tar.gz': '850f28338c52f945996c55edd77cf14d451c9bc4a09f719f6608885ddab99687',
51
+ 'gezel-native-0.1.54-linux-arm64-cpu.tar.gz': '7dac7fed45c46b591cd6d597d639c385f54a3a367ac15d6097d3ad04d9c3c6e6',
52
+ 'gezel-native-0.1.54-linux-arm64-cuda.tar.gz': 'f73c4569c356c4584199513c6c1f1f0bd3f0151fb1845696e2fa43f2b3626803',
53
+ 'gezel-native-0.1.54-linux-arm64.tar.gz': 'f034ad2d3d12165c979d2fff2d34752c8d4f8ff836d3c416c9c64535f3bb652b',
54
+ 'gezel-native-0.1.54-linux-x64-cpu.tar.gz': '57de7d52b0e95e3886bf4ffad7e015b98ba8bbea96b95d8cb3e26bc1ff309e99',
55
+ 'gezel-native-0.1.54-linux-x64-cuda.tar.gz': 'c2d8616410f72b8bb217194f7c71d5175ed1c94ac6d9d94f660e0f535a3cff22',
56
+ 'gezel-native-0.1.54-linux-x64-vulkan.tar.gz': '89f3233f41861404db082219962eb25d1b2c3f6e42bbc2696fda122ce845371d',
57
+ 'gezel-native-0.1.54-linux-x64.tar.gz': 'f42e42d71187c6ef5af9685ebb65511bb7ac638815105f09f3df22cfdb9e6bce',
58
+ 'gezel-native-0.1.54-win32-arm64-cpu.zip': 'e482e2af92f28135aea2e21ae97290e231b0dc77eadc8cc532d2506304d27575',
59
+ 'gezel-native-0.1.54-win32-arm64-cuda.zip': 'ff6eaf7f070e9aba7fc087a155896f73b12664d867e0374af5546e941c153b82',
60
+ 'gezel-native-0.1.54-win32-arm64.zip': '9b854d824117fe56d7d532ab83c01693a97cf6b45752e69cb895aa183c8cff35',
61
+ 'gezel-native-0.1.54-win32-x64-cpu.zip': '93c8f22b47831ba8e0808033e87ce91cdb0d481890602857b6b8b5295cc7d50b',
62
+ 'gezel-native-0.1.54-win32-x64-cuda.zip': '84da0b362e502d0bb6e3509528e7a4ccff50c2b9fcaa2fa1a62b3d9b0ad9f5d2',
63
+ 'gezel-native-0.1.54-win32-x64-vulkan.zip': '1a3c99ce8343552fb17af80c36ba8ebb7c13ac8d6b4966f3aa3054018d41fa11',
64
+ 'gezel-native-0.1.54-win32-x64.zip': 'f224fcdea6945ce574d32bee6ace345f82847f317c40cfa9059feba9b87ac0ca',
64
65
  });
65
- /** Download size in bytes of every engine archive published by native-v0.1.51. */
66
+ /** Download size in bytes of every engine archive published by native-v0.1.54. */
66
67
  export const NATIVE_ENGINE_ARCHIVE_BYTES = Object.freeze({
67
- 'gezel-native-0.1.51-darwin-arm64-metal.tar.gz': 7056609,
68
- 'gezel-native-0.1.51-darwin-arm64.tar.gz': 41556782,
69
- 'gezel-native-0.1.51-linux-arm64-cpu.tar.gz': 8836261,
70
- 'gezel-native-0.1.51-linux-arm64-cuda.tar.gz': 619480627,
71
- 'gezel-native-0.1.51-linux-arm64.tar.gz': 41979458,
72
- 'gezel-native-0.1.51-linux-x64-cpu.tar.gz': 12914417,
73
- 'gezel-native-0.1.51-linux-x64-cuda.tar.gz': 989771250,
74
- 'gezel-native-0.1.51-linux-x64-vulkan.tar.gz': 25672179,
75
- 'gezel-native-0.1.51-linux-x64.tar.gz': 58057226,
76
- 'gezel-native-0.1.51-win32-arm64-cpu.zip': 5618599,
77
- 'gezel-native-0.1.51-win32-arm64.zip': 42055408,
78
- 'gezel-native-0.1.51-win32-x64-cpu.zip': 8714418,
79
- 'gezel-native-0.1.51-win32-x64-cuda.zip': 749850276,
80
- 'gezel-native-0.1.51-win32-x64-vulkan.zip': 21123169,
81
- 'gezel-native-0.1.51-win32-x64.zip': 56558016,
68
+ 'gezel-native-0.1.54-darwin-arm64-metal.tar.gz': 7056387,
69
+ 'gezel-native-0.1.54-darwin-arm64.tar.gz': 42224129,
70
+ 'gezel-native-0.1.54-linux-arm64-cpu.tar.gz': 8838944,
71
+ 'gezel-native-0.1.54-linux-arm64-cuda.tar.gz': 620429935,
72
+ 'gezel-native-0.1.54-linux-arm64.tar.gz': 42037092,
73
+ 'gezel-native-0.1.54-linux-x64-cpu.tar.gz': 12914025,
74
+ 'gezel-native-0.1.54-linux-x64-cuda.tar.gz': 993587032,
75
+ 'gezel-native-0.1.54-linux-x64-vulkan.tar.gz': 25672135,
76
+ 'gezel-native-0.1.54-linux-x64.tar.gz': 57185943,
77
+ 'gezel-native-0.1.54-win32-arm64-cpu.zip': 5623741,
78
+ 'gezel-native-0.1.54-win32-arm64-cuda.zip': 242341587,
79
+ 'gezel-native-0.1.54-win32-arm64.zip': 42236457,
80
+ 'gezel-native-0.1.54-win32-x64-cpu.zip': 8719660,
81
+ 'gezel-native-0.1.54-win32-x64-cuda.zip': 749849595,
82
+ 'gezel-native-0.1.54-win32-x64-vulkan.zip': 21128362,
83
+ 'gezel-native-0.1.54-win32-x64.zip': 55668353,
82
84
  });
83
85
  // END PINNED NATIVE ARCHIVE HASHES
84
86
  /**
@@ -755,6 +755,15 @@ function stampEnv(engine, binPath, variant, versionDir) {
755
755
  process.env.GEZEL_NATIVE_BIN_DIR = versionDir;
756
756
  if (engine === 'llama-server' && variant)
757
757
  process.env.GEZEL_LLAMA_SERVER_BACKEND = variant;
758
+ // Windows on ARM's bare archive also carries sqlite-vec, which npm has no
759
+ // build of there. The sqlite driver reads this on every database open, so
760
+ // vector search starts with the next query rather than the next boot.
761
+ const platformKey = resolvePlatformKey();
762
+ const ext = process.platform === 'win32' ? 'dll' : process.platform === 'darwin' ? 'dylib' : 'so';
763
+ const sqliteVec = platformKey ? join(versionDir, platformKey, `vec0.${ext}`) : null;
764
+ if (sqliteVec && !process.env.GEZEL_SQLITE_VEC_PATH && existsSync(sqliteVec)) {
765
+ process.env.GEZEL_SQLITE_VEC_PATH = sqliteVec;
766
+ }
758
767
  }
759
768
  async function resolveGitHubToken() {
760
769
  if (process.env.GEZEL_GITHUB_TOKEN)
@@ -763,7 +772,9 @@ async function resolveGitHubToken() {
763
772
  return process.env.GITHUB_TOKEN;
764
773
  try {
765
774
  const { execFileSync } = await import('node:child_process');
766
- const out = execFileSync('gh', ['auth', 'token'], {
775
+ // Named host: a bare `gh auth token` answers for gh's default host, which
776
+ // can be a GitHub Enterprise server whose token must not go to github.com.
777
+ const out = execFileSync('gh', ['auth', 'token', '--hostname', 'github.com'], {
767
778
  encoding: 'utf8',
768
779
  stdio: ['ignore', 'pipe', 'ignore'],
769
780
  ...windowsHeadlessSpawnOptions(),
@@ -50,4 +50,7 @@ export declare function writeFileAtomic(absPath: string, content: string | Uint8
50
50
  * private staging file by their adapter, then copied to a sibling temporary
51
51
  * path and renamed into place.
52
52
  */
53
- export declare function copyFileAtomic(sourcePath: string, absPath: string): Promise<void>;
53
+ export declare function copyFileAtomic(sourcePath: string, absPath: string, opts?: {
54
+ noReplace?: boolean;
55
+ signal?: AbortSignal;
56
+ }): Promise<void>;
package/dist/fs/atomic.js CHANGED
@@ -108,10 +108,16 @@ export async function writeFileAtomic(absPath, content, opts) {
108
108
  * private staging file by their adapter, then copied to a sibling temporary
109
109
  * path and renamed into place.
110
110
  */
111
- export async function copyFileAtomic(sourcePath, absPath) {
111
+ export async function copyFileAtomic(sourcePath, absPath, opts) {
112
112
  const tmp = `${absPath}.tmp-${process.pid}-${randomUUID()}`;
113
113
  try {
114
114
  await copyFile(sourcePath, tmp);
115
+ opts?.signal?.throwIfAborted();
116
+ if (opts?.noReplace) {
117
+ await link(tmp, absPath);
118
+ await rm(tmp, { force: true }).catch(() => undefined);
119
+ return;
120
+ }
115
121
  await renameWithWindowsRetry(tmp, absPath);
116
122
  }
117
123
  catch (err) {
@@ -59,7 +59,7 @@ export declare function resolvePinnedModelTarget(ctx: ServiceContext, model: str
59
59
  * Pick the gezel that guarantees a persona-backed fallback for public
60
60
  * inference requests.
61
61
  *
62
- * The explicit Connected Apps choice wins. When it is unset or stale,
62
+ * The explicit Integrations choice wins. When it is unset or stale,
63
63
  * the install's Meester is the natural front door; the first available
64
64
  * gezel is the final recovery path for older or partially migrated
65
65
  * homes. A healthy store always has at least a Meester, but returning
@@ -29,7 +29,7 @@ export async function resolvePinnedModelTarget(ctx, model) {
29
29
  * Pick the gezel that guarantees a persona-backed fallback for public
30
30
  * inference requests.
31
31
  *
32
- * The explicit Connected Apps choice wins. When it is unset or stale,
32
+ * The explicit Integrations choice wins. When it is unset or stale,
33
33
  * the install's Meester is the natural front door; the first available
34
34
  * gezel is the final recovery path for older or partially migrated
35
35
  * homes. A healthy store always has at least a Meester, but returning
@@ -53,10 +53,15 @@ function internalCode(err) {
53
53
  const code = current.code;
54
54
  const wire = typeof code === 'string' ? WIRE_CODES.get(code) : undefined;
55
55
  // A crash the out-of-memory killer caused is a capacity fact, not a fault.
56
- if (wire === 'engine_crashed' &&
57
- current.panicKind === 'host-out-of-memory') {
56
+ const panicKind = current.panicKind;
57
+ if (wire === 'engine_crashed' && panicKind === 'host-out-of-memory') {
58
58
  return 'engine_out_of_memory';
59
59
  }
60
+ // A runtime the machine lacks: the engine never started, and retrying
61
+ // cannot help until it is installed.
62
+ if (wire === 'engine_crashed' && panicKind === 'missing-runtime') {
63
+ return 'engine_launch_failed';
64
+ }
60
65
  if (wire)
61
66
  return wire;
62
67
  current = current.cause;
@@ -289,7 +289,7 @@ export function v1ChatRoutes(ctx, opts = {}) {
289
289
  // instruct folds, per-gezel overrides for gezel: targets) applies
290
290
  // unconditionally — it's "what the model is" — with the caller's
291
291
  // per-request knobs overlaid on top. The behavior `profile` is the
292
- // supporting layer the Connected Apps switch gates. Caller-owned
292
+ // supporting layer the Integrations switch gates. Caller-owned
293
293
  // inference keeps parsing, grammar, and transcript compatibility but
294
294
  // omits interventions which assume Gezel owns the action loop.
295
295
  // Best-effort: a resolver failure serves engine defaults rather than
@@ -0,0 +1,44 @@
1
+ import { type GezelConfig } from '@bendyline/gezel';
2
+ import type { CatalogService } from '@bendyline/gezel-catalog';
3
+ import { Hono } from 'hono';
4
+ import type { ImageModelPullRegistry } from '../../providers/image/pull-registry.js';
5
+ import { type ImageProvider } from '../../providers/image/types.js';
6
+ export interface ImagesRouteContext {
7
+ home: string;
8
+ catalog: CatalogService;
9
+ store: {
10
+ readConfig(): Promise<GezelConfig>;
11
+ };
12
+ images: {
13
+ /** Whether an engine can render here at all. */
14
+ available(): boolean;
15
+ current(): Promise<ImageProvider>;
16
+ /** Stop the engine, draining renders, before its model files change. */
17
+ reset(): Promise<void>;
18
+ pulls: ImageModelPullRegistry;
19
+ };
20
+ }
21
+ /**
22
+ * `/v1/images/*` — local image generation for apps.
23
+ *
24
+ * GET /models Installed and downloadable image models,
25
+ * with this machine's fit. Never part of
26
+ * `/v1/models`, so chat pickers never
27
+ * offer them.
28
+ * POST /models/ensure `{model: "sd-cpp:<id>"}` → ready, or a
29
+ * background download (`job_id`).
30
+ * GET /models/ensure/:jobId Snapshot of a download.
31
+ * GET /models/ensure/:jobId/events
32
+ * SSE of `AppEnsureEvent`s, closing after
33
+ * `done` or `error`. Disconnecting does
34
+ * not cancel the download.
35
+ * DELETE /models/ensure/:jobId Cancel the download; a later ensure
36
+ * resumes it.
37
+ * DELETE /models/:id Remove an installed model. A shared
38
+ * model belongs to another store: 409.
39
+ * POST /generations SSE of `AppImageGenerationEvent`s:
40
+ * progress, then one `done` (the PNG) or
41
+ * `error`. Closing the stream cancels the
42
+ * render, which stops the engine.
43
+ */
44
+ export declare function v1ImagesRoutes(ctx: ImagesRouteContext): Hono;
@@ -0,0 +1,370 @@
1
+ import { AppImageGenerationRequestSchema, createLogger, imageModelDefaultSide, resolveImageSize, } from '@bendyline/gezel';
2
+ import { Hono } from 'hono';
3
+ import { streamSSE } from 'hono/streaming';
4
+ import { z } from 'zod';
5
+ import { imageCatalogFits, imageModelFit, wontRunRefusal } from '../../models/image-fit.js';
6
+ import { ReadOnlyModelError, modelExistsOnlyReadOnly, modelStorageRoots, } from '../../models/storage-roots.js';
7
+ import { NoLocalImageModelError } from '../../providers/image/local-factory.js';
8
+ import { ImageCapacityError, ImageGenerationCancelledError, } from '../../providers/image/types.js';
9
+ const log = createLogger('v1-images');
10
+ /** The one local image engine this host serves. */
11
+ const ENGINE = 'sd-cpp';
12
+ const EnsureRequestSchema = z.object({ model: z.string().min(1, 'model is required') });
13
+ function apiError(code, message) {
14
+ return { error: { message, type: 'invalid_request_error', code } };
15
+ }
16
+ /** `sd-cpp:<id>` or a bare `<id>`; null for another engine's id. */
17
+ function catalogIdOf(model) {
18
+ const trimmed = model.trim();
19
+ const colon = trimmed.indexOf(':');
20
+ if (colon < 0)
21
+ return trimmed || null;
22
+ if (trimmed.slice(0, colon) !== ENGINE)
23
+ return null;
24
+ return trimmed.slice(colon + 1).trim() || null;
25
+ }
26
+ function qualified(catalogId) {
27
+ return `${ENGINE}:${catalogId}`;
28
+ }
29
+ function downloadBytes(manifest) {
30
+ return (manifest.approxSizeBytes + manifest.auxiliaryFiles.reduce((n, f) => n + f.approxSizeBytes, 0));
31
+ }
32
+ function describeManifest(manifest) {
33
+ const license = manifest.licenseShortName ?? manifest.license;
34
+ return {
35
+ name: manifest.name,
36
+ description: manifest.description,
37
+ download_bytes: downloadBytes(manifest),
38
+ ...(license ? { license } : {}),
39
+ commercial_use: manifest.commercialUse,
40
+ ...(manifest.rendersText !== undefined ? { renders_text: manifest.rendersText } : {}),
41
+ ...(manifest.promptStyle ? { prompt_style: manifest.promptStyle } : {}),
42
+ ...(manifest.hardwareTier ? { hardware_tier: manifest.hardwareTier } : {}),
43
+ ...(manifest.minRamGB !== undefined ? { min_ram_gb: manifest.minRamGB } : {}),
44
+ ...(manifest.widthRange ? { width_range: manifest.widthRange } : {}),
45
+ ...(manifest.heightRange ? { height_range: manifest.heightRange } : {}),
46
+ default_side_px: imageModelDefaultSide(manifest.id),
47
+ ...(manifest.supportsImg2Img !== undefined
48
+ ? { supports_img2img: manifest.supportsImg2Img }
49
+ : {}),
50
+ };
51
+ }
52
+ function ensureEvent(jobId, event, totalBytes) {
53
+ const job = { jobId, modelId: qualified(jobId) };
54
+ switch (event.type) {
55
+ case 'progress':
56
+ return {
57
+ ...job,
58
+ type: 'progress',
59
+ bytesWritten: event.bytesWritten,
60
+ totalBytes: event.totalBytes ?? totalBytes,
61
+ };
62
+ case 'retrying':
63
+ return {
64
+ ...job,
65
+ type: 'retrying',
66
+ attempt: event.attempt,
67
+ maxAttempts: event.maxAttempts,
68
+ delayMs: event.delayMs,
69
+ reason: event.reason,
70
+ };
71
+ case 'error':
72
+ return { ...job, type: 'error', error: event.error };
73
+ case 'done':
74
+ return { ...job, type: 'done' };
75
+ }
76
+ }
77
+ function pullStatus(pull) {
78
+ if (!pull.finished)
79
+ return 'running';
80
+ return pull.error ? 'error' : 'done';
81
+ }
82
+ function generationError(err) {
83
+ const message = err instanceof Error ? err.message : String(err);
84
+ if (err instanceof ImageGenerationCancelledError)
85
+ return { code: 'cancelled', message };
86
+ if (err instanceof ImageCapacityError)
87
+ return { code: err.code, message };
88
+ if (err instanceof NoLocalImageModelError)
89
+ return { code: err.code, message };
90
+ const code = err?.code;
91
+ if (code === 'capacity-denied')
92
+ return { code: 'capacity_denied', message };
93
+ return { code: 'image_generation_failed', message };
94
+ }
95
+ /**
96
+ * `/v1/images/*` — local image generation for apps.
97
+ *
98
+ * GET /models Installed and downloadable image models,
99
+ * with this machine's fit. Never part of
100
+ * `/v1/models`, so chat pickers never
101
+ * offer them.
102
+ * POST /models/ensure `{model: "sd-cpp:<id>"}` → ready, or a
103
+ * background download (`job_id`).
104
+ * GET /models/ensure/:jobId Snapshot of a download.
105
+ * GET /models/ensure/:jobId/events
106
+ * SSE of `AppEnsureEvent`s, closing after
107
+ * `done` or `error`. Disconnecting does
108
+ * not cancel the download.
109
+ * DELETE /models/ensure/:jobId Cancel the download; a later ensure
110
+ * resumes it.
111
+ * DELETE /models/:id Remove an installed model. A shared
112
+ * model belongs to another store: 409.
113
+ * POST /generations SSE of `AppImageGenerationEvent`s:
114
+ * progress, then one `done` (the PNG) or
115
+ * `error`. Closing the stream cancels the
116
+ * render, which stops the engine.
117
+ */
118
+ export function v1ImagesRoutes(ctx) {
119
+ const app = new Hono();
120
+ const fitContext = { catalog: ctx.catalog, readConfig: () => ctx.store.readConfig() };
121
+ app.get('/models', async (c) => {
122
+ const provider = await ctx.images.current();
123
+ const [installed, items, fits] = await Promise.all([
124
+ provider.listInstalledModels(),
125
+ ctx.catalog.list('image-model'),
126
+ imageCatalogFits(fitContext).catch((error) => {
127
+ log.warn(`[v1-images] fit assessment failed: ${String(error)}`);
128
+ return null;
129
+ }),
130
+ ]);
131
+ const storageRoots = modelStorageRoots({ home: ctx.home, engine: ENGINE });
132
+ const installedIds = new Set(installed.map((m) => m.id));
133
+ const fitById = new Map(fits?.models.map((m) => [m.id, m]) ?? []);
134
+ const downloading = new Set(ctx.images.pulls
135
+ .list()
136
+ .filter((p) => !p.finished)
137
+ .map((p) => p.id));
138
+ const data = [];
139
+ const seen = new Set();
140
+ for (const item of items) {
141
+ const manifest = item.manifest;
142
+ if (manifest.kind !== 'image-model')
143
+ continue;
144
+ seen.add(manifest.id);
145
+ const fit = fitById.get(manifest.id);
146
+ const isInstalled = installedIds.has(manifest.id);
147
+ data.push({
148
+ id: qualified(manifest.id),
149
+ object: 'image_model',
150
+ ...describeManifest(manifest),
151
+ name: manifest.name,
152
+ availability: isInstalled
153
+ ? 'available'
154
+ : downloading.has(manifest.id)
155
+ ? 'downloading'
156
+ : 'download-required',
157
+ ...(isInstalled && (await modelExistsOnlyReadOnly(storageRoots, manifest.id))
158
+ ? { shared: true }
159
+ : {}),
160
+ ...(fit ? { fit: { verdict: fit.verdict, reason: fit.reason } } : {}),
161
+ });
162
+ }
163
+ // Installed models the catalog no longer lists still render.
164
+ for (const model of installed) {
165
+ if (seen.has(model.id))
166
+ continue;
167
+ data.push({
168
+ id: qualified(model.id),
169
+ object: 'image_model',
170
+ name: model.name,
171
+ availability: 'available',
172
+ ...((await modelExistsOnlyReadOnly(storageRoots, model.id)) ? { shared: true } : {}),
173
+ ...(model.supportsImg2Img !== undefined ? { supports_img2img: model.supportsImg2Img } : {}),
174
+ });
175
+ }
176
+ return c.json({ object: 'list', data });
177
+ });
178
+ app.post('/models/ensure', async (c) => {
179
+ const { model } = EnsureRequestSchema.parse(await c.req.json());
180
+ const id = catalogIdOf(model);
181
+ if (!id) {
182
+ return c.json(apiError('unsupported_backend', `Image models are ${ENGINE}:<id>`), 400);
183
+ }
184
+ const provider = await ctx.images.current();
185
+ const installed = await provider.listInstalledModels();
186
+ if (installed.some((m) => m.id === id)) {
187
+ return c.json({ status: 'ready', model_id: qualified(id) });
188
+ }
189
+ const refusal = await wontRunRefusal(() => imageModelFit(fitContext, id));
190
+ if (refusal)
191
+ return c.json(apiError(refusal.code, refusal.error), 409);
192
+ try {
193
+ await ctx.images.pulls.start(id);
194
+ }
195
+ catch (error) {
196
+ if (error.name === 'UnknownImageModelError') {
197
+ return c.json(apiError('unknown_model', `No image model ${model} in the catalog`), 404);
198
+ }
199
+ throw error;
200
+ }
201
+ return c.json({ status: 'downloading', model_id: qualified(id), job_id: id }, 202);
202
+ });
203
+ app.get('/models/ensure/:jobId', (c) => {
204
+ const pull = ctx.images.pulls.get(c.req.param('jobId'));
205
+ if (!pull)
206
+ return c.json(apiError('job_not_found', 'job not found'), 404);
207
+ return c.json({
208
+ job_id: pull.id,
209
+ model_id: qualified(pull.id),
210
+ status: pullStatus(pull),
211
+ started_at: Date.parse(pull.startedAt),
212
+ bytes_written: pull.bytesWritten,
213
+ total_bytes: pull.totalBytes,
214
+ ...(pull.error ? { error: pull.error } : {}),
215
+ });
216
+ });
217
+ app.get('/models/ensure/:jobId/events', (c) => {
218
+ const jobId = c.req.param('jobId');
219
+ const snapshot = ctx.images.pulls.get(jobId);
220
+ if (!snapshot)
221
+ return c.json(apiError('job_not_found', 'job not found'), 404);
222
+ return streamSSE(c, async (stream) => {
223
+ let closed = false;
224
+ let sawError = false;
225
+ const unsubscribe = ctx.images.pulls.subscribe(jobId, (event) => {
226
+ // A failed pull ends with an error and then its done; the error is terminal.
227
+ if (sawError)
228
+ return;
229
+ if (event.type === 'error')
230
+ sawError = true;
231
+ const terminal = event.type === 'done' || event.type === 'error';
232
+ void stream
233
+ .writeSSE({ data: JSON.stringify(ensureEvent(jobId, event, snapshot.totalBytes)) })
234
+ .then(() => {
235
+ if (terminal)
236
+ closed = true;
237
+ })
238
+ .catch(() => {
239
+ closed = true;
240
+ });
241
+ });
242
+ if (!unsubscribe)
243
+ return;
244
+ stream.onAbort(() => {
245
+ closed = true;
246
+ unsubscribe();
247
+ });
248
+ while (!closed) {
249
+ await stream.sleep(1000);
250
+ try {
251
+ await stream.writeSSE({ event: 'ping', data: '' });
252
+ }
253
+ catch {
254
+ closed = true;
255
+ }
256
+ }
257
+ unsubscribe();
258
+ });
259
+ });
260
+ app.delete('/models/ensure/:jobId', (c) => {
261
+ if (!ctx.images.pulls.cancel(c.req.param('jobId'))) {
262
+ return c.json(apiError('job_not_found', 'No download in progress for that job'), 404);
263
+ }
264
+ return c.json({ cancelled: true });
265
+ });
266
+ app.delete('/models/:id', async (c) => {
267
+ const id = catalogIdOf(decodeURIComponent(c.req.param('id')));
268
+ if (!id)
269
+ return c.json(apiError('unsupported_backend', `Image models are ${ENGINE}:<id>`), 400);
270
+ const storageRoots = modelStorageRoots({ home: ctx.home, engine: ENGINE });
271
+ if (await modelExistsOnlyReadOnly(storageRoots, id)) {
272
+ return c.json(apiError('shared_model', 'This model is shared from another store and is not removed here'), 409);
273
+ }
274
+ // The engine may hold the model's files open.
275
+ await ctx.images.reset();
276
+ try {
277
+ await (await ctx.images.current()).deleteModel(id);
278
+ }
279
+ catch (error) {
280
+ if (error instanceof ReadOnlyModelError) {
281
+ return c.json(apiError('shared_model', error.message), 409);
282
+ }
283
+ throw error;
284
+ }
285
+ return c.body(null, 204);
286
+ });
287
+ app.post('/generations', async (c) => {
288
+ const request = AppImageGenerationRequestSchema.parse(await c.req.json());
289
+ if (!ctx.images.available()) {
290
+ return c.json(apiError('images_unavailable', 'Image generation is not available on this computer'), 503);
291
+ }
292
+ const provider = await ctx.images.current();
293
+ const installed = await provider.listInstalledModels();
294
+ const requested = request.model ? catalogIdOf(request.model) : undefined;
295
+ if (request.model && !requested) {
296
+ return c.json(apiError('unsupported_backend', `Image models are ${ENGINE}:<id>`), 400);
297
+ }
298
+ const modelId = requested ?? (await provider.resolveDefaultModelId?.());
299
+ if (!modelId || !installed.some((m) => m.id === modelId)) {
300
+ const error = requested
301
+ ? apiError('model_not_installed', `${request.model} is not installed; ensure it first`)
302
+ : apiError('no_local_image_model', new NoLocalImageModelError().message);
303
+ return c.json(error, 409);
304
+ }
305
+ const item = await ctx.catalog.get('image-model', modelId).catch(() => null);
306
+ const manifest = item?.manifest.kind === 'image-model' ? item.manifest : undefined;
307
+ const { width, height } = resolveImageSize({
308
+ ...(request.aspect_ratio ? { aspectRatio: request.aspect_ratio } : {}),
309
+ ...(request.quality ? { quality: request.quality } : {}),
310
+ }, {
311
+ defaultSidePx: imageModelDefaultSide(modelId),
312
+ ...(manifest?.widthRange ? { widthRange: manifest.widthRange } : {}),
313
+ ...(manifest?.heightRange ? { heightRange: manifest.heightRange } : {}),
314
+ });
315
+ return streamSSE(c, async (stream) => {
316
+ const controller = new AbortController();
317
+ const cancel = () => controller.abort();
318
+ stream.onAbort(cancel);
319
+ c.req.raw.signal.addEventListener('abort', cancel, { once: true });
320
+ const send = (event) => stream.writeSSE({ data: JSON.stringify(event) }).catch(cancel);
321
+ let last = '';
322
+ const onProgress = (progress) => {
323
+ const event = {
324
+ type: 'progress',
325
+ phase: progress.phase ?? 'sampling',
326
+ step: progress.step,
327
+ total_steps: progress.totalSteps,
328
+ ...(progress.secondsPerStep ? { seconds_per_step: progress.secondsPerStep } : {}),
329
+ };
330
+ const key = JSON.stringify(event);
331
+ if (key === last)
332
+ return;
333
+ last = key;
334
+ void send(event);
335
+ };
336
+ try {
337
+ const out = await provider.generate({
338
+ prompt: request.prompt,
339
+ ...(request.negative_prompt ? { negativePrompt: request.negative_prompt } : {}),
340
+ model: modelId,
341
+ width,
342
+ height,
343
+ ...(request.seed !== undefined ? { seed: request.seed } : {}),
344
+ signal: controller.signal,
345
+ onProgress,
346
+ });
347
+ await send({
348
+ type: 'done',
349
+ b64_png: out.png.toString('base64'),
350
+ width: out.meta.widthPx,
351
+ height: out.meta.heightPx,
352
+ seed: out.meta.seed,
353
+ model: qualified(out.meta.model),
354
+ steps: out.meta.steps,
355
+ duration_ms: out.meta.durationMs,
356
+ });
357
+ }
358
+ catch (error) {
359
+ if (!controller.signal.aborted) {
360
+ log.warn(`[v1-images] generation failed: ${String(error)}`);
361
+ }
362
+ await send({ type: 'error', error: generationError(error) });
363
+ }
364
+ finally {
365
+ c.req.raw.signal.removeEventListener('abort', cancel);
366
+ }
367
+ });
368
+ });
369
+ return app;
370
+ }
@@ -222,6 +222,10 @@ export function v1KnowledgeRoutes(ctx) {
222
222
  maxResults: 24,
223
223
  queryEmbedBudgetMs: 5000,
224
224
  catalogs: enabled.map((entry) => entry.ref.catalogId),
225
+ // Let the reranker choose among an article's sections: one passage per
226
+ // article, picked by embedding similarity, sent an infobox in place of
227
+ // the history the person asked about.
228
+ chunksPerDocument: 3,
225
229
  });
226
230
  c.req.raw.signal.throwIfAborted();
227
231
  const candidates = [];
@@ -9,7 +9,7 @@ import type { InferenceContext } from '../inference-context.js';
9
9
  * and returns assistant text/tool calls in Responses wire shapes. The route
10
10
  * intentionally does not create a Gezel chat session or attach Gezel MCP.
11
11
  *
12
- * In the full service, auth is mounted in `server.ts`: the Connected Apps
12
+ * In the full service, auth is mounted in `server.ts`: the Integrations
13
13
  * master switch, bearer authentication, and the `openai` scope all apply. Codex can therefore use
14
14
  * an app-scoped token without ever learning the daemon's root credential.
15
15
  */