@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.
Files changed (209) hide show
  1. package/assets/fm-helper/agentdeck-fm-helper +0 -0
  2. package/dist/adapters/claude-code.d.ts.map +1 -1
  3. package/dist/adapters/claude-code.js +3 -0
  4. package/dist/adapters/claude-code.js.map +1 -1
  5. package/dist/adb-reverse.d.ts.map +1 -1
  6. package/dist/adb-reverse.js +4 -2
  7. package/dist/adb-reverse.js.map +1 -1
  8. package/dist/apme/collector.js +2 -2
  9. package/dist/apme/collector.js.map +1 -1
  10. package/dist/apme/outcome.js +2 -2
  11. package/dist/apme/outcome.js.map +1 -1
  12. package/dist/apme/runner.js +3 -3
  13. package/dist/apme/runner.js.map +1 -1
  14. package/dist/ble-sync-spawn.js +1 -1
  15. package/dist/ble-sync-spawn.js.map +1 -1
  16. package/dist/calendar.d.ts +82 -0
  17. package/dist/calendar.d.ts.map +1 -0
  18. package/dist/calendar.js +324 -0
  19. package/dist/calendar.js.map +1 -0
  20. package/dist/card-feed.d.ts +63 -5
  21. package/dist/card-feed.d.ts.map +1 -1
  22. package/dist/card-feed.js +218 -14
  23. package/dist/card-feed.js.map +1 -1
  24. package/dist/card-modules.d.ts +4 -0
  25. package/dist/card-modules.d.ts.map +1 -1
  26. package/dist/card-modules.js +5 -3
  27. package/dist/card-modules.js.map +1 -1
  28. package/dist/check-deps.js +4 -4
  29. package/dist/check-deps.js.map +1 -1
  30. package/dist/cli.d.ts +35 -0
  31. package/dist/cli.d.ts.map +1 -1
  32. package/dist/cli.js +269 -9
  33. package/dist/cli.js.map +1 -1
  34. package/dist/codex-otel.d.ts +89 -0
  35. package/dist/codex-otel.d.ts.map +1 -0
  36. package/dist/codex-otel.js +487 -0
  37. package/dist/codex-otel.js.map +1 -0
  38. package/dist/codex-rate-limits.d.ts.map +1 -1
  39. package/dist/codex-rate-limits.js +15 -3
  40. package/dist/codex-rate-limits.js.map +1 -1
  41. package/dist/daemon-server.d.ts +4 -0
  42. package/dist/daemon-server.d.ts.map +1 -1
  43. package/dist/daemon-server.js +880 -63
  44. package/dist/daemon-server.js.map +1 -1
  45. package/dist/daemon-ws-client.d.ts +108 -24
  46. package/dist/daemon-ws-client.d.ts.map +1 -1
  47. package/dist/daemon-ws-client.js +175 -39
  48. package/dist/daemon-ws-client.js.map +1 -1
  49. package/dist/daemon.js +1 -1
  50. package/dist/device-voice-reply.d.ts +1 -10
  51. package/dist/device-voice-reply.d.ts.map +1 -1
  52. package/dist/device-voice-reply.js +19 -36
  53. package/dist/device-voice-reply.js.map +1 -1
  54. package/dist/device-voice.d.ts +37 -0
  55. package/dist/device-voice.d.ts.map +1 -1
  56. package/dist/device-voice.js +130 -1
  57. package/dist/device-voice.js.map +1 -1
  58. package/dist/diag-analyzer.d.ts.map +1 -1
  59. package/dist/diag-analyzer.js +1 -0
  60. package/dist/diag-analyzer.js.map +1 -1
  61. package/dist/display-monitor.d.ts.map +1 -1
  62. package/dist/display-monitor.js +1 -0
  63. package/dist/display-monitor.js.map +1 -1
  64. package/dist/esp32-serial.d.ts +4 -0
  65. package/dist/esp32-serial.d.ts.map +1 -1
  66. package/dist/esp32-serial.js +6 -3
  67. package/dist/esp32-serial.js.map +1 -1
  68. package/dist/foundation-models-helper.d.ts +23 -0
  69. package/dist/foundation-models-helper.d.ts.map +1 -1
  70. package/dist/foundation-models-helper.js +90 -21
  71. package/dist/foundation-models-helper.js.map +1 -1
  72. package/dist/gateway-probe.js +1 -1
  73. package/dist/gateway-probe.js.map +1 -1
  74. package/dist/glance-frame.d.ts +64 -0
  75. package/dist/glance-frame.d.ts.map +1 -0
  76. package/dist/glance-frame.js +364 -0
  77. package/dist/glance-frame.js.map +1 -0
  78. package/dist/hook-codex-sessions.d.ts +40 -0
  79. package/dist/hook-codex-sessions.d.ts.map +1 -0
  80. package/dist/hook-codex-sessions.js +174 -0
  81. package/dist/hook-codex-sessions.js.map +1 -0
  82. package/dist/idotmatrix/idotmatrix-discover.d.ts.map +1 -1
  83. package/dist/idotmatrix/idotmatrix-discover.js +7 -4
  84. package/dist/idotmatrix/idotmatrix-discover.js.map +1 -1
  85. package/dist/idotmatrix/idotmatrix-settings.d.ts +15 -0
  86. package/dist/idotmatrix/idotmatrix-settings.d.ts.map +1 -1
  87. package/dist/idotmatrix/idotmatrix-settings.js +21 -0
  88. package/dist/idotmatrix/idotmatrix-settings.js.map +1 -1
  89. package/dist/index.d.ts +7 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +88 -7
  92. package/dist/index.js.map +1 -1
  93. package/dist/linux-service.d.ts +52 -0
  94. package/dist/linux-service.d.ts.map +1 -0
  95. package/dist/linux-service.js +206 -0
  96. package/dist/linux-service.js.map +1 -0
  97. package/dist/logger.d.ts +6 -0
  98. package/dist/logger.d.ts.map +1 -1
  99. package/dist/logger.js +15 -0
  100. package/dist/logger.js.map +1 -1
  101. package/dist/mdns-discover.d.ts +19 -0
  102. package/dist/mdns-discover.d.ts.map +1 -0
  103. package/dist/mdns-discover.js +109 -0
  104. package/dist/mdns-discover.js.map +1 -0
  105. package/dist/model-catalog.d.ts.map +1 -1
  106. package/dist/model-catalog.js +1 -0
  107. package/dist/model-catalog.js.map +1 -1
  108. package/dist/modules/adb-module.js +1 -1
  109. package/dist/modules/adb-module.js.map +1 -1
  110. package/dist/openclaw-session.d.ts +6 -0
  111. package/dist/openclaw-session.d.ts.map +1 -1
  112. package/dist/openclaw-session.js +7 -1
  113. package/dist/openclaw-session.js.map +1 -1
  114. package/dist/output-parser.d.ts +9 -0
  115. package/dist/output-parser.d.ts.map +1 -1
  116. package/dist/output-parser.js +67 -16
  117. package/dist/output-parser.js.map +1 -1
  118. package/dist/passive-observer.d.ts +57 -8
  119. package/dist/passive-observer.d.ts.map +1 -1
  120. package/dist/passive-observer.js +210 -74
  121. package/dist/passive-observer.js.map +1 -1
  122. package/dist/pixoo/pixoo-bridge.d.ts.map +1 -1
  123. package/dist/pixoo/pixoo-bridge.js +47 -6
  124. package/dist/pixoo/pixoo-bridge.js.map +1 -1
  125. package/dist/pixoo/pixoo-renderer.d.ts +2 -1
  126. package/dist/pixoo/pixoo-renderer.d.ts.map +1 -1
  127. package/dist/pixoo/pixoo-renderer.js +137 -8
  128. package/dist/pixoo/pixoo-renderer.js.map +1 -1
  129. package/dist/pocket-autonomy.d.ts +78 -0
  130. package/dist/pocket-autonomy.d.ts.map +1 -0
  131. package/dist/pocket-autonomy.js +529 -0
  132. package/dist/pocket-autonomy.js.map +1 -0
  133. package/dist/pty-manager.d.ts.map +1 -1
  134. package/dist/pty-manager.js +3 -2
  135. package/dist/pty-manager.js.map +1 -1
  136. package/dist/python-ble-runtime.d.ts +2 -0
  137. package/dist/python-ble-runtime.d.ts.map +1 -1
  138. package/dist/python-ble-runtime.js +2 -1
  139. package/dist/python-ble-runtime.js.map +1 -1
  140. package/dist/remote-sessions.d.ts +64 -0
  141. package/dist/remote-sessions.d.ts.map +1 -0
  142. package/dist/remote-sessions.js +81 -0
  143. package/dist/remote-sessions.js.map +1 -0
  144. package/dist/review-runner.js +2 -2
  145. package/dist/review-runner.js.map +1 -1
  146. package/dist/session-aggregator.d.ts +2 -0
  147. package/dist/session-aggregator.d.ts.map +1 -1
  148. package/dist/session-aggregator.js +6 -1
  149. package/dist/session-aggregator.js.map +1 -1
  150. package/dist/session-focus-relay.d.ts +47 -1
  151. package/dist/session-focus-relay.d.ts.map +1 -1
  152. package/dist/session-focus-relay.js +130 -15
  153. package/dist/session-focus-relay.js.map +1 -1
  154. package/dist/session-push-channel.d.ts +31 -0
  155. package/dist/session-push-channel.d.ts.map +1 -0
  156. package/dist/session-push-channel.js +94 -0
  157. package/dist/session-push-channel.js.map +1 -0
  158. package/dist/session-registry.d.ts +126 -0
  159. package/dist/session-registry.d.ts.map +1 -1
  160. package/dist/session-registry.js +180 -3
  161. package/dist/session-registry.js.map +1 -1
  162. package/dist/subagent-timeline.d.ts +34 -0
  163. package/dist/subagent-timeline.d.ts.map +1 -0
  164. package/dist/subagent-timeline.js +156 -0
  165. package/dist/subagent-timeline.js.map +1 -0
  166. package/dist/timebox/timebox-discover.js +1 -1
  167. package/dist/timebox/timebox-discover.js.map +1 -1
  168. package/dist/tui/gauge.d.ts +4 -2
  169. package/dist/tui/gauge.d.ts.map +1 -1
  170. package/dist/tui/gauge.js +8 -4
  171. package/dist/tui/gauge.js.map +1 -1
  172. package/dist/tui/renderer.d.ts.map +1 -1
  173. package/dist/tui/renderer.js +28 -0
  174. package/dist/tui/renderer.js.map +1 -1
  175. package/dist/types.d.ts +1 -1
  176. package/dist/types.d.ts.map +1 -1
  177. package/dist/types.js.map +1 -1
  178. package/dist/usage-api.d.ts +43 -0
  179. package/dist/usage-api.d.ts.map +1 -1
  180. package/dist/usage-api.js +114 -9
  181. package/dist/usage-api.js.map +1 -1
  182. package/dist/usage-event.d.ts +19 -0
  183. package/dist/usage-event.d.ts.map +1 -1
  184. package/dist/usage-event.js +35 -0
  185. package/dist/usage-event.js.map +1 -1
  186. package/dist/utils/project-name.d.ts.map +1 -1
  187. package/dist/utils/project-name.js +1 -0
  188. package/dist/utils/project-name.js.map +1 -1
  189. package/dist/version-check.d.ts.map +1 -1
  190. package/dist/version-check.js +3 -2
  191. package/dist/version-check.js.map +1 -1
  192. package/dist/voice-assistant.d.ts.map +1 -1
  193. package/dist/voice-assistant.js +2 -1
  194. package/dist/voice-assistant.js.map +1 -1
  195. package/dist/voice.d.ts.map +1 -1
  196. package/dist/voice.js +1 -0
  197. package/dist/voice.js.map +1 -1
  198. package/dist/weather.d.ts +72 -0
  199. package/dist/weather.d.ts.map +1 -0
  200. package/dist/weather.js +206 -0
  201. package/dist/weather.js.map +1 -0
  202. package/dist/windows-service.js +5 -5
  203. package/dist/windows-service.js.map +1 -1
  204. package/fm-helper/AgentDeckFMHelper.swift +200 -0
  205. package/fm-helper/Info.plist +27 -0
  206. package/package.json +15 -13
  207. package/scripts/build-fm-helper.mjs +35 -3
  208. package/src/idotmatrix/identity_generated.py +50 -0
  209. 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":"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"}
@@ -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;AAkI7F;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,MAA8B,GAAG,eAAe,GAAG,IAAI,CAEhG;AA+CD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA4BjF;AASD,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CAU5D"}
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
- // Stamp the rollout mtime as a secondary freshness anchor (the per-window
79
- // `stale` flag set in buildUsageEvent is authoritative).
80
- parsed.capturedAt = new Date(mtime).toISOString();
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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"}
@@ -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;AAsO1E;;;;;;;;;;;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,CAyC1E;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;AAoID;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/F,KAAK,EAAE,CAAC,GACP,CAAC,CAMH;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,CAU3F;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,CAwkGpE"}
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"}