@agentlensai/server 0.2.0 → 0.5.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 (222) hide show
  1. package/dist/db/embedding-store.d.ts +74 -0
  2. package/dist/db/embedding-store.d.ts.map +1 -0
  3. package/dist/db/embedding-store.js +177 -0
  4. package/dist/db/embedding-store.js.map +1 -0
  5. package/dist/db/lesson-store.d.ts +57 -0
  6. package/dist/db/lesson-store.d.ts.map +1 -0
  7. package/dist/db/lesson-store.js +217 -0
  8. package/dist/db/lesson-store.js.map +1 -0
  9. package/dist/db/migrate.d.ts.map +1 -1
  10. package/dist/db/migrate.js +250 -4
  11. package/dist/db/migrate.js.map +1 -1
  12. package/dist/db/schema.sqlite.d.ts +881 -55
  13. package/dist/db/schema.sqlite.d.ts.map +1 -1
  14. package/dist/db/schema.sqlite.js +82 -4
  15. package/dist/db/schema.sqlite.js.map +1 -1
  16. package/dist/db/session-summary-store.d.ts +45 -0
  17. package/dist/db/session-summary-store.d.ts.map +1 -0
  18. package/dist/db/session-summary-store.js +112 -0
  19. package/dist/db/session-summary-store.js.map +1 -0
  20. package/dist/db/sqlite-store.d.ts +25 -13
  21. package/dist/db/sqlite-store.d.ts.map +1 -1
  22. package/dist/db/sqlite-store.js +224 -47
  23. package/dist/db/sqlite-store.js.map +1 -1
  24. package/dist/db/tenant-scoped-store.d.ts +61 -0
  25. package/dist/db/tenant-scoped-store.d.ts.map +1 -0
  26. package/dist/db/tenant-scoped-store.js +94 -0
  27. package/dist/db/tenant-scoped-store.js.map +1 -0
  28. package/dist/index.d.ts +25 -4
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +99 -5
  31. package/dist/index.js.map +1 -1
  32. package/dist/lib/alert-engine.d.ts +72 -0
  33. package/dist/lib/alert-engine.d.ts.map +1 -0
  34. package/dist/lib/alert-engine.js +318 -0
  35. package/dist/lib/alert-engine.js.map +1 -0
  36. package/dist/lib/analysis/cost-analysis.d.ts +20 -0
  37. package/dist/lib/analysis/cost-analysis.d.ts.map +1 -0
  38. package/dist/lib/analysis/cost-analysis.js +158 -0
  39. package/dist/lib/analysis/cost-analysis.js.map +1 -0
  40. package/dist/lib/analysis/error-patterns.d.ts +26 -0
  41. package/dist/lib/analysis/error-patterns.d.ts.map +1 -0
  42. package/dist/lib/analysis/error-patterns.js +155 -0
  43. package/dist/lib/analysis/error-patterns.js.map +1 -0
  44. package/dist/lib/analysis/index.d.ts +23 -0
  45. package/dist/lib/analysis/index.d.ts.map +1 -0
  46. package/dist/lib/analysis/index.js +144 -0
  47. package/dist/lib/analysis/index.js.map +1 -0
  48. package/dist/lib/analysis/performance-trends.d.ts +19 -0
  49. package/dist/lib/analysis/performance-trends.d.ts.map +1 -0
  50. package/dist/lib/analysis/performance-trends.js +118 -0
  51. package/dist/lib/analysis/performance-trends.js.map +1 -0
  52. package/dist/lib/analysis/tool-sequences.d.ts +19 -0
  53. package/dist/lib/analysis/tool-sequences.d.ts.map +1 -0
  54. package/dist/lib/analysis/tool-sequences.js +145 -0
  55. package/dist/lib/analysis/tool-sequences.js.map +1 -0
  56. package/dist/lib/context/index.d.ts +5 -0
  57. package/dist/lib/context/index.d.ts.map +1 -0
  58. package/dist/lib/context/index.js +5 -0
  59. package/dist/lib/context/index.js.map +1 -0
  60. package/dist/lib/context/retrieval.d.ts +56 -0
  61. package/dist/lib/context/retrieval.d.ts.map +1 -0
  62. package/dist/lib/context/retrieval.js +229 -0
  63. package/dist/lib/context/retrieval.js.map +1 -0
  64. package/dist/lib/embeddings/index.d.ts +31 -0
  65. package/dist/lib/embeddings/index.d.ts.map +1 -0
  66. package/dist/lib/embeddings/index.js +31 -0
  67. package/dist/lib/embeddings/index.js.map +1 -0
  68. package/dist/lib/embeddings/local.d.ts +15 -0
  69. package/dist/lib/embeddings/local.d.ts.map +1 -0
  70. package/dist/lib/embeddings/local.js +65 -0
  71. package/dist/lib/embeddings/local.js.map +1 -0
  72. package/dist/lib/embeddings/math.d.ts +13 -0
  73. package/dist/lib/embeddings/math.d.ts.map +1 -0
  74. package/dist/lib/embeddings/math.js +35 -0
  75. package/dist/lib/embeddings/math.js.map +1 -0
  76. package/dist/lib/embeddings/openai.d.ts +15 -0
  77. package/dist/lib/embeddings/openai.d.ts.map +1 -0
  78. package/dist/lib/embeddings/openai.js +58 -0
  79. package/dist/lib/embeddings/openai.js.map +1 -0
  80. package/dist/lib/embeddings/summarizer.d.ts +26 -0
  81. package/dist/lib/embeddings/summarizer.d.ts.map +1 -0
  82. package/dist/lib/embeddings/summarizer.js +181 -0
  83. package/dist/lib/embeddings/summarizer.js.map +1 -0
  84. package/dist/lib/embeddings/types.d.ts +17 -0
  85. package/dist/lib/embeddings/types.d.ts.map +1 -0
  86. package/dist/lib/embeddings/types.js +5 -0
  87. package/dist/lib/embeddings/types.js.map +1 -0
  88. package/dist/lib/embeddings/worker.d.ts +56 -0
  89. package/dist/lib/embeddings/worker.d.ts.map +1 -0
  90. package/dist/lib/embeddings/worker.js +109 -0
  91. package/dist/lib/embeddings/worker.js.map +1 -0
  92. package/dist/lib/event-bus.d.ts +48 -0
  93. package/dist/lib/event-bus.d.ts.map +1 -0
  94. package/dist/lib/event-bus.js +34 -0
  95. package/dist/lib/event-bus.js.map +1 -0
  96. package/dist/lib/retention.d.ts +1 -1
  97. package/dist/lib/retention.d.ts.map +1 -1
  98. package/dist/lib/sse.d.ts +22 -0
  99. package/dist/lib/sse.d.ts.map +1 -0
  100. package/dist/lib/sse.js +121 -0
  101. package/dist/lib/sse.js.map +1 -0
  102. package/dist/middleware/auth.d.ts +1 -0
  103. package/dist/middleware/auth.d.ts.map +1 -1
  104. package/dist/middleware/auth.js +2 -1
  105. package/dist/middleware/auth.js.map +1 -1
  106. package/dist/routes/agents.d.ts +1 -1
  107. package/dist/routes/agents.d.ts.map +1 -1
  108. package/dist/routes/agents.js +6 -3
  109. package/dist/routes/agents.js.map +1 -1
  110. package/dist/routes/alerts.d.ts +17 -0
  111. package/dist/routes/alerts.d.ts.map +1 -0
  112. package/dist/routes/alerts.js +141 -0
  113. package/dist/routes/alerts.js.map +1 -0
  114. package/dist/routes/analytics.d.ts +16 -0
  115. package/dist/routes/analytics.d.ts.map +1 -0
  116. package/dist/routes/analytics.js +307 -0
  117. package/dist/routes/analytics.js.map +1 -0
  118. package/dist/routes/api-keys.d.ts.map +1 -1
  119. package/dist/routes/api-keys.js +30 -5
  120. package/dist/routes/api-keys.js.map +1 -1
  121. package/dist/routes/config.d.ts +5 -0
  122. package/dist/routes/config.d.ts.map +1 -1
  123. package/dist/routes/config.js +27 -7
  124. package/dist/routes/config.js.map +1 -1
  125. package/dist/routes/context.d.ts +23 -0
  126. package/dist/routes/context.d.ts.map +1 -0
  127. package/dist/routes/context.js +52 -0
  128. package/dist/routes/context.js.map +1 -0
  129. package/dist/routes/events.d.ts +7 -2
  130. package/dist/routes/events.d.ts.map +1 -1
  131. package/dist/routes/events.js +76 -8
  132. package/dist/routes/events.js.map +1 -1
  133. package/dist/routes/ingest.d.ts +36 -0
  134. package/dist/routes/ingest.d.ts.map +1 -0
  135. package/dist/routes/ingest.js +280 -0
  136. package/dist/routes/ingest.js.map +1 -0
  137. package/dist/routes/lessons.d.ts +19 -0
  138. package/dist/routes/lessons.d.ts.map +1 -0
  139. package/dist/routes/lessons.js +164 -0
  140. package/dist/routes/lessons.js.map +1 -0
  141. package/dist/routes/recall.d.ts +20 -0
  142. package/dist/routes/recall.d.ts.map +1 -0
  143. package/dist/routes/recall.js +71 -0
  144. package/dist/routes/recall.js.map +1 -0
  145. package/dist/routes/reflect.d.ts +15 -0
  146. package/dist/routes/reflect.d.ts.map +1 -0
  147. package/dist/routes/reflect.js +55 -0
  148. package/dist/routes/reflect.js.map +1 -0
  149. package/dist/routes/sessions.d.ts +1 -1
  150. package/dist/routes/sessions.d.ts.map +1 -1
  151. package/dist/routes/sessions.js +9 -7
  152. package/dist/routes/sessions.js.map +1 -1
  153. package/dist/routes/stats.d.ts +1 -1
  154. package/dist/routes/stats.d.ts.map +1 -1
  155. package/dist/routes/stats.js +3 -1
  156. package/dist/routes/stats.js.map +1 -1
  157. package/dist/routes/stream.d.ts +23 -0
  158. package/dist/routes/stream.d.ts.map +1 -0
  159. package/dist/routes/stream.js +94 -0
  160. package/dist/routes/stream.js.map +1 -0
  161. package/dist/routes/tenant-helper.d.ts +20 -0
  162. package/dist/routes/tenant-helper.d.ts.map +1 -0
  163. package/dist/routes/tenant-helper.js +23 -0
  164. package/dist/routes/tenant-helper.js.map +1 -0
  165. package/package.json +11 -11
  166. package/LICENSE +0 -21
  167. package/dist/__tests__/agents-stats.test.d.ts +0 -5
  168. package/dist/__tests__/agents-stats.test.d.ts.map +0 -1
  169. package/dist/__tests__/agents-stats.test.js +0 -134
  170. package/dist/__tests__/agents-stats.test.js.map +0 -1
  171. package/dist/__tests__/api-keys.test.d.ts +0 -5
  172. package/dist/__tests__/api-keys.test.d.ts.map +0 -1
  173. package/dist/__tests__/api-keys.test.js +0 -118
  174. package/dist/__tests__/api-keys.test.js.map +0 -1
  175. package/dist/__tests__/auth-no-db.test.d.ts +0 -2
  176. package/dist/__tests__/auth-no-db.test.d.ts.map +0 -1
  177. package/dist/__tests__/auth-no-db.test.js +0 -43
  178. package/dist/__tests__/auth-no-db.test.js.map +0 -1
  179. package/dist/__tests__/auth.test.d.ts +0 -5
  180. package/dist/__tests__/auth.test.d.ts.map +0 -1
  181. package/dist/__tests__/auth.test.js +0 -86
  182. package/dist/__tests__/auth.test.js.map +0 -1
  183. package/dist/__tests__/config.test.d.ts +0 -2
  184. package/dist/__tests__/config.test.d.ts.map +0 -1
  185. package/dist/__tests__/config.test.js +0 -37
  186. package/dist/__tests__/config.test.js.map +0 -1
  187. package/dist/__tests__/events-ingest.test.d.ts +0 -5
  188. package/dist/__tests__/events-ingest.test.d.ts.map +0 -1
  189. package/dist/__tests__/events-ingest.test.js +0 -248
  190. package/dist/__tests__/events-ingest.test.js.map +0 -1
  191. package/dist/__tests__/events-query.test.d.ts +0 -5
  192. package/dist/__tests__/events-query.test.d.ts.map +0 -1
  193. package/dist/__tests__/events-query.test.js +0 -205
  194. package/dist/__tests__/events-query.test.js.map +0 -1
  195. package/dist/__tests__/health.test.d.ts +0 -5
  196. package/dist/__tests__/health.test.d.ts.map +0 -1
  197. package/dist/__tests__/health.test.js +0 -40
  198. package/dist/__tests__/health.test.js.map +0 -1
  199. package/dist/__tests__/sessions.test.d.ts +0 -5
  200. package/dist/__tests__/sessions.test.d.ts.map +0 -1
  201. package/dist/__tests__/sessions.test.js +0 -176
  202. package/dist/__tests__/sessions.test.js.map +0 -1
  203. package/dist/__tests__/test-helpers.d.ts +0 -24
  204. package/dist/__tests__/test-helpers.d.ts.map +0 -1
  205. package/dist/__tests__/test-helpers.js +0 -45
  206. package/dist/__tests__/test-helpers.js.map +0 -1
  207. package/dist/db/__tests__/init.test.d.ts +0 -2
  208. package/dist/db/__tests__/init.test.d.ts.map +0 -1
  209. package/dist/db/__tests__/init.test.js +0 -73
  210. package/dist/db/__tests__/init.test.js.map +0 -1
  211. package/dist/db/__tests__/sqlite-store-read.test.d.ts +0 -2
  212. package/dist/db/__tests__/sqlite-store-read.test.d.ts.map +0 -1
  213. package/dist/db/__tests__/sqlite-store-read.test.js +0 -749
  214. package/dist/db/__tests__/sqlite-store-read.test.js.map +0 -1
  215. package/dist/db/__tests__/sqlite-store-write.test.d.ts +0 -2
  216. package/dist/db/__tests__/sqlite-store-write.test.d.ts.map +0 -1
  217. package/dist/db/__tests__/sqlite-store-write.test.js +0 -418
  218. package/dist/db/__tests__/sqlite-store-write.test.js.map +0 -1
  219. package/dist/lib/__tests__/retention.test.d.ts +0 -2
  220. package/dist/lib/__tests__/retention.test.d.ts.map +0 -1
  221. package/dist/lib/__tests__/retention.test.js +0 -238
  222. package/dist/lib/__tests__/retention.test.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Vector math utilities for embeddings (Story 2.1)
3
+ */
4
+ /**
5
+ * Compute cosine similarity between two vectors.
6
+ *
7
+ * Returns a value between -1 and 1, where 1 means identical direction,
8
+ * 0 means orthogonal, and -1 means opposite direction.
9
+ *
10
+ * @throws Error if vectors have different lengths or are zero-length
11
+ */
12
+ export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
13
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CA0BzE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Vector math utilities for embeddings (Story 2.1)
3
+ */
4
+ /**
5
+ * Compute cosine similarity between two vectors.
6
+ *
7
+ * Returns a value between -1 and 1, where 1 means identical direction,
8
+ * 0 means orthogonal, and -1 means opposite direction.
9
+ *
10
+ * @throws Error if vectors have different lengths or are zero-length
11
+ */
12
+ export function cosineSimilarity(a, b) {
13
+ if (a.length !== b.length) {
14
+ throw new Error(`Vector dimension mismatch: ${a.length} vs ${b.length}`);
15
+ }
16
+ if (a.length === 0) {
17
+ throw new Error('Cannot compute cosine similarity of zero-length vectors');
18
+ }
19
+ let dotProduct = 0;
20
+ let normA = 0;
21
+ let normB = 0;
22
+ for (let i = 0; i < a.length; i++) {
23
+ const ai = a[i];
24
+ const bi = b[i];
25
+ dotProduct += ai * bi;
26
+ normA += ai * ai;
27
+ normB += bi * bi;
28
+ }
29
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
30
+ if (denominator === 0) {
31
+ return 0; // zero vector(s)
32
+ }
33
+ return dotProduct / denominator;
34
+ }
35
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/lib/embeddings/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,UAAU,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC,CAAC,iBAAiB;IAC7B,CAAC;IAED,OAAO,UAAU,GAAG,WAAW,CAAC;AAClC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * OpenAI embedding service (Story 2.1)
3
+ *
4
+ * Uses text-embedding-3-small (1536 dimensions) by default.
5
+ * Simple fetch-based client — no SDK dependency.
6
+ */
7
+ import type { EmbeddingService } from './index.js';
8
+ /**
9
+ * Create an OpenAI embedding service.
10
+ *
11
+ * @param apiKey - OpenAI API key (falls back to OPENAI_API_KEY env var)
12
+ * @param modelName - Model to use (default: text-embedding-3-small)
13
+ */
14
+ export declare function createOpenAIEmbeddingService(apiKey?: string, modelName?: string): EmbeddingService;
15
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkBnD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,CAiDlB"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * OpenAI embedding service (Story 2.1)
3
+ *
4
+ * Uses text-embedding-3-small (1536 dimensions) by default.
5
+ * Simple fetch-based client — no SDK dependency.
6
+ */
7
+ const DEFAULT_MODEL = 'text-embedding-3-small';
8
+ const DEFAULT_DIMENSIONS = 1536;
9
+ const OPENAI_EMBEDDINGS_URL = 'https://api.openai.com/v1/embeddings';
10
+ /**
11
+ * Create an OpenAI embedding service.
12
+ *
13
+ * @param apiKey - OpenAI API key (falls back to OPENAI_API_KEY env var)
14
+ * @param modelName - Model to use (default: text-embedding-3-small)
15
+ */
16
+ export function createOpenAIEmbeddingService(apiKey, modelName) {
17
+ const key = apiKey ?? process.env['OPENAI_API_KEY'];
18
+ const model = modelName ?? DEFAULT_MODEL;
19
+ if (!key) {
20
+ throw new Error('OpenAI embedding backend requires an API key. ' +
21
+ 'Set OPENAI_API_KEY environment variable or pass apiKey to config.');
22
+ }
23
+ async function callOpenAI(input) {
24
+ const response = await fetch(OPENAI_EMBEDDINGS_URL, {
25
+ method: 'POST',
26
+ headers: {
27
+ Authorization: `Bearer ${key}`,
28
+ 'Content-Type': 'application/json',
29
+ },
30
+ body: JSON.stringify({
31
+ input,
32
+ model,
33
+ }),
34
+ });
35
+ if (!response.ok) {
36
+ const errorBody = await response.text();
37
+ throw new Error(`OpenAI embeddings API error (${response.status}): ${errorBody}`);
38
+ }
39
+ const json = (await response.json());
40
+ // Sort by index to ensure order matches input
41
+ return json.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);
42
+ }
43
+ return {
44
+ dimensions: DEFAULT_DIMENSIONS,
45
+ modelName: model,
46
+ async embed(text) {
47
+ const [embedding] = await callOpenAI(text);
48
+ return new Float32Array(embedding);
49
+ },
50
+ async embedBatch(texts) {
51
+ if (texts.length === 0)
52
+ return [];
53
+ const embeddings = await callOpenAI(texts);
54
+ return embeddings.map((e) => new Float32Array(e));
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/lib/embeddings/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,qBAAqB,GAAG,sCAAsC,CAAC;AAcrE;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAAe,EACf,SAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,SAAS,IAAI,aAAa,CAAC;IAEzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gDAAgD;YAC9C,mEAAmE,CACtE,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,KAAwB;QAChD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qBAAqB,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,GAAG,EAAE;gBAC9B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,KAAK;aACN,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,8CAA8C;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO;QACL,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,KAAK;QAEhB,KAAK,CAAC,KAAK,CAAC,IAAY;YACtB,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,IAAI,YAAY,CAAC,SAAU,CAAC,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,KAAe;YAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Event & Session Summarizer (Story 2.3)
3
+ *
4
+ * Produces concise text summaries suitable for embedding.
5
+ * - summarizeEvent(): returns embedding text for events worth embedding, or null to skip
6
+ * - summarizeSession(): produces a heuristic session summary
7
+ */
8
+ import type { AgentLensEvent, Session } from '@agentlensai/core';
9
+ /**
10
+ * Summarize a single event into text suitable for embedding.
11
+ * Returns null if the event should be skipped (not worth embedding).
12
+ */
13
+ export declare function summarizeEvent(event: AgentLensEvent): string | null;
14
+ export type SessionOutcome = 'success' | 'partial' | 'failure';
15
+ export interface SessionSummary {
16
+ summary: string;
17
+ topics: string[];
18
+ toolSequence: string[];
19
+ errorSummary: string;
20
+ outcome: SessionOutcome;
21
+ }
22
+ /**
23
+ * Produce a heuristic summary of a session from its metadata and events.
24
+ */
25
+ export declare function summarizeSession(session: Session, events: AgentLensEvent[]): SessionSummary;
26
+ //# sourceMappingURL=summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/summarizer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EAOR,MAAM,mBAAmB,CAAC;AAuB3B;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAuDnE;AAID,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,cAAc,EAAE,GACvB,cAAc,CAmGhB"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Event & Session Summarizer (Story 2.3)
3
+ *
4
+ * Produces concise text summaries suitable for embedding.
5
+ * - summarizeEvent(): returns embedding text for events worth embedding, or null to skip
6
+ * - summarizeSession(): produces a heuristic session summary
7
+ */
8
+ /**
9
+ * Truncate a string to `maxLen` characters, adding "…" if truncated.
10
+ */
11
+ function truncate(text, maxLen) {
12
+ if (text.length <= maxLen)
13
+ return text;
14
+ return text.slice(0, maxLen) + '…';
15
+ }
16
+ /**
17
+ * Safely extract a string from an unknown value, with fallback.
18
+ */
19
+ function safeString(value, fallback = '') {
20
+ if (typeof value === 'string')
21
+ return value;
22
+ if (value == null)
23
+ return fallback;
24
+ try {
25
+ return JSON.stringify(value);
26
+ }
27
+ catch {
28
+ return fallback;
29
+ }
30
+ }
31
+ /**
32
+ * Summarize a single event into text suitable for embedding.
33
+ * Returns null if the event should be skipped (not worth embedding).
34
+ */
35
+ export function summarizeEvent(event) {
36
+ const payload = event.payload;
37
+ switch (event.eventType) {
38
+ case 'tool_error': {
39
+ const p = payload;
40
+ const toolName = safeString(p.toolName, 'unknown');
41
+ const error = safeString(p.error, 'unknown error');
42
+ return `tool_error: ${toolName} - ${truncate(error, 300)}`;
43
+ }
44
+ case 'tool_call': {
45
+ const p = payload;
46
+ const toolName = safeString(p.toolName, 'unknown');
47
+ const args = truncate(safeString(p.arguments, '{}'), 200);
48
+ return `tool_call: ${toolName}(${args})`;
49
+ }
50
+ case 'llm_call': {
51
+ const p = payload;
52
+ const model = safeString(p.model, 'unknown');
53
+ // Find the first user message
54
+ let userMsg = '';
55
+ if (Array.isArray(p.messages)) {
56
+ const userMessage = p.messages.find((m) => m.role === 'user');
57
+ if (userMessage) {
58
+ const content = userMessage.content;
59
+ if (typeof content === 'string') {
60
+ userMsg = content;
61
+ }
62
+ else if (Array.isArray(content)) {
63
+ const textPart = content.find((c) => c.type === 'text');
64
+ userMsg = textPart?.text ?? '';
65
+ }
66
+ }
67
+ }
68
+ return `llm_call: ${model} - ${truncate(userMsg, 200)}`;
69
+ }
70
+ case 'llm_response': {
71
+ const p = payload;
72
+ const model = safeString(p.model, 'unknown');
73
+ const completion = safeString(p.completion, '');
74
+ return `llm_response: ${model} - ${truncate(completion, 200)}`;
75
+ }
76
+ default: {
77
+ // Embed events with error or critical severity regardless of type
78
+ if (event.severity === 'error' || event.severity === 'critical') {
79
+ const summary = truncate(safeString(payload, '{}'), 300);
80
+ return `${event.eventType}: ${summary}`;
81
+ }
82
+ // Skip everything else
83
+ return null;
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * Produce a heuristic summary of a session from its metadata and events.
89
+ */
90
+ export function summarizeSession(session, events) {
91
+ // Collect tool names in order
92
+ const toolSequence = [];
93
+ const toolNames = new Set();
94
+ const errorMessages = [];
95
+ let errorCount = 0;
96
+ for (const event of events) {
97
+ const payload = event.payload;
98
+ if (event.eventType === 'tool_call' ||
99
+ event.eventType === 'tool_response' ||
100
+ event.eventType === 'tool_error') {
101
+ const toolName = safeString(payload.toolName, 'unknown');
102
+ if (event.eventType === 'tool_call') {
103
+ toolSequence.push(toolName);
104
+ }
105
+ toolNames.add(toolName);
106
+ }
107
+ if (event.eventType === 'tool_error') {
108
+ errorCount++;
109
+ errorMessages.push(safeString(payload.error, 'unknown error'));
110
+ }
111
+ if (event.severity === 'error' || event.severity === 'critical') {
112
+ if (event.eventType !== 'tool_error') {
113
+ errorCount++;
114
+ errorMessages.push(`${event.eventType}: ${truncate(safeString(payload, ''), 100)}`);
115
+ }
116
+ }
117
+ }
118
+ // Calculate duration
119
+ let duration = 'unknown duration';
120
+ if (session.startedAt) {
121
+ const start = new Date(session.startedAt).getTime();
122
+ const end = session.endedAt
123
+ ? new Date(session.endedAt).getTime()
124
+ : Date.now();
125
+ const diffMs = end - start;
126
+ if (diffMs < 1000) {
127
+ duration = `${diffMs}ms`;
128
+ }
129
+ else if (diffMs < 60_000) {
130
+ duration = `${Math.round(diffMs / 1000)}s`;
131
+ }
132
+ else {
133
+ duration = `${Math.round(diffMs / 60_000)}m`;
134
+ }
135
+ }
136
+ // Build summary text
137
+ const agentName = session.agentName ?? session.agentId;
138
+ const toolList = toolNames.size > 0 ? Array.from(toolNames).join(', ') : 'none';
139
+ const cost = session.totalCostUsd > 0 ? ` Cost: $${session.totalCostUsd.toFixed(4)}.` : '';
140
+ const summary = `Agent ${agentName} ran for ${duration}. Used tools: ${toolList}. ${errorCount} errors.${cost}`;
141
+ // Topics: tool names, event types, tags
142
+ const eventTypes = new Set(events.map((e) => e.eventType));
143
+ const topics = [
144
+ ...Array.from(toolNames),
145
+ ...Array.from(eventTypes),
146
+ ...session.tags,
147
+ ];
148
+ // Error summary
149
+ const errorSummary = errorMessages.length > 0
150
+ ? truncate(errorMessages.join('; '), 500)
151
+ : '';
152
+ // Determine outcome
153
+ let outcome;
154
+ const totalEvents = events.length;
155
+ const lastEvent = events.length > 0 ? events[events.length - 1] : null;
156
+ const endedWithError = lastEvent?.eventType === 'tool_error' ||
157
+ lastEvent?.severity === 'error' ||
158
+ lastEvent?.severity === 'critical' ||
159
+ (lastEvent?.eventType === 'session_ended' &&
160
+ lastEvent.payload?.reason === 'error');
161
+ if (errorCount === 0) {
162
+ outcome = 'success';
163
+ }
164
+ else if (totalEvents > 0 && errorCount / totalEvents > 0.5) {
165
+ outcome = 'failure';
166
+ }
167
+ else if (endedWithError) {
168
+ outcome = 'failure';
169
+ }
170
+ else {
171
+ outcome = 'partial';
172
+ }
173
+ return {
174
+ summary,
175
+ topics,
176
+ toolSequence,
177
+ errorSummary,
178
+ outcome,
179
+ };
180
+ }
181
+ //# sourceMappingURL=summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../../src/lib/embeddings/summarizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Embedding service types (Story 2.1)
3
+ */
4
+ /** A typed embedding vector */
5
+ export type EmbeddingVector = Float32Array;
6
+ /** Supported embedding backends */
7
+ export type EmbeddingBackend = 'local' | 'openai';
8
+ /** Configuration for the embedding service */
9
+ export interface EmbeddingServiceConfig {
10
+ /** Backend to use: 'local' (Xenova/transformers.js) or 'openai' */
11
+ backend: EmbeddingBackend;
12
+ /** Model name override (default depends on backend) */
13
+ modelName?: string;
14
+ /** OpenAI API key (required for 'openai' backend) */
15
+ openaiApiKey?: string;
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAE3C,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD,8CAA8C;AAC9C,MAAM,WAAW,sBAAsB;IACrC,mEAAmE;IACnE,OAAO,EAAE,gBAAgB,CAAC;IAC1B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Embedding service types (Story 2.1)
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/embeddings/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Background Embedding Worker (Story 2.3)
3
+ *
4
+ * Processes an in-memory queue of records to embed. Fail-safe — never crashes
5
+ * the server. If embedding service is not configured, silently skips all items.
6
+ */
7
+ import type { EmbeddingService } from './index.js';
8
+ import type { EmbeddingStore } from '../../db/embedding-store.js';
9
+ /** Item to be embedded */
10
+ export interface EmbeddingQueueItem {
11
+ tenantId: string;
12
+ sourceType: string;
13
+ sourceId: string;
14
+ textContent: string;
15
+ }
16
+ export declare class EmbeddingWorker {
17
+ private readonly embeddingService;
18
+ private readonly embeddingStore;
19
+ private queue;
20
+ private processedCount;
21
+ private intervalHandle;
22
+ private readonly maxQueueSize;
23
+ constructor(embeddingService: EmbeddingService | null, embeddingStore: EmbeddingStore | null, opts?: {
24
+ maxQueueSize?: number;
25
+ });
26
+ /**
27
+ * Add an item to the embedding queue. Synchronous — never throws.
28
+ * If the queue is full, drops the oldest items to make room.
29
+ */
30
+ enqueue(item: EmbeddingQueueItem): void;
31
+ /**
32
+ * Start the background processing loop (setInterval-based, every 1 second).
33
+ */
34
+ start(): void;
35
+ /**
36
+ * Stop the processing loop and flush remaining items.
37
+ */
38
+ stop(): Promise<void>;
39
+ /**
40
+ * Process all queued items immediately.
41
+ */
42
+ flush(): Promise<void>;
43
+ /**
44
+ * Return current queue length.
45
+ */
46
+ getQueueSize(): number;
47
+ /**
48
+ * Return total number of items successfully processed.
49
+ */
50
+ getProcessedCount(): number;
51
+ /**
52
+ * Process up to BATCH_SIZE items from the queue.
53
+ */
54
+ private processBatch;
55
+ }
56
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/lib/embeddings/worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,0BAA0B;AAC1B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAWD,qBAAa,eAAe;IAOxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAPjC,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,EACzC,cAAc,EAAE,cAAc,GAAG,IAAI,EACtD,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAKlC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAavC;;OAEG;IACH,KAAK,IAAI,IAAI;IAcb;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;YACW,YAAY;CA4B3B"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Background Embedding Worker (Story 2.3)
3
+ *
4
+ * Processes an in-memory queue of records to embed. Fail-safe — never crashes
5
+ * the server. If embedding service is not configured, silently skips all items.
6
+ */
7
+ /** Default maximum queue size */
8
+ const DEFAULT_MAX_QUEUE_SIZE = 10_000;
9
+ /** Maximum items to process per tick */
10
+ const BATCH_SIZE = 32;
11
+ /** Processing interval in milliseconds */
12
+ const TICK_INTERVAL_MS = 1_000;
13
+ export class EmbeddingWorker {
14
+ embeddingService;
15
+ embeddingStore;
16
+ queue = [];
17
+ processedCount = 0;
18
+ intervalHandle = null;
19
+ maxQueueSize;
20
+ constructor(embeddingService, embeddingStore, opts) {
21
+ this.embeddingService = embeddingService;
22
+ this.embeddingStore = embeddingStore;
23
+ this.maxQueueSize = opts?.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE;
24
+ }
25
+ /**
26
+ * Add an item to the embedding queue. Synchronous — never throws.
27
+ * If the queue is full, drops the oldest items to make room.
28
+ */
29
+ enqueue(item) {
30
+ // Silently skip if service is not configured
31
+ if (!this.embeddingService || !this.embeddingStore)
32
+ return;
33
+ this.queue.push(item);
34
+ // Drop oldest on overflow
35
+ if (this.queue.length > this.maxQueueSize) {
36
+ const overflow = this.queue.length - this.maxQueueSize;
37
+ this.queue.splice(0, overflow);
38
+ }
39
+ }
40
+ /**
41
+ * Start the background processing loop (setInterval-based, every 1 second).
42
+ */
43
+ start() {
44
+ if (this.intervalHandle !== null)
45
+ return; // already running
46
+ if (!this.embeddingService || !this.embeddingStore)
47
+ return; // nothing to do
48
+ this.intervalHandle = setInterval(() => {
49
+ void this.processBatch();
50
+ }, TICK_INTERVAL_MS);
51
+ // Prevent the interval from keeping the process alive
52
+ if (typeof this.intervalHandle === 'object' && 'unref' in this.intervalHandle) {
53
+ this.intervalHandle.unref();
54
+ }
55
+ }
56
+ /**
57
+ * Stop the processing loop and flush remaining items.
58
+ */
59
+ async stop() {
60
+ if (this.intervalHandle !== null) {
61
+ clearInterval(this.intervalHandle);
62
+ this.intervalHandle = null;
63
+ }
64
+ // Flush remaining
65
+ await this.flush();
66
+ }
67
+ /**
68
+ * Process all queued items immediately.
69
+ */
70
+ async flush() {
71
+ while (this.queue.length > 0) {
72
+ await this.processBatch();
73
+ }
74
+ }
75
+ /**
76
+ * Return current queue length.
77
+ */
78
+ getQueueSize() {
79
+ return this.queue.length;
80
+ }
81
+ /**
82
+ * Return total number of items successfully processed.
83
+ */
84
+ getProcessedCount() {
85
+ return this.processedCount;
86
+ }
87
+ /**
88
+ * Process up to BATCH_SIZE items from the queue.
89
+ */
90
+ async processBatch() {
91
+ if (!this.embeddingService || !this.embeddingStore)
92
+ return;
93
+ if (this.queue.length === 0)
94
+ return;
95
+ const batch = this.queue.splice(0, BATCH_SIZE);
96
+ for (const item of batch) {
97
+ try {
98
+ const embedding = await this.embeddingService.embed(item.textContent);
99
+ await this.embeddingStore.store(item.tenantId, item.sourceType, item.sourceId, item.textContent, embedding, this.embeddingService.modelName, this.embeddingService.dimensions);
100
+ this.processedCount++;
101
+ }
102
+ catch (err) {
103
+ // Log and skip — never crash
104
+ console.error(`[EmbeddingWorker] Failed to embed item (${item.sourceType}/${item.sourceId}):`, err instanceof Error ? err.message : err);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/lib/embeddings/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * In-process EventBus for real-time notifications (Story 12.5, Epic 14 — Arch §11.1)
3
+ *
4
+ * Typed EventEmitter for decoupled communication between
5
+ * server components. Consumed by SSE endpoint (Epic 14) and Alert Engine (Epic 12).
6
+ */
7
+ import type { AgentLensEvent, AlertRule, AlertHistory, Session } from '@agentlensai/core';
8
+ export interface AlertTriggeredEvent {
9
+ type: 'alert_triggered';
10
+ rule: AlertRule;
11
+ history: AlertHistory;
12
+ timestamp: string;
13
+ }
14
+ export interface AlertResolvedEvent {
15
+ type: 'alert_resolved';
16
+ ruleId: string;
17
+ historyId: string;
18
+ timestamp: string;
19
+ }
20
+ /** New event ingested (Epic 14 — Story 14.1) */
21
+ export interface EventIngestedEvent {
22
+ type: 'event_ingested';
23
+ event: AgentLensEvent;
24
+ timestamp: string;
25
+ }
26
+ /** Session updated (Epic 14 — Story 14.1) */
27
+ export interface SessionUpdatedEvent {
28
+ type: 'session_updated';
29
+ session: Session;
30
+ timestamp: string;
31
+ }
32
+ export type BusEvent = AlertTriggeredEvent | AlertResolvedEvent | EventIngestedEvent | SessionUpdatedEvent;
33
+ /**
34
+ * Typed event bus for internal server communication.
35
+ * Wraps Node.js EventEmitter with type safety.
36
+ */
37
+ declare class EventBus {
38
+ private emitter;
39
+ constructor();
40
+ emit(event: BusEvent): void;
41
+ on(type: BusEvent['type'] | '*', listener: (event: BusEvent) => void): void;
42
+ off(type: BusEvent['type'] | '*', listener: (event: BusEvent) => void): void;
43
+ removeAllListeners(): void;
44
+ }
45
+ /** Singleton event bus instance */
46
+ export declare const eventBus: EventBus;
47
+ export {};
48
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/lib/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAI1F,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,QAAQ,GAChB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB;;;GAGG;AACH,cAAM,QAAQ;IACZ,OAAO,CAAC,OAAO,CAAsB;;IAOrC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAK3B,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI3E,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI5E,kBAAkB,IAAI,IAAI;CAG3B;AAED,mCAAmC;AACnC,eAAO,MAAM,QAAQ,UAAiB,CAAC"}