@flowdesk/opencode-plugin 0.1.13 → 0.1.15

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 (80) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-task-output.d.ts +29 -0
  3. package/dist/agent-task-output.d.ts.map +1 -0
  4. package/dist/agent-task-output.js +225 -0
  5. package/dist/agent-task-output.js.map +1 -0
  6. package/dist/agent-task-runner.d.ts +34 -0
  7. package/dist/agent-task-runner.d.ts.map +1 -1
  8. package/dist/agent-task-runner.js +634 -84
  9. package/dist/agent-task-runner.js.map +1 -1
  10. package/dist/auto-continue-preview-tool.d.ts +36 -0
  11. package/dist/auto-continue-preview-tool.d.ts.map +1 -0
  12. package/dist/auto-continue-preview-tool.js +119 -0
  13. package/dist/auto-continue-preview-tool.js.map +1 -0
  14. package/dist/completion-ui-cache.d.ts +6 -0
  15. package/dist/completion-ui-cache.d.ts.map +1 -0
  16. package/dist/completion-ui-cache.js +390 -0
  17. package/dist/completion-ui-cache.js.map +1 -0
  18. package/dist/event-hook-observer.d.ts +14 -0
  19. package/dist/event-hook-observer.d.ts.map +1 -0
  20. package/dist/event-hook-observer.js +257 -0
  21. package/dist/event-hook-observer.js.map +1 -0
  22. package/dist/managed-dispatch-adapter.d.ts +62 -0
  23. package/dist/managed-dispatch-adapter.d.ts.map +1 -1
  24. package/dist/managed-dispatch-adapter.js +472 -4
  25. package/dist/managed-dispatch-adapter.js.map +1 -1
  26. package/dist/model-selection-engine.d.ts +60 -0
  27. package/dist/model-selection-engine.d.ts.map +1 -0
  28. package/dist/model-selection-engine.js +242 -0
  29. package/dist/model-selection-engine.js.map +1 -0
  30. package/dist/provider-usage-live-tool.d.ts +10 -0
  31. package/dist/provider-usage-live-tool.d.ts.map +1 -1
  32. package/dist/provider-usage-live-tool.js +262 -33
  33. package/dist/provider-usage-live-tool.js.map +1 -1
  34. package/dist/server.d.ts +36 -1
  35. package/dist/server.d.ts.map +1 -1
  36. package/dist/server.js +497 -20
  37. package/dist/server.js.map +1 -1
  38. package/dist/stall-recovery.d.ts +34 -0
  39. package/dist/stall-recovery.d.ts.map +1 -1
  40. package/dist/stall-recovery.js +680 -3
  41. package/dist/stall-recovery.js.map +1 -1
  42. package/dist/status-live-tool.d.ts +54 -0
  43. package/dist/status-live-tool.d.ts.map +1 -1
  44. package/dist/status-live-tool.js +449 -44
  45. package/dist/status-live-tool.js.map +1 -1
  46. package/dist/tui-subtask-activity.d.ts +73 -0
  47. package/dist/tui-subtask-activity.d.ts.map +1 -0
  48. package/dist/tui-subtask-activity.js +271 -0
  49. package/dist/tui-subtask-activity.js.map +1 -0
  50. package/dist/tui-usage-snapshot.d.ts +14 -0
  51. package/dist/tui-usage-snapshot.d.ts.map +1 -1
  52. package/dist/tui-usage-snapshot.js +275 -8
  53. package/dist/tui-usage-snapshot.js.map +1 -1
  54. package/dist/tui.d.ts.map +1 -1
  55. package/dist/tui.js +102 -44
  56. package/dist/tui.js.map +1 -1
  57. package/dist/workflow-assign-tool.d.ts +23 -0
  58. package/dist/workflow-assign-tool.d.ts.map +1 -0
  59. package/dist/workflow-assign-tool.js +135 -0
  60. package/dist/workflow-assign-tool.js.map +1 -0
  61. package/dist/workflow-author-tool.d.ts +29 -0
  62. package/dist/workflow-author-tool.d.ts.map +1 -0
  63. package/dist/workflow-author-tool.js +227 -0
  64. package/dist/workflow-author-tool.js.map +1 -0
  65. package/dist/workflow-dispatch-tool.d.ts +12 -0
  66. package/dist/workflow-dispatch-tool.d.ts.map +1 -1
  67. package/dist/workflow-dispatch-tool.js +31 -3
  68. package/dist/workflow-dispatch-tool.js.map +1 -1
  69. package/dist/workflow-orchestrator.d.ts +31 -0
  70. package/dist/workflow-orchestrator.d.ts.map +1 -0
  71. package/dist/workflow-orchestrator.js +160 -0
  72. package/dist/workflow-orchestrator.js.map +1 -0
  73. package/dist/workflow-scheduler.d.ts.map +1 -1
  74. package/dist/workflow-scheduler.js +3 -1
  75. package/dist/workflow-scheduler.js.map +1 -1
  76. package/dist/workflow-synthesis-tool.d.ts +31 -0
  77. package/dist/workflow-synthesis-tool.d.ts.map +1 -0
  78. package/dist/workflow-synthesis-tool.js +194 -0
  79. package/dist/workflow-synthesis-tool.js.map +1 -0
  80. package/package.json +2 -2
package/README.md CHANGED
@@ -6,7 +6,7 @@ registration plus opt-in description-driven natural-language tools.
6
6
  ## Install
7
7
 
8
8
  ```bash
9
- npm install @flowdesk/opencode-plugin@^0.1.8
9
+ npm install @flowdesk/opencode-plugin@^0.1.15
10
10
  ```
11
11
 
12
12
  ## Configure
@@ -0,0 +1,29 @@
1
+ export type FlowDeskAgentTaskCompletionStatusV1 = "final" | "partial";
2
+ export type FlowDeskAgentTaskOutputKindV1 = "final_answer" | "partial_findings" | "process_notes" | "tool_trace_only" | "empty";
3
+ export interface FlowDeskAgentTaskOutputObservationV1 {
4
+ latestText: string | undefined;
5
+ terminalObserved: boolean;
6
+ terminalReason: string | undefined;
7
+ hasRunningTool: boolean;
8
+ textPartCount: number;
9
+ reasoningPartCount: number;
10
+ messageCount: number;
11
+ outputKind: FlowDeskAgentTaskOutputKindV1;
12
+ usableForSynthesis: boolean;
13
+ /**
14
+ * ADVISORY ONLY. The captured text superficially resembles a refusal or an
15
+ * error message. This is a hint for the coordinator's substance judgement; it
16
+ * NEVER causes the capture layer to drop or fail the result.
17
+ */
18
+ looksLikeRefusalOrError: boolean;
19
+ }
20
+ /**
21
+ * ADVISORY heuristic for the coordinator: does this text look like a refusal or
22
+ * a bare error message rather than a substantive answer? Capture never gates on
23
+ * this; the main coordinator uses it to decide whether to re-select and retry.
24
+ */
25
+ export declare function flowDeskTextLooksLikeRefusalOrErrorV1(text: string | undefined): boolean;
26
+ export declare function flowDeskAgentTaskMessageItems(value: unknown): unknown[];
27
+ export declare function classifyFlowDeskAgentTaskOutputKindV1(text: string | undefined): FlowDeskAgentTaskOutputKindV1;
28
+ export declare function observeFlowDeskAgentTaskOutputV1(response: unknown): FlowDeskAgentTaskOutputObservationV1;
29
+ //# sourceMappingURL=agent-task-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-task-output.d.ts","sourceRoot":"","sources":["../src/agent-task-output.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mCAAmC,GAAG,OAAO,GAAG,SAAS,CAAC;AACtE,MAAM,MAAM,6BAA6B,GACtC,cAAc,GACd,kBAAkB,GAClB,eAAe,GACf,iBAAiB,GACjB,OAAO,CAAC;AAEX,MAAM,WAAW,oCAAoC;IACpD,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,6BAA6B,CAAC;IAC1C,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,uBAAuB,EAAE,OAAO,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CA6BvF;AAUD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAmBvE;AA+CD,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,6BAA6B,CAqB7G;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,OAAO,GAAG,oCAAoC,CA4FxG"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * ADVISORY heuristic for the coordinator: does this text look like a refusal or
3
+ * a bare error message rather than a substantive answer? Capture never gates on
4
+ * this; the main coordinator uses it to decide whether to re-select and retry.
5
+ */
6
+ export function flowDeskTextLooksLikeRefusalOrErrorV1(text) {
7
+ const normalized = text?.trim().toLowerCase() ?? "";
8
+ if (normalized.length === 0)
9
+ return false;
10
+ const patterns = [
11
+ "i cannot",
12
+ "i can't",
13
+ "i can not",
14
+ "i'm unable",
15
+ "i am unable",
16
+ "i'm sorry, but i can",
17
+ "i am sorry, but i can",
18
+ "i won't be able",
19
+ "i will not be able",
20
+ "as an ai",
21
+ "i'm not able to",
22
+ "i am not able to",
23
+ "error:",
24
+ "exception:",
25
+ "traceback (most recent call last)",
26
+ "rate limit",
27
+ "rate-limited",
28
+ "request failed",
29
+ "failed to",
30
+ "unable to complete",
31
+ ];
32
+ // Only treat as refusal/error when the text is short-ish and dominated by the
33
+ // pattern, to avoid false positives on long answers that merely mention them.
34
+ const head = normalized.slice(0, 240);
35
+ return patterns.some(pattern => head.includes(pattern));
36
+ }
37
+ function isRecord(value) {
38
+ return typeof value === "object" && value !== null && !Array.isArray(value);
39
+ }
40
+ function responseData(value) {
41
+ return isRecord(value) && "data" in value ? value.data : value;
42
+ }
43
+ export function flowDeskAgentTaskMessageItems(value) {
44
+ const data = responseData(value);
45
+ if (Array.isArray(data))
46
+ return data;
47
+ if (!isRecord(data))
48
+ return [];
49
+ if (Array.isArray(data.items))
50
+ return data.items;
51
+ if (Array.isArray(data.messages))
52
+ return data.messages;
53
+ // Gemini candidates wrapper: { candidates: [{ content: { role, parts }, finishReason }] }
54
+ if (Array.isArray(data.candidates)) {
55
+ const msgs = [];
56
+ for (const candidate of data.candidates) {
57
+ if (!isRecord(candidate))
58
+ continue;
59
+ const content = isRecord(candidate.content) ? candidate.content : candidate;
60
+ const finishReason = typeof candidate.finishReason === "string" ? candidate.finishReason
61
+ : typeof candidate.finish_reason === "string" ? candidate.finish_reason : undefined;
62
+ msgs.push({ ...content, _finishReason: finishReason });
63
+ }
64
+ return msgs;
65
+ }
66
+ return [];
67
+ }
68
+ function partText(part) {
69
+ if (typeof part.text === "string")
70
+ return part.text;
71
+ return typeof part.content === "string" ? part.content : undefined;
72
+ }
73
+ function isTerminalPart(part) {
74
+ const type = typeof part.type === "string" ? part.type : "";
75
+ const reason = typeof part.reason === "string" ? part.reason : "";
76
+ return ((type === "step-finish" || type === "step_finish" || type === "finish") &&
77
+ (reason === "stop" || reason === "complete" || reason === "completed"));
78
+ }
79
+ /** Check message-level terminal signals (OpenAI finish_reason, Gemini finishReason). */
80
+ function isTerminalMessage(msg) {
81
+ // OpenAI: finish_reason at message or choice level
82
+ const fr = typeof msg.finish_reason === "string" ? msg.finish_reason
83
+ : typeof msg.finishReason === "string" ? msg.finishReason
84
+ : typeof msg._finishReason === "string" ? msg._finishReason : undefined;
85
+ if (fr !== undefined) {
86
+ const normalized = fr.toLowerCase();
87
+ if (normalized === "stop" || normalized === "end_turn" || normalized === "complete" || normalized === "completed") {
88
+ return { terminal: true, reason: fr };
89
+ }
90
+ }
91
+ // OpenAI status field
92
+ if (msg.status === "completed" || msg.status === "complete") {
93
+ return { terminal: true, reason: String(msg.status) };
94
+ }
95
+ return { terminal: false, reason: undefined };
96
+ }
97
+ function terminalReason(part) {
98
+ return typeof part.reason === "string" ? part.reason : undefined;
99
+ }
100
+ function partHasRunningTool(part) {
101
+ if (part.type === "tool" || part.tool !== undefined) {
102
+ const state = isRecord(part.state) ? part.state : undefined;
103
+ return state?.status === "running" || part.status === "running";
104
+ }
105
+ return false;
106
+ }
107
+ export function classifyFlowDeskAgentTaskOutputKindV1(text) {
108
+ const normalized = text?.trim().toLowerCase() ?? "";
109
+ if (normalized.length === 0)
110
+ return "empty";
111
+ if (normalized.includes("{") && normalized.includes("}"))
112
+ return "final_answer";
113
+ const processFragments = [
114
+ "i need to",
115
+ "i should",
116
+ "i'll ",
117
+ "i will ",
118
+ "let me",
119
+ "thinking",
120
+ "planning",
121
+ "investigating",
122
+ "clarifying",
123
+ "considering",
124
+ "i’m thinking",
125
+ ];
126
+ if (processFragments.some(fragment => normalized.includes(fragment)))
127
+ return "process_notes";
128
+ const findingFragments = ["finding", "risk", "issue", "recommend", "verdict", "summary", "plan", "fix"];
129
+ if (findingFragments.some(fragment => normalized.includes(fragment)))
130
+ return "partial_findings";
131
+ return "final_answer";
132
+ }
133
+ export function observeFlowDeskAgentTaskOutputV1(response) {
134
+ const items = flowDeskAgentTaskMessageItems(response);
135
+ let latestText;
136
+ let terminalObserved = false;
137
+ let observedTerminalReason;
138
+ let hasRunningTool = false;
139
+ let textPartCount = 0;
140
+ let reasoningPartCount = 0;
141
+ for (const msg of items) {
142
+ const msgRec = isRecord(msg) ? msg : undefined;
143
+ const info = isRecord(msgRec?.info) ? msgRec.info : msgRec;
144
+ const role = info?.role;
145
+ // Accept "assistant" and "model" (Gemini uses "model" for assistant role)
146
+ const isAssistantRole = role === "assistant" || role === "model";
147
+ // Check message-level terminal signals (OpenAI/Gemini)
148
+ if (msgRec !== undefined) {
149
+ const msgTerminal = isTerminalMessage(msgRec);
150
+ if (!msgTerminal.terminal && info !== undefined && info !== msgRec) {
151
+ const infoTerminal = isTerminalMessage(info);
152
+ if (infoTerminal.terminal) {
153
+ terminalObserved = true;
154
+ observedTerminalReason = infoTerminal.reason;
155
+ }
156
+ }
157
+ else if (msgTerminal.terminal) {
158
+ terminalObserved = true;
159
+ observedTerminalReason = msgTerminal.reason;
160
+ }
161
+ }
162
+ // Collect parts from msg.parts, msg.info.parts, or msg.content (when content is array of parts)
163
+ let parts = Array.isArray(msgRec?.parts)
164
+ ? msgRec.parts
165
+ : Array.isArray(info?.parts)
166
+ ? info.parts
167
+ : [];
168
+ // OpenAI multi-part content: content is array of part objects
169
+ if (parts.length === 0 && msgRec !== undefined && Array.isArray(msgRec.content)) {
170
+ parts = msgRec.content;
171
+ }
172
+ // Message-level content string (OpenAI Chat Completions: { role: "assistant", content: "..." })
173
+ if (parts.length === 0 && isAssistantRole && msgRec !== undefined && typeof msgRec.content === "string" && msgRec.content.trim().length > 0) {
174
+ latestText = msgRec.content;
175
+ textPartCount++;
176
+ }
177
+ // Also check info-level content string
178
+ if (parts.length === 0 && isAssistantRole && info !== undefined && info !== msgRec && typeof info.content === "string" && info.content.trim().length > 0) {
179
+ latestText = info.content;
180
+ textPartCount++;
181
+ }
182
+ for (const rawPart of parts) {
183
+ const part = isRecord(rawPart) ? rawPart : undefined;
184
+ if (part === undefined)
185
+ continue;
186
+ if (isTerminalPart(part)) {
187
+ terminalObserved = true;
188
+ observedTerminalReason = terminalReason(part);
189
+ }
190
+ if (partHasRunningTool(part))
191
+ hasRunningTool = true;
192
+ if (part.type === "reasoning") {
193
+ reasoningPartCount++;
194
+ continue;
195
+ }
196
+ if (!isAssistantRole)
197
+ continue;
198
+ // Accept text, output_text (OpenAI Responses API), or undefined type
199
+ if (part.type !== undefined && part.type !== "text" && part.type !== "output_text")
200
+ continue;
201
+ const text = partText(part);
202
+ if (typeof text === "string" && text.trim().length > 0) {
203
+ latestText = text;
204
+ textPartCount++;
205
+ }
206
+ }
207
+ }
208
+ const outputKind = classifyFlowDeskAgentTaskOutputKindV1(latestText);
209
+ return {
210
+ latestText,
211
+ terminalObserved,
212
+ terminalReason: observedTerminalReason,
213
+ hasRunningTool,
214
+ textPartCount,
215
+ reasoningPartCount,
216
+ messageCount: items.length,
217
+ outputKind,
218
+ // Capture-side usability = "there is some text to keep". This is advisory
219
+ // transport metadata, NOT a substance/quality judgement (that is the
220
+ // coordinator's job). Only genuinely empty/tool-only captures are unusable.
221
+ usableForSynthesis: outputKind !== "empty" && outputKind !== "tool_trace_only",
222
+ looksLikeRefusalOrError: flowDeskTextLooksLikeRefusalOrErrorV1(latestText),
223
+ };
224
+ }
225
+ //# sourceMappingURL=agent-task-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-task-output.js","sourceRoot":"","sources":["../src/agent-task-output.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
1
  import { type FlowDeskManagedDispatchBetaOpenCodeClientV1 } from "./managed-dispatch-adapter.js";
2
+ export interface FlowDeskAgentTaskFallbackBindingV1 {
3
+ agentRef: string;
4
+ providerQualifiedModelId: string;
5
+ }
2
6
  export interface FlowDeskAgentTaskInputV1 {
3
7
  workflowId: string;
4
8
  taskId: string;
@@ -11,17 +15,47 @@ export interface FlowDeskAgentTaskInputV1 {
11
15
  client: FlowDeskManagedDispatchBetaOpenCodeClientV1;
12
16
  timeoutMs?: number;
13
17
  outputContract?: "final_assistant_text";
18
+ /**
19
+ * When true, return immediately after lane launch with { status: "task_launched" }.
20
+ * The watchdog takes over polling, nudging (noReply), and aborting the child session.
21
+ * The coordinator polls flowdesk_status_live to detect terminal state.
22
+ */
23
+ asyncMode?: boolean;
24
+ /**
25
+ * When provided and the primary attempt fails with no_response,
26
+ * automatically retry once with this fallback agent/model binding.
27
+ */
28
+ fallbackBinding?: FlowDeskAgentTaskFallbackBindingV1;
29
+ /** Override quiet period before nudge — for testing only */
30
+ _nudgeQuietPeriodMs?: number;
31
+ /** Override messages poll timeout — for testing only (default 3000ms in prod) */
32
+ _messagesTimeoutMs?: number;
33
+ /** Override launch timeout — for testing only (default 30000ms in prod) */
34
+ _launchTimeoutMs?: number;
35
+ /** Internal: true when this is already a fallback retry (prevents infinite retry) */
36
+ _isFallbackRetry?: boolean;
14
37
  }
15
38
  export type FlowDeskAgentTaskResultV1 = {
16
39
  status: "task_completed";
17
40
  resultText: string;
18
41
  laneId: string;
19
42
  taskResultEvidenceId: string;
43
+ } | {
44
+ status: "task_launched";
45
+ laneId: string;
46
+ childSessionId: string;
20
47
  } | {
21
48
  status: "task_failed";
22
49
  failureCategory: string;
23
50
  redactedReason: string;
24
51
  laneId: string;
25
52
  };
53
+ /** Schema version for async child session tracking evidence */
54
+ export declare const AGENT_TASK_CHILD_SESSION_SCHEMA_VERSION: "flowdesk.agent_task_child_session.v1";
55
+ export declare function sanitizeFlowDeskTaskResultTextV1(text: string): {
56
+ text: string;
57
+ changed: boolean;
58
+ truncated: boolean;
59
+ };
26
60
  export declare function executeFlowDeskAgentTaskV1(input: FlowDeskAgentTaskInputV1): Promise<FlowDeskAgentTaskResultV1>;
27
61
  //# sourceMappingURL=agent-task-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-task-runner.d.ts","sourceRoot":"","sources":["../src/agent-task-runner.ts"],"names":[],"mappings":"AAUA,OAAO,EACN,KAAK,2CAA2C,EAGhD,MAAM,+BAA+B,CAAC;AAMvC,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,2CAA2C,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACxC;AAED,MAAM,MAAM,yBAAyB,GAClC;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,GAC9F;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAuL9F,wBAAsB,0BAA0B,CAC/C,KAAK,EAAE,wBAAwB,GAC7B,OAAO,CAAC,yBAAyB,CAAC,CAyPpC"}
1
+ {"version":3,"file":"agent-task-runner.d.ts","sourceRoot":"","sources":["../src/agent-task-runner.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,KAAK,2CAA2C,EAGhD,MAAM,+BAA+B,CAAC;AASvC,MAAM,WAAW,kCAAkC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,2CAA2C,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,kCAAkC,CAAC;IACrD,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,yBAAyB,GAClC;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAA;CAAE,GAC9F;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9F,+DAA+D;AAC/D,eAAO,MAAM,uCAAuC,EAAG,sCAA+C,CAAC;AAsBvG,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAMrH;AA+bD,wBAAsB,0BAA0B,CAC/C,KAAK,EAAE,wBAAwB,GAC7B,OAAO,CAAC,yBAAyB,CAAC,CAmjBpC"}