adaptive-memory-multi-model-router 2.14.49 → 2.14.52

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 (605) hide show
  1. package/.dockerignore +82 -0
  2. package/.env.example +303 -0
  3. package/.github/DISCUSSIONS_WELCOME.md +27 -0
  4. package/.github/DISCUSSION_TEMPLATE.yml +5 -0
  5. package/.github/FUNDING.yml +2 -0
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +94 -0
  7. package/.github/ISSUE_TEMPLATE/config.yml +17 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.md +71 -0
  9. package/.github/PULL_REQUEST_TEMPLATE.md +71 -0
  10. package/.github/dependabot.yml +9 -0
  11. package/.github/workflows/ci.yml +263 -0
  12. package/.github/workflows/codeql.yml +38 -0
  13. package/.github/workflows/npm-publish.yml +20 -0
  14. package/.github/workflows/pages.yml +37 -0
  15. package/.github/workflows/stale.yml +54 -0
  16. package/.publish-tick +1 -0
  17. package/.well-known/ai-plugin.json +16 -0
  18. package/AGENT_COUNCIL_FINDINGS.md +142 -0
  19. package/ARCHITECTURE.md +346 -0
  20. package/AUDIT_REPORT.md +28 -0
  21. package/CODE_OF_CONDUCT.md +128 -0
  22. package/CONTRIBUTING.md +50 -0
  23. package/CONTRIBUTORS.md +20 -0
  24. package/Dockerfile +53 -0
  25. package/Dockerfile.proxy +33 -0
  26. package/HEALTH_REPORT.md +118 -0
  27. package/IMPROVEMENT_PLAN.md +107 -0
  28. package/LANDING.md +43 -0
  29. package/LAUNCH-PAIN-DRIVEN.md +339 -0
  30. package/LAUNCH.md +337 -0
  31. package/LAUNCH_CHECKLIST.md +141 -0
  32. package/LAUNCH_SNAPSHOT.md +260 -0
  33. package/MANIFESTO.md +41 -0
  34. package/POPULARITY_BOOSTERS.md +285 -0
  35. package/PR_STATUS_REPORT.md +148 -0
  36. package/README.md +25 -14
  37. package/REDESIGN.md +95 -0
  38. package/RUNKIT.md +83 -0
  39. package/SECURITY.md +29 -0
  40. package/SUBMISSIONS.md +43 -0
  41. package/_schema.html +53 -0
  42. package/ai-plugin.json +16 -0
  43. package/articles/AI_AGENT_LLM_ROUTING.md +150 -0
  44. package/articles/CHINESE_DIRECTORIES.md +100 -0
  45. package/articles/CHINESE_SUBMISSIONS_READY.md +322 -0
  46. package/articles/COMPETITOR_ALERTS.md +31 -0
  47. package/articles/COMPLETE_POSTING_DIRECTORY.md +147 -0
  48. package/articles/CONTENT_STRUCTURE.md +292 -0
  49. package/articles/DEVTO_COST_GUIDE.md +473 -0
  50. package/articles/DEVTO_FINAL.md +416 -0
  51. package/articles/DEVTO_MULTI_PROVIDER.md +542 -0
  52. package/articles/DEVTO_READY.md +255 -0
  53. package/articles/DEVTO_V2_ANNOUNCEMENT.md +160 -0
  54. package/articles/DEVTO_VIRAL_GROWTH.md +280 -0
  55. package/articles/FRESH_devto.md +460 -0
  56. package/articles/FRESH_devto_2026_05.md +73 -0
  57. package/articles/FRESH_hackernews.md +14 -0
  58. package/articles/FRESH_reddit_ml.md +90 -0
  59. package/articles/FRESH_reddit_node.md +198 -0
  60. package/articles/FRESH_reddit_sideproject.md +72 -0
  61. package/articles/FRESH_reddit_webdev.md +130 -0
  62. package/articles/FROM_ZERO_TO_10K.md +107 -0
  63. package/articles/HN_10X_BETTER.md +430 -0
  64. package/articles/HN_ACCOUNT_GUIDE.md +21 -0
  65. package/articles/HN_CHINESE_STYLE.md +308 -0
  66. package/articles/HN_FINAL.md +148 -0
  67. package/articles/HN_POSTED_VERSION.md +56 -0
  68. package/articles/HN_POST_READY.md +137 -0
  69. package/articles/HN_RESEARCH.md +364 -0
  70. package/articles/HN_SHOW_routerarena.md +17 -0
  71. package/articles/HN_TIMING_GUIDE.md +52 -0
  72. package/articles/INDIEHACKERS_POST.md +52 -0
  73. package/articles/INDIEHACKERS_READY.md +120 -0
  74. package/articles/LLM_BENCHMARK_DEEP_DIVE.md +153 -0
  75. package/articles/MASTER_POSTING_DIRECTORY.md +189 -0
  76. package/articles/NEWSLETTER_SEND_NOW.md +259 -0
  77. package/articles/NEWSLETTER_SUBMISSIONS.md +112 -0
  78. package/articles/PAIN-DRIVEN-devto-v2.md +308 -0
  79. package/articles/PAIN-DRIVEN-devto-v3.md +268 -0
  80. package/articles/PAIN-DRIVEN-devto.md +242 -0
  81. package/articles/PAIN-DRIVEN-hackernews-v2.md +138 -0
  82. package/articles/PAIN-DRIVEN-hackernews-v3.md +151 -0
  83. package/articles/PAIN-DRIVEN-hackernews.md +131 -0
  84. package/articles/PAIN-DRIVEN-reddit-v2.md +301 -0
  85. package/articles/PAIN-DRIVEN-reddit-v3.md +236 -0
  86. package/articles/PAIN-DRIVEN-reddit.md +218 -0
  87. package/articles/PAIN-DRIVEN-twitter-v2.md +110 -0
  88. package/articles/PAIN-DRIVEN-twitter-v3.md +121 -0
  89. package/articles/PAIN-DRIVEN-twitter.md +120 -0
  90. package/articles/PORTKEY_VS_A3M.md +147 -0
  91. package/articles/POSTING_KIT_2026_05.md +67 -0
  92. package/articles/PRESS_KIT_routerarena.md +77 -0
  93. package/articles/PRODUCTHUNT_LISTING.md +48 -0
  94. package/articles/PRODUCTHUNT_READY.md +106 -0
  95. package/articles/PR_PLAN_vault.md +125 -0
  96. package/articles/REDDIT_FINAL.md +232 -0
  97. package/articles/REDDIT_POST.md +67 -0
  98. package/articles/REDDIT_SUBMISSION_READY.md +348 -0
  99. package/articles/ROUTERARENA_9677.md +78 -0
  100. package/articles/ROUTERARENA_LEADER.md +45 -0
  101. package/articles/SHOW_HN_FINAL.md +29 -0
  102. package/articles/TWEETS_10K_DOWNLOADS.md +47 -0
  103. package/articles/TWEETS_BENCHMARK_FIRST.md +46 -0
  104. package/articles/TWEETS_MCP_PLAY.md +51 -0
  105. package/articles/TWEETS_SEQUENTIAL_BROKEN.md +49 -0
  106. package/articles/TWEETS_WHY_BUILD.md +54 -0
  107. package/articles/TWEETS_routerarena_leader.md +53 -0
  108. package/articles/TWEET_STORM_READY.md +165 -0
  109. package/articles/TWITTER_FINAL.md +167 -0
  110. package/articles/WHY_10X_BETTER.md +261 -0
  111. package/articles/WHY_CHINESE_STYLE_BETTER.md +323 -0
  112. package/articles/ai-discoverability-llm-routing.md +210 -0
  113. package/articles/devto-llm-routing.md +138 -0
  114. package/articles/hackernews-show-hn.md +54 -0
  115. package/articles/hashnode-llm-cost-optimization.md +125 -0
  116. package/articles/hn_show_2026_05.md +11 -0
  117. package/articles/medium-building-llm-router.md +205 -0
  118. package/articles/reddit-ml.md +76 -0
  119. package/articles/twitter-thread-cost-savings.md +50 -0
  120. package/articles/youtube-tutorial-script.md +262 -0
  121. package/assets/a3m_3blue1brown.mp4 +0 -0
  122. package/assets/banner.svg +109 -0
  123. package/assets/chart-cost-v2.svg +91 -0
  124. package/assets/chart-cost-v3.svg +143 -0
  125. package/assets/chart-features-v2.svg +132 -0
  126. package/assets/chart-features-v3.svg +211 -0
  127. package/assets/chart-growth-v2.svg +122 -0
  128. package/assets/chart-growth-v3.svg +189 -0
  129. package/assets/cost-comparison.svg +134 -0
  130. package/assets/cost-simple.svg +64 -0
  131. package/assets/demo-hn.gif +0 -0
  132. package/assets/feature-matrix.svg +136 -0
  133. package/assets/growth-chart-animated.svg +76 -0
  134. package/assets/growth-chart.svg +82 -0
  135. package/assets/growth-simple.svg +69 -0
  136. package/assets/hero-diagram.svg +81 -0
  137. package/assets/logo-new.svg +21 -0
  138. package/assets/logo.svg +68 -0
  139. package/assets/provider-comparison.svg +121 -0
  140. package/assets/social-preview-new.svg +100 -0
  141. package/assets/social-preview.svg +194 -0
  142. package/assets/social-v2.svg +130 -0
  143. package/assets/social-v3.svg +212 -0
  144. package/benchmark-provider-results.json +245 -0
  145. package/benchmark-results.json +54 -0
  146. package/council-votes/architecture-vote.md +121 -0
  147. package/council-votes/coverage-vote.md +93 -0
  148. package/data/adaptive-benchmark.json +92 -0
  149. package/data/benchmark-results.json +47 -0
  150. package/data/labeled-benchmark.json +88 -0
  151. package/demo/3blue1brown_video.py +285 -0
  152. package/demo/3blue1brown_video_v2.py +310 -0
  153. package/demo/IMPROVED_PROMPTS.md +229 -0
  154. package/demo/VEO3_PROMPTS.md +269 -0
  155. package/demo/VIDEO_PRODUCTION_GUIDE.md +333 -0
  156. package/demo/a3m_3blue1brown.mp4 +0 -0
  157. package/demo/asciinema-demo.sh +195 -0
  158. package/demo/demo-hn.tape +74 -0
  159. package/demo/demo-script.md +53 -0
  160. package/demo/demo-script.sh +62 -0
  161. package/demo/demo.svg +75 -0
  162. package/demo/frame1_ai_data_center.png +0 -0
  163. package/demo/frame1_sunset_video.mp4 +0 -0
  164. package/demo/frame2_cost_comparison.png +0 -0
  165. package/demo/frame2_cost_comparison_fallback.png +0 -0
  166. package/demo/frame3_parallel_execution.png +0 -0
  167. package/demo/frame3_parallel_execution_fallback.png +0 -0
  168. package/demo/frame4_providers.png +0 -0
  169. package/demo/frame4_providers_fallback.png +0 -0
  170. package/demo/frame5_endcard.png +0 -0
  171. package/demo/frame5_endcard_fallback.png +0 -0
  172. package/demo/new_frame1_hook.png +0 -0
  173. package/demo/new_frame2_proof.png +0 -0
  174. package/demo/new_frame3_wow.png +0 -0
  175. package/demo/new_frame4_social.png +0 -0
  176. package/demo/new_frame5_cta.png +0 -0
  177. package/demo/package.json +13 -0
  178. package/demo/product-video-final.mp4 +0 -0
  179. package/demo/product-video-hype-v1.mp4 +0 -0
  180. package/demo/product-video-v1.mp4 +0 -0
  181. package/demo/public/index.html +762 -0
  182. package/demo/recording.cast +55 -0
  183. package/demo/server.js +405 -0
  184. package/demo-new.tape +71 -0
  185. package/demo-real.sh +198 -0
  186. package/demo-simple.tape +205 -0
  187. package/demo.html +520 -0
  188. package/demo.sh +85 -0
  189. package/demo.tape +259 -0
  190. package/dist/analytics/costAnalytics.d.ts.map +1 -0
  191. package/dist/analytics/costAnalytics.js.map +1 -0
  192. package/dist/benchmark/comprehensive.js.map +1 -0
  193. package/dist/benchmark/reproducible.d.ts.map +1 -0
  194. package/dist/benchmark/reproducible.js.map +1 -0
  195. package/dist/cache/prefixCache.d.ts.map +1 -0
  196. package/dist/cache/prefixCache.js.map +1 -0
  197. package/dist/cache/responseCache.d.ts.map +1 -0
  198. package/dist/cache/responseCache.js.map +1 -0
  199. package/dist/cache/semanticCache.d.ts.map +1 -0
  200. package/dist/cache/semanticCache.js.map +1 -0
  201. package/dist/cli/setupWizard.d.ts.map +1 -0
  202. package/dist/cli/setupWizard.js.map +1 -0
  203. package/dist/cost/budgetEnforcer.d.ts.map +1 -0
  204. package/dist/cost/budgetEnforcer.js.map +1 -0
  205. package/dist/cost/costTracker.d.ts.map +1 -0
  206. package/dist/cost/costTracker.js.map +1 -0
  207. package/dist/ensemble/multiRoundDialog.js.map +1 -0
  208. package/dist/ensemble/shapleyValue.js.map +1 -0
  209. package/dist/integrations/langchainAdapter.d.ts.map +1 -0
  210. package/dist/integrations/langchainAdapter.js.map +1 -0
  211. package/dist/integrations/oauth.d.ts.map +1 -0
  212. package/dist/integrations/oauth.js.map +1 -0
  213. package/dist/integrations/scienceAdapter.js.map +1 -0
  214. package/dist/memory/autoFetch.d.ts.map +1 -0
  215. package/dist/memory/autoFetch.js.map +1 -0
  216. package/dist/memory/episodicMemory.d.ts.map +1 -0
  217. package/dist/memory/episodicMemory.js.map +1 -0
  218. package/dist/memory/hybridMemory.js.map +1 -0
  219. package/dist/memory/memoryTree.d.ts.map +1 -0
  220. package/dist/memory/memoryTree.js.map +1 -0
  221. package/dist/memory/obsidianVault.d.ts.map +1 -0
  222. package/dist/memory/obsidianVault.js.map +1 -0
  223. package/dist/memory/reasoningBank.js.map +1 -0
  224. package/dist/observability/changeWatch.d.ts.map +1 -0
  225. package/dist/observability/changeWatch.js.map +1 -0
  226. package/dist/observability/fatigueDetector.d.ts.map +1 -0
  227. package/dist/observability/fatigueDetector.js.map +1 -0
  228. package/dist/observability/index.d.ts.map +1 -0
  229. package/dist/observability/index.js.map +1 -0
  230. package/dist/observability/metrics.d.ts.map +1 -0
  231. package/dist/observability/metrics.js.map +1 -0
  232. package/dist/observability/middleware.d.ts.map +1 -0
  233. package/dist/observability/middleware.js.map +1 -0
  234. package/dist/observability/tracer.d.ts.map +1 -0
  235. package/dist/observability/tracer.js.map +1 -0
  236. package/dist/observability/types.d.ts.map +1 -0
  237. package/dist/observability/types.js.map +1 -0
  238. package/dist/orchestration/haloOrchestrator.d.ts.map +1 -0
  239. package/dist/orchestration/haloOrchestrator.js.map +1 -0
  240. package/dist/orchestration/mctsWorkflow.d.ts.map +1 -0
  241. package/dist/orchestration/mctsWorkflow.js.map +1 -0
  242. package/dist/providers/localProvider.d.ts.map +1 -0
  243. package/dist/providers/localProvider.js.map +1 -0
  244. package/dist/providers/providerConfig.d.ts.map +1 -0
  245. package/dist/providers/providerConfig.js.map +1 -0
  246. package/dist/providers/registry.d.ts.map +1 -0
  247. package/dist/providers/registry.js.map +1 -0
  248. package/dist/routing/advancedRouter.d.ts.map +1 -0
  249. package/dist/routing/advancedRouter.js +1 -1
  250. package/dist/routing/advancedRouter.js.map +1 -0
  251. package/dist/routing/crossModelValidation.d.ts.map +1 -0
  252. package/dist/routing/crossModelValidation.js.map +1 -0
  253. package/dist/routing/providerHealth.d.ts.map +1 -0
  254. package/dist/routing/providerHealth.js.map +1 -0
  255. package/dist/routing/providerRetry.d.ts.map +1 -0
  256. package/dist/routing/providerRetry.js.map +1 -0
  257. package/dist/scripts/banner.js +29 -0
  258. package/dist/security/guardrails.d.ts.map +1 -0
  259. package/dist/security/guardrails.js.map +1 -0
  260. package/dist/server/dashboard.d.ts.map +1 -0
  261. package/dist/server/dashboard.js.map +1 -0
  262. package/dist/server/modelMapper.d.ts.map +1 -0
  263. package/dist/server/modelMapper.js.map +1 -0
  264. package/dist/server/proxyServer.d.ts.map +1 -0
  265. package/dist/server/proxyServer.js.map +1 -0
  266. package/dist/skills/__tests__/skill_manager.test.d.ts +2 -0
  267. package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -0
  268. package/dist/skills/__tests__/skill_manager.test.js +268 -0
  269. package/dist/skills/__tests__/skill_manager.test.js.map +1 -0
  270. package/dist/tools/tmlpdTools.d.ts.map +1 -0
  271. package/dist/tools/tmlpdTools.js.map +1 -0
  272. package/dist/tui/dashboard.d.ts.map +1 -0
  273. package/dist/tui/dashboard.js.map +1 -0
  274. package/dist/tui/index.d.ts.map +1 -0
  275. package/dist/tui/index.js.map +1 -0
  276. package/dist/utils/batchProcessor.d.ts.map +1 -0
  277. package/dist/utils/batchProcessor.js.map +1 -0
  278. package/dist/utils/compression.d.ts.map +1 -0
  279. package/dist/utils/compression.js.map +1 -0
  280. package/dist/utils/costUtils.d.ts.map +1 -0
  281. package/dist/utils/costUtils.js.map +1 -0
  282. package/dist/utils/reliability.d.ts.map +1 -0
  283. package/dist/utils/reliability.js.map +1 -0
  284. package/dist/utils/sorting.d.ts.map +1 -0
  285. package/dist/utils/sorting.js.map +1 -0
  286. package/dist/utils/speculativeDecoding.d.ts.map +1 -0
  287. package/dist/utils/speculativeDecoding.js.map +1 -0
  288. package/dist/utils/tokenUtils.d.ts.map +1 -0
  289. package/dist/utils/tokenUtils.js.map +1 -0
  290. package/docs/.nojekyll +0 -0
  291. package/docs/ANALYSIS_PRINCIPLES.md +162 -0
  292. package/docs/API.md +855 -0
  293. package/docs/ARCHITECTURAL-IMPROVEMENTS-2025.md +1391 -0
  294. package/docs/ARCHITECTURAL-IMPROVEMENTS-REVISED-2025.md +1051 -0
  295. package/docs/BENCHMARK.md +170 -0
  296. package/docs/CHINESE_PROVIDER_RELIABILITY.md +37 -0
  297. package/docs/CITATIONS.md +74 -0
  298. package/docs/CLAIMS_AND_EVIDENCE.md +58 -0
  299. package/docs/CONFIGURATION.md +476 -0
  300. package/docs/COUNCIL_DECISION.json +816 -0
  301. package/docs/COUNCIL_SUMMARY.md +319 -0
  302. package/docs/COUNCIL_V2.2_DECISION.md +416 -0
  303. package/docs/ENGINEERING_SPEC.md +55 -0
  304. package/docs/FACTORY_RESET.md +34 -0
  305. package/docs/GEO.md +66 -0
  306. package/docs/GEO_OPTIMIZATION.md +30 -0
  307. package/docs/GEO_ROOT_CAUSE.md +136 -0
  308. package/docs/GEO_STATUS.md +85 -0
  309. package/docs/GEO_TEST_RESULTS.md +176 -0
  310. package/docs/HN_CHECKLIST.md +38 -0
  311. package/docs/HN_FOUNDER_COMMENT.md +17 -0
  312. package/docs/HN_SUBMISSION_FINAL.md +180 -0
  313. package/docs/HN_SUBMISSION_V3.md +56 -0
  314. package/docs/IMPROVEMENT_ROADMAP.md +515 -0
  315. package/docs/INTEGRATIONS.md +420 -0
  316. package/docs/LANGCHAIN_INTEGRATION.md +147 -0
  317. package/docs/LLM_COUNCIL_DECISION.md +508 -0
  318. package/docs/MIDDLEWARE_CHAIN.md +35 -0
  319. package/docs/PROMO_CHECKLIST.md +200 -0
  320. package/docs/QUICKSTART.md +271 -0
  321. package/docs/QUICK_START.md +43 -0
  322. package/docs/QUICK_START_VISIBILITY.md +782 -0
  323. package/docs/REDDIT_GAP_ANALYSIS.md +299 -0
  324. package/docs/RELEASE_CHECKLIST.md +32 -0
  325. package/docs/REPRODUCIBILITY.md +63 -0
  326. package/docs/RESEARCH_BACKED_IMPROVEMENTS.md +1180 -0
  327. package/docs/ROUTING_RUBRIC.md +197 -0
  328. package/docs/SEO_AUDIT.md +186 -0
  329. package/docs/SOCIAL_LISTENING.md +219 -0
  330. package/docs/TMLPD_QNA.md +751 -0
  331. package/docs/TMLPD_V2.1_COMPLETE.md +763 -0
  332. package/docs/TMLPD_V2.2_RESEARCH_ROADMAP.md +754 -0
  333. package/docs/UPDATE_TOPICS.md +15 -0
  334. package/docs/USE_CASES.md +59 -0
  335. package/docs/V2.2_IMPLEMENTATION_COMPLETE.md +446 -0
  336. package/docs/V2_IMPLEMENTATION_GUIDE.md +388 -0
  337. package/docs/VERCEL_AI_SDK.md +209 -0
  338. package/docs/VISIBILITY_ADOPTION_PLAN.md +1005 -0
  339. package/docs/_config.yml +49 -0
  340. package/docs/ai-plugin.json +16 -0
  341. package/docs/api.html +513 -0
  342. package/docs/architecture-diagram.md +40 -0
  343. package/docs/benchmark-chart.png +0 -0
  344. package/docs/benchmark.html +387 -0
  345. package/docs/blog/routerarena-9677.html +92 -0
  346. package/docs/blog/routerarena-number-one.html +73 -0
  347. package/docs/cli-cheatsheet.md +339 -0
  348. package/docs/compare.md +109 -0
  349. package/docs/comparison-litellm.md +88 -0
  350. package/docs/comparison.md +108 -0
  351. package/docs/cost-chart-ascii.md +42 -0
  352. package/docs/cost-comparison-chart.svg +88 -0
  353. package/docs/curl-examples.md +247 -0
  354. package/docs/demo-auto.html +264 -0
  355. package/docs/demo.html +416 -0
  356. package/docs/geo/GENERATIVE_ENGINE_OPTIMIZATION.md +232 -0
  357. package/docs/index.html +507 -0
  358. package/docs/launch-content/LAUNCH_EXECUTION_CHECKLIST.md +421 -0
  359. package/docs/launch-content/README.md +457 -0
  360. package/docs/launch-content/assets/cost_comparison_100_tasks.png +0 -0
  361. package/docs/launch-content/assets/cumulative_savings.png +0 -0
  362. package/docs/launch-content/assets/parallel_speedup.png +0 -0
  363. package/docs/launch-content/assets/provider_pricing_comparison.png +0 -0
  364. package/docs/launch-content/assets/task_breakdown_comparison.png +0 -0
  365. package/docs/launch-content/generate_charts.py +313 -0
  366. package/docs/launch-content/hn_show_post.md +139 -0
  367. package/docs/launch-content/partner_outreach_templates.md +745 -0
  368. package/docs/launch-content/reddit_posts.md +467 -0
  369. package/docs/launch-content/twitter_thread.txt +460 -0
  370. package/{llms.txt.bak → docs/llms.txt} +6 -6
  371. package/docs/npm-downloads-chart.svg +43 -0
  372. package/docs/openapi.json +139 -0
  373. package/docs/openapi.yaml +1318 -0
  374. package/docs/quick-start.html +366 -0
  375. package/docs/robots.txt +52 -0
  376. package/docs/sitemap.xml +57 -0
  377. package/docs/styles.css +682 -0
  378. package/docs/well-known/ai-plugin.json +16 -0
  379. package/docs/wellknown/ai-plugin.json +16 -0
  380. package/docs-site/assets/og-banner.svg +194 -0
  381. package/docs-site/index.html +632 -0
  382. package/eval/README.md +46 -0
  383. package/eval/baselines/main.json +12 -0
  384. package/eval/benchmark_dataset.jsonl +16 -0
  385. package/eval/check_golden_routes.js +64 -0
  386. package/eval/datasets/catalog.json +33 -0
  387. package/eval/datasets/slices/cn_provider_reliability_v1.jsonl +3 -0
  388. package/eval/datasets/slices/cost_pressure_v1.jsonl +3 -0
  389. package/eval/datasets/slices/safety_guardrails_v1.jsonl +3 -0
  390. package/eval/evals.json +199 -0
  391. package/eval/fault_injection_thresholds.json +3 -0
  392. package/eval/generate_report.js +128 -0
  393. package/eval/golden_routes.json +114 -0
  394. package/eval/lib/experiment_registry.js +24 -0
  395. package/eval/run_eval.js +197 -0
  396. package/eval/run_fault_injection.js +201 -0
  397. package/eval/run_shadow_eval.js +85 -0
  398. package/eval/thresholds.json +9 -0
  399. package/examples/QUICKSTART.md +183 -0
  400. package/examples/README.md +61 -0
  401. package/examples/a3m-sdk.js +124 -0
  402. package/examples/basic-route.js +54 -0
  403. package/examples/chat-loop.js +202 -0
  404. package/examples/classify-then-route.js +102 -0
  405. package/examples/cost-compare.js +120 -0
  406. package/examples/ensemble.js +160 -0
  407. package/examples/whatsapp-telegram-bridge-demo.js +302 -0
  408. package/examples/whatsapp-telegram-bridge.js +269 -0
  409. package/hf-space/README.md +23 -0
  410. package/hf-space/app.py +240 -0
  411. package/hf-space/requirements.txt +1 -0
  412. package/huggingface_space/README.md +35 -0
  413. package/huggingface_space/app.py +126 -0
  414. package/huggingface_space/create_space.py +208 -0
  415. package/huggingface_space/requirements.txt +1 -0
  416. package/index.html +1 -1
  417. package/mcp-server/README.md +188 -0
  418. package/mcp-server/package.json +29 -0
  419. package/mcp-server/src/index.ts +744 -0
  420. package/mcp-server/tsconfig.json +19 -0
  421. package/openclaw-alexa-bridge/ALL_REMAINING_FIXES_PLAN.md +313 -0
  422. package/openclaw-alexa-bridge/REMAINING_FIXES_SUMMARY.md +277 -0
  423. package/openclaw-alexa-bridge/src/alexa_handler_no_tmlpd.js +1234 -0
  424. package/openclaw-alexa-bridge/test_fixes.js +77 -0
  425. package/package.json +76 -272
  426. package/playground/README.md +51 -0
  427. package/playground/codesandbox.json +12 -0
  428. package/playground/index.js +39 -0
  429. package/proxy/README.md +227 -0
  430. package/proxy/package-lock.json +831 -0
  431. package/proxy/package.json +17 -0
  432. package/proxy/rate-limit.js +145 -0
  433. package/proxy/rate-limit.test.js +311 -0
  434. package/proxy/server.js +970 -0
  435. package/python/README.md +102 -0
  436. package/python/a3m/__init__.py +6 -0
  437. package/python/a3m/client.py +190 -0
  438. package/python/a3m/models.py +40 -0
  439. package/python/a3m/sync_client.py +61 -0
  440. package/python/examples.py +53 -0
  441. package/python/integrations.py +330 -0
  442. package/python/pyproject.toml +23 -0
  443. package/python/setup.py +28 -0
  444. package/python/tmlpd.py +369 -0
  445. package/qna/REDDIT_GAP_ANALYSIS.md +299 -0
  446. package/qna/TMLPD_QNA.md +751 -0
  447. package/research/FINDING_001_safety.md +28 -0
  448. package/research/FINDING_002_error_diversity.md +32 -0
  449. package/research/FINDING_003_confidence_weighted_voting.md +32 -0
  450. package/research/FINDING_004_cross_model_semantic_detection.md +37 -0
  451. package/research/FINDING_005_knowledge_gap_orthogonality.md +34 -0
  452. package/research/HALLUCINATION_RESEARCH.md +27 -0
  453. package/research/ensemble-voting.md +324 -0
  454. package/research/loss-functions.md +545 -0
  455. package/research-log.md +49 -0
  456. package/scripts/banner.js +29 -0
  457. package/scripts/benchmark-local-routerarena.ts +176 -0
  458. package/scripts/benchmark.js +145 -0
  459. package/scripts/benchmark.sh +61 -0
  460. package/scripts/compare-providers.sh +230 -0
  461. package/scripts/content-planner.js +25 -0
  462. package/scripts/create-labeled-benchmark.ts +105 -0
  463. package/scripts/cross_post.py +443 -0
  464. package/scripts/local-router-benchmark.ts +154 -0
  465. package/scripts/post-all.sh +41 -0
  466. package/scripts/publish_fcc.py +106 -0
  467. package/scripts/push-to-gitee.sh +25 -0
  468. package/scripts/routerarena_ensemble.js +144 -0
  469. package/scripts/routing-benchmark-v2.js +373 -0
  470. package/scripts/routing-benchmark-v3.js +118 -0
  471. package/scripts/routing-benchmark.js +462 -0
  472. package/scripts/run-labeled-benchmark.mjs +104 -0
  473. package/scripts/run-mmlu-benchmark.js +176 -0
  474. package/scripts/run-provider-benchmark.js +244 -0
  475. package/scripts/update-npm-badges.js +158 -0
  476. package/skill/SKILL.md +238 -0
  477. package/src/__tests__/integration/tmpld_integration.test.py +540 -0
  478. package/src/ensemble.ts +2 -0
  479. package/src/routing/advancedRouter.ts +1 -1
  480. package/src/skills/__tests__/skill_manager.test.ts +328 -0
  481. package/submissions/benchmarks/ALL_PLATFORMS_SUBMISSION.md +94 -0
  482. package/submissions/benchmarks/LLMROUTERBENCH_SUBMISSION.md +121 -0
  483. package/submissions/benchmarks/MMRBENCH_SUBMISSION.md +94 -0
  484. package/submissions/benchmarks/ROUTERARENA_UPDATE.md +83 -0
  485. package/submissions/benchmarks/ROUTERBENCH_SUBMISSION.md +225 -0
  486. package/test-council/1-structure-tests.test.js +353 -0
  487. package/test-council/1-structure-tests.test.ts +353 -0
  488. package/test-council/2-edge-case-tests.test.ts +361 -0
  489. package/test-council/3-performance-tests.test.ts +652 -0
  490. package/test-council/4-integration-tests.test.ts +391 -0
  491. package/test-council/5-agent-council-eval.test.ts +413 -0
  492. package/test-council/AGENT_COUNCIL_ARCHITECTURE.md +349 -0
  493. package/test-council/TEST_COUNCIL_REPORT.md +201 -0
  494. package/test-council/agents/edge-case-agent.ts +363 -0
  495. package/test-council/agents/performance-agent.ts +426 -0
  496. package/test-council/agents/structure-agent.ts +227 -0
  497. package/test-council/council.md +183 -0
  498. package/tests/__mocks__/tokenUtils.ts +8 -0
  499. package/tests/memory/episodicMemory.test.ts +227 -0
  500. package/tests/package-lock.json +1785 -0
  501. package/tests/package.json +19 -0
  502. package/tests/routing/ensembleVoting.test.ts +236 -0
  503. package/tests/routing/providerRetry.test.ts +360 -0
  504. package/tests/routing/queryTypePresets.test.ts +208 -0
  505. package/tests/security/guardrailEngine.test.ts +700 -0
  506. package/tests/tsconfig.json +21 -0
  507. package/tests/vitest.config.ts +18 -0
  508. package/tmlpd-pi-extension/README.md +66 -0
  509. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +114 -0
  510. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +1 -0
  511. package/tmlpd-pi-extension/dist/cache/prefixCache.js +285 -0
  512. package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +1 -0
  513. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +58 -0
  514. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +1 -0
  515. package/tmlpd-pi-extension/dist/cache/responseCache.js +153 -0
  516. package/tmlpd-pi-extension/dist/cache/responseCache.js.map +1 -0
  517. package/tmlpd-pi-extension/dist/cli.js +59 -0
  518. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +95 -0
  519. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +1 -0
  520. package/tmlpd-pi-extension/dist/cost/costTracker.js +240 -0
  521. package/tmlpd-pi-extension/dist/cost/costTracker.js.map +1 -0
  522. package/tmlpd-pi-extension/dist/index.d.ts +723 -0
  523. package/tmlpd-pi-extension/dist/index.d.ts.map +1 -0
  524. package/tmlpd-pi-extension/dist/index.js +239 -0
  525. package/tmlpd-pi-extension/dist/index.js.map +1 -0
  526. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +82 -0
  527. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +1 -0
  528. package/tmlpd-pi-extension/dist/memory/episodicMemory.js +145 -0
  529. package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +1 -0
  530. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +102 -0
  531. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +1 -0
  532. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +207 -0
  533. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +1 -0
  534. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +85 -0
  535. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +1 -0
  536. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +210 -0
  537. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +1 -0
  538. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +102 -0
  539. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +1 -0
  540. package/tmlpd-pi-extension/dist/providers/localProvider.js +338 -0
  541. package/tmlpd-pi-extension/dist/providers/localProvider.js.map +1 -0
  542. package/tmlpd-pi-extension/dist/providers/registry.d.ts +55 -0
  543. package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +1 -0
  544. package/tmlpd-pi-extension/dist/providers/registry.js +138 -0
  545. package/tmlpd-pi-extension/dist/providers/registry.js.map +1 -0
  546. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +68 -0
  547. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +1 -0
  548. package/tmlpd-pi-extension/dist/routing/advancedRouter.js +332 -0
  549. package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +1 -0
  550. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +101 -0
  551. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +1 -0
  552. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +368 -0
  553. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +1 -0
  554. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +96 -0
  555. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +1 -0
  556. package/tmlpd-pi-extension/dist/utils/batchProcessor.js +170 -0
  557. package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +1 -0
  558. package/tmlpd-pi-extension/dist/utils/compression.d.ts +61 -0
  559. package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +1 -0
  560. package/tmlpd-pi-extension/dist/utils/compression.js +281 -0
  561. package/tmlpd-pi-extension/dist/utils/compression.js.map +1 -0
  562. package/tmlpd-pi-extension/dist/utils/reliability.d.ts +74 -0
  563. package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +1 -0
  564. package/tmlpd-pi-extension/dist/utils/reliability.js +177 -0
  565. package/tmlpd-pi-extension/dist/utils/reliability.js.map +1 -0
  566. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +117 -0
  567. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +1 -0
  568. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +246 -0
  569. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +1 -0
  570. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +50 -0
  571. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +1 -0
  572. package/tmlpd-pi-extension/dist/utils/tokenUtils.js +124 -0
  573. package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +1 -0
  574. package/tmlpd-pi-extension/examples/QUICKSTART.md +183 -0
  575. package/tmlpd-pi-extension/package-lock.json +79 -0
  576. package/tmlpd-pi-extension/package.json +172 -0
  577. package/tmlpd-pi-extension/python/examples.py +53 -0
  578. package/tmlpd-pi-extension/python/integrations.py +330 -0
  579. package/tmlpd-pi-extension/python/setup.py +28 -0
  580. package/tmlpd-pi-extension/python/tmlpd.py +369 -0
  581. package/tmlpd-pi-extension/qna/REDDIT_GAP_ANALYSIS.md +299 -0
  582. package/tmlpd-pi-extension/qna/TMLPD_QNA.md +751 -0
  583. package/tmlpd-pi-extension/skill/SKILL.md +238 -0
  584. package/tmlpd-pi-extension/src/cache/responseCache.ts +147 -0
  585. package/tmlpd-pi-extension/src/cost/costTracker.ts +302 -0
  586. package/tmlpd-pi-extension/src/index.ts +232 -0
  587. package/tmlpd-pi-extension/src/memory/episodicMemory.ts +257 -0
  588. package/tmlpd-pi-extension/src/orchestration/haloOrchestrator.ts +266 -0
  589. package/tmlpd-pi-extension/src/orchestration/mctsWorkflow.ts +262 -0
  590. package/tmlpd-pi-extension/src/providers/localProvider.ts +406 -0
  591. package/tmlpd-pi-extension/src/providers/registry.ts +164 -0
  592. package/tmlpd-pi-extension/src/routing/ensembleVoting.ts +159 -0
  593. package/tmlpd-pi-extension/src/routing/queryTypePresets.ts +136 -0
  594. package/tmlpd-pi-extension/src/tools/tmlpdTools.ts +433 -0
  595. package/tmlpd-pi-extension/src/utils/batchProcessor.ts +232 -0
  596. package/tmlpd-pi-extension/src/utils/compression.ts +325 -0
  597. package/tmlpd-pi-extension/src/utils/reliability.ts +221 -0
  598. package/tmlpd-pi-extension/src/utils/tokenUtils.ts +145 -0
  599. package/tmlpd-pi-extension/tsconfig.json +18 -0
  600. package/tsconfig.build.json +29 -0
  601. package/tsconfig.json +18 -0
  602. package/README.md.bak +0 -1185
  603. package/src/routing/advancedRouter.ts.bak +0 -650
  604. package/test.js.bak +0 -376
  605. /package/{llms-full.txt.bak → docs/llms-full.txt} +0 -0
@@ -0,0 +1,61 @@
1
+ /**
2
+ * TMLPD Context Compression Utilities
3
+ *
4
+ * Strategies for reducing context window usage:
5
+ * - Smart truncation
6
+ * - Message summarization
7
+ * - ISON-style encoding (inspired by Reddit ISON format)
8
+ * - Context window management
9
+ */
10
+ export interface Message {
11
+ role: "system" | "user" | "assistant";
12
+ content: string;
13
+ name?: string;
14
+ tool_calls?: any[];
15
+ tool_call_id?: string;
16
+ }
17
+ export type CompressionStrategy = "smart" | "first" | "last" | "isentropy";
18
+ export interface CompressionResult {
19
+ original_tokens: number;
20
+ compressed_tokens: number;
21
+ ratio: number;
22
+ compressed_text: string;
23
+ }
24
+ /**
25
+ * ISON encode text for token reduction.
26
+ */
27
+ export declare function isonEncode(text: string): string;
28
+ /**
29
+ * Decode ISON encoded text.
30
+ */
31
+ export declare function isonDecode(text: string): string;
32
+ /**
33
+ * Compress text using ISON encoding.
34
+ */
35
+ export declare function compressText(text: string): CompressionResult;
36
+ /**
37
+ * Truncate messages to fit within token budget.
38
+ *
39
+ * @param messages - Conversation messages
40
+ * @param max_tokens - Maximum tokens allowed
41
+ * @param strategy - "smart" (preserve system + recent), "first" (keep start), "last" (keep end)
42
+ */
43
+ export declare function truncateMessages(messages: Message[], max_tokens: number, strategy?: CompressionStrategy): Message[];
44
+ /**
45
+ * Truncate a single string to fit within token budget.
46
+ */
47
+ export declare function truncateToTokenBudget(text: string, max_tokens: number): string;
48
+ /**
49
+ * Calculate compression ratio for context.
50
+ */
51
+ export declare function calculateCompressionRatio(messages: Message[], max_tokens: number): number;
52
+ declare const _default: {
53
+ isonEncode: typeof isonEncode;
54
+ isonDecode: typeof isonDecode;
55
+ compressText: typeof compressText;
56
+ truncateMessages: typeof truncateMessages;
57
+ truncateToTokenBudget: typeof truncateToTokenBudget;
58
+ calculateCompressionRatio: typeof calculateCompressionRatio;
59
+ };
60
+ export default _default;
61
+ //# sourceMappingURL=compression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAuE3E,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAW5D;AAUD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,mBAA6B,GACtC,OAAO,EAAE,CAiHX;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAuB9E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAOzF;;;;;;;;;AAED,wBAOE"}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ /**
3
+ * TMLPD Context Compression Utilities
4
+ *
5
+ * Strategies for reducing context window usage:
6
+ * - Smart truncation
7
+ * - Message summarization
8
+ * - ISON-style encoding (inspired by Reddit ISON format)
9
+ * - Context window management
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.isonEncode = isonEncode;
13
+ exports.isonDecode = isonDecode;
14
+ exports.compressText = compressText;
15
+ exports.truncateMessages = truncateMessages;
16
+ exports.truncateToTokenBudget = truncateToTokenBudget;
17
+ exports.calculateCompressionRatio = calculateCompressionRatio;
18
+ /**
19
+ * ISON (Intelligence-Sparse Object Notation)
20
+ *
21
+ * A compression format that reduces token count by:
22
+ * - Removing redundant whitespace
23
+ * - Shortening common phrases
24
+ * - Using abbreviations strategically
25
+ *
26
+ * Example: "The quick brown fox jumps over the lazy dog"
27
+ * → "quick brown fox jumps lazy dog" (removes articles, repeated words)
28
+ */
29
+ const ISON_REPLACEMENTS = [
30
+ // Common phrase abbreviations
31
+ [/\bthe\b/g, ""],
32
+ [/\ba\b/g, ""],
33
+ [/\ban\b/g, ""],
34
+ [/\bthat\b/g, "that"],
35
+ [/\bthis\b/g, "this"],
36
+ [/\bwith\b/g, "w/"],
37
+ [/\bwithout\b/g, "w/o"],
38
+ [/\band\b/g, "&"],
39
+ [/\bor\b/g, "|"],
40
+ [/\bfor\b/g, "4"],
41
+ [/\bto\b/g, "2"],
42
+ [/\binto\b/g, "2"],
43
+ [/\bfrom\b/g, "fr"],
44
+ [/\bplease\b/gi, ""],
45
+ [/\bthank you\b/gi, "thx"],
46
+ [/\byou are\b/gi, "u r"],
47
+ [/\byou can\b/gi, "u c"],
48
+ [/\bcan you\b/gi, "c?"],
49
+ [/\bhow do\b/gi, "how 2"],
50
+ [/\bwhat is\b/gi, "wat"],
51
+ [/\bwhat are\b/gi, "wat"],
52
+ // Whitespace normalization
53
+ [/\s+/g, " "],
54
+ [/^\s+|\s+$/g, ""],
55
+ // Remove repeated characters
56
+ [/(\w)\1{2,}/g, "$1$1"],
57
+ // Shorten common technical terms
58
+ [/\binformation\b/gi, "info"],
59
+ [/\bprocessing\b/gi, "proc"],
60
+ [/\bdevelopment\b/gi, "dev"],
61
+ [/\bapplication\b/gi, "app"],
62
+ [/\bconfiguration\b/gi, "config"],
63
+ [/\brepresentation\b/gi, "repr"],
64
+ [/\bunderstanding\b/gi, "unders"],
65
+ [/\brecommendation\b/gi, "rec"],
66
+ ];
67
+ const ISON_UNREPLACEMENTS = [
68
+ [/w\//g, "with "],
69
+ [/w\/o/g, "without "],
70
+ [/&/g, " and "],
71
+ [/\b4\b/g, " for "],
72
+ [/\b2\b/g, " to "],
73
+ [/\bfr\b/g, "from "],
74
+ [/\bthx\b/gi, "thank you"],
75
+ [/\bu r\b/gi, "you are"],
76
+ [/\bu c\b/gi, "you can"],
77
+ [/\bc\?\b/g, "can you"],
78
+ [/how 2\b/gi, "how do"],
79
+ [/\bwat\b/g, "what is"],
80
+ ];
81
+ /**
82
+ * ISON encode text for token reduction.
83
+ */
84
+ function isonEncode(text) {
85
+ let result = text;
86
+ // Apply replacements
87
+ for (const [pattern, replacement] of ISON_REPLACEMENTS) {
88
+ result = result.replace(pattern, replacement);
89
+ }
90
+ // Remove extra spaces and trim
91
+ result = result.replace(/\s+/g, " ").trim();
92
+ return result;
93
+ }
94
+ /**
95
+ * Decode ISON encoded text.
96
+ */
97
+ function isonDecode(text) {
98
+ let result = text;
99
+ // Apply un-replacements
100
+ for (const [pattern, replacement] of ISON_UNREPLACEMENTS) {
101
+ result = result.replace(pattern, replacement);
102
+ }
103
+ return result;
104
+ }
105
+ /**
106
+ * Compress text using ISON encoding.
107
+ */
108
+ function compressText(text) {
109
+ const original_tokens = estimateTokens(text);
110
+ const compressed = isonEncode(text);
111
+ const compressed_tokens = estimateTokens(compressed);
112
+ return {
113
+ original_tokens,
114
+ compressed_tokens,
115
+ ratio: compressed_tokens / original_tokens,
116
+ compressed_text: compressed
117
+ };
118
+ }
119
+ /**
120
+ * Estimate tokens (fallback if no model specified).
121
+ */
122
+ function estimateTokens(text) {
123
+ const words = text.trim().split(/\s+/).filter(w => w.length > 0);
124
+ return Math.ceil(words.length * 1.3);
125
+ }
126
+ /**
127
+ * Truncate messages to fit within token budget.
128
+ *
129
+ * @param messages - Conversation messages
130
+ * @param max_tokens - Maximum tokens allowed
131
+ * @param strategy - "smart" (preserve system + recent), "first" (keep start), "last" (keep end)
132
+ */
133
+ function truncateMessages(messages, max_tokens, strategy = "smart") {
134
+ if (!messages || messages.length === 0)
135
+ return [];
136
+ // Calculate total tokens
137
+ const totalTokens = (msg) => {
138
+ const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
139
+ return estimateTokens(content) + 4; // +4 for role/format overhead
140
+ };
141
+ let currentTokens = messages.reduce((sum, m) => sum + totalTokens(m), 0);
142
+ if (currentTokens <= max_tokens) {
143
+ return messages; // Already fits
144
+ }
145
+ const result = [];
146
+ if (strategy === "first") {
147
+ // Keep system (first) messages, truncate from middle
148
+ let keepTokens = 0;
149
+ for (const msg of messages) {
150
+ const msgTokens = totalTokens(msg);
151
+ if (keepTokens + msgTokens <= max_tokens) {
152
+ result.push(msg);
153
+ keepTokens += msgTokens;
154
+ }
155
+ else if (msg.role === "system" && result.length === 0) {
156
+ // Always keep system message, possibly truncated
157
+ const systemContent = typeof msg.content === 'string' ? msg.content : "";
158
+ const truncated = truncateToTokenBudget(systemContent, max_tokens - 4);
159
+ result.push({ ...msg, content: truncated });
160
+ break;
161
+ }
162
+ else {
163
+ break;
164
+ }
165
+ }
166
+ }
167
+ else if (strategy === "last") {
168
+ // Keep only most recent messages
169
+ for (let i = messages.length - 1; i >= 0; i--) {
170
+ const msg = messages[i];
171
+ const msgTokens = totalTokens(msg);
172
+ if (currentTokens - msgTokens <= max_tokens) {
173
+ result.unshift(msg);
174
+ currentTokens -= msgTokens;
175
+ }
176
+ else if (msg.role === "user") {
177
+ // Try to keep a truncated user message
178
+ const truncated = truncateToTokenBudget(msg.content, max_tokens - currentTokens);
179
+ if (truncated.length > 20) {
180
+ result.unshift({ ...msg, content: truncated });
181
+ }
182
+ break;
183
+ }
184
+ }
185
+ }
186
+ else if (strategy === "smart") {
187
+ // Keep system, compress middle, keep recent
188
+ const systemMessages = [];
189
+ const middleMessages = [];
190
+ const recentMessages = [];
191
+ for (const msg of messages) {
192
+ if (msg.role === "system") {
193
+ systemMessages.push(msg);
194
+ }
195
+ else if (messages.indexOf(msg) >= messages.length - 3) {
196
+ recentMessages.push(msg);
197
+ }
198
+ else {
199
+ middleMessages.push(msg);
200
+ }
201
+ }
202
+ // Start with system
203
+ for (const msg of systemMessages) {
204
+ const msgTokens = totalTokens(msg);
205
+ if (currentTokens <= max_tokens) {
206
+ result.push(msg);
207
+ currentTokens -= msgTokens;
208
+ }
209
+ else {
210
+ // Truncate system message
211
+ const truncated = truncateToTokenBudget(msg.content, max_tokens - currentTokens - 10);
212
+ result.push({ ...msg, content: truncated });
213
+ currentTokens = max_tokens;
214
+ break;
215
+ }
216
+ }
217
+ // Add compressed middle
218
+ if (currentTokens > max_tokens / 2 && middleMessages.length > 0) {
219
+ // Compress middle messages into a summary
220
+ const middleContent = middleMessages
221
+ .map(m => m.content)
222
+ .join("\n");
223
+ const summaryTokenBudget = Math.min(max_tokens / 4, max_tokens - currentTokens);
224
+ const summary = truncateToTokenBudget(`[Previous ${middleMessages.length} messages]: ${middleContent}`, summaryTokenBudget);
225
+ result.push({ role: "assistant", content: summary });
226
+ currentTokens -= estimateTokens(summary);
227
+ }
228
+ // Add recent messages if room
229
+ for (const msg of recentMessages) {
230
+ const msgTokens = totalTokens(msg);
231
+ if (currentTokens + msgTokens <= max_tokens) {
232
+ result.push(msg);
233
+ currentTokens += msgTokens;
234
+ }
235
+ }
236
+ }
237
+ return result;
238
+ }
239
+ /**
240
+ * Truncate a single string to fit within token budget.
241
+ */
242
+ function truncateToTokenBudget(text, max_tokens) {
243
+ const words = text.split(/\s+/);
244
+ let current = 0;
245
+ const targetWords = [];
246
+ for (const word of words) {
247
+ const wordTokens = estimateTokens(word);
248
+ if (current + wordTokens <= max_tokens) {
249
+ targetWords.push(word);
250
+ current += wordTokens;
251
+ }
252
+ else {
253
+ break;
254
+ }
255
+ }
256
+ let result = targetWords.join(" ");
257
+ // If we truncated, add ellipsis
258
+ if (result.length < text.length) {
259
+ result += "...";
260
+ }
261
+ return result;
262
+ }
263
+ /**
264
+ * Calculate compression ratio for context.
265
+ */
266
+ function calculateCompressionRatio(messages, max_tokens) {
267
+ const totalTokens = messages.reduce((sum, m) => {
268
+ const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);
269
+ return sum + estimateTokens(content) + 4;
270
+ }, 0);
271
+ return Math.min(1, max_tokens / totalTokens);
272
+ }
273
+ exports.default = {
274
+ isonEncode,
275
+ isonDecode,
276
+ compressText,
277
+ truncateMessages,
278
+ truncateToTokenBudget,
279
+ calculateCompressionRatio
280
+ };
281
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/utils/compression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * TMLPD Reliability Engine
3
+ *
4
+ * Circuit breaker, retry with jitter, and enhanced cooldown logic.
5
+ * Designed to handle flaky API calls gracefully.
6
+ */
7
+ export interface RetryConfig {
8
+ max_attempts: number;
9
+ base_delay_ms: number;
10
+ max_delay_ms: number;
11
+ jitter: number;
12
+ retryable_status_codes: number[];
13
+ }
14
+ export interface CircuitBreakerConfig {
15
+ failure_threshold: number;
16
+ recovery_timeout_ms: number;
17
+ half_open_max_calls: number;
18
+ }
19
+ export interface CircuitState {
20
+ status: "closed" | "open" | "half_open";
21
+ failure_count: number;
22
+ last_failure_time: number | null;
23
+ last_success_time: number | null;
24
+ consecutive_successes: number;
25
+ }
26
+ export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
27
+ export declare const DEFAULT_CIRCUIT_BREAKER_CONFIG: CircuitBreakerConfig;
28
+ /**
29
+ * Calculate delay with exponential backoff and jitter
30
+ */
31
+ export declare function calculateRetryDelay(attempt: number, config?: RetryConfig): number;
32
+ /**
33
+ * Check if status code is retryable
34
+ */
35
+ export declare function isRetryableStatus(statusCode: number | null, config?: RetryConfig): boolean;
36
+ /**
37
+ * Circuit Breaker implementation
38
+ */
39
+ export declare class CircuitBreaker {
40
+ private config;
41
+ private state;
42
+ private half_open_calls;
43
+ constructor(config?: Partial<CircuitBreakerConfig>);
44
+ /**
45
+ * Check if circuit allows requests
46
+ */
47
+ canExecute(): boolean;
48
+ /**
49
+ * Record a successful execution
50
+ */
51
+ recordSuccess(): void;
52
+ /**
53
+ * Record a failed execution
54
+ */
55
+ recordFailure(): void;
56
+ /**
57
+ * Get current circuit state
58
+ */
59
+ getState(): CircuitState;
60
+ /**
61
+ * Force reset circuit
62
+ */
63
+ reset(): void;
64
+ }
65
+ /**
66
+ * Enhanced retry wrapper with circuit breaker integration
67
+ */
68
+ export declare function withRetry<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>, circuitBreaker?: CircuitBreaker): Promise<{
69
+ result: T | null;
70
+ error: Error | null;
71
+ attempts: number;
72
+ circuit_tripped: boolean;
73
+ }>;
74
+ //# sourceMappingURL=reliability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reliability.d.ts","sourceRoot":"","sources":["../../src/utils/reliability.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,oBAAoB,EAAE,WAMlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,oBAI5C,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,WAAkC,GACzC,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAE,WAAkC,GAAG,OAAO,CAGhH;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAWtD;;OAEG;IACH,UAAU,IAAI,OAAO;IAiBrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAiBrB;;OAEG;IACH,aAAa,IAAI,IAAI;IAarB;;OAEG;IACH,QAAQ,IAAI,YAAY;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,EACjC,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CA6ChG"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ /**
3
+ * TMLPD Reliability Engine
4
+ *
5
+ * Circuit breaker, retry with jitter, and enhanced cooldown logic.
6
+ * Designed to handle flaky API calls gracefully.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CircuitBreaker = exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = exports.DEFAULT_RETRY_CONFIG = void 0;
10
+ exports.calculateRetryDelay = calculateRetryDelay;
11
+ exports.isRetryableStatus = isRetryableStatus;
12
+ exports.withRetry = withRetry;
13
+ exports.DEFAULT_RETRY_CONFIG = {
14
+ max_attempts: 3,
15
+ base_delay_ms: 500,
16
+ max_delay_ms: 30000,
17
+ jitter: 0.3,
18
+ retryable_status_codes: [408, 429, 500, 502, 503, 504],
19
+ };
20
+ exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = {
21
+ failure_threshold: 5,
22
+ recovery_timeout_ms: 60000,
23
+ half_open_max_calls: 3,
24
+ };
25
+ /**
26
+ * Calculate delay with exponential backoff and jitter
27
+ */
28
+ function calculateRetryDelay(attempt, config = exports.DEFAULT_RETRY_CONFIG) {
29
+ // Exponential backoff
30
+ const exponential_delay = config.base_delay_ms * Math.pow(2, attempt - 1);
31
+ // Cap at max delay
32
+ const capped_delay = Math.min(exponential_delay, config.max_delay_ms);
33
+ // Add jitter
34
+ const jitter_range = capped_delay * config.jitter;
35
+ const jitter = (Math.random() * 2 - 1) * jitter_range;
36
+ return Math.round(capped_delay + jitter);
37
+ }
38
+ /**
39
+ * Check if status code is retryable
40
+ */
41
+ function isRetryableStatus(statusCode, config = exports.DEFAULT_RETRY_CONFIG) {
42
+ if (statusCode === null)
43
+ return true; // Network errors are retryable
44
+ return config.retryable_status_codes.includes(statusCode);
45
+ }
46
+ /**
47
+ * Circuit Breaker implementation
48
+ */
49
+ class CircuitBreaker {
50
+ config;
51
+ state;
52
+ half_open_calls = 0;
53
+ constructor(config = {}) {
54
+ this.config = { ...exports.DEFAULT_CIRCUIT_BREAKER_CONFIG, ...config };
55
+ this.state = {
56
+ status: "closed",
57
+ failure_count: 0,
58
+ last_failure_time: null,
59
+ last_success_time: null,
60
+ consecutive_successes: 0,
61
+ };
62
+ }
63
+ /**
64
+ * Check if circuit allows requests
65
+ */
66
+ canExecute() {
67
+ if (this.state.status === "closed")
68
+ return true;
69
+ if (this.state.status === "open") {
70
+ // Check if recovery timeout has passed
71
+ if (this.state.last_failure_time && Date.now() - this.state.last_failure_time >= this.config.recovery_timeout_ms) {
72
+ this.state.status = "half_open";
73
+ this.half_open_calls = 0;
74
+ return true;
75
+ }
76
+ return false;
77
+ }
78
+ // half_open
79
+ return this.half_open_calls < this.config.half_open_max_calls;
80
+ }
81
+ /**
82
+ * Record a successful execution
83
+ */
84
+ recordSuccess() {
85
+ this.state.last_success_time = Date.now();
86
+ this.half_open_calls++;
87
+ if (this.state.status === "half_open") {
88
+ this.state.consecutive_successes++;
89
+ if (this.state.consecutive_successes >= this.config.half_open_max_calls) {
90
+ // Circuit recovered
91
+ this.state.status = "closed";
92
+ this.state.failure_count = 0;
93
+ this.state.consecutive_successes = 0;
94
+ }
95
+ }
96
+ else {
97
+ this.state.failure_count = 0;
98
+ }
99
+ }
100
+ /**
101
+ * Record a failed execution
102
+ */
103
+ recordFailure() {
104
+ this.state.last_failure_time = Date.now();
105
+ this.state.failure_count++;
106
+ this.state.consecutive_successes = 0;
107
+ if (this.state.status === "half_open") {
108
+ // Trip circuit back open
109
+ this.state.status = "open";
110
+ }
111
+ else if (this.state.failure_count >= this.config.failure_threshold) {
112
+ this.state.status = "open";
113
+ }
114
+ }
115
+ /**
116
+ * Get current circuit state
117
+ */
118
+ getState() {
119
+ return { ...this.state };
120
+ }
121
+ /**
122
+ * Force reset circuit
123
+ */
124
+ reset() {
125
+ this.state = {
126
+ status: "closed",
127
+ failure_count: 0,
128
+ last_failure_time: null,
129
+ last_success_time: null,
130
+ consecutive_successes: 0,
131
+ };
132
+ this.half_open_calls = 0;
133
+ }
134
+ }
135
+ exports.CircuitBreaker = CircuitBreaker;
136
+ /**
137
+ * Enhanced retry wrapper with circuit breaker integration
138
+ */
139
+ async function withRetry(fn, config = {}, circuitBreaker) {
140
+ const retryConfig = { ...exports.DEFAULT_RETRY_CONFIG, ...config };
141
+ let lastError = null;
142
+ let attempts = 0;
143
+ let circuit_tripped = false;
144
+ for (let i = 0; i < retryConfig.max_attempts; i++) {
145
+ attempts++;
146
+ try {
147
+ // Check circuit breaker before attempt
148
+ if (circuitBreaker && !circuitBreaker.canExecute()) {
149
+ circuit_tripped = true;
150
+ throw new Error("Circuit breaker is open");
151
+ }
152
+ const result = await fn();
153
+ if (circuitBreaker) {
154
+ circuitBreaker.recordSuccess();
155
+ }
156
+ return { result, error: null, attempts, circuit_tripped };
157
+ }
158
+ catch (error) {
159
+ lastError = error instanceof Error ? error : new Error(String(error));
160
+ // Check if should retry
161
+ const statusCode = error.statusCode || error.response?.statusCode || null;
162
+ if (!isRetryableStatus(statusCode, retryConfig)) {
163
+ return { result: null, error: lastError, attempts, circuit_tripped };
164
+ }
165
+ if (circuitBreaker) {
166
+ circuitBreaker.recordFailure();
167
+ }
168
+ // Don't wait after last attempt
169
+ if (i < retryConfig.max_attempts - 1) {
170
+ const delay = calculateRetryDelay(i + 1, retryConfig);
171
+ await new Promise((resolve) => setTimeout(resolve, delay));
172
+ }
173
+ }
174
+ }
175
+ return { result: null, error: lastError, attempts, circuit_tripped };
176
+ }
177
+ //# sourceMappingURL=reliability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reliability.js","sourceRoot":"","sources":["../../src/utils/reliability.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyCH,kDAeC;AAKD,8CAGC;AAsGD,8BAiDC;AA/LY,QAAA,oBAAoB,GAAgB;IAC/C,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,GAAG;IAClB,YAAY,EAAE,KAAK;IACnB,MAAM,EAAE,GAAG;IACX,sBAAsB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACvD,CAAC;AAEW,QAAA,8BAA8B,GAAyB;IAClE,iBAAiB,EAAE,CAAC;IACpB,mBAAmB,EAAE,KAAK;IAC1B,mBAAmB,EAAE,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,SAAgB,mBAAmB,CACjC,OAAe,EACf,SAAsB,4BAAoB;IAE1C,sBAAsB;IACtB,MAAM,iBAAiB,GAAG,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAE1E,mBAAmB;IACnB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAEtE,aAAa;IACb,MAAM,YAAY,GAAG,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IAClD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;IAEtD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,UAAyB,EAAE,SAAsB,4BAAoB;IACrG,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,+BAA+B;IACrE,OAAO,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAa,cAAc;IACjB,MAAM,CAAuB;IAC7B,KAAK,CAAe;IACpB,eAAe,GAAG,CAAC,CAAC;IAE5B,YAAY,SAAwC,EAAE;QACpD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,sCAA8B,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/D,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,IAAI;YACvB,qBAAqB,EAAE,CAAC;SACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEhD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACjC,uCAAuC;YACvC,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACjH,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;gBAChC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;gBACzB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,YAAY;QACZ,OAAO,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACxE,oBAAoB;gBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACtC,yBAAyB;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACrE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,IAAI;YACvB,qBAAqB,EAAE,CAAC;SACzB,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF;AA5FD,wCA4FC;AAED;;GAEG;AACI,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,SAA+B,EAAE,EACjC,cAA+B;IAE/B,MAAM,WAAW,GAAG,EAAE,GAAG,4BAAoB,EAAE,GAAG,MAAM,EAAE,CAAC;IAC3D,IAAI,SAAS,GAAiB,IAAI,CAAC;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QAClD,QAAQ,EAAE,CAAC;QAEX,IAAI,CAAC;YACH,uCAAuC;YACvC,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC;gBACnD,eAAe,GAAG,IAAI,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAE1B,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,aAAa,EAAE,CAAC;YACjC,CAAC;YAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,wBAAwB;YACxB,MAAM,UAAU,GAAI,KAAa,CAAC,UAAU,IAAK,KAAa,CAAC,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC;YAC5F,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;gBAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;YACvE,CAAC;YAED,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,aAAa,EAAE,CAAC;YACjC,CAAC;YAED,gCAAgC;YAChC,IAAI,CAAC,GAAG,WAAW,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,mBAAmB,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;gBACtD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACvE,CAAC"}