siclaw 0.1.0 → 0.1.2

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 (270) hide show
  1. package/README.md +75 -114
  2. package/dist/agentbox/gateway-client.d.ts +2 -1
  3. package/dist/agentbox/gateway-client.js +6 -2
  4. package/dist/agentbox/gateway-client.js.map +1 -1
  5. package/dist/agentbox/http-server.js +184 -19
  6. package/dist/agentbox/http-server.js.map +1 -1
  7. package/dist/agentbox/resource-handlers.d.ts +1 -0
  8. package/dist/agentbox/resource-handlers.js +23 -23
  9. package/dist/agentbox/resource-handlers.js.map +1 -1
  10. package/dist/agentbox/session.js +85 -5
  11. package/dist/agentbox/session.js.map +1 -1
  12. package/dist/agentbox-main.d.ts +2 -1
  13. package/dist/agentbox-main.js +65 -18
  14. package/dist/agentbox-main.js.map +1 -1
  15. package/dist/cli-credentials.d.ts +1 -0
  16. package/dist/cli-credentials.js +109 -0
  17. package/dist/cli-credentials.js.map +1 -0
  18. package/dist/cli-first-run.d.ts +11 -0
  19. package/dist/cli-first-run.js +99 -0
  20. package/dist/cli-first-run.js.map +1 -0
  21. package/dist/cli-main.js +33 -11
  22. package/dist/cli-main.js.map +1 -1
  23. package/dist/cli-setup.d.ts +5 -11
  24. package/dist/cli-setup.js +12 -225
  25. package/dist/cli-setup.js.map +1 -1
  26. package/dist/core/agent-factory.d.ts +4 -0
  27. package/dist/core/agent-factory.js +102 -151
  28. package/dist/core/agent-factory.js.map +1 -1
  29. package/dist/core/config.d.ts +10 -3
  30. package/dist/core/config.js +11 -95
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/extensions/deep-investigation.d.ts +2 -1
  33. package/dist/core/extensions/deep-investigation.js +144 -24
  34. package/dist/core/extensions/deep-investigation.js.map +1 -1
  35. package/dist/core/extensions/setup.d.ts +8 -0
  36. package/dist/core/extensions/setup.js +669 -0
  37. package/dist/core/extensions/setup.js.map +1 -0
  38. package/dist/core/llm-proxy.js +7 -3
  39. package/dist/core/llm-proxy.js.map +1 -1
  40. package/dist/core/mcp-client.d.ts +0 -10
  41. package/dist/core/mcp-client.js +0 -65
  42. package/dist/core/mcp-client.js.map +1 -1
  43. package/dist/core/prompt.d.ts +1 -1
  44. package/dist/core/prompt.js +42 -5
  45. package/dist/core/prompt.js.map +1 -1
  46. package/dist/core/provider-presets.d.ts +14 -0
  47. package/dist/core/provider-presets.js +81 -0
  48. package/dist/core/provider-presets.js.map +1 -0
  49. package/dist/cron/cron-coordinator.d.ts +2 -0
  50. package/dist/cron/cron-coordinator.js +46 -14
  51. package/dist/cron/cron-coordinator.js.map +1 -1
  52. package/dist/cron/cron-executor.js +33 -8
  53. package/dist/cron/cron-executor.js.map +1 -1
  54. package/dist/cron/cron-scheduler.d.ts +1 -1
  55. package/dist/cron/gateway-client.d.ts +5 -0
  56. package/dist/cron/gateway-client.js +43 -8
  57. package/dist/cron/gateway-client.js.map +1 -1
  58. package/dist/cron-main.js +39 -9
  59. package/dist/cron-main.js.map +1 -1
  60. package/dist/gateway/agentbox/client.d.ts +11 -0
  61. package/dist/gateway/agentbox/client.js +18 -0
  62. package/dist/gateway/agentbox/client.js.map +1 -1
  63. package/dist/gateway/agentbox/k8s-spawner.d.ts +11 -2
  64. package/dist/gateway/agentbox/k8s-spawner.js +95 -52
  65. package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
  66. package/dist/gateway/agentbox/local-spawner.d.ts +1 -1
  67. package/dist/gateway/agentbox/local-spawner.js +4 -2
  68. package/dist/gateway/agentbox/local-spawner.js.map +1 -1
  69. package/dist/gateway/agentbox/manager.d.ts +0 -10
  70. package/dist/gateway/agentbox/manager.js +11 -30
  71. package/dist/gateway/agentbox/manager.js.map +1 -1
  72. package/dist/gateway/agentbox/types.d.ts +6 -4
  73. package/dist/gateway/cron/cron-service.d.ts +49 -0
  74. package/dist/gateway/cron/cron-service.js +259 -0
  75. package/dist/gateway/cron/cron-service.js.map +1 -0
  76. package/dist/gateway/db/init-schema.js +44 -0
  77. package/dist/gateway/db/init-schema.js.map +1 -1
  78. package/dist/gateway/db/migrate-sqlite.js +73 -4
  79. package/dist/gateway/db/migrate-sqlite.js.map +1 -1
  80. package/dist/gateway/db/repositories/chat-repo.d.ts +56 -2
  81. package/dist/gateway/db/repositories/chat-repo.js +132 -2
  82. package/dist/gateway/db/repositories/chat-repo.js.map +1 -1
  83. package/dist/gateway/db/repositories/config-repo.d.ts +31 -2
  84. package/dist/gateway/db/repositories/config-repo.js +57 -7
  85. package/dist/gateway/db/repositories/config-repo.js.map +1 -1
  86. package/dist/gateway/db/repositories/env-repo.d.ts +14 -0
  87. package/dist/gateway/db/repositories/env-repo.js +15 -2
  88. package/dist/gateway/db/repositories/env-repo.js.map +1 -1
  89. package/dist/gateway/db/repositories/model-config-repo.d.ts +1 -1
  90. package/dist/gateway/db/repositories/model-config-repo.js +26 -12
  91. package/dist/gateway/db/repositories/model-config-repo.js.map +1 -1
  92. package/dist/gateway/db/repositories/skill-repo.d.ts +0 -5
  93. package/dist/gateway/db/repositories/skill-review-repo.d.ts +1 -0
  94. package/dist/gateway/db/repositories/skill-review-repo.js +4 -1
  95. package/dist/gateway/db/repositories/skill-review-repo.js.map +1 -1
  96. package/dist/gateway/db/repositories/skill-version-repo.js +0 -1
  97. package/dist/gateway/db/repositories/skill-version-repo.js.map +1 -1
  98. package/dist/gateway/db/repositories/system-config-repo.d.ts +1 -1
  99. package/dist/gateway/db/repositories/system-config-repo.js +2 -1
  100. package/dist/gateway/db/repositories/system-config-repo.js.map +1 -1
  101. package/dist/gateway/db/repositories/user-env-config-repo.d.ts +13 -0
  102. package/dist/gateway/db/repositories/user-env-config-repo.js +11 -0
  103. package/dist/gateway/db/repositories/user-env-config-repo.js.map +1 -1
  104. package/dist/gateway/db/repositories/workspace-repo.d.ts +3 -2
  105. package/dist/gateway/db/repositories/workspace-repo.js +6 -2
  106. package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
  107. package/dist/gateway/db/schema-mysql.d.ts +473 -51
  108. package/dist/gateway/db/schema-mysql.js +35 -4
  109. package/dist/gateway/db/schema-mysql.js.map +1 -1
  110. package/dist/gateway/db/schema-sqlite.d.ts +522 -57
  111. package/dist/gateway/db/schema-sqlite.js +38 -6
  112. package/dist/gateway/db/schema-sqlite.js.map +1 -1
  113. package/dist/gateway/db/schema.d.ts +471 -51
  114. package/dist/gateway/db/schema.js +1 -1
  115. package/dist/gateway/db/schema.js.map +1 -1
  116. package/dist/gateway/metrics-aggregator.d.ts +65 -0
  117. package/dist/gateway/metrics-aggregator.js +244 -0
  118. package/dist/gateway/metrics-aggregator.js.map +1 -0
  119. package/dist/gateway/plugins/channel-bridge.d.ts +4 -1
  120. package/dist/gateway/plugins/channel-bridge.js +78 -86
  121. package/dist/gateway/plugins/channel-bridge.js.map +1 -1
  122. package/dist/gateway/rpc-methods.d.ts +4 -2
  123. package/dist/gateway/rpc-methods.js +962 -163
  124. package/dist/gateway/rpc-methods.js.map +1 -1
  125. package/dist/gateway/security/cert-manager.d.ts +2 -2
  126. package/dist/gateway/security/cert-manager.js +4 -2
  127. package/dist/gateway/security/cert-manager.js.map +1 -1
  128. package/dist/gateway/server.d.ts +4 -8
  129. package/dist/gateway/server.js +297 -261
  130. package/dist/gateway/server.js.map +1 -1
  131. package/dist/gateway/skills/file-writer.js +17 -11
  132. package/dist/gateway/skills/file-writer.js.map +1 -1
  133. package/dist/gateway/skills/script-evaluator.js +12 -9
  134. package/dist/gateway/skills/script-evaluator.js.map +1 -1
  135. package/dist/gateway/web/dist/assets/index-0p17ZeTP.js +740 -0
  136. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js +741 -0
  137. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js.map +1 -0
  138. package/dist/gateway/web/dist/assets/index-CAmSY91d.js +675 -0
  139. package/dist/gateway/web/dist/assets/index-DMFEh8Pp.css +1 -0
  140. package/dist/gateway/web/dist/assets/index-DyowBCEj.css +1 -0
  141. package/dist/gateway/web/dist/assets/index-PDK5JJDO.css +1 -0
  142. package/dist/gateway/web/dist/index.html +2 -2
  143. package/dist/gateway-main.js +27 -10
  144. package/dist/gateway-main.js.map +1 -1
  145. package/dist/memory/embeddings.js +5 -4
  146. package/dist/memory/embeddings.js.map +1 -1
  147. package/dist/memory/indexer.d.ts +23 -3
  148. package/dist/memory/indexer.js +235 -23
  149. package/dist/memory/indexer.js.map +1 -1
  150. package/dist/memory/schema.js +15 -1
  151. package/dist/memory/schema.js.map +1 -1
  152. package/dist/memory/types.d.ts +18 -0
  153. package/dist/memory/types.js +6 -1
  154. package/dist/memory/types.js.map +1 -1
  155. package/dist/shared/detect-language.d.ts +12 -0
  156. package/dist/shared/detect-language.js +78 -0
  157. package/dist/shared/detect-language.js.map +1 -0
  158. package/dist/shared/diagnostic-events.d.ts +70 -0
  159. package/dist/shared/diagnostic-events.js +38 -0
  160. package/dist/shared/diagnostic-events.js.map +1 -0
  161. package/dist/shared/local-collector.d.ts +56 -0
  162. package/dist/shared/local-collector.js +284 -0
  163. package/dist/shared/local-collector.js.map +1 -0
  164. package/dist/shared/metrics-types.d.ts +64 -0
  165. package/dist/shared/metrics-types.js +25 -0
  166. package/dist/shared/metrics-types.js.map +1 -0
  167. package/dist/shared/metrics.d.ts +19 -0
  168. package/dist/shared/metrics.js +185 -0
  169. package/dist/shared/metrics.js.map +1 -0
  170. package/dist/shared/path-utils.d.ts +15 -0
  171. package/dist/shared/path-utils.js +23 -0
  172. package/dist/shared/path-utils.js.map +1 -0
  173. package/dist/shared/retry.d.ts +35 -0
  174. package/dist/shared/retry.js +61 -0
  175. package/dist/shared/retry.js.map +1 -0
  176. package/dist/tools/command-sets.d.ts +18 -2
  177. package/dist/tools/command-sets.js +207 -32
  178. package/dist/tools/command-sets.js.map +1 -1
  179. package/dist/tools/command-validator.d.ts +56 -0
  180. package/dist/tools/command-validator.js +357 -0
  181. package/dist/tools/command-validator.js.map +1 -0
  182. package/dist/tools/create-skill.js +26 -1
  183. package/dist/tools/create-skill.js.map +1 -1
  184. package/dist/tools/credential-list.js +1 -23
  185. package/dist/tools/credential-list.js.map +1 -1
  186. package/dist/tools/credential-manager.d.ts +98 -0
  187. package/dist/tools/credential-manager.js +313 -0
  188. package/dist/tools/credential-manager.js.map +1 -0
  189. package/dist/tools/deep-search/engine.js +184 -127
  190. package/dist/tools/deep-search/engine.js.map +1 -1
  191. package/dist/tools/deep-search/prompts.d.ts +10 -2
  192. package/dist/tools/deep-search/prompts.js +37 -36
  193. package/dist/tools/deep-search/prompts.js.map +1 -1
  194. package/dist/tools/deep-search/schemas.d.ts +87 -0
  195. package/dist/tools/deep-search/schemas.js +85 -0
  196. package/dist/tools/deep-search/schemas.js.map +1 -0
  197. package/dist/tools/deep-search/sub-agent.d.ts +21 -0
  198. package/dist/tools/deep-search/sub-agent.js +153 -4
  199. package/dist/tools/deep-search/sub-agent.js.map +1 -1
  200. package/dist/tools/deep-search/tool.js +1 -0
  201. package/dist/tools/deep-search/tool.js.map +1 -1
  202. package/dist/tools/deep-search/types.d.ts +2 -0
  203. package/dist/tools/deep-search/types.js.map +1 -1
  204. package/dist/tools/dp-tools.js +29 -5
  205. package/dist/tools/dp-tools.js.map +1 -1
  206. package/dist/tools/exec-utils.d.ts +85 -0
  207. package/dist/tools/exec-utils.js +294 -0
  208. package/dist/tools/exec-utils.js.map +1 -0
  209. package/dist/tools/fork-skill.js +14 -2
  210. package/dist/tools/fork-skill.js.map +1 -1
  211. package/dist/tools/investigation-feedback.d.ts +3 -0
  212. package/dist/tools/investigation-feedback.js +71 -0
  213. package/dist/tools/investigation-feedback.js.map +1 -0
  214. package/dist/tools/manage-schedule.js +16 -6
  215. package/dist/tools/manage-schedule.js.map +1 -1
  216. package/dist/tools/netns-script.js +27 -281
  217. package/dist/tools/netns-script.js.map +1 -1
  218. package/dist/tools/node-exec.d.ts +2 -14
  219. package/dist/tools/node-exec.js +18 -225
  220. package/dist/tools/node-exec.js.map +1 -1
  221. package/dist/tools/node-script.js +14 -168
  222. package/dist/tools/node-script.js.map +1 -1
  223. package/dist/tools/pod-exec.d.ts +1 -1
  224. package/dist/tools/pod-exec.js +10 -26
  225. package/dist/tools/pod-exec.js.map +1 -1
  226. package/dist/tools/pod-nsenter-exec.js +21 -225
  227. package/dist/tools/pod-nsenter-exec.js.map +1 -1
  228. package/dist/tools/pod-script.js +10 -19
  229. package/dist/tools/pod-script.js.map +1 -1
  230. package/dist/tools/restricted-bash.d.ts +1 -17
  231. package/dist/tools/restricted-bash.js +38 -252
  232. package/dist/tools/restricted-bash.js.map +1 -1
  233. package/dist/tools/run-skill.d.ts +3 -1
  234. package/dist/tools/run-skill.js +21 -1
  235. package/dist/tools/run-skill.js.map +1 -1
  236. package/dist/tools/script-resolver.d.ts +3 -1
  237. package/dist/tools/script-resolver.js +74 -30
  238. package/dist/tools/script-resolver.js.map +1 -1
  239. package/dist/tools/update-skill.js +17 -6
  240. package/dist/tools/update-skill.js.map +1 -1
  241. package/package.json +8 -6
  242. package/siclaw.mjs +10 -1
  243. package/skills/core/cluster-events/SKILL.md +1 -1
  244. package/skills/core/deep-investigation/SKILL.md +11 -0
  245. package/skills/core/deployment-rollout-debug/SKILL.md +1 -1
  246. package/skills/core/dns-debug/SKILL.md +1 -0
  247. package/skills/core/meta.json +12 -1
  248. package/skills/core/networkpolicy-debug/SKILL.md +332 -0
  249. package/skills/core/node-logs/scripts/get-node-logs.sh +19 -9
  250. package/skills/core/pod-pending-debug/SKILL.md +1 -0
  251. package/skills/core/quota-debug/SKILL.md +203 -0
  252. package/skills/core/service-debug/SKILL.md +1 -0
  253. package/skills/core/statefulset-debug/SKILL.md +280 -0
  254. package/skills/core/volcano-diagnose-pod/SKILL.md +196 -0
  255. package/skills/core/volcano-diagnose-pod/scripts/diagnose-pod.sh +175 -0
  256. package/skills/core/volcano-gang-scheduling/SKILL.md +299 -0
  257. package/skills/core/volcano-job-diagnose/SKILL.md +319 -0
  258. package/skills/core/volcano-job-diagnose/scripts/diagnose-job.sh +253 -0
  259. package/skills/core/volcano-node-resources/SKILL.md +334 -0
  260. package/skills/core/volcano-node-resources/scripts/get-node-resources.sh +281 -0
  261. package/skills/core/volcano-queue-diagnose/SKILL.md +294 -0
  262. package/skills/core/volcano-queue-diagnose/scripts/diagnose-queue.sh +283 -0
  263. package/skills/core/volcano-resource-insufficient/SKILL.md +315 -0
  264. package/skills/core/volcano-scheduler-config/SKILL.md +371 -0
  265. package/skills/core/volcano-scheduler-config/scripts/get-scheduler-config.sh +297 -0
  266. package/skills/core/volcano-scheduler-logs/SKILL.md +241 -0
  267. package/skills/core/volcano-scheduler-logs/scripts/get-scheduler-logs.sh +159 -0
  268. package/skills/platform/create-skill/SKILL.md +35 -3
  269. package/skills/platform/manage-skill/SKILL.md +9 -2
  270. package/skills/platform/update-skill/SKILL.md +17 -6
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Deterministic language detection based on Unicode script analysis.
3
+ *
4
+ * Returns an ISO-ish language label (e.g. "English", "Japanese", "Chinese", "Korean").
5
+ * This is intentionally simple — it detects the *dominant script*, not NLP-level language ID.
6
+ * Good enough to drive "respond in X" instructions without relying on model behavior.
7
+ */
8
+ // Unicode ranges for script detection
9
+ const HIRAGANA = /[\u3040-\u309F]/;
10
+ const KATAKANA = /[\u30A0-\u30FF]/;
11
+ const CJK = /[\u4E00-\u9FFF\u3400-\u4DBF]/;
12
+ const HANGUL = /[\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F]/;
13
+ const CYRILLIC = /[\u0400-\u04FF]/;
14
+ const ARABIC = /[\u0600-\u06FF\u0750-\u077F]/;
15
+ const THAI = /[\u0E00-\u0E7F]/;
16
+ const DEVANAGARI = /[\u0900-\u097F]/;
17
+ /**
18
+ * Detect the dominant language/script of a text string.
19
+ * Strips common technical noise (URLs, code blocks, kubectl output) before analysis.
20
+ */
21
+ export function detectLanguage(text) {
22
+ // Strip noise that shouldn't influence detection:
23
+ // URLs, inline code, code blocks, kubectl-style paths (pod/xxx, ns/xxx)
24
+ const cleaned = text
25
+ .replace(/https?:\/\/\S+/g, "")
26
+ .replace(/`[^`]*`/g, "")
27
+ .replace(/```[\s\S]*?```/g, "")
28
+ .replace(/\b[\w-]+\/[\w.-]+/g, "") // resource paths
29
+ .replace(/--[\w-]+(=\S+)?/g, "") // CLI flags
30
+ .trim();
31
+ if (!cleaned)
32
+ return "English";
33
+ // Count script characters (ignoring ASCII, punctuation, digits, whitespace)
34
+ let ja = 0, cjk = 0, ko = 0, cyrillic = 0, arabic = 0, thai = 0, devanagari = 0;
35
+ for (const ch of cleaned) {
36
+ if (HIRAGANA.test(ch) || KATAKANA.test(ch))
37
+ ja++;
38
+ else if (HANGUL.test(ch))
39
+ ko++;
40
+ else if (CJK.test(ch))
41
+ cjk++;
42
+ else if (CYRILLIC.test(ch))
43
+ cyrillic++;
44
+ else if (ARABIC.test(ch))
45
+ arabic++;
46
+ else if (THAI.test(ch))
47
+ thai++;
48
+ else if (DEVANAGARI.test(ch))
49
+ devanagari++;
50
+ }
51
+ // Total non-ASCII script characters
52
+ const total = ja + cjk + ko + cyrillic + arabic + thai + devanagari;
53
+ if (total === 0)
54
+ return "English";
55
+ // Require at least 2 script characters to avoid false positives from
56
+ // stray technical terms embedded in English sentences. Single characters
57
+ // are too noisy for an SRE tool where mixed-language input is common.
58
+ const MIN_CHARS = 2;
59
+ // Japanese: presence of kana is definitive (Chinese doesn't use kana)
60
+ if (ja >= MIN_CHARS)
61
+ return "Japanese";
62
+ if (ko >= MIN_CHARS)
63
+ return "Korean";
64
+ // CJK alone needs slightly higher bar — could be a single term embedded in English
65
+ if (cjk >= MIN_CHARS)
66
+ return "Chinese";
67
+ if (cyrillic >= MIN_CHARS)
68
+ return "Russian";
69
+ if (arabic >= MIN_CHARS)
70
+ return "Arabic";
71
+ if (thai >= MIN_CHARS)
72
+ return "Thai";
73
+ if (devanagari >= MIN_CHARS)
74
+ return "Hindi";
75
+ // Below threshold — treat as English with incidental non-Latin characters
76
+ return "English";
77
+ }
78
+ //# sourceMappingURL=detect-language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-language.js","sourceRoot":"","sources":["../../src/shared/detect-language.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sCAAsC;AACtC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AACnC,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AACnC,MAAM,GAAG,GAAG,8BAA8B,CAAC;AAC3C,MAAM,MAAM,GAAG,2CAA2C,CAAC;AAC3D,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AACnC,MAAM,MAAM,GAAG,8BAA8B,CAAC;AAC9C,MAAM,IAAI,GAAG,iBAAiB,CAAC;AAC/B,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,kDAAkD;IAClD,wEAAwE;IACxE,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,iBAAiB;SACnD,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAG,YAAY;SAC9C,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,4EAA4E;IAC5E,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;IAEhF,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,EAAE,EAAE,CAAC;aAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,EAAE,EAAE,CAAC;aAC1B,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,GAAG,EAAE,CAAC;aACxB,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,QAAQ,EAAE,CAAC;aAClC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,EAAE,CAAC;aAC9B,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,IAAI,EAAE,CAAC;aAC1B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,oCAAoC;IACpC,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC;IACpE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAElC,qEAAqE;IACrE,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,SAAS,GAAG,CAAC,CAAC;IAEpB,sEAAsE;IACtE,IAAI,EAAE,IAAI,SAAS;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,EAAE,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAC;IACrC,mFAAmF;IACnF,IAAI,GAAG,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,QAAQ,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,IAAI,IAAI,SAAS;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,UAAU,IAAI,SAAS;QAAE,OAAO,OAAO,CAAC;IAE5C,0EAA0E;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Diagnostic event bus — lightweight decoupling layer for observability.
3
+ *
4
+ * Business code emits events via emitDiagnostic(). Subscribers (e.g. metrics.ts)
5
+ * consume them without the emitter knowing or caring about prom-client / OTel / logs.
6
+ *
7
+ * Design choices:
8
+ * - Plain callback array (not EventEmitter) — try-catch protects callers from subscriber errors
9
+ * - Zero external dependencies — safe to import from any module
10
+ * - Synchronous dispatch — O(1) per subscriber, no event loop overhead
11
+ */
12
+ import type { BrainSessionStats, BrainModelInfo } from "../core/brain-session.js";
13
+ export type DiagnosticEvent = {
14
+ type: "prompt_complete";
15
+ sessionId: string;
16
+ prev: BrainSessionStats;
17
+ curr: BrainSessionStats;
18
+ model: BrainModelInfo | undefined;
19
+ durationMs: number;
20
+ outcome: "completed" | "error";
21
+ userId?: string;
22
+ } | {
23
+ type: "session_created";
24
+ sessionId: string;
25
+ } | {
26
+ type: "session_released";
27
+ sessionId: string;
28
+ stats: BrainSessionStats;
29
+ userId?: string;
30
+ model?: BrainModelInfo;
31
+ createdAt: number;
32
+ } | {
33
+ type: "tool_call";
34
+ toolName: string;
35
+ outcome: "success" | "error";
36
+ durationMs: number;
37
+ } | {
38
+ type: "ws_connected";
39
+ } | {
40
+ type: "ws_disconnected";
41
+ } | {
42
+ type: "context_usage";
43
+ provider: string;
44
+ model: string;
45
+ tokensUsed: number;
46
+ tokensLimit: number;
47
+ } | {
48
+ type: "skill_call";
49
+ skillName: string;
50
+ scriptName: string;
51
+ scope: "builtin" | "team" | "personal";
52
+ outcome: "success" | "error";
53
+ durationMs: number;
54
+ sessionId?: string;
55
+ } | {
56
+ type: "session_stuck";
57
+ sessionId: string;
58
+ idleMs: number;
59
+ };
60
+ type Listener = (event: DiagnosticEvent) => void;
61
+ /**
62
+ * Emit a diagnostic event. All registered listeners are called synchronously.
63
+ * Listener exceptions are caught and logged — never propagated to the caller.
64
+ */
65
+ export declare function emitDiagnostic(event: DiagnosticEvent): void;
66
+ /**
67
+ * Subscribe to diagnostic events. Returns an unsubscribe function.
68
+ */
69
+ export declare function onDiagnostic(fn: Listener): () => void;
70
+ export {};
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Diagnostic event bus — lightweight decoupling layer for observability.
3
+ *
4
+ * Business code emits events via emitDiagnostic(). Subscribers (e.g. metrics.ts)
5
+ * consume them without the emitter knowing or caring about prom-client / OTel / logs.
6
+ *
7
+ * Design choices:
8
+ * - Plain callback array (not EventEmitter) — try-catch protects callers from subscriber errors
9
+ * - Zero external dependencies — safe to import from any module
10
+ * - Synchronous dispatch — O(1) per subscriber, no event loop overhead
11
+ */
12
+ const listeners = [];
13
+ /**
14
+ * Emit a diagnostic event. All registered listeners are called synchronously.
15
+ * Listener exceptions are caught and logged — never propagated to the caller.
16
+ */
17
+ export function emitDiagnostic(event) {
18
+ for (const fn of listeners) {
19
+ try {
20
+ fn(event);
21
+ }
22
+ catch (err) {
23
+ console.warn("[diagnostic] listener error:", err);
24
+ }
25
+ }
26
+ }
27
+ /**
28
+ * Subscribe to diagnostic events. Returns an unsubscribe function.
29
+ */
30
+ export function onDiagnostic(fn) {
31
+ listeners.push(fn);
32
+ return () => {
33
+ const idx = listeners.indexOf(fn);
34
+ if (idx >= 0)
35
+ listeners.splice(idx, 1);
36
+ };
37
+ }
38
+ //# sourceMappingURL=diagnostic-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic-events.js","sourceRoot":"","sources":["../../src/shared/diagnostic-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA8DH,MAAM,SAAS,GAAe,EAAE,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAY;IACvC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,CAAC;YAAE,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * LocalCollector — per-process metrics collector for the Monitoring Dashboard.
3
+ *
4
+ * Subscribes to the diagnostic event bus and maintains:
5
+ * - Minute-level ring buffer (max 1440 buckets = 24h)
6
+ * - Per-tool call statistics (lifetime cumulative)
7
+ * - Per-session prompt/tool counters (for SessionStatsRecord generation)
8
+ * - Session stats queue (consumed by MetricsAggregator or exported via snapshot)
9
+ *
10
+ * Used directly in Local mode; in K8s mode, Gateway pulls via exportSnapshot().
11
+ * This class does NOT know which mode it runs in — the consumer decides.
12
+ */
13
+ import { type MetricsBucket, type ToolCallStats, type SkillCallStats, type SessionStatsRecord, type MetricsSnapshot } from "./metrics-types.js";
14
+ declare class LocalCollector {
15
+ private ringBuffer;
16
+ private toolCallMap;
17
+ private skillCallMap;
18
+ private perSessionCounters;
19
+ private sessionStatsQueue;
20
+ private currentSessions;
21
+ private currentWsConnections;
22
+ /** Tracks the newest timestamp that was exported via exportSnapshot() */
23
+ private lastExportedTs;
24
+ constructor();
25
+ private handle;
26
+ private getOrCreateBucket;
27
+ private evict;
28
+ /** Return buckets within the given time range, sorted ascending by timestamp */
29
+ query(range: "1h" | "6h" | "24h"): MetricsBucket[];
30
+ /** Return current instantaneous values */
31
+ snapshot(): {
32
+ activeSessions: number;
33
+ wsConnections: number;
34
+ };
35
+ /** Return tool call rankings, sorted by total descending, top N */
36
+ topTools(n: number): ToolCallStats[];
37
+ /** Return skill call rankings, sorted by total descending, top N */
38
+ topSkills(n: number): SkillCallStats[];
39
+ /**
40
+ * Drain the session stats queue — returns all pending records and clears the queue.
41
+ * Used by MetricsAggregator in Local mode to consume and write to DB.
42
+ */
43
+ drainSessionStats(): SessionStatsRecord[];
44
+ /**
45
+ * Export snapshot for Gateway pull (K8s mode).
46
+ *
47
+ * Returns only completed minute buckets (timestamp < current minute) that
48
+ * haven't been exported yet. This prevents the same bucket from being
49
+ * counted twice across consecutive pulls.
50
+ *
51
+ * Session stats queue is cleared after export (best-effort delivery).
52
+ */
53
+ exportSnapshot(): MetricsSnapshot;
54
+ }
55
+ export declare const localCollector: LocalCollector;
56
+ export {};
@@ -0,0 +1,284 @@
1
+ /**
2
+ * LocalCollector — per-process metrics collector for the Monitoring Dashboard.
3
+ *
4
+ * Subscribes to the diagnostic event bus and maintains:
5
+ * - Minute-level ring buffer (max 1440 buckets = 24h)
6
+ * - Per-tool call statistics (lifetime cumulative)
7
+ * - Per-session prompt/tool counters (for SessionStatsRecord generation)
8
+ * - Session stats queue (consumed by MetricsAggregator or exported via snapshot)
9
+ *
10
+ * Used directly in Local mode; in K8s mode, Gateway pulls via exportSnapshot().
11
+ * This class does NOT know which mode it runs in — the consumer decides.
12
+ */
13
+ import { onDiagnostic } from "./diagnostic-events.js";
14
+ import { createEmptyBucket, } from "./metrics-types.js";
15
+ const MAX_BUCKETS = 1440; // 24 hours of minute-level data
16
+ function minuteTs(now) {
17
+ return Math.floor((now ?? Date.now()) / 60_000) * 60_000;
18
+ }
19
+ class LocalCollector {
20
+ ringBuffer = new Map();
21
+ toolCallMap = new Map();
22
+ skillCallMap = new Map();
23
+ perSessionCounters = new Map();
24
+ sessionStatsQueue = [];
25
+ currentSessions = 0;
26
+ currentWsConnections = 0;
27
+ /** Tracks the newest timestamp that was exported via exportSnapshot() */
28
+ lastExportedTs = 0;
29
+ constructor() {
30
+ onDiagnostic((event) => this.handle(event));
31
+ }
32
+ // ── Event handler ──
33
+ handle(event) {
34
+ switch (event.type) {
35
+ case "prompt_complete": {
36
+ const bucket = this.getOrCreateBucket();
37
+ const deltaInput = event.curr.tokens.input - event.prev.tokens.input;
38
+ const deltaOutput = event.curr.tokens.output - event.prev.tokens.output;
39
+ const deltaCacheRead = event.curr.tokens.cacheRead - event.prev.tokens.cacheRead;
40
+ const deltaCacheWrite = event.curr.tokens.cacheWrite - event.prev.tokens.cacheWrite;
41
+ bucket.tokensInput += deltaInput;
42
+ bucket.tokensOutput += deltaOutput;
43
+ bucket.tokensCacheRead += deltaCacheRead;
44
+ bucket.tokensCacheWrite += deltaCacheWrite;
45
+ bucket.promptDurationSum += event.durationMs;
46
+ bucket.promptDurationMax = Math.max(bucket.promptDurationMax, event.durationMs);
47
+ if (event.outcome === "error") {
48
+ bucket.promptErrors++;
49
+ }
50
+ else {
51
+ bucket.promptCount++;
52
+ }
53
+ // Per-session counter
54
+ const sc = this.perSessionCounters.get(event.sessionId);
55
+ if (sc)
56
+ sc.prompts++;
57
+ break;
58
+ }
59
+ case "session_created": {
60
+ this.currentSessions++;
61
+ const bucket = this.getOrCreateBucket();
62
+ bucket.activeSessions = this.currentSessions;
63
+ this.perSessionCounters.set(event.sessionId, { prompts: 0, tools: 0, skills: 0 });
64
+ break;
65
+ }
66
+ case "session_released": {
67
+ this.currentSessions = Math.max(0, this.currentSessions - 1);
68
+ const bucket = this.getOrCreateBucket();
69
+ bucket.activeSessions = this.currentSessions;
70
+ // Generate SessionStatsRecord
71
+ const counters = this.perSessionCounters.get(event.sessionId);
72
+ this.perSessionCounters.delete(event.sessionId);
73
+ const record = {
74
+ sessionId: event.sessionId,
75
+ userId: event.userId ?? "unknown",
76
+ provider: event.model?.provider ?? null,
77
+ model: event.model?.id ?? event.model?.name ?? null,
78
+ inputTokens: event.stats.tokens.input,
79
+ outputTokens: event.stats.tokens.output,
80
+ cacheReadTokens: event.stats.tokens.cacheRead,
81
+ cacheWriteTokens: event.stats.tokens.cacheWrite,
82
+ durationMs: Date.now() - event.createdAt,
83
+ promptCount: counters?.prompts ?? 0,
84
+ toolCallCount: counters?.tools ?? 0,
85
+ skillCallCount: counters?.skills ?? 0,
86
+ createdAt: event.createdAt,
87
+ };
88
+ this.sessionStatsQueue.push(record);
89
+ break;
90
+ }
91
+ case "tool_call": {
92
+ const bucket = this.getOrCreateBucket();
93
+ if (event.outcome === "error") {
94
+ bucket.toolErrors++;
95
+ }
96
+ else {
97
+ bucket.toolCalls++;
98
+ }
99
+ // Per-tool cumulative
100
+ let entry = this.toolCallMap.get(event.toolName);
101
+ if (!entry) {
102
+ entry = { success: 0, error: 0 };
103
+ this.toolCallMap.set(event.toolName, entry);
104
+ }
105
+ if (event.outcome === "error") {
106
+ entry.error++;
107
+ }
108
+ else {
109
+ entry.success++;
110
+ }
111
+ // Per-session counter (best-effort — tool_call has no sessionId)
112
+ // Increments the first session in Map iteration order (insertion order).
113
+ // In practice each AgentBox has one active session at a time.
114
+ for (const sc of this.perSessionCounters.values()) {
115
+ sc.tools++;
116
+ break; // increment first (most recent) only
117
+ }
118
+ break;
119
+ }
120
+ case "skill_call": {
121
+ const bucket = this.getOrCreateBucket();
122
+ if (event.outcome === "error") {
123
+ bucket.skillErrors++;
124
+ }
125
+ else {
126
+ bucket.skillSuccesses++;
127
+ }
128
+ // Per-skill cumulative
129
+ const key = event.skillName;
130
+ let skillEntry = this.skillCallMap.get(key);
131
+ if (!skillEntry) {
132
+ skillEntry = { scope: event.scope, success: 0, error: 0, totalDurationMs: 0 };
133
+ this.skillCallMap.set(key, skillEntry);
134
+ }
135
+ if (event.outcome === "error") {
136
+ skillEntry.error++;
137
+ }
138
+ else {
139
+ skillEntry.success++;
140
+ }
141
+ skillEntry.totalDurationMs += event.durationMs;
142
+ // Per-session counter (skill_call carries sessionId for precise matching)
143
+ if (event.sessionId) {
144
+ const sc = this.perSessionCounters.get(event.sessionId);
145
+ if (sc)
146
+ sc.skills++;
147
+ }
148
+ break;
149
+ }
150
+ case "ws_connected": {
151
+ this.currentWsConnections++;
152
+ const bucket = this.getOrCreateBucket();
153
+ bucket.wsConnections = this.currentWsConnections;
154
+ break;
155
+ }
156
+ case "ws_disconnected": {
157
+ this.currentWsConnections = Math.max(0, this.currentWsConnections - 1);
158
+ const bucket = this.getOrCreateBucket();
159
+ bucket.wsConnections = this.currentWsConnections;
160
+ break;
161
+ }
162
+ // context_usage, session_stuck — not handled in v1
163
+ }
164
+ }
165
+ // ── Bucket management ──
166
+ getOrCreateBucket(now) {
167
+ const ts = minuteTs(now);
168
+ let bucket = this.ringBuffer.get(ts);
169
+ if (!bucket) {
170
+ bucket = createEmptyBucket(ts);
171
+ bucket.activeSessions = this.currentSessions;
172
+ bucket.wsConnections = this.currentWsConnections;
173
+ this.ringBuffer.set(ts, bucket);
174
+ this.evict();
175
+ }
176
+ return bucket;
177
+ }
178
+ evict() {
179
+ if (this.ringBuffer.size <= MAX_BUCKETS)
180
+ return;
181
+ // Remove oldest buckets
182
+ const sorted = [...this.ringBuffer.keys()].sort((a, b) => a - b);
183
+ const excess = sorted.length - MAX_BUCKETS;
184
+ for (let i = 0; i < excess; i++) {
185
+ this.ringBuffer.delete(sorted[i]);
186
+ }
187
+ }
188
+ // ── Public query API ──
189
+ /** Return buckets within the given time range, sorted ascending by timestamp */
190
+ query(range) {
191
+ const rangeMs = range === "1h" ? 3_600_000 : range === "6h" ? 21_600_000 : 86_400_000;
192
+ const cutoff = minuteTs() - rangeMs;
193
+ const result = [];
194
+ for (const [ts, bucket] of this.ringBuffer) {
195
+ if (ts >= cutoff)
196
+ result.push(bucket);
197
+ }
198
+ return result.sort((a, b) => a.timestamp - b.timestamp);
199
+ }
200
+ /** Return current instantaneous values */
201
+ snapshot() {
202
+ return {
203
+ activeSessions: this.currentSessions,
204
+ wsConnections: this.currentWsConnections,
205
+ };
206
+ }
207
+ /** Return tool call rankings, sorted by total descending, top N */
208
+ topTools(n) {
209
+ const result = [];
210
+ for (const [toolName, entry] of this.toolCallMap) {
211
+ result.push({
212
+ toolName,
213
+ success: entry.success,
214
+ error: entry.error,
215
+ total: entry.success + entry.error,
216
+ });
217
+ }
218
+ result.sort((a, b) => b.total - a.total);
219
+ return result.slice(0, n);
220
+ }
221
+ /** Return skill call rankings, sorted by total descending, top N */
222
+ topSkills(n) {
223
+ return [...this.skillCallMap.entries()]
224
+ .map(([skillName, v]) => {
225
+ const total = v.success + v.error;
226
+ return {
227
+ skillName,
228
+ scope: v.scope,
229
+ success: v.success,
230
+ error: v.error,
231
+ total,
232
+ avgDurationMs: total > 0 ? Math.round(v.totalDurationMs / total) : 0,
233
+ };
234
+ })
235
+ .sort((a, b) => b.total - a.total)
236
+ .slice(0, n);
237
+ }
238
+ /**
239
+ * Drain the session stats queue — returns all pending records and clears the queue.
240
+ * Used by MetricsAggregator in Local mode to consume and write to DB.
241
+ */
242
+ drainSessionStats() {
243
+ const records = this.sessionStatsQueue.splice(0);
244
+ return records;
245
+ }
246
+ /**
247
+ * Export snapshot for Gateway pull (K8s mode).
248
+ *
249
+ * Returns only completed minute buckets (timestamp < current minute) that
250
+ * haven't been exported yet. This prevents the same bucket from being
251
+ * counted twice across consecutive pulls.
252
+ *
253
+ * Session stats queue is cleared after export (best-effort delivery).
254
+ */
255
+ exportSnapshot() {
256
+ const currentMin = minuteTs();
257
+ const buckets = [];
258
+ for (const [ts, bucket] of this.ringBuffer) {
259
+ if (ts < currentMin && ts > this.lastExportedTs) {
260
+ buckets.push(bucket);
261
+ }
262
+ }
263
+ buckets.sort((a, b) => a.timestamp - b.timestamp);
264
+ if (buckets.length > 0) {
265
+ this.lastExportedTs = buckets[buckets.length - 1].timestamp;
266
+ }
267
+ // Tool call deltas: export current totals, then reset for next interval
268
+ const toolCallDeltas = this.topTools(Infinity);
269
+ this.toolCallMap.clear();
270
+ // Skill call deltas: export current totals, then reset for next interval
271
+ const skillCallDeltas = this.topSkills(Infinity);
272
+ this.skillCallMap.clear();
273
+ const sessionStats = this.sessionStatsQueue.splice(0);
274
+ return {
275
+ buckets,
276
+ activeSessions: this.currentSessions,
277
+ sessionStats,
278
+ toolCallDeltas,
279
+ skillCallDeltas,
280
+ };
281
+ }
282
+ }
283
+ export const localCollector = new LocalCollector();
284
+ //# sourceMappingURL=local-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-collector.js","sourceRoot":"","sources":["../../src/shared/local-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Shared data types for the Monitoring Dashboard.
3
+ *
4
+ * Used by both LocalCollector (AgentBox side) and MetricsAggregator (Gateway side).
5
+ */
6
+ /** Minute-level aggregation bucket */
7
+ export interface MetricsBucket {
8
+ timestamp: number;
9
+ tokensInput: number;
10
+ tokensOutput: number;
11
+ tokensCacheRead: number;
12
+ tokensCacheWrite: number;
13
+ promptCount: number;
14
+ promptErrors: number;
15
+ promptDurationSum: number;
16
+ promptDurationMax: number;
17
+ activeSessions: number;
18
+ wsConnections: number;
19
+ toolCalls: number;
20
+ toolErrors: number;
21
+ skillSuccesses: number;
22
+ skillErrors: number;
23
+ }
24
+ /** Tool call ranking entry */
25
+ export interface ToolCallStats {
26
+ toolName: string;
27
+ success: number;
28
+ error: number;
29
+ total: number;
30
+ }
31
+ /** Skill call ranking entry */
32
+ export interface SkillCallStats {
33
+ skillName: string;
34
+ scope: "builtin" | "team" | "personal";
35
+ success: number;
36
+ error: number;
37
+ total: number;
38
+ avgDurationMs: number;
39
+ }
40
+ /** Session stats record — written to Gateway DB when a session is released */
41
+ export interface SessionStatsRecord {
42
+ sessionId: string;
43
+ userId: string;
44
+ provider: string | null;
45
+ model: string | null;
46
+ inputTokens: number;
47
+ outputTokens: number;
48
+ cacheReadTokens: number;
49
+ cacheWriteTokens: number;
50
+ durationMs: number;
51
+ promptCount: number;
52
+ toolCallCount: number;
53
+ skillCallCount: number;
54
+ createdAt: number;
55
+ }
56
+ /** Snapshot exported by LocalCollector for Gateway pull (K8s mode) */
57
+ export interface MetricsSnapshot {
58
+ buckets: MetricsBucket[];
59
+ activeSessions: number;
60
+ sessionStats: SessionStatsRecord[];
61
+ toolCallDeltas: ToolCallStats[];
62
+ skillCallDeltas: SkillCallStats[];
63
+ }
64
+ export declare function createEmptyBucket(timestamp: number): MetricsBucket;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared data types for the Monitoring Dashboard.
3
+ *
4
+ * Used by both LocalCollector (AgentBox side) and MetricsAggregator (Gateway side).
5
+ */
6
+ export function createEmptyBucket(timestamp) {
7
+ return {
8
+ timestamp,
9
+ tokensInput: 0,
10
+ tokensOutput: 0,
11
+ tokensCacheRead: 0,
12
+ tokensCacheWrite: 0,
13
+ promptCount: 0,
14
+ promptErrors: 0,
15
+ promptDurationSum: 0,
16
+ promptDurationMax: 0,
17
+ activeSessions: 0,
18
+ wsConnections: 0,
19
+ toolCalls: 0,
20
+ toolErrors: 0,
21
+ skillSuccesses: 0,
22
+ skillErrors: 0,
23
+ };
24
+ }
25
+ //# sourceMappingURL=metrics-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-types.js","sourceRoot":"","sources":["../../src/shared/metrics-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiEH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO;QACL,SAAS;QACT,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;QAClB,gBAAgB,EAAE,CAAC;QACnB,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,cAAc,EAAE,CAAC;QACjB,aAAa,EAAE,CAAC;QAChB,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;QACjB,WAAW,EAAE,CAAC;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Prometheus metrics subscriber — the ONLY file that depends on prom-client.
3
+ *
4
+ * Subscribes to the diagnostic event bus and maps events to Prometheus metrics.
5
+ * Business code never imports this module directly — it only calls emitDiagnostic().
6
+ *
7
+ * Importing this module (side-effect import) registers the subscriber automatically.
8
+ */
9
+ import http from "node:http";
10
+ import { Registry } from "prom-client";
11
+ /**
12
+ * Check bearer token authentication for /metrics endpoints.
13
+ * Returns true if the request is authorized (or no token is configured).
14
+ * Returns false and sends 401 response if unauthorized.
15
+ */
16
+ export declare function checkMetricsAuth(req: http.IncomingMessage, res: http.ServerResponse, configuredToken?: string): boolean;
17
+ export declare const metricsRegistry: Registry<"text/plain; version=0.0.4; charset=utf-8">;
18
+ /** Update the includeUserId flag at runtime (called by Gateway when DB config changes) */
19
+ export declare function setIncludeUserId(value: boolean): void;