aemeathcli 1.0.9 → 1.0.11

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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +609 -608
  3. package/dist/App-YAHJUWCX.js +4274 -0
  4. package/dist/App-YAHJUWCX.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-UN3TJEOO.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-UN3TJEOO.js.map} +1 -1
  15. package/dist/auth-status-EIM5A5KL.js +13 -0
  16. package/dist/auth-status-EIM5A5KL.js.map +1 -0
  17. package/dist/{chunk-UY2SYSEZ.js → chunk-25UNNEHN.js} +32 -103
  18. package/dist/chunk-25UNNEHN.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2GKOK6T7.js} +28 -5
  20. package/dist/chunk-2GKOK6T7.js.map +1 -0
  21. package/dist/{chunk-MFBHNWGV.js → chunk-2LF7ALGR.js} +12 -20
  22. package/dist/chunk-2LF7ALGR.js.map +1 -0
  23. package/dist/{chunk-H66O5Z2V.js → chunk-2NWNIKBK.js} +42 -7
  24. package/dist/chunk-2NWNIKBK.js.map +1 -0
  25. package/dist/chunk-3TSPZRGM.js +26 -0
  26. package/dist/chunk-3TSPZRGM.js.map +1 -0
  27. package/dist/{chunk-ZGOHARPV.js → chunk-473JN6M5.js} +2 -2
  28. package/dist/chunk-473JN6M5.js.map +1 -0
  29. package/dist/{chunk-IYW62KKR.js → chunk-5XFSV6PF.js} +66 -23
  30. package/dist/chunk-5XFSV6PF.js.map +1 -0
  31. package/dist/{chunk-HCIHOHLX.js → chunk-62HSGYQD.js} +2 -2
  32. package/dist/chunk-62HSGYQD.js.map +1 -0
  33. package/dist/{chunk-I5PZ4JTS.js → chunk-6GUD7QIM.js} +4 -4
  34. package/dist/chunk-6GUD7QIM.js.map +1 -0
  35. package/dist/{chunk-4IJD72YB.js → chunk-AQ23TYSQ.js} +7 -7
  36. package/dist/chunk-AQ23TYSQ.js.map +1 -0
  37. package/dist/{chunk-NBR3GHMT.js → chunk-BY4DAKUU.js} +39 -7
  38. package/dist/chunk-BY4DAKUU.js.map +1 -0
  39. package/dist/chunk-CC7MGWYY.js +12 -0
  40. package/dist/chunk-CC7MGWYY.js.map +1 -0
  41. package/dist/chunk-CTFZTARK.js +155 -0
  42. package/dist/chunk-CTFZTARK.js.map +1 -0
  43. package/dist/chunk-FIC7AK4Q.js +232 -0
  44. package/dist/chunk-FIC7AK4Q.js.map +1 -0
  45. package/dist/chunk-GU33WKPG.js +140 -0
  46. package/dist/chunk-GU33WKPG.js.map +1 -0
  47. package/dist/{chunk-VUG4IZ7J.js → chunk-H2SYKIMI.js} +10 -10
  48. package/dist/chunk-H2SYKIMI.js.map +1 -0
  49. package/dist/{chunk-JAXXTYID.js → chunk-HEKFAKVH.js} +2 -2
  50. package/dist/chunk-HEKFAKVH.js.map +1 -0
  51. package/dist/chunk-IARA5XYP.js +186 -0
  52. package/dist/chunk-IARA5XYP.js.map +1 -0
  53. package/dist/{chunk-HMJRPNPZ.js → chunk-LCYH4T6N.js} +95 -23
  54. package/dist/chunk-LCYH4T6N.js.map +1 -0
  55. package/dist/{chunk-CARHU3DO.js → chunk-LDVY5ELP.js} +66 -18
  56. package/dist/chunk-LDVY5ELP.js.map +1 -0
  57. package/dist/chunk-OCJPQFOR.js +88 -0
  58. package/dist/chunk-OCJPQFOR.js.map +1 -0
  59. package/dist/chunk-ODBY7S4X.js +141 -0
  60. package/dist/chunk-ODBY7S4X.js.map +1 -0
  61. package/dist/{chunk-DAHGLHNR.js → chunk-ONQ4WCUI.js} +7 -142
  62. package/dist/chunk-ONQ4WCUI.js.map +1 -0
  63. package/dist/{chunk-WPP3PEDE.js → chunk-P5TKZM3T.js} +32 -107
  64. package/dist/chunk-P5TKZM3T.js.map +1 -0
  65. package/dist/{chunk-ASGRGXYK.js → chunk-P66WDACW.js} +23 -22
  66. package/dist/chunk-P66WDACW.js.map +1 -0
  67. package/dist/{chunk-LSOYPSAT.js → chunk-QCRK4QEL.js} +4 -4
  68. package/dist/chunk-QCRK4QEL.js.map +1 -0
  69. package/dist/{chunk-YL5XFHR3.js → chunk-ROJPFPJ7.js} +2 -2
  70. package/dist/chunk-ROJPFPJ7.js.map +1 -0
  71. package/dist/chunk-RP2TAL3J.js +71 -0
  72. package/dist/chunk-RP2TAL3J.js.map +1 -0
  73. package/dist/{chunk-6PDJ45T4.js → chunk-RYOB3TLZ.js} +51 -26
  74. package/dist/chunk-RYOB3TLZ.js.map +1 -0
  75. package/dist/{chunk-Y5XVD2CD.js → chunk-SOQFMNQC.js} +110 -83
  76. package/dist/chunk-SOQFMNQC.js.map +1 -0
  77. package/dist/{chunk-TEVZS4FA.js → chunk-TDFTX32B.js} +16 -9
  78. package/dist/chunk-TDFTX32B.js.map +1 -0
  79. package/dist/chunk-VBLLDY4R.js +38 -0
  80. package/dist/chunk-VBLLDY4R.js.map +1 -0
  81. package/dist/{chunk-CGEV3ARR.js → chunk-VJNQJALF.js} +4 -4
  82. package/dist/chunk-VJNQJALF.js.map +1 -0
  83. package/dist/chunk-WAYSJMPS.js +26 -0
  84. package/dist/chunk-WAYSJMPS.js.map +1 -0
  85. package/dist/chunk-WC72BRHR.js +241 -0
  86. package/dist/chunk-WC72BRHR.js.map +1 -0
  87. package/dist/{chunk-MXZSI3AY.js → chunk-YPFOE2QJ.js} +43 -11
  88. package/dist/chunk-YPFOE2QJ.js.map +1 -0
  89. package/dist/claude-adapter-6P4SJH7P.js +7 -0
  90. package/dist/{claude-adapter-QMLFMSP3.js.map → claude-adapter-6P4SJH7P.js.map} +1 -1
  91. package/dist/{claude-login-5WELXPKT.js → claude-login-IS5WTBMP.js} +10 -10
  92. package/dist/claude-login-IS5WTBMP.js.map +1 -0
  93. package/dist/cli.js +371 -172
  94. package/dist/cli.js.map +1 -1
  95. package/dist/{codex-login-DDJBCT43.js → codex-login-GMPF64MR.js} +18 -17
  96. package/dist/codex-login-GMPF64MR.js.map +1 -0
  97. package/dist/config-store-POB6I37G.js +7 -0
  98. package/dist/{config-store-W6FBCQAQ.js.map → config-store-POB6I37G.js.map} +1 -1
  99. package/dist/conversation-store-PRBHWQMJ.js +4 -0
  100. package/dist/conversation-store-PRBHWQMJ.js.map +1 -0
  101. package/dist/detect-providers-C4SVQHFF.js +4 -0
  102. package/dist/detect-providers-C4SVQHFF.js.map +1 -0
  103. package/dist/executor-RUX7VK3T.js +4 -0
  104. package/dist/{executor-6RIKIGXK.js.map → executor-RUX7VK3T.js.map} +1 -1
  105. package/dist/first-run-GDEVRFPO.js +230 -0
  106. package/dist/first-run-GDEVRFPO.js.map +1 -0
  107. package/dist/gemini-adapter-MV3U4QFH.js +7 -0
  108. package/dist/{gemini-adapter-6JIHZ7WI.js.map → gemini-adapter-MV3U4QFH.js.map} +1 -1
  109. package/dist/{gemini-login-YEPK6GGW.js → gemini-login-KE224MSW.js} +13 -14
  110. package/dist/gemini-login-KE224MSW.js.map +1 -0
  111. package/dist/index.d.ts +47 -17
  112. package/dist/index.js +86 -471
  113. package/dist/index.js.map +1 -1
  114. package/dist/input-history-MIOO3FIW.js +57 -0
  115. package/dist/input-history-MIOO3FIW.js.map +1 -0
  116. package/dist/kimi-adapter-UODMNX6K.js +6 -0
  117. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-UODMNX6K.js.map} +1 -1
  118. package/dist/{kimi-login-ZR74MIY4.js → kimi-login-DNT5YBKX.js} +18 -17
  119. package/dist/kimi-login-DNT5YBKX.js.map +1 -0
  120. package/dist/logger-PLPDWACQ.js +3 -0
  121. package/dist/logger-PLPDWACQ.js.map +1 -0
  122. package/dist/model-discovery-O64ZWPX5.js +6 -0
  123. package/dist/model-discovery-O64ZWPX5.js.map +1 -0
  124. package/dist/native-cli-adapters-JMZX2C2C.js +8 -0
  125. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-JMZX2C2C.js.map} +1 -1
  126. package/dist/ollama-adapter-GE67BNSS.js +5 -0
  127. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-GE67BNSS.js.map} +1 -1
  128. package/dist/openai-adapter-SHPLK77L.js +7 -0
  129. package/dist/{openai-adapter-XU46EN7B.js.map → openai-adapter-SHPLK77L.js.map} +1 -1
  130. package/dist/pathResolver-A6IXQQFE.js +3 -0
  131. package/dist/pathResolver-A6IXQQFE.js.map +1 -0
  132. package/dist/profile-loader-TNAXBLDX.js +162 -0
  133. package/dist/profile-loader-TNAXBLDX.js.map +1 -0
  134. package/dist/registry-3NHVCXCZ.js +6 -0
  135. package/dist/{registry-H7B3AHPQ.js.map → registry-3NHVCXCZ.js.map} +1 -1
  136. package/dist/registry-7CQ3NCAD.js +5 -0
  137. package/dist/{registry-OYWYT7WL.js.map → registry-7CQ3NCAD.js.map} +1 -1
  138. package/dist/server-manager-DES23IBQ.js +5 -0
  139. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-DES23IBQ.js.map} +1 -1
  140. package/dist/session-manager-EHD7GWM2.js +12 -0
  141. package/dist/{session-manager-NYB2RKMS.js.map → session-manager-EHD7GWM2.js.map} +1 -1
  142. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  143. package/dist/skills/built-in/commit/SKILL.md +83 -0
  144. package/dist/skills/built-in/debug/SKILL.md +119 -0
  145. package/dist/skills/built-in/plan/SKILL.md +123 -0
  146. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  147. package/dist/skills/built-in/test/SKILL.md +128 -0
  148. package/dist/sqlite-store-7ZIVOUNI.js +5 -0
  149. package/dist/sqlite-store-7ZIVOUNI.js.map +1 -0
  150. package/dist/team-manager-6DCNLGTC.js +11 -0
  151. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-6DCNLGTC.js.map} +1 -1
  152. package/dist/team-state-R2D7DT5M.js +3 -0
  153. package/dist/team-state-R2D7DT5M.js.map +1 -0
  154. package/dist/tmux-manager-WBKHUHDT.js +6 -0
  155. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-WBKHUHDT.js.map} +1 -1
  156. package/dist/tools-I6XCTEZY.js +6 -0
  157. package/dist/{tools-TSMXMHIF.js.map → tools-I6XCTEZY.js.map} +1 -1
  158. package/package.json +93 -89
  159. package/dist/App-TE3JJKOW.js +0 -2789
  160. package/dist/App-TE3JJKOW.js.map +0 -1
  161. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  162. package/dist/chunk-4IJD72YB.js.map +0 -1
  163. package/dist/chunk-6PDJ45T4.js.map +0 -1
  164. package/dist/chunk-ASGRGXYK.js.map +0 -1
  165. package/dist/chunk-CARHU3DO.js.map +0 -1
  166. package/dist/chunk-CGEV3ARR.js.map +0 -1
  167. package/dist/chunk-CS5X3BWX.js +0 -27
  168. package/dist/chunk-CS5X3BWX.js.map +0 -1
  169. package/dist/chunk-CYQNBB25.js.map +0 -1
  170. package/dist/chunk-DAHGLHNR.js.map +0 -1
  171. package/dist/chunk-H66O5Z2V.js.map +0 -1
  172. package/dist/chunk-HCIHOHLX.js.map +0 -1
  173. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  174. package/dist/chunk-I5PZ4JTS.js.map +0 -1
  175. package/dist/chunk-IYW62KKR.js.map +0 -1
  176. package/dist/chunk-JAXXTYID.js.map +0 -1
  177. package/dist/chunk-LSOYPSAT.js.map +0 -1
  178. package/dist/chunk-MFBHNWGV.js.map +0 -1
  179. package/dist/chunk-MXZSI3AY.js.map +0 -1
  180. package/dist/chunk-NBR3GHMT.js.map +0 -1
  181. package/dist/chunk-TEVZS4FA.js.map +0 -1
  182. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  183. package/dist/chunk-VUG4IZ7J.js.map +0 -1
  184. package/dist/chunk-WAHVZH7V.js +0 -260
  185. package/dist/chunk-WAHVZH7V.js.map +0 -1
  186. package/dist/chunk-WPP3PEDE.js.map +0 -1
  187. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  188. package/dist/chunk-YL5XFHR3.js.map +0 -1
  189. package/dist/chunk-ZGOHARPV.js.map +0 -1
  190. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  191. package/dist/claude-login-5WELXPKT.js.map +0 -1
  192. package/dist/codex-login-DDJBCT43.js.map +0 -1
  193. package/dist/config-store-W6FBCQAQ.js +0 -6
  194. package/dist/executor-6RIKIGXK.js +0 -4
  195. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  196. package/dist/gemini-login-YEPK6GGW.js.map +0 -1
  197. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  198. package/dist/kimi-login-ZR74MIY4.js.map +0 -1
  199. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  200. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  201. package/dist/openai-adapter-XU46EN7B.js +0 -6
  202. package/dist/registry-H7B3AHPQ.js +0 -5
  203. package/dist/registry-OYWYT7WL.js +0 -6
  204. package/dist/server-manager-PTGBHCLS.js +0 -5
  205. package/dist/session-manager-NYB2RKMS.js +0 -12
  206. package/dist/team-manager-HC4XGCFY.js +0 -11
  207. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  208. package/dist/tools-TSMXMHIF.js +0 -6
@@ -1,142 +1,7 @@
1
- import { getEventBus } from './chunk-YL5XFHR3.js';
2
- import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-CGEV3ARR.js';
3
- import { isCommandBlocked } from './chunk-CS5X3BWX.js';
4
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
5
- import { ModelNotFoundError } from './chunk-ZGOHARPV.js';
6
- import { logger } from './chunk-JAXXTYID.js';
7
-
8
- // src/core/model-router.ts
9
- var ModelRouter = class {
10
- config;
11
- userOverride;
12
- constructor(config) {
13
- this.config = config;
14
- }
15
- /**
16
- * Set a temporary user override that takes highest priority.
17
- */
18
- setUserOverride(modelId) {
19
- if (modelId !== void 0) {
20
- this.validateModel(modelId);
21
- }
22
- this.userOverride = modelId;
23
- }
24
- /**
25
- * Resolve the best model for a given role through the priority pipeline.
26
- */
27
- resolve(role) {
28
- if (this.userOverride) {
29
- const info = this.getModelInfo(this.userOverride);
30
- return {
31
- modelId: this.userOverride,
32
- provider: info.provider,
33
- source: "user_override",
34
- role
35
- };
36
- }
37
- if (role) {
38
- const roleConfig = this.config.roles[role];
39
- if (roleConfig) {
40
- if (this.isModelAvailable(roleConfig.primary)) {
41
- const info = this.getModelInfo(roleConfig.primary);
42
- return {
43
- modelId: roleConfig.primary,
44
- provider: info.provider,
45
- source: "role_config",
46
- role
47
- };
48
- }
49
- for (const fallbackModel of roleConfig.fallback) {
50
- if (this.isModelAvailable(fallbackModel)) {
51
- const info = this.getModelInfo(fallbackModel);
52
- logger.info(
53
- { role, primary: roleConfig.primary, fallback: fallbackModel },
54
- "Using fallback model for role"
55
- );
56
- return {
57
- modelId: fallbackModel,
58
- provider: info.provider,
59
- source: "fallback_chain",
60
- role
61
- };
62
- }
63
- }
64
- }
65
- }
66
- const defaultModel = this.config.defaultModel;
67
- if (this.isModelAvailable(defaultModel)) {
68
- const info = this.getModelInfo(defaultModel);
69
- return {
70
- modelId: defaultModel,
71
- provider: info.provider,
72
- source: "system_default",
73
- role
74
- };
75
- }
76
- const anyAvailable = this.getAvailableModels()[0];
77
- if (anyAvailable) {
78
- return {
79
- modelId: anyAvailable.id,
80
- provider: anyAvailable.provider,
81
- source: "system_default",
82
- role
83
- };
84
- }
85
- throw new ModelNotFoundError(defaultModel);
86
- }
87
- /**
88
- * Check if a model is available (provider is enabled and model is known).
89
- */
90
- isModelAvailable(modelId) {
91
- const info = SUPPORTED_MODELS[modelId];
92
- if (!info) {
93
- return false;
94
- }
95
- return this.config.enabledProviders.includes(info.provider);
96
- }
97
- /**
98
- * Get model info by ID. Throws if not found.
99
- */
100
- getModelInfo(modelId) {
101
- const info = SUPPORTED_MODELS[modelId];
102
- if (!info) {
103
- throw new ModelNotFoundError(modelId);
104
- }
105
- return info;
106
- }
107
- /**
108
- * Get all available models (from enabled providers).
109
- */
110
- getAvailableModels() {
111
- return Object.values(SUPPORTED_MODELS).filter(
112
- (model) => this.config.enabledProviders.includes(model.provider)
113
- );
114
- }
115
- /**
116
- * List models recommended for a specific role.
117
- */
118
- getModelsForRole(role) {
119
- return this.getAvailableModels().filter(
120
- (model) => model.supportedRoles.includes(role)
121
- );
122
- }
123
- /**
124
- * Validate that a model ID exists. Throws ModelNotFoundError if not.
125
- */
126
- validateModel(modelId) {
127
- if (!SUPPORTED_MODELS[modelId]) {
128
- throw new ModelNotFoundError(modelId);
129
- }
130
- }
131
- };
132
- function createModelRouter(config) {
133
- const enabledProviders = Object.entries(config.providers).filter(([, providerConfig]) => providerConfig?.enabled).map(([name]) => name);
134
- return new ModelRouter({
135
- defaultModel: config.defaultModel,
136
- roles: config.roles,
137
- enabledProviders
138
- });
139
- }
1
+ import { getEventBus } from './chunk-ROJPFPJ7.js';
2
+ import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-VJNQJALF.js';
3
+ import { isCommandBlocked } from './chunk-VBLLDY4R.js';
4
+ import { logger } from './chunk-HEKFAKVH.js';
140
5
 
141
6
  // src/core/context-manager.ts
142
7
  var CONTEXT_BUDGET_RATIO = 0.85;
@@ -652,6 +517,6 @@ var TaskOrchestrator = class {
652
517
  }
653
518
  };
654
519
 
655
- export { ContextManager, CostTracker, ModelRouter, PermissionManager, TaskOrchestrator, createModelRouter };
656
- //# sourceMappingURL=chunk-DAHGLHNR.js.map
657
- //# sourceMappingURL=chunk-DAHGLHNR.js.map
520
+ export { ContextManager, CostTracker, PermissionManager, TaskOrchestrator };
521
+ //# sourceMappingURL=chunk-ONQ4WCUI.js.map
522
+ //# sourceMappingURL=chunk-ONQ4WCUI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/context-manager.ts","../src/core/cost-tracker.ts","../src/core/permission-manager.ts","../src/core/task-orchestrator.ts"],"names":[],"mappings":";;;;;;AAYA,IAAM,oBAAA,GAAuB,IAAA;AAC7B,IAAM,qBAAA,GAAwB,GAAA;AAQvB,IAAM,iBAAN,MAAqB;AAAA,EACT,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,uBAAkB,GAAA,EAA+B;AAAA,EAC1D,iBAAA,GAAoB,CAAA;AAAA,EAE5B,YAAY,SAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,YAAY,SAAA,CAAU,aAAA;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAY,oBAAoB,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,YAAA,GAAe,IAAA,CAAK,oBAAoB,qBAAqB,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA8E;AAC5E,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,iBAAA;AAAA,MACX,QAAQ,IAAA,CAAK,YAAA;AAAA,MACb,KAAK,IAAA,CAAK,SAAA;AAAA,MACV,YAAY,IAAA,CAAK,KAAA,CAAO,KAAK,iBAAA,GAAoB,IAAA,CAAK,eAAgB,GAAG;AAAA,KAC3E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,CAAa,UAAmC,YAAA,EAAuC;AACrF,IAAA,MAAM,YAAA,GAAe,YAAA,GAAe,kBAAA,CAAmB,YAAY,CAAA,GAAI,CAAA;AACvE,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,GAAe,YAAA,GAAe,qBAAA;AAE3D,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,KAAK,4CAA4C,CAAA;AACxD,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAA;AAEhD,MAAA,IAAI,UAAA,GAAa,YAAY,eAAA,EAAiB;AAC5C,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,QAAQ,GAAG,CAAA;AAClB,MAAA,UAAA,IAAc,SAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,oBAAoB,UAAA,GAAa,YAAA;AAEtC,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ;AACnC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL;AAAA,UACE,UAAU,QAAA,CAAS,MAAA;AAAA,UACnB,SAAS,MAAA,CAAO,MAAA;AAAA,UAChB,eAAA,EAAiB,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO;AAAA,SAC5C;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,UAAkB,OAAA,EAAuB;AACtD,IAAA,MAAM,UAAA,GAAa,mBAAmB,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,QAAA,EAAU;AAAA,MAC7B,QAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA,EAAgB,KAAK,GAAA;AAAI,KAC1B,CAAA;AACD,IAAA,IAAA,CAAK,iBAAA,IAAqB,UAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAA,EAAwB;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,cAAA,GAAiB,KAAK,GAAA,EAAI;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAAwB;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,qBAAqB,KAAA,CAAM,UAAA;AAChC,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,YAAA,EAAgC;AACvC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,SAAS,CAAC,GAAG,KAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,MAC7C,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,GAAiB,CAAA,CAAE;AAAA,KACzC;AAEA,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,MAAA,EAAQ;AACtC,MAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAC/B,MAAA,WAAA,IAAe,KAAA,CAAM,UAAA;AACrB,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,SAAS,WAAA,EAAY;AAAA,QACvB;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAgD;AAC9C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,EAC3B;AACF;;;ACrJO,IAAM,cAAN,MAAkB;AAAA,EACN,UAAwB,EAAC;AAAA,EACzB,YAAA;AAAA,EACT,cAAA,GAAiB,KAAA;AAAA,EAEzB,YAAY,YAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CACE,QAAA,EACA,KAAA,EACA,WAAA,EACA,cACA,IAAA,EACa;AACb,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,KAAA,EAAO,WAAA,EAAa,YAAY,CAAA;AAE/D,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,QAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,EAAgB;AACnC,IAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,IAAA,QAAA,CAAS,KAAK,cAAA,EAAgB;AAAA,MAC5B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAGD,IAAA,IAAI,SAAS,IAAA,CAAK,YAAA,CAAa,aAAA,IAAiB,CAAC,KAAK,cAAA,EAAgB;AACpE,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,QAAA,CAAS,KAAK,cAAA,EAAgB;AAAA,QAC5B,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,YAAA,CAAa;AAAA,OAC1B,CAAA;AACD,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,EAAE,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA,EAAG,SAAS,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,EAAE;AAAA,QACnF;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB;AAC7C,MAAA,QAAA,CAAS,KAAK,eAAA,EAAiB;AAAA,QAC7B,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,YAAA,CAAa;AAAA,OAC1B,CAAA;AACD,MAAA,MAAA,CAAO,KAAA;AAAA,QACL,EAAE,OAAA,EAAS,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,cAAc,CAAA,EAAE;AAAA,QAClF;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAqE;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AAC1E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,YAAA,EAAc,CAAC,CAAA;AAC5E,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA+B;AAC7B,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,MAAA,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,GAAA,CAAK,UAAA,CAAW,MAAM,QAAQ,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,OAAA;AAC7E,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,OAAA;AACjE,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAA,CAAK,MAAA,CAAO,MAAM,IAAI,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,OAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,UAAA,EAAY,OAAA,EAAS,MAAA,EAAO;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,eAAA,EAAgB,IAAK,IAAA,CAAK,YAAA,CAAa,cAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,EAAgB;AACnC,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,EAAiB;AACrC,IAAA,OAAO,CAAA,EAAG,WAAW,KAAK,CAAC,KAAK,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA,QAAA,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,CAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,EACxB;AACF;;;ACtJA,IAAM,kBAAA,GAAqB;AAAA,EACzB,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AAgBO,IAAM,oBAAN,MAAwB;AAAA,EACrB,IAAA;AAAA,EACS,YAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA,uBAAyB,GAAA,EAAY;AAAA,EAEtD,WAAA,CACE,IAAA,EACA,YAAA,EACA,eAAA,EACA;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,EAAgD;AAEpD,IAAA,IAAI,QAAQ,OAAA,IAAW,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC/D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,6BAAA,EAAgC,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAA;AAAA,QACvD,oBAAA,EAAsB;AAAA,OACxB;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,OAAA,IAAW,gBAAA,CAAiB,QAAQ,OAAA,EAAS,IAAA,CAAK,eAAe,CAAA,EAAG;AAC9E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAA,8BAAA,CAAA;AAAA,QACR,oBAAA,EAAsB;AAAA,OACxB;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA,EAAG;AACtC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAM;AAAA,IACtD;AAGA,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,YAAA;AACH,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAM;AAAA,MAEtD,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,MAEvC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA;AACvC,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAmC;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,KAAK,CAAA;AACjC,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,KAAA,IAAS,4BAA4B,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAA4B;AAClC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAK,EAAG,yBAAyB,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEQ,kBAAkB,OAAA,EAAgD;AAExE,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAM;AAAA,IACtD;AAGA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,mCAAA,CAAA;AAAA,MAC5B,oBAAA,EAAsB;AAAA,KACxB;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAA,EAAgD;AAEtE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,iCAAA,CAAA;AAAA,MAC5B,oBAAA,EAAsB;AAAA,KACxB;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAA,EAAsC;AAC5D,IAAA,MAAM,YAAY,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,cAAc,WAAW,CAAA;AACpE,IAAA,OAAO,SAAA,CAAU,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAC5C;AAAA,EAEQ,mBAAmB,OAAA,EAA0B;AACnD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,EAAY,CAAE,IAAA,EAAK;AACzC,IAAA,OAAO,mBAAmB,IAAA,CAAK,CAAC,cAAc,KAAA,CAAM,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,EACzE;AAAA,EAEQ,gBAAgB,OAAA,EAAqC;AAC3D,IAAA,OAAO,CAAA,EAAG,QAAQ,QAAQ,CAAA,CAAA,EAAI,QAAQ,SAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,CAAA;AAAA,EAC3E;AACF;;;ACnJA,IAAI,UAAA,GAAa,CAAA;AAEjB,SAAS,cAAA,GAAyB;AAChC,EAAA,OAAO,OAAO,UAAA,EAAY,CAAA;AAC5B;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACX,KAAA,uBAAY,GAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,UAAA,CACE,OAAA,EACA,WAAA,EACA,OAAA,EAMO;AACP,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,IAAA,GAAc;AAAA,MAClB,EAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,QAAQ,EAAC;AAAA,MACT,SAAA,EAAW,SAAS,SAAA,GAAY,CAAC,GAAG,OAAA,CAAQ,SAAS,IAAI,EAAC;AAAA,MAC1D,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AAGvB,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,KAAA,MAAW,SAAA,IAAa,QAAQ,SAAA,EAAW;AACzC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACxC,QAAA,IAAI,WAAW,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3C,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,WAAA,GAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,EAAA,EAAI,SAAS,CAAA;AAC1D,IAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,EAAA,EAAI,OAAA,IAAW,cAAc,CAAA;AAEnD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,QAAgB,MAAA,EAA0B;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAE1B,IAAA,WAAA,GAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAErD,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,WAAA,EAAY,CAAE,IAAA,CAAK,gBAAA,EAAkB,EAAE,QAAQ,CAAA;AAC/C,MAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAAA,IACjC;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,IAAU,qBAAqB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,MAAA,EAAgB,KAAA,EAAe,KAAA,EAAsB;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAI,KAAA,EAAO;AACT,MAAC,KAA4B,KAAA,GAAQ,KAAA;AAAA,IACvC;AACA,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,IAAS,eAAe,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAA,EAAuB;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAA,EAAsC;AACrD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAiC;AAC/C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAsC;AACpC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MAC9B,CAAC,CAAA,KACC,CAAA,CAAE,MAAA,KAAW,SAAA,IACb,CAAC,CAAA,CAAE,KAAA,IACH,CAAA,CAAE,SAAA,CAAU,KAAA,CAAM,CAAC,SAAA,KAAc;AAC/B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACxC,QAAA,OAAO,SAAS,MAAA,KAAW,WAAA;AAAA,MAC7B,CAAC;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA0G;AACxG,IAAA,MAAM,QAAQ,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACrC,IAAA,OAAO;AAAA,MACL,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,SAAA,EAAW,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,MACzD,UAAA,EAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AAAA,MAC5D,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAAA,MACrD,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,CAAE;AAAA,KACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAsB;AAC/B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAClC,IAAA,IAAI,IAAA,EAAM;AAER,MAAA,KAAA,MAAW,GAAG,SAAS,CAAA,IAAK,KAAK,KAAA,EAAO;AACtC,QAAA,SAAA,CAAU,YAAY,SAAA,CAAU,SAAA,CAAU,OAAO,CAAC,EAAA,KAAO,OAAO,MAAM,CAAA;AACtE,QAAA,SAAA,CAAU,SAAS,SAAA,CAAU,MAAA,CAAO,OAAO,CAAC,EAAA,KAAO,OAAO,MAAM,CAAA;AAAA,MAClE;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,eAAA,EAA+B;AACzD,IAAA,KAAA,MAAW,GAAG,IAAI,CAAA,IAAK,KAAK,KAAA,EAAO;AACjC,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,WAAW,SAAA,EAAW;AAC1D,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACtD,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAChC,UAAA,OAAO,KAAK,MAAA,KAAW,WAAA;AAAA,QACzB,CAAC,CAAA;AAED,QAAA,IAAI,eAAA,IAAmB,IAAA,CAAK,MAAA,KAAW,SAAA,EAAW;AAChD,UAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,UAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,EAAE,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,aAAa,eAAA,EAAgB;AAAA,YAChD;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF","file":"chunk-ONQ4WCUI.js","sourcesContent":["/**\r\n * Context window management per PRD section 7.4\r\n * - Token budgeting: 85% conversation, 15% buffer\r\n * - Smart truncation: prioritize recent + system prompt\r\n * - Compression: summarize old messages when approaching limits\r\n * - File context tracking with LRU eviction\r\n */\r\n\r\nimport type { IChatMessage, IModelInfo } from \"../types/index.js\";\r\nimport { estimateTokenCount } from \"../utils/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\n\r\nconst CONTEXT_BUDGET_RATIO = 0.85;\r\nconst SYSTEM_PROMPT_RESERVE = 4_000;\r\n\r\ninterface IFileContextEntry {\r\n readonly filePath: string;\r\n readonly tokenCount: number;\r\n lastAccessedAt: number;\r\n}\r\n\r\nexport class ContextManager {\r\n private readonly maxTokens: number;\r\n private readonly budgetTokens: number;\r\n private readonly fileContext = new Map<string, IFileContextEntry>();\r\n private currentTokenCount = 0;\r\n\r\n constructor(modelInfo: IModelInfo) {\r\n this.maxTokens = modelInfo.contextWindow;\r\n this.budgetTokens = Math.floor(this.maxTokens * CONTEXT_BUDGET_RATIO);\r\n }\r\n\r\n /**\r\n * Get the available token budget for new content.\r\n */\r\n getAvailableBudget(): number {\r\n return Math.max(0, this.budgetTokens - this.currentTokenCount - SYSTEM_PROMPT_RESERVE);\r\n }\r\n\r\n /**\r\n * Get total context usage.\r\n */\r\n getUsage(): { used: number; budget: number; max: number; percentage: number } {\r\n return {\r\n used: this.currentTokenCount,\r\n budget: this.budgetTokens,\r\n max: this.maxTokens,\r\n percentage: Math.round((this.currentTokenCount / this.budgetTokens) * 100),\r\n };\r\n }\r\n\r\n /**\r\n * Trim messages to fit within the context window.\r\n * Preserves system prompt and most recent messages.\r\n */\r\n trimMessages(messages: readonly IChatMessage[], systemPrompt?: string): IChatMessage[] {\r\n const systemTokens = systemPrompt ? estimateTokenCount(systemPrompt) : 0;\r\n const availableTokens = this.budgetTokens - systemTokens - SYSTEM_PROMPT_RESERVE;\r\n\r\n if (availableTokens <= 0) {\r\n logger.warn(\"System prompt alone exceeds context budget\");\r\n return [];\r\n }\r\n\r\n // Work backwards from most recent, accumulating tokens\r\n const result: IChatMessage[] = [];\r\n let usedTokens = 0;\r\n\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const msg = messages[i];\r\n if (!msg) {\r\n continue;\r\n }\r\n const msgTokens = estimateTokenCount(msg.content);\r\n\r\n if (usedTokens + msgTokens > availableTokens) {\r\n break;\r\n }\r\n\r\n result.unshift(msg);\r\n usedTokens += msgTokens;\r\n }\r\n\r\n this.currentTokenCount = usedTokens + systemTokens;\r\n\r\n if (result.length < messages.length) {\r\n logger.info(\r\n {\r\n original: messages.length,\r\n trimmed: result.length,\r\n droppedMessages: messages.length - result.length,\r\n },\r\n \"Trimmed conversation to fit context window\",\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Track a file being added to context.\r\n */\r\n addFileContext(filePath: string, content: string): void {\r\n const tokenCount = estimateTokenCount(content);\r\n this.fileContext.set(filePath, {\r\n filePath,\r\n tokenCount,\r\n lastAccessedAt: Date.now(),\r\n });\r\n this.currentTokenCount += tokenCount;\r\n }\r\n\r\n /**\r\n * Touch a file (update last accessed time).\r\n */\r\n touchFile(filePath: string): void {\r\n const entry = this.fileContext.get(filePath);\r\n if (entry) {\r\n entry.lastAccessedAt = Date.now();\r\n }\r\n }\r\n\r\n /**\r\n * Remove a file from context.\r\n */\r\n removeFileContext(filePath: string): void {\r\n const entry = this.fileContext.get(filePath);\r\n if (entry) {\r\n this.currentTokenCount -= entry.tokenCount;\r\n this.fileContext.delete(filePath);\r\n }\r\n }\r\n\r\n /**\r\n * Evict least-recently-used files to free space.\r\n */\r\n evictLRU(tokensNeeded: number): string[] {\r\n const evicted: string[] = [];\r\n const sorted = [...this.fileContext.entries()].sort(\r\n ([, a], [, b]) => a.lastAccessedAt - b.lastAccessedAt,\r\n );\r\n\r\n let freedTokens = 0;\r\n for (const [filePath, entry] of sorted) {\r\n if (freedTokens >= tokensNeeded) {\r\n break;\r\n }\r\n this.removeFileContext(filePath);\r\n freedTokens += entry.tokenCount;\r\n evicted.push(filePath);\r\n }\r\n\r\n if (evicted.length > 0) {\r\n logger.info(\r\n { evicted, freedTokens },\r\n \"Evicted files from context to free space\",\r\n );\r\n }\r\n\r\n return evicted;\r\n }\r\n\r\n /**\r\n * Get all tracked files.\r\n */\r\n getTrackedFiles(): readonly IFileContextEntry[] {\r\n return [...this.fileContext.values()];\r\n }\r\n\r\n /**\r\n * Reset context tracking (for model switch).\r\n */\r\n reset(): void {\r\n this.fileContext.clear();\r\n this.currentTokenCount = 0;\r\n }\r\n}\r\n","/**\r\n * Real-time cost tracking per PRD section 7.5\r\n * - Per-request cost calculation\r\n * - Session total\r\n * - Breakdown by provider, model, and role\r\n * - Configurable budget alerts\r\n */\r\n\r\nimport type { ProviderName, ModelRole, ITokenUsage, ICostConfig } from \"../types/index.js\";\r\nimport { createTokenUsage, formatCost } from \"../utils/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { getEventBus } from \"./event-bus.js\";\r\n\r\ninterface ICostEntry {\r\n readonly provider: ProviderName;\r\n readonly model: string;\r\n readonly role?: ModelRole | undefined;\r\n readonly usage: ITokenUsage;\r\n readonly timestamp: Date;\r\n}\r\n\r\ninterface ICostBreakdown {\r\n readonly byProvider: Record<string, number>;\r\n readonly byModel: Record<string, number>;\r\n readonly byRole: Record<string, number>;\r\n}\r\n\r\nexport class CostTracker {\r\n private readonly entries: ICostEntry[] = [];\r\n private readonly budgetConfig: ICostConfig;\r\n private warningEmitted = false;\r\n\r\n constructor(budgetConfig: ICostConfig) {\r\n this.budgetConfig = budgetConfig;\r\n }\r\n\r\n /**\r\n * Record a cost entry from a model response.\r\n */\r\n record(\r\n provider: ProviderName,\r\n model: string,\r\n inputTokens: number,\r\n outputTokens: number,\r\n role?: ModelRole,\r\n ): ITokenUsage {\r\n const usage = createTokenUsage(model, inputTokens, outputTokens);\r\n\r\n const entry: ICostEntry = {\r\n provider,\r\n model,\r\n role,\r\n usage,\r\n timestamp: new Date(),\r\n };\r\n\r\n this.entries.push(entry);\r\n\r\n const total = this.getSessionTotal();\r\n const eventBus = getEventBus();\r\n\r\n eventBus.emit(\"cost:updated\", {\r\n total,\r\n provider,\r\n delta: usage.costUsd,\r\n });\r\n\r\n // Budget warning\r\n if (total >= this.budgetConfig.budgetWarning && !this.warningEmitted) {\r\n this.warningEmitted = true;\r\n eventBus.emit(\"cost:warning\", {\r\n current: total,\r\n limit: this.budgetConfig.budgetWarning,\r\n });\r\n logger.warn(\r\n { current: formatCost(total), warning: formatCost(this.budgetConfig.budgetWarning) },\r\n \"Budget warning threshold reached\",\r\n );\r\n }\r\n\r\n // Budget hard stop\r\n if (total >= this.budgetConfig.budgetHardStop) {\r\n eventBus.emit(\"cost:exceeded\", {\r\n current: total,\r\n limit: this.budgetConfig.budgetHardStop,\r\n });\r\n logger.error(\r\n { current: formatCost(total), limit: formatCost(this.budgetConfig.budgetHardStop) },\r\n \"Budget hard stop reached\",\r\n );\r\n }\r\n\r\n return usage;\r\n }\r\n\r\n /**\r\n * Get total session cost.\r\n */\r\n getSessionTotal(): number {\r\n return this.entries.reduce((sum, entry) => sum + entry.usage.costUsd, 0);\r\n }\r\n\r\n /**\r\n * Get total token counts.\r\n */\r\n getSessionTokens(): { input: number; output: number; total: number } {\r\n const input = this.entries.reduce((sum, e) => sum + e.usage.inputTokens, 0);\r\n const output = this.entries.reduce((sum, e) => sum + e.usage.outputTokens, 0);\r\n return { input, output, total: input + output };\r\n }\r\n\r\n /**\r\n * Get cost breakdown by provider, model, and role.\r\n */\r\n getBreakdown(): ICostBreakdown {\r\n const byProvider: Record<string, number> = {};\r\n const byModel: Record<string, number> = {};\r\n const byRole: Record<string, number> = {};\r\n\r\n for (const entry of this.entries) {\r\n byProvider[entry.provider] = (byProvider[entry.provider] ?? 0) + entry.usage.costUsd;\r\n byModel[entry.model] = (byModel[entry.model] ?? 0) + entry.usage.costUsd;\r\n if (entry.role) {\r\n byRole[entry.role] = (byRole[entry.role] ?? 0) + entry.usage.costUsd;\r\n }\r\n }\r\n\r\n return { byProvider, byModel, byRole };\r\n }\r\n\r\n /**\r\n * Check if budget hard stop has been exceeded.\r\n */\r\n isBudgetExceeded(): boolean {\r\n return this.getSessionTotal() >= this.budgetConfig.budgetHardStop;\r\n }\r\n\r\n /**\r\n * Get formatted session summary.\r\n */\r\n getSummary(): string {\r\n const total = this.getSessionTotal();\r\n const tokens = this.getSessionTokens();\r\n return `${formatCost(total)} (${tokens.total.toLocaleString()} tokens)`;\r\n }\r\n\r\n /**\r\n * Get all cost entries (for export).\r\n */\r\n getEntries(): readonly ICostEntry[] {\r\n return this.entries;\r\n }\r\n\r\n /**\r\n * Reset cost tracking for a new session.\r\n */\r\n reset(): void {\r\n this.entries.length = 0;\r\n this.warningEmitted = false;\r\n }\r\n}\r\n","/**\r\n * Tool permission management per PRD section 14.4\r\n * Permission modes: strict, standard, permissive\r\n */\r\n\r\nimport type { PermissionMode, ToolCategory } from \"../types/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { isCommandBlocked } from \"../utils/index.js\";\r\n\r\n// Commands that ALWAYS require confirmation regardless of mode\r\nconst DANGEROUS_COMMANDS = [\r\n \"rm -rf\",\r\n \"git push --force\",\r\n \"git reset --hard\",\r\n \"git checkout .\",\r\n \"git clean -f\",\r\n \"git branch -D\",\r\n \"drop table\",\r\n \"drop database\",\r\n \"truncate\",\r\n \"format c:\",\r\n \"del /f /s /q\",\r\n] as const;\r\n\r\nexport interface IPermissionRequest {\r\n readonly toolName: string;\r\n readonly category: ToolCategory;\r\n readonly operation: string;\r\n readonly resource?: string;\r\n readonly command?: string;\r\n}\r\n\r\nexport interface IPermissionResult {\r\n readonly allowed: boolean;\r\n readonly reason?: string;\r\n readonly requiresUserApproval: boolean;\r\n}\r\n\r\nexport class PermissionManager {\r\n private mode: PermissionMode;\r\n private readonly allowedPaths: readonly string[];\r\n private readonly blockedCommands: readonly string[];\r\n private readonly approvedOperations = new Set<string>();\r\n\r\n constructor(\r\n mode: PermissionMode,\r\n allowedPaths: readonly string[],\r\n blockedCommands: readonly string[],\r\n ) {\r\n this.mode = mode;\r\n this.allowedPaths = allowedPaths;\r\n this.blockedCommands = blockedCommands;\r\n }\r\n\r\n /**\r\n * Check if an operation is permitted.\r\n */\r\n check(request: IPermissionRequest): IPermissionResult {\r\n // Always-blocked operations\r\n if (request.command && this.isDangerousCommand(request.command)) {\r\n return {\r\n allowed: false,\r\n reason: `Dangerous command detected: \"${request.command}\"`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n // Check against blocked commands list\r\n if (request.command && isCommandBlocked(request.command, this.blockedCommands)) {\r\n return {\r\n allowed: false,\r\n reason: `Command is on the blocked list`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n // Previously approved operations\r\n const opKey = this.getOperationKey(request);\r\n if (this.approvedOperations.has(opKey)) {\r\n return { allowed: true, requiresUserApproval: false };\r\n }\r\n\r\n // Mode-based permissions\r\n switch (this.mode) {\r\n case \"permissive\":\r\n return { allowed: true, requiresUserApproval: false };\r\n\r\n case \"standard\":\r\n return this.checkStandardMode(request);\r\n\r\n case \"strict\":\r\n return this.checkStrictMode(request);\r\n }\r\n }\r\n\r\n /**\r\n * Record that the user has approved an operation.\r\n */\r\n approve(request: IPermissionRequest): void {\r\n const opKey = this.getOperationKey(request);\r\n this.approvedOperations.add(opKey);\r\n logger.info({ operation: opKey }, \"Operation approved by user\");\r\n }\r\n\r\n /**\r\n * Update permission mode.\r\n */\r\n setMode(mode: PermissionMode): void {\r\n this.mode = mode;\r\n this.approvedOperations.clear();\r\n logger.info({ mode }, \"Permission mode changed\");\r\n }\r\n\r\n /**\r\n * Get current mode.\r\n */\r\n getMode(): PermissionMode {\r\n return this.mode;\r\n }\r\n\r\n private checkStandardMode(request: IPermissionRequest): IPermissionResult {\r\n // Read operations auto-approved in standard mode\r\n if (this.isReadOperation(request)) {\r\n return { allowed: true, requiresUserApproval: false };\r\n }\r\n\r\n // Write and shell operations require approval\r\n return {\r\n allowed: false,\r\n reason: `${request.operation} requires approval in standard mode`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n private checkStrictMode(request: IPermissionRequest): IPermissionResult {\r\n // Everything requires approval in strict mode\r\n return {\r\n allowed: false,\r\n reason: `${request.operation} requires approval in strict mode`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n private isReadOperation(request: IPermissionRequest): boolean {\r\n const readTools = [\"read\", \"glob\", \"grep\", \"web-search\", \"web-fetch\"];\r\n return readTools.includes(request.toolName);\r\n }\r\n\r\n private isDangerousCommand(command: string): boolean {\r\n const lower = command.toLowerCase().trim();\r\n return DANGEROUS_COMMANDS.some((dangerous) => lower.includes(dangerous));\r\n }\r\n\r\n private getOperationKey(request: IPermissionRequest): string {\r\n return `${request.toolName}:${request.operation}:${request.resource ?? \"\"}`;\r\n }\r\n}\r\n","/**\r\n * Agent team task coordination per PRD section 8\r\n * Manages task creation, assignment, dependency resolution, and completion tracking.\r\n */\r\n\r\nimport type { ITask, TaskStatus, ModelRole } from \"../types/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { getEventBus } from \"./event-bus.js\";\r\n\r\nlet nextTaskId = 1;\r\n\r\nfunction generateTaskId(): string {\r\n return String(nextTaskId++);\r\n}\r\n\r\nexport class TaskOrchestrator {\r\n private readonly tasks = new Map<string, ITask>();\r\n\r\n /**\r\n * Create a new task.\r\n */\r\n createTask(\r\n subject: string,\r\n description: string,\r\n options?: {\r\n owner?: string;\r\n model?: string;\r\n role?: ModelRole;\r\n blockedBy?: string[];\r\n },\r\n ): ITask {\r\n const id = generateTaskId();\r\n const now = new Date();\r\n\r\n const task: ITask = {\r\n id,\r\n subject,\r\n description,\r\n status: \"pending\",\r\n owner: options?.owner,\r\n model: options?.model,\r\n role: options?.role,\r\n blocks: [],\r\n blockedBy: options?.blockedBy ? [...options.blockedBy] : [],\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n\r\n this.tasks.set(id, task);\r\n\r\n // Set up reverse blocking relationships\r\n if (options?.blockedBy) {\r\n for (const blockerId of options.blockedBy) {\r\n const blocker = this.tasks.get(blockerId);\r\n if (blocker && !blocker.blocks.includes(id)) {\r\n blocker.blocks.push(id);\r\n }\r\n }\r\n }\r\n\r\n getEventBus().emit(\"task:created\", { taskId: id, subject });\r\n logger.info({ taskId: id, subject }, \"Task created\");\r\n\r\n return task;\r\n }\r\n\r\n /**\r\n * Update task status.\r\n */\r\n updateStatus(taskId: string, status: TaskStatus): void {\r\n const task = this.getTask(taskId);\r\n task.status = status;\r\n task.updatedAt = new Date();\r\n\r\n getEventBus().emit(\"task:updated\", { taskId, status });\r\n\r\n if (status === \"completed\") {\r\n getEventBus().emit(\"task:completed\", { taskId });\r\n this.resolveBlockedTasks(taskId);\r\n }\r\n\r\n logger.info({ taskId, status }, \"Task status updated\");\r\n }\r\n\r\n /**\r\n * Assign a task to an agent.\r\n */\r\n assignTask(taskId: string, owner: string, model?: string): void {\r\n const task = this.getTask(taskId);\r\n task.owner = owner;\r\n if (model) {\r\n (task as { model?: string }).model = model;\r\n }\r\n task.updatedAt = new Date();\r\n logger.info({ taskId, owner, model }, \"Task assigned\");\r\n }\r\n\r\n /**\r\n * Get a task by ID. Throws if not found.\r\n */\r\n getTask(taskId: string): ITask {\r\n const task = this.tasks.get(taskId);\r\n if (!task) {\r\n throw new Error(`Task not found: ${taskId}`);\r\n }\r\n return task;\r\n }\r\n\r\n /**\r\n * Get all tasks.\r\n */\r\n getAllTasks(): readonly ITask[] {\r\n return [...this.tasks.values()];\r\n }\r\n\r\n /**\r\n * Get tasks by status.\r\n */\r\n getTasksByStatus(status: TaskStatus): readonly ITask[] {\r\n return [...this.tasks.values()].filter((t) => t.status === status);\r\n }\r\n\r\n /**\r\n * Get tasks assigned to an agent.\r\n */\r\n getTasksByOwner(owner: string): readonly ITask[] {\r\n return [...this.tasks.values()].filter((t) => t.owner === owner);\r\n }\r\n\r\n /**\r\n * Get tasks that are ready to be worked on (pending, not blocked).\r\n */\r\n getAvailableTasks(): readonly ITask[] {\r\n return [...this.tasks.values()].filter(\r\n (t) =>\r\n t.status === \"pending\" &&\r\n !t.owner &&\r\n t.blockedBy.every((blockerId) => {\r\n const blocker = this.tasks.get(blockerId);\r\n return blocker?.status === \"completed\";\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Check if all tasks are completed.\r\n */\r\n isAllComplete(): boolean {\r\n return [...this.tasks.values()].every((t) => t.status === \"completed\");\r\n }\r\n\r\n /**\r\n * Get progress summary.\r\n */\r\n getProgress(): { total: number; completed: number; inProgress: number; pending: number; blocked: number } {\r\n const tasks = [...this.tasks.values()];\r\n return {\r\n total: tasks.length,\r\n completed: tasks.filter((t) => t.status === \"completed\").length,\r\n inProgress: tasks.filter((t) => t.status === \"in_progress\").length,\r\n pending: tasks.filter((t) => t.status === \"pending\").length,\r\n blocked: tasks.filter((t) => t.status === \"blocked\").length,\r\n };\r\n }\r\n\r\n /**\r\n * Delete a task.\r\n */\r\n deleteTask(taskId: string): void {\r\n const task = this.tasks.get(taskId);\r\n if (task) {\r\n // Remove from blockedBy references\r\n for (const [, otherTask] of this.tasks) {\r\n otherTask.blockedBy = otherTask.blockedBy.filter((id) => id !== taskId);\r\n otherTask.blocks = otherTask.blocks.filter((id) => id !== taskId);\r\n }\r\n this.tasks.delete(taskId);\r\n }\r\n }\r\n\r\n /**\r\n * When a task completes, check if any blocked tasks can now proceed.\r\n */\r\n private resolveBlockedTasks(completedTaskId: string): void {\r\n for (const [, task] of this.tasks) {\r\n if (task.status === \"blocked\" || task.status === \"pending\") {\r\n const allDepsComplete = task.blockedBy.every((depId) => {\r\n const dep = this.tasks.get(depId);\r\n return dep?.status === \"completed\";\r\n });\r\n\r\n if (allDepsComplete && task.status === \"blocked\") {\r\n task.status = \"pending\";\r\n task.updatedAt = new Date();\r\n logger.info(\r\n { taskId: task.id, unblockedBy: completedTaskId },\r\n \"Task unblocked\",\r\n );\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1,6 +1,7 @@
1
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { buildModelMessages, buildAiSdkTools, extractAiSdkToolCalls, buildTokenUsage, mapAiSdkFinishReason } from './chunk-ODBY7S4X.js';
2
+ import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-473JN6M5.js';
3
+ import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
4
+ import { logger } from './chunk-HEKFAKVH.js';
4
5
  import { generateText, streamText } from 'ai';
5
6
  import { createOpenAI } from '@ai-sdk/openai';
6
7
 
@@ -14,50 +15,6 @@ var OPENAI_MODELS = [
14
15
  "gpt-5.1-codex-mini"
15
16
  ];
16
17
  var CHARS_PER_TOKEN_ESTIMATE = 4;
17
- function convertTools(tools) {
18
- if (tools === void 0 || tools.length === 0) {
19
- return void 0;
20
- }
21
- const result = {};
22
- for (const tool of tools) {
23
- const properties = {};
24
- const required = [];
25
- for (const param of tool.parameters) {
26
- const prop = {
27
- type: param.type,
28
- description: param.description
29
- };
30
- if (param.enum !== void 0) {
31
- prop["enum"] = param.enum;
32
- }
33
- if (param.default !== void 0) {
34
- prop["default"] = param.default;
35
- }
36
- properties[param.name] = prop;
37
- if (param.required) {
38
- required.push(param.name);
39
- }
40
- }
41
- result[tool.name] = {
42
- description: tool.description,
43
- parameters: {
44
- type: "object",
45
- properties,
46
- required
47
- }
48
- };
49
- }
50
- return result;
51
- }
52
- function buildMessages(messages) {
53
- return messages.map((msg) => ({
54
- role: msg.role,
55
- content: msg.content
56
- }));
57
- }
58
- function computeCost(modelInfo, inputTokens, outputTokens) {
59
- return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
60
- }
61
18
  function classifyError(error, model) {
62
19
  const message = error instanceof Error ? error.message : String(error);
63
20
  const lower = message.toLowerCase();
@@ -77,6 +34,7 @@ function classifyError(error, model) {
77
34
  var OpenAIAdapter = class {
78
35
  name = PROVIDER_NAME;
79
36
  supportedModels = OPENAI_MODELS;
37
+ supportsToolCalling = true;
80
38
  openai;
81
39
  apiKey;
82
40
  baseUrl;
@@ -90,28 +48,21 @@ var OpenAIAdapter = class {
90
48
  }
91
49
  async chat(request) {
92
50
  const modelInfo = this.getModelInfo(request.model);
93
- const messages = buildMessages(request.messages);
94
- const tools = convertTools(request.tools);
51
+ const messages = buildModelMessages(request.messages);
52
+ const tools = buildAiSdkTools(request.tools);
95
53
  try {
96
54
  const result = await generateText({
97
55
  model: this.openai(request.model),
98
56
  messages,
99
57
  ...request.system !== void 0 ? { system: request.system } : {},
100
- tools,
101
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
58
+ ...tools !== void 0 ? { tools } : {},
59
+ maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
102
60
  ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
103
61
  });
104
- const toolCalls = extractToolCalls(result);
105
- const inputTokens = result.usage?.promptTokens ?? 0;
106
- const outputTokens = result.usage?.completionTokens ?? 0;
107
- const usage = {
108
- inputTokens,
109
- outputTokens,
110
- totalTokens: inputTokens + outputTokens,
111
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
112
- };
62
+ const toolCalls = extractAiSdkToolCalls(result.toolCalls);
63
+ const usage = buildTokenUsage(modelInfo, result.usage);
113
64
  const responseMessage = {
114
- id: result.response?.id ?? crypto.randomUUID(),
65
+ id: result.response.id,
115
66
  role: "assistant",
116
67
  content: result.text,
117
68
  model: request.model,
@@ -121,12 +72,12 @@ var OpenAIAdapter = class {
121
72
  createdAt: /* @__PURE__ */ new Date()
122
73
  };
123
74
  return {
124
- id: result.response?.id ?? crypto.randomUUID(),
75
+ id: result.response.id,
125
76
  model: request.model,
126
77
  provider: PROVIDER_NAME,
127
78
  message: responseMessage,
128
79
  usage,
129
- finishReason: mapFinishReason(result.finishReason)
80
+ finishReason: mapAiSdkFinishReason(result.finishReason)
130
81
  };
131
82
  } catch (error) {
132
83
  classifyError(error, request.model);
@@ -134,36 +85,32 @@ var OpenAIAdapter = class {
134
85
  }
135
86
  async *stream(request) {
136
87
  const modelInfo = this.getModelInfo(request.model);
137
- const messages = buildMessages(request.messages);
138
- const tools = convertTools(request.tools);
88
+ const messages = buildModelMessages(request.messages);
89
+ const tools = buildAiSdkTools(request.tools);
139
90
  try {
140
91
  const result = streamText({
141
92
  model: this.openai(request.model),
142
93
  messages,
143
94
  ...request.system !== void 0 ? { system: request.system } : {},
144
- tools,
145
- maxTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
95
+ ...tools !== void 0 ? { tools } : {},
96
+ maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
146
97
  ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
147
98
  });
148
99
  for await (const part of result.fullStream) {
149
100
  if (part.type === "text-delta") {
150
- yield { type: "text", content: part.textDelta };
101
+ yield { type: "text", content: part.text };
151
102
  } else if (part.type === "tool-call") {
152
- const toolCall = {
153
- id: part.toolCallId,
154
- name: part.toolName,
155
- arguments: part.args
156
- };
103
+ const [toolCall] = extractAiSdkToolCalls([{
104
+ toolCallId: part.toolCallId,
105
+ toolName: part.toolName,
106
+ input: part.input
107
+ }]);
108
+ if (toolCall === void 0) {
109
+ continue;
110
+ }
157
111
  yield { type: "tool_call", toolCall };
158
112
  } else if (part.type === "finish") {
159
- const inputTokens = part.usage?.promptTokens ?? 0;
160
- const outputTokens = part.usage?.completionTokens ?? 0;
161
- const usage = {
162
- inputTokens,
163
- outputTokens,
164
- totalTokens: inputTokens + outputTokens,
165
- costUsd: computeCost(modelInfo, inputTokens, outputTokens)
166
- };
113
+ const usage = buildTokenUsage(modelInfo, part.totalUsage);
167
114
  yield { type: "usage", usage };
168
115
  } else if (part.type === "error") {
169
116
  const errMsg = part.error instanceof Error ? part.error.message : String(part.error);
@@ -178,8 +125,8 @@ var OpenAIAdapter = class {
178
125
  yield { type: "done" };
179
126
  }
180
127
  }
181
- async countTokens(text, _model) {
182
- return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
128
+ countTokens(text, _model) {
129
+ return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
183
130
  }
184
131
  getModelInfo(model) {
185
132
  const info = SUPPORTED_MODELS[model];
@@ -206,29 +153,7 @@ var OpenAIAdapter = class {
206
153
  }
207
154
  }
208
155
  };
209
- function extractToolCalls(result) {
210
- if (result.toolCalls === void 0 || result.toolCalls.length === 0) {
211
- return [];
212
- }
213
- return result.toolCalls.map((tc) => ({
214
- id: tc.toolCallId,
215
- name: tc.toolName,
216
- arguments: tc.args
217
- }));
218
- }
219
- function mapFinishReason(reason) {
220
- switch (reason) {
221
- case "stop":
222
- return "stop";
223
- case "tool-calls":
224
- return "tool_calls";
225
- case "length":
226
- return "max_tokens";
227
- default:
228
- return "stop";
229
- }
230
- }
231
156
 
232
157
  export { OpenAIAdapter };
233
- //# sourceMappingURL=chunk-WPP3PEDE.js.map
234
- //# sourceMappingURL=chunk-WPP3PEDE.js.map
158
+ //# sourceMappingURL=chunk-P5TKZM3T.js.map
159
+ //# sourceMappingURL=chunk-P5TKZM3T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/openai-adapter.ts"],"names":[],"mappings":"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","file":"chunk-P5TKZM3T.js","sourcesContent":["/**\r\n * OpenAI adapter via Vercel AI SDK per PRD section 7.1\r\n * Supports GPT-5.3 Codex, GPT-5.2, GPT-5.1 Codex series\r\n */\r\n\r\nimport { generateText, streamText } from \"ai\";\r\nimport { createOpenAI } from \"@ai-sdk/openai\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n AuthenticationError,\r\n RateLimitError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatRequest,\r\n IChatResponse,\r\n IChatMessage,\r\n IStreamChunk,\r\n} from \"../types/message.js\";\r\nimport {\r\n buildAiSdkTools,\r\n buildModelMessages,\r\n buildTokenUsage,\r\n extractAiSdkToolCalls,\r\n mapAiSdkFinishReason,\r\n} from \"./ai-sdk-shared.js\";\r\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\r\n\r\nconst PROVIDER_NAME: ProviderName = \"openai\";\r\n\r\nconst OPENAI_MODELS: readonly string[] = [\r\n \"gpt-5.3-codex\",\r\n \"gpt-5.3-codex-spark\",\r\n \"gpt-5.2-codex\",\r\n \"gpt-5.1-codex-max\",\r\n \"gpt-5.2\",\r\n \"gpt-5.1-codex-mini\",\r\n] as const;\r\n\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\nfunction classifyError(error: unknown, model: string): never {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const lower = message.toLowerCase();\r\n\r\n if (lower.includes(\"401\") || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\r\n throw new AuthenticationError(PROVIDER_NAME, message);\r\n }\r\n if (lower.includes(\"429\") || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\r\n const match = /(\\d+)\\s*s/i.exec(message);\r\n const retryMs = match?.[1] !== undefined ? parseInt(match[1], 10) * 1000 : 60_000;\r\n throw new RateLimitError(PROVIDER_NAME, retryMs);\r\n }\r\n if (lower.includes(\"model\") && lower.includes(\"not found\")) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n\r\n throw error instanceof Error ? error : new Error(message);\r\n}\r\n\r\nexport class OpenAIAdapter implements IModelProvider {\r\n readonly name = PROVIDER_NAME;\r\n readonly supportedModels = OPENAI_MODELS;\r\n readonly supportsToolCalling = true;\r\n\r\n private readonly openai: ReturnType<typeof createOpenAI>;\r\n private readonly apiKey: string | undefined;\r\n private readonly baseUrl: string | undefined;\r\n\r\n constructor(options?: IProviderOptions) {\r\n this.apiKey = options?.apiKey ?? process.env[\"OPENAI_API_KEY\"];\r\n this.baseUrl = options?.baseUrl;\r\n this.openai = createOpenAI({\r\n ...(this.apiKey !== undefined ? { apiKey: this.apiKey } : {}),\r\n ...(this.baseUrl !== undefined ? { baseURL: this.baseUrl } : {}),\r\n });\r\n }\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages);\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = await generateText({\r\n model: this.openai(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n const toolCalls = extractAiSdkToolCalls(result.toolCalls);\r\n const usage = buildTokenUsage(modelInfo, result.usage);\r\n\r\n const responseMessage: IChatMessage = {\r\n id: result.response.id,\r\n role: \"assistant\",\r\n content: result.text,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: result.response.id,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n message: responseMessage,\r\n usage,\r\n finishReason: mapAiSdkFinishReason(result.finishReason),\r\n };\r\n } catch (error: unknown) {\r\n classifyError(error, request.model);\r\n }\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages);\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = streamText({\r\n model: this.openai(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n for await (const part of result.fullStream) {\r\n if (part.type === \"text-delta\") {\r\n yield { type: \"text\", content: part.text };\r\n } else if (part.type === \"tool-call\") {\r\n const [toolCall] = extractAiSdkToolCalls([{\r\n toolCallId: part.toolCallId,\r\n toolName: part.toolName,\r\n input: part.input,\r\n }]);\r\n if (toolCall === undefined) {\r\n continue;\r\n }\r\n yield { type: \"tool_call\", toolCall };\r\n } else if (part.type === \"finish\") {\r\n const usage = buildTokenUsage(modelInfo, part.totalUsage);\r\n yield { type: \"usage\", usage };\r\n } else if (part.type === \"error\") {\r\n const errMsg = part.error instanceof Error ? part.error.message : String(part.error);\r\n yield { type: \"error\", error: errMsg };\r\n }\r\n }\r\n\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.error({ error: errMsg, model: request.model }, \"OpenAI stream error\");\r\n yield { type: \"error\", error: errMsg };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n const info = SUPPORTED_MODELS[model];\r\n if (info === undefined || info.provider !== PROVIDER_NAME) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n return info;\r\n }\r\n\r\n async listAvailableModels(): Promise<readonly string[]> {\r\n if (!this.apiKey) return [...this.supportedModels];\r\n\r\n try {\r\n const base = this.baseUrl ?? \"https://api.openai.com/v1\";\r\n const response = await fetch(`${base}/models`, {\r\n headers: { Authorization: `Bearer ${this.apiKey}` },\r\n signal: AbortSignal.timeout(5000),\r\n });\r\n if (!response.ok) return [...this.supportedModels];\r\n\r\n const data = (await response.json()) as { data: Array<{ id: string }> };\r\n const chatPrefixes = [\"gpt-\", \"o1\", \"o3\", \"o4\", \"chatgpt-\"];\r\n const models = data.data\r\n .map((m) => m.id)\r\n .filter((id) => chatPrefixes.some((p) => id.startsWith(p)))\r\n .sort();\r\n return models.length > 0 ? models : [...this.supportedModels];\r\n } catch {\r\n return [...this.supportedModels];\r\n }\r\n }\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
- import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
- import { ModelNotFoundError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.js';
1
+ import { ModelNotFoundError } from './chunk-473JN6M5.js';
2
+ import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
3
+ import { logger } from './chunk-HEKFAKVH.js';
4
4
 
5
5
  // src/providers/registry.ts
6
6
  var ProviderRegistry = class {
@@ -119,20 +119,21 @@ var ProviderRegistry = class {
119
119
  return result;
120
120
  }
121
121
  };
122
- async function createDefaultRegistry() {
122
+ async function createDefaultRegistry(options = {}) {
123
123
  const registry = new ProviderRegistry();
124
- const { SessionManager } = await import('./session-manager-NYB2RKMS.js');
124
+ const { SessionManager } = await import('./session-manager-EHD7GWM2.js');
125
125
  const session = new SessionManager();
126
126
  const { execa } = await import('execa');
127
- const preferSdk = process.env["AEMEATHCLI_PREFER_SDK"] === "1";
127
+ const preferSdk = options.preferSdk ?? process.env["AEMEATHCLI_PREFER_SDK"] === "1";
128
128
  const cliAvailability = /* @__PURE__ */ new Map();
129
129
  const hasCli = async (command) => {
130
130
  const cached = cliAvailability.get(command);
131
131
  if (cached !== void 0) {
132
132
  return cached;
133
133
  }
134
+ const pathLookupCommand = process.platform === "win32" ? "where" : "which";
134
135
  try {
135
- await execa("which", [command], { timeout: 3e3 });
136
+ await execa(pathLookupCommand, [command], { timeout: 3e3 });
136
137
  cliAvailability.set(command, true);
137
138
  return true;
138
139
  } catch {
@@ -141,14 +142,14 @@ async function createDefaultRegistry() {
141
142
  }
142
143
  };
143
144
  const shouldUseNative = async (credential, cliCommand, envKeyName) => {
145
+ const hasApiKey = credential?.method === "api_key" || credential?.method === "env_variable" || process.env[envKeyName] !== void 0;
146
+ if (preferSdk && hasApiKey) {
147
+ return false;
148
+ }
144
149
  if (credential?.method === "native_login") {
145
150
  return await hasCli(cliCommand);
146
151
  }
147
152
  if (preferSdk) {
148
- const hasApiKey = credential?.token !== void 0 || process.env[envKeyName] !== void 0;
149
- if (hasApiKey) {
150
- return false;
151
- }
152
153
  return await hasCli(cliCommand);
153
154
  }
154
155
  return credential === void 0 && await hasCli(cliCommand);
@@ -157,11 +158,11 @@ async function createDefaultRegistry() {
157
158
  {
158
159
  name: "anthropic",
159
160
  load: async () => {
160
- const { ClaudeAdapter } = await import('./claude-adapter-QMLFMSP3.js');
161
+ const { ClaudeAdapter } = await import('./claude-adapter-6P4SJH7P.js');
161
162
  const credential = await session.getActiveCredential("anthropic").catch(() => void 0);
162
163
  const useNative = await shouldUseNative(credential, "claude", "ANTHROPIC_API_KEY");
163
164
  if (useNative) {
164
- const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
165
+ const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
165
166
  logNativeAdapterSelection("anthropic");
166
167
  return new ClaudeNativeCLIAdapter();
167
168
  }
@@ -173,11 +174,11 @@ async function createDefaultRegistry() {
173
174
  {
174
175
  name: "openai",
175
176
  load: async () => {
176
- const { OpenAIAdapter } = await import('./openai-adapter-XU46EN7B.js');
177
+ const { OpenAIAdapter } = await import('./openai-adapter-SHPLK77L.js');
177
178
  const credential = await session.getActiveCredential("openai").catch(() => void 0);
178
179
  const useNative = await shouldUseNative(credential, "codex", "OPENAI_API_KEY");
179
180
  if (useNative) {
180
- const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
181
+ const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
181
182
  logNativeAdapterSelection("openai");
182
183
  return new CodexNativeCLIAdapter();
183
184
  }
@@ -189,11 +190,11 @@ async function createDefaultRegistry() {
189
190
  {
190
191
  name: "google",
191
192
  load: async () => {
192
- const { GeminiAdapter } = await import('./gemini-adapter-6JIHZ7WI.js');
193
+ const { GeminiAdapter } = await import('./gemini-adapter-MV3U4QFH.js');
193
194
  const credential = await session.getActiveCredential("google").catch(() => void 0);
194
195
  const useNative = await shouldUseNative(credential, "gemini", "GOOGLE_API_KEY");
195
196
  if (useNative) {
196
- const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
197
+ const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
197
198
  logNativeAdapterSelection("google");
198
199
  return new GeminiNativeCLIAdapter();
199
200
  }
@@ -205,11 +206,11 @@ async function createDefaultRegistry() {
205
206
  {
206
207
  name: "kimi",
207
208
  load: async () => {
208
- const { KimiAdapter } = await import('./kimi-adapter-JN4HFFHU.js');
209
+ const { KimiAdapter } = await import('./kimi-adapter-UODMNX6K.js');
209
210
  const credential = await session.getActiveCredential("kimi").catch(() => void 0);
210
211
  const useNative = await shouldUseNative(credential, "kimi", "MOONSHOT_API_KEY");
211
212
  if (useNative) {
212
- const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
213
+ const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
213
214
  logNativeAdapterSelection("kimi");
214
215
  return new KimiNativeCLIAdapter();
215
216
  }
@@ -221,7 +222,7 @@ async function createDefaultRegistry() {
221
222
  ];
222
223
  const ollamaTask = (async () => {
223
224
  try {
224
- const { OllamaAdapter } = await import('./ollama-adapter-OJQ3FKWK.js');
225
+ const { OllamaAdapter } = await import('./ollama-adapter-GE67BNSS.js');
225
226
  const ollama = new OllamaAdapter();
226
227
  await ollama.refreshModels();
227
228
  registry.register(ollama);
@@ -242,5 +243,5 @@ async function createDefaultRegistry() {
242
243
  }
243
244
 
244
245
  export { ProviderRegistry, createDefaultRegistry };
245
- //# sourceMappingURL=chunk-ASGRGXYK.js.map
246
- //# sourceMappingURL=chunk-ASGRGXYK.js.map
246
+ //# sourceMappingURL=chunk-P66WDACW.js.map
247
+ //# sourceMappingURL=chunk-P66WDACW.js.map