siclaw 0.1.1 → 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 (267) hide show
  1. package/README.md +74 -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.js +6 -5
  90. package/dist/gateway/db/repositories/model-config-repo.js.map +1 -1
  91. package/dist/gateway/db/repositories/skill-repo.d.ts +0 -5
  92. package/dist/gateway/db/repositories/skill-review-repo.d.ts +1 -0
  93. package/dist/gateway/db/repositories/skill-review-repo.js +4 -1
  94. package/dist/gateway/db/repositories/skill-review-repo.js.map +1 -1
  95. package/dist/gateway/db/repositories/skill-version-repo.js +0 -1
  96. package/dist/gateway/db/repositories/skill-version-repo.js.map +1 -1
  97. package/dist/gateway/db/repositories/system-config-repo.d.ts +1 -1
  98. package/dist/gateway/db/repositories/system-config-repo.js +2 -1
  99. package/dist/gateway/db/repositories/system-config-repo.js.map +1 -1
  100. package/dist/gateway/db/repositories/user-env-config-repo.d.ts +13 -0
  101. package/dist/gateway/db/repositories/user-env-config-repo.js +11 -0
  102. package/dist/gateway/db/repositories/user-env-config-repo.js.map +1 -1
  103. package/dist/gateway/db/repositories/workspace-repo.d.ts +3 -2
  104. package/dist/gateway/db/repositories/workspace-repo.js +6 -2
  105. package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
  106. package/dist/gateway/db/schema-mysql.d.ts +473 -51
  107. package/dist/gateway/db/schema-mysql.js +35 -4
  108. package/dist/gateway/db/schema-mysql.js.map +1 -1
  109. package/dist/gateway/db/schema-sqlite.d.ts +522 -57
  110. package/dist/gateway/db/schema-sqlite.js +38 -6
  111. package/dist/gateway/db/schema-sqlite.js.map +1 -1
  112. package/dist/gateway/db/schema.d.ts +471 -51
  113. package/dist/gateway/db/schema.js +1 -1
  114. package/dist/gateway/db/schema.js.map +1 -1
  115. package/dist/gateway/metrics-aggregator.d.ts +65 -0
  116. package/dist/gateway/metrics-aggregator.js +244 -0
  117. package/dist/gateway/metrics-aggregator.js.map +1 -0
  118. package/dist/gateway/plugins/channel-bridge.d.ts +4 -1
  119. package/dist/gateway/plugins/channel-bridge.js +78 -86
  120. package/dist/gateway/plugins/channel-bridge.js.map +1 -1
  121. package/dist/gateway/rpc-methods.d.ts +4 -2
  122. package/dist/gateway/rpc-methods.js +852 -166
  123. package/dist/gateway/rpc-methods.js.map +1 -1
  124. package/dist/gateway/security/cert-manager.d.ts +2 -2
  125. package/dist/gateway/security/cert-manager.js +4 -2
  126. package/dist/gateway/security/cert-manager.js.map +1 -1
  127. package/dist/gateway/server.d.ts +4 -8
  128. package/dist/gateway/server.js +297 -261
  129. package/dist/gateway/server.js.map +1 -1
  130. package/dist/gateway/skills/file-writer.js +17 -11
  131. package/dist/gateway/skills/file-writer.js.map +1 -1
  132. package/dist/gateway/skills/script-evaluator.js +12 -9
  133. package/dist/gateway/skills/script-evaluator.js.map +1 -1
  134. package/dist/gateway/web/dist/assets/index-0p17ZeTP.js +740 -0
  135. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js +741 -0
  136. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js.map +1 -0
  137. package/dist/gateway/web/dist/assets/index-DyowBCEj.css +1 -0
  138. package/dist/gateway/web/dist/assets/index-PDK5JJDO.css +1 -0
  139. package/dist/gateway/web/dist/index.html +2 -2
  140. package/dist/gateway-main.js +27 -10
  141. package/dist/gateway-main.js.map +1 -1
  142. package/dist/memory/embeddings.js +5 -4
  143. package/dist/memory/embeddings.js.map +1 -1
  144. package/dist/memory/indexer.d.ts +23 -3
  145. package/dist/memory/indexer.js +235 -23
  146. package/dist/memory/indexer.js.map +1 -1
  147. package/dist/memory/schema.js +15 -1
  148. package/dist/memory/schema.js.map +1 -1
  149. package/dist/memory/types.d.ts +18 -0
  150. package/dist/memory/types.js +6 -1
  151. package/dist/memory/types.js.map +1 -1
  152. package/dist/shared/detect-language.d.ts +12 -0
  153. package/dist/shared/detect-language.js +78 -0
  154. package/dist/shared/detect-language.js.map +1 -0
  155. package/dist/shared/diagnostic-events.d.ts +70 -0
  156. package/dist/shared/diagnostic-events.js +38 -0
  157. package/dist/shared/diagnostic-events.js.map +1 -0
  158. package/dist/shared/local-collector.d.ts +56 -0
  159. package/dist/shared/local-collector.js +284 -0
  160. package/dist/shared/local-collector.js.map +1 -0
  161. package/dist/shared/metrics-types.d.ts +64 -0
  162. package/dist/shared/metrics-types.js +25 -0
  163. package/dist/shared/metrics-types.js.map +1 -0
  164. package/dist/shared/metrics.d.ts +19 -0
  165. package/dist/shared/metrics.js +185 -0
  166. package/dist/shared/metrics.js.map +1 -0
  167. package/dist/shared/path-utils.d.ts +15 -0
  168. package/dist/shared/path-utils.js +23 -0
  169. package/dist/shared/path-utils.js.map +1 -0
  170. package/dist/shared/retry.d.ts +35 -0
  171. package/dist/shared/retry.js +61 -0
  172. package/dist/shared/retry.js.map +1 -0
  173. package/dist/tools/command-sets.d.ts +18 -2
  174. package/dist/tools/command-sets.js +207 -32
  175. package/dist/tools/command-sets.js.map +1 -1
  176. package/dist/tools/command-validator.d.ts +56 -0
  177. package/dist/tools/command-validator.js +357 -0
  178. package/dist/tools/command-validator.js.map +1 -0
  179. package/dist/tools/create-skill.js +26 -1
  180. package/dist/tools/create-skill.js.map +1 -1
  181. package/dist/tools/credential-list.js +1 -23
  182. package/dist/tools/credential-list.js.map +1 -1
  183. package/dist/tools/credential-manager.d.ts +98 -0
  184. package/dist/tools/credential-manager.js +313 -0
  185. package/dist/tools/credential-manager.js.map +1 -0
  186. package/dist/tools/deep-search/engine.js +184 -127
  187. package/dist/tools/deep-search/engine.js.map +1 -1
  188. package/dist/tools/deep-search/prompts.d.ts +10 -2
  189. package/dist/tools/deep-search/prompts.js +37 -36
  190. package/dist/tools/deep-search/prompts.js.map +1 -1
  191. package/dist/tools/deep-search/schemas.d.ts +87 -0
  192. package/dist/tools/deep-search/schemas.js +85 -0
  193. package/dist/tools/deep-search/schemas.js.map +1 -0
  194. package/dist/tools/deep-search/sub-agent.d.ts +21 -0
  195. package/dist/tools/deep-search/sub-agent.js +153 -4
  196. package/dist/tools/deep-search/sub-agent.js.map +1 -1
  197. package/dist/tools/deep-search/tool.js +1 -0
  198. package/dist/tools/deep-search/tool.js.map +1 -1
  199. package/dist/tools/deep-search/types.d.ts +2 -0
  200. package/dist/tools/deep-search/types.js.map +1 -1
  201. package/dist/tools/dp-tools.js +29 -5
  202. package/dist/tools/dp-tools.js.map +1 -1
  203. package/dist/tools/exec-utils.d.ts +85 -0
  204. package/dist/tools/exec-utils.js +294 -0
  205. package/dist/tools/exec-utils.js.map +1 -0
  206. package/dist/tools/fork-skill.js +14 -2
  207. package/dist/tools/fork-skill.js.map +1 -1
  208. package/dist/tools/investigation-feedback.d.ts +3 -0
  209. package/dist/tools/investigation-feedback.js +71 -0
  210. package/dist/tools/investigation-feedback.js.map +1 -0
  211. package/dist/tools/manage-schedule.js +16 -6
  212. package/dist/tools/manage-schedule.js.map +1 -1
  213. package/dist/tools/netns-script.js +27 -281
  214. package/dist/tools/netns-script.js.map +1 -1
  215. package/dist/tools/node-exec.d.ts +2 -14
  216. package/dist/tools/node-exec.js +18 -225
  217. package/dist/tools/node-exec.js.map +1 -1
  218. package/dist/tools/node-script.js +14 -168
  219. package/dist/tools/node-script.js.map +1 -1
  220. package/dist/tools/pod-exec.d.ts +1 -1
  221. package/dist/tools/pod-exec.js +10 -26
  222. package/dist/tools/pod-exec.js.map +1 -1
  223. package/dist/tools/pod-nsenter-exec.js +21 -225
  224. package/dist/tools/pod-nsenter-exec.js.map +1 -1
  225. package/dist/tools/pod-script.js +10 -19
  226. package/dist/tools/pod-script.js.map +1 -1
  227. package/dist/tools/restricted-bash.d.ts +1 -17
  228. package/dist/tools/restricted-bash.js +38 -252
  229. package/dist/tools/restricted-bash.js.map +1 -1
  230. package/dist/tools/run-skill.d.ts +3 -1
  231. package/dist/tools/run-skill.js +21 -1
  232. package/dist/tools/run-skill.js.map +1 -1
  233. package/dist/tools/script-resolver.d.ts +3 -1
  234. package/dist/tools/script-resolver.js +74 -30
  235. package/dist/tools/script-resolver.js.map +1 -1
  236. package/dist/tools/update-skill.js +17 -6
  237. package/dist/tools/update-skill.js.map +1 -1
  238. package/package.json +4 -2
  239. package/siclaw.mjs +10 -1
  240. package/skills/core/cluster-events/SKILL.md +1 -1
  241. package/skills/core/deep-investigation/SKILL.md +11 -0
  242. package/skills/core/deployment-rollout-debug/SKILL.md +1 -1
  243. package/skills/core/dns-debug/SKILL.md +1 -0
  244. package/skills/core/meta.json +12 -1
  245. package/skills/core/networkpolicy-debug/SKILL.md +332 -0
  246. package/skills/core/node-logs/scripts/get-node-logs.sh +19 -9
  247. package/skills/core/pod-pending-debug/SKILL.md +1 -0
  248. package/skills/core/quota-debug/SKILL.md +203 -0
  249. package/skills/core/service-debug/SKILL.md +1 -0
  250. package/skills/core/statefulset-debug/SKILL.md +280 -0
  251. package/skills/core/volcano-diagnose-pod/SKILL.md +196 -0
  252. package/skills/core/volcano-diagnose-pod/scripts/diagnose-pod.sh +175 -0
  253. package/skills/core/volcano-gang-scheduling/SKILL.md +299 -0
  254. package/skills/core/volcano-job-diagnose/SKILL.md +319 -0
  255. package/skills/core/volcano-job-diagnose/scripts/diagnose-job.sh +253 -0
  256. package/skills/core/volcano-node-resources/SKILL.md +334 -0
  257. package/skills/core/volcano-node-resources/scripts/get-node-resources.sh +281 -0
  258. package/skills/core/volcano-queue-diagnose/SKILL.md +294 -0
  259. package/skills/core/volcano-queue-diagnose/scripts/diagnose-queue.sh +283 -0
  260. package/skills/core/volcano-resource-insufficient/SKILL.md +315 -0
  261. package/skills/core/volcano-scheduler-config/SKILL.md +371 -0
  262. package/skills/core/volcano-scheduler-config/scripts/get-scheduler-config.sh +297 -0
  263. package/skills/core/volcano-scheduler-logs/SKILL.md +241 -0
  264. package/skills/core/volcano-scheduler-logs/scripts/get-scheduler-logs.sh +159 -0
  265. package/skills/platform/create-skill/SKILL.md +35 -3
  266. package/skills/platform/manage-skill/SKILL.md +9 -2
  267. package/skills/platform/update-skill/SKILL.md +17 -6
@@ -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;