@carlonicora/nestjs-neo4jsonapi 4.10.0 → 4.12.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 (283) hide show
  1. package/dist/agents/common/inline-entity-links.d.ts +22 -0
  2. package/dist/agents/common/inline-entity-links.d.ts.map +1 -0
  3. package/dist/agents/common/inline-entity-links.js +60 -0
  4. package/dist/agents/common/inline-entity-links.js.map +1 -0
  5. package/dist/agents/community.detector/services/community.detector.service.d.ts.map +1 -1
  6. package/dist/agents/community.detector/services/community.detector.service.js +4 -0
  7. package/dist/agents/community.detector/services/community.detector.service.js.map +1 -1
  8. package/dist/agents/graph/interfaces/graph.catalog.interface.d.ts +17 -0
  9. package/dist/agents/graph/interfaces/graph.catalog.interface.d.ts.map +1 -1
  10. package/dist/agents/graph/services/graph.catalog.service.d.ts +15 -2
  11. package/dist/agents/graph/services/graph.catalog.service.d.ts.map +1 -1
  12. package/dist/agents/graph/services/graph.catalog.service.js +87 -0
  13. package/dist/agents/graph/services/graph.catalog.service.js.map +1 -1
  14. package/dist/agents/graph/services/graph.index.manager.d.ts +18 -1
  15. package/dist/agents/graph/services/graph.index.manager.d.ts.map +1 -1
  16. package/dist/agents/graph/services/graph.index.manager.js +16 -2
  17. package/dist/agents/graph/services/graph.index.manager.js.map +1 -1
  18. package/dist/agents/graph/services/graph.search.service.d.ts +38 -1
  19. package/dist/agents/graph/services/graph.search.service.d.ts.map +1 -1
  20. package/dist/agents/graph/services/graph.search.service.js +126 -7
  21. package/dist/agents/graph/services/graph.search.service.js.map +1 -1
  22. package/dist/agents/graph/services/scope.guard.d.ts +30 -1
  23. package/dist/agents/graph/services/scope.guard.d.ts.map +1 -1
  24. package/dist/agents/graph/services/scope.guard.js +53 -2
  25. package/dist/agents/graph/services/scope.guard.js.map +1 -1
  26. package/dist/agents/graph/tools/search-entities.tool.d.ts.map +1 -1
  27. package/dist/agents/graph/tools/search-entities.tool.js +3 -1
  28. package/dist/agents/graph/tools/search-entities.tool.js.map +1 -1
  29. package/dist/agents/graph/tools/traverse.tool.d.ts.map +1 -1
  30. package/dist/agents/graph/tools/traverse.tool.js +18 -8
  31. package/dist/agents/graph/tools/traverse.tool.js.map +1 -1
  32. package/dist/agents/operator/contexts/operator.context.d.ts +8 -1
  33. package/dist/agents/operator/contexts/operator.context.d.ts.map +1 -1
  34. package/dist/agents/operator/contexts/operator.context.js +6 -0
  35. package/dist/agents/operator/contexts/operator.context.js.map +1 -1
  36. package/dist/agents/operator/controllers/operator.controller.d.ts +4 -1
  37. package/dist/agents/operator/controllers/operator.controller.d.ts.map +1 -1
  38. package/dist/agents/operator/controllers/operator.controller.js +15 -8
  39. package/dist/agents/operator/controllers/operator.controller.js.map +1 -1
  40. package/dist/agents/operator/services/operator.service.d.ts +15 -0
  41. package/dist/agents/operator/services/operator.service.d.ts.map +1 -1
  42. package/dist/agents/operator/services/operator.service.js +31 -8
  43. package/dist/agents/operator/services/operator.service.js.map +1 -1
  44. package/dist/agents/operator/tools/operator.tool.registry.d.ts +2 -1
  45. package/dist/agents/operator/tools/operator.tool.registry.d.ts.map +1 -1
  46. package/dist/agents/operator/tools/operator.tool.registry.js +8 -3
  47. package/dist/agents/operator/tools/operator.tool.registry.js.map +1 -1
  48. package/dist/agents/responder/contexts/responder.context.d.ts +6 -0
  49. package/dist/agents/responder/contexts/responder.context.d.ts.map +1 -1
  50. package/dist/agents/responder/contexts/responder.context.js +2 -0
  51. package/dist/agents/responder/contexts/responder.context.js.map +1 -1
  52. package/dist/agents/responder/nodes/responder.answer.node.service.d.ts.map +1 -1
  53. package/dist/agents/responder/nodes/responder.answer.node.service.js +8 -2
  54. package/dist/agents/responder/nodes/responder.answer.node.service.js.map +1 -1
  55. package/dist/agents/responder/services/responder.service.d.ts +2 -0
  56. package/dist/agents/responder/services/responder.service.d.ts.map +1 -1
  57. package/dist/agents/responder/services/responder.service.js +1 -0
  58. package/dist/agents/responder/services/responder.service.js.map +1 -1
  59. package/dist/common/decorators/oauth.scopes.decorator.d.ts +2 -2
  60. package/dist/common/decorators/oauth.scopes.decorator.js +2 -2
  61. package/dist/common/helpers/credit-gate.d.ts +8 -0
  62. package/dist/common/helpers/credit-gate.d.ts.map +1 -1
  63. package/dist/common/helpers/credit-gate.js +11 -0
  64. package/dist/common/helpers/credit-gate.js.map +1 -1
  65. package/dist/common/helpers/define-entity.d.ts.map +1 -1
  66. package/dist/common/helpers/define-entity.js +6 -0
  67. package/dist/common/helpers/define-entity.js.map +1 -1
  68. package/dist/common/interfaces/assistant.scope.interface.d.ts +47 -0
  69. package/dist/common/interfaces/assistant.scope.interface.d.ts.map +1 -0
  70. package/dist/common/interfaces/assistant.scope.interface.js +14 -0
  71. package/dist/common/interfaces/assistant.scope.interface.js.map +1 -0
  72. package/dist/common/interfaces/assistant.title.interface.d.ts +30 -0
  73. package/dist/common/interfaces/assistant.title.interface.d.ts.map +1 -0
  74. package/dist/common/interfaces/assistant.title.interface.js +18 -0
  75. package/dist/common/interfaces/assistant.title.interface.js.map +1 -0
  76. package/dist/common/interfaces/datamodel.interface.d.ts +1 -0
  77. package/dist/common/interfaces/datamodel.interface.d.ts.map +1 -1
  78. package/dist/common/interfaces/entity.schema.interface.d.ts +63 -6
  79. package/dist/common/interfaces/entity.schema.interface.d.ts.map +1 -1
  80. package/dist/common/interfaces/external.entity.source.interface.d.ts +43 -0
  81. package/dist/common/interfaces/external.entity.source.interface.d.ts.map +1 -0
  82. package/dist/common/interfaces/external.entity.source.interface.js +17 -0
  83. package/dist/common/interfaces/external.entity.source.interface.js.map +1 -0
  84. package/dist/common/interfaces/index.d.ts +4 -0
  85. package/dist/common/interfaces/index.d.ts.map +1 -1
  86. package/dist/common/interfaces/index.js +4 -0
  87. package/dist/common/interfaces/index.js.map +1 -1
  88. package/dist/common/interfaces/s3.key-access.policy.interface.d.ts +48 -0
  89. package/dist/common/interfaces/s3.key-access.policy.interface.d.ts.map +1 -0
  90. package/dist/common/interfaces/s3.key-access.policy.interface.js +36 -0
  91. package/dist/common/interfaces/s3.key-access.policy.interface.js.map +1 -0
  92. package/dist/common/tokens.d.ts +13 -0
  93. package/dist/common/tokens.d.ts.map +1 -1
  94. package/dist/common/tokens.js +14 -1
  95. package/dist/common/tokens.js.map +1 -1
  96. package/dist/config/base.config.d.ts +13 -0
  97. package/dist/config/base.config.d.ts.map +1 -1
  98. package/dist/config/base.config.js +56 -12
  99. package/dist/config/base.config.js.map +1 -1
  100. package/dist/config/interfaces/base.config.interface.d.ts +2 -0
  101. package/dist/config/interfaces/base.config.interface.d.ts.map +1 -1
  102. package/dist/config/interfaces/config.ai.interface.d.ts +20 -2
  103. package/dist/config/interfaces/config.ai.interface.d.ts.map +1 -1
  104. package/dist/config/interfaces/config.assistant.interface.d.ts +9 -0
  105. package/dist/config/interfaces/config.assistant.interface.d.ts.map +1 -0
  106. package/dist/config/interfaces/config.assistant.interface.js +3 -0
  107. package/dist/config/interfaces/config.assistant.interface.js.map +1 -0
  108. package/dist/config/interfaces/config.oauth.interface.d.ts +8 -0
  109. package/dist/config/interfaces/config.oauth.interface.d.ts.map +1 -1
  110. package/dist/config/interfaces/config.operator.interface.d.ts +5 -0
  111. package/dist/config/interfaces/config.operator.interface.d.ts.map +1 -1
  112. package/dist/config/interfaces/index.d.ts +1 -0
  113. package/dist/config/interfaces/index.d.ts.map +1 -1
  114. package/dist/config/interfaces/index.js +1 -0
  115. package/dist/config/interfaces/index.js.map +1 -1
  116. package/dist/core/llm/interfaces/ai-candidate.interface.d.ts +23 -0
  117. package/dist/core/llm/interfaces/ai-candidate.interface.d.ts.map +1 -1
  118. package/dist/core/llm/services/ai-connection-resolver.service.d.ts.map +1 -1
  119. package/dist/core/llm/services/ai-connection-resolver.service.js +18 -0
  120. package/dist/core/llm/services/ai-connection-resolver.service.js.map +1 -1
  121. package/dist/core/llm/services/image.llm.service.d.ts +99 -13
  122. package/dist/core/llm/services/image.llm.service.d.ts.map +1 -1
  123. package/dist/core/llm/services/image.llm.service.js +209 -61
  124. package/dist/core/llm/services/image.llm.service.js.map +1 -1
  125. package/dist/core/llm/services/model.service.d.ts +2 -0
  126. package/dist/core/llm/services/model.service.d.ts.map +1 -1
  127. package/dist/core/llm/services/model.service.js +38 -0
  128. package/dist/core/llm/services/model.service.js.map +1 -1
  129. package/dist/core/neo4j/abstracts/abstract.repository.d.ts +26 -0
  130. package/dist/core/neo4j/abstracts/abstract.repository.d.ts.map +1 -1
  131. package/dist/core/neo4j/abstracts/abstract.repository.js +70 -37
  132. package/dist/core/neo4j/abstracts/abstract.repository.js.map +1 -1
  133. package/dist/core/neo4j/index.d.ts +2 -0
  134. package/dist/core/neo4j/index.d.ts.map +1 -1
  135. package/dist/core/neo4j/index.js +5 -1
  136. package/dist/core/neo4j/index.js.map +1 -1
  137. package/dist/core/neo4j/queries/update.relationship.d.ts +8 -0
  138. package/dist/core/neo4j/queries/update.relationship.d.ts.map +1 -1
  139. package/dist/core/neo4j/queries/update.relationship.js +4 -1
  140. package/dist/core/neo4j/queries/update.relationship.js.map +1 -1
  141. package/dist/core/neo4j/services/neo4j.service.d.ts +10 -0
  142. package/dist/core/neo4j/services/neo4j.service.d.ts.map +1 -1
  143. package/dist/core/neo4j/services/neo4j.service.js +12 -1
  144. package/dist/core/neo4j/services/neo4j.service.js.map +1 -1
  145. package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.d.ts +9 -0
  146. package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.d.ts.map +1 -1
  147. package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.js +45 -0
  148. package/dist/foundations/ai-connection/dtos/ai-connection.post.dto.js.map +1 -1
  149. package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.d.ts +9 -0
  150. package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.d.ts.map +1 -1
  151. package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.js +45 -0
  152. package/dist/foundations/ai-connection/dtos/ai-connection.put.dto.js.map +1 -1
  153. package/dist/foundations/ai-connection/entities/ai-connection.d.ts +9 -0
  154. package/dist/foundations/ai-connection/entities/ai-connection.d.ts.map +1 -1
  155. package/dist/foundations/ai-connection/entities/ai-connection.js +10 -0
  156. package/dist/foundations/ai-connection/entities/ai-connection.js.map +1 -1
  157. package/dist/foundations/ai-connection/registry/ai-provider.registry.d.ts.map +1 -1
  158. package/dist/foundations/ai-connection/registry/ai-provider.registry.js +61 -7
  159. package/dist/foundations/ai-connection/registry/ai-provider.registry.js.map +1 -1
  160. package/dist/foundations/assistant/assistant.module.d.ts +7 -2
  161. package/dist/foundations/assistant/assistant.module.d.ts.map +1 -1
  162. package/dist/foundations/assistant/assistant.module.js +37 -1
  163. package/dist/foundations/assistant/assistant.module.js.map +1 -1
  164. package/dist/foundations/assistant/controllers/assistant.controller.d.ts +4 -1
  165. package/dist/foundations/assistant/controllers/assistant.controller.d.ts.map +1 -1
  166. package/dist/foundations/assistant/controllers/assistant.controller.js +15 -8
  167. package/dist/foundations/assistant/controllers/assistant.controller.js.map +1 -1
  168. package/dist/foundations/assistant/services/assistant.service.d.ts +37 -1
  169. package/dist/foundations/assistant/services/assistant.service.d.ts.map +1 -1
  170. package/dist/foundations/assistant/services/assistant.service.js +144 -11
  171. package/dist/foundations/assistant/services/assistant.service.js.map +1 -1
  172. package/dist/foundations/assistant-action/controllers/assistant-action.controller.d.ts +7 -1
  173. package/dist/foundations/assistant-action/controllers/assistant-action.controller.d.ts.map +1 -1
  174. package/dist/foundations/assistant-action/controllers/assistant-action.controller.js +15 -5
  175. package/dist/foundations/assistant-action/controllers/assistant-action.controller.js.map +1 -1
  176. package/dist/foundations/assistant-message/assistant-message.module.d.ts +4 -0
  177. package/dist/foundations/assistant-message/assistant-message.module.d.ts.map +1 -1
  178. package/dist/foundations/assistant-message/assistant-message.module.js +27 -2
  179. package/dist/foundations/assistant-message/assistant-message.module.js.map +1 -1
  180. package/dist/foundations/company/entities/company.d.ts +4 -4
  181. package/dist/foundations/company/entities/company.d.ts.map +1 -1
  182. package/dist/foundations/company/entities/company.js +2 -2
  183. package/dist/foundations/company/entities/company.js.map +1 -1
  184. package/dist/foundations/content/interfaces/content.extension.interface.d.ts +22 -0
  185. package/dist/foundations/content/interfaces/content.extension.interface.d.ts.map +1 -1
  186. package/dist/foundations/content/interfaces/content.extension.interface.js.map +1 -1
  187. package/dist/foundations/content/services/content.cypher.service.d.ts +27 -0
  188. package/dist/foundations/content/services/content.cypher.service.d.ts.map +1 -1
  189. package/dist/foundations/content/services/content.cypher.service.js +68 -9
  190. package/dist/foundations/content/services/content.cypher.service.js.map +1 -1
  191. package/dist/foundations/oauth/constants/oauth.scopes.d.ts +26 -11
  192. package/dist/foundations/oauth/constants/oauth.scopes.d.ts.map +1 -1
  193. package/dist/foundations/oauth/constants/oauth.scopes.js +13 -18
  194. package/dist/foundations/oauth/constants/oauth.scopes.js.map +1 -1
  195. package/dist/foundations/oauth/controllers/oauth.authorize.controller.d.ts.map +1 -1
  196. package/dist/foundations/oauth/controllers/oauth.authorize.controller.js +3 -0
  197. package/dist/foundations/oauth/controllers/oauth.authorize.controller.js.map +1 -1
  198. package/dist/foundations/oauth/controllers/oauth.registration.controller.d.ts.map +1 -1
  199. package/dist/foundations/oauth/controllers/oauth.registration.controller.js +2 -0
  200. package/dist/foundations/oauth/controllers/oauth.registration.controller.js.map +1 -1
  201. package/dist/foundations/oauth/controllers/oauth.token.controller.d.ts.map +1 -1
  202. package/dist/foundations/oauth/controllers/oauth.token.controller.js +2 -0
  203. package/dist/foundations/oauth/controllers/oauth.token.controller.js.map +1 -1
  204. package/dist/foundations/oauth/dtos/oauth.authorize.dto.d.ts +1 -0
  205. package/dist/foundations/oauth/dtos/oauth.authorize.dto.d.ts.map +1 -1
  206. package/dist/foundations/oauth/dtos/oauth.authorize.dto.js +5 -0
  207. package/dist/foundations/oauth/dtos/oauth.authorize.dto.js.map +1 -1
  208. package/dist/foundations/oauth/entities/oauth.authorization.code.entity.d.ts +2 -0
  209. package/dist/foundations/oauth/entities/oauth.authorization.code.entity.d.ts.map +1 -1
  210. package/dist/foundations/oauth/entities/oauth.authorization.code.entity.js.map +1 -1
  211. package/dist/foundations/oauth/entities/oauth.authorization.code.model.d.ts.map +1 -1
  212. package/dist/foundations/oauth/entities/oauth.authorization.code.model.js +1 -0
  213. package/dist/foundations/oauth/entities/oauth.authorization.code.model.js.map +1 -1
  214. package/dist/foundations/oauth/filters/oauth.error.filter.d.ts +16 -0
  215. package/dist/foundations/oauth/filters/oauth.error.filter.d.ts.map +1 -0
  216. package/dist/foundations/oauth/filters/oauth.error.filter.js +70 -0
  217. package/dist/foundations/oauth/filters/oauth.error.filter.js.map +1 -0
  218. package/dist/foundations/oauth/guards/oauth.token.guard.d.ts +2 -2
  219. package/dist/foundations/oauth/guards/oauth.token.guard.js +2 -2
  220. package/dist/foundations/oauth/index.d.ts +2 -1
  221. package/dist/foundations/oauth/index.d.ts.map +1 -1
  222. package/dist/foundations/oauth/index.js +3 -1
  223. package/dist/foundations/oauth/index.js.map +1 -1
  224. package/dist/foundations/oauth/oauth.module.d.ts +2 -2
  225. package/dist/foundations/oauth/oauth.module.d.ts.map +1 -1
  226. package/dist/foundations/oauth/oauth.module.js +11 -5
  227. package/dist/foundations/oauth/oauth.module.js.map +1 -1
  228. package/dist/foundations/oauth/repositories/oauth.repository.d.ts +20 -1
  229. package/dist/foundations/oauth/repositories/oauth.repository.d.ts.map +1 -1
  230. package/dist/foundations/oauth/repositories/oauth.repository.js +54 -10
  231. package/dist/foundations/oauth/repositories/oauth.repository.js.map +1 -1
  232. package/dist/foundations/oauth/services/index.d.ts +1 -0
  233. package/dist/foundations/oauth/services/index.d.ts.map +1 -1
  234. package/dist/foundations/oauth/services/index.js +1 -0
  235. package/dist/foundations/oauth/services/index.js.map +1 -1
  236. package/dist/foundations/oauth/services/oauth.client.service.d.ts +3 -1
  237. package/dist/foundations/oauth/services/oauth.client.service.d.ts.map +1 -1
  238. package/dist/foundations/oauth/services/oauth.client.service.js +7 -5
  239. package/dist/foundations/oauth/services/oauth.client.service.js.map +1 -1
  240. package/dist/foundations/oauth/services/oauth.scope.service.d.ts +32 -0
  241. package/dist/foundations/oauth/services/oauth.scope.service.d.ts.map +1 -0
  242. package/dist/foundations/oauth/services/oauth.scope.service.js +71 -0
  243. package/dist/foundations/oauth/services/oauth.scope.service.js.map +1 -0
  244. package/dist/foundations/oauth/services/oauth.service.d.ts +13 -1
  245. package/dist/foundations/oauth/services/oauth.service.d.ts.map +1 -1
  246. package/dist/foundations/oauth/services/oauth.service.js +18 -8
  247. package/dist/foundations/oauth/services/oauth.service.js.map +1 -1
  248. package/dist/foundations/relevancy/queries/relevance.d.ts +20 -0
  249. package/dist/foundations/relevancy/queries/relevance.d.ts.map +1 -1
  250. package/dist/foundations/relevancy/queries/relevance.js +44 -8
  251. package/dist/foundations/relevancy/queries/relevance.js.map +1 -1
  252. package/dist/foundations/relevancy/repositories/relevancy.repository.d.ts +41 -2
  253. package/dist/foundations/relevancy/repositories/relevancy.repository.d.ts.map +1 -1
  254. package/dist/foundations/relevancy/repositories/relevancy.repository.js +89 -6
  255. package/dist/foundations/relevancy/repositories/relevancy.repository.js.map +1 -1
  256. package/dist/foundations/relevancy/services/relevancy.service.js +1 -1
  257. package/dist/foundations/relevancy/services/relevancy.service.js.map +1 -1
  258. package/dist/foundations/s3/controllers/s3.controller.d.ts +10 -1
  259. package/dist/foundations/s3/controllers/s3.controller.d.ts.map +1 -1
  260. package/dist/foundations/s3/controllers/s3.controller.js +33 -2
  261. package/dist/foundations/s3/controllers/s3.controller.js.map +1 -1
  262. package/dist/foundations/user/controllers/user.controller.d.ts +1 -1
  263. package/dist/foundations/user/controllers/user.controller.d.ts.map +1 -1
  264. package/dist/foundations/user/controllers/user.controller.js +4 -4
  265. package/dist/foundations/user/controllers/user.controller.js.map +1 -1
  266. package/dist/foundations/user/entities/user.d.ts +17 -17
  267. package/dist/foundations/user/entities/user.d.ts.map +1 -1
  268. package/dist/foundations/user/entities/user.js +7 -7
  269. package/dist/foundations/user/entities/user.js.map +1 -1
  270. package/dist/foundations/user/user.module.js +2 -2
  271. package/dist/foundations/user/user.module.js.map +1 -1
  272. package/dist/mcp/services/mcp.entity.write.service.d.ts +9 -4
  273. package/dist/mcp/services/mcp.entity.write.service.d.ts.map +1 -1
  274. package/dist/mcp/services/mcp.entity.write.service.js +12 -4
  275. package/dist/mcp/services/mcp.entity.write.service.js.map +1 -1
  276. package/dist/mcp/services/mcp.errors.d.ts +1 -1
  277. package/dist/mcp/services/mcp.errors.d.ts.map +1 -1
  278. package/dist/mcp/services/mcp.errors.js.map +1 -1
  279. package/dist/mcp/services/mcp.tool.registry.d.ts +10 -1
  280. package/dist/mcp/services/mcp.tool.registry.d.ts.map +1 -1
  281. package/dist/mcp/services/mcp.tool.registry.js +24 -2
  282. package/dist/mcp/services/mcp.tool.registry.js.map +1 -1
  283. package/package.json +1 -1
@@ -91,6 +91,18 @@ export interface FieldDef {
91
91
  */
92
92
  kind?: FieldKind;
93
93
  }
94
+ /**
95
+ * An inline scope hop: a scope path that is NOT a descriptor relationship.
96
+ * Used only for the chat scope chain. It is never added to the catalog
97
+ * relationships, never read by repositories and never serialised.
98
+ */
99
+ export interface ChatScopeHop {
100
+ /** Meta of the type one hop closer to the root. It must itself declare chat.scope. */
101
+ model: DataMeta;
102
+ direction: "in" | "out";
103
+ /** Neo4j relationship type(s); "A|B" allowed. */
104
+ relationship: string;
105
+ }
94
106
  /**
95
107
  * Which parts of a `chat.writable` entity the operator's write tools may set.
96
108
  * Declared by the host app on the descriptor, surfaced to the model through
@@ -187,6 +199,17 @@ export interface RelationshipDef {
187
199
  immutable?: boolean;
188
200
  /** If true, the relationship is never written by generic descriptor-driven paths (create/put/patch skip it; relationship handlers reject it). Serialisation-only. */
189
201
  readOnly?: boolean;
202
+ /**
203
+ * If true, the related records live outside this database (e.g. an external
204
+ * corpus): the local node is only a link target. Generic reads
205
+ * (`buildReturnStatement()`, so find/findById/findByIds/findByRelated/
206
+ * findByRelatedEdge) project the related node as its id and labels only —
207
+ * `{ labels, properties: { id } }` — and never return its stored properties.
208
+ * The owning service hydrates the fields from the external source.
209
+ * Not allowed together with `include` (an external node has no local
210
+ * relationships to expand). Default: false.
211
+ */
212
+ externalSource?: boolean;
190
213
  /** Human-readable description. Required for the relationship to be visible to the chatbot. */
191
214
  description?: string;
192
215
  /** Opts in reverse traversal from the target entity. Omit to keep one-way. */
@@ -281,10 +304,27 @@ export interface EntitySchemaInput<T, R extends Record<string, RelationshipDef>
281
304
  list?: string[];
282
305
  /**
283
306
  * Campaign/tenant-style scoping. Either "self" (this entity IS the scope
284
- * root) or the key of a relationship on THIS descriptor pointing one hop
285
- * closer to the root. The catalog walks the chain at boot.
307
+ * root), the key of a relationship on THIS descriptor pointing one hop
308
+ * closer to the root, or an inline {@link ChatScopeHop} for a scope path
309
+ * that is not a descriptor relationship. The catalog walks the chain at boot.
286
310
  */
287
- scope?: string;
311
+ scope?: string | ChatScopeHop;
312
+ /**
313
+ * Reference data: visible in every scoped run, whatever the root.
314
+ * Mutually exclusive with `scope`; not allowed on a `writable` type.
315
+ */
316
+ scopeShared?: boolean;
317
+ /**
318
+ * Scope decided by the type's own service rather than by a Cypher path:
319
+ * for records whose scope edge does not exist in the app database. The
320
+ * service must implement `ExternalEntitySource.filterInScope`; without it
321
+ * every record of this type is out of scope in a scoped run.
322
+ * `rootType` must be a catalogued type whose `chat.scope` is `"self"`.
323
+ * Mutually exclusive with `scope` and `scopeShared` (boot throws).
324
+ */
325
+ scopeByService?: {
326
+ rootType: string;
327
+ };
288
328
  /**
289
329
  * Opts this type into the operator's generic write tools.
290
330
  * `true` keeps the legacy meaning (every described field, every forward
@@ -373,10 +413,27 @@ export interface EntityDescriptor<T, R extends Record<string, RelationshipDef> =
373
413
  list?: string[];
374
414
  /**
375
415
  * Campaign/tenant-style scoping. Either "self" (this entity IS the scope
376
- * root) or the key of a relationship on THIS descriptor pointing one hop
377
- * closer to the root. The catalog walks the chain at boot.
416
+ * root), the key of a relationship on THIS descriptor pointing one hop
417
+ * closer to the root, or an inline {@link ChatScopeHop} for a scope path
418
+ * that is not a descriptor relationship. The catalog walks the chain at boot.
419
+ */
420
+ scope?: string | ChatScopeHop;
421
+ /**
422
+ * Reference data: visible in every scoped run, whatever the root.
423
+ * Mutually exclusive with `scope`; not allowed on a `writable` type.
424
+ */
425
+ scopeShared?: boolean;
426
+ /**
427
+ * Scope decided by the type's own service rather than by a Cypher path:
428
+ * for records whose scope edge does not exist in the app database. The
429
+ * service must implement `ExternalEntitySource.filterInScope`; without it
430
+ * every record of this type is out of scope in a scoped run.
431
+ * `rootType` must be a catalogued type whose `chat.scope` is `"self"`.
432
+ * Mutually exclusive with `scope` and `scopeShared` (boot throws).
378
433
  */
379
- scope?: string;
434
+ scopeByService?: {
435
+ rootType: string;
436
+ };
380
437
  /**
381
438
  * Opts this type into the operator's generic write tools.
382
439
  * `true` keeps the legacy meaning (every described field, every forward
@@ -1 +1 @@
1
- {"version":3,"file":"entity.schema.interface.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces/entity.schema.interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entity.schema.interface.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces/entity.schema.interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * External entity sources: optional capabilities an `AbstractService` subclass
3
+ * implements when its records live outside the app database (for example a
4
+ * corpus served over HTTP).
5
+ *
6
+ * Every hook is optional and discovered on the registered service instance
7
+ * (`EntityServiceRegistry.get(type)`). A service that implements none of them
8
+ * behaves exactly as before.
9
+ */
10
+ /** One name-lookup candidate returned by {@link ExternalEntitySource.resolveByText}. */
11
+ export interface ExternalResolveCandidate {
12
+ id: string;
13
+ name: string;
14
+ score: number;
15
+ }
16
+ /** One related record returned by {@link ExternalEntitySource.findRelatedIds}. */
17
+ export interface ExternalRelatedId {
18
+ type: string;
19
+ id: string;
20
+ }
21
+ /** Optional capabilities an AbstractService subclass implements when its records live outside the app database. */
22
+ export interface ExternalEntitySource {
23
+ /** resolve_entity for this type: replaces the app-DB fulltext/semantic tiers. Global reference data: no record-level access check is applied to these candidates. */
24
+ resolveByText(params: {
25
+ text: string;
26
+ limit: number;
27
+ }): Promise<ExternalResolveCandidate[]>;
28
+ /** Scope check for a type declared with chat.scopeByService. Returns the subset of ids inside the scope root. */
29
+ filterInScope?(params: {
30
+ ids: string[];
31
+ scopeType: string;
32
+ scopeId: string;
33
+ }): Promise<string[]>;
34
+ /** Polymorphic traverse for edges that do not exist in the app database. */
35
+ findRelatedIds?(params: {
36
+ id: string;
37
+ cypherLabel: string;
38
+ limit: number;
39
+ }): Promise<ExternalRelatedId[]>;
40
+ }
41
+ /** True when the service implements {@link ExternalEntitySource.resolveByText}. */
42
+ export declare function isExternalEntitySource(svc: unknown): svc is ExternalEntitySource;
43
+ //# sourceMappingURL=external.entity.source.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.entity.source.interface.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces/external.entity.source.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wFAAwF;AACxF,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,mHAAmH;AACnH,MAAM,WAAW,oBAAoB;IACnC,qKAAqK;IACrK,aAAa,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC5F,iHAAiH;IACjH,aAAa,CAAC,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjG,4EAA4E;IAC5E,cAAc,CAAC,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CAC3G;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,oBAAoB,CAEhF"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /**
3
+ * External entity sources: optional capabilities an `AbstractService` subclass
4
+ * implements when its records live outside the app database (for example a
5
+ * corpus served over HTTP).
6
+ *
7
+ * Every hook is optional and discovered on the registered service instance
8
+ * (`EntityServiceRegistry.get(type)`). A service that implements none of them
9
+ * behaves exactly as before.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.isExternalEntitySource = isExternalEntitySource;
13
+ /** True when the service implements {@link ExternalEntitySource.resolveByText}. */
14
+ function isExternalEntitySource(svc) {
15
+ return typeof svc?.resolveByText === "function";
16
+ }
17
+ //# sourceMappingURL=external.entity.source.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.entity.source.interface.js","sourceRoot":"","sources":["../../../src/common/interfaces/external.entity.source.interface.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AA0BH,wDAEC;AAHD,mFAAmF;AACnF,SAAgB,sBAAsB,CAAC,GAAY;IACjD,OAAO,OAAQ,GAAW,EAAE,aAAa,KAAK,UAAU,CAAC;AAC3D,CAAC"}
@@ -1,8 +1,12 @@
1
+ export * from "./assistant.scope.interface";
2
+ export * from "./assistant.title.interface";
1
3
  export * from "./authenticated.request.interface";
2
4
  export * from "./datamodel.interface";
3
5
  export * from "./entity.descriptor.interface";
4
6
  export * from "./entity.schema.interface";
7
+ export * from "./external.entity.source.interface";
5
8
  export * from "./message.interface";
9
+ export * from "./s3.key-access.policy.interface";
6
10
  export * from "./seed.context.interface";
7
11
  export * from "./token.usage.interface";
8
12
  export * from "./langchain.usage.interface";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oCAAoC,CAAC;AACnD,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
@@ -14,11 +14,15 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./assistant.scope.interface"), exports);
18
+ __exportStar(require("./assistant.title.interface"), exports);
17
19
  __exportStar(require("./authenticated.request.interface"), exports);
18
20
  __exportStar(require("./datamodel.interface"), exports);
19
21
  __exportStar(require("./entity.descriptor.interface"), exports);
20
22
  __exportStar(require("./entity.schema.interface"), exports);
23
+ __exportStar(require("./external.entity.source.interface"), exports);
21
24
  __exportStar(require("./message.interface"), exports);
25
+ __exportStar(require("./s3.key-access.policy.interface"), exports);
22
26
  __exportStar(require("./seed.context.interface"), exports);
23
27
  __exportStar(require("./token.usage.interface"), exports);
24
28
  __exportStar(require("./langchain.usage.interface"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oEAAkD;AAClD,wDAAsC;AACtC,gEAA8C;AAC9C,4DAA0C;AAC1C,sDAAoC;AACpC,2DAAyC;AACzC,0DAAwC;AACxC,8DAA4C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,8DAA4C;AAC5C,oEAAkD;AAClD,wDAAsC;AACtC,gEAA8C;AAC9C,4DAA0C;AAC1C,qEAAmD;AACnD,sDAAoC;AACpC,mEAAiD;AACjD,2DAAyC;AACzC,0DAAwC;AACxC,8DAA4C"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * S3 key access policy: an app-provided check deciding whether the current
3
+ * caller may act on a client-supplied object key through the `/s3` routes.
4
+ *
5
+ * The token is optional. When unbound, the `/s3` routes accept every
6
+ * well-formed key, as before. Bind it from a `@Global()` application module so
7
+ * the package `S3Module`, which imports no app modules, can resolve it.
8
+ */
9
+ /** What the caller wants to do with the key. */
10
+ export type S3KeyAction = "upload" | "download" | "delete";
11
+ /**
12
+ * Parameters handed to the policy for one `/s3` request.
13
+ *
14
+ * `userId`, `companyId` and `roles` come from the request CLS context set by
15
+ * the JWT guard (the same values the repositories scope by).
16
+ */
17
+ export interface S3KeyAccessParams {
18
+ key: string;
19
+ action: S3KeyAction;
20
+ isPublic: boolean;
21
+ userId?: string;
22
+ companyId?: string;
23
+ roles: string[];
24
+ }
25
+ /**
26
+ * Contract implemented by an application-provided S3 key access policy.
27
+ *
28
+ * Return false to refuse the request (HTTP 403).
29
+ */
30
+ export interface S3KeyAccessPolicy {
31
+ canAccess(params: S3KeyAccessParams): boolean | Promise<boolean>;
32
+ }
33
+ /**
34
+ * Optional injection token resolving to an S3KeyAccessPolicy.
35
+ * When unbound, every well-formed key is accepted.
36
+ */
37
+ export declare const S3_KEY_ACCESS_POLICY: unique symbol;
38
+ /**
39
+ * True when `key` is a well-formed object key: a non-empty string that does
40
+ * not start with `/` and has no `..` path segment.
41
+ *
42
+ * MinIO, Azure and any URL-normalising proxy resolve `..` and a leading `/`
43
+ * in the request path, so such a key can address an object outside the
44
+ * prefix it appears to name. The `/s3` routes reject it whether or not a
45
+ * policy is bound.
46
+ */
47
+ export declare function isWellFormedS3Key(key: unknown): key is string;
48
+ //# sourceMappingURL=s3.key-access.policy.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.key-access.policy.interface.d.ts","sourceRoot":"","sources":["../../../src/common/interfaces/s3.key-access.policy.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gDAAgD;AAChD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AAEnE;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAK7D"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * S3 key access policy: an app-provided check deciding whether the current
4
+ * caller may act on a client-supplied object key through the `/s3` routes.
5
+ *
6
+ * The token is optional. When unbound, the `/s3` routes accept every
7
+ * well-formed key, as before. Bind it from a `@Global()` application module so
8
+ * the package `S3Module`, which imports no app modules, can resolve it.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.S3_KEY_ACCESS_POLICY = void 0;
12
+ exports.isWellFormedS3Key = isWellFormedS3Key;
13
+ /**
14
+ * Optional injection token resolving to an S3KeyAccessPolicy.
15
+ * When unbound, every well-formed key is accepted.
16
+ */
17
+ exports.S3_KEY_ACCESS_POLICY = Symbol("S3_KEY_ACCESS_POLICY");
18
+ /**
19
+ * True when `key` is a well-formed object key: a non-empty string that does
20
+ * not start with `/` and has no `..` path segment.
21
+ *
22
+ * MinIO, Azure and any URL-normalising proxy resolve `..` and a leading `/`
23
+ * in the request path, so such a key can address an object outside the
24
+ * prefix it appears to name. The `/s3` routes reject it whether or not a
25
+ * policy is bound.
26
+ */
27
+ function isWellFormedS3Key(key) {
28
+ if (typeof key !== "string")
29
+ return false;
30
+ if (key.trim() === "")
31
+ return false;
32
+ if (key.startsWith("/"))
33
+ return false;
34
+ return !key.split("/").includes("..");
35
+ }
36
+ //# sourceMappingURL=s3.key-access.policy.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.key-access.policy.interface.js","sourceRoot":"","sources":["../../../src/common/interfaces/s3.key-access.policy.interface.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AA4CH,8CAKC;AApBD;;;GAGG;AACU,QAAA,oBAAoB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAEnE;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAAC,GAAY;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -144,6 +144,19 @@ export interface TokenUsageRecorderInterface {
144
144
  * be visible application-wide.
145
145
  */
146
146
  export declare const CREDIT_VALIDATOR: unique symbol;
147
+ /**
148
+ * Gates interactive AI requests only (assistant, operator, MCP); falls back to
149
+ * CREDIT_VALIDATOR when unbound.
150
+ *
151
+ * Same `CreditValidatorInterface` contract as `CREDIT_VALIDATOR` above. It
152
+ * exists so an application can meter the interactive surfaces WITHOUT binding
153
+ * `CREDIT_VALIDATOR`, which also gates background ingestion (chunk and
154
+ * embedding processors park no-credit work as `PendingCredits`). Consumers
155
+ * resolve both tokens as `@Optional()` and pick with `pickInteractiveValidator`
156
+ * (`common/helpers/credit-gate.ts`): with this token unbound, behaviour is
157
+ * exactly the `CREDIT_VALIDATOR` behaviour documented above.
158
+ */
159
+ export declare const INTERACTIVE_CREDIT_VALIDATOR: unique symbol;
147
160
  /**
148
161
  * Contract implemented by an application-provided credit validator.
149
162
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/common/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E;;;;GAIG;AAGH,eAAO,MAAM,YAAY,eAAyB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5F;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,mBAAmB,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,sJAAsJ;QACtJ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,6HAA6H;QAC7H,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB;;;;;WAKG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,2DAA2D;QAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,eAAO,MAAM,gBAAgB,eAA6B,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/common/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E;;;;GAIG;AAGH,eAAO,MAAM,YAAY,eAAyB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5F;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,mBAAmB,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,sJAAsJ;QACtJ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,6HAA6H;QAC7H,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB;;;;;WAKG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,2DAA2D;QAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,eAAO,MAAM,gBAAgB,eAA6B,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B,eAAyC,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CREDIT_VALIDATOR = exports.TOKEN_USAGE_RECORDER = exports.AUTH_CONTEXT_HOOK = exports.SYSTEM_ROLES = void 0;
3
+ exports.INTERACTIVE_CREDIT_VALIDATOR = exports.CREDIT_VALIDATOR = exports.TOKEN_USAGE_RECORDER = exports.AUTH_CONTEXT_HOOK = exports.SYSTEM_ROLES = void 0;
4
4
  /**
5
5
  * Injection tokens for common module dependencies
6
6
  *
@@ -99,4 +99,17 @@ exports.TOKEN_USAGE_RECORDER = Symbol("TOKEN_USAGE_RECORDER");
99
99
  * be visible application-wide.
100
100
  */
101
101
  exports.CREDIT_VALIDATOR = Symbol("CREDIT_VALIDATOR");
102
+ /**
103
+ * Gates interactive AI requests only (assistant, operator, MCP); falls back to
104
+ * CREDIT_VALIDATOR when unbound.
105
+ *
106
+ * Same `CreditValidatorInterface` contract as `CREDIT_VALIDATOR` above. It
107
+ * exists so an application can meter the interactive surfaces WITHOUT binding
108
+ * `CREDIT_VALIDATOR`, which also gates background ingestion (chunk and
109
+ * embedding processors park no-credit work as `PendingCredits`). Consumers
110
+ * resolve both tokens as `@Optional()` and pick with `pickInteractiveValidator`
111
+ * (`common/helpers/credit-gate.ts`): with this token unbound, behaviour is
112
+ * exactly the `CREDIT_VALIDATOR` behaviour documented above.
113
+ */
114
+ exports.INTERACTIVE_CREDIT_VALIDATOR = Symbol("INTERACTIVE_CREDIT_VALIDATOR");
102
115
  //# sourceMappingURL=tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/common/tokens.ts"],"names":[],"mappings":";;;AAIA;;;;GAIG;AAEH,8BAA8B;AACjB,QAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAUnD;;;;;;;;;GASG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAS7D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACU,QAAA,oBAAoB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAiCnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACU,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/common/tokens.ts"],"names":[],"mappings":";;;AAIA;;;;GAIG;AAEH,8BAA8B;AACjB,QAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAUnD;;;;;;;;;GASG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAS7D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACU,QAAA,oBAAoB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAiCnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACU,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE3D;;;;;;;;;;;GAWG;AACU,QAAA,4BAA4B,GAAG,MAAM,CAAC,8BAA8B,CAAC,CAAC"}
@@ -3,9 +3,11 @@ import { ConfigChunkQueuesInterface } from "./interfaces/config.chunk.queues.int
3
3
  import { ConfigContentTypesInterface } from "./interfaces/config.content.types.interface";
4
4
  import { ConfigJobNamesInterface } from "./interfaces/config.job.names.interface";
5
5
  import { ConfigOperatorInterface } from "./interfaces/config.operator.interface";
6
+ import { ConfigAssistantInterface } from "./interfaces/config.assistant.interface";
6
7
  import { ConfigPromptsInterface } from "./interfaces/config.prompts.interface";
7
8
  import { ConfigResponderInterface } from "./interfaces/config.responder.interface";
8
9
  import { ConfigSummariserInterface } from "./interfaces/config.summariser.interface";
10
+ import { OAuthScopeDefinition } from "../foundations/oauth/constants/oauth.scopes";
9
11
  /**
10
12
  * How many chunk jobs the CHUNK worker processes at once. Default 50 —
11
13
  * historically a hardcoded literal on `ChunkProcessor`'s `@Processor` decorator.
@@ -53,6 +55,11 @@ export interface BaseConfigOptions {
53
55
  * Optional - `approvalTtlDays` defaults to 7 when omitted.
54
56
  */
55
57
  operator?: ConfigOperatorInterface;
58
+ /**
59
+ * Assistant behaviour switches (inline entity links).
60
+ * Optional - every switch defaults to off.
61
+ */
62
+ assistant?: ConfigAssistantInterface;
56
63
  /**
57
64
  * Additional queue IDs for chunk processing.
58
65
  * The library always registers its own CHUNK queue.
@@ -69,6 +76,12 @@ export interface BaseConfigOptions {
69
76
  * Defines the job names that processors use to match incoming jobs.
70
77
  */
71
78
  jobNames?: ConfigJobNamesInterface;
79
+ /**
80
+ * App-specific OAuth scopes registered on top of the built-ins
81
+ * (read, write, profile, mcp, admin). Exposed as `oauth.additionalScopes`.
82
+ * @default []
83
+ */
84
+ oauthScopes?: OAuthScopeDefinition[];
72
85
  }
73
86
  /**
74
87
  * Creates the base configuration object from environment variables.
@@ -1 +1 @@
1
- {"version":3,"file":"base.config.d.ts","sourceRoot":"","sources":["../../src/config/base.config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AA4IrF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAGlC,CAAC;AAEL;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEnC;;;OAGG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC;IAEjC,yFAAyF;IACzF,SAAS,CAAC,EAAE,wBAAwB,CAAC;IAErC,gFAAgF;IAChF,UAAU,CAAC,EAAE,yBAAyB,CAAC;IAEvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAEnC;;;;OAIG;IACH,WAAW,CAAC,EAAE,0BAA0B,CAAC;IAEzC;;;OAGG;IACH,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAE3C;;;OAGG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,mBAAmB,CA0UjF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,UAAU,qBAAqB,CAAC"}
1
+ {"version":3,"file":"base.config.d.ts","sourceRoot":"","sources":["../../src/config/base.config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAErF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAyKnF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAGlC,CAAC;AAEL;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEnC;;;OAGG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC;IAEjC,yFAAyF;IACzF,SAAS,CAAC,EAAE,wBAAwB,CAAC;IAErC,gFAAgF;IAChF,UAAU,CAAC,EAAE,yBAAyB,CAAC;IAEvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAEnC;;;OAGG;IACH,SAAS,CAAC,EAAE,wBAAwB,CAAC;IAErC;;;;OAIG;IACH,WAAW,CAAC,EAAE,0BAA0B,CAAC;IAEzC;;;OAGG;IACH,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAE3C;;;OAGG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAEnC;;;;OAIG;IACH,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,mBAAmB,CA2VjF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,UAAU,qBAAqB,CAAC"}
@@ -36,6 +36,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.baseConfig = exports.CHUNK_QUEUE_CONCURRENCY = void 0;
37
37
  exports.createBaseConfig = createBaseConfig;
38
38
  const path = __importStar(require("path"));
39
+ /**
40
+ * Reads an optional numeric env var, preserving the "unset" state.
41
+ *
42
+ * `parseFloat(x || "0")` — the pattern used for the mandatory rates — cannot
43
+ * express "not configured": it collapses an unset var onto a real, meaningful
44
+ * 0. Every field that omits itself from a provider request when absent needs
45
+ * the distinction, so it gets `undefined` instead. A non-numeric value is also
46
+ * `undefined`, so a typo falls back to the provider default rather than sending
47
+ * NaN on the wire.
48
+ */
49
+ const optionalNumber = (value) => {
50
+ if (value === undefined || value.trim() === "")
51
+ return undefined;
52
+ const parsed = Number(value);
53
+ return Number.isFinite(parsed) ? parsed : undefined;
54
+ };
55
+ /**
56
+ * Reads an optional boolean env var as a TRI-STATE: unset stays `undefined`
57
+ * (send nothing, let the provider default apply), "true" is true, anything else
58
+ * is false. `x === "true"` alone would turn every unset flag into an explicit
59
+ * `false` on the wire — which is a different request.
60
+ */
61
+ const optionalBoolean = (value) => value === undefined || value.trim() === "" ? undefined : value === "true";
39
62
  /**
40
63
  * Resolves one AI model tier from env. `suffix` is "" (normal), "_LITE", or
41
64
  * "_LARGE".
@@ -45,11 +68,14 @@ const path = __importStar(require("path"));
45
68
  * provider as the base tier) inherits field-by-field from the normal `AI_*`
46
69
  * vars — a lone `AI_MODEL_LITE` overrides only the model. Mirrors the
47
70
  * existing VISION_ and AUDIO_ env fallback convention.
48
- * - EXCEPTION: `AI_REGION` and `AI_ALLOW_FALLBACKS` never inherit the base.
49
- * They are per-MODEL routing (the OpenRouter provider pin), not provider-wide
50
- * credentials, so inheriting them would pin a tier's overridden model to a
51
- * provider that may not serve it (404/422). A tier that wants a pin must set
52
- * `AI_REGION<suffix>` / `AI_ALLOW_FALLBACKS<suffix>` explicitly.
71
+ * - EXCEPTION: `AI_REGION` and `AI_ALLOW_FALLBACKS` inherit the base ONLY when
72
+ * the tier also inherits the base MODEL (no `AI_MODEL<suffix>`). They are
73
+ * per-MODEL routing (the OpenRouter provider pin), not provider-wide
74
+ * credentials: a tier that overrides the model must not be pinned to a
75
+ * provider that may not serve it (404/422), so it resolves them only from
76
+ * `AI_REGION<suffix>` / `AI_ALLOW_FALLBACKS<suffix>`. A tier running the base
77
+ * model keeps the base pin — dropping it silently routed that same model
78
+ * through every OpenRouter provider, including ones the pin was set to avoid.
53
79
  * - A tier that switches to a DIFFERENT provider is standalone: no field
54
80
  * inherits from the base tier, because base values (URL, API key, costs…)
55
81
  * point at the wrong service. Each field resolves only from its suffixed
@@ -61,25 +87,26 @@ const buildAiTier = (suffix) => {
61
87
  const standalone = suffix !== "" && tierProvider !== "" && tierProvider !== baseProvider;
62
88
  const env = (key) => process.env[`${key}${suffix}`] || (standalone ? "" : process.env[key]) || "";
63
89
  // `region` and `allowFallbacks` describe per-MODEL routing (the OpenRouter
64
- // provider pin), NOT shared credentials/endpoint. A tier that overrides only
90
+ // provider pin), NOT shared credentials/endpoint. A tier that overrides
65
91
  // AI_MODEL must not drag the base tier's pin onto a different model, or the
66
- // provider 404s (model not served there) / 422s (rejects the oneOf). So these
67
- // resolve strictly from the tier's own suffixed var and never inherit the
68
- // base — unlike apiKey/url/instance/costs, which are provider-wide.
69
- const own = (key) => process.env[`${key}${suffix}`] || "";
92
+ // provider 404s (model not served there) / 422s (rejects the oneOf), so for
93
+ // it these resolve strictly from the tier's own suffixed var. A tier that
94
+ // runs the base model (same provider, no AI_MODEL<suffix>) inherits the pin.
95
+ const runsBaseModel = !standalone && !process.env[`AI_MODEL${suffix}`];
96
+ const routing = (key) => process.env[`${key}${suffix}`] || (runsBaseModel ? process.env[key] : "") || "";
70
97
  const maxOutputTokens = env("AI_MAX_OUTPUT_TOKENS");
71
98
  // Conditional spread avoids `parseFloat("") = NaN` — when the env var is unset,
72
99
  // the field is omitted entirely so it stays `undefined` (no-discount fallback).
73
100
  const cachedInputCost = env("AI_CACHED_INPUT_COST_PER_1M_TOKENS");
74
101
  // Default true (matches OpenRouter's own default); only an explicit "false"
75
102
  // turns `region` into a hard pin.
76
- const allowFallbacks = own("AI_ALLOW_FALLBACKS").toLowerCase() !== "false";
103
+ const allowFallbacks = routing("AI_ALLOW_FALLBACKS").toLowerCase() !== "false";
77
104
  return {
78
105
  provider: tierProvider || baseProvider,
79
106
  apiKey: env("AI_API_KEY"),
80
107
  model: env("AI_MODEL"),
81
108
  url: env("AI_URL"),
82
- region: own("AI_REGION"),
109
+ region: routing("AI_REGION"),
83
110
  secret: env("AI_SECRET"),
84
111
  instance: env("AI_INSTANCE"),
85
112
  apiVersion: env("AI_API_VERSION"),
@@ -414,6 +441,21 @@ function createBaseConfig(options) {
414
441
  googleCredentialsBase64: process.env.IMAGE_GOOGLE_CREDENTIALS_BASE64 || "",
415
442
  inputCostPer1MTokens: parseFloat(process.env.IMAGE_INPUT_COST_PER_1M_TOKENS || "0"),
416
443
  outputCostPer1MTokens: parseFloat(process.env.IMAGE_OUTPUT_COST_PER_1M_TOKENS || "0"),
444
+ // Per-image billing (Venice and friends report no token usage at all).
445
+ // Undefined rather than 0 when unset, so "not configured" stays
446
+ // distinguishable from "configured as free".
447
+ costPerImage: optionalNumber(process.env.IMAGE_COST_PER_IMAGE),
448
+ // Venice `/image/generate` body defaults. Every one is undefined unless
449
+ // set, and ImageLLMService omits undefined keys from the request, so an
450
+ // unset var means "let Venice decide".
451
+ negativePrompt: process.env.IMAGE_NEGATIVE_PROMPT || undefined,
452
+ width: optionalNumber(process.env.IMAGE_WIDTH),
453
+ height: optionalNumber(process.env.IMAGE_HEIGHT),
454
+ steps: optionalNumber(process.env.IMAGE_STEPS),
455
+ cfgScale: optionalNumber(process.env.IMAGE_CFG_SCALE),
456
+ safeMode: optionalBoolean(process.env.IMAGE_SAFE_MODE),
457
+ hideWatermark: optionalBoolean(process.env.IMAGE_HIDE_WATERMARK),
458
+ imageFormat: process.env.IMAGE_FORMAT || undefined,
417
459
  },
418
460
  audio: buildAudioTier(""),
419
461
  audioDiarize: {
@@ -484,6 +526,7 @@ function createBaseConfig(options) {
484
526
  refreshTokenLifetime: parseInt(process.env.OAUTH_REFRESH_TOKEN_LIFETIME || "604800"),
485
527
  requirePkceForPublicClients: process.env.OAUTH_REQUIRE_PKCE_FOR_PUBLIC_CLIENTS !== "false",
486
528
  rotateRefreshTokens: process.env.OAUTH_ROTATE_REFRESH_TOKENS !== "false",
529
+ additionalScopes: options?.oauthScopes ?? [],
487
530
  },
488
531
  mcp: {
489
532
  enabled: process.env.MCP_ENABLED === "true",
@@ -528,6 +571,7 @@ function createBaseConfig(options) {
528
571
  responder: options?.responder ?? {},
529
572
  summariser: options?.summariser ?? {},
530
573
  operator: options?.operator ?? {},
574
+ assistant: options?.assistant ?? {},
531
575
  chunker: {
532
576
  strategy: process.env.CHUNKER_STRATEGY || "markdown-structural",
533
577
  ocrLanguage: process.env.OCR_LANGUAGE || "eng",