@sumicom/quicksave 0.8.9 → 0.8.11

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 (112) hide show
  1. package/dist/ai/cardBuilder.d.ts +67 -2
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +364 -26
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts +14 -0
  6. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  7. package/dist/ai/claudeCliProvider.js +83 -2
  8. package/dist/ai/claudeCliProvider.js.map +1 -1
  9. package/dist/ai/claudeCodeProvider.d.ts.map +1 -1
  10. package/dist/ai/claudeCodeProvider.js +2 -0
  11. package/dist/ai/claudeCodeProvider.js.map +1 -1
  12. package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
  13. package/dist/ai/claudeSdkProvider.js +13 -2
  14. package/dist/ai/claudeSdkProvider.js.map +1 -1
  15. package/dist/ai/claudeTerminal/cardSynth.d.ts +63 -0
  16. package/dist/ai/claudeTerminal/cardSynth.d.ts.map +1 -0
  17. package/dist/ai/claudeTerminal/cardSynth.js +92 -0
  18. package/dist/ai/claudeTerminal/cardSynth.js.map +1 -0
  19. package/dist/ai/claudeTerminal/hookBridge.d.ts +56 -0
  20. package/dist/ai/claudeTerminal/hookBridge.d.ts.map +1 -0
  21. package/dist/ai/claudeTerminal/hookBridge.js +131 -0
  22. package/dist/ai/claudeTerminal/hookBridge.js.map +1 -0
  23. package/dist/ai/claudeTerminal/hookHandler.d.ts +18 -0
  24. package/dist/ai/claudeTerminal/hookHandler.d.ts.map +1 -0
  25. package/dist/ai/claudeTerminal/hookHandler.js +124 -0
  26. package/dist/ai/claudeTerminal/hookHandler.js.map +1 -0
  27. package/dist/ai/claudeTerminal/index.d.ts +5 -0
  28. package/dist/ai/claudeTerminal/index.d.ts.map +1 -0
  29. package/dist/ai/claudeTerminal/index.js +7 -0
  30. package/dist/ai/claudeTerminal/index.js.map +1 -0
  31. package/dist/ai/claudeTerminal/jsonlTail.d.ts +40 -0
  32. package/dist/ai/claudeTerminal/jsonlTail.d.ts.map +1 -0
  33. package/dist/ai/claudeTerminal/jsonlTail.js +129 -0
  34. package/dist/ai/claudeTerminal/jsonlTail.js.map +1 -0
  35. package/dist/ai/claudeTerminal/provider.d.ts +106 -0
  36. package/dist/ai/claudeTerminal/provider.d.ts.map +1 -0
  37. package/dist/ai/claudeTerminal/provider.js +579 -0
  38. package/dist/ai/claudeTerminal/provider.js.map +1 -0
  39. package/dist/ai/claudeTerminal/settingsBuilder.d.ts +44 -0
  40. package/dist/ai/claudeTerminal/settingsBuilder.d.ts.map +1 -0
  41. package/dist/ai/claudeTerminal/settingsBuilder.js +40 -0
  42. package/dist/ai/claudeTerminal/settingsBuilder.js.map +1 -0
  43. package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
  44. package/dist/ai/codexAppServer/cardAdapter.js +13 -5
  45. package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
  46. package/dist/ai/codexAppServer/provider.d.ts +13 -2
  47. package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
  48. package/dist/ai/codexAppServer/provider.js +161 -26
  49. package/dist/ai/codexAppServer/provider.js.map +1 -1
  50. package/dist/ai/profiles/project-sandbox.sb +26 -0
  51. package/dist/ai/provider.d.ts +29 -1
  52. package/dist/ai/provider.d.ts.map +1 -1
  53. package/dist/ai/provider.js +1 -0
  54. package/dist/ai/provider.js.map +1 -1
  55. package/dist/ai/queuedUserPrompts.d.ts +8 -0
  56. package/dist/ai/queuedUserPrompts.d.ts.map +1 -0
  57. package/dist/ai/queuedUserPrompts.js +19 -0
  58. package/dist/ai/queuedUserPrompts.js.map +1 -0
  59. package/dist/ai/realtimeTranscription.d.ts +39 -0
  60. package/dist/ai/realtimeTranscription.d.ts.map +1 -0
  61. package/dist/ai/realtimeTranscription.js +154 -0
  62. package/dist/ai/realtimeTranscription.js.map +1 -0
  63. package/dist/ai/sandboxMcp.d.ts +7 -0
  64. package/dist/ai/sandboxMcp.d.ts.map +1 -1
  65. package/dist/ai/sandboxMcp.js +4 -0
  66. package/dist/ai/sandboxMcp.js.map +1 -1
  67. package/dist/ai/sandboxMcpStdio.d.ts +1 -1
  68. package/dist/ai/sandboxMcpStdio.js +120 -47
  69. package/dist/ai/sandboxMcpStdio.js.map +1 -1
  70. package/dist/ai/sessionManager.d.ts +14 -0
  71. package/dist/ai/sessionManager.d.ts.map +1 -1
  72. package/dist/ai/sessionManager.js +147 -3
  73. package/dist/ai/sessionManager.js.map +1 -1
  74. package/dist/ai/sessionRegistry.d.ts +6 -0
  75. package/dist/ai/sessionRegistry.d.ts.map +1 -1
  76. package/dist/ai/sessionRegistry.js +13 -0
  77. package/dist/ai/sessionRegistry.js.map +1 -1
  78. package/dist/ai/sessionRegistryLocator.d.ts +14 -0
  79. package/dist/ai/sessionRegistryLocator.d.ts.map +1 -0
  80. package/dist/ai/sessionRegistryLocator.js +44 -0
  81. package/dist/ai/sessionRegistryLocator.js.map +1 -0
  82. package/dist/ai/systemPrompt.d.ts.map +1 -1
  83. package/dist/ai/systemPrompt.js +1 -0
  84. package/dist/ai/systemPrompt.js.map +1 -1
  85. package/dist/ai/voiceStream.d.ts +74 -0
  86. package/dist/ai/voiceStream.d.ts.map +1 -0
  87. package/dist/ai/voiceStream.js +179 -0
  88. package/dist/ai/voiceStream.js.map +1 -0
  89. package/dist/ai/voiceTranscription.d.ts +33 -0
  90. package/dist/ai/voiceTranscription.d.ts.map +1 -0
  91. package/dist/ai/voiceTranscription.js +122 -0
  92. package/dist/ai/voiceTranscription.js.map +1 -0
  93. package/dist/files/fileBrowser.d.ts.map +1 -1
  94. package/dist/files/fileBrowser.js +3 -2
  95. package/dist/files/fileBrowser.js.map +1 -1
  96. package/dist/handlers/legacyBusAdapter.d.ts +1 -1
  97. package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
  98. package/dist/handlers/legacyBusAdapter.js +6 -1
  99. package/dist/handlers/legacyBusAdapter.js.map +1 -1
  100. package/dist/handlers/messageHandler.d.ts +5 -0
  101. package/dist/handlers/messageHandler.d.ts.map +1 -1
  102. package/dist/handlers/messageHandler.js +100 -5
  103. package/dist/handlers/messageHandler.js.map +1 -1
  104. package/dist/index.js +2 -2
  105. package/dist/index.js.map +1 -1
  106. package/dist/service/ipcClient.js +1 -1
  107. package/dist/service/ipcClient.js.map +1 -1
  108. package/dist/service/run.d.ts.map +1 -1
  109. package/dist/service/run.js +74 -3
  110. package/dist/service/run.js.map +1 -1
  111. package/dist/service/types.js +1 -1
  112. package/package.json +6 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/claudeTerminal/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // SPDX-FileCopyrightText: 2026 King Young Technology
2
+ // SPDX-License-Identifier: MIT
3
+ export { ClaudeTerminalProvider } from './provider.js';
4
+ export { HookBridge } from './hookBridge.js';
5
+ export { buildHookSettings } from './settingsBuilder.js';
6
+ export { JsonlTail } from './jsonlTail.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/claudeTerminal/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,+BAA+B;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,UAAU,EAA2D,MAAM,iBAAiB,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAqB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Tail a Claude session JSONL file (~/.claude/projects/<encoded-cwd>/<sid>.jsonl).
3
+ *
4
+ * The file is append-only; claude flushes per-message (we measured per-turn
5
+ * latency for streaming text — see docs/plans/2026-05-25-claude-terminal-provider.md
6
+ * for the probe results). We poll size and parse newly-appended bytes.
7
+ *
8
+ * `fs.watch` alone is unreliable on Linux for append-only writes (it may not
9
+ * fire when the file grows but its metadata otherwise stays put), so we use
10
+ * a 50 ms polling loop with a short fast-path when fs.watch *does* fire.
11
+ *
12
+ * Emits:
13
+ * - 'message' (parsed JSON object) — once per appended line
14
+ * - 'error' (Error) — on read failure (recoverable; we keep polling)
15
+ */
16
+ import { EventEmitter } from 'node:events';
17
+ export declare class JsonlTail extends EventEmitter {
18
+ readonly path: string;
19
+ private offset;
20
+ private buf;
21
+ private pollTimer;
22
+ private watcher;
23
+ private stopped;
24
+ private inflight;
25
+ /**
26
+ * @param path - File path to tail. May not exist at construction; we'll
27
+ * poll for it to appear.
28
+ * @param startOffset - Byte offset to start tailing from. Default 0 (read
29
+ * everything that exists when we first see the file). Pass a known size
30
+ * to skip past already-seen messages.
31
+ */
32
+ constructor(path: string, startOffset?: number);
33
+ start(intervalMs?: number): void;
34
+ stop(): void;
35
+ /** Current byte offset — useful as the cutoff anchor when handing off to
36
+ * buildCardsFromHistory. */
37
+ get currentOffset(): number;
38
+ private poll;
39
+ }
40
+ //# sourceMappingURL=jsonlTail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonlTail.d.ts","sourceRoot":"","sources":["../../../src/ai/claudeTerminal/jsonlTail.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,qBAAa,SAAU,SAAQ,YAAY;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IAEzB;;;;;;OAMG;gBACS,IAAI,EAAE,MAAM,EAAE,WAAW,SAAI;IAMzC,KAAK,CAAC,UAAU,SAAK,GAAG,IAAI;IAQ5B,IAAI,IAAI,IAAI;IAYZ;iCAC6B;IAC7B,IAAI,aAAa,IAAI,MAAM,CAE1B;YAEa,IAAI;CAuDnB"}
@@ -0,0 +1,129 @@
1
+ // SPDX-FileCopyrightText: 2026 King Young Technology
2
+ // SPDX-License-Identifier: MIT
3
+ /**
4
+ * Tail a Claude session JSONL file (~/.claude/projects/<encoded-cwd>/<sid>.jsonl).
5
+ *
6
+ * The file is append-only; claude flushes per-message (we measured per-turn
7
+ * latency for streaming text — see docs/plans/2026-05-25-claude-terminal-provider.md
8
+ * for the probe results). We poll size and parse newly-appended bytes.
9
+ *
10
+ * `fs.watch` alone is unreliable on Linux for append-only writes (it may not
11
+ * fire when the file grows but its metadata otherwise stays put), so we use
12
+ * a 50 ms polling loop with a short fast-path when fs.watch *does* fire.
13
+ *
14
+ * Emits:
15
+ * - 'message' (parsed JSON object) — once per appended line
16
+ * - 'error' (Error) — on read failure (recoverable; we keep polling)
17
+ */
18
+ import { EventEmitter } from 'node:events';
19
+ import { stat, open } from 'node:fs/promises';
20
+ import { watch } from 'node:fs';
21
+ export class JsonlTail extends EventEmitter {
22
+ path;
23
+ offset;
24
+ buf = '';
25
+ pollTimer = null;
26
+ watcher = null;
27
+ stopped = false;
28
+ inflight = false;
29
+ /**
30
+ * @param path - File path to tail. May not exist at construction; we'll
31
+ * poll for it to appear.
32
+ * @param startOffset - Byte offset to start tailing from. Default 0 (read
33
+ * everything that exists when we first see the file). Pass a known size
34
+ * to skip past already-seen messages.
35
+ */
36
+ constructor(path, startOffset = 0) {
37
+ super();
38
+ this.path = path;
39
+ this.offset = startOffset;
40
+ }
41
+ start(intervalMs = 50) {
42
+ if (this.pollTimer)
43
+ return;
44
+ this.pollTimer = setInterval(() => void this.poll(), intervalMs);
45
+ // Trigger an immediate poll so callers don't wait `intervalMs` for the
46
+ // first batch of existing content.
47
+ void this.poll();
48
+ }
49
+ stop() {
50
+ this.stopped = true;
51
+ if (this.pollTimer) {
52
+ clearInterval(this.pollTimer);
53
+ this.pollTimer = null;
54
+ }
55
+ if (this.watcher) {
56
+ try {
57
+ this.watcher.close();
58
+ }
59
+ catch { /* */ }
60
+ this.watcher = null;
61
+ }
62
+ }
63
+ /** Current byte offset — useful as the cutoff anchor when handing off to
64
+ * buildCardsFromHistory. */
65
+ get currentOffset() {
66
+ return this.offset;
67
+ }
68
+ async poll() {
69
+ if (this.stopped || this.inflight)
70
+ return;
71
+ this.inflight = true;
72
+ try {
73
+ let size;
74
+ try {
75
+ const s = await stat(this.path);
76
+ size = s.size;
77
+ }
78
+ catch {
79
+ // File doesn't exist yet — just keep polling.
80
+ return;
81
+ }
82
+ // First-time-seen: arm fs.watch as a low-latency hint. fs.watch may
83
+ // miss events but we have the polling loop as a safety net.
84
+ if (!this.watcher) {
85
+ try {
86
+ this.watcher = watch(this.path, () => void this.poll());
87
+ }
88
+ catch { /* fs.watch unavailable — polling alone suffices */ }
89
+ }
90
+ if (size <= this.offset)
91
+ return;
92
+ const delta = size - this.offset;
93
+ const fd = await open(this.path, 'r');
94
+ try {
95
+ const buf = Buffer.alloc(delta);
96
+ await fd.read(buf, 0, delta, this.offset);
97
+ this.offset = size;
98
+ this.buf += buf.toString('utf8');
99
+ }
100
+ finally {
101
+ await fd.close();
102
+ }
103
+ // Emit each complete line; keep any trailing partial line for the
104
+ // next round (claude writes line-delimited JSON, but a flush may land
105
+ // mid-line if it ever happens — we have not observed it).
106
+ let nl;
107
+ while ((nl = this.buf.indexOf('\n')) !== -1) {
108
+ const line = this.buf.slice(0, nl);
109
+ this.buf = this.buf.slice(nl + 1);
110
+ if (!line.trim())
111
+ continue;
112
+ try {
113
+ const msg = JSON.parse(line);
114
+ this.emit('message', msg);
115
+ }
116
+ catch (err) {
117
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
118
+ }
119
+ }
120
+ }
121
+ catch (err) {
122
+ this.emit('error', err instanceof Error ? err : new Error(String(err)));
123
+ }
124
+ finally {
125
+ this.inflight = false;
126
+ }
127
+ }
128
+ }
129
+ //# sourceMappingURL=jsonlTail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonlTail.js","sourceRoot":"","sources":["../../../src/ai/claudeTerminal/jsonlTail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * ClaudeTerminalProvider — spawns `claude` in TUI mode inside the existing
3
+ * terminalManager PTY, intercepts turn events via hooks, tails the session
4
+ * JSONL for structured content, and bridges everything into the same
5
+ * CodingAgentProvider contract that ClaudeCliProvider satisfies.
6
+ *
7
+ * Three input channels feed cards to the PWA:
8
+ * - PTY screen → live terminal panel (handled by existing terminal:* verbs)
9
+ * - Hook events → tool_use / tool_result / turn boundary cards (low latency)
10
+ * - JSONL tail → assistant text + final reconciliation (per-message flush)
11
+ *
12
+ * See docs/plans/2026-05-25-claude-terminal-provider.md for the architecture
13
+ * rationale and probe results that justify per-message flush timing.
14
+ */
15
+ import type { AgentId } from '@sumicom/quicksave-shared';
16
+ import type { StreamCardBuilder } from '../cardBuilder.js';
17
+ import type { CodingAgentProvider, ProviderCallbacks, ProviderHistoryMode, ProviderSession, ResumeSessionOpts, StartSessionOpts } from '../provider.js';
18
+ /**
19
+ * Pick the right interpreter + handler path so the hook command works whether
20
+ * the daemon runs from source (tsx, .ts file) or compiled output (node, .js).
21
+ */
22
+ export declare function resolveHookCommand(): {
23
+ interpreter: string;
24
+ handlerPath: string;
25
+ };
26
+ export declare class ClaudeTerminalProvider implements CodingAgentProvider {
27
+ readonly id: AgentId;
28
+ readonly historyMode: ProviderHistoryMode;
29
+ readonly label = "Claude (Terminal)";
30
+ startSession(opts: StartSessionOpts, cardBuilder: StreamCardBuilder, callbacks: ProviderCallbacks): Promise<{
31
+ sessionId: string;
32
+ session: ProviderSession;
33
+ }>;
34
+ resumeSession(opts: ResumeSessionOpts, cardBuilder: StreamCardBuilder, callbacks: ProviderCallbacks): Promise<{
35
+ sessionId: string;
36
+ session: ProviderSession;
37
+ }>;
38
+ private spawn;
39
+ /**
40
+ * Type a prompt into the TUI: write the text, then submit with Enter after a
41
+ * short render gap. Resolves once the CR has been written so callers in a
42
+ * re-type loop submit one prompt at a time (no overlapping setTimeout CRs).
43
+ * This only spaces the text from the submit — it does NOT wait for the TUI to
44
+ * be ready; readiness is handled by the re-type loop in sendPromptUntilAccepted.
45
+ */
46
+ private typePrompt;
47
+ /**
48
+ * Synchronously scan the project dir for a session JSONL. For a new session,
49
+ * returns the basename of any .jsonl not present in `before`. For resume,
50
+ * returns `expectResume` once its file exists. Returns null if none match.
51
+ */
52
+ private scanForNewJsonl;
53
+ /**
54
+ * Resume: inject the follow-up prompt into the live TUI in the background.
55
+ * We already have the sessionId, so this doesn't block startSession. Drives on
56
+ * a result signal — the existing JSONL growing past its pre-prompt size — and
57
+ * re-types if the TUI ate the keystrokes before it was ready.
58
+ */
59
+ private injectResumePrompt;
60
+ /**
61
+ * After spawn, watch the project dir for a fresh .jsonl that's not in
62
+ * `before`. Returns its session id (the basename without .jsonl).
63
+ *
64
+ * For resume, the file already exists — we just wait for it to appear if it
65
+ * doesn't yet (claude touches it on startup).
66
+ */
67
+ private discoverSessionId;
68
+ private handleHookRequest;
69
+ private handleJsonlMessage;
70
+ }
71
+ export interface SendPromptUntilAcceptedOpts {
72
+ /** Type the prompt into the TUI (text + submit). Awaited each attempt. */
73
+ send: () => void | Promise<void>;
74
+ /** Check whether the prompt was accepted yet. Return a non-null token (the
75
+ * discovered sessionId, or any truthy marker) once accepted, else null. */
76
+ probe: () => string | null;
77
+ /** Overall deadline in ms. */
78
+ timeoutMs: number;
79
+ /** Delay before the first send (TUI warmup). Default 0. */
80
+ initialDelayMs?: number;
81
+ /** How long to wait for acceptance after a send before re-typing. Default 2500. */
82
+ retryIntervalMs?: number;
83
+ /** Poll cadence while waiting for acceptance. Default 100. */
84
+ pollIntervalMs?: number;
85
+ /** Optional cancel hook checked between waits — throws if it returns true. */
86
+ abort?: () => boolean;
87
+ /** Injectable for tests. */
88
+ sleep?: (ms: number) => Promise<void>;
89
+ now?: () => number;
90
+ }
91
+ /**
92
+ * Type a prompt into a freshly spawned (or resumed) claude TUI and keep
93
+ * re-typing until there's proof it was accepted, or the deadline passes.
94
+ *
95
+ * The TUI eats keystrokes sent before it finishes painting, and there's no
96
+ * reliable readiness signal, so a single fixed delay is fragile on cold boxes.
97
+ * Instead we drive on the RESULT (`probe()` going non-null — e.g. the session
98
+ * JSONL appearing or growing): send, wait one `retryIntervalMs` window for
99
+ * acceptance, and re-send if it didn't land. An already-accepted prompt flushes
100
+ * its proof well within one window, so duplicate sends are rare in practice.
101
+ *
102
+ * @returns the token `probe()` returned on acceptance.
103
+ * @throws if the deadline passes without acceptance, or `abort()` fires.
104
+ */
105
+ export declare function sendPromptUntilAccepted(opts: SendPromptUntilAcceptedOpts): Promise<string>;
106
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/ai/claudeTerminal/provider.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAc,OAAO,EAAiB,MAAM,2BAA2B,CAAC;AACpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAoDxB;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAoBjF;AAoED,qBAAa,sBAAuB,YAAW,mBAAmB;IAChE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAqB;IACzC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAkB;IAC3D,QAAQ,CAAC,KAAK,uBAAuB;IAE/B,YAAY,CAChB,IAAI,EAAE,gBAAgB,EACtB,WAAW,EAAE,iBAAiB,EAC9B,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,CAAC;IAIrD,aAAa,CACjB,IAAI,EAAE,iBAAiB,EACvB,WAAW,EAAE,iBAAiB,EAC9B,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE,CAAC;YAI7C,KAAK;IAyInB;;;;;;OAMG;YACW,UAAU;IAYxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAoBvB;;;;;OAKG;YACW,kBAAkB;IA6BhC;;;;;;OAMG;YACW,iBAAiB;IAc/B,OAAO,CAAC,iBAAiB;IA6FzB,OAAO,CAAC,kBAAkB;CAgE3B;AAMD,MAAM,WAAW,2BAA2B;IAC1C,0EAA0E;IAC1E,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC;gFAC4E;IAC5E,KAAK,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC3B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC;IACtB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiChG"}