@open-multi-agent/core 1.4.0

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 (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +373 -0
  3. package/dist/agent/agent.d.ts +153 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +559 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/loop-detector.d.ts +39 -0
  8. package/dist/agent/loop-detector.d.ts.map +1 -0
  9. package/dist/agent/loop-detector.js +122 -0
  10. package/dist/agent/loop-detector.js.map +1 -0
  11. package/dist/agent/pool.d.ts +158 -0
  12. package/dist/agent/pool.d.ts.map +1 -0
  13. package/dist/agent/pool.js +320 -0
  14. package/dist/agent/pool.js.map +1 -0
  15. package/dist/agent/runner.d.ts +242 -0
  16. package/dist/agent/runner.d.ts.map +1 -0
  17. package/dist/agent/runner.js +943 -0
  18. package/dist/agent/runner.js.map +1 -0
  19. package/dist/agent/structured-output.d.ts +33 -0
  20. package/dist/agent/structured-output.d.ts.map +1 -0
  21. package/dist/agent/structured-output.js +116 -0
  22. package/dist/agent/structured-output.js.map +1 -0
  23. package/dist/cli/oma.d.ts +30 -0
  24. package/dist/cli/oma.d.ts.map +1 -0
  25. package/dist/cli/oma.js +433 -0
  26. package/dist/cli/oma.js.map +1 -0
  27. package/dist/dashboard/layout-tasks.d.ts +23 -0
  28. package/dist/dashboard/layout-tasks.d.ts.map +1 -0
  29. package/dist/dashboard/layout-tasks.js +79 -0
  30. package/dist/dashboard/layout-tasks.js.map +1 -0
  31. package/dist/dashboard/render-team-run-dashboard.d.ts +11 -0
  32. package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -0
  33. package/dist/dashboard/render-team-run-dashboard.js +456 -0
  34. package/dist/dashboard/render-team-run-dashboard.js.map +1 -0
  35. package/dist/errors.d.ts +14 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +20 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/index.d.ts +79 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +92 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/llm/adapter.d.ts +54 -0
  44. package/dist/llm/adapter.d.ts.map +1 -0
  45. package/dist/llm/adapter.js +101 -0
  46. package/dist/llm/adapter.js.map +1 -0
  47. package/dist/llm/anthropic.d.ts +57 -0
  48. package/dist/llm/anthropic.d.ts.map +1 -0
  49. package/dist/llm/anthropic.js +432 -0
  50. package/dist/llm/anthropic.js.map +1 -0
  51. package/dist/llm/azure-openai.d.ts +74 -0
  52. package/dist/llm/azure-openai.d.ts.map +1 -0
  53. package/dist/llm/azure-openai.js +267 -0
  54. package/dist/llm/azure-openai.js.map +1 -0
  55. package/dist/llm/bedrock.d.ts +41 -0
  56. package/dist/llm/bedrock.d.ts.map +1 -0
  57. package/dist/llm/bedrock.js +345 -0
  58. package/dist/llm/bedrock.js.map +1 -0
  59. package/dist/llm/copilot.d.ts +92 -0
  60. package/dist/llm/copilot.d.ts.map +1 -0
  61. package/dist/llm/copilot.js +433 -0
  62. package/dist/llm/copilot.js.map +1 -0
  63. package/dist/llm/deepseek.d.ts +21 -0
  64. package/dist/llm/deepseek.d.ts.map +1 -0
  65. package/dist/llm/deepseek.js +24 -0
  66. package/dist/llm/deepseek.js.map +1 -0
  67. package/dist/llm/gemini.d.ts +65 -0
  68. package/dist/llm/gemini.d.ts.map +1 -0
  69. package/dist/llm/gemini.js +427 -0
  70. package/dist/llm/gemini.js.map +1 -0
  71. package/dist/llm/grok.d.ts +21 -0
  72. package/dist/llm/grok.d.ts.map +1 -0
  73. package/dist/llm/grok.js +24 -0
  74. package/dist/llm/grok.js.map +1 -0
  75. package/dist/llm/minimax.d.ts +21 -0
  76. package/dist/llm/minimax.d.ts.map +1 -0
  77. package/dist/llm/minimax.js +24 -0
  78. package/dist/llm/minimax.js.map +1 -0
  79. package/dist/llm/openai-common.d.ts +65 -0
  80. package/dist/llm/openai-common.d.ts.map +1 -0
  81. package/dist/llm/openai-common.js +286 -0
  82. package/dist/llm/openai-common.js.map +1 -0
  83. package/dist/llm/openai.d.ts +63 -0
  84. package/dist/llm/openai.d.ts.map +1 -0
  85. package/dist/llm/openai.js +256 -0
  86. package/dist/llm/openai.js.map +1 -0
  87. package/dist/llm/qiniu.d.ts +21 -0
  88. package/dist/llm/qiniu.d.ts.map +1 -0
  89. package/dist/llm/qiniu.js +24 -0
  90. package/dist/llm/qiniu.js.map +1 -0
  91. package/dist/mcp.d.ts +3 -0
  92. package/dist/mcp.d.ts.map +1 -0
  93. package/dist/mcp.js +2 -0
  94. package/dist/mcp.js.map +1 -0
  95. package/dist/memory/shared.d.ts +162 -0
  96. package/dist/memory/shared.d.ts.map +1 -0
  97. package/dist/memory/shared.js +294 -0
  98. package/dist/memory/shared.js.map +1 -0
  99. package/dist/memory/store.d.ts +72 -0
  100. package/dist/memory/store.d.ts.map +1 -0
  101. package/dist/memory/store.js +121 -0
  102. package/dist/memory/store.js.map +1 -0
  103. package/dist/orchestrator/orchestrator.d.ts +245 -0
  104. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  105. package/dist/orchestrator/orchestrator.js +1400 -0
  106. package/dist/orchestrator/orchestrator.js.map +1 -0
  107. package/dist/orchestrator/scheduler.d.ts +112 -0
  108. package/dist/orchestrator/scheduler.d.ts.map +1 -0
  109. package/dist/orchestrator/scheduler.js +256 -0
  110. package/dist/orchestrator/scheduler.js.map +1 -0
  111. package/dist/task/queue.d.ts +191 -0
  112. package/dist/task/queue.d.ts.map +1 -0
  113. package/dist/task/queue.js +408 -0
  114. package/dist/task/queue.js.map +1 -0
  115. package/dist/task/task.d.ts +90 -0
  116. package/dist/task/task.d.ts.map +1 -0
  117. package/dist/task/task.js +206 -0
  118. package/dist/task/task.js.map +1 -0
  119. package/dist/team/messaging.d.ts +106 -0
  120. package/dist/team/messaging.d.ts.map +1 -0
  121. package/dist/team/messaging.js +183 -0
  122. package/dist/team/messaging.js.map +1 -0
  123. package/dist/team/team.d.ts +141 -0
  124. package/dist/team/team.d.ts.map +1 -0
  125. package/dist/team/team.js +293 -0
  126. package/dist/team/team.js.map +1 -0
  127. package/dist/tool/built-in/bash.d.ts +12 -0
  128. package/dist/tool/built-in/bash.d.ts.map +1 -0
  129. package/dist/tool/built-in/bash.js +133 -0
  130. package/dist/tool/built-in/bash.js.map +1 -0
  131. package/dist/tool/built-in/delegate.d.ts +29 -0
  132. package/dist/tool/built-in/delegate.d.ts.map +1 -0
  133. package/dist/tool/built-in/delegate.js +92 -0
  134. package/dist/tool/built-in/delegate.js.map +1 -0
  135. package/dist/tool/built-in/file-edit.d.ts +14 -0
  136. package/dist/tool/built-in/file-edit.d.ts.map +1 -0
  137. package/dist/tool/built-in/file-edit.js +130 -0
  138. package/dist/tool/built-in/file-edit.js.map +1 -0
  139. package/dist/tool/built-in/file-read.d.ts +12 -0
  140. package/dist/tool/built-in/file-read.d.ts.map +1 -0
  141. package/dist/tool/built-in/file-read.js +82 -0
  142. package/dist/tool/built-in/file-read.js.map +1 -0
  143. package/dist/tool/built-in/file-write.d.ts +11 -0
  144. package/dist/tool/built-in/file-write.d.ts.map +1 -0
  145. package/dist/tool/built-in/file-write.js +70 -0
  146. package/dist/tool/built-in/file-write.js.map +1 -0
  147. package/dist/tool/built-in/fs-walk.d.ts +23 -0
  148. package/dist/tool/built-in/fs-walk.d.ts.map +1 -0
  149. package/dist/tool/built-in/fs-walk.js +78 -0
  150. package/dist/tool/built-in/fs-walk.js.map +1 -0
  151. package/dist/tool/built-in/glob.d.ts +12 -0
  152. package/dist/tool/built-in/glob.d.ts.map +1 -0
  153. package/dist/tool/built-in/glob.js +82 -0
  154. package/dist/tool/built-in/glob.js.map +1 -0
  155. package/dist/tool/built-in/grep.d.ts +15 -0
  156. package/dist/tool/built-in/grep.d.ts.map +1 -0
  157. package/dist/tool/built-in/grep.js +218 -0
  158. package/dist/tool/built-in/grep.js.map +1 -0
  159. package/dist/tool/built-in/index.d.ts +48 -0
  160. package/dist/tool/built-in/index.d.ts.map +1 -0
  161. package/dist/tool/built-in/index.js +56 -0
  162. package/dist/tool/built-in/index.js.map +1 -0
  163. package/dist/tool/executor.d.ts +100 -0
  164. package/dist/tool/executor.d.ts.map +1 -0
  165. package/dist/tool/executor.js +184 -0
  166. package/dist/tool/executor.js.map +1 -0
  167. package/dist/tool/framework.d.ts +167 -0
  168. package/dist/tool/framework.d.ts.map +1 -0
  169. package/dist/tool/framework.js +402 -0
  170. package/dist/tool/framework.js.map +1 -0
  171. package/dist/tool/mcp.d.ts +31 -0
  172. package/dist/tool/mcp.d.ts.map +1 -0
  173. package/dist/tool/mcp.js +175 -0
  174. package/dist/tool/mcp.js.map +1 -0
  175. package/dist/tool/text-tool-extractor.d.ts +32 -0
  176. package/dist/tool/text-tool-extractor.d.ts.map +1 -0
  177. package/dist/tool/text-tool-extractor.js +195 -0
  178. package/dist/tool/text-tool-extractor.js.map +1 -0
  179. package/dist/types.d.ts +916 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +8 -0
  182. package/dist/types.js.map +1 -0
  183. package/dist/utils/keywords.d.ts +18 -0
  184. package/dist/utils/keywords.d.ts.map +1 -0
  185. package/dist/utils/keywords.js +32 -0
  186. package/dist/utils/keywords.js.map +1 -0
  187. package/dist/utils/semaphore.d.ts +49 -0
  188. package/dist/utils/semaphore.d.ts.map +1 -0
  189. package/dist/utils/semaphore.js +89 -0
  190. package/dist/utils/semaphore.js.map +1 -0
  191. package/dist/utils/tokens.d.ts +7 -0
  192. package/dist/utils/tokens.d.ts.map +1 -0
  193. package/dist/utils/tokens.js +30 -0
  194. package/dist/utils/tokens.js.map +1 -0
  195. package/dist/utils/trace.d.ts +12 -0
  196. package/dist/utils/trace.d.ts.map +1 -0
  197. package/dist/utils/trace.js +30 -0
  198. package/dist/utils/trace.js.map +1 -0
  199. package/docs/DECISIONS.md +49 -0
  200. package/docs/cli.md +265 -0
  201. package/docs/context-management.md +24 -0
  202. package/docs/featured-partner.md +28 -0
  203. package/docs/observability.md +56 -0
  204. package/docs/providers.md +78 -0
  205. package/docs/shared-memory.md +27 -0
  206. package/docs/tool-configuration.md +152 -0
  207. package/package.json +96 -0
@@ -0,0 +1,456 @@
1
+ /**
2
+ * Pure HTML renderer for the post-run team task DAG dashboard (no filesystem or network I/O).
3
+ */
4
+ import { layoutTasks } from './layout-tasks.js';
5
+ /**
6
+ * Escape serialized JSON so it can be embedded in HTML without closing a {@code <script>} tag.
7
+ * The HTML tokenizer ends a script on {@code </script>} even for {@code type="application/json"}.
8
+ */
9
+ export function escapeJsonForHtmlScript(json) {
10
+ return json.replace(/<\/script/gi, '<\\/script');
11
+ }
12
+ export function renderTeamRunDashboard(result) {
13
+ const generatedAt = new Date().toISOString();
14
+ const tasks = result.tasks ?? [];
15
+ const layout = layoutTasks(tasks);
16
+ const serializedPositions = Object.fromEntries(layout.positions);
17
+ const payload = {
18
+ generatedAt,
19
+ goal: result.goal ?? '',
20
+ tasks,
21
+ layout: {
22
+ positions: serializedPositions,
23
+ width: layout.width,
24
+ height: layout.height,
25
+ nodeW: layout.nodeW,
26
+ nodeH: layout.nodeH,
27
+ },
28
+ };
29
+ const dataJson = escapeJsonForHtmlScript(JSON.stringify(payload));
30
+ return `<!DOCTYPE html>
31
+ <html class="dark" lang="en">
32
+ <head>
33
+ <meta charset="utf-8" />
34
+ <meta content="width=device-width, initial-scale=1.0" name="viewport" />
35
+ <title>Open Multi Agent</title>
36
+ <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
37
+ <link
38
+ href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&amp;family=Inter:wght@400;500;600&amp;display=swap"
39
+ rel="stylesheet" />
40
+ <link
41
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap"
42
+ rel="stylesheet" />
43
+ <script id="tailwind-config">
44
+ tailwind.config = {
45
+ darkMode: "class",
46
+ theme: {
47
+ extend: {
48
+ "colors": {
49
+ "inverse-surface": "#faf8ff",
50
+ "secondary-dim": "#ecb200",
51
+ "on-primary": "#005762",
52
+ "on-tertiary-fixed-variant": "#006827",
53
+ "primary-fixed-dim": "#00d4ec",
54
+ "tertiary-container": "#5cfd80",
55
+ "secondary": "#fdc003",
56
+ "primary-dim": "#00d4ec",
57
+ "surface-container": "#0f1930",
58
+ "on-secondary": "#553e00",
59
+ "surface": "#060e20",
60
+ "on-surface": "#dee5ff",
61
+ "surface-container-highest": "#192540",
62
+ "on-secondary-fixed-variant": "#674c00",
63
+ "on-tertiary-container": "#005d22",
64
+ "secondary-fixed-dim": "#f7ba00",
65
+ "surface-variant": "#192540",
66
+ "surface-container-low": "#091328",
67
+ "secondary-container": "#785900",
68
+ "tertiary-fixed-dim": "#4bee74",
69
+ "on-primary-fixed-variant": "#005762",
70
+ "primary-container": "#00e3fd",
71
+ "surface-dim": "#060e20",
72
+ "error-container": "#9f0519",
73
+ "on-error-container": "#ffa8a3",
74
+ "primary-fixed": "#00e3fd",
75
+ "tertiary-dim": "#4bee74",
76
+ "surface-container-high": "#141f38",
77
+ "background": "#060e20",
78
+ "surface-bright": "#1f2b49",
79
+ "error-dim": "#d7383b",
80
+ "on-primary-container": "#004d57",
81
+ "outline": "#6d758c",
82
+ "error": "#ff716c",
83
+ "on-secondary-container": "#fff6ec",
84
+ "on-primary-fixed": "#003840",
85
+ "inverse-on-surface": "#4d556b",
86
+ "secondary-fixed": "#ffca4d",
87
+ "tertiary-fixed": "#5cfd80",
88
+ "on-tertiary-fixed": "#004819",
89
+ "surface-tint": "#81ecff",
90
+ "tertiary": "#b8ffbb",
91
+ "outline-variant": "#40485d",
92
+ "on-error": "#490006",
93
+ "on-surface-variant": "#a3aac4",
94
+ "surface-container-lowest": "#000000",
95
+ "on-tertiary": "#006727",
96
+ "primary": "#81ecff",
97
+ "on-secondary-fixed": "#443100",
98
+ "inverse-primary": "#006976",
99
+ "on-background": "#dee5ff"
100
+ },
101
+ "borderRadius": {
102
+ "DEFAULT": "0px",
103
+ "lg": "0px",
104
+ "xl": "0px",
105
+ "full": "9999px"
106
+ },
107
+ "fontFamily": {
108
+ "headline": ["Space Grotesk"],
109
+ "body": ["Inter"],
110
+ "label": ["Space Grotesk"]
111
+ }
112
+ },
113
+ },
114
+ }
115
+ </script>
116
+ <style>
117
+ .material-symbols-outlined {
118
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
119
+ }
120
+
121
+ .grid-pattern {
122
+ background-image: radial-gradient(circle, #40485d 1px, transparent 1px);
123
+ background-size: 24px 24px;
124
+ }
125
+
126
+ .node-active-glow {
127
+ box-shadow: 0 0 15px rgba(129, 236, 255, 0.15);
128
+ }
129
+ </style>
130
+ </head>
131
+ <body class="bg-surface text-on-surface font-body selection:bg-primary selection:text-on-primary">
132
+ <main class="p-8 min-h-[calc(100vh-64px)] grid-pattern relative overflow-hidden flex flex-col lg:flex-row gap-6">
133
+ <div id="viewport" class="flex-1 relative min-h-[600px] overflow-hidden cursor-grab">
134
+ <div id="canvas" class="absolute inset-0 origin-top-left">
135
+ <svg id="edgesLayer" class="absolute inset-0 w-full h-full pointer-events-none" xmlns="http://www.w3.org/2000/svg"></svg>
136
+ <div id="nodesLayer"></div>
137
+ </div>
138
+ </div>
139
+ <aside id="detailsPanel" class="hidden w-full lg:w-[400px] bg-surface-container-high p-6 flex flex-col gap-8 border-l border-outline-variant/10">
140
+ <div>
141
+ <h2 class="font-headline font-black text-lg tracking-widest mb-6 text-primary flex items-center gap-2">
142
+ <span class="material-symbols-outlined" data-icon="info">info</span>
143
+ NODE_DETAILS
144
+ </h2>
145
+ <button id="closePanel" class="absolute top-4 right-4 text-on-surface-variant hover:text-primary">
146
+ <span class="material-symbols-outlined">close</span>
147
+ </button>
148
+ <div class="space-y-6">
149
+ <div class="flex flex-col gap-2">
150
+ <label class="text-[10px] font-headline uppercase tracking-widest text-on-surface-variant">Goal</label>
151
+ <p id="goalText" class="text-xs bg-surface-container p-3 border-b border-outline-variant/20"></p>
152
+ </div>
153
+ <div class="flex flex-col gap-1">
154
+ <label class="text-[10px] font-headline uppercase tracking-widest text-on-surface-variant">Assigned Agent</label>
155
+ <div class="flex items-center gap-4 bg-surface-container p-3">
156
+ <div>
157
+ <p id="selectedAssignee" class="text-sm font-bold text-on-surface">-</p>
158
+ <p id="selectedState" class="text-[10px] font-mono text-secondary">ACTIVE STATE: -</p>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ <div class="grid grid-cols-2 gap-4">
163
+ <div class="flex flex-col gap-1">
164
+ <label class="text-[10px] font-headline uppercase tracking-widest text-on-surface-variant">Execution Start</label>
165
+ <p id="selectedStart" class="text-xs font-mono bg-surface-container p-2 border-b border-outline-variant/20">-</p>
166
+ </div>
167
+ <div class="flex flex-col gap-1">
168
+ <label class="text-[10px] font-headline uppercase tracking-widest text-on-surface-variant">Execution End</label>
169
+ <p id="selectedEnd" class="text-xs font-mono bg-surface-container p-2 border-b border-outline-variant/20 text-on-surface-variant">-</p>
170
+ </div>
171
+ </div>
172
+ <div class="flex flex-col gap-1">
173
+ <label class="text-[10px] font-headline uppercase tracking-widest text-on-surface-variant">Token Breakdown</label>
174
+ <div class="space-y-2 bg-surface-container p-4">
175
+ <div class="flex justify-between text-xs font-mono">
176
+ <span class="text-on-surface-variant">PROMPT:</span>
177
+ <span id="selectedPromptTokens" class="text-on-surface">0</span>
178
+ </div>
179
+ <div class="flex justify-between text-xs font-mono">
180
+ <span class="text-on-surface-variant">COMPLETION:</span>
181
+ <span id="selectedCompletionTokens" class="text-on-surface text-secondary">0</span>
182
+ </div>
183
+ <div class="w-full h-1 bg-surface-variant mt-2">
184
+ <div id="selectedTokenRatio" class="bg-primary h-full w-0"></div>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ <div class="flex flex-col gap-1">
189
+ <label class="text-[10px] font-headline uppercase tracking-widest text-on-surface-variant">Tool Calls</label>
190
+ <p id="selectedToolCalls" class="text-xs font-mono bg-surface-container p-2 border-b border-outline-variant/20">0</p>
191
+ </div>
192
+ </div>
193
+ </div>
194
+ <div class="flex-1 flex flex-col min-h-[200px]">
195
+ <h2 class="font-headline font-black text-[10px] tracking-widest mb-4 text-on-surface-variant">LIVE_AGENT_OUTPUT</h2>
196
+ <div id="liveOutput" class="bg-surface-container-lowest flex-1 p-3 font-mono text-[10px] leading-relaxed overflow-y-auto space-y-1">
197
+ </div>
198
+ </div>
199
+ </aside>
200
+ </main>
201
+ <div class="fixed left-0 top-0 w-1 h-screen bg-gradient-to-b from-primary via-secondary to-tertiary z-[60] opacity-30"></div>
202
+ <script type="application/json" id="oma-data">${dataJson}</script>
203
+ <script>
204
+ const dataEl = document.getElementById("oma-data");
205
+ const payload = JSON.parse(dataEl.textContent);
206
+ const panel = document.getElementById("detailsPanel");
207
+ const closeBtn = document.getElementById("closePanel");
208
+ const canvas = document.getElementById("canvas");
209
+ const viewport = document.getElementById("viewport");
210
+ const edgesLayer = document.getElementById("edgesLayer");
211
+ const nodesLayer = document.getElementById("nodesLayer");
212
+ const goalText = document.getElementById("goalText");
213
+ const liveOutput = document.getElementById("liveOutput");
214
+ const selectedAssignee = document.getElementById("selectedAssignee");
215
+ const selectedState = document.getElementById("selectedState");
216
+ const selectedStart = document.getElementById("selectedStart");
217
+ const selectedToolCalls = document.getElementById("selectedToolCalls");
218
+ const selectedEnd = document.getElementById("selectedEnd");
219
+ const selectedPromptTokens = document.getElementById("selectedPromptTokens");
220
+ const selectedCompletionTokens = document.getElementById("selectedCompletionTokens");
221
+ const selectedTokenRatio = document.getElementById("selectedTokenRatio");
222
+ const svgNs = "http://www.w3.org/2000/svg";
223
+
224
+ let scale = 1;
225
+ let translate = { x: 0, y: 0 };
226
+
227
+ let isDragging = false;
228
+ let last = { x: 0, y: 0 };
229
+
230
+ function updateTransform() {
231
+ canvas.style.transform = \`
232
+ translate(\${translate.x}px, \${translate.y}px)
233
+ scale(\${scale})
234
+ \`;
235
+ }
236
+
237
+ viewport.addEventListener("wheel", (e) => {
238
+ e.preventDefault();
239
+
240
+ const zoomIntensity = 0.0015;
241
+ const delta = -e.deltaY * zoomIntensity;
242
+ const newScale = Math.min(Math.max(0.4, scale + delta), 2.5);
243
+
244
+ const rect = viewport.getBoundingClientRect();
245
+ const mouseX = e.clientX - rect.left;
246
+ const mouseY = e.clientY - rect.top;
247
+ const dx = mouseX - translate.x;
248
+ const dy = mouseY - translate.y;
249
+
250
+ translate.x -= dx * (newScale / scale - 1);
251
+ translate.y -= dy * (newScale / scale - 1);
252
+ scale = newScale;
253
+ updateTransform();
254
+ });
255
+
256
+ viewport.addEventListener("mousedown", (e) => {
257
+ isDragging = true;
258
+ last = { x: e.clientX, y: e.clientY };
259
+ viewport.classList.add("cursor-grabbing");
260
+ });
261
+
262
+ window.addEventListener("mousemove", (e) => {
263
+ if (!isDragging) return;
264
+
265
+ const dx = e.clientX - last.x;
266
+ const dy = e.clientY - last.y;
267
+ translate.x += dx;
268
+ translate.y += dy;
269
+ last = { x: e.clientX, y: e.clientY };
270
+ updateTransform();
271
+ });
272
+
273
+ window.addEventListener("mouseup", () => {
274
+ isDragging = false;
275
+ viewport.classList.remove("cursor-grabbing");
276
+ });
277
+
278
+ updateTransform();
279
+
280
+ closeBtn.addEventListener("click", () => {
281
+ panel.classList.add("hidden");
282
+ });
283
+
284
+ document.addEventListener("click", (e) => {
285
+ const isClickInsidePanel = panel.contains(e.target);
286
+ const isNode = e.target.closest(".node");
287
+
288
+ if (!isClickInsidePanel && !isNode) {
289
+ panel.classList.add("hidden");
290
+ }
291
+ });
292
+
293
+ const tasks = Array.isArray(payload.tasks) ? payload.tasks : [];
294
+ goalText.textContent = payload.goal ?? "";
295
+
296
+ const statusStyles = {
297
+ completed: { border: "border-tertiary", icon: "check_circle", iconColor: "text-tertiary", container: "bg-surface-container-lowest node-active-glow", statusColor: "text-on-surface-variant", chip: "STABLE" },
298
+ failed: { border: "border-error", icon: "error", iconColor: "text-error", container: "bg-surface-container-lowest", statusColor: "text-error", chip: "FAILED" },
299
+ blocked: { border: "border-outline", icon: "lock", iconColor: "text-outline", container: "bg-surface-container-low opacity-60 grayscale", statusColor: "text-on-surface-variant", chip: "BLOCKED" },
300
+ skipped: { border: "border-outline", icon: "skip_next", iconColor: "text-outline", container: "bg-surface-container-low opacity-60", statusColor: "text-on-surface-variant", chip: "SKIPPED" },
301
+ in_progress: { border: "border-secondary", icon: "sync", iconColor: "text-secondary", container: "bg-surface-container-low node-active-glow border border-outline-variant/20 shadow-[0_0_20px_rgba(253,192,3,0.1)]", statusColor: "text-secondary", chip: "ACTIVE_STREAM", spin: true },
302
+ pending: { border: "border-outline", icon: "hourglass_empty", iconColor: "text-outline", container: "bg-surface-container-low opacity-60 grayscale", statusColor: "text-on-surface-variant", chip: "WAITING" },
303
+ };
304
+
305
+ function durationText(task) {
306
+ const ms = task?.metrics?.durationMs ?? 0;
307
+ const seconds = Math.max(0, ms / 1000).toFixed(1);
308
+ return task.status === "completed" ? "DONE (" + seconds + "s)" : task.status.toUpperCase();
309
+ }
310
+
311
+ function renderLiveOutput(taskList) {
312
+ liveOutput.innerHTML = "";
313
+ const finished = taskList.every((task) => ["completed", "failed", "skipped", "blocked"].includes(task.status));
314
+ const header = document.createElement("p");
315
+ header.className = "text-tertiary";
316
+ header.textContent = finished ? "[SYSTEM] Task graph execution finished." : "[SYSTEM] Task graph execution in progress.";
317
+ liveOutput.appendChild(header);
318
+
319
+ taskList.forEach((task) => {
320
+ const p = document.createElement("p");
321
+ p.className = task.status === "completed" ? "text-on-surface-variant" : task.status === "failed" ? "text-error" : "text-on-surface-variant";
322
+ p.textContent = "[" + (task.assignee || "UNASSIGNED").toUpperCase() + "] " + task.title + " -> " + task.status.toUpperCase();
323
+ liveOutput.appendChild(p);
324
+ });
325
+ }
326
+
327
+ function renderDetails(task) {
328
+ const metrics = task?.metrics ?? {};
329
+ const statusLabel = (statusStyles[task.status] || statusStyles.pending).chip;
330
+ const usage = metrics.tokenUsage ?? { input_tokens: 0, output_tokens: 0 };
331
+ const inTokens = usage.input_tokens ?? 0;
332
+ const outTokens = usage.output_tokens ?? 0;
333
+ const total = inTokens + outTokens;
334
+ const ratio = total > 0 ? Math.round((inTokens / total) * 100) : 0;
335
+
336
+ selectedAssignee.textContent = task?.assignee || "UNASSIGNED";
337
+
338
+ selectedState.textContent = "STATE: " + statusLabel;
339
+ selectedStart.textContent = metrics.startMs ? new Date(metrics.startMs).toISOString() : "-";
340
+ selectedEnd.textContent = metrics.endMs ? new Date(metrics.endMs).toISOString() : "-";
341
+
342
+ selectedToolCalls.textContent = (metrics.toolCalls ?? []).length.toString();
343
+
344
+ selectedPromptTokens.textContent = inTokens.toLocaleString();
345
+ selectedCompletionTokens.textContent = outTokens.toLocaleString();
346
+ selectedTokenRatio.style.width = ratio + "%";
347
+ }
348
+
349
+ function makeEdgePath(x1, y1, x2, y2) {
350
+ return "M " + x1 + " " + y1 + " C " + (x1 + 42) + " " + y1 + ", " + (x2 - 42) + " " + y2 + ", " + x2 + " " + y2;
351
+ }
352
+
353
+ function renderDag(taskList) {
354
+ const rawLayout = payload.layout ?? {};
355
+ const positions = new Map(Object.entries(rawLayout.positions ?? {}));
356
+ const width = Number(rawLayout.width ?? 1600);
357
+ const height = Number(rawLayout.height ?? 700);
358
+ const nodeW = Number(rawLayout.nodeW ?? 256);
359
+ const nodeH = Number(rawLayout.nodeH ?? 142);
360
+ canvas.style.width = width + "px";
361
+ canvas.style.height = height + "px";
362
+
363
+ edgesLayer.setAttribute("viewBox", "0 0 " + width + " " + height);
364
+ edgesLayer.innerHTML = "";
365
+ const defs = document.createElementNS(svgNs, "defs");
366
+ const marker = document.createElementNS(svgNs, "marker");
367
+ marker.setAttribute("id", "arrow");
368
+ marker.setAttribute("markerWidth", "8");
369
+ marker.setAttribute("markerHeight", "8");
370
+ marker.setAttribute("refX", "7");
371
+ marker.setAttribute("refY", "4");
372
+ marker.setAttribute("orient", "auto");
373
+ const markerPath = document.createElementNS(svgNs, "path");
374
+ markerPath.setAttribute("d", "M0,0 L8,4 L0,8 z");
375
+ markerPath.setAttribute("fill", "#40485d");
376
+ marker.appendChild(markerPath);
377
+ defs.appendChild(marker);
378
+ edgesLayer.appendChild(defs);
379
+
380
+ taskList.forEach((task) => {
381
+ const to = positions.get(task.id);
382
+ (task.dependsOn || []).forEach((depId) => {
383
+ const from = positions.get(depId);
384
+ if (!from || !to) return;
385
+ const edge = document.createElementNS(svgNs, "path");
386
+ edge.setAttribute("d", makeEdgePath(from.x + nodeW, from.y + nodeH / 2, to.x, to.y + nodeH / 2));
387
+ edge.setAttribute("fill", "none");
388
+ edge.setAttribute("stroke", "#40485d");
389
+ edge.setAttribute("stroke-width", "2");
390
+ edge.setAttribute("marker-end", "url(#arrow)");
391
+ edgesLayer.appendChild(edge);
392
+ });
393
+ });
394
+
395
+ nodesLayer.innerHTML = "";
396
+ taskList.forEach((task, idx) => {
397
+ const pos = positions.get(task.id);
398
+ const status = statusStyles[task.status] || statusStyles.pending;
399
+ const nodeId = "#NODE_" + String(idx + 1).padStart(3, "0");
400
+ const chips = [task.assignee ? task.assignee.toUpperCase() : "UNASSIGNED", status.chip];
401
+
402
+ const node = document.createElement("div");
403
+ node.className = "node absolute w-64 border-l-2 p-4 cursor-pointer " + status.border + " " + status.container;
404
+ node.style.left = pos.x + "px";
405
+ node.style.top = pos.y + "px";
406
+
407
+ const rowTop = document.createElement("div");
408
+ rowTop.className = "flex justify-between items-start mb-4";
409
+ const nodeIdSpan = document.createElement("span");
410
+ nodeIdSpan.className = "text-[10px] font-mono " + status.iconColor;
411
+ nodeIdSpan.textContent = nodeId;
412
+ const iconSpan = document.createElement("span");
413
+ iconSpan.className = "material-symbols-outlined " + status.iconColor + " text-lg " + (status.spin ? "animate-spin" : "");
414
+ iconSpan.textContent = status.icon;
415
+ iconSpan.setAttribute("data-icon", status.icon);
416
+ rowTop.appendChild(nodeIdSpan);
417
+ rowTop.appendChild(iconSpan);
418
+
419
+ const titleEl = document.createElement("h3");
420
+ titleEl.className = "font-headline font-bold text-sm tracking-tight mb-1";
421
+ titleEl.textContent = task.title;
422
+
423
+ const statusLine = document.createElement("p");
424
+ statusLine.className = "text-xs " + status.statusColor + " mb-4";
425
+ statusLine.textContent = "STATUS: " + durationText(task);
426
+
427
+ const chipRow = document.createElement("div");
428
+ chipRow.className = "flex gap-2";
429
+ chips.forEach((chip) => {
430
+ const chipEl = document.createElement("span");
431
+ chipEl.className = "px-2 py-0.5 bg-surface-variant text-[9px] font-mono text-on-surface-variant";
432
+ chipEl.textContent = chip;
433
+ chipRow.appendChild(chipEl);
434
+ });
435
+
436
+ node.appendChild(rowTop);
437
+ node.appendChild(titleEl);
438
+ node.appendChild(statusLine);
439
+ node.appendChild(chipRow);
440
+
441
+ node.addEventListener("click", () => {
442
+ renderDetails(task);
443
+ panel.classList.remove("hidden");
444
+ });
445
+ nodesLayer.appendChild(node);
446
+ });
447
+
448
+ renderLiveOutput(taskList);
449
+ }
450
+
451
+ renderDag(tasks);
452
+ </script>
453
+ </body>
454
+ </html>`;
455
+ }
456
+ //# sourceMappingURL=render-team-run-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-team-run-dashboard.js","sourceRoot":"","sources":["../../src/dashboard/render-team-run-dashboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAqB;IAC1D,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAChC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG;QACd,WAAW;QACX,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,KAAK;QACL,MAAM,EAAE;YACN,SAAS,EAAE,mBAAmB;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB;KACF,CAAA;IACD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAEjE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDA4K2C,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4PpD,CAAA;AACR,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Framework-specific error classes.
3
+ */
4
+ /**
5
+ * Raised when an agent or orchestrator run exceeds its configured token budget.
6
+ */
7
+ export declare class TokenBudgetExceededError extends Error {
8
+ readonly agent: string;
9
+ readonly tokensUsed: number;
10
+ readonly budget: number;
11
+ readonly code = "TOKEN_BUDGET_EXCEEDED";
12
+ constructor(agent: string, tokensUsed: number, budget: number);
13
+ }
14
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAI/C,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM;IALzB,QAAQ,CAAC,IAAI,2BAA0B;gBAG5B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM;CAK1B"}
package/dist/errors.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @fileoverview Framework-specific error classes.
3
+ */
4
+ /**
5
+ * Raised when an agent or orchestrator run exceeds its configured token budget.
6
+ */
7
+ export class TokenBudgetExceededError extends Error {
8
+ agent;
9
+ tokensUsed;
10
+ budget;
11
+ code = 'TOKEN_BUDGET_EXCEEDED';
12
+ constructor(agent, tokensUsed, budget) {
13
+ super(`Agent "${agent}" exceeded token budget: ${tokensUsed} tokens used (budget: ${budget})`);
14
+ this.agent = agent;
15
+ this.tokensUsed = tokensUsed;
16
+ this.budget = budget;
17
+ this.name = 'TokenBudgetExceededError';
18
+ }
19
+ }
20
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAItC;IACA;IACA;IALF,IAAI,GAAG,uBAAuB,CAAA;IAEvC,YACW,KAAa,EACb,UAAkB,EAClB,MAAc;QAEvB,KAAK,CAAC,UAAU,KAAK,4BAA4B,UAAU,yBAAyB,MAAM,GAAG,CAAC,CAAA;QAJrF,UAAK,GAAL,KAAK,CAAQ;QACb,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAQ;QAGvB,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @fileoverview open-multi-agent — public API surface.
3
+ *
4
+ * Import from `'@open-multi-agent/core'` to access everything you need:
5
+ *
6
+ * ```ts
7
+ * import { OpenMultiAgent, Agent, Team, defineTool } from '@open-multi-agent/core'
8
+ * ```
9
+ *
10
+ * ## Quickstart
11
+ *
12
+ * ### Single agent
13
+ * ```ts
14
+ * const orchestrator = new OpenMultiAgent({ defaultModel: 'claude-opus-4-6' })
15
+ * const result = await orchestrator.runAgent(
16
+ * { name: 'assistant', model: 'claude-opus-4-6' },
17
+ * 'Explain monads in one paragraph.',
18
+ * )
19
+ * console.log(result.output)
20
+ * ```
21
+ *
22
+ * ### Multi-agent team (auto-orchestrated)
23
+ * ```ts
24
+ * const orchestrator = new OpenMultiAgent()
25
+ * const team = orchestrator.createTeam('writers', {
26
+ * name: 'writers',
27
+ * agents: [
28
+ * { name: 'researcher', model: 'claude-opus-4-6', systemPrompt: 'You research topics thoroughly.' },
29
+ * { name: 'writer', model: 'claude-opus-4-6', systemPrompt: 'You write clear documentation.' },
30
+ * ],
31
+ * sharedMemory: true,
32
+ * })
33
+ * const result = await orchestrator.runTeam(team, 'Write a guide on TypeScript generics.')
34
+ * console.log(result.agentResults.get('coordinator')?.output)
35
+ * ```
36
+ *
37
+ * ### Custom tools
38
+ * ```ts
39
+ * import { z } from 'zod'
40
+ *
41
+ * const myTool = defineTool({
42
+ * name: 'fetch_data',
43
+ * description: 'Fetch JSON data from a URL.',
44
+ * inputSchema: z.object({ url: z.string().url() }),
45
+ * execute: async ({ url }) => {
46
+ * const res = await fetch(url)
47
+ * return { data: await res.text() }
48
+ * },
49
+ * })
50
+ * ```
51
+ */
52
+ export { OpenMultiAgent, executeWithRetry, computeRetryDelay } from './orchestrator/orchestrator.js';
53
+ export { Scheduler } from './orchestrator/scheduler.js';
54
+ export type { SchedulingStrategy } from './orchestrator/scheduler.js';
55
+ export { renderTeamRunDashboard } from './dashboard/render-team-run-dashboard.js';
56
+ export { Agent } from './agent/agent.js';
57
+ export { LoopDetector } from './agent/loop-detector.js';
58
+ export { buildStructuredOutputInstruction, extractJSON, validateOutput } from './agent/structured-output.js';
59
+ export { AgentPool, Semaphore } from './agent/pool.js';
60
+ export type { PoolStatus } from './agent/pool.js';
61
+ export { Team } from './team/team.js';
62
+ export { MessageBus } from './team/messaging.js';
63
+ export type { Message } from './team/messaging.js';
64
+ export { TaskQueue } from './task/queue.js';
65
+ export { createTask, isTaskReady, getTaskDependencyOrder, validateTaskDependencies } from './task/task.js';
66
+ export type { TaskQueueEvent } from './task/queue.js';
67
+ export { defineTool, ToolRegistry, zodToJsonSchema } from './tool/framework.js';
68
+ export { ToolExecutor, truncateToolOutput } from './tool/executor.js';
69
+ export type { ToolExecutorOptions, BatchToolCall } from './tool/executor.js';
70
+ export { registerBuiltInTools, BUILT_IN_TOOLS, ALL_BUILT_IN_TOOLS_WITH_DELEGATE, bashTool, delegateToAgentTool, fileReadTool, fileWriteTool, fileEditTool, globTool, grepTool, } from './tool/built-in/index.js';
71
+ export type { RegisterBuiltInToolsOptions } from './tool/built-in/index.js';
72
+ export { createAdapter } from './llm/adapter.js';
73
+ export type { SupportedProvider } from './llm/adapter.js';
74
+ export { TokenBudgetExceededError } from './errors.js';
75
+ export { InMemoryStore } from './memory/store.js';
76
+ export { SharedMemory } from './memory/shared.js';
77
+ export type { ReasoningBlock, TextBlock, ToolUseBlock, ToolResultBlock, ImageBlock, ContentBlock, LLMMessage, LLMResponse, LLMAdapter, LLMChatOptions, LLMStreamOptions, LLMToolDef, TokenUsage, StreamEvent, ToolDefinition, ToolResult, ToolUseContext, AgentInfo, TeamInfo, DelegationPoolView, AgentConfig, AgentState, AgentRunResult, BeforeRunHookContext, ToolCallRecord, LoopDetectionConfig, LoopDetectionInfo, ContextStrategy, TeamConfig, TeamRunResult, RunTeamOptions, TaskExecutionMetrics, TaskExecutionRecord, Task, TaskStatus, OrchestratorConfig, OrchestratorEvent, CoordinatorConfig, TraceEventType, TraceEventBase, TraceEvent, LLMCallTrace, ToolCallTrace, TaskTrace, AgentTrace, PlanReadyTrace, AgentStreamTrace, MemoryEntry, MemoryStore, } from './types.js';
78
+ export { generateRunId } from './utils/trace.js';
79
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAMH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AAMjF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC5G,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAMjD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAC1G,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAMrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACrE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,gCAAgC,EAChC,QAAQ,EACR,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAA;AAM3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAMtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAMjD,YAAY,EAEV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,eAAe,EACf,UAAU,EACV,YAAY,EAGZ,UAAU,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,WAAW,EAGX,cAAc,EACd,UAAU,EACV,cAAc,EACd,SAAS,EACT,QAAQ,EACR,kBAAkB,EAGlB,WAAW,EACX,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAGf,UAAU,EACV,aAAa,EACb,cAAc,EAGd,oBAAoB,EACpB,mBAAmB,EAGnB,IAAI,EACJ,UAAU,EAGV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EAGjB,cAAc,EACd,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,cAAc,EACd,gBAAgB,EAGhB,WAAW,EACX,WAAW,GACZ,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}