zora-agent 0.9.4 → 0.9.6

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 (245) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +103 -92
  3. package/dist/cli/audit-commands.d.ts.map +1 -1
  4. package/dist/cli/audit-commands.js +3 -1
  5. package/dist/cli/audit-commands.js.map +1 -1
  6. package/dist/cli/daemon.js +86 -28
  7. package/dist/cli/daemon.js.map +1 -1
  8. package/dist/cli/edit-commands.d.ts.map +1 -1
  9. package/dist/cli/edit-commands.js +3 -1
  10. package/dist/cli/edit-commands.js.map +1 -1
  11. package/dist/cli/hook-commands.d.ts +9 -0
  12. package/dist/cli/hook-commands.d.ts.map +1 -0
  13. package/dist/cli/hook-commands.js +106 -0
  14. package/dist/cli/hook-commands.js.map +1 -0
  15. package/dist/cli/index.js +87 -35
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/init-command.d.ts.map +1 -1
  18. package/dist/cli/init-command.js +108 -9
  19. package/dist/cli/init-command.js.map +1 -1
  20. package/dist/cli/memory-commands.d.ts +1 -1
  21. package/dist/cli/memory-commands.d.ts.map +1 -1
  22. package/dist/cli/memory-commands.js +213 -1
  23. package/dist/cli/memory-commands.js.map +1 -1
  24. package/dist/cli/presets.d.ts.map +1 -1
  25. package/dist/cli/presets.js +2 -1
  26. package/dist/cli/presets.js.map +1 -1
  27. package/dist/cli/skill-commands.d.ts.map +1 -1
  28. package/dist/cli/skill-commands.js +4 -2
  29. package/dist/cli/skill-commands.js.map +1 -1
  30. package/dist/cli/steer-commands.d.ts.map +1 -1
  31. package/dist/cli/steer-commands.js +6 -4
  32. package/dist/cli/steer-commands.js.map +1 -1
  33. package/dist/cli/team-commands.d.ts.map +1 -1
  34. package/dist/cli/team-commands.js +3 -1
  35. package/dist/cli/team-commands.js.map +1 -1
  36. package/dist/config/defaults.d.ts.map +1 -1
  37. package/dist/config/defaults.js +12 -2
  38. package/dist/config/defaults.js.map +1 -1
  39. package/dist/config/loader.d.ts +23 -0
  40. package/dist/config/loader.d.ts.map +1 -1
  41. package/dist/config/loader.js +64 -3
  42. package/dist/config/loader.js.map +1 -1
  43. package/dist/config/policy-loader.d.ts +14 -0
  44. package/dist/config/policy-loader.d.ts.map +1 -1
  45. package/dist/config/policy-loader.js +33 -0
  46. package/dist/config/policy-loader.js.map +1 -1
  47. package/dist/dashboard/frontend/dist/assets/index-BcOGj1EF.css +1 -0
  48. package/dist/dashboard/frontend/dist/assets/index-BtiFO9YN.js +261 -0
  49. package/dist/dashboard/frontend/dist/assets/index-Cfjy5acU.css +1 -0
  50. package/dist/dashboard/frontend/dist/assets/index-D41hcjgc.js +253 -0
  51. package/dist/dashboard/frontend/dist/assets/index-D83BawFd.css +1 -0
  52. package/dist/dashboard/frontend/dist/assets/index-DAODjoxu.css +1 -0
  53. package/dist/dashboard/frontend/dist/assets/index-DB-Eu5oV.js +253 -0
  54. package/dist/dashboard/frontend/dist/assets/index-W0VVEDu6.js +253 -0
  55. package/dist/dashboard/frontend/dist/index.html +17 -0
  56. package/dist/dashboard/server.d.ts +19 -2
  57. package/dist/dashboard/server.d.ts.map +1 -1
  58. package/dist/dashboard/server.js +121 -20
  59. package/dist/dashboard/server.js.map +1 -1
  60. package/dist/hooks/hook-runner.d.ts +55 -0
  61. package/dist/hooks/hook-runner.d.ts.map +1 -0
  62. package/dist/hooks/hook-runner.js +120 -0
  63. package/dist/hooks/hook-runner.js.map +1 -0
  64. package/dist/hooks/hook-types.d.ts +82 -0
  65. package/dist/hooks/hook-types.d.ts.map +1 -0
  66. package/dist/hooks/hook-types.js +20 -0
  67. package/dist/hooks/hook-types.js.map +1 -0
  68. package/dist/hooks/index.d.ts +6 -0
  69. package/dist/hooks/index.d.ts.map +1 -0
  70. package/dist/hooks/index.js +6 -0
  71. package/dist/hooks/index.js.map +1 -0
  72. package/dist/memory/context-compressor.d.ts +108 -0
  73. package/dist/memory/context-compressor.d.ts.map +1 -0
  74. package/dist/memory/context-compressor.js +307 -0
  75. package/dist/memory/context-compressor.js.map +1 -0
  76. package/dist/memory/index.d.ts +1 -0
  77. package/dist/memory/index.d.ts.map +1 -1
  78. package/dist/memory/index.js +1 -0
  79. package/dist/memory/index.js.map +1 -1
  80. package/dist/memory/memory-manager.d.ts +88 -4
  81. package/dist/memory/memory-manager.d.ts.map +1 -1
  82. package/dist/memory/memory-manager.js +299 -7
  83. package/dist/memory/memory-manager.js.map +1 -1
  84. package/dist/memory/observation-store.d.ts +75 -0
  85. package/dist/memory/observation-store.d.ts.map +1 -0
  86. package/dist/memory/observation-store.js +162 -0
  87. package/dist/memory/observation-store.js.map +1 -0
  88. package/dist/memory/observer-worker.d.ts +34 -0
  89. package/dist/memory/observer-worker.d.ts.map +1 -0
  90. package/dist/memory/observer-worker.js +161 -0
  91. package/dist/memory/observer-worker.js.map +1 -0
  92. package/dist/memory/reflector-worker.d.ts +40 -0
  93. package/dist/memory/reflector-worker.d.ts.map +1 -0
  94. package/dist/memory/reflector-worker.js +185 -0
  95. package/dist/memory/reflector-worker.js.map +1 -0
  96. package/dist/memory/salience-scorer.d.ts +16 -6
  97. package/dist/memory/salience-scorer.d.ts.map +1 -1
  98. package/dist/memory/salience-scorer.js +42 -22
  99. package/dist/memory/salience-scorer.js.map +1 -1
  100. package/dist/memory/structured-memory.d.ts +36 -1
  101. package/dist/memory/structured-memory.d.ts.map +1 -1
  102. package/dist/memory/structured-memory.js +207 -8
  103. package/dist/memory/structured-memory.js.map +1 -1
  104. package/dist/memory/token-estimator.d.ts +31 -0
  105. package/dist/memory/token-estimator.d.ts.map +1 -0
  106. package/dist/memory/token-estimator.js +77 -0
  107. package/dist/memory/token-estimator.js.map +1 -0
  108. package/dist/memory/validation-pipeline.d.ts +37 -0
  109. package/dist/memory/validation-pipeline.d.ts.map +1 -0
  110. package/dist/memory/validation-pipeline.js +106 -0
  111. package/dist/memory/validation-pipeline.js.map +1 -0
  112. package/dist/orchestrator/auth-monitor.d.ts.map +1 -1
  113. package/dist/orchestrator/auth-monitor.js +3 -1
  114. package/dist/orchestrator/auth-monitor.js.map +1 -1
  115. package/dist/orchestrator/execution-loop.d.ts +23 -0
  116. package/dist/orchestrator/execution-loop.d.ts.map +1 -1
  117. package/dist/orchestrator/execution-loop.js +60 -19
  118. package/dist/orchestrator/execution-loop.js.map +1 -1
  119. package/dist/orchestrator/failover-controller.d.ts +26 -2
  120. package/dist/orchestrator/failover-controller.d.ts.map +1 -1
  121. package/dist/orchestrator/failover-controller.js +143 -23
  122. package/dist/orchestrator/failover-controller.js.map +1 -1
  123. package/dist/orchestrator/orchestrator.d.ts +70 -7
  124. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  125. package/dist/orchestrator/orchestrator.js +416 -92
  126. package/dist/orchestrator/orchestrator.js.map +1 -1
  127. package/dist/orchestrator/retry-queue.d.ts.map +1 -1
  128. package/dist/orchestrator/retry-queue.js +24 -9
  129. package/dist/orchestrator/retry-queue.js.map +1 -1
  130. package/dist/orchestrator/router.d.ts +16 -1
  131. package/dist/orchestrator/router.d.ts.map +1 -1
  132. package/dist/orchestrator/router.js +79 -20
  133. package/dist/orchestrator/router.js.map +1 -1
  134. package/dist/orchestrator/session-manager.d.ts +26 -1
  135. package/dist/orchestrator/session-manager.d.ts.map +1 -1
  136. package/dist/orchestrator/session-manager.js +88 -4
  137. package/dist/orchestrator/session-manager.js.map +1 -1
  138. package/dist/providers/circuit-breaker.d.ts +78 -0
  139. package/dist/providers/circuit-breaker.d.ts.map +1 -0
  140. package/dist/providers/circuit-breaker.js +129 -0
  141. package/dist/providers/circuit-breaker.js.map +1 -0
  142. package/dist/providers/claude-provider.d.ts +27 -11
  143. package/dist/providers/claude-provider.d.ts.map +1 -1
  144. package/dist/providers/claude-provider.js +161 -46
  145. package/dist/providers/claude-provider.js.map +1 -1
  146. package/dist/providers/gemini-provider.d.ts +9 -1
  147. package/dist/providers/gemini-provider.d.ts.map +1 -1
  148. package/dist/providers/gemini-provider.js +97 -48
  149. package/dist/providers/gemini-provider.js.map +1 -1
  150. package/dist/providers/index.d.ts +1 -0
  151. package/dist/providers/index.d.ts.map +1 -1
  152. package/dist/providers/index.js +1 -0
  153. package/dist/providers/index.js.map +1 -1
  154. package/dist/providers/ollama-provider.d.ts +7 -0
  155. package/dist/providers/ollama-provider.d.ts.map +1 -1
  156. package/dist/providers/ollama-provider.js +89 -18
  157. package/dist/providers/ollama-provider.js.map +1 -1
  158. package/dist/routines/heartbeat.d.ts +10 -2
  159. package/dist/routines/heartbeat.d.ts.map +1 -1
  160. package/dist/routines/heartbeat.js +42 -5
  161. package/dist/routines/heartbeat.js.map +1 -1
  162. package/dist/routines/routine-manager.d.ts.map +1 -1
  163. package/dist/routines/routine-manager.js +22 -15
  164. package/dist/routines/routine-manager.js.map +1 -1
  165. package/dist/security/audit-logger.d.ts.map +1 -1
  166. package/dist/security/audit-logger.js +5 -7
  167. package/dist/security/audit-logger.js.map +1 -1
  168. package/dist/security/policy-engine.d.ts +28 -17
  169. package/dist/security/policy-engine.d.ts.map +1 -1
  170. package/dist/security/policy-engine.js +42 -185
  171. package/dist/security/policy-engine.js.map +1 -1
  172. package/dist/security/policy-serializer.d.ts +19 -0
  173. package/dist/security/policy-serializer.d.ts.map +1 -0
  174. package/dist/security/policy-serializer.js +100 -0
  175. package/dist/security/policy-serializer.js.map +1 -0
  176. package/dist/security/shell-validator.d.ts +42 -0
  177. package/dist/security/shell-validator.d.ts.map +1 -0
  178. package/dist/security/shell-validator.js +231 -0
  179. package/dist/security/shell-validator.js.map +1 -0
  180. package/dist/skills/index.d.ts +1 -0
  181. package/dist/skills/index.d.ts.map +1 -1
  182. package/dist/skills/index.js +1 -0
  183. package/dist/skills/index.js.map +1 -1
  184. package/dist/skills/skill-loader.d.ts +38 -2
  185. package/dist/skills/skill-loader.d.ts.map +1 -1
  186. package/dist/skills/skill-loader.js +83 -2
  187. package/dist/skills/skill-loader.js.map +1 -1
  188. package/dist/skills/subagent-loader.d.ts +66 -0
  189. package/dist/skills/subagent-loader.d.ts.map +1 -0
  190. package/dist/skills/subagent-loader.js +143 -0
  191. package/dist/skills/subagent-loader.js.map +1 -0
  192. package/dist/steering/flag-manager.d.ts +20 -0
  193. package/dist/steering/flag-manager.d.ts.map +1 -1
  194. package/dist/steering/flag-manager.js +94 -11
  195. package/dist/steering/flag-manager.js.map +1 -1
  196. package/dist/steering/steering-manager.d.ts +11 -0
  197. package/dist/steering/steering-manager.d.ts.map +1 -1
  198. package/dist/steering/steering-manager.js +23 -0
  199. package/dist/steering/steering-manager.js.map +1 -1
  200. package/dist/steering/telegram-gateway.d.ts +4 -1
  201. package/dist/steering/telegram-gateway.d.ts.map +1 -1
  202. package/dist/steering/telegram-gateway.js +49 -10
  203. package/dist/steering/telegram-gateway.js.map +1 -1
  204. package/dist/teams/bridge-watchdog.d.ts.map +1 -1
  205. package/dist/teams/bridge-watchdog.js +5 -3
  206. package/dist/teams/bridge-watchdog.js.map +1 -1
  207. package/dist/teams/gemini-bridge.d.ts.map +1 -1
  208. package/dist/teams/gemini-bridge.js +9 -4
  209. package/dist/teams/gemini-bridge.js.map +1 -1
  210. package/dist/tools/index.d.ts +2 -0
  211. package/dist/tools/index.d.ts.map +1 -1
  212. package/dist/tools/index.js +2 -0
  213. package/dist/tools/index.js.map +1 -1
  214. package/dist/tools/memory-tools.d.ts +16 -0
  215. package/dist/tools/memory-tools.d.ts.map +1 -0
  216. package/dist/tools/memory-tools.js +207 -0
  217. package/dist/tools/memory-tools.js.map +1 -0
  218. package/dist/tools/notifications.d.ts.map +1 -1
  219. package/dist/tools/notifications.js +3 -1
  220. package/dist/tools/notifications.js.map +1 -1
  221. package/dist/tools/tool-factory.d.ts +36 -0
  222. package/dist/tools/tool-factory.d.ts.map +1 -0
  223. package/dist/tools/tool-factory.js +55 -0
  224. package/dist/tools/tool-factory.js.map +1 -0
  225. package/dist/types.d.ts +205 -1
  226. package/dist/types.d.ts.map +1 -1
  227. package/dist/types.js +47 -1
  228. package/dist/types.js.map +1 -1
  229. package/dist/utils/errors.d.ts +21 -0
  230. package/dist/utils/errors.d.ts.map +1 -0
  231. package/dist/utils/errors.js +29 -0
  232. package/dist/utils/errors.js.map +1 -0
  233. package/dist/utils/event-filter.d.ts +25 -0
  234. package/dist/utils/event-filter.d.ts.map +1 -0
  235. package/dist/utils/event-filter.js +61 -0
  236. package/dist/utils/event-filter.js.map +1 -0
  237. package/dist/utils/logger.d.ts +33 -36
  238. package/dist/utils/logger.d.ts.map +1 -1
  239. package/dist/utils/logger.js +60 -130
  240. package/dist/utils/logger.js.map +1 -1
  241. package/dist/utils/validate-job-id.d.ts +6 -0
  242. package/dist/utils/validate-job-id.d.ts.map +1 -0
  243. package/dist/utils/validate-job-id.js +10 -0
  244. package/dist/utils/validate-job-id.js.map +1 -0
  245. package/package.json +12 -3
@@ -1 +1 @@
1
- {"version":3,"file":"auth-monitor.d.ts","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,aAAa,EAAE,iBAAiB,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;gBAEpC,OAAO,EAAE,kBAAkB;IAMvC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAkCnD"}
1
+ {"version":3,"file":"auth-monitor.d.ts","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAK9D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,aAAa,EAAE,iBAAiB,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;gBAEpC,OAAO,EAAE,kBAAkB;IAMvC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAkCnD"}
@@ -7,6 +7,8 @@
7
7
  * - Distinguishes between quota exhaustion and auth failure.
8
8
  * - Checkpoints active jobs on auth failure.
9
9
  */
10
+ import { createLogger } from '../utils/logger.js';
11
+ const log = createLogger('auth-monitor');
10
12
  export class AuthMonitor {
11
13
  _providers;
12
14
  _notifications;
@@ -40,7 +42,7 @@ export class AuthMonitor {
40
42
  }
41
43
  catch (err) {
42
44
  // Unexpected error during auth check
43
- console.error(`Error checking auth for ${provider.name}:`, err);
45
+ log.error({ provider: provider.name, err }, 'Error checking auth');
44
46
  }
45
47
  }));
46
48
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-monitor.js","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,MAAM,OAAO,WAAW;IACL,UAAU,CAAgB;IAC1B,cAAc,CAAoB;IAClC,sBAAsB,CAAS;IAEhD,YAAY,OAA2B;QACrC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,IAAI,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC9C,MAAM,WAAW,GAAG,OAAO,CAAC;QAE5B,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEjC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC5C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAC9B,yBAAyB,EACzB,GAAG,QAAQ,CAAC,IAAI,kEAAkE,CACnF,CAAC;oBACF,mFAAmF;gBACrF,CAAC;qBAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACxC,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;oBAC7E,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBACvE,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAC9B,mBAAmB,EACnB,GAAG,QAAQ,CAAC,IAAI,sBAAsB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CACrE,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qCAAqC;gBACrC,OAAO,CAAC,KAAK,CAAC,2BAA2B,QAAQ,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
1
+ {"version":3,"file":"auth-monitor.js","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAQzC,MAAM,OAAO,WAAW;IACL,UAAU,CAAgB;IAC1B,cAAc,CAAoB;IAClC,sBAAsB,CAAS;IAEhD,YAAY,OAA2B;QACrC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,IAAI,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC9C,MAAM,WAAW,GAAG,OAAO,CAAC;QAE5B,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEjC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC5C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAC9B,yBAAyB,EACzB,GAAG,QAAQ,CAAC,IAAI,kEAAkE,CACnF,CAAC;oBACF,mFAAmF;gBACrF,CAAC;qBAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACxC,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;oBAC7E,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBACvE,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAC9B,mBAAmB,EACnB,GAAG,QAAQ,CAAC,IAAI,sBAAsB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CACrE,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qCAAqC;gBACrC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -19,6 +19,9 @@ export interface SdkHookMatcher {
19
19
  /**
20
20
  * Custom tool that Zora can inject into the SDK execution.
21
21
  * Used for Zora-specific tools like check_permissions and request_permissions.
22
+ *
23
+ * These are registered as an in-process MCP server via createSdkMcpServer(),
24
+ * which is the SDK's supported mechanism for custom tools.
22
25
  */
23
26
  export interface CustomToolDefinition {
24
27
  name: string;
@@ -26,6 +29,24 @@ export interface CustomToolDefinition {
26
29
  input_schema: Record<string, unknown>;
27
30
  handler: (input: Record<string, unknown>) => Promise<unknown>;
28
31
  }
32
+ /**
33
+ * ORCH-14: Callback to transform/prune the event history before it's used.
34
+ * Called by the orchestrator before submitting follow-up tasks and during
35
+ * context preparation. Can prune old events, drop thinking events, summarize
36
+ * tool results, etc.
37
+ *
38
+ * @param history - Current event history
39
+ * @param turn - Current turn number (0-based)
40
+ * @returns Pruned/transformed event history
41
+ */
42
+ export type TransformContextFn = (history: import('../types.js').AgentEvent[], turn: number) => import('../types.js').AgentEvent[];
43
+ /**
44
+ * ORCH-14: Default transformContext implementation.
45
+ * - Keeps the last `maxEvents` events (default 100).
46
+ * - Drops 'thinking' events older than 5 turns.
47
+ * - Truncates 'tool_result' content to 500 chars for events older than 10 turns.
48
+ */
49
+ export declare function defaultTransformContext(history: import('../types.js').AgentEvent[], turn: number, maxEvents?: number): import('../types.js').AgentEvent[];
29
50
  export interface ZoraExecutionOptions {
30
51
  systemPrompt?: string;
31
52
  cwd?: string;
@@ -41,6 +62,8 @@ export interface ZoraExecutionOptions {
41
62
  onMessage?: (message: SDKMessage) => void;
42
63
  /** ERR-05: Timeout in milliseconds for stream operations (default: 30min) */
43
64
  streamTimeout?: number;
65
+ /** ORCH-14: Optional context transform callback applied before each follow-up */
66
+ transformContext?: TransformContextFn;
44
67
  }
45
68
  export declare class ExecutionLoop {
46
69
  private readonly _opts;
@@ -1 +1 @@
1
- {"version":3,"file":"execution-loop.d.ts","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKxD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAC/C,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAC3C,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC;AACvC,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAClD,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;gBAEjC,OAAO,EAAE,oBAAoB;IAIzC;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsE1C;;OAEG;IACH,IAAI,OAAO,IAAI,oBAAoB,CAElC;CACF"}
1
+ {"version":3,"file":"execution-loop.d.ts","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,eAAe,EAErB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAC/C,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAC3C,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC;AACvC,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,EAC3C,IAAI,EAAE,MAAM,KACT,OAAO,aAAa,EAAE,UAAU,EAAE,CAAC;AAExC;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,EAC3C,IAAI,EAAE,MAAM,EACZ,SAAS,SAAM,GACd,OAAO,aAAa,EAAE,UAAU,EAAE,CAkBpC;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAClD,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;CACvC;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;gBAEjC,OAAO,EAAE,oBAAoB;IAIzC;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyF1C;;OAEG;IACH,IAAI,OAAO,IAAI,oBAAoB,CAElC;CACF"}
@@ -6,7 +6,32 @@
6
6
  * (Read, Write, Edit, Bash, Glob, Grep, WebSearch, WebFetch, Task),
7
7
  * MCP server management, subagent orchestration, hooks, and permissions.
8
8
  */
9
- import { query, } from '@anthropic-ai/claude-agent-sdk';
9
+ import { query, createSdkMcpServer, } from '@anthropic-ai/claude-agent-sdk';
10
+ import { createLogger } from '../utils/logger.js';
11
+ const log = createLogger('execution-loop');
12
+ /**
13
+ * ORCH-14: Default transformContext implementation.
14
+ * - Keeps the last `maxEvents` events (default 100).
15
+ * - Drops 'thinking' events older than 5 turns.
16
+ * - Truncates 'tool_result' content to 500 chars for events older than 10 turns.
17
+ */
18
+ export function defaultTransformContext(history, turn, maxEvents = 100) {
19
+ let events = history;
20
+ // Drop thinking events older than 5 turns
21
+ if (turn > 5) {
22
+ const cutoffIndex = Math.max(0, events.length - (5 * 3)); // rough: ~3 events per turn
23
+ events = events.filter((e, i) => {
24
+ if (e.type === 'thinking' && i < cutoffIndex)
25
+ return false;
26
+ return true;
27
+ });
28
+ }
29
+ // Keep only the last maxEvents
30
+ if (events.length > maxEvents) {
31
+ events = events.slice(-maxEvents);
32
+ }
33
+ return events;
34
+ }
10
35
  const DEFAULT_TOOLS = [
11
36
  'Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep',
12
37
  'WebSearch', 'WebFetch', 'Task',
@@ -24,16 +49,36 @@ export class ExecutionLoop {
24
49
  async run(prompt) {
25
50
  let result = '';
26
51
  let sessionId;
27
- // Build custom tool schemas for SDK registration
28
- const customToolSchemas = (this._opts.customTools ?? []).map(t => ({
29
- name: t.name,
30
- description: t.description,
31
- input_schema: t.input_schema,
32
- }));
52
+ // Register custom tools as an in-process MCP server (the SDK's supported mechanism).
53
+ // The old approach of passing { customTools } to sdkOptions was silently ignored.
54
+ const mcpServers = {
55
+ ...(this._opts.mcpServers ?? {}),
56
+ };
57
+ const customTools = this._opts.customTools ?? [];
58
+ const customToolNames = [];
59
+ if (customTools.length > 0) {
60
+ const toolDefs = customTools.map(t => ({
61
+ name: t.name,
62
+ description: t.description,
63
+ inputSchema: t.input_schema,
64
+ handler: async (args) => {
65
+ const result = await t.handler(args);
66
+ return {
67
+ content: [{ type: 'text', text: JSON.stringify(result) }],
68
+ };
69
+ },
70
+ }));
71
+ mcpServers['zora-tools'] = createSdkMcpServer({
72
+ name: 'zora-tools',
73
+ version: '1.0.0',
74
+ tools: toolDefs,
75
+ });
76
+ customToolNames.push(...customTools.map(t => `mcp__zora-tools__${t.name}`));
77
+ }
33
78
  const sdkOptions = {
34
- allowedTools: this._opts.allowedTools ?? DEFAULT_TOOLS,
79
+ allowedTools: [...(this._opts.allowedTools ?? DEFAULT_TOOLS), ...customToolNames],
35
80
  permissionMode: this._opts.permissionMode ?? 'default',
36
- mcpServers: this._opts.mcpServers ?? {},
81
+ mcpServers,
37
82
  agents: this._opts.agents ?? {},
38
83
  systemPrompt: this._opts.systemPrompt,
39
84
  cwd: this._opts.cwd ?? process.cwd(),
@@ -42,7 +87,6 @@ export class ExecutionLoop {
42
87
  hooks: this._opts.hooks ?? {},
43
88
  canUseTool: this._opts.canUseTool,
44
89
  settingSources: ['user', 'project'],
45
- ...(customToolSchemas.length > 0 ? { customTools: customToolSchemas } : {}),
46
90
  };
47
91
  // ERR-05: Timeout protection (default 30 minutes)
48
92
  const streamTimeout = this._opts.streamTimeout ?? 30 * 60 * 1000;
@@ -56,24 +100,21 @@ export class ExecutionLoop {
56
100
  lastEventTime = Date.now();
57
101
  timeoutHandle = setTimeout(() => {
58
102
  const elapsed = Date.now() - lastEventTime;
59
- console.error('[ExecutionLoop] Stream timeout exceeded:', {
60
- timeout: streamTimeout,
61
- elapsed,
62
- sessionId,
63
- });
103
+ log.error({ timeout: streamTimeout, elapsed, sessionId }, 'Stream timeout exceeded');
64
104
  throw new Error(`Stream timeout: No events received for ${streamTimeout}ms`);
65
105
  }, streamTimeout);
66
106
  // Capture session ID from init message
67
- if ('session_id' in message && !sessionId) {
68
- sessionId = message.session_id;
107
+ const msg = message;
108
+ if ('session_id' in message && !sessionId && typeof msg['session_id'] === 'string') {
109
+ sessionId = msg['session_id'];
69
110
  }
70
111
  // Notify listener if registered
71
112
  if (this._opts.onMessage) {
72
113
  this._opts.onMessage(message);
73
114
  }
74
115
  // Extract final result
75
- if ('result' in message && typeof message.result === 'string') {
76
- result = message.result;
116
+ if ('result' in message && typeof msg['result'] === 'string') {
117
+ result = msg['result'];
77
118
  }
78
119
  }
79
120
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"execution-loop.js","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution-loop.js","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,15 @@
9
9
  */
10
10
  import type { LLMProvider, TaskContext, HandoffBundle, FailoverConfig } from '../types.js';
11
11
  import { Router } from './router.js';
12
+ export type ErrorCategory = 'rate_limit' | 'quota' | 'auth' | 'timeout' | 'transient' | 'permanent' | 'unknown';
13
+ export interface ClassifiedError {
14
+ category: ErrorCategory;
15
+ retryable: boolean;
16
+ httpStatus?: number;
17
+ errorCode?: string;
18
+ originalMessage: string;
19
+ confidence: 'high' | 'medium' | 'low';
20
+ }
12
21
  export interface FailoverResult {
13
22
  nextProvider: LLMProvider;
14
23
  handoffBundle: HandoffBundle;
@@ -17,6 +26,11 @@ export declare class FailoverController {
17
26
  private readonly _providers;
18
27
  private readonly _config;
19
28
  constructor(providers: LLMProvider[], _router: Router, config: FailoverConfig);
29
+ /**
30
+ * Classify an error using multi-signal analysis (HTTP status, error codes, message patterns).
31
+ * Returns a structured classification with confidence level.
32
+ */
33
+ classifyError(error: Error): ClassifiedError;
20
34
  /**
21
35
  * Evaluates a failure and determines if a failover should occur.
22
36
  * If so, returns the next provider and a handoff bundle.
@@ -26,7 +40,17 @@ export declare class FailoverController {
26
40
  * Creates a structured context package for failover.
27
41
  */
28
42
  private _createHandoffBundle;
29
- private _isQuotaError;
30
- private _isAuthError;
43
+ /**
44
+ * Extract HTTP status code from error object or message.
45
+ */
46
+ private _extractHttpStatus;
47
+ /**
48
+ * Extract structured error code from error object.
49
+ */
50
+ private _extractErrorCode;
51
+ /**
52
+ * Classify based on structured error codes from known providers.
53
+ */
54
+ private _classifyByErrorCode;
31
55
  }
32
56
  //# sourceMappingURL=failover-controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"failover-controller.d.ts","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAE7B,SAAS,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAK7E;;;OAGG;IACG,aAAa,CACjB,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,WAAW,EAC3B,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAqCjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,YAAY;CAKrB"}
1
+ {"version":3,"file":"failover-controller.d.ts","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EAEf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAEhH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAE7B,SAAS,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAK7E;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe;IA0E5C;;;OAGG;IACG,aAAa,CACjB,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,WAAW,EAC3B,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAsCjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsD5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAmB7B"}
@@ -7,6 +7,7 @@
7
7
  * - Creates HandoffBundles for seamless mid-task transitions.
8
8
  * - Implements cooldown tracking with exponential backoff.
9
9
  */
10
+ import { isTextEvent, isToolCallEvent } from '../types.js';
10
11
  import { Router } from './router.js';
11
12
  export class FailoverController {
12
13
  _providers;
@@ -15,6 +16,73 @@ export class FailoverController {
15
16
  this._providers = providers;
16
17
  this._config = config;
17
18
  }
19
+ /**
20
+ * Classify an error using multi-signal analysis (HTTP status, error codes, message patterns).
21
+ * Returns a structured classification with confidence level.
22
+ */
23
+ classifyError(error) {
24
+ const message = error.message;
25
+ const lowerMessage = message.toLowerCase();
26
+ // Extract HTTP status code from error (many providers embed it)
27
+ const httpStatus = this._extractHttpStatus(error);
28
+ // Extract structured error code if available
29
+ const errorCode = this._extractErrorCode(error);
30
+ // High-confidence: HTTP status codes (most reliable signal)
31
+ if (httpStatus === 429) {
32
+ return { category: 'rate_limit', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
33
+ }
34
+ if (httpStatus === 401 || httpStatus === 403) {
35
+ return { category: 'auth', retryable: false, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
36
+ }
37
+ if (httpStatus === 408 || httpStatus === 504) {
38
+ return { category: 'timeout', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
39
+ }
40
+ if (httpStatus !== undefined && httpStatus >= 500) {
41
+ return { category: 'transient', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
42
+ }
43
+ // High-confidence: Structured error codes from providers
44
+ if (errorCode) {
45
+ const codeClassification = this._classifyByErrorCode(errorCode);
46
+ if (codeClassification) {
47
+ return { ...codeClassification, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
48
+ }
49
+ }
50
+ // Medium-confidence: Known provider error message patterns
51
+ // Use anchored patterns to avoid false positives (e.g., "limit" in unrelated contexts)
52
+ const RATE_LIMIT_PATTERNS = [
53
+ /rate.?limit/i, // "rate_limit", "rate limit", "rate-limit"
54
+ /too many requests/i,
55
+ /resource.?exhausted/i, // Gemini's RESOURCE_EXHAUSTED
56
+ /quota.?exceed/i, // "quota exceeded", "quota_exceeded"
57
+ ];
58
+ const AUTH_PATTERNS = [
59
+ /\bauth(?:entication|orization)?\s+(?:failed|error|invalid)\b/i,
60
+ /\bunauthorized\b/i,
61
+ /\binvalid.?(?:api.?key|credential|token)\b/i,
62
+ /\btoken\s+(?:expired|invalid|revoked)\b/i,
63
+ /\bsession\s+expired\b/i,
64
+ /\bpermission\s+denied\b/i,
65
+ ];
66
+ const TIMEOUT_PATTERNS = [
67
+ /\btimeout\b/i,
68
+ /\btimed?\s*out\b/i,
69
+ /\bdeadline\s+exceeded\b/i,
70
+ ];
71
+ if (RATE_LIMIT_PATTERNS.some(p => p.test(message))) {
72
+ return { category: 'rate_limit', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'medium' };
73
+ }
74
+ if (AUTH_PATTERNS.some(p => p.test(message))) {
75
+ return { category: 'auth', retryable: false, httpStatus, errorCode, originalMessage: message, confidence: 'medium' };
76
+ }
77
+ if (TIMEOUT_PATTERNS.some(p => p.test(message))) {
78
+ return { category: 'timeout', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'medium' };
79
+ }
80
+ // Low-confidence: Broad transient patterns
81
+ if (lowerMessage.includes('overloaded') || lowerMessage.includes('temporarily unavailable') || lowerMessage.includes('service unavailable')) {
82
+ return { category: 'transient', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'low' };
83
+ }
84
+ return { category: 'unknown', retryable: false, httpStatus, errorCode, originalMessage: message, confidence: 'low' };
85
+ }
18
86
  /**
19
87
  * Evaluates a failure and determines if a failover should occur.
20
88
  * If so, returns the next provider and a handoff bundle.
@@ -22,9 +90,10 @@ export class FailoverController {
22
90
  async handleFailure(task, failedProvider, error) {
23
91
  if (!this._config.enabled)
24
92
  return null;
25
- const errorMessage = error.message.toLowerCase();
26
- const isQuotaError = this._isQuotaError(errorMessage);
27
- const isAuthError = this._isAuthError(errorMessage);
93
+ // Cache classification result to avoid redundant calls
94
+ const classified = this.classifyError(error);
95
+ const isQuotaError = classified.category === 'rate_limit' || classified.category === 'quota';
96
+ const isAuthError = classified.category === 'auth';
28
97
  if (!isQuotaError && !isAuthError) {
29
98
  // For general errors, we might retry or fail depending on config.
30
99
  // For v1, we only failover on quota/auth.
@@ -42,7 +111,7 @@ export class FailoverController {
42
111
  try {
43
112
  const nextProvider = await candidateRouter.selectProvider(task);
44
113
  // 3. Create HandoffBundle
45
- const handoffBundle = this._createHandoffBundle(task, failedProvider, nextProvider, error);
114
+ const handoffBundle = this._createHandoffBundle(task, failedProvider, nextProvider, classified);
46
115
  return { nextProvider, handoffBundle };
47
116
  }
48
117
  catch (err) {
@@ -53,32 +122,35 @@ export class FailoverController {
53
122
  /**
54
123
  * Creates a structured context package for failover.
55
124
  */
56
- _createHandoffBundle(task, from, to, error) {
125
+ _createHandoffBundle(task, from, to, classified) {
57
126
  const history = task.history || [];
58
127
  // Extract progress/artifacts from history
59
128
  const progress = [];
60
129
  const artifacts = [];
61
130
  const toolHistory = [];
62
131
  for (const event of history) {
63
- if (event.type === 'text') {
132
+ if (isTextEvent(event)) {
64
133
  progress.push(event.content.text);
65
134
  }
66
- else if (event.type === 'tool_call') {
67
- const content = event.content;
135
+ else if (isToolCallEvent(event)) {
68
136
  toolHistory.push({
69
- toolCallId: content.toolCallId,
70
- tool: content.tool,
71
- arguments: content.arguments,
137
+ toolCallId: event.content.toolCallId,
138
+ tool: event.content.tool,
139
+ arguments: event.content.arguments,
72
140
  });
73
141
  }
74
142
  else if (event.type === 'tool_result') {
75
143
  const content = event.content;
76
144
  const lastTool = toolHistory[toolHistory.length - 1];
77
145
  if (lastTool && lastTool.toolCallId === content.toolCallId) {
146
+ // Handle result being a string or object
147
+ const result = typeof content.result === 'string'
148
+ ? { content: content.result }
149
+ : content.result;
78
150
  lastTool.result = {
79
- status: content.result.success ? 'ok' : 'error',
80
- output: content.result.content || content.result.stdout,
81
- error: content.result.error || content.result.stderr,
151
+ status: content.error ? 'error' : 'ok',
152
+ output: result ? String(result['content'] ?? result['stdout'] ?? '') : undefined,
153
+ error: content.error ?? (result ? String(result['stderr'] ?? '') : undefined),
82
154
  };
83
155
  }
84
156
  }
@@ -90,22 +162,70 @@ export class FailoverController {
90
162
  createdAt: new Date(),
91
163
  task: task.task,
92
164
  context: {
93
- summary: `Failing over from ${from.name} to ${to.name} due to ${this._isQuotaError(error.message) ? 'quota limits' : 'auth failure'}.`,
165
+ summary: `Failing over from ${from.name} to ${to.name} due to ${classified.category === 'rate_limit' || classified.category === 'quota' ? 'quota limits' : 'auth failure'}.`,
94
166
  progress,
95
167
  artifacts,
96
168
  },
97
169
  toolHistory,
98
170
  };
99
171
  }
100
- _isQuotaError(message) {
101
- const patterns = ['rate_limit', 'rate limit', 'quota', '429', 'too many requests', 'overloaded'];
102
- const lower = message.toLowerCase();
103
- return patterns.some(p => lower.includes(p));
172
+ /**
173
+ * Extract HTTP status code from error object or message.
174
+ */
175
+ _extractHttpStatus(error) {
176
+ // Many API clients attach status to the error object
177
+ const anyErr = error;
178
+ if (typeof anyErr.status === 'number')
179
+ return anyErr.status;
180
+ if (typeof anyErr.statusCode === 'number')
181
+ return anyErr.statusCode;
182
+ if (anyErr.response && typeof anyErr.response.status === 'number')
183
+ return anyErr.response.status;
184
+ // Fallback: extract from message like "Error 429: ..." or "(429)"
185
+ const match = error.message.match(/\b(4\d{2}|5\d{2})\b/);
186
+ if (match)
187
+ return parseInt(match[1], 10);
188
+ return undefined;
189
+ }
190
+ /**
191
+ * Extract structured error code from error object.
192
+ */
193
+ _extractErrorCode(error) {
194
+ const anyErr = error;
195
+ if (typeof anyErr.code === 'string')
196
+ return anyErr.code;
197
+ if (typeof anyErr.error?.code === 'string')
198
+ return anyErr.error.code;
199
+ if (typeof anyErr.error?.type === 'string')
200
+ return anyErr.error.type;
201
+ return undefined;
104
202
  }
105
- _isAuthError(message) {
106
- const patterns = ['auth', 'unauthorized', 'token', 'expired', 'session', 'login'];
107
- const lower = message.toLowerCase();
108
- return patterns.some(p => lower.includes(p));
203
+ /**
204
+ * Classify based on structured error codes from known providers.
205
+ */
206
+ _classifyByErrorCode(code) {
207
+ const normalized = code.toLowerCase();
208
+ // Gemini / Google API codes
209
+ if (normalized === 'resource_exhausted')
210
+ return { category: 'rate_limit', retryable: true };
211
+ if (normalized === 'unauthenticated')
212
+ return { category: 'auth', retryable: false };
213
+ if (normalized === 'permission_denied')
214
+ return { category: 'auth', retryable: false };
215
+ if (normalized === 'deadline_exceeded')
216
+ return { category: 'timeout', retryable: true };
217
+ if (normalized === 'unavailable')
218
+ return { category: 'transient', retryable: true };
219
+ // OpenAI / Anthropic codes
220
+ if (normalized === 'rate_limit_error' || normalized === 'rate_limit_exceeded')
221
+ return { category: 'rate_limit', retryable: true };
222
+ if (normalized === 'authentication_error' || normalized === 'invalid_api_key')
223
+ return { category: 'auth', retryable: false };
224
+ if (normalized === 'overloaded_error')
225
+ return { category: 'transient', retryable: true };
226
+ if (normalized === 'quota_exceeded')
227
+ return { category: 'quota', retryable: false };
228
+ return null;
109
229
  }
110
230
  }
111
231
  //# sourceMappingURL=failover-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"failover-controller.js","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"failover-controller.js","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkBrC,MAAM,OAAO,kBAAkB;IACZ,UAAU,CAAgB;IAC1B,OAAO,CAAiB;IAEzC,YAAY,SAAwB,EAAE,OAAe,EAAE,MAAsB;QAC3E,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,KAAY;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3C,gEAAgE;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAElD,6CAA6C;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEhD,4DAA4D;QAC5D,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAC1H,CAAC;QACD,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACrH,CAAC;QACD,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACvH,CAAC;QACD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YAClD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACzH,CAAC;QAED,yDAAyD;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAChE,IAAI,kBAAkB,EAAE,CAAC;gBACvB,OAAO,EAAE,GAAG,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACxG,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,uFAAuF;QACvF,MAAM,mBAAmB,GAAG;YAC1B,cAAc,EAAmB,2CAA2C;YAC5E,oBAAoB;YACpB,sBAAsB,EAAW,8BAA8B;YAC/D,gBAAgB,EAAiB,qCAAqC;SACvE,CAAC;QAEF,MAAM,aAAa,GAAG;YACpB,+DAA+D;YAC/D,mBAAmB;YACnB,6CAA6C;YAC7C,0CAA0C;YAC1C,wBAAwB;YACxB,0BAA0B;SAC3B,CAAC;QAEF,MAAM,gBAAgB,GAAG;YACvB,cAAc;YACd,mBAAmB;YACnB,0BAA0B;SAC3B,CAAC;QAEF,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAC5H,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QACvH,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QACzH,CAAC;QAED,2CAA2C;QAC3C,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC5I,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACxH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACvH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,IAAiB,EACjB,cAA2B,EAC3B,KAAY;QAEZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEvC,uDAAuD;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,KAAK,YAAY,IAAI,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC7F,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,KAAK,MAAM,CAAC;QAEnD,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,kEAAkE;YAClE,0CAA0C;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2CAA2C;QAC3C,mEAAmE;QAEnE,sCAAsC;QACtC,6EAA6E;QAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC;YACjC,SAAS,EAAE,UAAU;YACrB,IAAI,EAAE,iBAAiB,CAAC,gDAAgD;SACzE,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAEhE,0BAA0B;YAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YAEhG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,8BAA8B;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,IAAiB,EACjB,IAAiB,EACjB,EAAe,EACf,UAA2B;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAEnC,0CAA0C;QAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAiC,EAAE,CAAC;QAErD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,WAAW,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU;oBACpC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;oBACxB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;iBACnC,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACxC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiC,CAAC;gBACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrD,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC3D,yCAAyC;oBACzC,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;wBAC/C,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;wBAC7B,CAAC,CAAE,OAAO,CAAC,MAA8C,CAAC;oBAC5D,QAAQ,CAAC,MAAM,GAAG;wBAChB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;wBACtC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;wBAChF,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;qBAC9E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,UAAU,EAAE,EAAE,CAAC,IAAI;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE;gBACP,OAAO,EAAE,qBAAqB,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI,WAAW,UAAU,CAAC,QAAQ,KAAK,YAAY,IAAI,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,GAAG;gBAC5K,QAAQ;gBACR,SAAS;aACV;YACD,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,KAAY;QACrC,qDAAqD;QACrD,MAAM,MAAM,GAAG,KAAY,CAAC;QAC5B,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC;QAC5D,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,UAAU,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAEjG,kEAAkE;QAClE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzD,IAAI,KAAK;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAE1C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAY;QACpC,MAAM,MAAM,GAAG,KAAY,CAAC;QAC5B,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QACxD,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QACrE,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QACrE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,IAAY;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEtC,4BAA4B;QAC5B,IAAI,UAAU,KAAK,oBAAoB;YAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC5F,IAAI,UAAU,KAAK,iBAAiB;YAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACpF,IAAI,UAAU,KAAK,mBAAmB;YAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACtF,IAAI,UAAU,KAAK,mBAAmB;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACxF,IAAI,UAAU,KAAK,aAAa;YAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAEpF,2BAA2B;QAC3B,IAAI,UAAU,KAAK,kBAAkB,IAAI,UAAU,KAAK,qBAAqB;YAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAClI,IAAI,UAAU,KAAK,sBAAsB,IAAI,UAAU,KAAK,iBAAiB;YAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7H,IAAI,UAAU,KAAK,kBAAkB;YAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACzF,IAAI,UAAU,KAAK,gBAAgB;YAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAEpF,OAAO,IAAI,CAAC;IACd,CAAC;CAEF"}