@123toto/ai-app-assistant-server 0.1.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 +88 -0
- package/dist/ai-sdk-QImICd56.d.cts +188 -0
- package/dist/ai-sdk-QImICd56.d.ts +188 -0
- package/dist/ai-sdk.cjs +564 -0
- package/dist/ai-sdk.cjs.map +1 -0
- package/dist/ai-sdk.d.cts +3 -0
- package/dist/ai-sdk.d.ts +3 -0
- package/dist/ai-sdk.js +17 -0
- package/dist/ai-sdk.js.map +1 -0
- package/dist/chunk-NIF6AW6I.js +537 -0
- package/dist/chunk-NIF6AW6I.js.map +1 -0
- package/dist/chunk-OA7OXUK7.js +136 -0
- package/dist/chunk-OA7OXUK7.js.map +1 -0
- package/dist/express.cjs +137 -0
- package/dist/express.cjs.map +1 -0
- package/dist/express.d.cts +49 -0
- package/dist/express.d.ts +49 -0
- package/dist/express.js +100 -0
- package/dist/express.js.map +1 -0
- package/dist/index.cjs +3063 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +141 -0
- package/dist/index.d.ts +141 -0
- package/dist/index.js +2372 -0
- package/dist/index.js.map +1 -0
- package/dist/managed-server-7iurKxF1.d.cts +533 -0
- package/dist/managed-server-CrZumvVU.d.ts +533 -0
- package/dist/nest.cjs +141 -0
- package/dist/nest.cjs.map +1 -0
- package/dist/nest.d.cts +47 -0
- package/dist/nest.d.ts +47 -0
- package/dist/nest.js +122 -0
- package/dist/nest.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nest.ts"],"sourcesContent":["import {\n All,\n Controller,\n Inject,\n Injectable,\n Module,\n Req,\n Res,\n type DynamicModule,\n type FactoryProvider,\n type ModuleMetadata,\n type Provider\n} from \"@nestjs/common\";\nimport type { ManagedAiDocsServer } from \"./managed-server.js\";\n\n/** Injection token exported so a host can update documents after Swagger bootstrap. */\nexport const MANAGED_AI_DOCS_SERVER = Symbol.for(\"@123toto/ai-app-assistant-server/managed\");\n\nexport interface AiDocsNestRequest {\n method?: string;\n originalUrl?: string;\n url?: string;\n protocol?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: () => void): unknown;\n off?(event: string, listener: () => void): unknown;\n [key: string]: unknown;\n}\n\nexport interface AiDocsNestResponse {\n statusCode: number;\n setHeader(name: string, value: string): unknown;\n write(chunk: Uint8Array): boolean;\n end(chunk?: string): unknown;\n once?(event: string, listener: () => void): unknown;\n destroyed?: boolean;\n}\n\nexport interface AiDocsNestModuleOptions<\n TRequest extends AiDocsNestRequest = AiDocsNestRequest\n> extends Pick<ModuleMetadata, \"imports\"> {\n /** Nest controller path. The application's global prefix is applied normally. */\n path?: string;\n inject?: FactoryProvider[\"inject\"];\n // Nest factories intentionally accept host-defined constructor signatures.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useFactory: (...dependencies: any[]) =>\n | AiDocsNestManagedServer<TRequest>\n | Promise<AiDocsNestManagedServer<TRequest>>;\n}\n\n/** Structural server contract avoids leaking framework-internal types across package entry points. */\nexport type AiDocsNestManagedServer<TRequest extends AiDocsNestRequest = AiDocsNestRequest> = Pick<\n ManagedAiDocsServer<{ id: string; label: string }, TRequest>,\n \"fetch\" | \"dispose\"\n>;\n\n/**\n * Creates a dynamic Nest module with one catch-all controller owned by the\n * connector. Consumer applications declare no AI Docs endpoints or DTOs.\n */\nexport function createManagedAiDocsNestModule<\n TRequest extends AiDocsNestRequest = AiDocsNestRequest\n>(options: AiDocsNestModuleOptions<TRequest>): DynamicModule {\n const route = options.path?.replace(/^\\/+|\\/+$/g, \"\") || \"ai-docs\";\n\n class ManagedAiDocsNestController {\n public constructor(\n readonly server: AiDocsNestManagedServer<TRequest>\n ) {}\n\n public handle(request: TRequest, response: AiDocsNestResponse): Promise<void> {\n return handleManagedAiDocsNestRequest(this.server, request, response);\n }\n }\n\n Inject(MANAGED_AI_DOCS_SERVER)(ManagedAiDocsNestController, undefined, 0);\n Req()(ManagedAiDocsNestController.prototype, \"handle\", 0);\n Res()(ManagedAiDocsNestController.prototype, \"handle\", 1);\n const descriptor = Object.getOwnPropertyDescriptor(ManagedAiDocsNestController.prototype, \"handle\");\n if (descriptor) All([\"\", \"*path\"])(ManagedAiDocsNestController.prototype, \"handle\", descriptor);\n Controller(route)(ManagedAiDocsNestController);\n\n class ManagedAiDocsNestModule {}\n class ManagedAiDocsNestLifecycle {\n public constructor(readonly server: AiDocsNestManagedServer<TRequest>) {}\n public onApplicationShutdown(): void {\n this.server.dispose();\n }\n }\n Inject(MANAGED_AI_DOCS_SERVER)(ManagedAiDocsNestLifecycle, undefined, 0);\n Injectable()(ManagedAiDocsNestLifecycle);\n const serverProvider: Provider = {\n provide: MANAGED_AI_DOCS_SERVER,\n inject: options.inject ?? [],\n useFactory: options.useFactory\n };\n Module({\n imports: options.imports ?? [],\n controllers: [ManagedAiDocsNestController],\n providers: [serverProvider, ManagedAiDocsNestLifecycle],\n exports: [MANAGED_AI_DOCS_SERVER]\n })(ManagedAiDocsNestModule);\n\n return {\n module: ManagedAiDocsNestModule,\n imports: options.imports ?? [],\n controllers: [ManagedAiDocsNestController],\n providers: [serverProvider, ManagedAiDocsNestLifecycle],\n exports: [MANAGED_AI_DOCS_SERVER]\n };\n}\n\n/** Adapts parsed Nest requests and streamed Fetch responses without Express coupling. */\nexport async function handleManagedAiDocsNestRequest<\n TRequest extends AiDocsNestRequest\n>(\n server: AiDocsNestManagedServer<TRequest>,\n request: TRequest,\n response: AiDocsNestResponse\n): Promise<void> {\n const abortController = new AbortController();\n const abort = (): void => abortController.abort(new DOMException(\"Client disconnected\", \"AbortError\"));\n request.on?.(\"close\", abort);\n try {\n const webRequest = toFetchRequest(request, abortController.signal);\n await writeFetchResponse(response, await server.fetch.handle(webRequest, request));\n } finally {\n request.off?.(\"close\", abort);\n }\n}\n\nfunction toFetchRequest(request: AiDocsNestRequest, signal: AbortSignal): Request {\n const headers = new Headers();\n for (const [name, value] of Object.entries(request.headers)) {\n if (Array.isArray(value)) value.forEach((item) => headers.append(name, item));\n else if (value !== undefined) headers.set(name, value);\n }\n const method = request.method?.toUpperCase() || \"GET\";\n const host = headers.get(\"host\") || \"localhost\";\n const protocol = request.protocol || headers.get(\"x-forwarded-proto\") || \"http\";\n const url = new URL(request.originalUrl || request.url || \"/\", `${protocol}://${host}`);\n const hasBody = method !== \"GET\" && method !== \"HEAD\" && request.body !== undefined;\n return new Request(url, {\n method,\n headers,\n signal,\n ...(hasBody ? { body: serializeBody(request.body, headers) } : {})\n });\n}\n\nfunction serializeBody(body: unknown, headers: Headers): string {\n if (typeof body === \"string\") return body;\n if (body instanceof Uint8Array) return new TextDecoder().decode(body);\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n return JSON.stringify(body);\n}\n\nasync function writeFetchResponse(response: AiDocsNestResponse, result: Response): Promise<void> {\n response.statusCode = result.status;\n result.headers.forEach((value, name) => response.setHeader(name, value));\n if (!result.body) {\n response.end();\n return;\n }\n const reader = result.body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!response.write(value) && response.once) {\n await new Promise<void>((resolve) => response.once!(\"drain\", resolve));\n }\n }\n if (!response.destroyed) response.end();\n } finally {\n reader.releaseLock();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAYO;AAIA,IAAM,yBAAyB,uBAAO,IAAI,0CAA0C;AA8CpF,SAAS,8BAEd,SAA2D;AAC3D,QAAM,QAAQ,QAAQ,MAAM,QAAQ,cAAc,EAAE,KAAK;AAAA,EAEzD,MAAM,4BAA4B;AAAA,IACzB,YACI,QACT;AADS;AAAA,IACR;AAAA,IADQ;AAAA,IAGJ,OAAO,SAAmB,UAA6C;AAC5E,aAAO,+BAA+B,KAAK,QAAQ,SAAS,QAAQ;AAAA,IACtE;AAAA,EACF;AAEA,4BAAO,sBAAsB,EAAE,6BAA6B,QAAW,CAAC;AACxE,yBAAI,EAAE,4BAA4B,WAAW,UAAU,CAAC;AACxD,yBAAI,EAAE,4BAA4B,WAAW,UAAU,CAAC;AACxD,QAAM,aAAa,OAAO,yBAAyB,4BAA4B,WAAW,QAAQ;AAClG,MAAI,WAAY,wBAAI,CAAC,IAAI,OAAO,CAAC,EAAE,4BAA4B,WAAW,UAAU,UAAU;AAC9F,gCAAW,KAAK,EAAE,2BAA2B;AAAA,EAE7C,MAAM,wBAAwB;AAAA,EAAC;AAAA,EAC/B,MAAM,2BAA2B;AAAA,IACxB,YAAqB,QAA2C;AAA3C;AAAA,IAA4C;AAAA,IAA5C;AAAA,IACrB,wBAA8B;AACnC,WAAK,OAAO,QAAQ;AAAA,IACtB;AAAA,EACF;AACA,4BAAO,sBAAsB,EAAE,4BAA4B,QAAW,CAAC;AACvE,gCAAW,EAAE,0BAA0B;AACvC,QAAM,iBAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,QAAQ,QAAQ,UAAU,CAAC;AAAA,IAC3B,YAAY,QAAQ;AAAA,EACtB;AACA,4BAAO;AAAA,IACL,SAAS,QAAQ,WAAW,CAAC;AAAA,IAC7B,aAAa,CAAC,2BAA2B;AAAA,IACzC,WAAW,CAAC,gBAAgB,0BAA0B;AAAA,IACtD,SAAS,CAAC,sBAAsB;AAAA,EAClC,CAAC,EAAE,uBAAuB;AAE1B,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,QAAQ,WAAW,CAAC;AAAA,IAC7B,aAAa,CAAC,2BAA2B;AAAA,IACzC,WAAW,CAAC,gBAAgB,0BAA0B;AAAA,IACtD,SAAS,CAAC,sBAAsB;AAAA,EAClC;AACF;AAGA,eAAsB,+BAGpB,QACA,SACA,UACe;AACf,QAAM,kBAAkB,IAAI,gBAAgB;AAC5C,QAAM,QAAQ,MAAY,gBAAgB,MAAM,IAAI,aAAa,uBAAuB,YAAY,CAAC;AACrG,UAAQ,KAAK,SAAS,KAAK;AAC3B,MAAI;AACF,UAAM,aAAa,eAAe,SAAS,gBAAgB,MAAM;AACjE,UAAM,mBAAmB,UAAU,MAAM,OAAO,MAAM,OAAO,YAAY,OAAO,CAAC;AAAA,EACnF,UAAE;AACA,YAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AACF;AAEA,SAAS,eAAe,SAA4B,QAA8B;AAChF,QAAM,UAAU,IAAI,QAAQ;AAC5B,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,QAAQ,OAAO,GAAG;AAC3D,QAAI,MAAM,QAAQ,KAAK,EAAG,OAAM,QAAQ,CAAC,SAAS,QAAQ,OAAO,MAAM,IAAI,CAAC;AAAA,aACnE,UAAU,OAAW,SAAQ,IAAI,MAAM,KAAK;AAAA,EACvD;AACA,QAAM,SAAS,QAAQ,QAAQ,YAAY,KAAK;AAChD,QAAM,OAAO,QAAQ,IAAI,MAAM,KAAK;AACpC,QAAM,WAAW,QAAQ,YAAY,QAAQ,IAAI,mBAAmB,KAAK;AACzE,QAAM,MAAM,IAAI,IAAI,QAAQ,eAAe,QAAQ,OAAO,KAAK,GAAG,QAAQ,MAAM,IAAI,EAAE;AACtF,QAAM,UAAU,WAAW,SAAS,WAAW,UAAU,QAAQ,SAAS;AAC1E,SAAO,IAAI,QAAQ,KAAK;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,UAAU,EAAE,MAAM,cAAc,QAAQ,MAAM,OAAO,EAAE,IAAI,CAAC;AAAA,EAClE,CAAC;AACH;AAEA,SAAS,cAAc,MAAe,SAA0B;AAC9D,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,gBAAgB,WAAY,QAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AACpE,MAAI,CAAC,QAAQ,IAAI,cAAc,EAAG,SAAQ,IAAI,gBAAgB,kBAAkB;AAChF,SAAO,KAAK,UAAU,IAAI;AAC5B;AAEA,eAAe,mBAAmB,UAA8B,QAAiC;AAC/F,WAAS,aAAa,OAAO;AAC7B,SAAO,QAAQ,QAAQ,CAAC,OAAO,SAAS,SAAS,UAAU,MAAM,KAAK,CAAC;AACvE,MAAI,CAAC,OAAO,MAAM;AAChB,aAAS,IAAI;AACb;AAAA,EACF;AACA,QAAM,SAAS,OAAO,KAAK,UAAU;AACrC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,UAAI,CAAC,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM;AAC3C,cAAM,IAAI,QAAc,CAAC,YAAY,SAAS,KAAM,SAAS,OAAO,CAAC;AAAA,MACvE;AAAA,IACF;AACA,QAAI,CAAC,SAAS,UAAW,UAAS,IAAI;AAAA,EACxC,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;","names":[]}
|
package/dist/nest.d.cts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ModuleMetadata, FactoryProvider, DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { M as ManagedAiDocsServer } from './managed-server-7iurKxF1.cjs';
|
|
3
|
+
import './ai-sdk-QImICd56.cjs';
|
|
4
|
+
import 'ai';
|
|
5
|
+
import '@123toto/ai-app-assistant-contracts';
|
|
6
|
+
|
|
7
|
+
/** Injection token exported so a host can update documents after Swagger bootstrap. */
|
|
8
|
+
declare const MANAGED_AI_DOCS_SERVER: unique symbol;
|
|
9
|
+
interface AiDocsNestRequest {
|
|
10
|
+
method?: string;
|
|
11
|
+
originalUrl?: string;
|
|
12
|
+
url?: string;
|
|
13
|
+
protocol?: string;
|
|
14
|
+
headers: Record<string, string | string[] | undefined>;
|
|
15
|
+
body?: unknown;
|
|
16
|
+
on?(event: string, listener: () => void): unknown;
|
|
17
|
+
off?(event: string, listener: () => void): unknown;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
interface AiDocsNestResponse {
|
|
21
|
+
statusCode: number;
|
|
22
|
+
setHeader(name: string, value: string): unknown;
|
|
23
|
+
write(chunk: Uint8Array): boolean;
|
|
24
|
+
end(chunk?: string): unknown;
|
|
25
|
+
once?(event: string, listener: () => void): unknown;
|
|
26
|
+
destroyed?: boolean;
|
|
27
|
+
}
|
|
28
|
+
interface AiDocsNestModuleOptions<TRequest extends AiDocsNestRequest = AiDocsNestRequest> extends Pick<ModuleMetadata, "imports"> {
|
|
29
|
+
/** Nest controller path. The application's global prefix is applied normally. */
|
|
30
|
+
path?: string;
|
|
31
|
+
inject?: FactoryProvider["inject"];
|
|
32
|
+
useFactory: (...dependencies: any[]) => AiDocsNestManagedServer<TRequest> | Promise<AiDocsNestManagedServer<TRequest>>;
|
|
33
|
+
}
|
|
34
|
+
/** Structural server contract avoids leaking framework-internal types across package entry points. */
|
|
35
|
+
type AiDocsNestManagedServer<TRequest extends AiDocsNestRequest = AiDocsNestRequest> = Pick<ManagedAiDocsServer<{
|
|
36
|
+
id: string;
|
|
37
|
+
label: string;
|
|
38
|
+
}, TRequest>, "fetch" | "dispose">;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a dynamic Nest module with one catch-all controller owned by the
|
|
41
|
+
* connector. Consumer applications declare no AI Docs endpoints or DTOs.
|
|
42
|
+
*/
|
|
43
|
+
declare function createManagedAiDocsNestModule<TRequest extends AiDocsNestRequest = AiDocsNestRequest>(options: AiDocsNestModuleOptions<TRequest>): DynamicModule;
|
|
44
|
+
/** Adapts parsed Nest requests and streamed Fetch responses without Express coupling. */
|
|
45
|
+
declare function handleManagedAiDocsNestRequest<TRequest extends AiDocsNestRequest>(server: AiDocsNestManagedServer<TRequest>, request: TRequest, response: AiDocsNestResponse): Promise<void>;
|
|
46
|
+
|
|
47
|
+
export { type AiDocsNestManagedServer, type AiDocsNestModuleOptions, type AiDocsNestRequest, type AiDocsNestResponse, MANAGED_AI_DOCS_SERVER, createManagedAiDocsNestModule, handleManagedAiDocsNestRequest };
|
package/dist/nest.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ModuleMetadata, FactoryProvider, DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { M as ManagedAiDocsServer } from './managed-server-CrZumvVU.js';
|
|
3
|
+
import './ai-sdk-QImICd56.js';
|
|
4
|
+
import 'ai';
|
|
5
|
+
import '@123toto/ai-app-assistant-contracts';
|
|
6
|
+
|
|
7
|
+
/** Injection token exported so a host can update documents after Swagger bootstrap. */
|
|
8
|
+
declare const MANAGED_AI_DOCS_SERVER: unique symbol;
|
|
9
|
+
interface AiDocsNestRequest {
|
|
10
|
+
method?: string;
|
|
11
|
+
originalUrl?: string;
|
|
12
|
+
url?: string;
|
|
13
|
+
protocol?: string;
|
|
14
|
+
headers: Record<string, string | string[] | undefined>;
|
|
15
|
+
body?: unknown;
|
|
16
|
+
on?(event: string, listener: () => void): unknown;
|
|
17
|
+
off?(event: string, listener: () => void): unknown;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
interface AiDocsNestResponse {
|
|
21
|
+
statusCode: number;
|
|
22
|
+
setHeader(name: string, value: string): unknown;
|
|
23
|
+
write(chunk: Uint8Array): boolean;
|
|
24
|
+
end(chunk?: string): unknown;
|
|
25
|
+
once?(event: string, listener: () => void): unknown;
|
|
26
|
+
destroyed?: boolean;
|
|
27
|
+
}
|
|
28
|
+
interface AiDocsNestModuleOptions<TRequest extends AiDocsNestRequest = AiDocsNestRequest> extends Pick<ModuleMetadata, "imports"> {
|
|
29
|
+
/** Nest controller path. The application's global prefix is applied normally. */
|
|
30
|
+
path?: string;
|
|
31
|
+
inject?: FactoryProvider["inject"];
|
|
32
|
+
useFactory: (...dependencies: any[]) => AiDocsNestManagedServer<TRequest> | Promise<AiDocsNestManagedServer<TRequest>>;
|
|
33
|
+
}
|
|
34
|
+
/** Structural server contract avoids leaking framework-internal types across package entry points. */
|
|
35
|
+
type AiDocsNestManagedServer<TRequest extends AiDocsNestRequest = AiDocsNestRequest> = Pick<ManagedAiDocsServer<{
|
|
36
|
+
id: string;
|
|
37
|
+
label: string;
|
|
38
|
+
}, TRequest>, "fetch" | "dispose">;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a dynamic Nest module with one catch-all controller owned by the
|
|
41
|
+
* connector. Consumer applications declare no AI Docs endpoints or DTOs.
|
|
42
|
+
*/
|
|
43
|
+
declare function createManagedAiDocsNestModule<TRequest extends AiDocsNestRequest = AiDocsNestRequest>(options: AiDocsNestModuleOptions<TRequest>): DynamicModule;
|
|
44
|
+
/** Adapts parsed Nest requests and streamed Fetch responses without Express coupling. */
|
|
45
|
+
declare function handleManagedAiDocsNestRequest<TRequest extends AiDocsNestRequest>(server: AiDocsNestManagedServer<TRequest>, request: TRequest, response: AiDocsNestResponse): Promise<void>;
|
|
46
|
+
|
|
47
|
+
export { type AiDocsNestManagedServer, type AiDocsNestModuleOptions, type AiDocsNestRequest, type AiDocsNestResponse, MANAGED_AI_DOCS_SERVER, createManagedAiDocsNestModule, handleManagedAiDocsNestRequest };
|
package/dist/nest.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// src/nest.ts
|
|
2
|
+
import {
|
|
3
|
+
All,
|
|
4
|
+
Controller,
|
|
5
|
+
Inject,
|
|
6
|
+
Injectable,
|
|
7
|
+
Module,
|
|
8
|
+
Req,
|
|
9
|
+
Res
|
|
10
|
+
} from "@nestjs/common";
|
|
11
|
+
var MANAGED_AI_DOCS_SERVER = /* @__PURE__ */ Symbol.for("@123toto/ai-app-assistant-server/managed");
|
|
12
|
+
function createManagedAiDocsNestModule(options) {
|
|
13
|
+
const route = options.path?.replace(/^\/+|\/+$/g, "") || "ai-docs";
|
|
14
|
+
class ManagedAiDocsNestController {
|
|
15
|
+
constructor(server) {
|
|
16
|
+
this.server = server;
|
|
17
|
+
}
|
|
18
|
+
server;
|
|
19
|
+
handle(request, response) {
|
|
20
|
+
return handleManagedAiDocsNestRequest(this.server, request, response);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
Inject(MANAGED_AI_DOCS_SERVER)(ManagedAiDocsNestController, void 0, 0);
|
|
24
|
+
Req()(ManagedAiDocsNestController.prototype, "handle", 0);
|
|
25
|
+
Res()(ManagedAiDocsNestController.prototype, "handle", 1);
|
|
26
|
+
const descriptor = Object.getOwnPropertyDescriptor(ManagedAiDocsNestController.prototype, "handle");
|
|
27
|
+
if (descriptor) All(["", "*path"])(ManagedAiDocsNestController.prototype, "handle", descriptor);
|
|
28
|
+
Controller(route)(ManagedAiDocsNestController);
|
|
29
|
+
class ManagedAiDocsNestModule {
|
|
30
|
+
}
|
|
31
|
+
class ManagedAiDocsNestLifecycle {
|
|
32
|
+
constructor(server) {
|
|
33
|
+
this.server = server;
|
|
34
|
+
}
|
|
35
|
+
server;
|
|
36
|
+
onApplicationShutdown() {
|
|
37
|
+
this.server.dispose();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
Inject(MANAGED_AI_DOCS_SERVER)(ManagedAiDocsNestLifecycle, void 0, 0);
|
|
41
|
+
Injectable()(ManagedAiDocsNestLifecycle);
|
|
42
|
+
const serverProvider = {
|
|
43
|
+
provide: MANAGED_AI_DOCS_SERVER,
|
|
44
|
+
inject: options.inject ?? [],
|
|
45
|
+
useFactory: options.useFactory
|
|
46
|
+
};
|
|
47
|
+
Module({
|
|
48
|
+
imports: options.imports ?? [],
|
|
49
|
+
controllers: [ManagedAiDocsNestController],
|
|
50
|
+
providers: [serverProvider, ManagedAiDocsNestLifecycle],
|
|
51
|
+
exports: [MANAGED_AI_DOCS_SERVER]
|
|
52
|
+
})(ManagedAiDocsNestModule);
|
|
53
|
+
return {
|
|
54
|
+
module: ManagedAiDocsNestModule,
|
|
55
|
+
imports: options.imports ?? [],
|
|
56
|
+
controllers: [ManagedAiDocsNestController],
|
|
57
|
+
providers: [serverProvider, ManagedAiDocsNestLifecycle],
|
|
58
|
+
exports: [MANAGED_AI_DOCS_SERVER]
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async function handleManagedAiDocsNestRequest(server, request, response) {
|
|
62
|
+
const abortController = new AbortController();
|
|
63
|
+
const abort = () => abortController.abort(new DOMException("Client disconnected", "AbortError"));
|
|
64
|
+
request.on?.("close", abort);
|
|
65
|
+
try {
|
|
66
|
+
const webRequest = toFetchRequest(request, abortController.signal);
|
|
67
|
+
await writeFetchResponse(response, await server.fetch.handle(webRequest, request));
|
|
68
|
+
} finally {
|
|
69
|
+
request.off?.("close", abort);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function toFetchRequest(request, signal) {
|
|
73
|
+
const headers = new Headers();
|
|
74
|
+
for (const [name, value] of Object.entries(request.headers)) {
|
|
75
|
+
if (Array.isArray(value)) value.forEach((item) => headers.append(name, item));
|
|
76
|
+
else if (value !== void 0) headers.set(name, value);
|
|
77
|
+
}
|
|
78
|
+
const method = request.method?.toUpperCase() || "GET";
|
|
79
|
+
const host = headers.get("host") || "localhost";
|
|
80
|
+
const protocol = request.protocol || headers.get("x-forwarded-proto") || "http";
|
|
81
|
+
const url = new URL(request.originalUrl || request.url || "/", `${protocol}://${host}`);
|
|
82
|
+
const hasBody = method !== "GET" && method !== "HEAD" && request.body !== void 0;
|
|
83
|
+
return new Request(url, {
|
|
84
|
+
method,
|
|
85
|
+
headers,
|
|
86
|
+
signal,
|
|
87
|
+
...hasBody ? { body: serializeBody(request.body, headers) } : {}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function serializeBody(body, headers) {
|
|
91
|
+
if (typeof body === "string") return body;
|
|
92
|
+
if (body instanceof Uint8Array) return new TextDecoder().decode(body);
|
|
93
|
+
if (!headers.has("content-type")) headers.set("content-type", "application/json");
|
|
94
|
+
return JSON.stringify(body);
|
|
95
|
+
}
|
|
96
|
+
async function writeFetchResponse(response, result) {
|
|
97
|
+
response.statusCode = result.status;
|
|
98
|
+
result.headers.forEach((value, name) => response.setHeader(name, value));
|
|
99
|
+
if (!result.body) {
|
|
100
|
+
response.end();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const reader = result.body.getReader();
|
|
104
|
+
try {
|
|
105
|
+
while (true) {
|
|
106
|
+
const { done, value } = await reader.read();
|
|
107
|
+
if (done) break;
|
|
108
|
+
if (!response.write(value) && response.once) {
|
|
109
|
+
await new Promise((resolve) => response.once("drain", resolve));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (!response.destroyed) response.end();
|
|
113
|
+
} finally {
|
|
114
|
+
reader.releaseLock();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
MANAGED_AI_DOCS_SERVER,
|
|
119
|
+
createManagedAiDocsNestModule,
|
|
120
|
+
handleManagedAiDocsNestRequest
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=nest.js.map
|
package/dist/nest.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nest.ts"],"sourcesContent":["import {\n All,\n Controller,\n Inject,\n Injectable,\n Module,\n Req,\n Res,\n type DynamicModule,\n type FactoryProvider,\n type ModuleMetadata,\n type Provider\n} from \"@nestjs/common\";\nimport type { ManagedAiDocsServer } from \"./managed-server.js\";\n\n/** Injection token exported so a host can update documents after Swagger bootstrap. */\nexport const MANAGED_AI_DOCS_SERVER = Symbol.for(\"@123toto/ai-app-assistant-server/managed\");\n\nexport interface AiDocsNestRequest {\n method?: string;\n originalUrl?: string;\n url?: string;\n protocol?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: () => void): unknown;\n off?(event: string, listener: () => void): unknown;\n [key: string]: unknown;\n}\n\nexport interface AiDocsNestResponse {\n statusCode: number;\n setHeader(name: string, value: string): unknown;\n write(chunk: Uint8Array): boolean;\n end(chunk?: string): unknown;\n once?(event: string, listener: () => void): unknown;\n destroyed?: boolean;\n}\n\nexport interface AiDocsNestModuleOptions<\n TRequest extends AiDocsNestRequest = AiDocsNestRequest\n> extends Pick<ModuleMetadata, \"imports\"> {\n /** Nest controller path. The application's global prefix is applied normally. */\n path?: string;\n inject?: FactoryProvider[\"inject\"];\n // Nest factories intentionally accept host-defined constructor signatures.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useFactory: (...dependencies: any[]) =>\n | AiDocsNestManagedServer<TRequest>\n | Promise<AiDocsNestManagedServer<TRequest>>;\n}\n\n/** Structural server contract avoids leaking framework-internal types across package entry points. */\nexport type AiDocsNestManagedServer<TRequest extends AiDocsNestRequest = AiDocsNestRequest> = Pick<\n ManagedAiDocsServer<{ id: string; label: string }, TRequest>,\n \"fetch\" | \"dispose\"\n>;\n\n/**\n * Creates a dynamic Nest module with one catch-all controller owned by the\n * connector. Consumer applications declare no AI Docs endpoints or DTOs.\n */\nexport function createManagedAiDocsNestModule<\n TRequest extends AiDocsNestRequest = AiDocsNestRequest\n>(options: AiDocsNestModuleOptions<TRequest>): DynamicModule {\n const route = options.path?.replace(/^\\/+|\\/+$/g, \"\") || \"ai-docs\";\n\n class ManagedAiDocsNestController {\n public constructor(\n readonly server: AiDocsNestManagedServer<TRequest>\n ) {}\n\n public handle(request: TRequest, response: AiDocsNestResponse): Promise<void> {\n return handleManagedAiDocsNestRequest(this.server, request, response);\n }\n }\n\n Inject(MANAGED_AI_DOCS_SERVER)(ManagedAiDocsNestController, undefined, 0);\n Req()(ManagedAiDocsNestController.prototype, \"handle\", 0);\n Res()(ManagedAiDocsNestController.prototype, \"handle\", 1);\n const descriptor = Object.getOwnPropertyDescriptor(ManagedAiDocsNestController.prototype, \"handle\");\n if (descriptor) All([\"\", \"*path\"])(ManagedAiDocsNestController.prototype, \"handle\", descriptor);\n Controller(route)(ManagedAiDocsNestController);\n\n class ManagedAiDocsNestModule {}\n class ManagedAiDocsNestLifecycle {\n public constructor(readonly server: AiDocsNestManagedServer<TRequest>) {}\n public onApplicationShutdown(): void {\n this.server.dispose();\n }\n }\n Inject(MANAGED_AI_DOCS_SERVER)(ManagedAiDocsNestLifecycle, undefined, 0);\n Injectable()(ManagedAiDocsNestLifecycle);\n const serverProvider: Provider = {\n provide: MANAGED_AI_DOCS_SERVER,\n inject: options.inject ?? [],\n useFactory: options.useFactory\n };\n Module({\n imports: options.imports ?? [],\n controllers: [ManagedAiDocsNestController],\n providers: [serverProvider, ManagedAiDocsNestLifecycle],\n exports: [MANAGED_AI_DOCS_SERVER]\n })(ManagedAiDocsNestModule);\n\n return {\n module: ManagedAiDocsNestModule,\n imports: options.imports ?? [],\n controllers: [ManagedAiDocsNestController],\n providers: [serverProvider, ManagedAiDocsNestLifecycle],\n exports: [MANAGED_AI_DOCS_SERVER]\n };\n}\n\n/** Adapts parsed Nest requests and streamed Fetch responses without Express coupling. */\nexport async function handleManagedAiDocsNestRequest<\n TRequest extends AiDocsNestRequest\n>(\n server: AiDocsNestManagedServer<TRequest>,\n request: TRequest,\n response: AiDocsNestResponse\n): Promise<void> {\n const abortController = new AbortController();\n const abort = (): void => abortController.abort(new DOMException(\"Client disconnected\", \"AbortError\"));\n request.on?.(\"close\", abort);\n try {\n const webRequest = toFetchRequest(request, abortController.signal);\n await writeFetchResponse(response, await server.fetch.handle(webRequest, request));\n } finally {\n request.off?.(\"close\", abort);\n }\n}\n\nfunction toFetchRequest(request: AiDocsNestRequest, signal: AbortSignal): Request {\n const headers = new Headers();\n for (const [name, value] of Object.entries(request.headers)) {\n if (Array.isArray(value)) value.forEach((item) => headers.append(name, item));\n else if (value !== undefined) headers.set(name, value);\n }\n const method = request.method?.toUpperCase() || \"GET\";\n const host = headers.get(\"host\") || \"localhost\";\n const protocol = request.protocol || headers.get(\"x-forwarded-proto\") || \"http\";\n const url = new URL(request.originalUrl || request.url || \"/\", `${protocol}://${host}`);\n const hasBody = method !== \"GET\" && method !== \"HEAD\" && request.body !== undefined;\n return new Request(url, {\n method,\n headers,\n signal,\n ...(hasBody ? { body: serializeBody(request.body, headers) } : {})\n });\n}\n\nfunction serializeBody(body: unknown, headers: Headers): string {\n if (typeof body === \"string\") return body;\n if (body instanceof Uint8Array) return new TextDecoder().decode(body);\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n return JSON.stringify(body);\n}\n\nasync function writeFetchResponse(response: AiDocsNestResponse, result: Response): Promise<void> {\n response.statusCode = result.status;\n result.headers.forEach((value, name) => response.setHeader(name, value));\n if (!result.body) {\n response.end();\n return;\n }\n const reader = result.body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!response.write(value) && response.once) {\n await new Promise<void>((resolve) => response.once!(\"drain\", resolve));\n }\n }\n if (!response.destroyed) response.end();\n } finally {\n reader.releaseLock();\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@123toto/ai-app-assistant-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"description": "Framework-neutral Node.js backend for contextual in-app AI assistants",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/123toto/ai-docs-asker.git",
|
|
12
|
+
"directory": "packages/server"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/123toto/ai-docs-asker#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/123toto/ai-docs-asker/issues"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"ai",
|
|
20
|
+
"documentation",
|
|
21
|
+
"assistant",
|
|
22
|
+
"llm",
|
|
23
|
+
"openapi"
|
|
24
|
+
],
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"sideEffects": false,
|
|
29
|
+
"type": "module",
|
|
30
|
+
"main": "./dist/index.cjs",
|
|
31
|
+
"module": "./dist/index.js",
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"typesVersions": {
|
|
34
|
+
"*": {
|
|
35
|
+
"ai-sdk": [
|
|
36
|
+
"dist/ai-sdk.d.ts"
|
|
37
|
+
],
|
|
38
|
+
"express": [
|
|
39
|
+
"dist/express.d.ts"
|
|
40
|
+
],
|
|
41
|
+
"nest": [
|
|
42
|
+
"dist/nest.d.ts"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"exports": {
|
|
47
|
+
".": {
|
|
48
|
+
"types": "./dist/index.d.ts",
|
|
49
|
+
"import": "./dist/index.js",
|
|
50
|
+
"require": "./dist/index.cjs"
|
|
51
|
+
},
|
|
52
|
+
"./ai-sdk": {
|
|
53
|
+
"types": "./dist/ai-sdk.d.ts",
|
|
54
|
+
"import": "./dist/ai-sdk.js",
|
|
55
|
+
"require": "./dist/ai-sdk.cjs"
|
|
56
|
+
},
|
|
57
|
+
"./express": {
|
|
58
|
+
"types": "./dist/express.d.ts",
|
|
59
|
+
"import": "./dist/express.js",
|
|
60
|
+
"require": "./dist/express.cjs"
|
|
61
|
+
},
|
|
62
|
+
"./nest": {
|
|
63
|
+
"types": "./dist/nest.d.ts",
|
|
64
|
+
"import": "./dist/nest.js",
|
|
65
|
+
"require": "./dist/nest.cjs"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"files": [
|
|
69
|
+
"dist",
|
|
70
|
+
"README.md",
|
|
71
|
+
"LICENSE"
|
|
72
|
+
],
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"@ai-sdk/anthropic": "^3.0.0",
|
|
75
|
+
"@ai-sdk/google": "^3.0.0",
|
|
76
|
+
"@ai-sdk/mistral": "^3.0.0",
|
|
77
|
+
"@ai-sdk/openai": "^3.0.0",
|
|
78
|
+
"ai": "^6.0.0",
|
|
79
|
+
"zod": "^4.0.0",
|
|
80
|
+
"@123toto/ai-app-assistant-contracts": "0.1.0"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@nestjs/common": "~11.1.29",
|
|
84
|
+
"reflect-metadata": "^0.2.2",
|
|
85
|
+
"rxjs": "^7.8.2"
|
|
86
|
+
},
|
|
87
|
+
"peerDependencies": {
|
|
88
|
+
"@nestjs/common": ">=10 <12",
|
|
89
|
+
"reflect-metadata": "^0.2.0",
|
|
90
|
+
"rxjs": "^7.8.0"
|
|
91
|
+
},
|
|
92
|
+
"peerDependenciesMeta": {
|
|
93
|
+
"@nestjs/common": {
|
|
94
|
+
"optional": true
|
|
95
|
+
},
|
|
96
|
+
"reflect-metadata": {
|
|
97
|
+
"optional": true
|
|
98
|
+
},
|
|
99
|
+
"rxjs": {
|
|
100
|
+
"optional": true
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"scripts": {
|
|
104
|
+
"build": "tsup src/index.ts src/ai-sdk.ts src/express.ts src/nest.ts --format esm,cjs --dts --sourcemap --clean --out-dir dist --external ai --external @nestjs/common",
|
|
105
|
+
"clean": "rm -rf dist",
|
|
106
|
+
"dev": "tsup src/index.ts src/ai-sdk.ts src/express.ts src/nest.ts --format esm,cjs --dts --sourcemap --out-dir dist --external ai --external @nestjs/common --watch",
|
|
107
|
+
"test": "vitest run",
|
|
108
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
109
|
+
}
|
|
110
|
+
}
|