@agentdeck/bridge 1.0.4 → 1.0.6
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/assets/fm-helper/agentdeck-fm-helper +0 -0
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +3 -0
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adb-reverse.d.ts.map +1 -1
- package/dist/adb-reverse.js +4 -2
- package/dist/adb-reverse.js.map +1 -1
- package/dist/apme/collector.js +2 -2
- package/dist/apme/collector.js.map +1 -1
- package/dist/apme/outcome.js +2 -2
- package/dist/apme/outcome.js.map +1 -1
- package/dist/apme/runner.js +3 -3
- package/dist/apme/runner.js.map +1 -1
- package/dist/ble-sync-spawn.js +1 -1
- package/dist/ble-sync-spawn.js.map +1 -1
- package/dist/calendar.d.ts +82 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +324 -0
- package/dist/calendar.js.map +1 -0
- package/dist/card-feed.d.ts +63 -5
- package/dist/card-feed.d.ts.map +1 -1
- package/dist/card-feed.js +218 -14
- package/dist/card-feed.js.map +1 -1
- package/dist/card-modules.d.ts +4 -0
- package/dist/card-modules.d.ts.map +1 -1
- package/dist/card-modules.js +5 -3
- package/dist/card-modules.js.map +1 -1
- package/dist/check-deps.js +4 -4
- package/dist/check-deps.js.map +1 -1
- package/dist/cli.d.ts +35 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +269 -9
- package/dist/cli.js.map +1 -1
- package/dist/codex-otel.d.ts +89 -0
- package/dist/codex-otel.d.ts.map +1 -0
- package/dist/codex-otel.js +487 -0
- package/dist/codex-otel.js.map +1 -0
- package/dist/codex-rate-limits.d.ts.map +1 -1
- package/dist/codex-rate-limits.js +15 -3
- package/dist/codex-rate-limits.js.map +1 -1
- package/dist/daemon-server.d.ts +4 -0
- package/dist/daemon-server.d.ts.map +1 -1
- package/dist/daemon-server.js +880 -63
- package/dist/daemon-server.js.map +1 -1
- package/dist/daemon-ws-client.d.ts +108 -24
- package/dist/daemon-ws-client.d.ts.map +1 -1
- package/dist/daemon-ws-client.js +175 -39
- package/dist/daemon-ws-client.js.map +1 -1
- package/dist/daemon.js +1 -1
- package/dist/device-voice-reply.d.ts +1 -10
- package/dist/device-voice-reply.d.ts.map +1 -1
- package/dist/device-voice-reply.js +19 -36
- package/dist/device-voice-reply.js.map +1 -1
- package/dist/device-voice.d.ts +37 -0
- package/dist/device-voice.d.ts.map +1 -1
- package/dist/device-voice.js +130 -1
- package/dist/device-voice.js.map +1 -1
- package/dist/diag-analyzer.d.ts.map +1 -1
- package/dist/diag-analyzer.js +1 -0
- package/dist/diag-analyzer.js.map +1 -1
- package/dist/display-monitor.d.ts.map +1 -1
- package/dist/display-monitor.js +1 -0
- package/dist/display-monitor.js.map +1 -1
- package/dist/esp32-serial.d.ts +4 -0
- package/dist/esp32-serial.d.ts.map +1 -1
- package/dist/esp32-serial.js +6 -3
- package/dist/esp32-serial.js.map +1 -1
- package/dist/foundation-models-helper.d.ts +23 -0
- package/dist/foundation-models-helper.d.ts.map +1 -1
- package/dist/foundation-models-helper.js +90 -21
- package/dist/foundation-models-helper.js.map +1 -1
- package/dist/gateway-probe.js +1 -1
- package/dist/gateway-probe.js.map +1 -1
- package/dist/glance-frame.d.ts +64 -0
- package/dist/glance-frame.d.ts.map +1 -0
- package/dist/glance-frame.js +364 -0
- package/dist/glance-frame.js.map +1 -0
- package/dist/hook-codex-sessions.d.ts +40 -0
- package/dist/hook-codex-sessions.d.ts.map +1 -0
- package/dist/hook-codex-sessions.js +174 -0
- package/dist/hook-codex-sessions.js.map +1 -0
- package/dist/idotmatrix/idotmatrix-discover.d.ts.map +1 -1
- package/dist/idotmatrix/idotmatrix-discover.js +7 -4
- package/dist/idotmatrix/idotmatrix-discover.js.map +1 -1
- package/dist/idotmatrix/idotmatrix-settings.d.ts +15 -0
- package/dist/idotmatrix/idotmatrix-settings.d.ts.map +1 -1
- package/dist/idotmatrix/idotmatrix-settings.js +21 -0
- package/dist/idotmatrix/idotmatrix-settings.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +88 -7
- package/dist/index.js.map +1 -1
- package/dist/linux-service.d.ts +52 -0
- package/dist/linux-service.d.ts.map +1 -0
- package/dist/linux-service.js +206 -0
- package/dist/linux-service.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +15 -0
- package/dist/logger.js.map +1 -1
- package/dist/mdns-discover.d.ts +19 -0
- package/dist/mdns-discover.d.ts.map +1 -0
- package/dist/mdns-discover.js +109 -0
- package/dist/mdns-discover.js.map +1 -0
- package/dist/model-catalog.d.ts.map +1 -1
- package/dist/model-catalog.js +1 -0
- package/dist/model-catalog.js.map +1 -1
- package/dist/modules/adb-module.js +1 -1
- package/dist/modules/adb-module.js.map +1 -1
- package/dist/openclaw-session.d.ts +6 -0
- package/dist/openclaw-session.d.ts.map +1 -1
- package/dist/openclaw-session.js +7 -1
- package/dist/openclaw-session.js.map +1 -1
- package/dist/output-parser.d.ts +9 -0
- package/dist/output-parser.d.ts.map +1 -1
- package/dist/output-parser.js +67 -16
- package/dist/output-parser.js.map +1 -1
- package/dist/passive-observer.d.ts +57 -8
- package/dist/passive-observer.d.ts.map +1 -1
- package/dist/passive-observer.js +210 -74
- package/dist/passive-observer.js.map +1 -1
- package/dist/pixoo/pixoo-bridge.d.ts.map +1 -1
- package/dist/pixoo/pixoo-bridge.js +47 -6
- package/dist/pixoo/pixoo-bridge.js.map +1 -1
- package/dist/pixoo/pixoo-renderer.d.ts +2 -1
- package/dist/pixoo/pixoo-renderer.d.ts.map +1 -1
- package/dist/pixoo/pixoo-renderer.js +137 -8
- package/dist/pixoo/pixoo-renderer.js.map +1 -1
- package/dist/pocket-autonomy.d.ts +78 -0
- package/dist/pocket-autonomy.d.ts.map +1 -0
- package/dist/pocket-autonomy.js +529 -0
- package/dist/pocket-autonomy.js.map +1 -0
- package/dist/pty-manager.d.ts.map +1 -1
- package/dist/pty-manager.js +3 -2
- package/dist/pty-manager.js.map +1 -1
- package/dist/python-ble-runtime.d.ts +2 -0
- package/dist/python-ble-runtime.d.ts.map +1 -1
- package/dist/python-ble-runtime.js +2 -1
- package/dist/python-ble-runtime.js.map +1 -1
- package/dist/remote-sessions.d.ts +64 -0
- package/dist/remote-sessions.d.ts.map +1 -0
- package/dist/remote-sessions.js +81 -0
- package/dist/remote-sessions.js.map +1 -0
- package/dist/review-runner.js +2 -2
- package/dist/review-runner.js.map +1 -1
- package/dist/session-aggregator.d.ts +2 -0
- package/dist/session-aggregator.d.ts.map +1 -1
- package/dist/session-aggregator.js +6 -1
- package/dist/session-aggregator.js.map +1 -1
- package/dist/session-focus-relay.d.ts +47 -1
- package/dist/session-focus-relay.d.ts.map +1 -1
- package/dist/session-focus-relay.js +130 -15
- package/dist/session-focus-relay.js.map +1 -1
- package/dist/session-push-channel.d.ts +31 -0
- package/dist/session-push-channel.d.ts.map +1 -0
- package/dist/session-push-channel.js +94 -0
- package/dist/session-push-channel.js.map +1 -0
- package/dist/session-registry.d.ts +126 -0
- package/dist/session-registry.d.ts.map +1 -1
- package/dist/session-registry.js +180 -3
- package/dist/session-registry.js.map +1 -1
- package/dist/subagent-timeline.d.ts +34 -0
- package/dist/subagent-timeline.d.ts.map +1 -0
- package/dist/subagent-timeline.js +156 -0
- package/dist/subagent-timeline.js.map +1 -0
- package/dist/timebox/timebox-discover.js +1 -1
- package/dist/timebox/timebox-discover.js.map +1 -1
- package/dist/tui/gauge.d.ts +4 -2
- package/dist/tui/gauge.d.ts.map +1 -1
- package/dist/tui/gauge.js +8 -4
- package/dist/tui/gauge.js.map +1 -1
- package/dist/tui/renderer.d.ts.map +1 -1
- package/dist/tui/renderer.js +28 -0
- package/dist/tui/renderer.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/usage-api.d.ts +43 -0
- package/dist/usage-api.d.ts.map +1 -1
- package/dist/usage-api.js +114 -9
- package/dist/usage-api.js.map +1 -1
- package/dist/usage-event.d.ts +19 -0
- package/dist/usage-event.d.ts.map +1 -1
- package/dist/usage-event.js +35 -0
- package/dist/usage-event.js.map +1 -1
- package/dist/utils/project-name.d.ts.map +1 -1
- package/dist/utils/project-name.js +1 -0
- package/dist/utils/project-name.js.map +1 -1
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +3 -2
- package/dist/version-check.js.map +1 -1
- package/dist/voice-assistant.d.ts.map +1 -1
- package/dist/voice-assistant.js +2 -1
- package/dist/voice-assistant.js.map +1 -1
- package/dist/voice.d.ts.map +1 -1
- package/dist/voice.js +1 -0
- package/dist/voice.js.map +1 -1
- package/dist/weather.d.ts +72 -0
- package/dist/weather.d.ts.map +1 -0
- package/dist/weather.js +206 -0
- package/dist/weather.js.map +1 -0
- package/dist/windows-service.js +5 -5
- package/dist/windows-service.js.map +1 -1
- package/fm-helper/AgentDeckFMHelper.swift +200 -0
- package/fm-helper/Info.plist +27 -0
- package/package.json +15 -13
- package/scripts/build-fm-helper.mjs +35 -3
- package/src/idotmatrix/identity_generated.py +50 -0
- package/src/idotmatrix/scan.py +33 -13
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
// codex-otel.ts — Ingest OTLP/HTTP JSON spans emitted by Codex (CLI and the
|
|
2
|
+
// ChatGPT.app Codex desktop app) and turn them into session state.
|
|
3
|
+
//
|
|
4
|
+
// Codex's OTel exporter is configured to POST at the daemon
|
|
5
|
+
// (`[otel.trace_exporter.otlp-http] endpoint = ".../otel/v1/traces"`), but only
|
|
6
|
+
// the Swift daemon implemented that route — the Node daemon answered 404 and
|
|
7
|
+
// every span was discarded. This is the Node port of
|
|
8
|
+
// `apple/AgentDeck/Daemon/Modules/CodexTelemetryModule.swift`; keep the two
|
|
9
|
+
// aligned when Codex's span vocabulary moves. The parser half is a faithful
|
|
10
|
+
// mirror (same span names, attribute aliases, cwd tiers, durable-id rules); the
|
|
11
|
+
// tracker half is deliberately Node-specific, because this daemon also has the
|
|
12
|
+
// ps/lsof passive observer that Swift (App Store, no subprocesses) cannot have —
|
|
13
|
+
// see `CodexOtelTracker`.
|
|
14
|
+
//
|
|
15
|
+
// Codex's OTel keys are not a documented stable API, so we accept several
|
|
16
|
+
// naming variants (dotted vs underscored, `codex.thread_id` vs `thread.id`) and
|
|
17
|
+
// silently drop anything unrecognized.
|
|
18
|
+
//
|
|
19
|
+
// What today's builds actually emit (measured 2026-08-04 against ChatGPT.app
|
|
20
|
+
// 150.0.7871.182 / `codex-app-server` 0.146.0-alpha.9.2, 11.5k spans):
|
|
21
|
+
// **no conversation identity at all**. `thread.id` there is the tokio worker
|
|
22
|
+
// thread ("3", "8", …) — which `isDurableSessionId` correctly rejects — and the
|
|
23
|
+
// build emits no turn-boundary span, only mid-turn `run_sampling_request` /
|
|
24
|
+
// `receiving` / tool spans. So every span folds onto the anonymous key and this
|
|
25
|
+
// module drives nothing for that build; the session comes from the ps/lsof
|
|
26
|
+
// observer, whose rollout carries the identity the spans lack. See the live
|
|
27
|
+
// fixture in `__tests__/codex-otel.test.ts` — that test is where a future build
|
|
28
|
+
// gaining `codex.thread_id` UUIDs or `turn/start` spans will show up first.
|
|
29
|
+
// Ingest cost on that traffic is ~0.44 ms per batch, so serving the route is
|
|
30
|
+
// cheap even while it yields nothing.
|
|
31
|
+
import { rawSessionId } from '@agentdeck/shared';
|
|
32
|
+
import { resolveProjectNameFromCwdCached } from './utils/project-name.js';
|
|
33
|
+
/** Singleton key for trace-backed spans that carry no durable thread id. */
|
|
34
|
+
export const ANONYMOUS_OTEL_THREAD_ID = 'otel-active';
|
|
35
|
+
/**
|
|
36
|
+
* Route Codex's OTel exporter posts to. `hooks/src/codex-install.ts`
|
|
37
|
+
* (`buildOtelEndpoint`) writes this path into `~/.codex/config.toml` and
|
|
38
|
+
* `CodexOtelRoutes` serves it on the Swift daemon — the three must agree. The
|
|
39
|
+
* hooks package carries its own literal because it has no workspace deps.
|
|
40
|
+
*/
|
|
41
|
+
export const CODEX_OTEL_TRACES_PATH = '/otel/v1/traces';
|
|
42
|
+
/**
|
|
43
|
+
* Span names that start a user turn. Their own `cwd` attribute is session-level
|
|
44
|
+
* (the workspace), unlike tool spans whose `cwd` may be subprocess-scoped. Keep
|
|
45
|
+
* aligned with the `turnStart` dispatch case below.
|
|
46
|
+
*/
|
|
47
|
+
const TURN_START_SPAN_NAMES = new Set([
|
|
48
|
+
'codex.turn',
|
|
49
|
+
'codex.turn.start',
|
|
50
|
+
'turn.start',
|
|
51
|
+
'op.dispatch.user.turn',
|
|
52
|
+
'op.dispatch.user.input.with.turn.context',
|
|
53
|
+
]);
|
|
54
|
+
const TOOL_CALL_SPAN_NAMES = new Set([
|
|
55
|
+
'codex.tool.call', 'tool.call', 'turn.tool.call', 'build.tool.call',
|
|
56
|
+
'handle.tool.call', 'handle.tool.call.with.source', 'exec.command', 'mcp.tools.call',
|
|
57
|
+
]);
|
|
58
|
+
const TOOL_RESULT_SPAN_NAMES = new Set([
|
|
59
|
+
'codex.tool.result', 'tool.result', 'tool.call.duration.ms',
|
|
60
|
+
'dispatch.tool.call.with.code.mode.result', 'handle.output.item.done',
|
|
61
|
+
]);
|
|
62
|
+
const TURN_END_SPAN_NAMES = new Set(['codex.turn.end', 'turn.end', 'session.task.turn']);
|
|
63
|
+
const ACTIVITY_SPAN_NAMES = new Set([
|
|
64
|
+
'receiving', 'handle.responses', 'responses.websocket.stream.request',
|
|
65
|
+
'model.client.stream.responses.websocket', 'stream.request',
|
|
66
|
+
]);
|
|
67
|
+
/**
|
|
68
|
+
* Attribute aliases under which Codex builds have been observed publishing the
|
|
69
|
+
* workspace directory. Centralised so the resource-level scan, the span-level
|
|
70
|
+
* scan, and the classifier read the same list.
|
|
71
|
+
*/
|
|
72
|
+
const CWD_ATTRIBUTE_KEYS = [
|
|
73
|
+
'cwd', 'codex.cwd', 'working.directory', 'working_directory', 'working.dir',
|
|
74
|
+
'workdir', 'workspace.path', 'workspace.root', 'workspace_root',
|
|
75
|
+
'project.path', 'project.root', 'project_root', 'repo.path',
|
|
76
|
+
'repository.path', 'terminal.cwd', 'process.cwd',
|
|
77
|
+
];
|
|
78
|
+
const THREAD_ID_KEYS = ['codex.thread_id', 'codex.thread.id', 'thread.id', 'thread_id', 'threadId'];
|
|
79
|
+
const TURN_ID_KEYS = ['codex.turn_id', 'turn.id', 'turn_id'];
|
|
80
|
+
const TOOL_NAME_KEYS = ['tool.name', 'tool', 'codex.tool', 'mcp.tool.name', 'mcp.tool'];
|
|
81
|
+
function isRecord(value) {
|
|
82
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
83
|
+
}
|
|
84
|
+
function recordArray(value) {
|
|
85
|
+
return Array.isArray(value) ? value.filter(isRecord) : [];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* OTLP attributes are arrays of `{ key, value: { <type>Value } }`. Flatten to a
|
|
89
|
+
* plain map so callers can dot-key into it without re-parsing the envelope.
|
|
90
|
+
*/
|
|
91
|
+
function flattenAttrs(raw) {
|
|
92
|
+
const out = {};
|
|
93
|
+
for (const kv of recordArray(raw)) {
|
|
94
|
+
const key = kv.key;
|
|
95
|
+
const wrap = kv.value;
|
|
96
|
+
if (typeof key !== 'string' || !isRecord(wrap))
|
|
97
|
+
continue;
|
|
98
|
+
if (typeof wrap.stringValue === 'string') {
|
|
99
|
+
out[key] = wrap.stringValue;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (wrap.intValue !== undefined) {
|
|
103
|
+
// OTLP encodes int64 as a number or a stringified number depending on SDK
|
|
104
|
+
// version — accept both so an exporter swap doesn't silently drop keys.
|
|
105
|
+
if (typeof wrap.intValue === 'number')
|
|
106
|
+
out[key] = wrap.intValue;
|
|
107
|
+
else if (typeof wrap.intValue === 'string' && /^-?\d+$/.test(wrap.intValue))
|
|
108
|
+
out[key] = Number(wrap.intValue);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (typeof wrap.boolValue === 'boolean') {
|
|
112
|
+
out[key] = wrap.boolValue;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (typeof wrap.doubleValue === 'number') {
|
|
116
|
+
out[key] = wrap.doubleValue;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
/** First non-empty string/int attribute among `keys`. */
|
|
123
|
+
function stringAttr(attrs, keys) {
|
|
124
|
+
for (const key of keys) {
|
|
125
|
+
const value = attrs[key];
|
|
126
|
+
if (typeof value === 'string' && value.length > 0)
|
|
127
|
+
return value;
|
|
128
|
+
if (typeof value === 'number')
|
|
129
|
+
return String(value);
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
function stripCodexPrefix(raw) {
|
|
134
|
+
return raw.startsWith('codex:') ? raw.slice('codex:'.length) : raw;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A thread id worth synthesizing a session row for: long enough to be a real
|
|
138
|
+
* conversation id and not purely numeric. Short numeric ids (`thread.id: "11"`)
|
|
139
|
+
* are turn-scoped companion-task counters — accepting them spawned ghost
|
|
140
|
+
* creatures on the dashboard.
|
|
141
|
+
*/
|
|
142
|
+
function isDurableSessionId(raw) {
|
|
143
|
+
const trimmed = stripCodexPrefix(raw).trim();
|
|
144
|
+
if (trimmed.length < 12)
|
|
145
|
+
return false;
|
|
146
|
+
return /\D/.test(trimmed);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* First attribute among `keys` whose value is durable — a preference order, not
|
|
150
|
+
* a winner-take-all early exit. Some Codex builds emit both a turn-scoped short
|
|
151
|
+
* id (`codex.thread_id: "11"`) and the real UUID (`thread.id: "019dee40-…"`) on
|
|
152
|
+
* the same span; taking the first non-empty one would drop the good id.
|
|
153
|
+
*/
|
|
154
|
+
function firstDurableAttr(attrs, keys) {
|
|
155
|
+
for (const key of keys) {
|
|
156
|
+
const value = attrs[key];
|
|
157
|
+
if (typeof value === 'string' && value.length > 0 && isDurableSessionId(value))
|
|
158
|
+
return value;
|
|
159
|
+
if (typeof value === 'number' && isDurableSessionId(String(value)))
|
|
160
|
+
return String(value);
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
function threadIdAttr(attrs) {
|
|
165
|
+
const threadId = firstDurableAttr(attrs, THREAD_ID_KEYS);
|
|
166
|
+
if (threadId)
|
|
167
|
+
return stripCodexPrefix(threadId);
|
|
168
|
+
const sessionId = firstDurableAttr(attrs, ['session_id', 'session.id']);
|
|
169
|
+
if (sessionId)
|
|
170
|
+
return stripCodexPrefix(sessionId);
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
function traceIdAttr(span) {
|
|
174
|
+
for (const key of ['traceId', 'traceID', 'trace_id']) {
|
|
175
|
+
const value = span[key];
|
|
176
|
+
if (typeof value === 'string' && value.length > 0)
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Some Codex App / app-server batches carry useful progress spans but omit a
|
|
183
|
+
* durable thread id. Rather than drop them, fold them onto one anonymous key so
|
|
184
|
+
* liveness is still observable — a singleton, so internal traces can't spawn one
|
|
185
|
+
* sprite each. Real thread ids always win.
|
|
186
|
+
*/
|
|
187
|
+
function anonymousThreadIdIfTraceBacked(span) {
|
|
188
|
+
return traceIdAttr(span) === undefined ? undefined : ANONYMOUS_OTEL_THREAD_ID;
|
|
189
|
+
}
|
|
190
|
+
function normalizeSpanName(rawName) {
|
|
191
|
+
return rawName.replaceAll('_', '.').replaceAll('/', '.');
|
|
192
|
+
}
|
|
193
|
+
function isTurnStartSpan(span) {
|
|
194
|
+
const rawName = span.name;
|
|
195
|
+
if (typeof rawName !== 'string')
|
|
196
|
+
return false;
|
|
197
|
+
return TURN_START_SPAN_NAMES.has(normalizeSpanName(rawName));
|
|
198
|
+
}
|
|
199
|
+
function cwdFromAttributes(attrs) {
|
|
200
|
+
return stringAttr(attrs, CWD_ATTRIBUTE_KEYS);
|
|
201
|
+
}
|
|
202
|
+
function inferredToolName(normalizedSpanName) {
|
|
203
|
+
return normalizedSpanName === 'exec.command' ? 'exec' : 'tool';
|
|
204
|
+
}
|
|
205
|
+
function* eachSpan(json) {
|
|
206
|
+
for (const resource of recordArray(json.resourceSpans)) {
|
|
207
|
+
const resourceAttrs = flattenAttrs(isRecord(resource.resource) ? resource.resource.attributes : undefined);
|
|
208
|
+
for (const scope of recordArray(resource.scopeSpans)) {
|
|
209
|
+
for (const span of recordArray(scope.spans)) {
|
|
210
|
+
yield { span, resourceAttrs };
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Per-thread session cwd, in two priority tiers — never batch-wide (that leaks
|
|
217
|
+
* A→B across concurrent sessions) and never from a tool/activity span's own cwd
|
|
218
|
+
* attribute (those carry per-call subprocess cwd like `exec_command`'s
|
|
219
|
+
* `process.cwd` pointing at /tmp). A wrong first value would permanently lock a
|
|
220
|
+
* session's project label, because the tracker's upgrade guard only fires once.
|
|
221
|
+
*
|
|
222
|
+
* Tier 1 — turnStart spans' own cwd. Session-level per Codex's contract.
|
|
223
|
+
* Tier 2 — resource-level cwd. Workspace-scoped for every thread under it.
|
|
224
|
+
*/
|
|
225
|
+
function buildCwdByThread(json) {
|
|
226
|
+
const cwdByThread = new Map();
|
|
227
|
+
for (const { span, resourceAttrs } of eachSpan(json)) {
|
|
228
|
+
if (!isTurnStartSpan(span))
|
|
229
|
+
continue;
|
|
230
|
+
const spanAttrs = flattenAttrs(span.attributes);
|
|
231
|
+
const cwd = cwdFromAttributes(spanAttrs);
|
|
232
|
+
if (!cwd)
|
|
233
|
+
continue;
|
|
234
|
+
const merged = { ...resourceAttrs, ...spanAttrs };
|
|
235
|
+
const threadId = threadIdAttr(merged) ?? anonymousThreadIdIfTraceBacked(span);
|
|
236
|
+
if (threadId && !cwdByThread.has(threadId))
|
|
237
|
+
cwdByThread.set(threadId, cwd);
|
|
238
|
+
}
|
|
239
|
+
for (const { span, resourceAttrs } of eachSpan(json)) {
|
|
240
|
+
const resourceCwd = cwdFromAttributes(resourceAttrs);
|
|
241
|
+
if (!resourceCwd)
|
|
242
|
+
continue;
|
|
243
|
+
const merged = { ...resourceAttrs, ...flattenAttrs(span.attributes) };
|
|
244
|
+
const threadId = threadIdAttr(merged) ?? anonymousThreadIdIfTraceBacked(span);
|
|
245
|
+
if (threadId && !cwdByThread.has(threadId))
|
|
246
|
+
cwdByThread.set(threadId, resourceCwd);
|
|
247
|
+
}
|
|
248
|
+
return cwdByThread;
|
|
249
|
+
}
|
|
250
|
+
function classify(span, resourceAttrs, cwdByThread) {
|
|
251
|
+
const rawName = span.name;
|
|
252
|
+
if (typeof rawName !== 'string')
|
|
253
|
+
return undefined;
|
|
254
|
+
const attrs = { ...resourceAttrs, ...flattenAttrs(span.attributes) };
|
|
255
|
+
const threadId = threadIdAttr(attrs) ?? anonymousThreadIdIfTraceBacked(span);
|
|
256
|
+
if (!threadId)
|
|
257
|
+
return undefined;
|
|
258
|
+
const turnId = stringAttr(attrs, TURN_ID_KEYS) ?? traceIdAttr(span) ?? '';
|
|
259
|
+
// turnStart trusts its own cwd attr, falling back to the thread map. Every
|
|
260
|
+
// other span type IGNORES its own cwd attr (subprocess-scoped) and uses only
|
|
261
|
+
// the thread-scoped fallback built above.
|
|
262
|
+
const cwd = isTurnStartSpan(span)
|
|
263
|
+
? (cwdFromAttributes(attrs) ?? cwdByThread.get(threadId))
|
|
264
|
+
: cwdByThread.get(threadId);
|
|
265
|
+
const normalized = normalizeSpanName(rawName);
|
|
266
|
+
if (TURN_START_SPAN_NAMES.has(normalized))
|
|
267
|
+
return { kind: 'turnStart', threadId, turnId, cwd };
|
|
268
|
+
if (TOOL_CALL_SPAN_NAMES.has(normalized)) {
|
|
269
|
+
const tool = stringAttr(attrs, TOOL_NAME_KEYS) ?? inferredToolName(normalized);
|
|
270
|
+
return { kind: 'toolCall', threadId, turnId, tool, cwd };
|
|
271
|
+
}
|
|
272
|
+
if (TOOL_RESULT_SPAN_NAMES.has(normalized))
|
|
273
|
+
return { kind: 'toolResult', threadId, turnId };
|
|
274
|
+
if (TURN_END_SPAN_NAMES.has(normalized))
|
|
275
|
+
return { kind: 'turnEnd', threadId, turnId };
|
|
276
|
+
if (ACTIVITY_SPAN_NAMES.has(normalized))
|
|
277
|
+
return { kind: 'activity', threadId, turnId, name: rawName, cwd };
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
/** Parse an OTLP/HTTP `ExportTraceServiceRequest` body into ordered events. */
|
|
281
|
+
export function parseCodexSpans(json) {
|
|
282
|
+
if (!isRecord(json))
|
|
283
|
+
return [];
|
|
284
|
+
const cwdByThread = buildCwdByThread(json);
|
|
285
|
+
const events = [];
|
|
286
|
+
for (const { span, resourceAttrs } of eachSpan(json)) {
|
|
287
|
+
const event = classify(span, resourceAttrs, cwdByThread);
|
|
288
|
+
if (event)
|
|
289
|
+
events.push(event);
|
|
290
|
+
}
|
|
291
|
+
return events;
|
|
292
|
+
}
|
|
293
|
+
/** Diagnostic for unrecognized future schemas — span names, not whole bodies. */
|
|
294
|
+
export function spanNameSummary(json, limit = 12) {
|
|
295
|
+
if (!isRecord(json))
|
|
296
|
+
return '';
|
|
297
|
+
const names = [];
|
|
298
|
+
for (const { span } of eachSpan(json)) {
|
|
299
|
+
if (typeof span.name === 'string' && span.name.length > 0)
|
|
300
|
+
names.push(span.name);
|
|
301
|
+
if (names.length >= limit)
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
return names.join(',');
|
|
305
|
+
}
|
|
306
|
+
/** A turn OTel says ended stops driving a synthesized row after this long. */
|
|
307
|
+
const POST_TERMINAL_TTL_MS = 60_000;
|
|
308
|
+
/** Any thread this quiet is dropped — a dead exporter must not pin a creature. */
|
|
309
|
+
const THREAD_IDLE_TTL_MS = 5 * 60_000;
|
|
310
|
+
/**
|
|
311
|
+
* How long an OTel observation may override the ps observer's state. Beyond
|
|
312
|
+
* this the rollout tail is the fresher signal again.
|
|
313
|
+
*/
|
|
314
|
+
const STATE_OVERLAY_TTL_MS = 2 * 60_000;
|
|
315
|
+
/**
|
|
316
|
+
* Thread state distilled from OTLP spans, projected onto the sessions list.
|
|
317
|
+
*
|
|
318
|
+
* The division of labour is Node-specific. Swift has no process visibility, so
|
|
319
|
+
* there OTel is the *only* Codex-app session source. Here the ps/lsof observer
|
|
320
|
+
* already produces a richer row (model, tokens, goal, context) for any Codex
|
|
321
|
+
* that holds a rollout open, so OTel plays two narrower parts:
|
|
322
|
+
*
|
|
323
|
+
* 1. Overlay — turn boundaries land in milliseconds, where the observer only
|
|
324
|
+
* re-reads the rollout tail every scan interval. When both describe the same
|
|
325
|
+
* thread, a fresh OTel state/tool wins.
|
|
326
|
+
* 2. Fallback — when no observed row matches (rollout not open, lsof blind,
|
|
327
|
+
* a Codex the process scan can't see), synthesize a `codex-app` row so the
|
|
328
|
+
* session still appears. This is the Swift-parity path.
|
|
329
|
+
*/
|
|
330
|
+
export class CodexOtelTracker {
|
|
331
|
+
threads = new Map();
|
|
332
|
+
/** Fired when ingestion changed something worth broadcasting. */
|
|
333
|
+
onChanged;
|
|
334
|
+
/** Ingest one OTLP body. Returns the number of recognized events. */
|
|
335
|
+
ingest(json, now = Date.now()) {
|
|
336
|
+
const events = parseCodexSpans(json);
|
|
337
|
+
let changed = false;
|
|
338
|
+
for (const event of events) {
|
|
339
|
+
// Anonymous trace-backed spans are liveness noise, not an identity: they
|
|
340
|
+
// must never synthesize or drive a session row (Swift parity —
|
|
341
|
+
// `shouldUseCodexOtelThreadForSessionState`).
|
|
342
|
+
if (event.threadId === ANONYMOUS_OTEL_THREAD_ID)
|
|
343
|
+
continue;
|
|
344
|
+
changed = this.apply(event, now) || changed;
|
|
345
|
+
}
|
|
346
|
+
this.sweep(now);
|
|
347
|
+
if (changed)
|
|
348
|
+
this.onChanged?.();
|
|
349
|
+
return events.length;
|
|
350
|
+
}
|
|
351
|
+
apply(event, now) {
|
|
352
|
+
const existing = this.threads.get(event.threadId);
|
|
353
|
+
// Progress-only spans keep a live turn from ageing out; they must never
|
|
354
|
+
// revive a finished or idle thread, nor open one (Swift
|
|
355
|
+
// `shouldUseCodexOtelActivityForState`). Bailing before the `lastEventAt`
|
|
356
|
+
// bump is what keeps a dead thread expiring on schedule.
|
|
357
|
+
if (event.kind === 'activity'
|
|
358
|
+
&& (!existing || existing.terminalAt !== undefined || existing.state !== 'processing')) {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
const thread = existing ?? {
|
|
362
|
+
threadId: event.threadId,
|
|
363
|
+
state: 'idle',
|
|
364
|
+
startedAt: now,
|
|
365
|
+
lastEventAt: now,
|
|
366
|
+
};
|
|
367
|
+
const before = JSON.stringify(thread);
|
|
368
|
+
thread.lastEventAt = now;
|
|
369
|
+
// cwd upgrades once, empty→set. Later spans can only carry a subprocess cwd
|
|
370
|
+
// (the parser already restricts the source), so overwriting would lock the
|
|
371
|
+
// project label onto the wrong path.
|
|
372
|
+
if (!thread.cwd && event.kind !== 'toolResult' && event.kind !== 'turnEnd' && event.cwd) {
|
|
373
|
+
thread.cwd = event.cwd;
|
|
374
|
+
}
|
|
375
|
+
switch (event.kind) {
|
|
376
|
+
case 'turnStart':
|
|
377
|
+
thread.servicedTurnId = event.turnId;
|
|
378
|
+
thread.terminalAt = undefined;
|
|
379
|
+
thread.state = 'processing';
|
|
380
|
+
thread.currentTool = undefined;
|
|
381
|
+
break;
|
|
382
|
+
case 'toolCall':
|
|
383
|
+
if (thread.terminalAt !== undefined)
|
|
384
|
+
break; // late span from a finished turn
|
|
385
|
+
thread.state = 'processing';
|
|
386
|
+
thread.currentTool = usefulToolName(event.tool);
|
|
387
|
+
break;
|
|
388
|
+
case 'toolResult':
|
|
389
|
+
if (thread.terminalAt !== undefined)
|
|
390
|
+
break;
|
|
391
|
+
thread.state = 'processing';
|
|
392
|
+
thread.currentTool = undefined;
|
|
393
|
+
break;
|
|
394
|
+
case 'turnEnd':
|
|
395
|
+
// Stop-drift guard: a `turnEnd` can land seconds late, by which point a
|
|
396
|
+
// newer prompt already opened a fresh turn. Close only the turn OTel is
|
|
397
|
+
// actually servicing; when OTel never saw this turn's start, let it
|
|
398
|
+
// close (nothing else here knows better).
|
|
399
|
+
if (thread.servicedTurnId && event.turnId && thread.servicedTurnId !== event.turnId)
|
|
400
|
+
break;
|
|
401
|
+
thread.state = 'idle';
|
|
402
|
+
thread.currentTool = undefined;
|
|
403
|
+
thread.servicedTurnId = undefined;
|
|
404
|
+
thread.terminalAt = now;
|
|
405
|
+
break;
|
|
406
|
+
case 'activity':
|
|
407
|
+
// Guarded above; reaching here only refreshes `lastEventAt`.
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
this.threads.set(event.threadId, thread);
|
|
411
|
+
return JSON.stringify(thread) !== before;
|
|
412
|
+
}
|
|
413
|
+
sweep(now) {
|
|
414
|
+
for (const [threadId, thread] of this.threads) {
|
|
415
|
+
const terminalExpired = thread.terminalAt !== undefined
|
|
416
|
+
&& now - thread.terminalAt > POST_TERMINAL_TTL_MS;
|
|
417
|
+
if (terminalExpired || now - thread.lastEventAt > THREAD_IDLE_TTL_MS) {
|
|
418
|
+
this.threads.delete(threadId);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/** Live thread snapshot (diagnostics / tests). */
|
|
423
|
+
snapshot() {
|
|
424
|
+
return [...this.threads.values()];
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Overlay fresh OTel state onto matching observed rows, and append a
|
|
428
|
+
* `codex-app` row for every thread the process scan didn't find.
|
|
429
|
+
*/
|
|
430
|
+
applyTo(observed, now = Date.now()) {
|
|
431
|
+
this.sweep(now);
|
|
432
|
+
if (this.threads.size === 0)
|
|
433
|
+
return observed;
|
|
434
|
+
const matched = new Set();
|
|
435
|
+
const overlaid = observed.map((session) => {
|
|
436
|
+
if (session.agentType !== 'codex-cli' && session.agentType !== 'codex-app')
|
|
437
|
+
return session;
|
|
438
|
+
const thread = this.threads.get(rawSessionId(session.id));
|
|
439
|
+
if (!thread)
|
|
440
|
+
return session;
|
|
441
|
+
matched.add(thread.threadId);
|
|
442
|
+
if (now - thread.lastEventAt > STATE_OVERLAY_TTL_MS)
|
|
443
|
+
return session;
|
|
444
|
+
return {
|
|
445
|
+
...session,
|
|
446
|
+
state: thread.state,
|
|
447
|
+
// `currentTask` is the observer's rollout-derived label; only replace it
|
|
448
|
+
// while OTel has a tool in flight, so a finished turn falls back to the
|
|
449
|
+
// richer text instead of blanking.
|
|
450
|
+
...(thread.currentTool ? { currentTask: thread.currentTool } : {}),
|
|
451
|
+
};
|
|
452
|
+
});
|
|
453
|
+
const synthesized = [];
|
|
454
|
+
for (const thread of this.threads.values()) {
|
|
455
|
+
if (matched.has(thread.threadId))
|
|
456
|
+
continue;
|
|
457
|
+
const cwd = thread.cwd;
|
|
458
|
+
synthesized.push({
|
|
459
|
+
id: `observed:codex-app:${thread.threadId}`,
|
|
460
|
+
port: 0,
|
|
461
|
+
pid: 0,
|
|
462
|
+
// No cwd yet means no project: borrowing a sibling session's name is how
|
|
463
|
+
// the macOS dashboard once labelled Codex with a neighbour's project.
|
|
464
|
+
projectName: cwd ? resolveProjectNameFromCwdCached(cwd) : 'Codex',
|
|
465
|
+
agentType: 'codex-app',
|
|
466
|
+
alive: true,
|
|
467
|
+
state: thread.state,
|
|
468
|
+
controlMode: 'observed',
|
|
469
|
+
cwd,
|
|
470
|
+
currentTask: thread.currentTool,
|
|
471
|
+
startedAt: new Date(thread.startedAt).toISOString(),
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
return synthesized.length > 0 ? [...overlaid, ...synthesized] : overlaid;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Drop tool labels that carry no information for a dashboard row. Codex emits
|
|
479
|
+
* `tool`/`unknown` placeholders on spans whose name attribute is missing.
|
|
480
|
+
*/
|
|
481
|
+
function usefulToolName(tool) {
|
|
482
|
+
const trimmed = tool.trim();
|
|
483
|
+
if (!trimmed || trimmed === 'tool' || trimmed === 'unknown')
|
|
484
|
+
return undefined;
|
|
485
|
+
return trimmed;
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=codex-otel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-otel.js","sourceRoot":"","sources":["../src/codex-otel.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,mEAAmE;AACnE,EAAE;AACF,4DAA4D;AAC5D,gFAAgF;AAChF,6EAA6E;AAC7E,qDAAqD;AACrD,4EAA4E;AAC5E,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,0BAA0B;AAC1B,EAAE;AACF,0EAA0E;AAC1E,gFAAgF;AAChF,uCAAuC;AACvC,EAAE;AACF,6EAA6E;AAC7E,uEAAuE;AACvE,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,2EAA2E;AAC3E,4EAA4E;AAC5E,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAC7E,sCAAsC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAU1E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AAIxD;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,uBAAuB;IACvB,0CAA0C;CAC3C,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB;IACnE,kBAAkB,EAAE,8BAA8B,EAAE,cAAc,EAAE,gBAAgB;CACrF,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,mBAAmB,EAAE,aAAa,EAAE,uBAAuB;IAC3D,0CAA0C,EAAE,yBAAyB;CACtE,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAEzF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,WAAW,EAAE,kBAAkB,EAAE,oCAAoC;IACrE,yCAAyC,EAAE,gBAAgB;CAC5D,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,aAAa;IAC3E,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB;IAC/D,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW;IAC3D,iBAAiB,EAAE,cAAc,EAAE,aAAa;CACjD,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AACpG,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC7D,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;AAExF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAY;IAChC,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,MAAM,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;QACnB,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACzD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;YAAC,SAAS;QAAC,CAAC;QACpF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,0EAA0E;YAC1E,wEAAwE;YACxE,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;iBAC3D,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9G,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAAC,SAAS;QAAC,CAAC;QACjF,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;YAAC,SAAS;QAAC,CAAC;IACtF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yDAAyD;AACzD,SAAS,UAAU,CAAC,KAAY,EAAE,IAAc;IAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAChE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAY,EAAE,IAAc;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,KAAY;IAChC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,QAAQ;QAAE,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IACxE,IAAI,SAAS;QAAE,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAClD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,IAA6B;IAChD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,8BAA8B,CAAC,IAA6B;IACnE,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CAAC,IAA6B;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAY;IACrC,OAAO,UAAU,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,gBAAgB,CAAC,kBAA0B;IAClD,OAAO,kBAAkB,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AACjE,CAAC;AAED,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAA6B;IAC9C,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACvD,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3G,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,IAA6B;IACrD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAAE,SAAS;QACrC,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7E,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW;YAAE,SAAS;QAC3B,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,QAAQ,CACf,IAA6B,EAC7B,aAAoB,EACpB,WAAgC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,KAAK,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;IAErE,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC;IAC7E,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAE1E,2EAA2E;IAC3E,6EAA6E;IAC7E,0CAA0C;IAC1C,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE9B,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC/F,IAAI,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC/E,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5F,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACtF,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC3G,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,KAAK,GAAG,EAAE;IACvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;YAAE,MAAM;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAmBD,8EAA8E;AAC9E,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,kFAAkF;AAClF,MAAM,kBAAkB,GAAG,CAAC,GAAG,MAAM,CAAC;AACtC;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAAC,GAAG,MAAM,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,gBAAgB;IACV,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE9D,iEAAiE;IACjE,SAAS,CAA2B;IAEpC,qEAAqE;IACrE,MAAM,CAAC,IAAa,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,yEAAyE;YACzE,+DAA+D;YAC/D,8CAA8C;YAC9C,IAAI,KAAK,CAAC,QAAQ,KAAK,wBAAwB;gBAAE,SAAS;YAC1D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO;YAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,KAAqB,EAAE,GAAW;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,wEAAwE;QACxE,wDAAwD;QACxD,0EAA0E;QAC1E,yDAAyD;QACzD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;eACxB,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,KAAK,YAAY,CAAC,EAAE,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAoB,QAAQ,IAAI;YAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,GAAG;SACjB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC;QAEzB,4EAA4E;QAC5E,2EAA2E;QAC3E,qCAAqC;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACxF,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACzB,CAAC;QAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,WAAW;gBACd,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;gBACrC,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC9B,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC5B,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC/B,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;oBAAE,MAAM,CAAC,iCAAiC;gBAC7E,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC5B,MAAM,CAAC,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;oBAAE,MAAM;gBAC3C,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC5B,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC/B,MAAM;YACR,KAAK,SAAS;gBACZ,wEAAwE;gBACxE,wEAAwE;gBACxE,oEAAoE;gBACpE,0CAA0C;gBAC1C,IAAI,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK,CAAC,MAAM;oBAAE,MAAM;gBAC3F,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;gBACtB,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC/B,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;gBAClC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;gBACxB,MAAM;YACR,KAAK,UAAU;gBACb,6DAA6D;gBAC7D,MAAM;QACV,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9C,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS;mBAClD,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,oBAAoB,CAAC;YACpD,IAAI,eAAe,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,kBAAkB,EAAE,CAAC;gBACrE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,QAA2B,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QAE7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACxC,IAAI,OAAO,CAAC,SAAS,KAAK,WAAW,IAAI,OAAO,CAAC,SAAS,KAAK,WAAW;gBAAE,OAAO,OAAO,CAAC;YAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM;gBAAE,OAAO,OAAO,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,oBAAoB;gBAAE,OAAO,OAAO,CAAC;YACpE,OAAO;gBACL,GAAG,OAAO;gBACV,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,yEAAyE;gBACzE,wEAAwE;gBACxE,mCAAmC;gBACnC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAsB,EAAE,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACvB,WAAW,CAAC,IAAI,CAAC;gBACf,EAAE,EAAE,sBAAsB,MAAM,CAAC,QAAQ,EAAE;gBAC3C,IAAI,EAAE,CAAC;gBACP,GAAG,EAAE,CAAC;gBACN,yEAAyE;gBACzE,sEAAsE;gBACtE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO;gBACjE,SAAS,EAAE,WAAW;gBACtB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,WAAW,EAAE,UAAU;gBACvB,GAAG;gBACH,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;aACpD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3E,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9E,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-rate-limits.d.ts","sourceRoot":"","sources":["../src/codex-rate-limits.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,eAAe,EAAwB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"codex-rate-limits.d.ts","sourceRoot":"","sources":["../src/codex-rate-limits.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,eAAe,EAAwB,MAAM,mBAAmB,CAAC;AAqI7F;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,MAA8B,GAAG,eAAe,GAAG,IAAI,CAEhG;AAuDD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAgCjF;AASD,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CAU5D"}
|
|
@@ -75,9 +75,12 @@ function parseFirstUsable(candidates) {
|
|
|
75
75
|
const tail = readTail(full);
|
|
76
76
|
const parsed = tail ? parseCodexRateLimitsFromText(tail) : null;
|
|
77
77
|
if (parsed) {
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
|
|
78
|
+
// Freshness anchor. Prefer the snapshot LINE's own timestamp over the file
|
|
79
|
+
// mtime: a rollout keeps growing with lines that carry no `rate_limits`
|
|
80
|
+
// (reasoning, tool output), so mtime drifts forward while the newest usage
|
|
81
|
+
// reading stays put — that would under-report the age of exactly the frozen
|
|
82
|
+
// snapshot this anchor exists to expose. mtime is the fallback.
|
|
83
|
+
parsed.capturedAt = parsed.capturedAt ?? new Date(mtime).toISOString();
|
|
81
84
|
return parsed;
|
|
82
85
|
}
|
|
83
86
|
}
|
|
@@ -125,6 +128,14 @@ function toCredits(raw) {
|
|
|
125
128
|
balance: raw.balance != null ? String(raw.balance) : undefined,
|
|
126
129
|
};
|
|
127
130
|
}
|
|
131
|
+
/** Normalize a rollout line's `timestamp` to ISO-8601, or undefined when the
|
|
132
|
+
* line carries none / an unparseable one (older rollout formats). */
|
|
133
|
+
function parseRolloutTimestamp(ts) {
|
|
134
|
+
if (typeof ts !== 'string' || !ts)
|
|
135
|
+
return undefined;
|
|
136
|
+
const ms = new Date(ts).getTime();
|
|
137
|
+
return isNaN(ms) ? undefined : new Date(ms).toISOString();
|
|
138
|
+
}
|
|
128
139
|
function toWindow(raw) {
|
|
129
140
|
if (!raw || typeof raw.used_percent !== 'number' || typeof raw.window_minutes !== 'number') {
|
|
130
141
|
return undefined;
|
|
@@ -169,6 +180,7 @@ export function parseCodexRateLimitsFromText(text) {
|
|
|
169
180
|
planType: typeof rl.plan_type === 'string' ? rl.plan_type : undefined,
|
|
170
181
|
limitId,
|
|
171
182
|
credits,
|
|
183
|
+
capturedAt: parseRolloutTimestamp(obj.timestamp),
|
|
172
184
|
};
|
|
173
185
|
}
|
|
174
186
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-rate-limits.js","sourceRoot":"","sources":["../src/codex-rate-limits.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codex-rate-limits.js","sourceRoot":"","sources":["../src/codex-rate-limits.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon-server.d.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import WebSocket from 'ws';
|
|
14
14
|
import { BridgeCore } from './bridge-core.js';
|
|
15
|
+
import { type ApiUsageData } from './usage-api.js';
|
|
15
16
|
/**
|
|
16
17
|
* Single-path transport dedup. A physical ESP32 can be reachable over BOTH a
|
|
17
18
|
* USB serial connection and a WiFi WebSocket at once (e.g. inkdeck/ttgo/tc001
|
|
@@ -51,6 +52,8 @@ export declare const __wifiOtaTestApi: {
|
|
|
51
52
|
performWifiEsp32Ota: typeof performWifiEsp32Ota;
|
|
52
53
|
};
|
|
53
54
|
declare function performWifiEsp32Ota(core: BridgeCore, target: string, firmwarePath: string): Promise<Record<string, unknown>>;
|
|
55
|
+
/** @internal Exported for the relay-fallback regression test. */
|
|
56
|
+
export declare function fetchUsageRelayed(selfPort: number): Promise<ApiUsageData | null>;
|
|
54
57
|
/**
|
|
55
58
|
* Stamp OpenClaw origin onto a timeline entry emitted by the Gateway adapter.
|
|
56
59
|
*
|
|
@@ -64,6 +67,7 @@ declare function performWifiEsp32Ota(core: BridgeCore, target: string, firmwareP
|
|
|
64
67
|
export declare function enrichGatewayTimelineEntry<T extends {
|
|
65
68
|
agentType?: string;
|
|
66
69
|
projectName?: string;
|
|
70
|
+
sessionId?: string;
|
|
67
71
|
}>(entry: T): T;
|
|
68
72
|
/**
|
|
69
73
|
* Classify a `/hooks/<eventName>` POST for the observed-session pipeline.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-server.d.ts","sourceRoot":"","sources":["../src/daemon-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAA8B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon-server.d.ts","sourceRoot":"","sources":["../src/daemon-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAA8B,MAAM,kBAAkB,CAAC;AAmF1E,OAAO,EAA8D,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA6P/G;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAC5C,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAClD,OAAO,CAST;AAkBD,iBAAS,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CA+C1E;AAYD,iBAAS,yBAAyB,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAStD;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAsBlE;AA6ED,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKzH;AACD,gBAAgB;AAChB,wBAAgB,wBAAwB,IAAI,IAAI,CAS/C;AACD,gBAAgB;AAChB,eAAO,MAAM,gBAAgB;;;;;CAK5B,CAAC;AAEF,iBAAe,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8F3H;AAoHD,iEAAiE;AACjE,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsBtF;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACnH,KAAK,EAAE,CAAC,GACP,CAAC,CAWH;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAA;CAAE,CAa3F;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiHD,wBAAsB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAuwHpE"}
|