@xopcai/xopcbot 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/README.md +57 -52
  2. package/README.zh-CN.md +56 -49
  3. package/dist/agent/__tests__/media-processing.test.d.ts +6 -0
  4. package/dist/agent/__tests__/media-processing.test.js +385 -0
  5. package/dist/agent/__tests__/media-processing.test.js.map +1 -0
  6. package/dist/agent/fallback/__tests__/index.test.js +16 -5
  7. package/dist/agent/fallback/__tests__/index.test.js.map +1 -1
  8. package/dist/agent/fallback/candidates.d.ts +2 -4
  9. package/dist/agent/fallback/candidates.js +19 -26
  10. package/dist/agent/fallback/candidates.js.map +1 -1
  11. package/dist/agent/helpers.d.ts +1 -0
  12. package/dist/agent/helpers.js.map +1 -1
  13. package/dist/agent/index.d.ts +6 -1
  14. package/dist/agent/index.js +10 -1
  15. package/dist/agent/index.js.map +1 -1
  16. package/dist/agent/models/compat.d.ts +35 -0
  17. package/dist/agent/models/compat.js +110 -0
  18. package/dist/agent/models/compat.js.map +1 -0
  19. package/dist/agent/models/fallback.d.ts +38 -0
  20. package/dist/agent/models/fallback.js +133 -0
  21. package/dist/agent/models/fallback.js.map +1 -0
  22. package/dist/agent/models/index.d.ts +10 -0
  23. package/dist/agent/models/index.js +11 -0
  24. package/dist/agent/models/index.js.map +1 -0
  25. package/dist/agent/{model-manager.d.ts → models/manager.d.ts} +2 -8
  26. package/dist/agent/{model-manager.js → models/manager.js} +38 -24
  27. package/dist/agent/models/manager.js.map +1 -0
  28. package/dist/agent/models/scan.d.ts +46 -0
  29. package/dist/agent/models/scan.js +177 -0
  30. package/dist/agent/models/scan.js.map +1 -0
  31. package/dist/agent/models/selection.d.ts +44 -0
  32. package/dist/agent/models/selection.js +141 -0
  33. package/dist/agent/models/selection.js.map +1 -0
  34. package/dist/agent/prompt/index.js +1 -1
  35. package/dist/agent/prompt/index.js.map +1 -1
  36. package/dist/agent/service.js +34 -16
  37. package/dist/agent/service.js.map +1 -1
  38. package/dist/agent/skills/__tests__/test-framework.test.js +15 -7
  39. package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -1
  40. package/dist/agent/skills/config.d.ts +1 -1
  41. package/dist/agent/skills/config.js +2 -2
  42. package/dist/agent/skills/config.js.map +1 -1
  43. package/dist/agent/skills/index.js +15 -28
  44. package/dist/agent/skills/index.js.map +1 -1
  45. package/dist/agent/skills/installer.d.ts +1 -1
  46. package/dist/agent/skills/installer.js +1 -1
  47. package/dist/agent/skills/scanner.d.ts +1 -1
  48. package/dist/agent/skills/scanner.js +1 -1
  49. package/dist/agent/skills/test-framework.js +24 -23
  50. package/dist/agent/skills/test-framework.js.map +1 -1
  51. package/dist/agent/skills/types.d.ts +3 -3
  52. package/dist/agent/skills/types.js +1 -1
  53. package/dist/agent/skills/watcher.d.ts +1 -1
  54. package/dist/agent/skills/watcher.js +1 -1
  55. package/dist/agent/system-prompt.d.ts +67 -0
  56. package/dist/agent/system-prompt.js +351 -0
  57. package/dist/agent/system-prompt.js.map +1 -0
  58. package/dist/agent/tools/__tests__/send-media.test.d.ts +6 -0
  59. package/dist/agent/tools/__tests__/send-media.test.js +251 -0
  60. package/dist/agent/tools/__tests__/send-media.test.js.map +1 -0
  61. package/dist/agent/types.agent-defaults.d.ts +48 -0
  62. package/dist/agent/types.agent-defaults.js +5 -0
  63. package/dist/agent/types.agent-defaults.js.map +1 -0
  64. package/dist/agent/types.d.ts +14 -6
  65. package/dist/agent/types.js +5 -0
  66. package/dist/agent/types.js.map +1 -1
  67. package/dist/agent/workspace.d.ts +94 -0
  68. package/dist/agent/workspace.js +625 -0
  69. package/dist/agent/workspace.js.map +1 -0
  70. package/dist/auth/index.js +1 -1
  71. package/dist/auth/index.js.map +1 -1
  72. package/dist/auth/oauth/index.d.ts +1 -0
  73. package/dist/auth/oauth/index.js +1 -0
  74. package/dist/auth/oauth/index.js.map +1 -1
  75. package/dist/auth/oauth/kimi.d.ts +2 -1
  76. package/dist/auth/oauth/kimi.js +51 -48
  77. package/dist/auth/oauth/kimi.js.map +1 -1
  78. package/dist/auth/oauth/minimax-cn.d.ts +12 -0
  79. package/dist/auth/oauth/minimax-cn.js +111 -0
  80. package/dist/auth/oauth/minimax-cn.js.map +1 -0
  81. package/dist/auth/oauth/qwen.d.ts +5 -0
  82. package/dist/auth/oauth/qwen.js +54 -84
  83. package/dist/auth/oauth/qwen.js.map +1 -1
  84. package/dist/auth/profiles/index.d.ts +0 -2
  85. package/dist/auth/profiles/index.js +0 -2
  86. package/dist/auth/profiles/index.js.map +1 -1
  87. package/dist/auth/storage.js +7 -1
  88. package/dist/auth/storage.js.map +1 -1
  89. package/dist/channels/__tests__/media-integration.test.d.ts +6 -0
  90. package/dist/channels/__tests__/media-integration.test.js +398 -0
  91. package/dist/channels/__tests__/media-integration.test.js.map +1 -0
  92. package/dist/channels/__tests__/media.test.d.ts +6 -0
  93. package/dist/channels/__tests__/media.test.js +251 -0
  94. package/dist/channels/__tests__/media.test.js.map +1 -0
  95. package/dist/channels/access-control.d.ts +1 -1
  96. package/dist/channels/access-control.js +1 -1
  97. package/dist/channels/draft-stream.d.ts +1 -1
  98. package/dist/channels/draft-stream.js +1 -1
  99. package/dist/channels/format.d.ts +1 -1
  100. package/dist/channels/format.js +1 -1
  101. package/dist/channels/telegram/command-handler.js +15 -48
  102. package/dist/channels/telegram/command-handler.js.map +1 -1
  103. package/dist/channels/telegram/plugin.js +3 -2
  104. package/dist/channels/telegram/plugin.js.map +1 -1
  105. package/dist/channels/telegram/webhook.d.ts +1 -1
  106. package/dist/channels/telegram/webhook.js +1 -1
  107. package/dist/channels/types.d.ts +1 -1
  108. package/dist/channels/types.js +1 -1
  109. package/dist/channels/update-offset-store.d.ts +1 -1
  110. package/dist/channels/update-offset-store.js +1 -1
  111. package/dist/cli/commands/auth.js +8 -23
  112. package/dist/cli/commands/auth.js.map +1 -1
  113. package/dist/cli/commands/gateway.js +9 -1
  114. package/dist/cli/commands/gateway.js.map +1 -1
  115. package/dist/cli/commands/models.js +35 -29
  116. package/dist/cli/commands/models.js.map +1 -1
  117. package/dist/cli/commands/onboard.js +166 -115
  118. package/dist/cli/commands/onboard.js.map +1 -1
  119. package/dist/cli/commands/setup.js +123 -0
  120. package/dist/cli/commands/setup.js.map +1 -0
  121. package/dist/cli/commands/skills.js +6 -6
  122. package/dist/cli/commands/skills.js.map +1 -1
  123. package/dist/cli/index.d.ts +1 -1
  124. package/dist/cli/index.js +1 -1
  125. package/dist/cli/index.js.map +1 -1
  126. package/dist/cli/templates.d.ts +2 -0
  127. package/dist/cli/templates.js +1 -1
  128. package/dist/cli/templates.js.map +1 -1
  129. package/dist/config/defaults.d.ts +19 -0
  130. package/dist/config/defaults.js +168 -0
  131. package/dist/config/defaults.js.map +1 -0
  132. package/dist/config/index.d.ts +5 -0
  133. package/dist/config/index.js +4 -0
  134. package/dist/config/index.js.map +1 -1
  135. package/dist/config/integration.d.ts +12 -0
  136. package/dist/config/integration.js +14 -0
  137. package/dist/config/integration.js.map +1 -0
  138. package/dist/config/models-json.d.ts +454 -0
  139. package/dist/config/models-json.js +323 -0
  140. package/dist/config/models-json.js.map +1 -0
  141. package/dist/config/paths.d.ts +2 -0
  142. package/dist/config/paths.js +4 -0
  143. package/dist/config/paths.js.map +1 -1
  144. package/dist/config/reload.d.ts +1 -1
  145. package/dist/config/reload.js +3 -3
  146. package/dist/config/reload.js.map +1 -1
  147. package/dist/config/resolve-config-value.d.ts +36 -0
  148. package/dist/config/resolve-config-value.js +218 -0
  149. package/dist/config/resolve-config-value.js.map +1 -0
  150. package/dist/config/rules.js +3 -2
  151. package/dist/config/rules.js.map +1 -1
  152. package/dist/config/schema.d.ts +17 -884
  153. package/dist/config/schema.js +36 -312
  154. package/dist/config/schema.js.map +1 -1
  155. package/dist/config/types.models.d.ts +54 -0
  156. package/dist/config/types.models.js +2 -0
  157. package/dist/config/types.models.js.map +1 -0
  158. package/dist/cron/validation.d.ts +4 -4
  159. package/dist/gateway/hono/app.js +232 -78
  160. package/dist/gateway/hono/app.js.map +1 -1
  161. package/dist/gateway/hono/oauth-async.d.ts +14 -0
  162. package/dist/gateway/hono/oauth-async.js +285 -0
  163. package/dist/gateway/hono/oauth-async.js.map +1 -0
  164. package/dist/gateway/hono/oauth.d.ts +9 -0
  165. package/dist/gateway/hono/oauth.js +157 -0
  166. package/dist/gateway/hono/oauth.js.map +1 -0
  167. package/dist/gateway/hono/sse.js +5 -2
  168. package/dist/gateway/hono/sse.js.map +1 -1
  169. package/dist/gateway/process-manager.js +12 -10
  170. package/dist/gateway/process-manager.js.map +1 -1
  171. package/dist/gateway/service.d.ts +6 -2
  172. package/dist/gateway/service.js +20 -6
  173. package/dist/gateway/service.js.map +1 -1
  174. package/dist/gateway/static/root/assets/flow-BqIEBwW6.js +2 -0
  175. package/dist/gateway/static/root/assets/flow-BqIEBwW6.js.map +1 -0
  176. package/dist/gateway/static/root/assets/main-Br2tw-87.js +5168 -0
  177. package/dist/gateway/static/root/assets/main-Br2tw-87.js.map +1 -0
  178. package/dist/gateway/static/root/assets/main-DwlbPf8Z.css +1 -0
  179. package/dist/gateway/static/root/index.html +2 -2
  180. package/dist/plugins/index.d.ts +0 -2
  181. package/dist/plugins/index.js +0 -2
  182. package/dist/plugins/index.js.map +1 -1
  183. package/dist/plugins/types.d.ts +0 -2
  184. package/dist/plugins/types.js +0 -2
  185. package/dist/plugins/types.js.map +1 -1
  186. package/dist/providers/index.d.ts +50 -22
  187. package/dist/providers/index.js +276 -50
  188. package/dist/providers/index.js.map +1 -1
  189. package/dist/providers/model-registry.d.ts +84 -0
  190. package/dist/providers/model-registry.js +385 -0
  191. package/dist/providers/model-registry.js.map +1 -0
  192. package/dist/types/providers.d.ts +2 -63
  193. package/dist/types/providers.js +1 -1
  194. package/dist/utils/__tests__/frontmatter.test.d.ts +4 -0
  195. package/dist/utils/__tests__/frontmatter.test.js +150 -0
  196. package/dist/utils/__tests__/frontmatter.test.js.map +1 -0
  197. package/dist/utils/diagnostic-events.d.ts +230 -0
  198. package/dist/utils/diagnostic-events.js +189 -0
  199. package/dist/utils/diagnostic-events.js.map +1 -0
  200. package/dist/utils/frontmatter.d.ts +0 -1
  201. package/dist/utils/frontmatter.js +15 -79
  202. package/dist/utils/frontmatter.js.map +1 -1
  203. package/dist/utils/log-stream.d.ts +95 -0
  204. package/dist/utils/log-stream.js +229 -0
  205. package/dist/utils/log-stream.js.map +1 -0
  206. package/dist/utils/logger.d.ts +5 -0
  207. package/dist/utils/logger.js +25 -0
  208. package/dist/utils/logger.js.map +1 -1
  209. package/dist/utils/redact.d.ts +73 -0
  210. package/dist/utils/redact.js +245 -0
  211. package/dist/utils/redact.js.map +1 -0
  212. package/package.json +6 -4
  213. package/skills/find-skills/SKILL.md +0 -9
  214. package/dist/__tests__/core.test.js +0 -72
  215. package/dist/__tests__/core.test.js.map +0 -1
  216. package/dist/agent/model-manager.js.map +0 -1
  217. package/dist/cli/commands/configure.d.ts +0 -1
  218. package/dist/cli/commands/configure.js +0 -173
  219. package/dist/cli/commands/configure.js.map +0 -1
  220. package/dist/cli/commands/gateway-daemon.d.ts +0 -1
  221. package/dist/cli/commands/gateway-daemon.js +0 -141
  222. package/dist/cli/commands/gateway-daemon.js.map +0 -1
  223. package/dist/config/__tests__/diff.test.d.ts +0 -1
  224. package/dist/config/__tests__/diff.test.js +0 -192
  225. package/dist/config/__tests__/diff.test.js.map +0 -1
  226. package/dist/config/__tests__/loader.test.d.ts +0 -1
  227. package/dist/config/__tests__/loader.test.js +0 -356
  228. package/dist/config/__tests__/loader.test.js.map +0 -1
  229. package/dist/config/__tests__/paths.test.d.ts +0 -1
  230. package/dist/config/__tests__/paths.test.js +0 -192
  231. package/dist/config/__tests__/paths.test.js.map +0 -1
  232. package/dist/config/__tests__/reload.test.d.ts +0 -1
  233. package/dist/config/__tests__/reload.test.js +0 -374
  234. package/dist/config/__tests__/reload.test.js.map +0 -1
  235. package/dist/config/__tests__/rules.test.d.ts +0 -1
  236. package/dist/config/__tests__/rules.test.js +0 -204
  237. package/dist/config/__tests__/rules.test.js.map +0 -1
  238. package/dist/config/__tests__/schema.test.d.ts +0 -1
  239. package/dist/config/__tests__/schema.test.js +0 -672
  240. package/dist/config/__tests__/schema.test.js.map +0 -1
  241. package/dist/daemon/background-start.d.ts +0 -33
  242. package/dist/daemon/background-start.js +0 -89
  243. package/dist/daemon/background-start.js.map +0 -1
  244. package/dist/daemon/gateway-manager.d.ts +0 -87
  245. package/dist/daemon/gateway-manager.js +0 -324
  246. package/dist/daemon/gateway-manager.js.map +0 -1
  247. package/dist/daemon/index.d.ts +0 -5
  248. package/dist/daemon/index.js +0 -6
  249. package/dist/daemon/index.js.map +0 -1
  250. package/dist/gateway/static/root/assets/main-DevbZW9K.js +0 -2227
  251. package/dist/gateway/static/root/assets/main-DevbZW9K.js.map +0 -1
  252. package/dist/gateway/static/root/assets/main-DxZg1Nmz.css +0 -1
  253. package/dist/providers/__tests__/registry.test.d.ts +0 -1
  254. package/dist/providers/__tests__/registry.test.js +0 -110
  255. package/dist/providers/__tests__/registry.test.js.map +0 -1
  256. package/dist/providers/api-strategies.d.ts +0 -15
  257. package/dist/providers/api-strategies.js +0 -96
  258. package/dist/providers/api-strategies.js.map +0 -1
  259. package/dist/providers/auto-discovery.d.ts +0 -84
  260. package/dist/providers/auto-discovery.js +0 -236
  261. package/dist/providers/auto-discovery.js.map +0 -1
  262. package/dist/providers/config.d.ts +0 -25
  263. package/dist/providers/config.js +0 -42
  264. package/dist/providers/config.js.map +0 -1
  265. package/dist/providers/model-catalog.d.ts +0 -205
  266. package/dist/providers/model-catalog.js +0 -1071
  267. package/dist/providers/model-catalog.js.map +0 -1
  268. package/dist/providers/models-dev-data.d.ts +0 -11
  269. package/dist/providers/models-dev-data.js +0 -1035
  270. package/dist/providers/models-dev-data.js.map +0 -1
  271. package/dist/providers/models-dev.d.ts +0 -30
  272. package/dist/providers/models-dev.js +0 -42
  273. package/dist/providers/models-dev.js.map +0 -1
  274. package/dist/providers/pi-ai.d.ts +0 -62
  275. package/dist/providers/pi-ai.js +0 -221
  276. package/dist/providers/pi-ai.js.map +0 -1
  277. package/dist/providers/provider-catalog.d.ts +0 -173
  278. package/dist/providers/provider-catalog.js +0 -834
  279. package/dist/providers/provider-catalog.js.map +0 -1
  280. package/dist/providers/registry.d.ts +0 -155
  281. package/dist/providers/registry.js +0 -524
  282. package/dist/providers/registry.js.map +0 -1
  283. package/dist/providers/types.d.ts +0 -95
  284. package/dist/providers/types.js +0 -7
  285. package/dist/providers/types.js.map +0 -1
  286. package/dist/session/chat-manager.d.ts +0 -49
  287. package/dist/session/chat-manager.js +0 -167
  288. package/dist/session/chat-manager.js.map +0 -1
  289. package/dist/session/chat-types.d.ts +0 -53
  290. package/dist/session/chat-types.js +0 -63
  291. package/dist/session/chat-types.js.map +0 -1
  292. /package/dist/{__tests__/core.test.d.ts → cli/commands/setup.d.ts} +0 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Diagnostic Events System
3
+ *
4
+ * Structured event stream for system diagnostics:
5
+ * - Webhook events (received, processed, error)
6
+ * - Message events (queued, processed)
7
+ * - Session events (state changes, stuck detection)
8
+ * - Model usage events (tokens, cost, duration)
9
+ * - Heartbeat events (system health)
10
+ *
11
+ * Based on OpenClaw's diagnostic-events.ts implementation.
12
+ */
13
+ export type DiagnosticSessionState = 'idle' | 'processing' | 'waiting';
14
+ type DiagnosticBaseEvent = {
15
+ ts: number;
16
+ seq: number;
17
+ };
18
+ export type DiagnosticWebhookReceivedEvent = DiagnosticBaseEvent & {
19
+ type: 'webhook.received';
20
+ channel: string;
21
+ updateType?: string;
22
+ chatId?: number | string;
23
+ };
24
+ export type DiagnosticWebhookProcessedEvent = DiagnosticBaseEvent & {
25
+ type: 'webhook.processed';
26
+ channel: string;
27
+ updateType?: string;
28
+ chatId?: number | string;
29
+ durationMs?: number;
30
+ };
31
+ export type DiagnosticWebhookErrorEvent = DiagnosticBaseEvent & {
32
+ type: 'webhook.error';
33
+ channel: string;
34
+ updateType?: string;
35
+ chatId?: number | string;
36
+ error: string;
37
+ };
38
+ export type DiagnosticMessageQueuedEvent = DiagnosticBaseEvent & {
39
+ type: 'message.queued';
40
+ sessionKey?: string;
41
+ sessionId?: string;
42
+ channel?: string;
43
+ source: string;
44
+ queueDepth?: number;
45
+ };
46
+ export type DiagnosticMessageProcessedEvent = DiagnosticBaseEvent & {
47
+ type: 'message.processed';
48
+ channel: string;
49
+ messageId?: number | string;
50
+ chatId?: number | string;
51
+ sessionKey?: string;
52
+ sessionId?: string;
53
+ durationMs?: number;
54
+ outcome: 'completed' | 'skipped' | 'error';
55
+ reason?: string;
56
+ error?: string;
57
+ };
58
+ export type DiagnosticSessionStateEvent = DiagnosticBaseEvent & {
59
+ type: 'session.state';
60
+ sessionKey?: string;
61
+ sessionId?: string;
62
+ prevState?: DiagnosticSessionState;
63
+ state: DiagnosticSessionState;
64
+ reason?: string;
65
+ queueDepth?: number;
66
+ };
67
+ export type DiagnosticSessionStuckEvent = DiagnosticBaseEvent & {
68
+ type: 'session.stuck';
69
+ sessionKey?: string;
70
+ sessionId?: string;
71
+ state: DiagnosticSessionState;
72
+ ageMs: number;
73
+ queueDepth?: number;
74
+ };
75
+ export type DiagnosticLaneEnqueueEvent = DiagnosticBaseEvent & {
76
+ type: 'queue.lane.enqueue';
77
+ lane: string;
78
+ queueSize: number;
79
+ };
80
+ export type DiagnosticLaneDequeueEvent = DiagnosticBaseEvent & {
81
+ type: 'queue.lane.dequeue';
82
+ lane: string;
83
+ queueSize: number;
84
+ waitMs: number;
85
+ };
86
+ export type DiagnosticRunAttemptEvent = DiagnosticBaseEvent & {
87
+ type: 'run.attempt';
88
+ sessionKey?: string;
89
+ sessionId?: string;
90
+ runId: string;
91
+ attempt: number;
92
+ };
93
+ export type DiagnosticModelUsageEvent = DiagnosticBaseEvent & {
94
+ type: 'model.usage';
95
+ sessionKey?: string;
96
+ sessionId?: string;
97
+ channel?: string;
98
+ provider?: string;
99
+ model?: string;
100
+ usage: {
101
+ input?: number;
102
+ output?: number;
103
+ cacheRead?: number;
104
+ cacheWrite?: number;
105
+ promptTokens?: number;
106
+ total?: number;
107
+ };
108
+ context?: {
109
+ limit?: number;
110
+ used?: number;
111
+ };
112
+ costUsd?: number;
113
+ durationMs?: number;
114
+ };
115
+ export type DiagnosticHeartbeatEvent = DiagnosticBaseEvent & {
116
+ type: 'diagnostic.heartbeat';
117
+ webhooks: {
118
+ received: number;
119
+ processed: number;
120
+ errors: number;
121
+ };
122
+ active: number;
123
+ waiting: number;
124
+ queued: number;
125
+ };
126
+ export type DiagnosticEventPayload = DiagnosticWebhookReceivedEvent | DiagnosticWebhookProcessedEvent | DiagnosticWebhookErrorEvent | DiagnosticMessageQueuedEvent | DiagnosticMessageProcessedEvent | DiagnosticSessionStateEvent | DiagnosticSessionStuckEvent | DiagnosticLaneEnqueueEvent | DiagnosticLaneDequeueEvent | DiagnosticRunAttemptEvent | DiagnosticModelUsageEvent | DiagnosticHeartbeatEvent;
127
+ export type DiagnosticEventInput = DiagnosticEventPayload extends infer Event ? Event extends DiagnosticEventPayload ? Omit<Event, 'seq' | 'ts'> : never : never;
128
+ /**
129
+ * Check if diagnostics are enabled
130
+ */
131
+ export declare function diagnosticsEnabled(): boolean;
132
+ /**
133
+ * Emit a diagnostic event
134
+ *
135
+ * @param event - Event to emit (without seq/ts)
136
+ */
137
+ export declare function emitDiagnosticEvent(event: DiagnosticEventInput): void;
138
+ /**
139
+ * Subscribe to diagnostic events
140
+ *
141
+ * @param listener - Callback function
142
+ * @returns Unsubscribe function
143
+ */
144
+ export declare function onDiagnosticEvent(listener: (evt: DiagnosticEventPayload) => void): () => void;
145
+ /**
146
+ * Get the number of subscribers
147
+ */
148
+ export declare function getSubscriberCount(): number;
149
+ /**
150
+ * Log webhook received
151
+ */
152
+ export declare function logWebhookReceived(params: {
153
+ channel: string;
154
+ updateType?: string;
155
+ chatId?: number | string;
156
+ }): void;
157
+ /**
158
+ * Log webhook processed
159
+ */
160
+ export declare function logWebhookProcessed(params: {
161
+ channel: string;
162
+ updateType?: string;
163
+ chatId?: number | string;
164
+ durationMs?: number;
165
+ }): void;
166
+ /**
167
+ * Log webhook error
168
+ */
169
+ export declare function logWebhookError(params: {
170
+ channel: string;
171
+ updateType?: string;
172
+ chatId?: number | string;
173
+ error: string;
174
+ }): void;
175
+ /**
176
+ * Log message queued
177
+ */
178
+ export declare function logMessageQueued(params: {
179
+ sessionId?: string;
180
+ sessionKey?: string;
181
+ channel?: string;
182
+ source: string;
183
+ }): void;
184
+ /**
185
+ * Log message processed
186
+ */
187
+ export declare function logMessageProcessed(params: {
188
+ channel: string;
189
+ messageId?: number | string;
190
+ chatId?: number | string;
191
+ sessionId?: string;
192
+ sessionKey?: string;
193
+ durationMs?: number;
194
+ outcome: 'completed' | 'skipped' | 'error';
195
+ reason?: string;
196
+ error?: string;
197
+ }): void;
198
+ /**
199
+ * Log model usage
200
+ */
201
+ export declare function logModelUsage(params: {
202
+ sessionId?: string;
203
+ sessionKey?: string;
204
+ channel?: string;
205
+ provider?: string;
206
+ model?: string;
207
+ inputTokens?: number;
208
+ outputTokens?: number;
209
+ cacheReadTokens?: number;
210
+ cacheWriteTokens?: number;
211
+ costUsd?: number;
212
+ durationMs?: number;
213
+ }): void;
214
+ /**
215
+ * Reset diagnostic events (for testing)
216
+ */
217
+ export declare function resetDiagnosticEventsForTest(): void;
218
+ declare const _default: {
219
+ emitDiagnosticEvent: typeof emitDiagnosticEvent;
220
+ onDiagnosticEvent: typeof onDiagnosticEvent;
221
+ diagnosticsEnabled: typeof diagnosticsEnabled;
222
+ logWebhookReceived: typeof logWebhookReceived;
223
+ logWebhookProcessed: typeof logWebhookProcessed;
224
+ logWebhookError: typeof logWebhookError;
225
+ logMessageQueued: typeof logMessageQueued;
226
+ logMessageProcessed: typeof logMessageProcessed;
227
+ logModelUsage: typeof logModelUsage;
228
+ resetDiagnosticEventsForTest: typeof resetDiagnosticEventsForTest;
229
+ };
230
+ export default _default;
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Diagnostic Events System
3
+ *
4
+ * Structured event stream for system diagnostics:
5
+ * - Webhook events (received, processed, error)
6
+ * - Message events (queued, processed)
7
+ * - Session events (state changes, stuck detection)
8
+ * - Model usage events (tokens, cost, duration)
9
+ * - Heartbeat events (system health)
10
+ *
11
+ * Based on OpenClaw's diagnostic-events.ts implementation.
12
+ */
13
+ import { createRequire } from 'node:module';
14
+ const requireConfig = createRequire(import.meta.url);
15
+ // =============================================================================
16
+ // Internal State
17
+ // =============================================================================
18
+ let seq = 0;
19
+ const listeners = new Set();
20
+ // =============================================================================
21
+ // Configuration
22
+ // =============================================================================
23
+ function isDiagnosticsEnabled() {
24
+ try {
25
+ const loaded = requireConfig('../config/config.js');
26
+ return loaded.loadConfig?.()?.diagnostics?.enabled === true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ // =============================================================================
33
+ // Public API
34
+ // =============================================================================
35
+ /**
36
+ * Check if diagnostics are enabled
37
+ */
38
+ export function diagnosticsEnabled() {
39
+ return isDiagnosticsEnabled();
40
+ }
41
+ /**
42
+ * Emit a diagnostic event
43
+ *
44
+ * @param event - Event to emit (without seq/ts)
45
+ */
46
+ export function emitDiagnosticEvent(event) {
47
+ // Always emit even if diagnostics disabled (for internal use)
48
+ // but could be gated if needed
49
+ const enriched = {
50
+ ...event,
51
+ seq: (seq += 1),
52
+ ts: Date.now(),
53
+ };
54
+ for (const listener of listeners) {
55
+ try {
56
+ listener(enriched);
57
+ }
58
+ catch {
59
+ // Ignore listener failures
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Subscribe to diagnostic events
65
+ *
66
+ * @param listener - Callback function
67
+ * @returns Unsubscribe function
68
+ */
69
+ export function onDiagnosticEvent(listener) {
70
+ listeners.add(listener);
71
+ return () => listeners.delete(listener);
72
+ }
73
+ /**
74
+ * Get the number of subscribers
75
+ */
76
+ export function getSubscriberCount() {
77
+ return listeners.size;
78
+ }
79
+ // =============================================================================
80
+ // Convenience Functions
81
+ // =============================================================================
82
+ /**
83
+ * Log webhook received
84
+ */
85
+ export function logWebhookReceived(params) {
86
+ emitDiagnosticEvent({
87
+ type: 'webhook.received',
88
+ channel: params.channel,
89
+ updateType: params.updateType,
90
+ chatId: params.chatId,
91
+ });
92
+ }
93
+ /**
94
+ * Log webhook processed
95
+ */
96
+ export function logWebhookProcessed(params) {
97
+ emitDiagnosticEvent({
98
+ type: 'webhook.processed',
99
+ channel: params.channel,
100
+ updateType: params.updateType,
101
+ chatId: params.chatId,
102
+ durationMs: params.durationMs,
103
+ });
104
+ }
105
+ /**
106
+ * Log webhook error
107
+ */
108
+ export function logWebhookError(params) {
109
+ emitDiagnosticEvent({
110
+ type: 'webhook.error',
111
+ channel: params.channel,
112
+ updateType: params.updateType,
113
+ chatId: params.chatId,
114
+ error: params.error,
115
+ });
116
+ }
117
+ /**
118
+ * Log message queued
119
+ */
120
+ export function logMessageQueued(params) {
121
+ emitDiagnosticEvent({
122
+ type: 'message.queued',
123
+ sessionId: params.sessionId,
124
+ sessionKey: params.sessionKey,
125
+ channel: params.channel,
126
+ source: params.source,
127
+ });
128
+ }
129
+ /**
130
+ * Log message processed
131
+ */
132
+ export function logMessageProcessed(params) {
133
+ emitDiagnosticEvent({
134
+ type: 'message.processed',
135
+ channel: params.channel,
136
+ messageId: params.messageId,
137
+ chatId: params.chatId,
138
+ sessionId: params.sessionId,
139
+ sessionKey: params.sessionKey,
140
+ durationMs: params.durationMs,
141
+ outcome: params.outcome,
142
+ reason: params.reason,
143
+ error: params.error,
144
+ });
145
+ }
146
+ /**
147
+ * Log model usage
148
+ */
149
+ export function logModelUsage(params) {
150
+ emitDiagnosticEvent({
151
+ type: 'model.usage',
152
+ sessionId: params.sessionId,
153
+ sessionKey: params.sessionKey,
154
+ channel: params.channel,
155
+ provider: params.provider,
156
+ model: params.model,
157
+ usage: {
158
+ input: params.inputTokens,
159
+ output: params.outputTokens,
160
+ cacheRead: params.cacheReadTokens,
161
+ cacheWrite: params.cacheWriteTokens,
162
+ },
163
+ costUsd: params.costUsd,
164
+ durationMs: params.durationMs,
165
+ });
166
+ }
167
+ // =============================================================================
168
+ // Test Helpers
169
+ // =============================================================================
170
+ /**
171
+ * Reset diagnostic events (for testing)
172
+ */
173
+ export function resetDiagnosticEventsForTest() {
174
+ seq = 0;
175
+ listeners.clear();
176
+ }
177
+ export default {
178
+ emitDiagnosticEvent,
179
+ onDiagnosticEvent,
180
+ diagnosticsEnabled,
181
+ logWebhookReceived,
182
+ logWebhookProcessed,
183
+ logWebhookError,
184
+ logMessageQueued,
185
+ logMessageProcessed,
186
+ logModelUsage,
187
+ resetDiagnosticEventsForTest,
188
+ };
189
+ //# sourceMappingURL=diagnostic-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic-events.js","sourceRoot":"","sources":["../../src/utils/diagnostic-events.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,6 @@ export interface ParsedFrontmatter<T = Record<string, unknown>> {
8
8
  }
9
9
  /**
10
10
  * Parse YAML frontmatter from markdown content
11
- * Supports both JSON and YAML-style frontmatter
12
11
  */
13
12
  export declare function parseFrontmatter<T = Record<string, unknown>>(content: string): ParsedFrontmatter<T>;
14
13
  /**
@@ -2,13 +2,13 @@
2
2
  * Frontmatter parsing utility
3
3
  * Extracts YAML frontmatter from markdown content
4
4
  */
5
+ import yaml from 'js-yaml';
5
6
  /**
6
7
  * Parse YAML frontmatter from markdown content
7
- * Supports both JSON and YAML-style frontmatter
8
8
  */
9
9
  export function parseFrontmatter(content) {
10
- // Match --- frontmatter ---
11
- const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
10
+ // Match --- frontmatter --- (supports both Unix \n and Windows \r\n line endings)
11
+ const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
12
12
  if (!frontmatterMatch) {
13
13
  return {
14
14
  frontmatter: {},
@@ -16,89 +16,25 @@ export function parseFrontmatter(content) {
16
16
  };
17
17
  }
18
18
  const [, frontmatterRaw, bodyContent] = frontmatterMatch;
19
- // Try to parse as JSON first (if wrapped in {})
20
- let frontmatter = {};
21
19
  try {
22
- const trimmed = frontmatterRaw.trim();
23
- if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
24
- frontmatter = JSON.parse(trimmed);
25
- }
26
- else {
27
- // Simple YAML-like parsing for key: value pairs
28
- frontmatter = parseSimpleYaml(trimmed);
29
- }
30
- }
31
- catch {
32
- // If parsing fails, treat as empty
33
- frontmatter = {};
20
+ const frontmatter = yaml.load(frontmatterRaw);
21
+ return {
22
+ frontmatter: (frontmatter || {}),
23
+ content: bodyContent.trim(),
24
+ };
34
25
  }
35
- return {
36
- frontmatter: frontmatter,
37
- content: bodyContent.trim(),
38
- };
39
- }
40
- /**
41
- * Simple YAML parser for key: value pairs
42
- * Handles:
43
- * - key: value
44
- * - key: "quoted value"
45
- * - key: 'quoted value'
46
- * - key: { json: object }
47
- * - key: [array, values]
48
- */
49
- function parseSimpleYaml(content) {
50
- const result = {};
51
- const lines = content.split('\n');
52
- for (const line of lines) {
53
- const colonIndex = line.indexOf(':');
54
- if (colonIndex <= 0)
55
- continue;
56
- const key = line.slice(0, colonIndex).trim();
57
- let value = line.slice(colonIndex + 1).trim();
58
- // Remove quotes
59
- if (typeof value === 'string') {
60
- if ((value.startsWith('"') && value.endsWith('"')) ||
61
- (value.startsWith("'") && value.endsWith("'"))) {
62
- value = value.slice(1, -1);
63
- }
64
- // Try to parse as JSON (for objects/arrays)
65
- const strValue = value;
66
- if ((strValue.startsWith('{') && strValue.endsWith('}')) ||
67
- (strValue.startsWith('[') && strValue.endsWith(']'))) {
68
- try {
69
- value = JSON.parse(strValue);
70
- }
71
- catch {
72
- // Keep as string if JSON parsing fails
73
- }
74
- }
75
- // Try to parse as number
76
- if (typeof value === 'string' && /^-?\d+(\.\d+)?$/.test(value)) {
77
- value = parseFloat(value);
78
- }
79
- // Parse booleans
80
- if (value === 'true')
81
- value = true;
82
- if (value === 'false')
83
- value = false;
84
- }
85
- result[key] = value;
26
+ catch (error) {
27
+ console.warn('Failed to parse frontmatter:', error);
28
+ return {
29
+ frontmatter: {},
30
+ content: bodyContent.trim(),
31
+ };
86
32
  }
87
- return result;
88
33
  }
89
34
  /**
90
35
  * Serialize frontmatter to YAML format
91
36
  */
92
37
  export function serializeFrontmatter(frontmatter) {
93
- const lines = Object.entries(frontmatter).map(([key, value]) => {
94
- if (typeof value === 'string' && (value.includes(':') || value.includes('\n'))) {
95
- return `${key}: "${value.replace(/"/g, '\\"')}"`;
96
- }
97
- if (typeof value === 'object') {
98
- return `${key}: ${JSON.stringify(value)}`;
99
- }
100
- return `${key}: ${value}`;
101
- });
102
- return `---\n${lines.join('\n')}\n---`;
38
+ return '---\n' + yaml.dump(frontmatter) + '---';
103
39
  }
104
40
  //# sourceMappingURL=frontmatter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAO3B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe;IAEf,kFAAkF;IAClF,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAErF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;YACL,WAAW,EAAE,EAAO;YACpB,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,GAAG,gBAAgB,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAA4B,CAAC;QACzE,OAAO;YACL,WAAW,EAAE,CAAC,WAAW,IAAI,EAAE,CAAM;YACrC,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE;SAC5B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO;YACL,WAAW,EAAE,EAAO;YACpB,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE;SAC5B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAoC;IACvE,OAAO,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;AAClD,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Log Streaming Module - SSE Real-time Log Delivery
3
+ *
4
+ * Provides Server-Sent Events (SSE) for real-time log streaming:
5
+ * - Subscribe to log events
6
+ * - Filter by level and module
7
+ * - Automatic cleanup on disconnect
8
+ */
9
+ export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
10
+ export interface LogEntry {
11
+ timestamp: string;
12
+ level: LogLevel;
13
+ message: string;
14
+ module?: string;
15
+ prefix?: string;
16
+ service?: string;
17
+ plugin?: string;
18
+ requestId?: string;
19
+ sessionId?: string;
20
+ userId?: string;
21
+ [key: string]: unknown;
22
+ }
23
+ export interface LogStreamOptions {
24
+ /** Minimum log level to stream */
25
+ minLevel?: LogLevel;
26
+ /** Filter by module name */
27
+ module?: string;
28
+ /** Include these levels (overrides minLevel) */
29
+ levels?: LogLevel[];
30
+ }
31
+ type LogSubscriber = (entry: LogEntry) => void;
32
+ /**
33
+ * Subscribe to log events
34
+ *
35
+ * @param subscriber - Callback function to receive log entries
36
+ * @returns Unsubscribe function
37
+ */
38
+ export declare function subscribeToLogs(subscriber: LogSubscriber): () => void;
39
+ /**
40
+ * Get number of active subscribers
41
+ */
42
+ export declare function getSubscriberCount(): number;
43
+ /**
44
+ * Check if any subscribers are active
45
+ */
46
+ export declare function hasSubscribers(): boolean;
47
+ /**
48
+ * Emit a log entry to all subscribers
49
+ *
50
+ * @internal - Called by the logger integration
51
+ */
52
+ export declare function emitLogEntry(entry: LogEntry): void;
53
+ /**
54
+ * Create a log entry from raw data
55
+ *
56
+ * @internal
57
+ */
58
+ export declare function createLogEntry(level: LogLevel, message: string, context?: Record<string, unknown>): LogEntry;
59
+ /**
60
+ * Create an SSE handler for log streaming
61
+ *
62
+ * Usage:
63
+ * ```typescript
64
+ * import { createLogStreamHandler } from './log-stream.js';
65
+ *
66
+ * app.get('/api/logs/stream', createLogStreamHandler());
67
+ * ```
68
+ */
69
+ export declare function createLogStreamHandler(): (req: Request) => Response;
70
+ /**
71
+ * Create a Hono-compatible SSE handler for log streaming
72
+ *
73
+ * Usage:
74
+ * ```typescript
75
+ * import { createLogSSEHandler } from './log-stream.js';
76
+ *
77
+ * app.get('/api/logs/stream', createLogSSEHandler());
78
+ * ```
79
+ */
80
+ export declare function createLogSSEHandler(): (c: {
81
+ req: {
82
+ raw: Request;
83
+ url: string;
84
+ };
85
+ }) => Promise<Response>;
86
+ declare const _default: {
87
+ subscribeToLogs: typeof subscribeToLogs;
88
+ getSubscriberCount: typeof getSubscriberCount;
89
+ hasSubscribers: typeof hasSubscribers;
90
+ emitLogEntry: typeof emitLogEntry;
91
+ createLogEntry: typeof createLogEntry;
92
+ createLogStreamHandler: typeof createLogStreamHandler;
93
+ createLogSSEHandler: typeof createLogSSEHandler;
94
+ };
95
+ export default _default;