sensemaking 0.25.1 → 0.26.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 (316) hide show
  1. package/README.md +13 -9
  2. package/dist/cjs/cli/index.d.cts +1 -1
  3. package/dist/cjs/cli/index.d.ts +1 -1
  4. package/dist/cjs/cli/index.js +1 -1
  5. package/dist/cjs/cli/index.js.map +1 -1
  6. package/dist/cjs/cli/path.js +5 -29
  7. package/dist/cjs/cli/path.js.map +1 -1
  8. package/dist/cjs/cli/related.js +4 -3
  9. package/dist/cjs/cli/related.js.map +1 -1
  10. package/dist/cjs/commands/index.d.cts +6 -3
  11. package/dist/cjs/commands/index.d.ts +6 -3
  12. package/dist/cjs/commands/index.js +4 -0
  13. package/dist/cjs/commands/index.js.map +1 -1
  14. package/dist/cjs/commands/map.d.cts +14 -5
  15. package/dist/cjs/commands/map.d.ts +14 -5
  16. package/dist/cjs/commands/map.js +42 -35
  17. package/dist/cjs/commands/map.js.map +1 -1
  18. package/dist/cjs/commands/path.d.cts +14 -0
  19. package/dist/cjs/commands/path.d.ts +14 -0
  20. package/dist/cjs/commands/path.js +209 -0
  21. package/dist/cjs/commands/path.js.map +1 -0
  22. package/dist/cjs/commands/peek.d.cts +16 -1
  23. package/dist/cjs/commands/peek.d.ts +16 -1
  24. package/dist/cjs/commands/peek.js +71 -33
  25. package/dist/cjs/commands/peek.js.map +1 -1
  26. package/dist/cjs/commands/related.d.cts +16 -3
  27. package/dist/cjs/commands/related.d.ts +16 -3
  28. package/dist/cjs/commands/related.js +131 -98
  29. package/dist/cjs/commands/related.js.map +1 -1
  30. package/dist/cjs/commands/scope.d.cts +1 -0
  31. package/dist/cjs/commands/scope.d.ts +1 -0
  32. package/dist/cjs/commands/scope.js +149 -0
  33. package/dist/cjs/commands/scope.js.map +1 -1
  34. package/dist/cjs/commands/search.d.cts +26 -3
  35. package/dist/cjs/commands/search.d.ts +26 -3
  36. package/dist/cjs/commands/search.js +211 -71
  37. package/dist/cjs/commands/search.js.map +1 -1
  38. package/dist/cjs/commands/signals.d.cts +4 -3
  39. package/dist/cjs/commands/signals.d.ts +4 -3
  40. package/dist/cjs/commands/signals.js +13 -4
  41. package/dist/cjs/commands/signals.js.map +1 -1
  42. package/dist/cjs/commands/snapshot.d.cts +3 -0
  43. package/dist/cjs/commands/snapshot.d.ts +3 -0
  44. package/dist/cjs/commands/snapshot.js +180 -0
  45. package/dist/cjs/commands/snapshot.js.map +1 -0
  46. package/dist/cjs/embed/cohere.js +41 -16
  47. package/dist/cjs/embed/cohere.js.map +1 -1
  48. package/dist/cjs/embed/endpoint.d.cts +2 -0
  49. package/dist/cjs/embed/endpoint.d.ts +2 -0
  50. package/dist/cjs/embed/endpoint.js +30 -0
  51. package/dist/cjs/embed/endpoint.js.map +1 -0
  52. package/dist/cjs/embed/handoff.d.cts +7 -2
  53. package/dist/cjs/embed/handoff.d.ts +7 -2
  54. package/dist/cjs/embed/handoff.js +10 -0
  55. package/dist/cjs/embed/handoff.js.map +1 -1
  56. package/dist/cjs/embed/http.d.cts +18 -1
  57. package/dist/cjs/embed/http.d.ts +18 -1
  58. package/dist/cjs/embed/http.js +239 -40
  59. package/dist/cjs/embed/http.js.map +1 -1
  60. package/dist/cjs/embed/openai.js +39 -17
  61. package/dist/cjs/embed/openai.js.map +1 -1
  62. package/dist/cjs/embed/query.d.cts +9 -3
  63. package/dist/cjs/embed/query.d.ts +9 -3
  64. package/dist/cjs/embed/query.js +257 -90
  65. package/dist/cjs/embed/query.js.map +1 -1
  66. package/dist/cjs/embed/registry.d.cts +2 -2
  67. package/dist/cjs/embed/registry.d.ts +2 -2
  68. package/dist/cjs/embed/registry.js +36 -4
  69. package/dist/cjs/embed/registry.js.map +1 -1
  70. package/dist/cjs/embed/static.js +6 -2
  71. package/dist/cjs/embed/static.js.map +1 -1
  72. package/dist/cjs/embed/store.js +42 -77
  73. package/dist/cjs/embed/store.js.map +1 -1
  74. package/dist/cjs/embed/types.d.cts +5 -2
  75. package/dist/cjs/embed/types.d.ts +5 -2
  76. package/dist/cjs/embed/types.js.map +1 -1
  77. package/dist/cjs/features/embed.js +290 -43
  78. package/dist/cjs/features/embed.js.map +1 -1
  79. package/dist/cjs/graph/traverse.d.cts +2 -2
  80. package/dist/cjs/graph/traverse.d.ts +2 -2
  81. package/dist/cjs/graph/traverse.js +15 -5
  82. package/dist/cjs/graph/traverse.js.map +1 -1
  83. package/dist/cjs/index.d.cts +2 -2
  84. package/dist/cjs/index.d.ts +2 -2
  85. package/dist/cjs/index.js +6 -0
  86. package/dist/cjs/index.js.map +1 -1
  87. package/dist/cjs/output/output.d.cts +4 -36
  88. package/dist/cjs/output/output.d.ts +4 -36
  89. package/dist/cjs/output/output.js +1 -2
  90. package/dist/cjs/output/output.js.map +1 -1
  91. package/dist/cjs/scan/pool.d.cts +2 -1
  92. package/dist/cjs/scan/pool.d.ts +2 -1
  93. package/dist/cjs/scan/pool.js +116 -27
  94. package/dist/cjs/scan/pool.js.map +1 -1
  95. package/dist/cjs/scan/reparse.d.cts +1 -0
  96. package/dist/cjs/scan/reparse.d.ts +1 -0
  97. package/dist/cjs/scan/reparse.js +75 -21
  98. package/dist/cjs/scan/reparse.js.map +1 -1
  99. package/dist/cjs/store/builder.d.cts +11 -21
  100. package/dist/cjs/store/builder.d.ts +11 -21
  101. package/dist/cjs/store/builder.js +1077 -438
  102. package/dist/cjs/store/builder.js.map +1 -1
  103. package/dist/cjs/store/duckdb/connection.js +16 -2
  104. package/dist/cjs/store/duckdb/connection.js.map +1 -1
  105. package/dist/cjs/store/duckdb/open.d.cts +1 -1
  106. package/dist/cjs/store/duckdb/open.d.ts +1 -1
  107. package/dist/cjs/store/duckdb/open.js +73 -65
  108. package/dist/cjs/store/duckdb/open.js.map +1 -1
  109. package/dist/cjs/store/duckdb/reconcile.js +533 -15
  110. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  111. package/dist/cjs/store/embed-scope.js +19 -9
  112. package/dist/cjs/store/embed-scope.js.map +1 -1
  113. package/dist/cjs/store/index.d.cts +6 -0
  114. package/dist/cjs/store/index.d.ts +6 -0
  115. package/dist/cjs/store/index.js +8 -4
  116. package/dist/cjs/store/index.js.map +1 -1
  117. package/dist/cjs/store/open.d.cts +6 -1
  118. package/dist/cjs/store/open.d.ts +6 -1
  119. package/dist/cjs/store/open.js +230 -307
  120. package/dist/cjs/store/open.js.map +1 -1
  121. package/dist/cjs/store/readiness.d.cts +5 -0
  122. package/dist/cjs/store/readiness.d.ts +5 -0
  123. package/dist/cjs/store/readiness.js +39 -0
  124. package/dist/cjs/store/readiness.js.map +1 -0
  125. package/dist/cjs/store/reconcile.d.cts +26 -1
  126. package/dist/cjs/store/reconcile.d.ts +26 -1
  127. package/dist/cjs/store/reconcile.js +670 -576
  128. package/dist/cjs/store/reconcile.js.map +1 -1
  129. package/dist/cjs/store/signature.d.cts +1 -0
  130. package/dist/cjs/store/signature.d.ts +1 -0
  131. package/dist/cjs/store/signature.js +9 -0
  132. package/dist/cjs/store/signature.js.map +1 -1
  133. package/dist/cjs/store/sqlite/open.d.cts +1 -1
  134. package/dist/cjs/store/sqlite/open.d.ts +1 -1
  135. package/dist/cjs/store/sqlite/open.js +84 -90
  136. package/dist/cjs/store/sqlite/open.js.map +1 -1
  137. package/dist/cjs/store/sqlite/reconcile.js.map +1 -1
  138. package/dist/cjs/store/sqlite/store.js +63 -60
  139. package/dist/cjs/store/sqlite/store.js.map +1 -1
  140. package/dist/cjs/store/sqlite/vectors.d.cts +2 -2
  141. package/dist/cjs/store/sqlite/vectors.d.ts +2 -2
  142. package/dist/cjs/store/sqlite/vectors.js +8 -4
  143. package/dist/cjs/store/sqlite/vectors.js.map +1 -1
  144. package/dist/cjs/store/stages.js.map +1 -1
  145. package/dist/cjs/store/turso/connection.d.cts +1 -0
  146. package/dist/cjs/store/turso/connection.d.ts +1 -0
  147. package/dist/cjs/store/turso/connection.js +319 -94
  148. package/dist/cjs/store/turso/connection.js.map +1 -1
  149. package/dist/cjs/store/turso/open.d.cts +1 -1
  150. package/dist/cjs/store/turso/open.d.ts +1 -1
  151. package/dist/cjs/store/turso/open.js +70 -74
  152. package/dist/cjs/store/turso/open.js.map +1 -1
  153. package/dist/cjs/store/turso/store.js +25 -23
  154. package/dist/cjs/store/turso/store.js.map +1 -1
  155. package/dist/cjs/store/turso/vectors.d.cts +2 -2
  156. package/dist/cjs/store/turso/vectors.d.ts +2 -2
  157. package/dist/cjs/store/turso/vectors.js +26 -16
  158. package/dist/cjs/store/turso/vectors.js.map +1 -1
  159. package/dist/cjs/store/types.d.cts +4 -1
  160. package/dist/cjs/store/types.d.ts +4 -1
  161. package/dist/cjs/store/types.js.map +1 -1
  162. package/dist/cjs/store/vectors.d.cts +14 -1
  163. package/dist/cjs/store/vectors.d.ts +14 -1
  164. package/dist/cjs/store/vectors.js +61 -0
  165. package/dist/cjs/store/vectors.js.map +1 -1
  166. package/dist/cjs/watch.d.cts +6 -0
  167. package/dist/cjs/watch.d.ts +6 -0
  168. package/dist/cjs/watch.js +42 -10
  169. package/dist/cjs/watch.js.map +1 -1
  170. package/dist/cjs/workers/parse.d.cts +4 -3
  171. package/dist/cjs/workers/parse.d.ts +4 -3
  172. package/dist/cjs/workers/parse.js +19 -17
  173. package/dist/cjs/workers/parse.js.map +1 -1
  174. package/dist/esm/cli/index.d.ts +1 -1
  175. package/dist/esm/cli/index.js +1 -1
  176. package/dist/esm/cli/index.js.map +1 -1
  177. package/dist/esm/cli/path.js +4 -10
  178. package/dist/esm/cli/path.js.map +1 -1
  179. package/dist/esm/cli/related.js +5 -3
  180. package/dist/esm/cli/related.js.map +1 -1
  181. package/dist/esm/commands/index.d.ts +6 -3
  182. package/dist/esm/commands/index.js +1 -0
  183. package/dist/esm/commands/index.js.map +1 -1
  184. package/dist/esm/commands/map.d.ts +14 -5
  185. package/dist/esm/commands/map.js +2 -0
  186. package/dist/esm/commands/map.js.map +1 -1
  187. package/dist/esm/commands/path.d.ts +14 -0
  188. package/dist/esm/commands/path.js +33 -0
  189. package/dist/esm/commands/path.js.map +1 -0
  190. package/dist/esm/commands/peek.d.ts +16 -1
  191. package/dist/esm/commands/peek.js +35 -9
  192. package/dist/esm/commands/peek.js.map +1 -1
  193. package/dist/esm/commands/related.d.ts +16 -3
  194. package/dist/esm/commands/related.js +45 -28
  195. package/dist/esm/commands/related.js.map +1 -1
  196. package/dist/esm/commands/scope.d.ts +1 -0
  197. package/dist/esm/commands/scope.js +58 -0
  198. package/dist/esm/commands/scope.js.map +1 -1
  199. package/dist/esm/commands/search.d.ts +26 -3
  200. package/dist/esm/commands/search.js +85 -18
  201. package/dist/esm/commands/search.js.map +1 -1
  202. package/dist/esm/commands/signals.d.ts +4 -3
  203. package/dist/esm/commands/signals.js +11 -4
  204. package/dist/esm/commands/signals.js.map +1 -1
  205. package/dist/esm/commands/snapshot.d.ts +3 -0
  206. package/dist/esm/commands/snapshot.js +25 -0
  207. package/dist/esm/commands/snapshot.js.map +1 -0
  208. package/dist/esm/embed/cohere.js +35 -10
  209. package/dist/esm/embed/cohere.js.map +1 -1
  210. package/dist/esm/embed/endpoint.d.ts +2 -0
  211. package/dist/esm/embed/endpoint.js +11 -0
  212. package/dist/esm/embed/endpoint.js.map +1 -0
  213. package/dist/esm/embed/handoff.d.ts +7 -2
  214. package/dist/esm/embed/handoff.js +7 -0
  215. package/dist/esm/embed/handoff.js.map +1 -1
  216. package/dist/esm/embed/http.d.ts +18 -1
  217. package/dist/esm/embed/http.js +137 -17
  218. package/dist/esm/embed/http.js.map +1 -1
  219. package/dist/esm/embed/openai.js +34 -12
  220. package/dist/esm/embed/openai.js.map +1 -1
  221. package/dist/esm/embed/query.d.ts +9 -3
  222. package/dist/esm/embed/query.js +98 -26
  223. package/dist/esm/embed/query.js.map +1 -1
  224. package/dist/esm/embed/registry.d.ts +2 -2
  225. package/dist/esm/embed/registry.js +34 -5
  226. package/dist/esm/embed/registry.js.map +1 -1
  227. package/dist/esm/embed/static.js +10 -2
  228. package/dist/esm/embed/static.js.map +1 -1
  229. package/dist/esm/embed/store.js +30 -21
  230. package/dist/esm/embed/store.js.map +1 -1
  231. package/dist/esm/embed/types.d.ts +5 -2
  232. package/dist/esm/embed/types.js.map +1 -1
  233. package/dist/esm/features/embed.js +82 -21
  234. package/dist/esm/features/embed.js.map +1 -1
  235. package/dist/esm/graph/traverse.d.ts +2 -2
  236. package/dist/esm/graph/traverse.js +4 -2
  237. package/dist/esm/graph/traverse.js.map +1 -1
  238. package/dist/esm/index.d.ts +2 -2
  239. package/dist/esm/index.js +1 -1
  240. package/dist/esm/index.js.map +1 -1
  241. package/dist/esm/output/output.d.ts +4 -36
  242. package/dist/esm/output/output.js +1 -2
  243. package/dist/esm/output/output.js.map +1 -1
  244. package/dist/esm/scan/pool.d.ts +2 -1
  245. package/dist/esm/scan/pool.js +80 -23
  246. package/dist/esm/scan/pool.js.map +1 -1
  247. package/dist/esm/scan/reparse.d.ts +1 -0
  248. package/dist/esm/scan/reparse.js +40 -12
  249. package/dist/esm/scan/reparse.js.map +1 -1
  250. package/dist/esm/store/builder.d.ts +11 -21
  251. package/dist/esm/store/builder.js +337 -133
  252. package/dist/esm/store/builder.js.map +1 -1
  253. package/dist/esm/store/duckdb/connection.js +9 -1
  254. package/dist/esm/store/duckdb/connection.js.map +1 -1
  255. package/dist/esm/store/duckdb/open.d.ts +1 -1
  256. package/dist/esm/store/duckdb/open.js +13 -9
  257. package/dist/esm/store/duckdb/open.js.map +1 -1
  258. package/dist/esm/store/duckdb/reconcile.js +145 -10
  259. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  260. package/dist/esm/store/embed-scope.js +16 -6
  261. package/dist/esm/store/embed-scope.js.map +1 -1
  262. package/dist/esm/store/index.d.ts +6 -0
  263. package/dist/esm/store/index.js +10 -4
  264. package/dist/esm/store/index.js.map +1 -1
  265. package/dist/esm/store/open.d.ts +6 -1
  266. package/dist/esm/store/open.js +77 -87
  267. package/dist/esm/store/open.js.map +1 -1
  268. package/dist/esm/store/readiness.d.ts +5 -0
  269. package/dist/esm/store/readiness.js +11 -0
  270. package/dist/esm/store/readiness.js.map +1 -0
  271. package/dist/esm/store/reconcile.d.ts +26 -1
  272. package/dist/esm/store/reconcile.js +142 -120
  273. package/dist/esm/store/reconcile.js.map +1 -1
  274. package/dist/esm/store/signature.d.ts +1 -0
  275. package/dist/esm/store/signature.js +8 -0
  276. package/dist/esm/store/signature.js.map +1 -1
  277. package/dist/esm/store/sqlite/open.d.ts +1 -1
  278. package/dist/esm/store/sqlite/open.js +12 -12
  279. package/dist/esm/store/sqlite/open.js.map +1 -1
  280. package/dist/esm/store/sqlite/reconcile.js +2 -2
  281. package/dist/esm/store/sqlite/reconcile.js.map +1 -1
  282. package/dist/esm/store/sqlite/store.js +21 -18
  283. package/dist/esm/store/sqlite/store.js.map +1 -1
  284. package/dist/esm/store/sqlite/vectors.d.ts +2 -2
  285. package/dist/esm/store/sqlite/vectors.js +7 -5
  286. package/dist/esm/store/sqlite/vectors.js.map +1 -1
  287. package/dist/esm/store/stages.js.map +1 -1
  288. package/dist/esm/store/turso/connection.d.ts +1 -0
  289. package/dist/esm/store/turso/connection.js +97 -28
  290. package/dist/esm/store/turso/connection.js.map +1 -1
  291. package/dist/esm/store/turso/open.d.ts +1 -1
  292. package/dist/esm/store/turso/open.js +9 -8
  293. package/dist/esm/store/turso/open.js.map +1 -1
  294. package/dist/esm/store/turso/store.js +16 -14
  295. package/dist/esm/store/turso/store.js.map +1 -1
  296. package/dist/esm/store/turso/vectors.d.ts +2 -2
  297. package/dist/esm/store/turso/vectors.js +27 -17
  298. package/dist/esm/store/turso/vectors.js.map +1 -1
  299. package/dist/esm/store/types.d.ts +4 -1
  300. package/dist/esm/store/types.js.map +1 -1
  301. package/dist/esm/store/vectors.d.ts +14 -1
  302. package/dist/esm/store/vectors.js +55 -0
  303. package/dist/esm/store/vectors.js.map +1 -1
  304. package/dist/esm/watch.d.ts +6 -0
  305. package/dist/esm/watch.js +40 -14
  306. package/dist/esm/watch.js.map +1 -1
  307. package/dist/esm/workers/parse.d.ts +4 -3
  308. package/dist/esm/workers/parse.js +19 -17
  309. package/dist/esm/workers/parse.js.map +1 -1
  310. package/package.json +1 -1
  311. package/skills/sense/SKILL.md +4 -2
  312. package/skills/sense/references/stores/duckdb.md +1 -1
  313. package/skills/sense-setup/SKILL.md +2 -2
  314. package/skills/sense-setup/references/embeddings.md +1 -1
  315. package/skills/sense-setup/references/store-benchmarks.md +5 -5
  316. package/skills/sense-setup/references/stores/duckdb.md +1 -1
@@ -9,6 +9,12 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
+ get HTTP_ATTEMPT_TIMEOUT_MS () {
13
+ return HTTP_ATTEMPT_TIMEOUT_MS;
14
+ },
15
+ get MODEL_FILE_ATTEMPT_TIMEOUT_MS () {
16
+ return MODEL_FILE_ATTEMPT_TIMEOUT_MS;
17
+ },
12
18
  get fetchWithRetry () {
13
19
  return fetchWithRetry;
14
20
  },
@@ -16,6 +22,7 @@ _export(exports, {
16
22
  return probeReachable;
17
23
  }
18
24
  });
25
+ var _errorsts = require("../errors.js");
19
26
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
20
27
  try {
21
28
  var info = gen[key](arg);
@@ -42,6 +49,55 @@ function _async_to_generator(fn) {
42
49
  });
43
50
  };
44
51
  }
52
+ function _define_property(obj, key, value) {
53
+ if (key in obj) {
54
+ Object.defineProperty(obj, key, {
55
+ value: value,
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true
59
+ });
60
+ } else obj[key] = value;
61
+ return obj;
62
+ }
63
+ function _object_spread(target) {
64
+ for(var i = 1; i < arguments.length; i++){
65
+ var source = arguments[i] != null ? arguments[i] : {};
66
+ var ownKeys = Object.keys(source);
67
+ if (typeof Object.getOwnPropertySymbols === "function") {
68
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
69
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
70
+ }));
71
+ }
72
+ ownKeys.forEach(function(key) {
73
+ _define_property(target, key, source[key]);
74
+ });
75
+ }
76
+ return target;
77
+ }
78
+ function ownKeys(object, enumerableOnly) {
79
+ var keys = Object.keys(object);
80
+ if (Object.getOwnPropertySymbols) {
81
+ var symbols = Object.getOwnPropertySymbols(object);
82
+ if (enumerableOnly) {
83
+ symbols = symbols.filter(function(sym) {
84
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
85
+ });
86
+ }
87
+ keys.push.apply(keys, symbols);
88
+ }
89
+ return keys;
90
+ }
91
+ function _object_spread_props(target, source) {
92
+ source = source != null ? source : {};
93
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
94
+ else {
95
+ ownKeys(Object(source)).forEach(function(key) {
96
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
97
+ });
98
+ }
99
+ return target;
100
+ }
45
101
  function _ts_generator(thisArg, body) {
46
102
  var f, y, t, _ = {
47
103
  label: 0,
@@ -142,112 +198,255 @@ function _ts_generator(thisArg, body) {
142
198
  }
143
199
  }
144
200
  var MAX_ATTEMPTS = 3;
145
- function sleep(ms) {
146
- return new Promise(function(resolve) {
201
+ var MAX_RETRY_AFTER_MS = 10000;
202
+ var DEFAULT_BASE_DELAY_MS = 200;
203
+ var HTTP_ATTEMPT_TIMEOUT_MS = 30000;
204
+ var MODEL_FILE_ATTEMPT_TIMEOUT_MS = 5 * 60000;
205
+ function safeUrl(url) {
206
+ try {
207
+ var parsed = new URL(url);
208
+ parsed.username = '';
209
+ parsed.password = '';
210
+ parsed.search = '';
211
+ parsed.hash = '';
212
+ return parsed.href;
213
+ } catch (unused) {
214
+ return 'the configured embedding endpoint';
215
+ }
216
+ }
217
+ function attemptController(callerSignal, timeoutMs) {
218
+ callerSignal === null || callerSignal === void 0 ? void 0 : callerSignal.throwIfAborted();
219
+ var controller = new AbortController();
220
+ var timeoutReason = {};
221
+ var relayAbort = function relayAbort() {
222
+ return controller.abort(callerSignal === null || callerSignal === void 0 ? void 0 : callerSignal.reason);
223
+ };
224
+ callerSignal === null || callerSignal === void 0 ? void 0 : callerSignal.addEventListener('abort', relayAbort, {
225
+ once: true
226
+ });
227
+ if (callerSignal === null || callerSignal === void 0 ? void 0 : callerSignal.aborted) relayAbort();
228
+ var timer = setTimeout(function() {
229
+ return controller.abort(timeoutReason);
230
+ }, timeoutMs);
231
+ return {
232
+ controller: controller,
233
+ timeoutReason: timeoutReason,
234
+ cleanup: function cleanup() {
235
+ clearTimeout(timer);
236
+ callerSignal === null || callerSignal === void 0 ? void 0 : callerSignal.removeEventListener('abort', relayAbort);
237
+ }
238
+ };
239
+ }
240
+ function disposeResponse(response, controller) {
241
+ var cancellation = response.body && !response.bodyUsed ? response.body.cancel() : undefined;
242
+ controller.abort();
243
+ // The controller owns socket cleanup; observe stream cancellation without delaying the attempt.
244
+ if (cancellation) void cancellation.then(function() {
245
+ return undefined;
246
+ }, function() {
247
+ return undefined;
248
+ });
249
+ }
250
+ function sleep(ms, signal) {
251
+ signal === null || signal === void 0 ? void 0 : signal.throwIfAborted();
252
+ if (!signal) return new Promise(function(resolve) {
147
253
  return setTimeout(resolve, ms);
148
254
  });
255
+ return new Promise(function(resolve, reject) {
256
+ var timer;
257
+ var cleanup = function cleanup() {
258
+ if (timer) clearTimeout(timer);
259
+ signal.removeEventListener('abort', onAbort);
260
+ };
261
+ var onAbort = function onAbort() {
262
+ cleanup();
263
+ reject(signal.reason);
264
+ };
265
+ signal.addEventListener('abort', onAbort, {
266
+ once: true
267
+ });
268
+ timer = setTimeout(function() {
269
+ cleanup();
270
+ resolve();
271
+ }, ms);
272
+ if (signal.aborted) onAbort();
273
+ });
149
274
  }
150
- function fetchWithRetry(url, init) {
151
- var baseDelayMs = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 200;
152
- return _async_to_generator(function() {
153
- var attempt, res, retryAfter, err;
275
+ function failedRequest(url, phase, attempts, timeoutMs, timedOut) {
276
+ var endpoint = safeUrl(url);
277
+ if (timedOut) {
278
+ return new _errorsts.SenseError('EMBED_MODEL', "".concat(endpoint, " timed out after ").concat(timeoutMs, "ms while waiting for ").concat(phase, " (attempt ").concat(attempts, "/").concat(MAX_ATTEMPTS, "); check the embedding service and network"));
279
+ }
280
+ return new _errorsts.SenseError('EMBED_MODEL', "".concat(endpoint, " failed while waiting for ").concat(phase, " after ").concat(attempts, " attempts; check the embedding service and network"));
281
+ }
282
+ function buffered(response, body, requestUrl) {
283
+ return {
284
+ ok: response.ok,
285
+ status: response.status,
286
+ headers: response.headers,
287
+ body: body,
288
+ url: safeUrl(response.url || requestUrl)
289
+ };
290
+ }
291
+ function fetchWithRetry(_0, _1) {
292
+ return _async_to_generator(function(url, init) {
293
+ var options, _options_attemptTimeoutMs, _options_baseDelayMs, timeoutMs, baseDelayMs, attempt, _options_signal, _attemptController, controller, timeoutReason, cleanup, response, phase, retryDelayMs, retryable, retryAfter, _options_signal1, _options_signal2, body, unused, _options_signal3, timedOut;
294
+ var _arguments = arguments;
154
295
  return _ts_generator(this, function(_state) {
155
296
  switch(_state.label){
156
297
  case 0:
298
+ options = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
299
+ timeoutMs = (_options_attemptTimeoutMs = options.attemptTimeoutMs) !== null && _options_attemptTimeoutMs !== void 0 ? _options_attemptTimeoutMs : HTTP_ATTEMPT_TIMEOUT_MS;
300
+ baseDelayMs = (_options_baseDelayMs = options.baseDelayMs) !== null && _options_baseDelayMs !== void 0 ? _options_baseDelayMs : DEFAULT_BASE_DELAY_MS;
157
301
  attempt = 0;
158
302
  _state.label = 1;
159
303
  case 1:
160
304
  if (!(attempt < MAX_ATTEMPTS)) return [
161
305
  3,
162
- 8
306
+ 12
163
307
  ];
308
+ (_options_signal = options.signal) === null || _options_signal === void 0 ? void 0 : _options_signal.throwIfAborted();
309
+ _attemptController = attemptController(options.signal, timeoutMs), controller = _attemptController.controller, timeoutReason = _attemptController.timeoutReason, cleanup = _attemptController.cleanup;
310
+ response = void 0;
311
+ phase = 'response headers';
312
+ retryDelayMs = void 0;
164
313
  _state.label = 2;
165
314
  case 2:
166
315
  _state.trys.push([
167
316
  2,
168
- 5,
169
- ,
170
- 7
317
+ 7,
318
+ 8,
319
+ 9
171
320
  ]);
172
321
  return [
173
322
  4,
174
- fetch(url, init)
323
+ fetch(url, _object_spread_props(_object_spread({}, init), {
324
+ signal: controller.signal
325
+ }))
175
326
  ];
176
327
  case 3:
177
- res = _state.sent();
178
- if (res.ok || res.status !== 429 && res.status < 500 || attempt === MAX_ATTEMPTS - 1) return [
179
- 2,
180
- res
328
+ response = _state.sent();
329
+ if (!!response.ok) return [
330
+ 3,
331
+ 4
181
332
  ];
182
- retryAfter = Number(res.headers.get('retry-after'));
183
- // Capped: a server naming a huge Retry-After must not stall an embed run for it.
333
+ retryable = response.status === 429 || response.status >= 500;
334
+ if (retryable && attempt < MAX_ATTEMPTS - 1) {
335
+ retryAfter = Number(response.headers.get('retry-after'));
336
+ retryDelayMs = retryAfter > 0 ? Math.min(retryAfter * 1000, MAX_RETRY_AFTER_MS) : baseDelayMs * Math.pow(2, attempt);
337
+ disposeResponse(response, controller);
338
+ } else {
339
+ ;
340
+ disposeResponse(response, controller);
341
+ (_options_signal1 = options.signal) === null || _options_signal1 === void 0 ? void 0 : _options_signal1.throwIfAborted();
342
+ return [
343
+ 2,
344
+ buffered(response, new ArrayBuffer(0), url)
345
+ ];
346
+ }
184
347
  return [
185
- 4,
186
- sleep(retryAfter > 0 ? Math.min(retryAfter * 1000, 10000) : baseDelayMs * Math.pow(2, attempt))
348
+ 3,
349
+ 6
187
350
  ];
188
351
  case 4:
189
- _state.sent();
352
+ phase = 'response body';
190
353
  return [
191
- 3,
192
- 7
354
+ 4,
355
+ response.arrayBuffer()
193
356
  ];
194
357
  case 5:
195
- err = _state.sent();
196
- if (attempt === MAX_ATTEMPTS - 1) throw err;
358
+ body = _state.sent();
359
+ (_options_signal2 = options.signal) === null || _options_signal2 === void 0 ? void 0 : _options_signal2.throwIfAborted();
197
360
  return [
198
- 4,
199
- sleep(baseDelayMs * Math.pow(2, attempt))
361
+ 2,
362
+ buffered(response, body, url)
200
363
  ];
201
364
  case 6:
202
- _state.sent();
203
365
  return [
204
366
  3,
205
- 7
367
+ 9
206
368
  ];
207
369
  case 7:
370
+ unused = _state.sent();
371
+ try {
372
+ ;
373
+ (_options_signal3 = options.signal) === null || _options_signal3 === void 0 ? void 0 : _options_signal3.throwIfAborted();
374
+ } finally{
375
+ if (response) disposeResponse(response, controller);
376
+ }
377
+ timedOut = controller.signal.reason === timeoutReason;
378
+ if (attempt === MAX_ATTEMPTS - 1) throw failedRequest(url, phase, attempt + 1, timeoutMs, timedOut);
379
+ retryDelayMs = baseDelayMs * Math.pow(2, attempt);
380
+ return [
381
+ 3,
382
+ 9
383
+ ];
384
+ case 8:
385
+ cleanup();
386
+ return [
387
+ 7
388
+ ];
389
+ case 9:
390
+ return [
391
+ 4,
392
+ sleep(retryDelayMs !== null && retryDelayMs !== void 0 ? retryDelayMs : baseDelayMs * Math.pow(2, attempt), options.signal)
393
+ ];
394
+ case 10:
395
+ _state.sent();
396
+ _state.label = 11;
397
+ case 11:
208
398
  attempt++;
209
399
  return [
210
400
  3,
211
401
  1
212
402
  ];
213
- case 8:
403
+ case 12:
214
404
  throw new Error('unreachable');
215
405
  }
216
406
  });
217
- })();
407
+ }).apply(this, arguments);
218
408
  }
219
409
  function probeReachable(url) {
220
410
  var timeoutMs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1500;
221
411
  return _async_to_generator(function() {
222
- var unused;
412
+ var _attemptController, controller, cleanup, response, unused;
223
413
  return _ts_generator(this, function(_state) {
224
414
  switch(_state.label){
225
415
  case 0:
416
+ _attemptController = attemptController(undefined, timeoutMs), controller = _attemptController.controller, cleanup = _attemptController.cleanup;
417
+ _state.label = 1;
418
+ case 1:
226
419
  _state.trys.push([
227
- 0,
228
- 2,
229
- ,
230
- 3
420
+ 1,
421
+ 3,
422
+ 4,
423
+ 5
231
424
  ]);
232
425
  return [
233
426
  4,
234
427
  fetch(url, {
235
- signal: AbortSignal.timeout(timeoutMs)
428
+ signal: controller.signal
236
429
  })
237
430
  ];
238
- case 1:
239
- _state.sent();
431
+ case 2:
432
+ response = _state.sent();
433
+ disposeResponse(response, controller);
240
434
  return [
241
435
  2,
242
436
  true
243
437
  ];
244
- case 2:
438
+ case 3:
245
439
  unused = _state.sent();
246
440
  return [
247
441
  2,
248
442
  false
249
443
  ];
250
- case 3:
444
+ case 4:
445
+ cleanup();
446
+ return [
447
+ 7
448
+ ];
449
+ case 5:
251
450
  return [
252
451
  2
253
452
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/http.ts"],"sourcesContent":["const MAX_ATTEMPTS = 3;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// Shared retry glue for the HTTP providers: 429/5xx/network failure retry with exponential\n// backoff honoring Retry-After; any other status returns immediately for the caller to handle.\nexport async function fetchWithRetry(url: string, init: RequestInit, baseDelayMs = 200): Promise<Response> {\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n try {\n const res = await fetch(url, init);\n if (res.ok || (res.status !== 429 && res.status < 500) || attempt === MAX_ATTEMPTS - 1) return res;\n const retryAfter = Number(res.headers.get('retry-after'));\n // Capped: a server naming a huge Retry-After must not stall an embed run for it.\n await sleep(retryAfter > 0 ? Math.min(retryAfter * 1000, 10_000) : baseDelayMs * 2 ** attempt);\n } catch (err) {\n if (attempt === MAX_ATTEMPTS - 1) throw err;\n await sleep(baseDelayMs * 2 ** attempt);\n }\n }\n throw new Error('unreachable');\n}\n\n// Any HTTP response means the endpoint is up; only a network failure or the timeout counts as\n// unreachable, so an air-gapped machine never waits more than timeoutMs on `sense status`.\nexport async function probeReachable(url: string, timeoutMs = 1500): Promise<boolean> {\n try {\n await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["fetchWithRetry","probeReachable","MAX_ATTEMPTS","sleep","ms","Promise","resolve","setTimeout","url","init","baseDelayMs","attempt","res","retryAfter","err","fetch","ok","status","Number","headers","get","Math","min","Error","timeoutMs","signal","AbortSignal","timeout"],"mappings":";;;;;;;;;;;QAQsBA;eAAAA;;QAkBAC;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA1BtB,IAAMC,eAAe;AAErB,SAASC,MAAMC,EAAU;IACvB,OAAO,IAAIC,QAAQ,SAACC;eAAYC,WAAWD,SAASF;;AACtD;AAIO,SAAeJ,eAAeQ,GAAW,EAAEC,IAAiB;QAAEC,cAAAA,iEAAc;;YACxEC,SAECC,KAEAC,YAGCC;;;;oBAPFH,UAAU;;;yBAAGA,CAAAA,UAAUT,YAAW;;;;;;;;;;;;oBAE3B;;wBAAMa,MAAMP,KAAKC;;;oBAAvBG,MAAM;oBACZ,IAAIA,IAAII,EAAE,IAAKJ,IAAIK,MAAM,KAAK,OAAOL,IAAIK,MAAM,GAAG,OAAQN,YAAYT,eAAe,GAAG;;wBAAOU;;oBACzFC,aAAaK,OAAON,IAAIO,OAAO,CAACC,GAAG,CAAC;oBAC1C,iFAAiF;oBACjF;;wBAAMjB,MAAMU,aAAa,IAAIQ,KAAKC,GAAG,CAACT,aAAa,MAAM,SAAUH,uBAAc,GAAKC;;;oBAAtF;;;;;;oBACOG;oBACP,IAAIH,YAAYT,eAAe,GAAG,MAAMY;oBACxC;;wBAAMX,MAAMO,uBAAc,GAAKC;;;oBAA/B;;;;;;oBAT0CA;;;;;;oBAY9C,MAAM,IAAIY,MAAM;;;IAClB;;AAIO,SAAetB,eAAeO,GAAW;QAAEgB,YAAAA,iEAAY;;;;;;;;;;;;oBAE1D;;wBAAMT,MAAMP,KAAK;4BAAEiB,QAAQC,YAAYC,OAAO,CAACH;wBAAW;;;oBAA1D;oBACA;;wBAAO;;;;oBAEP;;wBAAO;;;;;;;;IAEX"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/http.ts"],"sourcesContent":["import { SenseError } from '../errors.ts';\n\nconst MAX_ATTEMPTS = 3;\nconst MAX_RETRY_AFTER_MS = 10_000;\nconst DEFAULT_BASE_DELAY_MS = 200;\n\n// Initial policy bounds small API/metadata responses separately from model-file downloads.\nexport const HTTP_ATTEMPT_TIMEOUT_MS = 30_000;\nexport const MODEL_FILE_ATTEMPT_TIMEOUT_MS = 5 * 60_000;\n\nexport type FetchRequestInit = Omit<RequestInit, 'signal'> & { signal?: never };\n\nexport interface FetchRetryOptions {\n signal?: AbortSignal;\n attemptTimeoutMs?: number;\n baseDelayMs?: number;\n}\n\nexport interface BufferedResponse {\n readonly ok: boolean;\n readonly status: number;\n readonly headers: Headers;\n readonly body: ArrayBuffer;\n readonly url: string;\n}\n\ntype ResponsePhase = 'response headers' | 'response body';\n\nfunction safeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n parsed.username = '';\n parsed.password = '';\n parsed.search = '';\n parsed.hash = '';\n return parsed.href;\n } catch {\n return 'the configured embedding endpoint';\n }\n}\n\nfunction attemptController(\n callerSignal: AbortSignal | undefined,\n timeoutMs: number\n): {\n controller: AbortController;\n timeoutReason: object;\n cleanup: () => void;\n} {\n callerSignal?.throwIfAborted();\n const controller = new AbortController();\n const timeoutReason = {};\n const relayAbort = () => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', relayAbort, { once: true });\n if (callerSignal?.aborted) relayAbort();\n const timer = setTimeout(() => controller.abort(timeoutReason), timeoutMs);\n return {\n controller,\n timeoutReason,\n cleanup: () => {\n clearTimeout(timer);\n callerSignal?.removeEventListener('abort', relayAbort);\n },\n };\n}\n\nfunction disposeResponse(response: Response, controller: AbortController): void {\n const cancellation = response.body && !response.bodyUsed ? response.body.cancel() : undefined;\n controller.abort();\n // The controller owns socket cleanup; observe stream cancellation without delaying the attempt.\n if (cancellation)\n void cancellation.then(\n () => undefined,\n () => undefined\n );\n}\n\nfunction sleep(ms: number, signal: AbortSignal | undefined): Promise<void> {\n signal?.throwIfAborted();\n if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));\n return new Promise((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(signal.reason);\n };\n signal.addEventListener('abort', onAbort, { once: true });\n timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n if (signal.aborted) onAbort();\n });\n}\n\nfunction failedRequest(url: string, phase: ResponsePhase, attempts: number, timeoutMs: number, timedOut: boolean): SenseError {\n const endpoint = safeUrl(url);\n if (timedOut) {\n return new SenseError('EMBED_MODEL', `${endpoint} timed out after ${timeoutMs}ms while waiting for ${phase} (attempt ${attempts}/${MAX_ATTEMPTS}); check the embedding service and network`);\n }\n return new SenseError('EMBED_MODEL', `${endpoint} failed while waiting for ${phase} after ${attempts} attempts; check the embedding service and network`);\n}\n\nfunction buffered(response: Response, body: ArrayBuffer, requestUrl: string): BufferedResponse {\n return {\n ok: response.ok,\n status: response.status,\n headers: response.headers,\n body,\n url: safeUrl(response.url || requestUrl),\n };\n}\n\n// Each attempt covers response headers and the complete successful body. Retry cleanup and\n// backoff honor one caller signal without transferring ownership of that signal.\nexport async function fetchWithRetry(url: string, init: FetchRequestInit, options: FetchRetryOptions = {}): Promise<BufferedResponse> {\n const timeoutMs = options.attemptTimeoutMs ?? HTTP_ATTEMPT_TIMEOUT_MS;\n const baseDelayMs = options.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n options.signal?.throwIfAborted();\n const { controller, timeoutReason, cleanup } = attemptController(options.signal, timeoutMs);\n let response: Response | undefined;\n let phase: ResponsePhase = 'response headers';\n let retryDelayMs: number | undefined;\n try {\n response = await fetch(url, { ...init, signal: controller.signal });\n if (!response.ok) {\n const retryable = response.status === 429 || response.status >= 500;\n if (retryable && attempt < MAX_ATTEMPTS - 1) {\n const retryAfter = Number(response.headers.get('retry-after'));\n retryDelayMs = retryAfter > 0 ? Math.min(retryAfter * 1000, MAX_RETRY_AFTER_MS) : baseDelayMs * 2 ** attempt;\n disposeResponse(response, controller);\n } else {\n disposeResponse(response, controller);\n options.signal?.throwIfAborted();\n return buffered(response, new ArrayBuffer(0), url);\n }\n } else {\n phase = 'response body';\n const body = await response.arrayBuffer();\n options.signal?.throwIfAborted();\n return buffered(response, body, url);\n }\n } catch {\n try {\n options.signal?.throwIfAborted();\n } finally {\n if (response) disposeResponse(response, controller);\n }\n const timedOut = controller.signal.reason === timeoutReason;\n if (attempt === MAX_ATTEMPTS - 1) throw failedRequest(url, phase, attempt + 1, timeoutMs, timedOut);\n retryDelayMs = baseDelayMs * 2 ** attempt;\n } finally {\n cleanup();\n }\n await sleep(retryDelayMs ?? baseDelayMs * 2 ** attempt, options.signal);\n }\n throw new Error('unreachable');\n}\n\n// Any HTTP response means the endpoint is up. Abort it immediately because status does not\n// consume its body, and bound the headers wait for an air-gapped machine.\nexport async function probeReachable(url: string, timeoutMs = 1500): Promise<boolean> {\n const { controller, cleanup } = attemptController(undefined, timeoutMs);\n try {\n const response = await fetch(url, { signal: controller.signal });\n disposeResponse(response, controller);\n return true;\n } catch {\n return false;\n } finally {\n cleanup();\n }\n}\n"],"names":["HTTP_ATTEMPT_TIMEOUT_MS","MODEL_FILE_ATTEMPT_TIMEOUT_MS","fetchWithRetry","probeReachable","MAX_ATTEMPTS","MAX_RETRY_AFTER_MS","DEFAULT_BASE_DELAY_MS","safeUrl","url","parsed","URL","username","password","search","hash","href","attemptController","callerSignal","timeoutMs","throwIfAborted","controller","AbortController","timeoutReason","relayAbort","abort","reason","addEventListener","once","aborted","timer","setTimeout","cleanup","clearTimeout","removeEventListener","disposeResponse","response","cancellation","body","bodyUsed","cancel","undefined","then","sleep","ms","signal","Promise","resolve","reject","onAbort","failedRequest","phase","attempts","timedOut","endpoint","SenseError","buffered","requestUrl","ok","status","headers","init","options","baseDelayMs","attempt","retryDelayMs","retryable","retryAfter","attemptTimeoutMs","fetch","Number","get","Math","min","ArrayBuffer","arrayBuffer","Error"],"mappings":"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"}
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "openaiProvider", {
9
9
  }
10
10
  });
11
11
  var _errorsts = require("../errors.js");
12
+ var _endpointts = require("./endpoint.js");
12
13
  var _httpts = require("./http.js");
13
14
  function _array_like_to_array(arr, len) {
14
15
  if (len == null || len > arr.length) len = arr.length;
@@ -154,6 +155,10 @@ function _ts_generator(thisArg, body) {
154
155
  };
155
156
  }
156
157
  }
158
+ function _type_of(obj) {
159
+ "@swc/helpers - typeof";
160
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
161
+ }
157
162
  function _unsupported_iterable_to_array(o, minLen) {
158
163
  if (!o) return;
159
164
  if (typeof o === "string") return _array_like_to_array(o, minLen);
@@ -163,12 +168,30 @@ function _unsupported_iterable_to_array(o, minLen) {
163
168
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
164
169
  }
165
170
  var BATCH_CAP = 64;
171
+ function isEmbedding(value) {
172
+ if (value === null || (typeof value === "undefined" ? "undefined" : _type_of(value)) !== 'object' || !('embedding' in value) || !Array.isArray(value.embedding) || !value.embedding.every(function(part) {
173
+ return typeof part === 'number';
174
+ })) return false;
175
+ return !('index' in value) || value.index === undefined || typeof value.index === 'number';
176
+ }
177
+ function parseBody(body, endpoint) {
178
+ var decoded;
179
+ try {
180
+ decoded = JSON.parse(new TextDecoder().decode(body));
181
+ } catch (unused) {
182
+ throw new _errorsts.SenseError('EMBED_MODEL', "".concat(endpoint, " returned invalid JSON"));
183
+ }
184
+ if (decoded === null || (typeof decoded === "undefined" ? "undefined" : _type_of(decoded)) !== 'object' || !('data' in decoded) || !Array.isArray(decoded.data) || !decoded.data.every(isEmbedding)) {
185
+ throw new _errorsts.SenseError('EMBED_MODEL', "".concat(endpoint, " returned an invalid embedding response"));
186
+ }
187
+ return decoded.data;
188
+ }
166
189
  function openaiProvider(model, url, keyEnv) {
167
190
  return _async_to_generator(function() {
168
191
  var base, headers, key, dims;
169
- function post(texts) {
192
+ function post(texts, options) {
170
193
  return _async_to_generator(function() {
171
- var res, body, data;
194
+ var _options_signal, res, body, data;
172
195
  return _ts_generator(this, function(_state) {
173
196
  switch(_state.label){
174
197
  case 0:
@@ -181,27 +204,26 @@ function openaiProvider(model, url, keyEnv) {
181
204
  model: model,
182
205
  input: texts
183
206
  })
207
+ }, {
208
+ signal: options === null || options === void 0 ? void 0 : options.signal,
209
+ attemptTimeoutMs: _httpts.HTTP_ATTEMPT_TIMEOUT_MS
184
210
  })
185
211
  ];
186
212
  case 1:
187
213
  res = _state.sent();
188
- if (!res.ok) throw new _errorsts.SenseError('EMBED_MODEL', "".concat(base, "/embeddings -> HTTP ").concat(res.status));
189
- return [
190
- 4,
191
- res.json()
192
- ];
193
- case 2:
194
- body = _state.sent();
214
+ options === null || options === void 0 ? void 0 : (_options_signal = options.signal) === null || _options_signal === void 0 ? void 0 : _options_signal.throwIfAborted();
215
+ if (!res.ok) throw new _errorsts.SenseError('EMBED_MODEL', "".concat(res.url, " -> HTTP ").concat(res.status));
216
+ body = parseBody(res.body, res.url);
195
217
  // The schema carries `index` because response order is not promised, and the caller maps
196
218
  // vectors back to chunks positionally: sort by it whenever every element has one.
197
- data = body.data.every(function(d) {
219
+ data = body.every(function(d) {
198
220
  return typeof d.index === 'number';
199
- }) ? _to_consumable_array(body.data).sort(function(a, b) {
221
+ }) ? _to_consumable_array(body).sort(function(a, b) {
200
222
  return a.index - b.index;
201
- }) : body.data;
223
+ }) : body;
202
224
  // A server that drops an input (empty or over-length strings are the usual cause) would
203
225
  // otherwise shift every later vector onto the wrong chunk, silently.
204
- if (data.length !== texts.length) throw new _errorsts.SenseError('EMBED_MODEL', "".concat(base, "/embeddings returned ").concat(data.length, " embeddings for ").concat(texts.length, " inputs"));
226
+ if (data.length !== texts.length) throw new _errorsts.SenseError('EMBED_MODEL', "".concat(res.url, " returned ").concat(data.length, " embeddings for ").concat(texts.length, " inputs"));
205
227
  return [
206
228
  2,
207
229
  data.map(function(d) {
@@ -215,8 +237,8 @@ function openaiProvider(model, url, keyEnv) {
215
237
  return _ts_generator(this, function(_state) {
216
238
  switch(_state.label){
217
239
  case 0:
218
- if (!url) throw new _errorsts.SenseError('EMBED_MODEL', 'embed.provider "openai" requires a url');
219
- base = url.replace(/\/+$/, '');
240
+ base = (0, _endpointts.effectiveEmbedEndpoint)('openai', url);
241
+ if (!base) throw new _errorsts.SenseError('EMBED_MODEL', 'embed.provider "openai" requires a url');
220
242
  headers = {
221
243
  'content-type': 'application/json'
222
244
  };
@@ -239,7 +261,7 @@ function openaiProvider(model, url, keyEnv) {
239
261
  dims: dims,
240
262
  batchCap: BATCH_CAP,
241
263
  embedDocuments: post,
242
- embedQuery: function embedQuery(text) {
264
+ embedQuery: function embedQuery(text, options) {
243
265
  return _async_to_generator(function() {
244
266
  return _ts_generator(this, function(_state) {
245
267
  switch(_state.label){
@@ -248,7 +270,7 @@ function openaiProvider(model, url, keyEnv) {
248
270
  4,
249
271
  post([
250
272
  text
251
- ])
273
+ ], options)
252
274
  ];
253
275
  case 1:
254
276
  return [
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/openai.ts"],"sourcesContent":["import { SenseError } from '../errors.ts';\nimport { fetchWithRetry } from './http.ts';\nimport type { EmbedProvider } from './types.ts';\n\nconst BATCH_CAP = 64;\n\n// One POST against any OpenAI-compatible /embeddings endpoint: Ollama, LM Studio, Cloudflare\n// Workers AI, Jina, Voyage, and Gemini's compat base URL all serve this shape.\nexport async function openaiProvider(model: string, url: string | undefined, keyEnv: string | undefined): Promise<EmbedProvider> {\n if (!url) throw new SenseError('EMBED_MODEL', 'embed.provider \"openai\" requires a url');\n const base = url.replace(/\\/+$/, '');\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n const key = keyEnv ? process.env[keyEnv] : undefined;\n if (key) headers.authorization = `Bearer ${key}`;\n\n async function post(texts: string[]): Promise<Float32Array[]> {\n const res = await fetchWithRetry(`${base}/embeddings`, { method: 'POST', headers, body: JSON.stringify({ model, input: texts }) });\n if (!res.ok) throw new SenseError('EMBED_MODEL', `${base}/embeddings -> HTTP ${res.status}`);\n const body = (await res.json()) as { data: Array<{ embedding: number[]; index?: number }> };\n // The schema carries `index` because response order is not promised, and the caller maps\n // vectors back to chunks positionally: sort by it whenever every element has one.\n const data = body.data.every((d) => typeof d.index === 'number') ? [...body.data].sort((a, b) => (a.index as number) - (b.index as number)) : body.data;\n // A server that drops an input (empty or over-length strings are the usual cause) would\n // otherwise shift every later vector onto the wrong chunk, silently.\n if (data.length !== texts.length) throw new SenseError('EMBED_MODEL', `${base}/embeddings returned ${data.length} embeddings for ${texts.length} inputs`);\n return data.map((d) => Float32Array.from(d.embedding));\n }\n\n const dims = (await post(['dimension probe']))[0].length;\n // embedQuery and embedDocuments are symmetric here; per-model prefixes like nomic's\n // search_document/search_query are not applied.\n return { id: `openai:${base}:${model}`, dims, batchCap: BATCH_CAP, embedDocuments: post, embedQuery: async (text) => (await post([text]))[0] };\n}\n"],"names":["openaiProvider","BATCH_CAP","model","url","keyEnv","base","headers","key","dims","post","texts","res","body","data","fetchWithRetry","method","JSON","stringify","input","ok","SenseError","status","json","every","d","index","sort","a","b","length","map","Float32Array","from","embedding","replace","process","env","undefined","authorization","id","batchCap","embedDocuments","embedQuery","text"],"mappings":";;;;+BAQsBA;;;eAAAA;;;wBARK;sBACI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAG/B,IAAMC,YAAY;AAIX,SAAeD,eAAeE,KAAa,EAAEC,GAAuB,EAAEC,MAA0B;;YAE/FC,MACAC,SACAC,KAgBAC;QAbN,SAAeC,KAAKC,KAAe;;oBAC3BC,KAEAC,MAGAC;;;;4BALM;;gCAAMC,IAAAA,sBAAc,EAAC,AAAC,GAAO,OAALT,MAAK,gBAAc;oCAAEU,QAAQ;oCAAQT,SAAAA;oCAASM,MAAMI,KAAKC,SAAS,CAAC;wCAAEf,OAAAA;wCAAOgB,OAAOR;oCAAM;gCAAG;;;4BAA1HC,MAAM;4BACZ,IAAI,CAACA,IAAIQ,EAAE,EAAE,MAAM,IAAIC,oBAAU,CAAC,eAAe,AAAC,GAA6BT,OAA3BN,MAAK,wBAAiC,OAAXM,IAAIU,MAAM;4BAC3E;;gCAAMV,IAAIW,IAAI;;;4BAAtBV,OAAQ;4BACd,yFAAyF;4BACzF,kFAAkF;4BAC5EC,OAAOD,KAAKC,IAAI,CAACU,KAAK,CAAC,SAACC;uCAAM,OAAOA,EAAEC,KAAK,KAAK;iCAAY,AAAC,qBAAGb,KAAKC,IAAI,EAAEa,IAAI,CAAC,SAACC,GAAGC;uCAAM,AAACD,EAAEF,KAAK,GAAeG,EAAEH,KAAK;iCAAeb,KAAKC,IAAI;4BACvJ,wFAAwF;4BACxF,qEAAqE;4BACrE,IAAIA,KAAKgB,MAAM,KAAKnB,MAAMmB,MAAM,EAAE,MAAM,IAAIT,oBAAU,CAAC,eAAe,AAAC,GAA8BP,OAA5BR,MAAK,yBAAqDK,OAA9BG,KAAKgB,MAAM,EAAC,oBAA+B,OAAbnB,MAAMmB,MAAM,EAAC;4BAChJ;;gCAAOhB,KAAKiB,GAAG,CAAC,SAACN;2CAAMO,aAAaC,IAAI,CAACR,EAAES,SAAS;;;;;YACtD;;;;;oBAjBA,IAAI,CAAC9B,KAAK,MAAM,IAAIiB,oBAAU,CAAC,eAAe;oBACxCf,OAAOF,IAAI+B,OAAO,CAAC,QAAQ;oBAC3B5B,UAAkC;wBAAE,gBAAgB;oBAAmB;oBACvEC,MAAMH,SAAS+B,QAAQC,GAAG,CAAChC,OAAO,GAAGiC;oBAC3C,IAAI9B,KAAKD,QAAQgC,aAAa,GAAG,AAAC,UAAa,OAAJ/B;oBAe7B;;wBAAME;4BAAM;;;;oBAApBD,OAAO,AAAC,aAAgC,CAAC,EAAE,CAACqB,MAAM;oBACxD,oFAAoF;oBACpF,gDAAgD;oBAChD;;wBAAO;4BAAEU,IAAI,AAAC,UAAiBrC,OAARG,MAAK,KAAS,OAANH;4BAASM,MAAAA;4BAAMgC,UAAUvC;4BAAWwC,gBAAgBhC;4BAAMiC,YAAY,SAAZA,WAAmBC;;;;;gDAAU;;oDAAMlC;wDAAMkC;;;;;;oDAAZ,aAAmB,CAAC,EAAE;;;;;;wBAAC;;;;IAC/I"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/openai.ts"],"sourcesContent":["import { SenseError } from '../errors.ts';\nimport { effectiveEmbedEndpoint } from './endpoint.ts';\nimport { fetchWithRetry, HTTP_ATTEMPT_TIMEOUT_MS } from './http.ts';\nimport type { EmbedCallOptions, EmbedProvider } from './types.ts';\n\nconst BATCH_CAP = 64;\n\ninterface OpenaiEmbedding {\n embedding: number[];\n index?: number;\n}\n\nfunction isEmbedding(value: unknown): value is OpenaiEmbedding {\n if (value === null || typeof value !== 'object' || !('embedding' in value) || !Array.isArray(value.embedding) || !value.embedding.every((part) => typeof part === 'number')) return false;\n return !('index' in value) || value.index === undefined || typeof value.index === 'number';\n}\n\nfunction parseBody(body: ArrayBuffer, endpoint: string): OpenaiEmbedding[] {\n let decoded: unknown;\n try {\n decoded = JSON.parse(new TextDecoder().decode(body));\n } catch {\n throw new SenseError('EMBED_MODEL', `${endpoint} returned invalid JSON`);\n }\n if (decoded === null || typeof decoded !== 'object' || !('data' in decoded) || !Array.isArray(decoded.data) || !decoded.data.every(isEmbedding)) {\n throw new SenseError('EMBED_MODEL', `${endpoint} returned an invalid embedding response`);\n }\n return decoded.data;\n}\n\n// One POST against any OpenAI-compatible /embeddings endpoint: Ollama, LM Studio, Cloudflare\n// Workers AI, Jina, Voyage, and Gemini's compat base URL all serve this shape.\nexport async function openaiProvider(model: string, url: string | undefined, keyEnv: string | undefined): Promise<EmbedProvider> {\n const base = effectiveEmbedEndpoint('openai', url);\n if (!base) throw new SenseError('EMBED_MODEL', 'embed.provider \"openai\" requires a url');\n const headers: Record<string, string> = { 'content-type': 'application/json' };\n const key = keyEnv ? process.env[keyEnv] : undefined;\n if (key) headers.authorization = `Bearer ${key}`;\n\n async function post(texts: string[], options?: EmbedCallOptions): Promise<Float32Array[]> {\n const res = await fetchWithRetry(`${base}/embeddings`, { method: 'POST', headers, body: JSON.stringify({ model, input: texts }) }, { signal: options?.signal, attemptTimeoutMs: HTTP_ATTEMPT_TIMEOUT_MS });\n options?.signal?.throwIfAborted();\n if (!res.ok) throw new SenseError('EMBED_MODEL', `${res.url} -> HTTP ${res.status}`);\n const body = parseBody(res.body, res.url);\n // The schema carries `index` because response order is not promised, and the caller maps\n // vectors back to chunks positionally: sort by it whenever every element has one.\n const data = body.every((d): d is OpenaiEmbedding & { index: number } => typeof d.index === 'number') ? [...body].sort((a, b) => a.index - b.index) : body;\n // A server that drops an input (empty or over-length strings are the usual cause) would\n // otherwise shift every later vector onto the wrong chunk, silently.\n if (data.length !== texts.length) throw new SenseError('EMBED_MODEL', `${res.url} returned ${data.length} embeddings for ${texts.length} inputs`);\n return data.map((d) => Float32Array.from(d.embedding));\n }\n\n const dims = (await post(['dimension probe']))[0].length;\n // embedQuery and embedDocuments are symmetric here; per-model prefixes like nomic's\n // search_document/search_query are not applied.\n return { id: `openai:${base}:${model}`, dims, batchCap: BATCH_CAP, embedDocuments: post, embedQuery: async (text, options) => (await post([text], options))[0] };\n}\n"],"names":["openaiProvider","BATCH_CAP","isEmbedding","value","Array","isArray","embedding","every","part","index","undefined","parseBody","body","endpoint","decoded","JSON","parse","TextDecoder","decode","SenseError","data","model","url","keyEnv","base","headers","key","dims","post","texts","options","res","fetchWithRetry","method","stringify","input","signal","attemptTimeoutMs","HTTP_ATTEMPT_TIMEOUT_MS","throwIfAborted","ok","status","d","sort","a","b","length","map","Float32Array","from","effectiveEmbedEndpoint","process","env","authorization","id","batchCap","embedDocuments","embedQuery","text"],"mappings":"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"}
@@ -1,12 +1,18 @@
1
- import type { Config } from '../config/index.js';
1
+ import { type Config } from '../config/index.js';
2
2
  import type { Store, VectorCandidate, VectorSimilar } from '../store/types.js';
3
+ import { type EmbedCallOptions } from './types.js';
3
4
  export declare function toStore(full: Float32Array, dims: number, int8: boolean): {
4
5
  v: Float32Array;
5
6
  scale: number;
6
7
  };
7
- export declare function embedPending(store: Store, cfg: Config, allowed?: ReadonlySet<string>): Promise<void>;
8
+ export declare function embedPending(store: Store, cfg: Config, allowed?: ReadonlySet<string>, expectedSignature?: string | null, options?: EmbedCallOptions): Promise<void>;
8
9
  export declare function ensureDocumentEmbeddings(store: Store, _cfg: Config, allowed: ReadonlySet<string>): Promise<void>;
9
- export declare function semanticCandidates(store: Store, cfg: Config, terms: string, fetch: number, allowed?: Set<string>): Promise<VectorCandidate[]>;
10
+ export interface PreparedSemanticQuery {
11
+ readonly vector: Float32Array;
12
+ readonly storeDims: number;
13
+ }
14
+ export declare function prepareSemanticQuery(cfg: Config, terms: string, options?: EmbedCallOptions): Promise<PreparedSemanticQuery>;
15
+ export declare function semanticCandidates(store: Store, prepared: PreparedSemanticQuery, fetch: number, allowed?: Set<string>): Promise<VectorCandidate[]>;
10
16
  export declare function hasEmbedding(store: Store, path: string): Promise<boolean>;
11
17
  export declare function similarNotes(store: Store, _cfg: Config, path: string, opts: {
12
18
  exclude: Set<string>;
@@ -1,12 +1,18 @@
1
- import type { Config } from '../config/index.js';
1
+ import { type Config } from '../config/index.js';
2
2
  import type { Store, VectorCandidate, VectorSimilar } from '../store/types.js';
3
+ import { type EmbedCallOptions } from './types.js';
3
4
  export declare function toStore(full: Float32Array, dims: number, int8: boolean): {
4
5
  v: Float32Array;
5
6
  scale: number;
6
7
  };
7
- export declare function embedPending(store: Store, cfg: Config, allowed?: ReadonlySet<string>): Promise<void>;
8
+ export declare function embedPending(store: Store, cfg: Config, allowed?: ReadonlySet<string>, expectedSignature?: string | null, options?: EmbedCallOptions): Promise<void>;
8
9
  export declare function ensureDocumentEmbeddings(store: Store, _cfg: Config, allowed: ReadonlySet<string>): Promise<void>;
9
- export declare function semanticCandidates(store: Store, cfg: Config, terms: string, fetch: number, allowed?: Set<string>): Promise<VectorCandidate[]>;
10
+ export interface PreparedSemanticQuery {
11
+ readonly vector: Float32Array;
12
+ readonly storeDims: number;
13
+ }
14
+ export declare function prepareSemanticQuery(cfg: Config, terms: string, options?: EmbedCallOptions): Promise<PreparedSemanticQuery>;
15
+ export declare function semanticCandidates(store: Store, prepared: PreparedSemanticQuery, fetch: number, allowed?: Set<string>): Promise<VectorCandidate[]>;
10
16
  export declare function hasEmbedding(store: Store, path: string): Promise<boolean>;
11
17
  export declare function similarNotes(store: Store, _cfg: Config, path: string, opts: {
12
18
  exclude: Set<string>;