@monoes/monomindcli 2.9.21 → 2.9.22

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 (61) hide show
  1. package/.claude/skills/mastermind-createorg/SKILL.md +26 -3
  2. package/dist/src/commands/events.d.ts +9 -0
  3. package/dist/src/commands/events.d.ts.map +1 -0
  4. package/dist/src/commands/events.js +89 -0
  5. package/dist/src/commands/events.js.map +1 -0
  6. package/dist/src/commands/index.d.ts +1 -1
  7. package/dist/src/commands/index.d.ts.map +1 -1
  8. package/dist/src/commands/index.js +2 -1
  9. package/dist/src/commands/index.js.map +1 -1
  10. package/dist/src/commands/org-observe.d.ts +21 -0
  11. package/dist/src/commands/org-observe.d.ts.map +1 -1
  12. package/dist/src/commands/org-observe.js +79 -0
  13. package/dist/src/commands/org-observe.js.map +1 -1
  14. package/dist/src/commands/org.d.ts.map +1 -1
  15. package/dist/src/commands/org.js +20 -0
  16. package/dist/src/commands/org.js.map +1 -1
  17. package/dist/src/orgrt/approvals.d.ts +16 -1
  18. package/dist/src/orgrt/approvals.d.ts.map +1 -1
  19. package/dist/src/orgrt/approvals.js +39 -2
  20. package/dist/src/orgrt/approvals.js.map +1 -1
  21. package/dist/src/orgrt/copilot-runner.d.ts +14 -0
  22. package/dist/src/orgrt/copilot-runner.d.ts.map +1 -0
  23. package/dist/src/orgrt/copilot-runner.js +250 -0
  24. package/dist/src/orgrt/copilot-runner.js.map +1 -0
  25. package/dist/src/orgrt/crush-runner.d.ts +24 -0
  26. package/dist/src/orgrt/crush-runner.d.ts.map +1 -0
  27. package/dist/src/orgrt/crush-runner.js +251 -0
  28. package/dist/src/orgrt/crush-runner.js.map +1 -0
  29. package/dist/src/orgrt/daemon.d.ts +40 -1
  30. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  31. package/dist/src/orgrt/daemon.js +63 -2
  32. package/dist/src/orgrt/daemon.js.map +1 -1
  33. package/dist/src/orgrt/grok-runner.d.ts +18 -0
  34. package/dist/src/orgrt/grok-runner.d.ts.map +1 -0
  35. package/dist/src/orgrt/grok-runner.js +323 -0
  36. package/dist/src/orgrt/grok-runner.js.map +1 -0
  37. package/dist/src/orgrt/pi-rpc-runner.d.ts +68 -0
  38. package/dist/src/orgrt/pi-rpc-runner.d.ts.map +1 -0
  39. package/dist/src/orgrt/pi-rpc-runner.js +400 -0
  40. package/dist/src/orgrt/pi-rpc-runner.js.map +1 -0
  41. package/dist/src/orgrt/pi-runner.d.ts +16 -0
  42. package/dist/src/orgrt/pi-runner.d.ts.map +1 -0
  43. package/dist/src/orgrt/pi-runner.js +264 -0
  44. package/dist/src/orgrt/pi-runner.js.map +1 -0
  45. package/dist/src/orgrt/qwen-runner.d.ts +18 -0
  46. package/dist/src/orgrt/qwen-runner.d.ts.map +1 -0
  47. package/dist/src/orgrt/qwen-runner.js +267 -0
  48. package/dist/src/orgrt/qwen-runner.js.map +1 -0
  49. package/dist/src/orgrt/types.d.ts +18 -0
  50. package/dist/src/orgrt/types.d.ts.map +1 -1
  51. package/dist/src/orgrt/types.js +2 -2
  52. package/dist/src/orgrt/types.js.map +1 -1
  53. package/dist/src/orgrt/usage-proxy.d.ts +32 -0
  54. package/dist/src/orgrt/usage-proxy.d.ts.map +1 -0
  55. package/dist/src/orgrt/usage-proxy.js +226 -0
  56. package/dist/src/orgrt/usage-proxy.js.map +1 -0
  57. package/dist/src/ui/dashboard.html +63 -0
  58. package/dist/src/ui/orgs.html +8 -1
  59. package/dist/src/ui/routes-org.mjs +26 -0
  60. package/dist/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +2 -2
@@ -0,0 +1,323 @@
1
+ // packages/@monomind/cli/src/orgrt/grok-runner.ts
2
+ /**
3
+ * GrokAgentRunner — AgentRunner impl backed by the Grok Build CLI (`grok`,
4
+ * xAI's agentic coding CLI: https://docs.x.ai/build/cli).
5
+ *
6
+ * Architectural pattern: SAME as CodexAgentRunner/KimiCodeAgentRunner — spawn
7
+ * the vendor's CLI binary, parse its NDJSON stream, normalize to
8
+ * AgentMessage. No SDK dependency.
9
+ *
10
+ * Auth: inherited from the CLI's own login flow (subscription/API key
11
+ * managed by `grok` itself). No env vars set by this runner.
12
+ *
13
+ * Org tools (org_send, knowledge_search, ask_human, …) — FENCE PROTOCOL:
14
+ * Same approach as codex/kimi/opencode. Tools are rendered INTO the first
15
+ * prompt; the model emits ```tool_call fences; this runner parses them out
16
+ * of the assistant text, executes the real OrgToolDef handlers in-process
17
+ * (gated through canUseTool), and feeds results back as the next prompt.
18
+ *
19
+ * Subprocess protocol — per public docs (docs.x.ai/build/cli/reference), NOT
20
+ * byte-verified against a running binary (unlike the codex/kimi runners,
21
+ * which were checked against an installed CLI). The exact NDJSON event field
22
+ * names for `--format json` were not available at implementation time, so
23
+ * parseGrokEvents() tolerates several plausible shapes (codex-style
24
+ * `item.type === 'agent_message'`, a flat `role: 'assistant'` shape, and a
25
+ * flat `type: 'assistant'`/`'message'` shape) rather than committing to one.
26
+ * Verify against your installed `grok` version and tighten this parser if
27
+ * the real shape differs — a wrong guess here fails closed (no text
28
+ * extracted, not a crash), which is what the "no known shape matched" path
29
+ * is for.
30
+ * - Invocation: `grok -p "<prompt>" --format json [--model X] [--cwd Y]
31
+ * [--always-approve] [-r <sessionId> | -c]`
32
+ * - Session continuity: `-r/--resume [<id>]` resumes a specific session,
33
+ * `-c/--continue` resumes the most recent one. Session id is captured
34
+ * from any event carrying `session_id` / `sessionId` / `thread_id`.
35
+ * - stderr is human diagnostics; buffered and surfaced on non-zero exit.
36
+ */
37
+ import { spawn } from 'node:child_process';
38
+ import { buildToolProtocol, parseToolCalls, executeToolCall, formatToolResults, MAX_TOOL_ROUNDS, TOOL_CALL_RE } from './tool-fence.js';
39
+ const TURN_TIMEOUT_MS = 2 * 60 * 60 * 1000; // 2 hours, matching the other subprocess runners
40
+ /** Distinct from TURN_TIMEOUT_MS: catches a hung first-run interactive prompt
41
+ * (trust/telemetry gate) fast instead of waiting out the full turn timeout.
42
+ * Fires only if the process has produced ZERO stdout by this point — any
43
+ * output at all disarms it, since a slow model response is not a hang. */
44
+ const STARTUP_GRACE_MS = 45_000;
45
+ /** Pull a session/thread id out of a parsed event, tolerating the field-name
46
+ * variants different CLI versions/backends tend to use. */
47
+ function extractSessionId(ev) {
48
+ for (const key of ['session_id', 'sessionId', 'thread_id', 'threadId']) {
49
+ const v = ev[key];
50
+ if (typeof v === 'string' && v)
51
+ return v;
52
+ }
53
+ return undefined;
54
+ }
55
+ /** Pull assistant-visible text out of a parsed event, tolerating the shape
56
+ * variants documented (or plausible) for `grok --format json`:
57
+ * - codex-style: { type: 'item.completed', item: { type: 'agent_message', text } }
58
+ * - flat role shape: { role: 'assistant', content: '...' | [{type:'text',text}] }
59
+ * - flat type shape: { type: 'assistant' | 'message', text: '...' } */
60
+ function extractText(ev) {
61
+ const item = ev.item;
62
+ if (item && (item.type === 'agent_message' || item.type === 'message') && typeof item.text === 'string') {
63
+ return item.text;
64
+ }
65
+ if (ev.role === 'assistant') {
66
+ const content = ev.content;
67
+ if (typeof content === 'string')
68
+ return content;
69
+ if (Array.isArray(content)) {
70
+ return content
71
+ .filter((b) => !!b && typeof b === 'object' && b.type === 'text')
72
+ .map((b) => b.text)
73
+ .join('\n');
74
+ }
75
+ }
76
+ if ((ev.type === 'assistant' || ev.type === 'message') && typeof ev.text === 'string') {
77
+ return ev.text;
78
+ }
79
+ return undefined;
80
+ }
81
+ /** Pull usage totals out of a parsed event, tolerating openai-ish
82
+ * (prompt_tokens/completion_tokens) and codex-ish (input_tokens/output_tokens)
83
+ * field names. */
84
+ function extractUsage(ev) {
85
+ const usage = ev.usage;
86
+ if (!usage)
87
+ return undefined;
88
+ const input = usage.input_tokens ?? usage.prompt_tokens;
89
+ const output = usage.output_tokens ?? usage.completion_tokens;
90
+ if (typeof input === 'number' || typeof output === 'number') {
91
+ return { input: typeof input === 'number' ? input : 0, output: typeof output === 'number' ? output : 0 };
92
+ }
93
+ return undefined;
94
+ }
95
+ /** Pure NDJSON parser — exported so it can be unit tested against fixture
96
+ * lines without spawning the real CLI (see grok-runner.test.ts). */
97
+ export function parseGrokEvents(lines) {
98
+ const rawTexts = [];
99
+ let sessionId;
100
+ let inputTokens = 0;
101
+ let outputTokens = 0;
102
+ let error;
103
+ for (const line of lines) {
104
+ const trimmed = line.trim();
105
+ if (!trimmed || !trimmed.startsWith('{'))
106
+ continue;
107
+ let ev;
108
+ try {
109
+ ev = JSON.parse(trimmed);
110
+ }
111
+ catch {
112
+ continue;
113
+ }
114
+ const sid = extractSessionId(ev);
115
+ if (sid)
116
+ sessionId = sid;
117
+ const text = extractText(ev);
118
+ if (text)
119
+ rawTexts.push(text);
120
+ const usage = extractUsage(ev);
121
+ if (usage) {
122
+ inputTokens = usage.input;
123
+ outputTokens = usage.output;
124
+ }
125
+ if (ev.type === 'error' || ev.type === 'turn.failed') {
126
+ const errMsg = ev.error?.message ?? ev.message;
127
+ if (typeof errMsg === 'string')
128
+ error = errMsg;
129
+ }
130
+ }
131
+ const texts = rawTexts.map((t) => t.replace(TOOL_CALL_RE, '').trim());
132
+ return { texts, rawTexts, sessionId, inputTokens, outputTokens, error };
133
+ }
134
+ export class GrokAgentRunner {
135
+ grokBin;
136
+ constructor(grokBin) {
137
+ this.grokBin = grokBin;
138
+ }
139
+ async *run(args) {
140
+ const bin = this.grokBin || process.env.GROK_CLI_BIN || 'grok';
141
+ let sessionId = args.resume;
142
+ try {
143
+ for await (const p of args.prompt) {
144
+ const text = typeof p === 'string' ? p : (p?.message?.content ?? String(p ?? ''));
145
+ let nextPrompt = text;
146
+ let turnInputTokens = 0;
147
+ let turnOutputTokens = 0;
148
+ for (let round = 0; round <= MAX_TOOL_ROUNDS; round++) {
149
+ // Gated on !sessionId alone, NOT `round === 0 && !sessionId` — if
150
+ // a session id never gets parsed out of grok's output (a real
151
+ // risk, per this file's header: the exact event shape is a
152
+ // documented guess), every round after the first would otherwise
153
+ // spawn a completely fresh, contextless grok invocation carrying
154
+ // only the tool-result text — no system prompt, no session to
155
+ // resume. Once a session id IS captured, --resume takes over and
156
+ // this stops re-sending the system prompt.
157
+ const promptWithSystem = !sessionId
158
+ ? `${args.systemPrompt}${buildToolProtocol(args.tools)}\n\n---\n\n${nextPrompt}`
159
+ : nextPrompt;
160
+ const outcome = await this.runTurn(bin, promptWithSystem, sessionId, args);
161
+ if (outcome.sessionId)
162
+ sessionId = outcome.sessionId;
163
+ if (outcome.hangSuspected) {
164
+ throw new Error(`GrokAgentRunner: grok produced no output within ${STARTUP_GRACE_MS / 1000}s and was killed. ` +
165
+ 'This usually means it is stuck on a first-run interactive prompt (trust/telemetry gate) ' +
166
+ 'that headless mode has no way to answer. Run `grok` once manually in a real terminal in ' +
167
+ `this project to accept any prompts, then retry.${outcome.stderrTail ? `\nstderr: ${outcome.stderrTail.slice(-500)}` : ''}`);
168
+ }
169
+ if (outcome.exitCode !== 0 || outcome.error) {
170
+ throw new Error(`GrokAgentRunner: grok failed (exit ${outcome.exitCode})` +
171
+ (outcome.timedOut ? ` — killed after exceeding the ${TURN_TIMEOUT_MS / 3_600_000}h turn timeout` : '') +
172
+ (outcome.error ? `: ${outcome.error}` : '') +
173
+ (outcome.stderrTail ? `\nstderr: ${outcome.stderrTail.slice(-500)}` : ''));
174
+ }
175
+ for (const t of outcome.texts) {
176
+ if (t.trim())
177
+ yield { type: 'assistant', session_id: sessionId, text: t };
178
+ }
179
+ turnInputTokens += outcome.inputTokens;
180
+ turnOutputTokens += outcome.outputTokens;
181
+ const malformed = [];
182
+ const calls = parseToolCalls(outcome.rawTexts, (raw, err) => malformed.push(`[monomind] ignored malformed tool_call fence (${err}): ${raw.slice(0, 200)}`));
183
+ for (const note of malformed)
184
+ yield { type: 'assistant', session_id: sessionId, text: note };
185
+ if (calls.length === 0)
186
+ break;
187
+ if (round === MAX_TOOL_ROUNDS) {
188
+ yield {
189
+ type: 'assistant', session_id: sessionId,
190
+ text: `[monomind] tool-call round cap (${MAX_TOOL_ROUNDS}) reached — dropping ${calls.length} pending tool call(s)`,
191
+ };
192
+ break;
193
+ }
194
+ const results = [];
195
+ for (const call of calls)
196
+ results.push(await executeToolCall(args.tools, call, args.canUseTool));
197
+ nextPrompt = formatToolResults(calls, results);
198
+ }
199
+ yield {
200
+ type: 'result',
201
+ session_id: sessionId,
202
+ subtype: 'success',
203
+ input_tokens: turnInputTokens,
204
+ output_tokens: turnOutputTokens,
205
+ };
206
+ }
207
+ }
208
+ catch (err) {
209
+ if (err.code === 'ENOENT') {
210
+ throw new Error('GrokAgentRunner requires the Grok Build CLI (grok) on PATH. ' +
211
+ 'Install it per https://docs.x.ai/build/cli, then log in. ' +
212
+ 'Or unset the runtime to use Claude.');
213
+ }
214
+ throw err;
215
+ }
216
+ }
217
+ runTurn(bin, prompt, sessionId, args) {
218
+ return new Promise((resolve, reject) => {
219
+ const cliArgs = ['-p', prompt, '--format', 'json', '--always-approve'];
220
+ if (args.model)
221
+ cliArgs.push('--model', args.model);
222
+ cliArgs.push('--cwd', args.cwd);
223
+ if (sessionId)
224
+ cliArgs.push('--resume', sessionId);
225
+ const child = spawn(bin, cliArgs, {
226
+ cwd: args.cwd,
227
+ env: { ...process.env, ...args.env },
228
+ stdio: ['ignore', 'pipe', 'pipe'],
229
+ });
230
+ let stderrTail = '';
231
+ child.stderr?.on('data', (c) => { stderrTail = (stderrTail + c.toString()).slice(-4000); });
232
+ let sawOutput = false;
233
+ let timedOut = false;
234
+ let hangSuspected = false;
235
+ const KILL_GRACE_MS = 5000;
236
+ let killTimer;
237
+ const timer = setTimeout(() => {
238
+ timedOut = true;
239
+ child.kill('SIGTERM');
240
+ killTimer = setTimeout(() => { try {
241
+ child.kill('SIGKILL');
242
+ }
243
+ catch { /* already gone */ } }, KILL_GRACE_MS);
244
+ killTimer.unref?.();
245
+ }, TURN_TIMEOUT_MS);
246
+ // See STARTUP_GRACE_MS — disarmed by the first stdout chunk below.
247
+ let hangTimer = setTimeout(() => {
248
+ hangSuspected = true;
249
+ child.kill('SIGTERM');
250
+ killTimer = setTimeout(() => { try {
251
+ child.kill('SIGKILL');
252
+ }
253
+ catch { /* already gone */ } }, KILL_GRACE_MS);
254
+ killTimer.unref?.();
255
+ }, STARTUP_GRACE_MS);
256
+ const exitPromise = new Promise((res, rej) => {
257
+ child.on('error', rej);
258
+ child.on('close', (code) => res(code ?? 1));
259
+ });
260
+ exitPromise.catch(() => { });
261
+ const readLines = (async () => {
262
+ const lines = [];
263
+ let buf = '';
264
+ for await (const chunk of child.stdout) {
265
+ if (!sawOutput) {
266
+ sawOutput = true;
267
+ if (hangTimer) {
268
+ clearTimeout(hangTimer);
269
+ hangTimer = undefined;
270
+ }
271
+ }
272
+ buf += chunk.toString();
273
+ const parts = buf.split('\n');
274
+ buf = parts.pop() ?? '';
275
+ lines.push(...parts);
276
+ }
277
+ if (buf.trim())
278
+ lines.push(buf);
279
+ return lines;
280
+ })();
281
+ // Timer cleanup lives in a top-level .finally() (not nested inside a
282
+ // success-path .then()) so it runs on EITHER path — a stdout stream
283
+ // error would otherwise skip straight to reject() and leave the
284
+ // TURN_TIMEOUT_MS/hangTimer/killTimer timers running past the
285
+ // process's actual lifetime.
286
+ Promise.all([readLines, exitPromise])
287
+ .then(([lines, exitCode]) => {
288
+ const parsed = parseGrokEvents(lines);
289
+ resolve({
290
+ texts: parsed.texts,
291
+ rawTexts: parsed.rawTexts,
292
+ sessionId: parsed.sessionId ?? sessionId,
293
+ exitCode,
294
+ stderrTail,
295
+ timedOut,
296
+ hangSuspected,
297
+ inputTokens: parsed.inputTokens,
298
+ outputTokens: parsed.outputTokens,
299
+ error: parsed.error,
300
+ });
301
+ }, (err) => {
302
+ // A stdout stream error (the reject path) means the process is
303
+ // still ALIVE and unmanaged — none of the timeout/hang timers
304
+ // would have fired to kill it. Without this, that error would
305
+ // orphan the child. child.kill() on an already-dead process is a
306
+ // documented no-op, so this is safe on every path.
307
+ try {
308
+ child.kill('SIGTERM');
309
+ }
310
+ catch { /* already gone */ }
311
+ reject(err);
312
+ })
313
+ .finally(() => {
314
+ clearTimeout(timer);
315
+ if (hangTimer)
316
+ clearTimeout(hangTimer);
317
+ if (killTimer)
318
+ clearTimeout(killTimer);
319
+ });
320
+ });
321
+ }
322
+ }
323
+ //# sourceMappingURL=grok-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-runner.js","sourceRoot":"","sources":["../../../src/orgrt/grok-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { AgentRunner, AgentRunArgs, AgentMessage } from './agent-runner.js';
2
+ interface PiContentBlock {
3
+ type: string;
4
+ text?: string;
5
+ thinking?: string;
6
+ id?: string;
7
+ name?: string;
8
+ arguments?: Record<string, unknown>;
9
+ }
10
+ interface PiRpcMessage {
11
+ content?: PiContentBlock[];
12
+ }
13
+ /** Pure, transport-independent JSONL line decoder — feed it raw string
14
+ * chunks, get back every complete parsed object found so far (silently
15
+ * skipping malformed lines rather than throwing, matching this repo's
16
+ * other subprocess parsers). Exported for unit testing without a real
17
+ * subprocess. */
18
+ export declare class JsonlDecoder {
19
+ private buf;
20
+ feed(chunk: string): Record<string, unknown>[];
21
+ }
22
+ /** Encode a client→server RPC command as one LF-terminated JSON line.
23
+ * Exported for unit testing the exact wire format. */
24
+ export declare function encodePiRpcCommand(cmd: {
25
+ type: string;
26
+ message?: string;
27
+ id?: string;
28
+ }): string;
29
+ /** Extract assistant-visible text and org tool_call fences from a
30
+ * message_end event's `message.content` array. `thinking` blocks are
31
+ * dropped (internal reasoning, not meant for the bus); `toolCall` blocks
32
+ * are pi's own native tool calls, executed autonomously by pi itself —
33
+ * this runner never sees their results and doesn't need to. Exported for
34
+ * unit testing against fixture content arrays. */
35
+ export declare function extractPiRpcText(message: PiRpcMessage): string;
36
+ /** The subset of a spawned child process this runner needs — narrower than
37
+ * node:child_process's real type, and deliberately duck-typed so tests can
38
+ * supply a fake implementation (an EventEmitter-backed fake process) to
39
+ * exercise the full turn-completion state machine without a real `pi`
40
+ * binary. Given the residual protocol-inference risk documented in this
41
+ * file's header, testing the orchestration logic itself — not just the
42
+ * pure JSONL/extraction helpers — is the point of this seam. */
43
+ export interface PiRpcProcess {
44
+ stdin: {
45
+ write(data: string): void;
46
+ } | null;
47
+ stdout: {
48
+ on(event: 'data', cb: (chunk: Buffer) => void): void;
49
+ } | null;
50
+ stderr: {
51
+ on(event: 'data', cb: (chunk: Buffer) => void): void;
52
+ } | null;
53
+ on(event: 'close', cb: (code: number | null) => void): void;
54
+ on(event: 'error', cb: (err: Error) => void): void;
55
+ kill(signal?: string): void;
56
+ }
57
+ export type SpawnPiRpc = (bin: string, args: string[], opts: {
58
+ cwd: string;
59
+ env: Record<string, string | undefined>;
60
+ }) => PiRpcProcess;
61
+ export declare class PiRpcAgentRunner implements AgentRunner {
62
+ private piBin?;
63
+ private spawnFn;
64
+ constructor(piBin?: string | undefined, spawnFn?: SpawnPiRpc);
65
+ run(args: AgentRunArgs): AsyncIterable<AgentMessage>;
66
+ }
67
+ export {};
68
+ //# sourceMappingURL=pi-rpc-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-rpc-runner.d.ts","sourceRoot":"","sources":["../../../src/orgrt/pi-rpc-runner.ts"],"names":[],"mappings":"AA2DA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUjF,UAAU,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAAE;AAC7I,UAAU,YAAY;IAAG,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;CAAE;AAEtD;;;;kBAIkB;AAClB,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAM;IACjB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAW7C;CACF;AAED;uDACuD;AACvD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE/F;AAED;;;;;mDAKmD;AACnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAK9D;AAED;;;;;;iEAMiE;AACjE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5C,MAAM,EAAE;QAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,MAAM,EAAE;QAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE,KAAK,YAAY,CAAC;AAKvI,qBAAa,gBAAiB,YAAW,WAAW;IACtC,OAAO,CAAC,KAAK,CAAC;IAAU,OAAO,CAAC,OAAO;IAAnD,YAAoB,KAAK,CAAC,EAAE,MAAM,YAAA,EAAU,OAAO,GAAE,UAA8B,EAAI;IAEhF,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAqR1D;CACF"}