@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.
- package/LICENSE +21 -0
- package/README.md +248 -0
- package/dist/auth.d.ts +22 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +68 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin.d.ts +24 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +84 -0
- package/dist/bin.js.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +49 -0
- package/dist/errors.js.map +1 -0
- package/dist/handlers/image-search.d.ts +8 -0
- package/dist/handlers/image-search.d.ts.map +1 -0
- package/dist/handlers/image-search.js +53 -0
- package/dist/handlers/image-search.js.map +1 -0
- package/dist/handlers/index.d.ts +13 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +15 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/types.d.ts +37 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +13 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/handlers/web-fetch.d.ts +8 -0
- package/dist/handlers/web-fetch.d.ts.map +1 -0
- package/dist/handlers/web-fetch.js +41 -0
- package/dist/handlers/web-fetch.js.map +1 -0
- package/dist/handlers/web-search.d.ts +10 -0
- package/dist/handlers/web-search.d.ts.map +1 -0
- package/dist/handlers/web-search.js +55 -0
- package/dist/handlers/web-search.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/openapi.d.ts +19 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +112 -0
- package/dist/openapi.js.map +1 -0
- package/dist/server.d.ts +31 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +150 -0
- package/dist/server.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/version.js
ADDED
|
@@ -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
|
+
}
|