@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.
- package/README.md +57 -52
- package/README.zh-CN.md +56 -49
- package/dist/agent/__tests__/media-processing.test.d.ts +6 -0
- package/dist/agent/__tests__/media-processing.test.js +385 -0
- package/dist/agent/__tests__/media-processing.test.js.map +1 -0
- package/dist/agent/fallback/__tests__/index.test.js +16 -5
- package/dist/agent/fallback/__tests__/index.test.js.map +1 -1
- package/dist/agent/fallback/candidates.d.ts +2 -4
- package/dist/agent/fallback/candidates.js +19 -26
- package/dist/agent/fallback/candidates.js.map +1 -1
- package/dist/agent/helpers.d.ts +1 -0
- package/dist/agent/helpers.js.map +1 -1
- package/dist/agent/index.d.ts +6 -1
- package/dist/agent/index.js +10 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/models/compat.d.ts +35 -0
- package/dist/agent/models/compat.js +110 -0
- package/dist/agent/models/compat.js.map +1 -0
- package/dist/agent/models/fallback.d.ts +38 -0
- package/dist/agent/models/fallback.js +133 -0
- package/dist/agent/models/fallback.js.map +1 -0
- package/dist/agent/models/index.d.ts +10 -0
- package/dist/agent/models/index.js +11 -0
- package/dist/agent/models/index.js.map +1 -0
- package/dist/agent/{model-manager.d.ts → models/manager.d.ts} +2 -8
- package/dist/agent/{model-manager.js → models/manager.js} +38 -24
- package/dist/agent/models/manager.js.map +1 -0
- package/dist/agent/models/scan.d.ts +46 -0
- package/dist/agent/models/scan.js +177 -0
- package/dist/agent/models/scan.js.map +1 -0
- package/dist/agent/models/selection.d.ts +44 -0
- package/dist/agent/models/selection.js +141 -0
- package/dist/agent/models/selection.js.map +1 -0
- package/dist/agent/prompt/index.js +1 -1
- package/dist/agent/prompt/index.js.map +1 -1
- package/dist/agent/service.js +34 -16
- package/dist/agent/service.js.map +1 -1
- package/dist/agent/skills/__tests__/test-framework.test.js +15 -7
- package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -1
- package/dist/agent/skills/config.d.ts +1 -1
- package/dist/agent/skills/config.js +2 -2
- package/dist/agent/skills/config.js.map +1 -1
- package/dist/agent/skills/index.js +15 -28
- package/dist/agent/skills/index.js.map +1 -1
- package/dist/agent/skills/installer.d.ts +1 -1
- package/dist/agent/skills/installer.js +1 -1
- package/dist/agent/skills/scanner.d.ts +1 -1
- package/dist/agent/skills/scanner.js +1 -1
- package/dist/agent/skills/test-framework.js +24 -23
- package/dist/agent/skills/test-framework.js.map +1 -1
- package/dist/agent/skills/types.d.ts +3 -3
- package/dist/agent/skills/types.js +1 -1
- package/dist/agent/skills/watcher.d.ts +1 -1
- package/dist/agent/skills/watcher.js +1 -1
- package/dist/agent/system-prompt.d.ts +67 -0
- package/dist/agent/system-prompt.js +351 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/tools/__tests__/send-media.test.d.ts +6 -0
- package/dist/agent/tools/__tests__/send-media.test.js +251 -0
- package/dist/agent/tools/__tests__/send-media.test.js.map +1 -0
- package/dist/agent/types.agent-defaults.d.ts +48 -0
- package/dist/agent/types.agent-defaults.js +5 -0
- package/dist/agent/types.agent-defaults.js.map +1 -0
- package/dist/agent/types.d.ts +14 -6
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/workspace.d.ts +94 -0
- package/dist/agent/workspace.js +625 -0
- package/dist/agent/workspace.js.map +1 -0
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth/index.d.ts +1 -0
- package/dist/auth/oauth/index.js +1 -0
- package/dist/auth/oauth/index.js.map +1 -1
- package/dist/auth/oauth/kimi.d.ts +2 -1
- package/dist/auth/oauth/kimi.js +51 -48
- package/dist/auth/oauth/kimi.js.map +1 -1
- package/dist/auth/oauth/minimax-cn.d.ts +12 -0
- package/dist/auth/oauth/minimax-cn.js +111 -0
- package/dist/auth/oauth/minimax-cn.js.map +1 -0
- package/dist/auth/oauth/qwen.d.ts +5 -0
- package/dist/auth/oauth/qwen.js +54 -84
- package/dist/auth/oauth/qwen.js.map +1 -1
- package/dist/auth/profiles/index.d.ts +0 -2
- package/dist/auth/profiles/index.js +0 -2
- package/dist/auth/profiles/index.js.map +1 -1
- package/dist/auth/storage.js +7 -1
- package/dist/auth/storage.js.map +1 -1
- package/dist/channels/__tests__/media-integration.test.d.ts +6 -0
- package/dist/channels/__tests__/media-integration.test.js +398 -0
- package/dist/channels/__tests__/media-integration.test.js.map +1 -0
- package/dist/channels/__tests__/media.test.d.ts +6 -0
- package/dist/channels/__tests__/media.test.js +251 -0
- package/dist/channels/__tests__/media.test.js.map +1 -0
- package/dist/channels/access-control.d.ts +1 -1
- package/dist/channels/access-control.js +1 -1
- package/dist/channels/draft-stream.d.ts +1 -1
- package/dist/channels/draft-stream.js +1 -1
- package/dist/channels/format.d.ts +1 -1
- package/dist/channels/format.js +1 -1
- package/dist/channels/telegram/command-handler.js +15 -48
- package/dist/channels/telegram/command-handler.js.map +1 -1
- package/dist/channels/telegram/plugin.js +3 -2
- package/dist/channels/telegram/plugin.js.map +1 -1
- package/dist/channels/telegram/webhook.d.ts +1 -1
- package/dist/channels/telegram/webhook.js +1 -1
- package/dist/channels/types.d.ts +1 -1
- package/dist/channels/types.js +1 -1
- package/dist/channels/update-offset-store.d.ts +1 -1
- package/dist/channels/update-offset-store.js +1 -1
- package/dist/cli/commands/auth.js +8 -23
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/gateway.js +9 -1
- package/dist/cli/commands/gateway.js.map +1 -1
- package/dist/cli/commands/models.js +35 -29
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/onboard.js +166 -115
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/setup.js +123 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/templates.d.ts +2 -0
- package/dist/cli/templates.js +1 -1
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/defaults.d.ts +19 -0
- package/dist/config/defaults.js +168 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/integration.d.ts +12 -0
- package/dist/config/integration.js +14 -0
- package/dist/config/integration.js.map +1 -0
- package/dist/config/models-json.d.ts +454 -0
- package/dist/config/models-json.js +323 -0
- package/dist/config/models-json.js.map +1 -0
- package/dist/config/paths.d.ts +2 -0
- package/dist/config/paths.js +4 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/reload.d.ts +1 -1
- package/dist/config/reload.js +3 -3
- package/dist/config/reload.js.map +1 -1
- package/dist/config/resolve-config-value.d.ts +36 -0
- package/dist/config/resolve-config-value.js +218 -0
- package/dist/config/resolve-config-value.js.map +1 -0
- package/dist/config/rules.js +3 -2
- package/dist/config/rules.js.map +1 -1
- package/dist/config/schema.d.ts +17 -884
- package/dist/config/schema.js +36 -312
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.models.d.ts +54 -0
- package/dist/config/types.models.js +2 -0
- package/dist/config/types.models.js.map +1 -0
- package/dist/cron/validation.d.ts +4 -4
- package/dist/gateway/hono/app.js +232 -78
- package/dist/gateway/hono/app.js.map +1 -1
- package/dist/gateway/hono/oauth-async.d.ts +14 -0
- package/dist/gateway/hono/oauth-async.js +285 -0
- package/dist/gateway/hono/oauth-async.js.map +1 -0
- package/dist/gateway/hono/oauth.d.ts +9 -0
- package/dist/gateway/hono/oauth.js +157 -0
- package/dist/gateway/hono/oauth.js.map +1 -0
- package/dist/gateway/hono/sse.js +5 -2
- package/dist/gateway/hono/sse.js.map +1 -1
- package/dist/gateway/process-manager.js +12 -10
- package/dist/gateway/process-manager.js.map +1 -1
- package/dist/gateway/service.d.ts +6 -2
- package/dist/gateway/service.js +20 -6
- package/dist/gateway/service.js.map +1 -1
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js +2 -0
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js.map +1 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js +5168 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js.map +1 -0
- package/dist/gateway/static/root/assets/main-DwlbPf8Z.css +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/index.js +0 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/types.d.ts +0 -2
- package/dist/plugins/types.js +0 -2
- package/dist/plugins/types.js.map +1 -1
- package/dist/providers/index.d.ts +50 -22
- package/dist/providers/index.js +276 -50
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/model-registry.d.ts +84 -0
- package/dist/providers/model-registry.js +385 -0
- package/dist/providers/model-registry.js.map +1 -0
- package/dist/types/providers.d.ts +2 -63
- package/dist/types/providers.js +1 -1
- package/dist/utils/__tests__/frontmatter.test.d.ts +4 -0
- package/dist/utils/__tests__/frontmatter.test.js +150 -0
- package/dist/utils/__tests__/frontmatter.test.js.map +1 -0
- package/dist/utils/diagnostic-events.d.ts +230 -0
- package/dist/utils/diagnostic-events.js +189 -0
- package/dist/utils/diagnostic-events.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +0 -1
- package/dist/utils/frontmatter.js +15 -79
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/log-stream.d.ts +95 -0
- package/dist/utils/log-stream.js +229 -0
- package/dist/utils/log-stream.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/redact.d.ts +73 -0
- package/dist/utils/redact.js +245 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +6 -4
- package/skills/find-skills/SKILL.md +0 -9
- package/dist/__tests__/core.test.js +0 -72
- package/dist/__tests__/core.test.js.map +0 -1
- package/dist/agent/model-manager.js.map +0 -1
- package/dist/cli/commands/configure.d.ts +0 -1
- package/dist/cli/commands/configure.js +0 -173
- package/dist/cli/commands/configure.js.map +0 -1
- package/dist/cli/commands/gateway-daemon.d.ts +0 -1
- package/dist/cli/commands/gateway-daemon.js +0 -141
- package/dist/cli/commands/gateway-daemon.js.map +0 -1
- package/dist/config/__tests__/diff.test.d.ts +0 -1
- package/dist/config/__tests__/diff.test.js +0 -192
- package/dist/config/__tests__/diff.test.js.map +0 -1
- package/dist/config/__tests__/loader.test.d.ts +0 -1
- package/dist/config/__tests__/loader.test.js +0 -356
- package/dist/config/__tests__/loader.test.js.map +0 -1
- package/dist/config/__tests__/paths.test.d.ts +0 -1
- package/dist/config/__tests__/paths.test.js +0 -192
- package/dist/config/__tests__/paths.test.js.map +0 -1
- package/dist/config/__tests__/reload.test.d.ts +0 -1
- package/dist/config/__tests__/reload.test.js +0 -374
- package/dist/config/__tests__/reload.test.js.map +0 -1
- package/dist/config/__tests__/rules.test.d.ts +0 -1
- package/dist/config/__tests__/rules.test.js +0 -204
- package/dist/config/__tests__/rules.test.js.map +0 -1
- package/dist/config/__tests__/schema.test.d.ts +0 -1
- package/dist/config/__tests__/schema.test.js +0 -672
- package/dist/config/__tests__/schema.test.js.map +0 -1
- package/dist/daemon/background-start.d.ts +0 -33
- package/dist/daemon/background-start.js +0 -89
- package/dist/daemon/background-start.js.map +0 -1
- package/dist/daemon/gateway-manager.d.ts +0 -87
- package/dist/daemon/gateway-manager.js +0 -324
- package/dist/daemon/gateway-manager.js.map +0 -1
- package/dist/daemon/index.d.ts +0 -5
- package/dist/daemon/index.js +0 -6
- package/dist/daemon/index.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DevbZW9K.js +0 -2227
- package/dist/gateway/static/root/assets/main-DevbZW9K.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DxZg1Nmz.css +0 -1
- package/dist/providers/__tests__/registry.test.d.ts +0 -1
- package/dist/providers/__tests__/registry.test.js +0 -110
- package/dist/providers/__tests__/registry.test.js.map +0 -1
- package/dist/providers/api-strategies.d.ts +0 -15
- package/dist/providers/api-strategies.js +0 -96
- package/dist/providers/api-strategies.js.map +0 -1
- package/dist/providers/auto-discovery.d.ts +0 -84
- package/dist/providers/auto-discovery.js +0 -236
- package/dist/providers/auto-discovery.js.map +0 -1
- package/dist/providers/config.d.ts +0 -25
- package/dist/providers/config.js +0 -42
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/model-catalog.d.ts +0 -205
- package/dist/providers/model-catalog.js +0 -1071
- package/dist/providers/model-catalog.js.map +0 -1
- package/dist/providers/models-dev-data.d.ts +0 -11
- package/dist/providers/models-dev-data.js +0 -1035
- package/dist/providers/models-dev-data.js.map +0 -1
- package/dist/providers/models-dev.d.ts +0 -30
- package/dist/providers/models-dev.js +0 -42
- package/dist/providers/models-dev.js.map +0 -1
- package/dist/providers/pi-ai.d.ts +0 -62
- package/dist/providers/pi-ai.js +0 -221
- package/dist/providers/pi-ai.js.map +0 -1
- package/dist/providers/provider-catalog.d.ts +0 -173
- package/dist/providers/provider-catalog.js +0 -834
- package/dist/providers/provider-catalog.js.map +0 -1
- package/dist/providers/registry.d.ts +0 -155
- package/dist/providers/registry.js +0 -524
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/types.d.ts +0 -95
- package/dist/providers/types.js +0 -7
- package/dist/providers/types.js.map +0 -1
- package/dist/session/chat-manager.d.ts +0 -49
- package/dist/session/chat-manager.js +0 -167
- package/dist/session/chat-manager.js.map +0 -1
- package/dist/session/chat-types.d.ts +0 -53
- package/dist/session/chat-types.js +0 -63
- package/dist/session/chat-types.js.map +0 -1
- /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
|
|
23
|
-
|
|
24
|
-
frontmatter
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
36
|
-
frontmatter:
|
|
37
|
-
|
|
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
|
-
|
|
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":"AAAA;;;GAGG;
|
|
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;
|