@dani-builder/strapi-plugin-agent 0.2.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/README.md +59 -0
- package/dist/server/src/config/index.d.ts +12 -0
- package/dist/server/src/config/index.d.ts.map +1 -0
- package/dist/server/src/config/index.js +36 -0
- package/dist/server/src/config/index.js.map +1 -0
- package/dist/server/src/content-types/index.d.ts +76 -0
- package/dist/server/src/content-types/index.d.ts.map +1 -0
- package/dist/server/src/content-types/index.js +11 -0
- package/dist/server/src/content-types/index.js.map +1 -0
- package/dist/server/src/content-types/knowledge-source/index.d.ts +3 -0
- package/dist/server/src/content-types/knowledge-source/index.d.ts.map +1 -0
- package/dist/server/src/content-types/knowledge-source/index.js +8 -0
- package/dist/server/src/content-types/knowledge-source/index.js.map +1 -0
- package/dist/server/src/content-types/knowledge-source/schema.json +39 -0
- package/dist/server/src/controllers/chat.d.ts +18 -0
- package/dist/server/src/controllers/chat.d.ts.map +1 -0
- package/dist/server/src/controllers/chat.js +74 -0
- package/dist/server/src/controllers/chat.js.map +1 -0
- package/dist/server/src/controllers/index.d.ts +3 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -0
- package/dist/server/src/controllers/index.js +9 -0
- package/dist/server/src/controllers/index.js.map +1 -0
- package/dist/server/src/index.d.ts +13 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/index.js +23 -0
- package/dist/server/src/index.js.map +1 -0
- package/dist/server/src/plugin-id.d.ts +2 -0
- package/dist/server/src/plugin-id.d.ts.map +1 -0
- package/dist/server/src/plugin-id.js +5 -0
- package/dist/server/src/plugin-id.js.map +1 -0
- package/dist/server/src/policies/index.d.ts +3 -0
- package/dist/server/src/policies/index.d.ts.map +1 -0
- package/dist/server/src/policies/index.js +11 -0
- package/dist/server/src/policies/index.js.map +1 -0
- package/dist/server/src/policies/rate-limit.d.ts +23 -0
- package/dist/server/src/policies/rate-limit.d.ts.map +1 -0
- package/dist/server/src/policies/rate-limit.js +37 -0
- package/dist/server/src/policies/rate-limit.js.map +1 -0
- package/dist/server/src/register.d.ts +16 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/dist/server/src/register.js +13 -0
- package/dist/server/src/register.js.map +1 -0
- package/dist/server/src/routes/content-api.d.ts +13 -0
- package/dist/server/src/routes/content-api.d.ts.map +1 -0
- package/dist/server/src/routes/content-api.js +15 -0
- package/dist/server/src/routes/content-api.js.map +1 -0
- package/dist/server/src/routes/index.d.ts +15 -0
- package/dist/server/src/routes/index.d.ts.map +1 -0
- package/dist/server/src/routes/index.js +8 -0
- package/dist/server/src/routes/index.js.map +1 -0
- package/dist/server/src/services/blocks-serializer.d.ts +2 -0
- package/dist/server/src/services/blocks-serializer.d.ts.map +1 -0
- package/dist/server/src/services/blocks-serializer.js +46 -0
- package/dist/server/src/services/blocks-serializer.js.map +1 -0
- package/dist/server/src/services/canonical-json.d.ts +4 -0
- package/dist/server/src/services/canonical-json.d.ts.map +1 -0
- package/dist/server/src/services/canonical-json.js +29 -0
- package/dist/server/src/services/canonical-json.js.map +1 -0
- package/dist/server/src/services/chat-service.d.ts +27 -0
- package/dist/server/src/services/chat-service.d.ts.map +1 -0
- package/dist/server/src/services/chat-service.js +48 -0
- package/dist/server/src/services/chat-service.js.map +1 -0
- package/dist/server/src/services/chat.d.ts +20 -0
- package/dist/server/src/services/chat.d.ts.map +1 -0
- package/dist/server/src/services/chat.js +98 -0
- package/dist/server/src/services/chat.js.map +1 -0
- package/dist/server/src/services/chunker.d.ts +11 -0
- package/dist/server/src/services/chunker.d.ts.map +1 -0
- package/dist/server/src/services/chunker.js +67 -0
- package/dist/server/src/services/chunker.js.map +1 -0
- package/dist/server/src/services/control-plane.d.ts +13 -0
- package/dist/server/src/services/control-plane.d.ts.map +1 -0
- package/dist/server/src/services/control-plane.js +25 -0
- package/dist/server/src/services/control-plane.js.map +1 -0
- package/dist/server/src/services/embeddings.d.ts +10 -0
- package/dist/server/src/services/embeddings.d.ts.map +1 -0
- package/dist/server/src/services/embeddings.js +55 -0
- package/dist/server/src/services/embeddings.js.map +1 -0
- package/dist/server/src/services/extractor.d.ts +20 -0
- package/dist/server/src/services/extractor.d.ts.map +1 -0
- package/dist/server/src/services/extractor.js +39 -0
- package/dist/server/src/services/extractor.js.map +1 -0
- package/dist/server/src/services/index.d.ts +7 -0
- package/dist/server/src/services/index.d.ts.map +1 -0
- package/dist/server/src/services/index.js +21 -0
- package/dist/server/src/services/index.js.map +1 -0
- package/dist/server/src/services/indexer-service.d.ts +13 -0
- package/dist/server/src/services/indexer-service.d.ts.map +1 -0
- package/dist/server/src/services/indexer-service.js +14 -0
- package/dist/server/src/services/indexer-service.js.map +1 -0
- package/dist/server/src/services/indexer.d.ts +23 -0
- package/dist/server/src/services/indexer.d.ts.map +1 -0
- package/dist/server/src/services/indexer.js +82 -0
- package/dist/server/src/services/indexer.js.map +1 -0
- package/dist/server/src/services/knowledge-source.d.ts +51 -0
- package/dist/server/src/services/knowledge-source.d.ts.map +1 -0
- package/dist/server/src/services/knowledge-source.js +87 -0
- package/dist/server/src/services/knowledge-source.js.map +1 -0
- package/dist/server/src/services/provider.d.ts +17 -0
- package/dist/server/src/services/provider.d.ts.map +1 -0
- package/dist/server/src/services/provider.js +99 -0
- package/dist/server/src/services/provider.js.map +1 -0
- package/dist/server/src/services/qdrant-store.d.ts +63 -0
- package/dist/server/src/services/qdrant-store.d.ts.map +1 -0
- package/dist/server/src/services/qdrant-store.js +138 -0
- package/dist/server/src/services/qdrant-store.js.map +1 -0
- package/dist/server/src/services/retrieval.d.ts +49 -0
- package/dist/server/src/services/retrieval.d.ts.map +1 -0
- package/dist/server/src/services/retrieval.js +110 -0
- package/dist/server/src/services/retrieval.js.map +1 -0
- package/dist/server/src/services/schema-serializer.d.ts +27 -0
- package/dist/server/src/services/schema-serializer.d.ts.map +1 -0
- package/dist/server/src/services/schema-serializer.js +119 -0
- package/dist/server/src/services/schema-serializer.js.map +1 -0
- package/dist/server/src/services/serializer.d.ts +26 -0
- package/dist/server/src/services/serializer.d.ts.map +1 -0
- package/dist/server/src/services/serializer.js +98 -0
- package/dist/server/src/services/serializer.js.map +1 -0
- package/dist/server/src/services/sse.d.ts +8 -0
- package/dist/server/src/services/sse.d.ts.map +1 -0
- package/dist/server/src/services/sse.js +41 -0
- package/dist/server/src/services/sse.js.map +1 -0
- package/package.json +51 -0
- package/strapi-server.js +3 -0
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# @dani-builder/strapi-plugin-agent
|
|
2
|
+
|
|
3
|
+
Strapi 5 server plugin for Daniworks Agent. It exposes the locale-scoped
|
|
4
|
+
knowledge-base retrieval services plus `POST /api/agent/chat`, an SSE endpoint
|
|
5
|
+
that emits the public `@dani-builder/agent-contract` event wire format.
|
|
6
|
+
|
|
7
|
+
Provider and control-plane integrations are opt-in. A missing provider produces
|
|
8
|
+
the terminal `provider_unconfigured` SSE error before retrieval or any external
|
|
9
|
+
request; a missing control-plane URL or token is inert and never attempts a
|
|
10
|
+
network request.
|
|
11
|
+
|
|
12
|
+
Builder calls the serializer registration point only when this optional plugin
|
|
13
|
+
is installed.
|
|
14
|
+
|
|
15
|
+
## Chat rate limit
|
|
16
|
+
|
|
17
|
+
`POST /api/agent/chat` is limited by the in-memory
|
|
18
|
+
`plugin::agent.rate-limit` policy. The defaults allow five requests per minute
|
|
19
|
+
for each IP address reported by Strapi. Strapi returns `403 PolicyError` for a
|
|
20
|
+
request over the limit; the response is not `429` and has no `Retry-After`
|
|
21
|
+
header.
|
|
22
|
+
|
|
23
|
+
Configure the policy in the agent plugin settings:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
agent: {
|
|
27
|
+
enabled: true,
|
|
28
|
+
config: {
|
|
29
|
+
rateLimit: { enabled: true, windowMs: 60_000, max: 5 },
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Set `rateLimit.enabled` to `false` to disable the policy, or adjust
|
|
35
|
+
`windowMs` and `max` for the deployment. Counters are local to each Node
|
|
36
|
+
process and reset on restart, so multi-instance deployments enforce the limit
|
|
37
|
+
independently per instance.
|
|
38
|
+
|
|
39
|
+
When Strapi runs behind a proxy or CDN, set
|
|
40
|
+
`server: { proxy: { koa: true } }` so `ctx.request.ip` resolves the forwarded
|
|
41
|
+
client address. Without that trusted-proxy setting, all traffic through the
|
|
42
|
+
same upstream can share one rate-limit bucket.
|
|
43
|
+
|
|
44
|
+
## Knowledge-base revision contract
|
|
45
|
+
|
|
46
|
+
`knowledge-source.serializerRevision` is the persisted integer used when
|
|
47
|
+
indexing vectors and filtering Qdrant retrieval. Bump it and force a full
|
|
48
|
+
source reindex whenever serializer output semantics change.
|
|
49
|
+
|
|
50
|
+
`serializer.getSerializerFingerprint()` (and the retained
|
|
51
|
+
`getSerializerRevision()` alias) returns a checksum of registered override
|
|
52
|
+
implementations for diagnostics only. It is not stored in Qdrant and must not
|
|
53
|
+
be used as a search revision: JavaScript function source cannot include values
|
|
54
|
+
captured from an override closure. If closure state changes output, explicitly
|
|
55
|
+
bump the affected source's integer `serializerRevision` and reindex.
|
|
56
|
+
|
|
57
|
+
Malformed Qdrant search hits are excluded and emit a structured
|
|
58
|
+
`agent.qdrant.search_hit_excluded` warning. Pass a `logger` to
|
|
59
|
+
`createQdrantStore()` to route these warnings to the host observability stack.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/config/index.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,MAAM;;;;;;;;qBAUO,OAAO,GAAG,IAAI;CA2BhC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config = {
|
|
4
|
+
default() {
|
|
5
|
+
return {
|
|
6
|
+
rateLimit: {
|
|
7
|
+
enabled: true,
|
|
8
|
+
windowMs: 60_000,
|
|
9
|
+
max: 5,
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
},
|
|
13
|
+
validator(value) {
|
|
14
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
15
|
+
throw new Error("[agent] config must be an object");
|
|
16
|
+
}
|
|
17
|
+
const rateLimit = value.rateLimit;
|
|
18
|
+
if (typeof rateLimit !== "object" ||
|
|
19
|
+
rateLimit === null ||
|
|
20
|
+
Array.isArray(rateLimit)) {
|
|
21
|
+
throw new Error("[agent] config.rateLimit must be an object");
|
|
22
|
+
}
|
|
23
|
+
const { enabled, windowMs, max } = rateLimit;
|
|
24
|
+
if (typeof enabled !== "boolean") {
|
|
25
|
+
throw new Error("[agent] config.rateLimit.enabled must be a boolean");
|
|
26
|
+
}
|
|
27
|
+
if (typeof windowMs !== "number" || windowMs <= 0) {
|
|
28
|
+
throw new Error("[agent] config.rateLimit.windowMs must be positive");
|
|
29
|
+
}
|
|
30
|
+
if (typeof max !== "number" || !Number.isInteger(max) || max <= 0) {
|
|
31
|
+
throw new Error("[agent] config.rateLimit.max must be a positive integer");
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
exports.default = config;
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/config/index.ts"],"names":[],"mappings":";;AAAA,MAAM,MAAM,GAAG;IACb,OAAO;QACL,OAAO;YACL,SAAS,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,MAAM;gBAChB,GAAG,EAAE,CAAC;aACP;SACF,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,KAAc;QACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,SAAS,GAAI,KAAiC,CAAC,SAAS,CAAC;QAC/D,IACE,OAAO,SAAS,KAAK,QAAQ;YAC7B,SAAS,KAAK,IAAI;YAClB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACxB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,SAAoC,CAAC;QACxE,IAAI,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CACb,yDAAyD,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
declare const contentTypes: {
|
|
2
|
+
"knowledge-source": {
|
|
3
|
+
schema: {
|
|
4
|
+
kind: string;
|
|
5
|
+
collectionName: string;
|
|
6
|
+
info: {
|
|
7
|
+
singularName: string;
|
|
8
|
+
pluralName: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
options: {
|
|
13
|
+
draftAndPublish: boolean;
|
|
14
|
+
};
|
|
15
|
+
attributes: {
|
|
16
|
+
sourceUid: {
|
|
17
|
+
type: string;
|
|
18
|
+
required: boolean;
|
|
19
|
+
unique: boolean;
|
|
20
|
+
};
|
|
21
|
+
titleField: {
|
|
22
|
+
type: string;
|
|
23
|
+
required: boolean;
|
|
24
|
+
};
|
|
25
|
+
descriptionField: {
|
|
26
|
+
type: string;
|
|
27
|
+
};
|
|
28
|
+
bodyFields: {
|
|
29
|
+
type: string;
|
|
30
|
+
required: boolean;
|
|
31
|
+
};
|
|
32
|
+
extractionMode: {
|
|
33
|
+
type: string;
|
|
34
|
+
enum: string[];
|
|
35
|
+
default: string;
|
|
36
|
+
required: boolean;
|
|
37
|
+
};
|
|
38
|
+
excludedFields: {
|
|
39
|
+
type: string;
|
|
40
|
+
};
|
|
41
|
+
slugField: {
|
|
42
|
+
type: string;
|
|
43
|
+
};
|
|
44
|
+
urlPattern: {
|
|
45
|
+
type: string;
|
|
46
|
+
};
|
|
47
|
+
locales: {
|
|
48
|
+
type: string;
|
|
49
|
+
required: boolean;
|
|
50
|
+
};
|
|
51
|
+
configRevision: {
|
|
52
|
+
type: string;
|
|
53
|
+
default: number;
|
|
54
|
+
required: boolean;
|
|
55
|
+
};
|
|
56
|
+
indexedConfigRevision: {
|
|
57
|
+
type: string;
|
|
58
|
+
default: number;
|
|
59
|
+
required: boolean;
|
|
60
|
+
};
|
|
61
|
+
serializerRevision: {
|
|
62
|
+
type: string;
|
|
63
|
+
default: number;
|
|
64
|
+
required: boolean;
|
|
65
|
+
};
|
|
66
|
+
indexedSerializerRevision: {
|
|
67
|
+
type: string;
|
|
68
|
+
default: number;
|
|
69
|
+
required: boolean;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
export default contentTypes;
|
|
76
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/content-types/index.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAEjB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const knowledge_source_1 = __importDefault(require("./knowledge-source"));
|
|
7
|
+
const contentTypes = {
|
|
8
|
+
"knowledge-source": { schema: knowledge_source_1.default },
|
|
9
|
+
};
|
|
10
|
+
exports.default = contentTypes;
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/content-types/index.ts"],"names":[],"mappings":";;;;;AAAA,0EAAiD;AAEjD,MAAM,YAAY,GAAG;IACnB,kBAAkB,EAAE,EAAE,MAAM,EAAE,0BAAe,EAAE;CAChD,CAAC;AAEF,kBAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/content-types/knowledge-source/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,eAAe,CAAC;AAEnC,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const schema_json_1 = __importDefault(require("./schema.json"));
|
|
7
|
+
exports.default = schema_json_1.default;
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../server/src/content-types/knowledge-source/index.ts"],"names":[],"mappings":";;;;;AAAA,gEAAmC;AAEnC,kBAAe,qBAAM,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "collectionType",
|
|
3
|
+
"collectionName": "agent_knowledge_sources",
|
|
4
|
+
"info": {
|
|
5
|
+
"singularName": "knowledge-source",
|
|
6
|
+
"pluralName": "knowledge-sources",
|
|
7
|
+
"displayName": "Knowledge Source",
|
|
8
|
+
"description": "A content type and extraction mapping indexed by Daniworks Agent"
|
|
9
|
+
},
|
|
10
|
+
"options": { "draftAndPublish": false },
|
|
11
|
+
"attributes": {
|
|
12
|
+
"sourceUid": { "type": "string", "required": true, "unique": true },
|
|
13
|
+
"titleField": { "type": "string", "required": true },
|
|
14
|
+
"descriptionField": { "type": "string" },
|
|
15
|
+
"bodyFields": { "type": "json", "required": true },
|
|
16
|
+
"extractionMode": {
|
|
17
|
+
"type": "enumeration",
|
|
18
|
+
"enum": ["flat", "schema"],
|
|
19
|
+
"default": "flat",
|
|
20
|
+
"required": true
|
|
21
|
+
},
|
|
22
|
+
"excludedFields": { "type": "json" },
|
|
23
|
+
"slugField": { "type": "string" },
|
|
24
|
+
"urlPattern": { "type": "string" },
|
|
25
|
+
"locales": { "type": "json", "required": true },
|
|
26
|
+
"configRevision": { "type": "integer", "default": 1, "required": true },
|
|
27
|
+
"indexedConfigRevision": {
|
|
28
|
+
"type": "integer",
|
|
29
|
+
"default": 0,
|
|
30
|
+
"required": true
|
|
31
|
+
},
|
|
32
|
+
"serializerRevision": { "type": "integer", "default": 1, "required": true },
|
|
33
|
+
"indexedSerializerRevision": {
|
|
34
|
+
"type": "integer",
|
|
35
|
+
"default": 0,
|
|
36
|
+
"required": true
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
import type { Core } from "@strapi/strapi";
|
|
3
|
+
export interface ChatContext {
|
|
4
|
+
request: {
|
|
5
|
+
body: unknown;
|
|
6
|
+
};
|
|
7
|
+
res: Pick<ServerResponse, "once" | "removeListener">;
|
|
8
|
+
set(name: string, value: string): void;
|
|
9
|
+
status: number;
|
|
10
|
+
body: unknown;
|
|
11
|
+
}
|
|
12
|
+
declare const chat: ({ strapi }: {
|
|
13
|
+
strapi: Core.Strapi;
|
|
14
|
+
}) => {
|
|
15
|
+
stream(ctx: ChatContext): Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
export default chat;
|
|
18
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3B,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;IACrD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAmCD,QAAA,MAAM,IAAI,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE;gBAC7B,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CA+B7C,CAAC;AAEH,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const node_stream_1 = require("node:stream");
|
|
4
|
+
const sse_1 = require("../services/sse");
|
|
5
|
+
function chatRequest(value) {
|
|
6
|
+
if (!value || typeof value !== "object")
|
|
7
|
+
return null;
|
|
8
|
+
const body = value;
|
|
9
|
+
if (typeof body.message !== "string")
|
|
10
|
+
return null;
|
|
11
|
+
return {
|
|
12
|
+
message: body.message,
|
|
13
|
+
...(typeof body.agentId === "string" ? { agentId: body.agentId } : {}),
|
|
14
|
+
...(typeof body.sessionId === "string"
|
|
15
|
+
? { sessionId: body.sessionId }
|
|
16
|
+
: {}),
|
|
17
|
+
...(typeof body.locale === "string" ? { locale: body.locale } : {}),
|
|
18
|
+
...(body.context &&
|
|
19
|
+
typeof body.context === "object" &&
|
|
20
|
+
typeof body.context.sourceUid === "string" &&
|
|
21
|
+
typeof body.context.documentId === "string"
|
|
22
|
+
? { context: body.context }
|
|
23
|
+
: {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function* nodeChunks(readable) {
|
|
27
|
+
const reader = readable.getReader();
|
|
28
|
+
try {
|
|
29
|
+
for (;;) {
|
|
30
|
+
const next = await reader.read();
|
|
31
|
+
if (next.done)
|
|
32
|
+
return;
|
|
33
|
+
yield next.value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
reader.releaseLock();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const chat = ({ strapi }) => ({
|
|
41
|
+
async stream(ctx) {
|
|
42
|
+
const input = chatRequest(ctx.request.body);
|
|
43
|
+
if (!input) {
|
|
44
|
+
ctx.status = 400;
|
|
45
|
+
ctx.body = { error: "message is required" };
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const sse = (0, sse_1.createSseStream)();
|
|
49
|
+
ctx.set("Content-Type", "text/event-stream; charset=utf-8");
|
|
50
|
+
ctx.set("Cache-Control", "no-cache, no-transform");
|
|
51
|
+
ctx.set("Connection", "keep-alive");
|
|
52
|
+
ctx.status = 200;
|
|
53
|
+
ctx.body = node_stream_1.Readable.from(nodeChunks(sse.readable));
|
|
54
|
+
const abortController = new AbortController();
|
|
55
|
+
const abort = () => abortController.abort();
|
|
56
|
+
ctx.res.once("close", abort);
|
|
57
|
+
void strapi
|
|
58
|
+
.plugin("agent")
|
|
59
|
+
.service("chat")
|
|
60
|
+
.stream(input, sse.write, abortController.signal)
|
|
61
|
+
.catch(() => {
|
|
62
|
+
sse.write({
|
|
63
|
+
event: "error",
|
|
64
|
+
data: { code: "internal_error", message: "" },
|
|
65
|
+
});
|
|
66
|
+
})
|
|
67
|
+
.finally(() => {
|
|
68
|
+
ctx.res.removeListener("close", abort);
|
|
69
|
+
sse.close();
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
exports.default = chat;
|
|
74
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../server/src/controllers/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAY,CAAC;AAEtD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const chat_1 = __importDefault(require("./chat"));
|
|
7
|
+
const controllers = { chat: chat_1.default };
|
|
8
|
+
exports.default = controllers;
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAE1B,MAAM,WAAW,GAA4B,EAAE,IAAI,EAAJ,cAAI,EAAE,CAAC;AAEtD,kBAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import register from "./register";
|
|
2
|
+
interface PluginServer {
|
|
3
|
+
config: unknown;
|
|
4
|
+
contentTypes: Record<string, unknown>;
|
|
5
|
+
controllers: Record<string, unknown>;
|
|
6
|
+
policies: Record<string, unknown>;
|
|
7
|
+
register: typeof register;
|
|
8
|
+
routes: Record<string, unknown>;
|
|
9
|
+
services: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
declare const plugin: PluginServer;
|
|
12
|
+
export default plugin;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAIlC,UAAU,YAAY;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,QAAA,MAAM,MAAM,EAAE,YAQb,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const config_1 = __importDefault(require("./config"));
|
|
7
|
+
const controllers_1 = __importDefault(require("./controllers"));
|
|
8
|
+
const content_types_1 = __importDefault(require("./content-types"));
|
|
9
|
+
const policies_1 = __importDefault(require("./policies"));
|
|
10
|
+
const register_1 = __importDefault(require("./register"));
|
|
11
|
+
const routes_1 = __importDefault(require("./routes"));
|
|
12
|
+
const services_1 = __importDefault(require("./services"));
|
|
13
|
+
const plugin = {
|
|
14
|
+
config: config_1.default,
|
|
15
|
+
controllers: controllers_1.default,
|
|
16
|
+
contentTypes: content_types_1.default,
|
|
17
|
+
policies: policies_1.default,
|
|
18
|
+
register: register_1.default,
|
|
19
|
+
routes: routes_1.default,
|
|
20
|
+
services: services_1.default,
|
|
21
|
+
};
|
|
22
|
+
exports.default = plugin;
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;AAAA,sDAA8B;AAC9B,gEAAwC;AACxC,oEAA2C;AAC3C,0DAAkC;AAClC,0DAAkC;AAClC,sDAA8B;AAC9B,0DAAkC;AAYlC,MAAM,MAAM,GAAiB;IAC3B,MAAM,EAAN,gBAAM;IACN,WAAW,EAAX,qBAAW;IACX,YAAY,EAAZ,uBAAY;IACZ,QAAQ,EAAR,kBAAQ;IACR,QAAQ,EAAR,kBAAQ;IACR,MAAM,EAAN,gBAAM;IACN,QAAQ,EAAR,kBAAQ;CACT,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-id.d.ts","sourceRoot":"","sources":["../../../server/src/plugin-id.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-id.js","sourceRoot":"","sources":["../../../server/src/plugin-id.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/policies/index.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAErC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const rate_limit_1 = __importDefault(require("./rate-limit"));
|
|
7
|
+
const policies = {
|
|
8
|
+
"rate-limit": rate_limit_1.default,
|
|
9
|
+
};
|
|
10
|
+
exports.default = policies;
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/policies/index.ts"],"names":[],"mappings":";;;;;AAAA,8DAAqC;AAErC,MAAM,QAAQ,GAA4B;IACxC,YAAY,EAAE,oBAAS;CACxB,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface PolicyContext {
|
|
2
|
+
request?: {
|
|
3
|
+
ip?: string;
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
interface RateLimitConfig {
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
windowMs: number;
|
|
9
|
+
max: number;
|
|
10
|
+
}
|
|
11
|
+
interface StrapiLike {
|
|
12
|
+
log: {
|
|
13
|
+
warn: (message: string) => void;
|
|
14
|
+
};
|
|
15
|
+
plugin(name: string): {
|
|
16
|
+
config(key: "rateLimit"): RateLimitConfig;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
declare const rateLimit: (policyContext: PolicyContext, _policyConfig: unknown, { strapi }: {
|
|
20
|
+
strapi: StrapiLike;
|
|
21
|
+
}) => boolean;
|
|
22
|
+
export default rateLimit;
|
|
23
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../../server/src/policies/rate-limit.ts"],"names":[],"mappings":"AAgBA,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,UAAU;IAClB,GAAG,EAAE;QAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QACpB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,CAAC;KAC3C,CAAC;CACH;AAED,QAAA,MAAM,SAAS,GACb,eAAe,aAAa,EAC5B,eAAe,OAAO,EACtB,YAAY;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,KACjC,OAqBF,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Fixed-window in-memory IP rate limit for the public agent chat route.
|
|
5
|
+
*
|
|
6
|
+
* Single-instance only — a shared store is needed for multi-instance deploys.
|
|
7
|
+
*/
|
|
8
|
+
const hits = new Map();
|
|
9
|
+
// Drop expired entries so one-off IPs don't leak memory.
|
|
10
|
+
function sweep(now) {
|
|
11
|
+
for (const [ip, entry] of hits) {
|
|
12
|
+
if (now > entry.resetAt)
|
|
13
|
+
hits.delete(ip);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const rateLimit = (policyContext, _policyConfig, { strapi }) => {
|
|
17
|
+
const config = strapi.plugin("agent").config("rateLimit");
|
|
18
|
+
if (!config.enabled)
|
|
19
|
+
return true;
|
|
20
|
+
const ip = policyContext.request?.ip || "unknown";
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
if (hits.size > 500)
|
|
23
|
+
sweep(now);
|
|
24
|
+
const entry = hits.get(ip);
|
|
25
|
+
if (!entry || now > entry.resetAt) {
|
|
26
|
+
hits.set(ip, { count: 1, resetAt: now + config.windowMs });
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
entry.count += 1;
|
|
30
|
+
if (entry.count > config.max) {
|
|
31
|
+
strapi.log.warn(`[agent] chat rate limit hit for ip=${ip}`);
|
|
32
|
+
return false; // Strapi surfaces a false policy result as 403 PolicyError.
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
};
|
|
36
|
+
exports.default = rateLimit;
|
|
37
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../../server/src/policies/rate-limit.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,MAAM,IAAI,GAAG,IAAI,GAAG,EAA8C,CAAC;AAEnE,yDAAyD;AACzD,SAAS,KAAK,CAAC,GAAW;IACxB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAqBD,MAAM,SAAS,GAAG,CAChB,aAA4B,EAC5B,aAAsB,EACtB,EAAE,MAAM,EAA0B,EACzB,EAAE;IACX,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAE3B,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IACjB,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC,CAAC,4DAA4D;IAC5E,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,kBAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface StrapiLike {
|
|
2
|
+
config: {
|
|
3
|
+
get(key: string): unknown;
|
|
4
|
+
};
|
|
5
|
+
log: {
|
|
6
|
+
warn(message: string): void;
|
|
7
|
+
};
|
|
8
|
+
plugin(name: "agent"): {
|
|
9
|
+
config(key: "rateLimit.enabled"): boolean;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
declare const register: ({ strapi }: {
|
|
13
|
+
strapi: StrapiLike;
|
|
14
|
+
}) => void;
|
|
15
|
+
export default register;
|
|
16
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../server/src/register.ts"],"names":[],"mappings":"AAKA,UAAU,UAAU;IAClB,MAAM,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACtC,GAAG,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG;QACrB,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;KAC3C,CAAC;CACH;AAED,QAAA,MAAM,QAAQ,GAAI,YAAY;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,KAAG,IAOtD,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const PROXY_RATE_LIMIT_WARNING = "Rate limiting uses request.ip, but server.proxy.koa is not enabled. " +
|
|
4
|
+
"When running behind a proxy or CDN, set server: { proxy: { koa: true } } " +
|
|
5
|
+
"to prevent all clients from sharing one rate-limit bucket.";
|
|
6
|
+
const register = ({ strapi }) => {
|
|
7
|
+
if (strapi.plugin("agent").config("rateLimit.enabled") &&
|
|
8
|
+
!strapi.config.get("server.proxy.koa")) {
|
|
9
|
+
strapi.log.warn(PROXY_RATE_LIMIT_WARNING);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
exports.default = register;
|
|
13
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../server/src/register.ts"],"names":[],"mappings":";;AAAA,MAAM,wBAAwB,GAC5B,sEAAsE;IACtE,2EAA2E;IAC3E,4DAA4D,CAAC;AAU/D,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAA0B,EAAQ,EAAE;IAC5D,IACE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC;QAClD,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,EACtC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,UAAU;;;;;;;;;;CAUf,CAAC;AAEF,eAAe,UAAU,CAAC"}
|