@darkiceinteractive/mcp-conductor 2.0.0-alpha.1 → 3.0.0-beta.2

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 (276) hide show
  1. package/README.md +35 -5
  2. package/dist/bin/cli.d.ts +20 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +260 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bridge/http-server.d.ts +35 -0
  7. package/dist/bridge/http-server.d.ts.map +1 -1
  8. package/dist/bridge/http-server.js +51 -2
  9. package/dist/bridge/http-server.js.map +1 -1
  10. package/dist/bridge/index.d.ts +1 -0
  11. package/dist/bridge/index.d.ts.map +1 -1
  12. package/dist/bridge/index.js +1 -0
  13. package/dist/bridge/index.js.map +1 -1
  14. package/dist/bridge/pool.d.ts +95 -0
  15. package/dist/bridge/pool.d.ts.map +1 -0
  16. package/dist/bridge/pool.js +384 -0
  17. package/dist/bridge/pool.js.map +1 -0
  18. package/dist/cache/cache.d.ts +64 -0
  19. package/dist/cache/cache.d.ts.map +1 -0
  20. package/dist/cache/cache.js +209 -0
  21. package/dist/cache/cache.js.map +1 -0
  22. package/dist/cache/delta.d.ts +32 -0
  23. package/dist/cache/delta.d.ts.map +1 -0
  24. package/dist/cache/delta.js +131 -0
  25. package/dist/cache/delta.js.map +1 -0
  26. package/dist/cache/disk.d.ts +65 -0
  27. package/dist/cache/disk.d.ts.map +1 -0
  28. package/dist/cache/disk.js +238 -0
  29. package/dist/cache/disk.js.map +1 -0
  30. package/dist/cache/index.d.ts +53 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +12 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cache/key.d.ts +44 -0
  35. package/dist/cache/key.d.ts.map +1 -0
  36. package/dist/cache/key.js +83 -0
  37. package/dist/cache/key.js.map +1 -0
  38. package/dist/cache/lru.d.ts +57 -0
  39. package/dist/cache/lru.d.ts.map +1 -0
  40. package/dist/cache/lru.js +112 -0
  41. package/dist/cache/lru.js.map +1 -0
  42. package/dist/cache/policy.d.ts +34 -0
  43. package/dist/cache/policy.d.ts.map +1 -0
  44. package/dist/cache/policy.js +95 -0
  45. package/dist/cache/policy.js.map +1 -0
  46. package/dist/cli/commands/doctor.d.ts +33 -0
  47. package/dist/cli/commands/doctor.d.ts.map +1 -0
  48. package/dist/cli/commands/doctor.js +135 -0
  49. package/dist/cli/commands/doctor.js.map +1 -0
  50. package/dist/cli/commands/export-servers.d.ts +22 -0
  51. package/dist/cli/commands/export-servers.d.ts.map +1 -0
  52. package/dist/cli/commands/export-servers.js +45 -0
  53. package/dist/cli/commands/export-servers.js.map +1 -0
  54. package/dist/cli/commands/import-servers.d.ts +57 -0
  55. package/dist/cli/commands/import-servers.d.ts.map +1 -0
  56. package/dist/cli/commands/import-servers.js +137 -0
  57. package/dist/cli/commands/import-servers.js.map +1 -0
  58. package/dist/cli/commands/routing.d.ts +34 -0
  59. package/dist/cli/commands/routing.d.ts.map +1 -0
  60. package/dist/cli/commands/routing.js +60 -0
  61. package/dist/cli/commands/routing.js.map +1 -0
  62. package/dist/cli/commands/test-server.d.ts +34 -0
  63. package/dist/cli/commands/test-server.d.ts.map +1 -0
  64. package/dist/cli/commands/test-server.js +86 -0
  65. package/dist/cli/commands/test-server.js.map +1 -0
  66. package/dist/cli/daemon.d.ts +60 -0
  67. package/dist/cli/daemon.d.ts.map +1 -0
  68. package/dist/cli/daemon.js +244 -0
  69. package/dist/cli/daemon.js.map +1 -0
  70. package/dist/cli/replay.d.ts +16 -0
  71. package/dist/cli/replay.d.ts.map +1 -0
  72. package/dist/cli/replay.js +89 -0
  73. package/dist/cli/replay.js.map +1 -0
  74. package/dist/cli/wizard/setup.d.ts +12 -0
  75. package/dist/cli/wizard/setup.d.ts.map +1 -0
  76. package/dist/cli/wizard/setup.js +71 -0
  77. package/dist/cli/wizard/setup.js.map +1 -0
  78. package/dist/config/defaults.d.ts.map +1 -1
  79. package/dist/config/defaults.js +4 -1
  80. package/dist/config/defaults.js.map +1 -1
  81. package/dist/config/schema.d.ts +34 -0
  82. package/dist/config/schema.d.ts.map +1 -1
  83. package/dist/daemon/client.d.ts +99 -0
  84. package/dist/daemon/client.d.ts.map +1 -0
  85. package/dist/daemon/client.js +292 -0
  86. package/dist/daemon/client.js.map +1 -0
  87. package/dist/daemon/discovery.d.ts +50 -0
  88. package/dist/daemon/discovery.d.ts.map +1 -0
  89. package/dist/daemon/discovery.js +104 -0
  90. package/dist/daemon/discovery.js.map +1 -0
  91. package/dist/daemon/index.d.ts +16 -0
  92. package/dist/daemon/index.d.ts.map +1 -0
  93. package/dist/daemon/index.js +11 -0
  94. package/dist/daemon/index.js.map +1 -0
  95. package/dist/daemon/sandbox-api.d.ts +45 -0
  96. package/dist/daemon/sandbox-api.d.ts.map +1 -0
  97. package/dist/daemon/sandbox-api.js +74 -0
  98. package/dist/daemon/sandbox-api.js.map +1 -0
  99. package/dist/daemon/server.d.ts +65 -0
  100. package/dist/daemon/server.d.ts.map +1 -0
  101. package/dist/daemon/server.js +373 -0
  102. package/dist/daemon/server.js.map +1 -0
  103. package/dist/daemon/shared-kv.d.ts +81 -0
  104. package/dist/daemon/shared-kv.d.ts.map +1 -0
  105. package/dist/daemon/shared-kv.js +215 -0
  106. package/dist/daemon/shared-kv.js.map +1 -0
  107. package/dist/daemon/shared-lock.d.ts +71 -0
  108. package/dist/daemon/shared-lock.d.ts.map +1 -0
  109. package/dist/daemon/shared-lock.js +119 -0
  110. package/dist/daemon/shared-lock.js.map +1 -0
  111. package/dist/hub/mcp-hub.d.ts +23 -0
  112. package/dist/hub/mcp-hub.d.ts.map +1 -1
  113. package/dist/hub/mcp-hub.js +34 -1
  114. package/dist/hub/mcp-hub.js.map +1 -1
  115. package/dist/index.js +7 -0
  116. package/dist/index.js.map +1 -1
  117. package/dist/observability/anomaly.d.ts +67 -0
  118. package/dist/observability/anomaly.d.ts.map +1 -0
  119. package/dist/observability/anomaly.js +141 -0
  120. package/dist/observability/anomaly.js.map +1 -0
  121. package/dist/observability/cost-predictor.d.ts +49 -0
  122. package/dist/observability/cost-predictor.d.ts.map +1 -0
  123. package/dist/observability/cost-predictor.js +145 -0
  124. package/dist/observability/cost-predictor.js.map +1 -0
  125. package/dist/observability/hot-path.d.ts +49 -0
  126. package/dist/observability/hot-path.d.ts.map +1 -0
  127. package/dist/observability/hot-path.js +125 -0
  128. package/dist/observability/hot-path.js.map +1 -0
  129. package/dist/observability/index.d.ts +10 -0
  130. package/dist/observability/index.d.ts.map +1 -0
  131. package/dist/observability/index.js +10 -0
  132. package/dist/observability/index.js.map +1 -0
  133. package/dist/observability/replay.d.ts +104 -0
  134. package/dist/observability/replay.d.ts.map +1 -0
  135. package/dist/observability/replay.js +239 -0
  136. package/dist/observability/replay.js.map +1 -0
  137. package/dist/registry/built-in-recommendations.d.ts +54 -0
  138. package/dist/registry/built-in-recommendations.d.ts.map +1 -0
  139. package/dist/registry/built-in-recommendations.js +65 -0
  140. package/dist/registry/built-in-recommendations.js.map +1 -0
  141. package/dist/registry/events.d.ts +26 -0
  142. package/dist/registry/events.d.ts.map +1 -0
  143. package/dist/registry/events.js +22 -0
  144. package/dist/registry/events.js.map +1 -0
  145. package/dist/registry/index.d.ts +159 -0
  146. package/dist/registry/index.d.ts.map +1 -0
  147. package/dist/registry/index.js +12 -0
  148. package/dist/registry/index.js.map +1 -0
  149. package/dist/registry/registry.d.ts +87 -0
  150. package/dist/registry/registry.d.ts.map +1 -0
  151. package/dist/registry/registry.js +294 -0
  152. package/dist/registry/registry.js.map +1 -0
  153. package/dist/registry/snapshot.d.ts +42 -0
  154. package/dist/registry/snapshot.d.ts.map +1 -0
  155. package/dist/registry/snapshot.js +71 -0
  156. package/dist/registry/snapshot.js.map +1 -0
  157. package/dist/registry/typegen.d.ts +48 -0
  158. package/dist/registry/typegen.d.ts.map +1 -0
  159. package/dist/registry/typegen.js +200 -0
  160. package/dist/registry/typegen.js.map +1 -0
  161. package/dist/registry/validator.d.ts +23 -0
  162. package/dist/registry/validator.d.ts.map +1 -0
  163. package/dist/registry/validator.js +50 -0
  164. package/dist/registry/validator.js.map +1 -0
  165. package/dist/reliability/breaker.d.ts +57 -0
  166. package/dist/reliability/breaker.d.ts.map +1 -0
  167. package/dist/reliability/breaker.js +130 -0
  168. package/dist/reliability/breaker.js.map +1 -0
  169. package/dist/reliability/errors.d.ts +78 -0
  170. package/dist/reliability/errors.d.ts.map +1 -0
  171. package/dist/reliability/errors.js +160 -0
  172. package/dist/reliability/errors.js.map +1 -0
  173. package/dist/reliability/gateway.d.ts +88 -0
  174. package/dist/reliability/gateway.d.ts.map +1 -0
  175. package/dist/reliability/gateway.js +180 -0
  176. package/dist/reliability/gateway.js.map +1 -0
  177. package/dist/reliability/index.d.ts +20 -0
  178. package/dist/reliability/index.d.ts.map +1 -0
  179. package/dist/reliability/index.js +16 -0
  180. package/dist/reliability/index.js.map +1 -0
  181. package/dist/reliability/profile.d.ts +49 -0
  182. package/dist/reliability/profile.d.ts.map +1 -0
  183. package/dist/reliability/profile.js +58 -0
  184. package/dist/reliability/profile.js.map +1 -0
  185. package/dist/reliability/retry.d.ts +39 -0
  186. package/dist/reliability/retry.d.ts.map +1 -0
  187. package/dist/reliability/retry.js +51 -0
  188. package/dist/reliability/retry.js.map +1 -0
  189. package/dist/reliability/timeout.d.ts +34 -0
  190. package/dist/reliability/timeout.d.ts.map +1 -0
  191. package/dist/reliability/timeout.js +53 -0
  192. package/dist/reliability/timeout.js.map +1 -0
  193. package/dist/runtime/executor.d.ts.map +1 -1
  194. package/dist/runtime/executor.js +122 -14
  195. package/dist/runtime/executor.js.map +1 -1
  196. package/dist/runtime/findtool/embed.d.ts +28 -0
  197. package/dist/runtime/findtool/embed.d.ts.map +1 -0
  198. package/dist/runtime/findtool/embed.js +85 -0
  199. package/dist/runtime/findtool/embed.js.map +1 -0
  200. package/dist/runtime/findtool/index.d.ts +52 -0
  201. package/dist/runtime/findtool/index.d.ts.map +1 -0
  202. package/dist/runtime/findtool/index.js +78 -0
  203. package/dist/runtime/findtool/index.js.map +1 -0
  204. package/dist/runtime/findtool/vector-index.d.ts +53 -0
  205. package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
  206. package/dist/runtime/findtool/vector-index.js +71 -0
  207. package/dist/runtime/findtool/vector-index.js.map +1 -0
  208. package/dist/runtime/helpers/budget.d.ts +27 -0
  209. package/dist/runtime/helpers/budget.d.ts.map +1 -0
  210. package/dist/runtime/helpers/budget.js +103 -0
  211. package/dist/runtime/helpers/budget.js.map +1 -0
  212. package/dist/runtime/helpers/compact.d.ts +32 -0
  213. package/dist/runtime/helpers/compact.d.ts.map +1 -0
  214. package/dist/runtime/helpers/compact.js +93 -0
  215. package/dist/runtime/helpers/compact.js.map +1 -0
  216. package/dist/runtime/helpers/delta.d.ts +45 -0
  217. package/dist/runtime/helpers/delta.d.ts.map +1 -0
  218. package/dist/runtime/helpers/delta.js +116 -0
  219. package/dist/runtime/helpers/delta.js.map +1 -0
  220. package/dist/runtime/helpers/index.d.ts +16 -0
  221. package/dist/runtime/helpers/index.d.ts.map +1 -0
  222. package/dist/runtime/helpers/index.js +13 -0
  223. package/dist/runtime/helpers/index.js.map +1 -0
  224. package/dist/runtime/helpers/summarize.d.ts +24 -0
  225. package/dist/runtime/helpers/summarize.d.ts.map +1 -0
  226. package/dist/runtime/helpers/summarize.js +124 -0
  227. package/dist/runtime/helpers/summarize.js.map +1 -0
  228. package/dist/runtime/helpers/worker-preload.d.ts +25 -0
  229. package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
  230. package/dist/runtime/helpers/worker-preload.js +223 -0
  231. package/dist/runtime/helpers/worker-preload.js.map +1 -0
  232. package/dist/runtime/index.d.ts +1 -0
  233. package/dist/runtime/index.d.ts.map +1 -1
  234. package/dist/runtime/index.js +1 -0
  235. package/dist/runtime/index.js.map +1 -1
  236. package/dist/runtime/pool/index.d.ts +11 -0
  237. package/dist/runtime/pool/index.d.ts.map +1 -0
  238. package/dist/runtime/pool/index.js +8 -0
  239. package/dist/runtime/pool/index.js.map +1 -0
  240. package/dist/runtime/pool/recycle.d.ts +44 -0
  241. package/dist/runtime/pool/recycle.d.ts.map +1 -0
  242. package/dist/runtime/pool/recycle.js +50 -0
  243. package/dist/runtime/pool/recycle.js.map +1 -0
  244. package/dist/runtime/pool/worker-pool.d.ts +77 -0
  245. package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
  246. package/dist/runtime/pool/worker-pool.js +216 -0
  247. package/dist/runtime/pool/worker-pool.js.map +1 -0
  248. package/dist/runtime/pool/worker.d.ts +80 -0
  249. package/dist/runtime/pool/worker.d.ts.map +1 -0
  250. package/dist/runtime/pool/worker.js +324 -0
  251. package/dist/runtime/pool/worker.js.map +1 -0
  252. package/dist/server/mcp-server.d.ts +3 -0
  253. package/dist/server/mcp-server.d.ts.map +1 -1
  254. package/dist/server/mcp-server.js +457 -3
  255. package/dist/server/mcp-server.js.map +1 -1
  256. package/dist/server/passthrough-registrar.d.ts +123 -0
  257. package/dist/server/passthrough-registrar.d.ts.map +1 -0
  258. package/dist/server/passthrough-registrar.js +199 -0
  259. package/dist/server/passthrough-registrar.js.map +1 -0
  260. package/dist/skills/skills-engine.d.ts +9 -1
  261. package/dist/skills/skills-engine.d.ts.map +1 -1
  262. package/dist/skills/skills-engine.js +20 -3
  263. package/dist/skills/skills-engine.js.map +1 -1
  264. package/dist/utils/index.d.ts +1 -0
  265. package/dist/utils/index.d.ts.map +1 -1
  266. package/dist/utils/index.js +1 -0
  267. package/dist/utils/index.js.map +1 -1
  268. package/dist/utils/tokenize.d.ts +55 -0
  269. package/dist/utils/tokenize.d.ts.map +1 -0
  270. package/dist/utils/tokenize.js +205 -0
  271. package/dist/utils/tokenize.js.map +1 -0
  272. package/dist/version.d.ts +3 -3
  273. package/dist/version.d.ts.map +1 -1
  274. package/dist/version.js +3 -3
  275. package/dist/version.js.map +1 -1
  276. package/package.json +13 -3
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Runtime pool — warm Deno worker pool for low-latency code execution.
3
+ * @module runtime/pool
4
+ */
5
+ export { WorkerPool } from './worker-pool.js';
6
+ export type { WorkerPoolOptions, PoolExecuteOptions } from './worker-pool.js';
7
+ export { PooledWorker } from './worker.js';
8
+ export type { WorkerOptions, WorkerJob, WorkerResult, WorkerState } from './worker.js';
9
+ export { evaluateRecycle, isEligible } from './recycle.js';
10
+ export type { RecycleCandidate, RecycleDecision } from './recycle.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Runtime pool — warm Deno worker pool for low-latency code execution.
3
+ * @module runtime/pool
4
+ */
5
+ export { WorkerPool } from './worker-pool.js';
6
+ export { PooledWorker } from './worker.js';
7
+ export { evaluateRecycle, isEligible } from './recycle.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/pool/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Worker Recycle Policy
3
+ *
4
+ * Determines when a warm Deno worker should be replaced. Three eviction
5
+ * triggers are evaluated in order:
6
+ * 1. Error state — worker crashed or entered an unrecoverable error
7
+ * 2. Age — worker has been alive longer than `maxAgeMs`
8
+ * 3. Job count — worker has processed more than `maxJobsPerWorker` jobs
9
+ *
10
+ * Recycle is designed to be async-safe: the pool spawns a replacement
11
+ * *before* terminating the old worker, ensuring capacity is never reduced
12
+ * during normal operation.
13
+ *
14
+ * @module runtime/pool/recycle
15
+ */
16
+ import type { WorkerPoolOptions } from './worker-pool.js';
17
+ export interface RecycleCandidate {
18
+ /** Worker unique identifier */
19
+ id: string;
20
+ /** Current state of the worker */
21
+ state: 'idle' | 'busy' | 'recycling' | 'dead';
22
+ /** Epoch ms when the worker was created */
23
+ createdAt: number;
24
+ /** Total jobs run since creation */
25
+ jobsRun: number;
26
+ }
27
+ export interface RecycleDecision {
28
+ shouldRecycle: boolean;
29
+ reason?: 'error' | 'age' | 'job-count';
30
+ }
31
+ /**
32
+ * Evaluate whether a worker should be recycled based on the pool policy.
33
+ *
34
+ * Called by the pool after every job completion and after any error event.
35
+ * When `shouldRecycle` is true, the pool spawns a replacement then calls
36
+ * `worker.shutdown(drainFirst=false)` on the old worker.
37
+ */
38
+ export declare function evaluateRecycle(candidate: RecycleCandidate, opts: Pick<WorkerPoolOptions, 'maxJobsPerWorker' | 'maxAgeMs'>): RecycleDecision;
39
+ /**
40
+ * Return true if a worker is eligible to receive new jobs
41
+ * (idle and not scheduled for recycle).
42
+ */
43
+ export declare function isEligible(candidate: RecycleCandidate, opts: Pick<WorkerPoolOptions, 'maxJobsPerWorker' | 'maxAgeMs'>): boolean;
44
+ //# sourceMappingURL=recycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recycle.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/recycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC9C,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,WAAW,CAAC;CACxC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,UAAU,CAAC,GAC7D,eAAe,CAoBjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,UAAU,CAAC,GAC7D,OAAO,CAIT"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Worker Recycle Policy
3
+ *
4
+ * Determines when a warm Deno worker should be replaced. Three eviction
5
+ * triggers are evaluated in order:
6
+ * 1. Error state — worker crashed or entered an unrecoverable error
7
+ * 2. Age — worker has been alive longer than `maxAgeMs`
8
+ * 3. Job count — worker has processed more than `maxJobsPerWorker` jobs
9
+ *
10
+ * Recycle is designed to be async-safe: the pool spawns a replacement
11
+ * *before* terminating the old worker, ensuring capacity is never reduced
12
+ * during normal operation.
13
+ *
14
+ * @module runtime/pool/recycle
15
+ */
16
+ /**
17
+ * Evaluate whether a worker should be recycled based on the pool policy.
18
+ *
19
+ * Called by the pool after every job completion and after any error event.
20
+ * When `shouldRecycle` is true, the pool spawns a replacement then calls
21
+ * `worker.shutdown(drainFirst=false)` on the old worker.
22
+ */
23
+ export function evaluateRecycle(candidate, opts) {
24
+ // Error state always recycles
25
+ if (candidate.state === 'dead' || candidate.state === 'recycling') {
26
+ return { shouldRecycle: true, reason: 'error' };
27
+ }
28
+ const now = Date.now();
29
+ const ageMs = now - candidate.createdAt;
30
+ const maxAge = opts.maxAgeMs ?? 600_000;
31
+ const maxJobs = opts.maxJobsPerWorker ?? 100;
32
+ if (ageMs >= maxAge) {
33
+ return { shouldRecycle: true, reason: 'age' };
34
+ }
35
+ if (candidate.jobsRun >= maxJobs) {
36
+ return { shouldRecycle: true, reason: 'job-count' };
37
+ }
38
+ return { shouldRecycle: false };
39
+ }
40
+ /**
41
+ * Return true if a worker is eligible to receive new jobs
42
+ * (idle and not scheduled for recycle).
43
+ */
44
+ export function isEligible(candidate, opts) {
45
+ if (candidate.state !== 'idle')
46
+ return false;
47
+ const { shouldRecycle } = evaluateRecycle(candidate, opts);
48
+ return !shouldRecycle;
49
+ }
50
+ //# sourceMappingURL=recycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recycle.js","sourceRoot":"","sources":["../../../src/runtime/pool/recycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoBH;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,SAA2B,EAC3B,IAA8D;IAE9D,8BAA8B;IAC9B,IAAI,SAAS,CAAC,KAAK,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAClE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC;IAE7C,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,SAAS,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;QACjC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,SAA2B,EAC3B,IAA8D;IAE9D,IAAI,SAAS,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,aAAa,CAAC;AACxB,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Warm Deno Worker Pool
3
+ *
4
+ * Maintains a fixed pool of pre-warmed Deno workers so that the first
5
+ * execute_code call after startup hits an already-running sandbox.
6
+ *
7
+ * Lifecycle:
8
+ * 1. `new WorkerPool(opts)` — configure
9
+ * 2. `await pool.warmUp()` — spawn `size` workers concurrently
10
+ * 3. `await pool.execute(job)` — pick idle worker, run, release
11
+ * 4. `await pool.shutdown()` — drain in-flight jobs, terminate all workers
12
+ *
13
+ * Recycle policy (see recycle.ts):
14
+ * - After `maxJobsPerWorker` jobs the worker is replaced before termination
15
+ * - After `maxAgeMs` age the worker is replaced after its current job finishes
16
+ * - After any uncaught error the worker is replaced immediately
17
+ *
18
+ * Phase 5 plug-in: pass `preloadHelpers` to `WorkerPoolOptions` and the
19
+ * bootstrap script inside `worker.ts` will `await import()` each path before
20
+ * entering the job loop.
21
+ *
22
+ * @module runtime/pool/worker-pool
23
+ */
24
+ import type { WorkerJob } from './worker.js';
25
+ export interface WorkerPoolOptions {
26
+ /** Number of warm workers to maintain (default: 4) */
27
+ size?: number;
28
+ /** Recycle a worker after this many jobs (default: 100) */
29
+ maxJobsPerWorker?: number;
30
+ /** Recycle a worker after this age in ms (default: 600000 = 10 min) */
31
+ maxAgeMs?: number;
32
+ /** Directory of generated .d.ts files from the registry (Agent A output) */
33
+ preloadTypesDir: string;
34
+ /**
35
+ * Additional helper scripts to preload in each worker.
36
+ * Phase 5 (Agent E) passes compact/summarize/delta helpers here.
37
+ * Default: [] (no additional preloads).
38
+ */
39
+ preloadHelpers?: string[];
40
+ /** Max Deno memory per worker in MB (default: 128) */
41
+ maxMemoryMb?: number;
42
+ /** Bridge URL injected into the sandbox (default: http://127.0.0.1:9847) */
43
+ bridgeUrl?: string;
44
+ }
45
+ export interface PoolExecuteOptions {
46
+ signal?: AbortSignal;
47
+ /** Timeout in ms for waiting to acquire an idle worker (default: 5000) */
48
+ acquireTimeoutMs?: number;
49
+ }
50
+ export declare class WorkerPool {
51
+ private readonly opts;
52
+ private workers;
53
+ private queue;
54
+ private isShuttingDown;
55
+ private isWarmedUp;
56
+ constructor(options: WorkerPoolOptions);
57
+ /** Pre-spawn all workers. Must be called before `execute()`. */
58
+ warmUp(): Promise<void>;
59
+ /**
60
+ * Execute a job on an idle worker.
61
+ *
62
+ * If no idle worker is available, the job is queued until one becomes
63
+ * free or the acquire timeout elapses.
64
+ */
65
+ execute<T = unknown>(job: Omit<WorkerJob, 'signal'>, execOpts?: PoolExecuteOptions): Promise<T>;
66
+ size(): number;
67
+ busyCount(): number;
68
+ idleCount(): number;
69
+ /** Gracefully drain all in-flight jobs then terminate all workers. */
70
+ shutdown(): Promise<void>;
71
+ private _findIdle;
72
+ private _runOnWorker;
73
+ private _maybeRecycle;
74
+ private _removeWorker;
75
+ private _drainQueue;
76
+ }
77
+ //# sourceMappingURL=worker-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/worker-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,SAAS,EAA+B,MAAM,aAAa,CAAC;AAM1E,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAkBD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,iBAAiB;IAYtC,gEAAgE;IAC1D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB7B;;;;;OAKG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC9B,QAAQ,GAAE,kBAAuB,GAChC,OAAO,CAAC,CAAC,CAAC;IAkCb,IAAI,IAAI,MAAM;IAId,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,MAAM;IAInB,sEAAsE;IAChE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB/B,OAAO,CAAC,SAAS;YAIH,YAAY;YAuBZ,aAAa;IAkD3B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;CAapB"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Warm Deno Worker Pool
3
+ *
4
+ * Maintains a fixed pool of pre-warmed Deno workers so that the first
5
+ * execute_code call after startup hits an already-running sandbox.
6
+ *
7
+ * Lifecycle:
8
+ * 1. `new WorkerPool(opts)` — configure
9
+ * 2. `await pool.warmUp()` — spawn `size` workers concurrently
10
+ * 3. `await pool.execute(job)` — pick idle worker, run, release
11
+ * 4. `await pool.shutdown()` — drain in-flight jobs, terminate all workers
12
+ *
13
+ * Recycle policy (see recycle.ts):
14
+ * - After `maxJobsPerWorker` jobs the worker is replaced before termination
15
+ * - After `maxAgeMs` age the worker is replaced after its current job finishes
16
+ * - After any uncaught error the worker is replaced immediately
17
+ *
18
+ * Phase 5 plug-in: pass `preloadHelpers` to `WorkerPoolOptions` and the
19
+ * bootstrap script inside `worker.ts` will `await import()` each path before
20
+ * entering the job loop.
21
+ *
22
+ * @module runtime/pool/worker-pool
23
+ */
24
+ import { logger } from '../../utils/index.js';
25
+ import { PooledWorker } from './worker.js';
26
+ import { evaluateRecycle } from './recycle.js';
27
+ // ─────────────────────────────────────────────────────────────────────────────
28
+ // WorkerPool
29
+ // ─────────────────────────────────────────────────────────────────────────────
30
+ const DEFAULT_SIZE = 4;
31
+ const DEFAULT_MAX_JOBS = 100;
32
+ const DEFAULT_MAX_AGE_MS = 600_000;
33
+ const DEFAULT_ACQUIRE_TIMEOUT_MS = 5_000;
34
+ export class WorkerPool {
35
+ opts;
36
+ workers = [];
37
+ queue = [];
38
+ isShuttingDown = false;
39
+ isWarmedUp = false;
40
+ constructor(options) {
41
+ this.opts = {
42
+ size: options.size ?? DEFAULT_SIZE,
43
+ maxJobsPerWorker: options.maxJobsPerWorker ?? DEFAULT_MAX_JOBS,
44
+ maxAgeMs: options.maxAgeMs ?? DEFAULT_MAX_AGE_MS,
45
+ preloadTypesDir: options.preloadTypesDir,
46
+ preloadHelpers: options.preloadHelpers ?? [],
47
+ maxMemoryMb: options.maxMemoryMb ?? 128,
48
+ bridgeUrl: options.bridgeUrl ?? 'http://127.0.0.1:9847',
49
+ };
50
+ }
51
+ /** Pre-spawn all workers. Must be called before `execute()`. */
52
+ async warmUp() {
53
+ if (this.isWarmedUp)
54
+ return;
55
+ const workerOpts = {
56
+ preloadTypesDir: this.opts.preloadTypesDir,
57
+ preloadHelpers: this.opts.preloadHelpers,
58
+ maxMemoryMb: this.opts.maxMemoryMb,
59
+ bridgeUrl: this.opts.bridgeUrl,
60
+ };
61
+ const spawns = Array.from({ length: this.opts.size }, async () => {
62
+ const w = new PooledWorker(workerOpts);
63
+ await w.start();
64
+ this.workers.push(w);
65
+ });
66
+ await Promise.allSettled(spawns);
67
+ const alive = this.workers.filter((w) => w.currentState !== 'dead').length;
68
+ logger.info('WorkerPool warmed up', { requested: this.opts.size, alive });
69
+ this.isWarmedUp = true;
70
+ }
71
+ /**
72
+ * Execute a job on an idle worker.
73
+ *
74
+ * If no idle worker is available, the job is queued until one becomes
75
+ * free or the acquire timeout elapses.
76
+ */
77
+ async execute(job, execOpts = {}) {
78
+ if (this.isShuttingDown) {
79
+ throw new Error('WorkerPool is shutting down');
80
+ }
81
+ const fullJob = {
82
+ ...job,
83
+ signal: execOpts.signal,
84
+ };
85
+ const worker = this._findIdle();
86
+ if (worker) {
87
+ return this._runOnWorker(worker, fullJob);
88
+ }
89
+ // Queue the job
90
+ const acquireTimeoutMs = execOpts.acquireTimeoutMs ?? DEFAULT_ACQUIRE_TIMEOUT_MS;
91
+ return new Promise((resolve, reject) => {
92
+ const timeoutTimer = setTimeout(() => {
93
+ const idx = this.queue.findIndex((q) => q.job.id === fullJob.id);
94
+ if (idx !== -1)
95
+ this.queue.splice(idx, 1);
96
+ reject(new Error(`WorkerPool: acquire timeout after ${acquireTimeoutMs}ms`));
97
+ }, acquireTimeoutMs);
98
+ if (timeoutTimer.unref)
99
+ timeoutTimer.unref();
100
+ this.queue.push({
101
+ job: fullJob,
102
+ resolve: resolve,
103
+ reject,
104
+ timeoutTimer,
105
+ });
106
+ });
107
+ }
108
+ size() {
109
+ return this.workers.filter((w) => w.currentState !== 'dead').length;
110
+ }
111
+ busyCount() {
112
+ return this.workers.filter((w) => w.currentState === 'busy').length;
113
+ }
114
+ idleCount() {
115
+ return this.workers.filter((w) => w.currentState === 'idle').length;
116
+ }
117
+ /** Gracefully drain all in-flight jobs then terminate all workers. */
118
+ async shutdown() {
119
+ this.isShuttingDown = true;
120
+ // Reject queued jobs that haven't started
121
+ for (const queued of this.queue) {
122
+ clearTimeout(queued.timeoutTimer);
123
+ queued.reject(new Error('WorkerPool shut down'));
124
+ }
125
+ this.queue.length = 0;
126
+ // Drain busy workers (wait for current jobs to finish, then terminate)
127
+ await Promise.allSettled(this.workers.map((w) => w.shutdown(true)));
128
+ this.workers.length = 0;
129
+ logger.info('WorkerPool: shutdown complete');
130
+ }
131
+ // ─────────────────────────────────────────────────────────────────────────
132
+ // Private
133
+ // ─────────────────────────────────────────────────────────────────────────
134
+ _findIdle() {
135
+ return this.workers.find((w) => w.isIdle && w.currentState === 'idle');
136
+ }
137
+ async _runOnWorker(worker, job) {
138
+ let result;
139
+ try {
140
+ result = await worker.execute(job);
141
+ }
142
+ catch (err) {
143
+ // Worker errored — mark for recycle and propagate
144
+ await this._maybeRecycle(worker);
145
+ throw err;
146
+ }
147
+ // Post-job recycle check (age / job-count triggers)
148
+ await this._maybeRecycle(worker);
149
+ // Drain one queued job onto the (now idle) worker or next available idle
150
+ this._drainQueue();
151
+ if (!result.success && result.error) {
152
+ throw new Error(result.error.message);
153
+ }
154
+ return result.result;
155
+ }
156
+ async _maybeRecycle(worker) {
157
+ const decision = evaluateRecycle({
158
+ id: worker.id,
159
+ state: worker.currentState,
160
+ createdAt: worker.createdAt,
161
+ jobsRun: worker.jobsRun,
162
+ }, { maxJobsPerWorker: this.opts.maxJobsPerWorker, maxAgeMs: this.opts.maxAgeMs });
163
+ if (!decision.shouldRecycle)
164
+ return;
165
+ logger.debug('WorkerPool: recycling worker', { workerId: worker.id, reason: decision.reason });
166
+ // Spawn replacement first to maintain capacity
167
+ const workerOpts = {
168
+ preloadTypesDir: this.opts.preloadTypesDir,
169
+ preloadHelpers: this.opts.preloadHelpers,
170
+ maxMemoryMb: this.opts.maxMemoryMb,
171
+ bridgeUrl: this.opts.bridgeUrl,
172
+ };
173
+ if (!this.isShuttingDown) {
174
+ const replacement = new PooledWorker(workerOpts);
175
+ // Start async — don't block the caller
176
+ replacement.start().then(() => {
177
+ const idx = this.workers.indexOf(worker);
178
+ if (idx !== -1) {
179
+ this.workers.splice(idx, 1, replacement);
180
+ }
181
+ else {
182
+ this.workers.push(replacement);
183
+ }
184
+ this._drainQueue();
185
+ logger.debug('WorkerPool: replacement worker ready', { workerId: replacement.id });
186
+ }).catch((err) => {
187
+ logger.error('WorkerPool: replacement spawn failed', { err: String(err) });
188
+ // Remove old dead worker anyway
189
+ this._removeWorker(worker);
190
+ });
191
+ }
192
+ // Terminate old worker (drainFirst=false: it's already idle or dead)
193
+ await worker.shutdown(false);
194
+ if (this.isShuttingDown) {
195
+ this._removeWorker(worker);
196
+ }
197
+ }
198
+ _removeWorker(worker) {
199
+ const idx = this.workers.indexOf(worker);
200
+ if (idx !== -1)
201
+ this.workers.splice(idx, 1);
202
+ }
203
+ _drainQueue() {
204
+ while (this.queue.length > 0) {
205
+ const idle = this._findIdle();
206
+ if (!idle)
207
+ break;
208
+ const queued = this.queue.shift();
209
+ clearTimeout(queued.timeoutTimer);
210
+ this._runOnWorker(idle, queued.job)
211
+ .then((result) => queued.resolve(result))
212
+ .catch((err) => queued.reject(err));
213
+ }
214
+ }
215
+ }
216
+ //# sourceMappingURL=worker-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../../../src/runtime/pool/worker-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Individual Deno Worker Lifecycle
3
+ *
4
+ * Manages a single warm Deno worker subprocess. The worker runs a persistent
5
+ * bootstrap script that:
6
+ * 1. Accepts a list of preload helper scripts (Phase 5 plug-in point)
7
+ * 2. Waits for job messages on stdin, executes the code, returns results on stdout
8
+ *
9
+ * Communication protocol (newline-delimited JSON over stdio):
10
+ * host → worker: { id, code, context }
11
+ * worker → host: { id, success, result?, error?, logs }
12
+ *
13
+ * @module runtime/pool/worker
14
+ */
15
+ export interface WorkerOptions {
16
+ /** Directory containing generated .d.ts files from the registry */
17
+ preloadTypesDir: string;
18
+ /**
19
+ * Additional helper scripts to preload (absolute paths or Deno URLs).
20
+ * Phase 5 (Agent E) plugs compact/summarize/delta helpers in here.
21
+ */
22
+ preloadHelpers?: string[];
23
+ /** Maximum old-space memory for the Deno process (MB) */
24
+ maxMemoryMb?: number;
25
+ /** Bridge URL the sandbox code uses for MCP calls */
26
+ bridgeUrl?: string;
27
+ }
28
+ export interface WorkerJob {
29
+ /** Unique job identifier for routing responses */
30
+ id: string;
31
+ /** TypeScript source code to execute */
32
+ code: string;
33
+ /** Execution context injected as global variables */
34
+ context: Record<string, unknown>;
35
+ /** Optional AbortSignal to cancel in-flight job */
36
+ signal?: AbortSignal;
37
+ }
38
+ export interface WorkerResult {
39
+ id: string;
40
+ success: boolean;
41
+ result?: unknown;
42
+ error?: {
43
+ message: string;
44
+ stack?: string;
45
+ };
46
+ logs: string[];
47
+ }
48
+ export type WorkerState = 'idle' | 'busy' | 'recycling' | 'dead';
49
+ export declare class PooledWorker {
50
+ private readonly opts;
51
+ readonly id: string;
52
+ private state;
53
+ private proc;
54
+ private bootstrapFile;
55
+ private lineBuffer;
56
+ private pending;
57
+ readonly createdAt: number;
58
+ jobsRun: number;
59
+ constructor(opts: WorkerOptions);
60
+ get currentState(): WorkerState;
61
+ get isIdle(): boolean;
62
+ /** Spawn the Deno subprocess. */
63
+ start(): Promise<void>;
64
+ /**
65
+ * Execute a job on this worker.
66
+ * The worker must be idle before calling this.
67
+ */
68
+ execute(job: WorkerJob): Promise<WorkerResult>;
69
+ /**
70
+ * Gracefully shut down the worker.
71
+ * If `drainFirst` is true, waits for any in-flight job to complete.
72
+ */
73
+ shutdown(drainFirst?: boolean): Promise<void>;
74
+ private _handleLine;
75
+ private _handleClose;
76
+ private _rejectAll;
77
+ private _terminate;
78
+ private _cleanup;
79
+ }
80
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/runtime/pool/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AA4GjE,qBAAa,YAAY;IAcX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,OAAO,CAGA;IAEf,QAAQ,CAAC,SAAS,SAAc;IAChC,OAAO,SAAK;gBAEiB,IAAI,EAAE,aAAa;IAIhD,IAAI,YAAY,IAAI,WAAW,CAE9B;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,iCAAiC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8D5B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAoD9C;;;OAGG;IACG,QAAQ,CAAC,UAAU,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhD,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,QAAQ;CAMjB"}