@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.
Files changed (124) hide show
  1. package/README.md +59 -0
  2. package/dist/server/src/config/index.d.ts +12 -0
  3. package/dist/server/src/config/index.d.ts.map +1 -0
  4. package/dist/server/src/config/index.js +36 -0
  5. package/dist/server/src/config/index.js.map +1 -0
  6. package/dist/server/src/content-types/index.d.ts +76 -0
  7. package/dist/server/src/content-types/index.d.ts.map +1 -0
  8. package/dist/server/src/content-types/index.js +11 -0
  9. package/dist/server/src/content-types/index.js.map +1 -0
  10. package/dist/server/src/content-types/knowledge-source/index.d.ts +3 -0
  11. package/dist/server/src/content-types/knowledge-source/index.d.ts.map +1 -0
  12. package/dist/server/src/content-types/knowledge-source/index.js +8 -0
  13. package/dist/server/src/content-types/knowledge-source/index.js.map +1 -0
  14. package/dist/server/src/content-types/knowledge-source/schema.json +39 -0
  15. package/dist/server/src/controllers/chat.d.ts +18 -0
  16. package/dist/server/src/controllers/chat.d.ts.map +1 -0
  17. package/dist/server/src/controllers/chat.js +74 -0
  18. package/dist/server/src/controllers/chat.js.map +1 -0
  19. package/dist/server/src/controllers/index.d.ts +3 -0
  20. package/dist/server/src/controllers/index.d.ts.map +1 -0
  21. package/dist/server/src/controllers/index.js +9 -0
  22. package/dist/server/src/controllers/index.js.map +1 -0
  23. package/dist/server/src/index.d.ts +13 -0
  24. package/dist/server/src/index.d.ts.map +1 -0
  25. package/dist/server/src/index.js +23 -0
  26. package/dist/server/src/index.js.map +1 -0
  27. package/dist/server/src/plugin-id.d.ts +2 -0
  28. package/dist/server/src/plugin-id.d.ts.map +1 -0
  29. package/dist/server/src/plugin-id.js +5 -0
  30. package/dist/server/src/plugin-id.js.map +1 -0
  31. package/dist/server/src/policies/index.d.ts +3 -0
  32. package/dist/server/src/policies/index.d.ts.map +1 -0
  33. package/dist/server/src/policies/index.js +11 -0
  34. package/dist/server/src/policies/index.js.map +1 -0
  35. package/dist/server/src/policies/rate-limit.d.ts +23 -0
  36. package/dist/server/src/policies/rate-limit.d.ts.map +1 -0
  37. package/dist/server/src/policies/rate-limit.js +37 -0
  38. package/dist/server/src/policies/rate-limit.js.map +1 -0
  39. package/dist/server/src/register.d.ts +16 -0
  40. package/dist/server/src/register.d.ts.map +1 -0
  41. package/dist/server/src/register.js +13 -0
  42. package/dist/server/src/register.js.map +1 -0
  43. package/dist/server/src/routes/content-api.d.ts +13 -0
  44. package/dist/server/src/routes/content-api.d.ts.map +1 -0
  45. package/dist/server/src/routes/content-api.js +15 -0
  46. package/dist/server/src/routes/content-api.js.map +1 -0
  47. package/dist/server/src/routes/index.d.ts +15 -0
  48. package/dist/server/src/routes/index.d.ts.map +1 -0
  49. package/dist/server/src/routes/index.js +8 -0
  50. package/dist/server/src/routes/index.js.map +1 -0
  51. package/dist/server/src/services/blocks-serializer.d.ts +2 -0
  52. package/dist/server/src/services/blocks-serializer.d.ts.map +1 -0
  53. package/dist/server/src/services/blocks-serializer.js +46 -0
  54. package/dist/server/src/services/blocks-serializer.js.map +1 -0
  55. package/dist/server/src/services/canonical-json.d.ts +4 -0
  56. package/dist/server/src/services/canonical-json.d.ts.map +1 -0
  57. package/dist/server/src/services/canonical-json.js +29 -0
  58. package/dist/server/src/services/canonical-json.js.map +1 -0
  59. package/dist/server/src/services/chat-service.d.ts +27 -0
  60. package/dist/server/src/services/chat-service.d.ts.map +1 -0
  61. package/dist/server/src/services/chat-service.js +48 -0
  62. package/dist/server/src/services/chat-service.js.map +1 -0
  63. package/dist/server/src/services/chat.d.ts +20 -0
  64. package/dist/server/src/services/chat.d.ts.map +1 -0
  65. package/dist/server/src/services/chat.js +98 -0
  66. package/dist/server/src/services/chat.js.map +1 -0
  67. package/dist/server/src/services/chunker.d.ts +11 -0
  68. package/dist/server/src/services/chunker.d.ts.map +1 -0
  69. package/dist/server/src/services/chunker.js +67 -0
  70. package/dist/server/src/services/chunker.js.map +1 -0
  71. package/dist/server/src/services/control-plane.d.ts +13 -0
  72. package/dist/server/src/services/control-plane.d.ts.map +1 -0
  73. package/dist/server/src/services/control-plane.js +25 -0
  74. package/dist/server/src/services/control-plane.js.map +1 -0
  75. package/dist/server/src/services/embeddings.d.ts +10 -0
  76. package/dist/server/src/services/embeddings.d.ts.map +1 -0
  77. package/dist/server/src/services/embeddings.js +55 -0
  78. package/dist/server/src/services/embeddings.js.map +1 -0
  79. package/dist/server/src/services/extractor.d.ts +20 -0
  80. package/dist/server/src/services/extractor.d.ts.map +1 -0
  81. package/dist/server/src/services/extractor.js +39 -0
  82. package/dist/server/src/services/extractor.js.map +1 -0
  83. package/dist/server/src/services/index.d.ts +7 -0
  84. package/dist/server/src/services/index.d.ts.map +1 -0
  85. package/dist/server/src/services/index.js +21 -0
  86. package/dist/server/src/services/index.js.map +1 -0
  87. package/dist/server/src/services/indexer-service.d.ts +13 -0
  88. package/dist/server/src/services/indexer-service.d.ts.map +1 -0
  89. package/dist/server/src/services/indexer-service.js +14 -0
  90. package/dist/server/src/services/indexer-service.js.map +1 -0
  91. package/dist/server/src/services/indexer.d.ts +23 -0
  92. package/dist/server/src/services/indexer.d.ts.map +1 -0
  93. package/dist/server/src/services/indexer.js +82 -0
  94. package/dist/server/src/services/indexer.js.map +1 -0
  95. package/dist/server/src/services/knowledge-source.d.ts +51 -0
  96. package/dist/server/src/services/knowledge-source.d.ts.map +1 -0
  97. package/dist/server/src/services/knowledge-source.js +87 -0
  98. package/dist/server/src/services/knowledge-source.js.map +1 -0
  99. package/dist/server/src/services/provider.d.ts +17 -0
  100. package/dist/server/src/services/provider.d.ts.map +1 -0
  101. package/dist/server/src/services/provider.js +99 -0
  102. package/dist/server/src/services/provider.js.map +1 -0
  103. package/dist/server/src/services/qdrant-store.d.ts +63 -0
  104. package/dist/server/src/services/qdrant-store.d.ts.map +1 -0
  105. package/dist/server/src/services/qdrant-store.js +138 -0
  106. package/dist/server/src/services/qdrant-store.js.map +1 -0
  107. package/dist/server/src/services/retrieval.d.ts +49 -0
  108. package/dist/server/src/services/retrieval.d.ts.map +1 -0
  109. package/dist/server/src/services/retrieval.js +110 -0
  110. package/dist/server/src/services/retrieval.js.map +1 -0
  111. package/dist/server/src/services/schema-serializer.d.ts +27 -0
  112. package/dist/server/src/services/schema-serializer.d.ts.map +1 -0
  113. package/dist/server/src/services/schema-serializer.js +119 -0
  114. package/dist/server/src/services/schema-serializer.js.map +1 -0
  115. package/dist/server/src/services/serializer.d.ts +26 -0
  116. package/dist/server/src/services/serializer.d.ts.map +1 -0
  117. package/dist/server/src/services/serializer.js +98 -0
  118. package/dist/server/src/services/serializer.js.map +1 -0
  119. package/dist/server/src/services/sse.d.ts +8 -0
  120. package/dist/server/src/services/sse.d.ts.map +1 -0
  121. package/dist/server/src/services/sse.js +41 -0
  122. package/dist/server/src/services/sse.js.map +1 -0
  123. package/package.json +51 -0
  124. 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,12 @@
1
+ declare const config: {
2
+ default(): {
3
+ rateLimit: {
4
+ enabled: boolean;
5
+ windowMs: number;
6
+ max: number;
7
+ };
8
+ };
9
+ validator(value: unknown): void;
10
+ };
11
+ export default config;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import schema from "./schema.json";
2
+ export default schema;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ declare const controllers: Record<string, unknown>;
2
+ export default controllers;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export declare const PLUGIN_ID = "agent";
2
+ //# sourceMappingURL=plugin-id.d.ts.map
@@ -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,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLUGIN_ID = void 0;
4
+ exports.PLUGIN_ID = "agent";
5
+ //# sourceMappingURL=plugin-id.js.map
@@ -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,3 @@
1
+ declare const policies: Record<string, unknown>;
2
+ export default policies;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,13 @@
1
+ declare const contentApi: {
2
+ type: "content-api";
3
+ routes: {
4
+ method: string;
5
+ path: string;
6
+ handler: string;
7
+ config: {
8
+ policies: string[];
9
+ };
10
+ }[];
11
+ };
12
+ export default contentApi;
13
+ //# sourceMappingURL=content-api.d.ts.map
@@ -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"}