@iflow-ai/search-openapi 0.1.0-pre.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +248 -0
  3. package/dist/auth.d.ts +22 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +68 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/bin.d.ts +24 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +84 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/config.d.ts +42 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +70 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/errors.d.ts +27 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +49 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/handlers/image-search.d.ts +8 -0
  20. package/dist/handlers/image-search.d.ts.map +1 -0
  21. package/dist/handlers/image-search.js +53 -0
  22. package/dist/handlers/image-search.js.map +1 -0
  23. package/dist/handlers/index.d.ts +13 -0
  24. package/dist/handlers/index.d.ts.map +1 -0
  25. package/dist/handlers/index.js +15 -0
  26. package/dist/handlers/index.js.map +1 -0
  27. package/dist/handlers/types.d.ts +37 -0
  28. package/dist/handlers/types.d.ts.map +1 -0
  29. package/dist/handlers/types.js +13 -0
  30. package/dist/handlers/types.js.map +1 -0
  31. package/dist/handlers/web-fetch.d.ts +8 -0
  32. package/dist/handlers/web-fetch.d.ts.map +1 -0
  33. package/dist/handlers/web-fetch.js +41 -0
  34. package/dist/handlers/web-fetch.js.map +1 -0
  35. package/dist/handlers/web-search.d.ts +10 -0
  36. package/dist/handlers/web-search.d.ts.map +1 -0
  37. package/dist/handlers/web-search.js +55 -0
  38. package/dist/handlers/web-search.js.map +1 -0
  39. package/dist/index.d.ts +13 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +13 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/openapi.d.ts +19 -0
  44. package/dist/openapi.d.ts.map +1 -0
  45. package/dist/openapi.js +112 -0
  46. package/dist/openapi.js.map +1 -0
  47. package/dist/server.d.ts +31 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +150 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/version.d.ts +4 -0
  52. package/dist/version.d.ts.map +1 -0
  53. package/dist/version.js +7 -0
  54. package/dist/version.js.map +1 -0
  55. package/package.json +61 -0
package/dist/server.js ADDED
@@ -0,0 +1,150 @@
1
+ /**
2
+ * HTTP request listener for the iFlow Search OpenAPI server.
3
+ *
4
+ * Routes:
5
+ * GET /health — liveness, never gated by bearer auth
6
+ * GET /openapi.json — OpenAPI 3.1 schema (bearer-gated when configured)
7
+ * POST /tools/iflow_web_search — search-core webSearch passthrough
8
+ * POST /tools/iflow_image_search — search-core imageSearch passthrough
9
+ * POST /tools/iflow_web_fetch — search-core webFetch passthrough
10
+ *
11
+ * Design notes:
12
+ * - The server is dependency-light: just the Node built-in `http` module
13
+ * plus search-core. No Express / Fastify / Koa.
14
+ * - All HTTP, Authorization, attribution headers, and iFlow error mapping
15
+ * live in @iflow-ai/search-core. This server only translates between
16
+ * JSON-over-HTTP and the typed search-core client.
17
+ * - The handler list is the single source of truth for both the routes
18
+ * and /openapi.json.
19
+ * - Body size is capped at MAX_BODY_BYTES to keep tool platforms from
20
+ * accidentally streaming megabytes into the server.
21
+ */
22
+ import { checkBearer } from "./auth.js";
23
+ import { TOOL_HANDLERS } from "./handlers/index.js";
24
+ import { buildOpenApiDocument } from "./openapi.js";
25
+ import { genericErrorBody } from "./errors.js";
26
+ import { VERSION } from "./version.js";
27
+ const MAX_BODY_BYTES = 1 * 1024 * 1024; // 1 MiB
28
+ export function createApp(options) {
29
+ const { client, authToken } = options;
30
+ const openApiDocument = buildOpenApiDocument({
31
+ bearerAuth: authToken !== undefined,
32
+ });
33
+ const openApiJson = JSON.stringify(openApiDocument);
34
+ const handlersByPath = new Map();
35
+ for (const handler of TOOL_HANDLERS) {
36
+ handlersByPath.set(`/tools/${handler.name}`, handler);
37
+ }
38
+ return async function listener(req, res) {
39
+ try {
40
+ const method = req.method ?? "GET";
41
+ const url = new URL(req.url ?? "/", "http://localhost");
42
+ const pathname = url.pathname;
43
+ // /health is intentionally outside the auth gate.
44
+ if (method === "GET" && pathname === "/health") {
45
+ return sendJson(res, 200, { ok: true, version: VERSION });
46
+ }
47
+ const authResult = checkBearer(req.headers["authorization"], authToken);
48
+ if (!authResult.ok) {
49
+ return sendJson(res, authResult.status, {
50
+ ok: false,
51
+ error: { code: authResult.code, message: authResult.message },
52
+ });
53
+ }
54
+ if (method === "GET" && pathname === "/openapi.json") {
55
+ return sendRawJson(res, 200, openApiJson);
56
+ }
57
+ const toolHandler = handlersByPath.get(pathname);
58
+ if (toolHandler) {
59
+ if (method !== "POST") {
60
+ return sendJson(res, 405, genericErrorBody("method_not_allowed", `Use POST for /tools/${toolHandler.name}.`));
61
+ }
62
+ const bodyResult = await readJsonBody(req);
63
+ if (!bodyResult.ok) {
64
+ return sendJson(res, bodyResult.status, bodyResult.body);
65
+ }
66
+ const handlerResult = await toolHandler.handle(bodyResult.value, client);
67
+ return sendJson(res, handlerResult.status, handlerResult.body);
68
+ }
69
+ return sendJson(res, 404, genericErrorBody("not_found", `No route for ${method} ${pathname}.`));
70
+ }
71
+ catch (err) {
72
+ const message = err instanceof Error ? err.message : String(err);
73
+ // Last-resort fallback. Should never be reached because handlers
74
+ // route IFlowError through statusForIFlowError + iflowErrorToBody.
75
+ return sendJson(res, 500, genericErrorBody("internal_error", message));
76
+ }
77
+ };
78
+ }
79
+ async function readJsonBody(req) {
80
+ return new Promise((resolve) => {
81
+ const chunks = [];
82
+ let total = 0;
83
+ let aborted = false;
84
+ req.on("data", (chunk) => {
85
+ if (aborted)
86
+ return;
87
+ total += chunk.length;
88
+ if (total > MAX_BODY_BYTES) {
89
+ aborted = true;
90
+ req.destroy();
91
+ resolve({
92
+ ok: false,
93
+ status: 413,
94
+ body: genericErrorBody("payload_too_large", `Request body exceeds ${MAX_BODY_BYTES} bytes.`),
95
+ });
96
+ return;
97
+ }
98
+ chunks.push(chunk);
99
+ });
100
+ req.on("end", () => {
101
+ if (aborted)
102
+ return;
103
+ const raw = Buffer.concat(chunks).toString("utf8").trim();
104
+ if (raw.length === 0) {
105
+ resolve({ ok: true, value: {} });
106
+ return;
107
+ }
108
+ try {
109
+ const parsed = JSON.parse(raw);
110
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
111
+ resolve({
112
+ ok: false,
113
+ status: 400,
114
+ body: genericErrorBody("invalid_input", "Request body must be a JSON object."),
115
+ });
116
+ return;
117
+ }
118
+ resolve({ ok: true, value: parsed });
119
+ }
120
+ catch (err) {
121
+ const message = err instanceof Error ? err.message : String(err);
122
+ resolve({
123
+ ok: false,
124
+ status: 400,
125
+ body: genericErrorBody("invalid_input", `Request body is not valid JSON: ${message}`),
126
+ });
127
+ }
128
+ });
129
+ req.on("error", (err) => {
130
+ if (aborted)
131
+ return;
132
+ aborted = true;
133
+ resolve({
134
+ ok: false,
135
+ status: 400,
136
+ body: genericErrorBody("invalid_input", err.message),
137
+ });
138
+ });
139
+ });
140
+ }
141
+ function sendJson(res, status, body) {
142
+ sendRawJson(res, status, JSON.stringify(body));
143
+ }
144
+ function sendRawJson(res, status, json) {
145
+ res.statusCode = status;
146
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
147
+ res.setHeader("Content-Length", Buffer.byteLength(json).toString());
148
+ res.end(json);
149
+ }
150
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAoB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAShD,MAAM,UAAU,SAAS,CAAC,OAAmB;IAC3C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,eAAe,GAAG,oBAAoB,CAAC;QAC3C,UAAU,EAAE,SAAS,KAAK,SAAS;KACpC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IACtD,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,cAAc,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,KAAK,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAE9B,kDAAkD;YAClD,IAAI,MAAM,KAAK,KAAK,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC/C,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,UAAU,GAAG,WAAW,CAC5B,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,EAC5B,SAAS,CACV,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;gBACnB,OAAO,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,EAAE;oBACtC,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE;iBAC1C,CAAC,CAAC;YACzB,CAAC;YAED,IAAI,MAAM,KAAK,KAAK,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;gBACrD,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,OAAO,QAAQ,CACb,GAAG,EACH,GAAG,EACH,gBAAgB,CACd,oBAAoB,EACpB,uBAAuB,WAAW,CAAC,IAAI,GAAG,CAC3C,CACF,CAAC;gBACJ,CAAC;gBAED,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;oBACnB,OAAO,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3D,CAAC;gBAED,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACzE,OAAO,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,QAAQ,CACb,GAAG,EACH,GAAG,EACH,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,MAAM,IAAI,QAAQ,GAAG,CAAC,CACrE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,iEAAiE;YACjE,mEAAmE;YACnE,OAAO,QAAQ,CACb,GAAG,EACH,GAAG,EACH,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAC5C,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAYD,KAAK,UAAU,YAAY,CACzB,GAAoB;IAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC/B,IAAI,OAAO;gBAAE,OAAO;YACpB,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;YACtB,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;gBAC3B,OAAO,GAAG,IAAI,CAAC;gBACf,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,CAAC;oBACN,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,gBAAgB,CACpB,mBAAmB,EACnB,wBAAwB,cAAc,SAAS,CAChD;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,OAAO;gBAAE,OAAO;YACpB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3E,OAAO,CAAC;wBACN,EAAE,EAAE,KAAK;wBACT,MAAM,EAAE,GAAG;wBACX,IAAI,EAAE,gBAAgB,CACpB,eAAe,EACf,qCAAqC,CACtC;qBACF,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO,CAAC;oBACN,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,gBAAgB,CACpB,eAAe,EACf,mCAAmC,OAAO,EAAE,CAC7C;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC;gBACN,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,gBAAgB,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC;aACrD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAY;IACjE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAY;IACpE,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;IACjE,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const VERSION: string;
2
+ export declare const INTEGRATION_NAME = "@iflow-ai/search-openapi";
3
+ export declare const SOURCE = "openapi";
4
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,EAAE,MAAoB,CAAC;AAC3C,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAC3D,eAAO,MAAM,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { createRequire } from "node:module";
2
+ const localRequire = createRequire(import.meta.url);
3
+ const pkg = localRequire("../package.json");
4
+ export const VERSION = pkg.version;
5
+ export const INTEGRATION_NAME = "@iflow-ai/search-openapi";
6
+ export const SOURCE = "openapi";
7
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,CAAwB,CAAC;AAEnE,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@iflow-ai/search-openapi",
3
+ "version": "0.1.0-pre.0",
4
+ "description": "HTTP / OpenAPI tool server for the iFlow Search API. Exposes web search, image search, and web fetch over JSON-over-HTTP for Open WebUI, Coze, and other OpenAPI 3.x tool hosts. Built on @iflow-ai/search-core.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=18"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/zhengyanglsun/iflow-search-js.git",
13
+ "directory": "packages/search-openapi"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/zhengyanglsun/iflow-search-js/issues"
17
+ },
18
+ "homepage": "https://github.com/zhengyanglsun/iflow-search-js/tree/main/packages/search-openapi#readme",
19
+ "main": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "bin": {
28
+ "iflow-search-openapi": "./dist/bin.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "keywords": [
36
+ "iflow",
37
+ "iflow-search",
38
+ "openapi",
39
+ "http",
40
+ "tool-server",
41
+ "open-webui",
42
+ "coze",
43
+ "web-search",
44
+ "image-search",
45
+ "web-fetch"
46
+ ],
47
+ "dependencies": {
48
+ "@iflow-ai/search-core": "0.1.0-pre.1"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^20.0.0",
52
+ "typescript": "^5.4.0",
53
+ "vitest": "^1.6.0"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc -p tsconfig.json",
57
+ "typecheck": "tsc --noEmit -p tsconfig.json",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest"
60
+ }
61
+ }