@jonnyhoo/ccs 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.claude/settings.local.json +6 -0
  2. package/.claude/skills/ccs-delegation/SKILL.md +7 -7
  3. package/.claude/skills/ccs-delegation/references/troubleshooting.md +20 -20
  4. package/config/base-codex.settings.json +4 -4
  5. package/dist/api/services/profile-writer.d.ts +1 -1
  6. package/dist/api/services/profile-writer.d.ts.map +1 -1
  7. package/dist/api/services/profile-writer.js +8 -9
  8. package/dist/api/services/profile-writer.js.map +1 -1
  9. package/dist/auth/profile-detector.d.ts +3 -1
  10. package/dist/auth/profile-detector.d.ts.map +1 -1
  11. package/dist/auth/profile-detector.js +16 -17
  12. package/dist/auth/profile-detector.js.map +1 -1
  13. package/dist/ccs.js +303 -44
  14. package/dist/ccs.js.map +1 -1
  15. package/dist/cliproxy/anthropic-to-openai-proxy.d.ts +58 -0
  16. package/dist/cliproxy/anthropic-to-openai-proxy.d.ts.map +1 -0
  17. package/dist/cliproxy/anthropic-to-openai-proxy.js +1660 -0
  18. package/dist/cliproxy/anthropic-to-openai-proxy.js.map +1 -0
  19. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -1
  20. package/dist/cliproxy/cliproxy-executor.js +211 -48
  21. package/dist/cliproxy/cliproxy-executor.js.map +1 -1
  22. package/dist/cliproxy/codex-reasoning-proxy.d.ts +5 -0
  23. package/dist/cliproxy/codex-reasoning-proxy.d.ts.map +1 -1
  24. package/dist/cliproxy/codex-reasoning-proxy.js +6 -0
  25. package/dist/cliproxy/codex-reasoning-proxy.js.map +1 -1
  26. package/dist/cliproxy/config-generator.d.ts +10 -1
  27. package/dist/cliproxy/config-generator.d.ts.map +1 -1
  28. package/dist/cliproxy/config-generator.js +75 -5
  29. package/dist/cliproxy/config-generator.js.map +1 -1
  30. package/dist/cliproxy/endpoint-setup.d.ts +44 -0
  31. package/dist/cliproxy/endpoint-setup.d.ts.map +1 -0
  32. package/dist/cliproxy/endpoint-setup.js +299 -0
  33. package/dist/cliproxy/endpoint-setup.js.map +1 -0
  34. package/dist/cliproxy/index.d.ts +1 -1
  35. package/dist/cliproxy/index.d.ts.map +1 -1
  36. package/dist/cliproxy/index.js +4 -3
  37. package/dist/cliproxy/index.js.map +1 -1
  38. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  39. package/dist/cliproxy/model-catalog.js +12 -1
  40. package/dist/cliproxy/model-catalog.js.map +1 -1
  41. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
  42. package/dist/cliproxy/services/variant-settings.js +0 -5
  43. package/dist/cliproxy/services/variant-settings.js.map +1 -1
  44. package/dist/cliproxy/tool-name-sanitizer.d.ts +17 -21
  45. package/dist/cliproxy/tool-name-sanitizer.d.ts.map +1 -1
  46. package/dist/cliproxy/tool-name-sanitizer.js +46 -33
  47. package/dist/cliproxy/tool-name-sanitizer.js.map +1 -1
  48. package/dist/cliproxy/tool-sanitization-proxy.d.ts.map +1 -1
  49. package/dist/cliproxy/tool-sanitization-proxy.js +18 -1
  50. package/dist/cliproxy/tool-sanitization-proxy.js.map +1 -1
  51. package/dist/commands/api-command.d.ts.map +1 -1
  52. package/dist/commands/api-command.js +21 -1
  53. package/dist/commands/api-command.js.map +1 -1
  54. package/dist/commands/help-command.d.ts.map +1 -1
  55. package/dist/commands/help-command.js +15 -94
  56. package/dist/commands/help-command.js.map +1 -1
  57. package/dist/commands/index.d.ts +0 -1
  58. package/dist/commands/index.d.ts.map +1 -1
  59. package/dist/commands/index.js +1 -3
  60. package/dist/commands/index.js.map +1 -1
  61. package/dist/commands/install-command.d.ts.map +1 -1
  62. package/dist/commands/install-command.js +2 -9
  63. package/dist/commands/install-command.js.map +1 -1
  64. package/dist/commands/router.js +1 -1
  65. package/dist/commands/router.js.map +1 -1
  66. package/dist/config/unified-config-loader.d.ts +0 -32
  67. package/dist/config/unified-config-loader.d.ts.map +1 -1
  68. package/dist/config/unified-config-loader.js +6 -95
  69. package/dist/config/unified-config-loader.js.map +1 -1
  70. package/dist/config/unified-config-types.d.ts +3 -75
  71. package/dist/config/unified-config-types.d.ts.map +1 -1
  72. package/dist/config/unified-config-types.js +0 -20
  73. package/dist/config/unified-config-types.js.map +1 -1
  74. package/dist/delegation/background-monitor.d.ts +80 -0
  75. package/dist/delegation/background-monitor.d.ts.map +1 -0
  76. package/dist/delegation/background-monitor.js +295 -0
  77. package/dist/delegation/background-monitor.js.map +1 -0
  78. package/dist/delegation/delegation-handler.d.ts +2 -1
  79. package/dist/delegation/delegation-handler.d.ts.map +1 -1
  80. package/dist/delegation/delegation-handler.js +48 -30
  81. package/dist/delegation/delegation-handler.js.map +1 -1
  82. package/dist/delegation/executor/types.d.ts +2 -0
  83. package/dist/delegation/executor/types.d.ts.map +1 -1
  84. package/dist/delegation/headless-executor.d.ts +3 -0
  85. package/dist/delegation/headless-executor.d.ts.map +1 -1
  86. package/dist/delegation/headless-executor.js +162 -14
  87. package/dist/delegation/headless-executor.js.map +1 -1
  88. package/dist/hello.d.ts +7 -0
  89. package/dist/hello.d.ts.map +1 -0
  90. package/dist/hello.js +13 -0
  91. package/dist/hello.js.map +1 -0
  92. package/dist/management/checks/image-analysis-check.d.ts.map +1 -1
  93. package/dist/management/checks/image-analysis-check.js.map +1 -1
  94. package/dist/router/index.d.ts +3 -3
  95. package/dist/router/index.d.ts.map +1 -1
  96. package/dist/router/index.js +1 -1
  97. package/dist/router/index.js.map +1 -1
  98. package/dist/router/scenario-router.d.ts +2 -8
  99. package/dist/router/scenario-router.d.ts.map +1 -1
  100. package/dist/router/scenario-router.js +3 -22
  101. package/dist/router/scenario-router.js.map +1 -1
  102. package/dist/router/scenario-routing-proxy.d.ts.map +1 -1
  103. package/dist/router/scenario-routing-proxy.js +19 -4
  104. package/dist/router/scenario-routing-proxy.js.map +1 -1
  105. package/dist/router/settings-routing-executor.d.ts.map +1 -1
  106. package/dist/router/settings-routing-executor.js.map +1 -1
  107. package/dist/router/types.d.ts +1 -1
  108. package/dist/router/types.d.ts.map +1 -1
  109. package/dist/utils/shell-executor.d.ts.map +1 -1
  110. package/dist/utils/shell-executor.js +1 -6
  111. package/dist/utils/shell-executor.js.map +1 -1
  112. package/dist/web-server/health/index.d.ts +0 -1
  113. package/dist/web-server/health/index.d.ts.map +1 -1
  114. package/dist/web-server/health/index.js +1 -4
  115. package/dist/web-server/health/index.js.map +1 -1
  116. package/dist/web-server/health-service.d.ts.map +1 -1
  117. package/dist/web-server/health-service.js +0 -4
  118. package/dist/web-server/health-service.js.map +1 -1
  119. package/dist/web-server/routes/index.d.ts.map +1 -1
  120. package/dist/web-server/routes/index.js +0 -3
  121. package/dist/web-server/routes/index.js.map +1 -1
  122. package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
  123. package/dist/web-server/routes/settings-routes.js +0 -4
  124. package/dist/web-server/routes/settings-routes.js.map +1 -1
  125. package/package.json +1 -1
  126. package/scripts/background-redis-bridge.js +320 -0
  127. package/scripts/monitor-task.js +313 -0
  128. package/dist/commands/cliproxy-command.d.ts +0 -21
  129. package/dist/commands/cliproxy-command.d.ts.map +0 -1
  130. package/dist/commands/cliproxy-command.js +0 -1099
  131. package/dist/commands/cliproxy-command.js.map +0 -1
  132. package/dist/commands/cliproxy-sync-handler.d.ts +0 -19
  133. package/dist/commands/cliproxy-sync-handler.d.ts.map +0 -1
  134. package/dist/commands/cliproxy-sync-handler.js +0 -99
  135. package/dist/commands/cliproxy-sync-handler.js.map +0 -1
  136. package/dist/utils/websearch/gemini-cli.d.ts +0 -36
  137. package/dist/utils/websearch/gemini-cli.d.ts.map +0 -1
  138. package/dist/utils/websearch/gemini-cli.js +0 -132
  139. package/dist/utils/websearch/gemini-cli.js.map +0 -1
  140. package/dist/utils/websearch/grok-cli.d.ts +0 -26
  141. package/dist/utils/websearch/grok-cli.d.ts.map +0 -1
  142. package/dist/utils/websearch/grok-cli.js +0 -81
  143. package/dist/utils/websearch/grok-cli.js.map +0 -1
  144. package/dist/utils/websearch/hook-config.d.ts +0 -27
  145. package/dist/utils/websearch/hook-config.d.ts.map +0 -1
  146. package/dist/utils/websearch/hook-config.js +0 -280
  147. package/dist/utils/websearch/hook-config.js.map +0 -1
  148. package/dist/utils/websearch/hook-env.d.ts +0 -16
  149. package/dist/utils/websearch/hook-env.d.ts.map +0 -1
  150. package/dist/utils/websearch/hook-env.js +0 -62
  151. package/dist/utils/websearch/hook-env.js.map +0 -1
  152. package/dist/utils/websearch/hook-installer.d.ts +0 -30
  153. package/dist/utils/websearch/hook-installer.d.ts.map +0 -1
  154. package/dist/utils/websearch/hook-installer.js +0 -148
  155. package/dist/utils/websearch/hook-installer.js.map +0 -1
  156. package/dist/utils/websearch/hook-utils.d.ts +0 -18
  157. package/dist/utils/websearch/hook-utils.d.ts.map +0 -1
  158. package/dist/utils/websearch/hook-utils.js +0 -59
  159. package/dist/utils/websearch/hook-utils.js.map +0 -1
  160. package/dist/utils/websearch/index.d.ts +0 -17
  161. package/dist/utils/websearch/index.d.ts.map +0 -1
  162. package/dist/utils/websearch/index.js +0 -51
  163. package/dist/utils/websearch/index.js.map +0 -1
  164. package/dist/utils/websearch/opencode-cli.d.ts +0 -26
  165. package/dist/utils/websearch/opencode-cli.d.ts.map +0 -1
  166. package/dist/utils/websearch/opencode-cli.js +0 -81
  167. package/dist/utils/websearch/opencode-cli.js.map +0 -1
  168. package/dist/utils/websearch/profile-hook-injector.d.ts +0 -20
  169. package/dist/utils/websearch/profile-hook-injector.d.ts.map +0 -1
  170. package/dist/utils/websearch/profile-hook-injector.js +0 -250
  171. package/dist/utils/websearch/profile-hook-injector.js.map +0 -1
  172. package/dist/utils/websearch/status.d.ts +0 -36
  173. package/dist/utils/websearch/status.d.ts.map +0 -1
  174. package/dist/utils/websearch/status.js +0 -192
  175. package/dist/utils/websearch/status.js.map +0 -1
  176. package/dist/utils/websearch/types.d.ts +0 -85
  177. package/dist/utils/websearch/types.d.ts.map +0 -1
  178. package/dist/utils/websearch/types.js +0 -10
  179. package/dist/utils/websearch/types.js.map +0 -1
  180. package/dist/utils/websearch-manager.d.ts +0 -31
  181. package/dist/utils/websearch-manager.d.ts.map +0 -1
  182. package/dist/utils/websearch-manager.js +0 -72
  183. package/dist/utils/websearch-manager.js.map +0 -1
  184. package/dist/web-server/health/websearch-checks.d.ts +0 -11
  185. package/dist/web-server/health/websearch-checks.d.ts.map +0 -1
  186. package/dist/web-server/health/websearch-checks.js +0 -53
  187. package/dist/web-server/health/websearch-checks.js.map +0 -1
  188. package/dist/web-server/routes/websearch-routes.d.ts +0 -6
  189. package/dist/web-server/routes/websearch-routes.d.ts.map +0 -1
  190. package/dist/web-server/routes/websearch-routes.js +0 -130
  191. package/dist/web-server/routes/websearch-routes.js.map +0 -1
  192. package/lib/hooks/block-websearch.cjs +0 -75
  193. package/lib/hooks/websearch-transformer.cjs +0 -632
@@ -1,280 +0,0 @@
1
- "use strict";
2
- /**
3
- * WebSearch Hook Configuration
4
- *
5
- * Manages hook configuration in Claude settings.json.
6
- *
7
- * @module utils/websearch/hook-config
8
- */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || function (mod) {
26
- if (mod && mod.__esModule) return mod;
27
- var result = {};
28
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
- __setModuleDefault(result, mod);
30
- return result;
31
- };
32
- Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.removeHookConfig = exports.ensureHookConfig = exports.getWebSearchHookConfig = exports.getHookPath = void 0;
34
- const fs = __importStar(require("fs"));
35
- const path = __importStar(require("path"));
36
- const os = __importStar(require("os"));
37
- const ui_1 = require("../ui");
38
- const unified_config_loader_1 = require("../../config/unified-config-loader");
39
- const config_manager_1 = require("../config-manager");
40
- const hook_utils_1 = require("./hook-utils");
41
- // Hook file name
42
- const WEBSEARCH_HOOK = 'websearch-transformer.cjs';
43
- /**
44
- * Get Claude settings path (respects CCS_HOME for test isolation)
45
- * In tests, returns path under CCS_HOME; in production, uses real ~/.claude/
46
- */
47
- function getClaudeSettingsPath() {
48
- const ccsHome = process.env.CCS_HOME;
49
- if (ccsHome) {
50
- // Test mode: use CCS_HOME parent for .claude directory
51
- // This prevents tests from modifying user's real settings
52
- return path.join(path.dirname(ccsHome), '.claude', 'settings.json');
53
- }
54
- // Production: use real home directory
55
- return path.join(os.homedir(), '.claude', 'settings.json');
56
- }
57
- // Buffer time added to max provider timeout for hook timeout (seconds)
58
- const HOOK_TIMEOUT_BUFFER = 30;
59
- // Minimum hook timeout in seconds (fallback if no providers configured)
60
- const MIN_HOOK_TIMEOUT = 60;
61
- /**
62
- * Get path to WebSearch hook
63
- */
64
- function getHookPath() {
65
- return path.join((0, config_manager_1.getCcsHooksDir)(), WEBSEARCH_HOOK);
66
- }
67
- exports.getHookPath = getHookPath;
68
- /**
69
- * Get WebSearch hook configuration for settings.json
70
- * Timeout is computed from max provider timeout in config.yaml + buffer
71
- */
72
- function getWebSearchHookConfig() {
73
- const hookPath = getHookPath();
74
- const wsConfig = (0, unified_config_loader_1.getWebSearchConfig)();
75
- // Compute max timeout from enabled providers
76
- const timeouts = [];
77
- if (wsConfig.providers?.gemini?.enabled && wsConfig.providers.gemini.timeout) {
78
- timeouts.push(wsConfig.providers.gemini.timeout);
79
- }
80
- if (wsConfig.providers?.opencode?.enabled && wsConfig.providers.opencode.timeout) {
81
- timeouts.push(wsConfig.providers.opencode.timeout);
82
- }
83
- if (wsConfig.providers?.grok?.enabled && wsConfig.providers.grok.timeout) {
84
- timeouts.push(wsConfig.providers.grok.timeout);
85
- }
86
- // Hook timeout = max provider timeout + buffer (or minimum if none configured)
87
- const maxProviderTimeout = timeouts.length > 0 ? Math.max(...timeouts) : MIN_HOOK_TIMEOUT;
88
- const hookTimeout = maxProviderTimeout + HOOK_TIMEOUT_BUFFER;
89
- return {
90
- PreToolUse: [
91
- {
92
- matcher: 'WebSearch',
93
- hooks: [
94
- {
95
- type: 'command',
96
- command: `node "${hookPath}"`,
97
- timeout: hookTimeout,
98
- },
99
- ],
100
- },
101
- ],
102
- };
103
- }
104
- exports.getWebSearchHookConfig = getWebSearchHookConfig;
105
- /**
106
- * Ensure WebSearch hook is configured in ~/.claude/settings.json
107
- */
108
- function ensureHookConfig() {
109
- try {
110
- const wsConfig = (0, unified_config_loader_1.getWebSearchConfig)();
111
- if (!wsConfig.enabled) {
112
- return false;
113
- }
114
- // Read existing settings or start fresh
115
- let settings = {};
116
- if (fs.existsSync(getClaudeSettingsPath())) {
117
- try {
118
- const content = fs.readFileSync(getClaudeSettingsPath(), 'utf8');
119
- settings = JSON.parse(content);
120
- }
121
- catch {
122
- if (process.env.CCS_DEBUG) {
123
- console.error((0, ui_1.warn)('Malformed settings.json - will merge carefully'));
124
- }
125
- }
126
- }
127
- // Check if WebSearch hook already configured
128
- const hooks = settings.hooks;
129
- const expectedHookPath = getHookPath();
130
- const expectedCommand = `node "${expectedHookPath}"`;
131
- if (hooks?.PreToolUse) {
132
- const webSearchHookIndex = hooks.PreToolUse.findIndex((h) => {
133
- const hook = h;
134
- if (hook.matcher !== 'WebSearch')
135
- return false;
136
- const hookArray = hook.hooks;
137
- const command = hookArray?.[0]?.command;
138
- if (typeof command !== 'string')
139
- return false;
140
- const normalized = command
141
- .replace(/\\/g, '/') // Windows backslashes
142
- .replace(/\/+/g, '/'); // Collapse multiple slashes
143
- return normalized.includes('.ccs/hooks/websearch-transformer');
144
- });
145
- if (webSearchHookIndex !== -1) {
146
- // Hook exists - first clean up any duplicates
147
- // INVARIANT: webSearchHookIndex remains valid after deduplication because:
148
- // - findIndex() returns the FIRST matching CCS hook
149
- // - deduplicateCcsHooks() keeps the FIRST CCS hook and removes subsequent duplicates
150
- // This means the index always points to the preserved hook.
151
- const hadDuplicates = (0, hook_utils_1.deduplicateCcsHooks)(settings);
152
- // Then check if it needs updating
153
- const existingHook = hooks.PreToolUse[webSearchHookIndex];
154
- const existingHooks = existingHook.hooks;
155
- const currentHookConfig = getWebSearchHookConfig();
156
- const expectedHooks = currentHookConfig.PreToolUse[0]
157
- .hooks;
158
- const expectedTimeout = expectedHooks[0].timeout;
159
- let needsUpdate = false;
160
- if (existingHooks?.[0]?.command !== expectedCommand) {
161
- existingHooks[0].command = expectedCommand;
162
- needsUpdate = true;
163
- }
164
- if (existingHooks?.[0]?.timeout !== expectedTimeout) {
165
- existingHooks[0].timeout = expectedTimeout;
166
- needsUpdate = true;
167
- }
168
- // Combine into single write if either changed
169
- if (hadDuplicates || needsUpdate) {
170
- fs.writeFileSync(getClaudeSettingsPath(), JSON.stringify(settings, null, 2), 'utf8');
171
- if (process.env.CCS_DEBUG) {
172
- if (hadDuplicates)
173
- console.error((0, ui_1.info)('Removed duplicate WebSearch hooks from settings.json'));
174
- if (needsUpdate)
175
- console.error((0, ui_1.info)('Updated WebSearch hook config in settings.json'));
176
- }
177
- }
178
- return true;
179
- }
180
- }
181
- // Get hook config
182
- const hookConfig = getWebSearchHookConfig();
183
- // Merge hook config into settings
184
- if (!settings.hooks) {
185
- settings.hooks = {};
186
- }
187
- const settingsHooks = settings.hooks;
188
- if (!settingsHooks.PreToolUse) {
189
- settingsHooks.PreToolUse = [];
190
- }
191
- // Remove any existing CCS hooks first to prevent duplicates
192
- settingsHooks.PreToolUse = settingsHooks.PreToolUse.filter((h) => {
193
- const hook = h;
194
- return !(0, hook_utils_1.isCcsWebSearchHook)(hook);
195
- });
196
- // Add our hook config
197
- const preToolUseHooks = hookConfig.PreToolUse;
198
- settingsHooks.PreToolUse.push(...preToolUseHooks);
199
- // Ensure ~/.claude directory exists
200
- const claudeDir = path.dirname(getClaudeSettingsPath());
201
- if (!fs.existsSync(claudeDir)) {
202
- fs.mkdirSync(claudeDir, { recursive: true, mode: 0o700 });
203
- }
204
- // Write updated settings
205
- fs.writeFileSync(getClaudeSettingsPath(), JSON.stringify(settings, null, 2), 'utf8');
206
- if (process.env.CCS_DEBUG) {
207
- console.error((0, ui_1.info)('Added WebSearch hook to settings.json'));
208
- }
209
- return true;
210
- }
211
- catch (error) {
212
- if (process.env.CCS_DEBUG) {
213
- console.error((0, ui_1.warn)(`Failed to configure WebSearch hook: ${error.message}`));
214
- }
215
- return false;
216
- }
217
- }
218
- exports.ensureHookConfig = ensureHookConfig;
219
- /**
220
- * Remove CCS WebSearch hook from ~/.claude/settings.json
221
- * Only removes hooks matching: matcher='WebSearch' AND command contains '.ccs/hooks/websearch-transformer'
222
- * Preserves user-defined WebSearch hooks
223
- */
224
- function removeHookConfig() {
225
- try {
226
- if (!fs.existsSync(getClaudeSettingsPath())) {
227
- return true; // Nothing to remove
228
- }
229
- const content = fs.readFileSync(getClaudeSettingsPath(), 'utf8');
230
- let settings;
231
- try {
232
- settings = JSON.parse(content);
233
- }
234
- catch {
235
- return false; // Malformed JSON, don't touch
236
- }
237
- const hooks = settings.hooks;
238
- if (!hooks?.PreToolUse) {
239
- return true; // No hooks to remove
240
- }
241
- const originalLength = hooks.PreToolUse.length;
242
- hooks.PreToolUse = hooks.PreToolUse.filter((h) => {
243
- const hook = h;
244
- if (hook.matcher !== 'WebSearch')
245
- return true; // Keep non-WebSearch hooks
246
- const hookArray = hook.hooks;
247
- if (!hookArray?.[0]?.command)
248
- return true; // Keep malformed entries
249
- const command = hookArray[0].command;
250
- // Normalize path separators for cross-platform matching (Windows uses backslashes)
251
- const normalizedCommand = command
252
- .replace(/\\/g, '/') // Windows backslashes
253
- .replace(/\/+/g, '/'); // Collapse multiple slashes
254
- return !normalizedCommand.includes('.ccs/hooks/websearch-transformer'); // Remove if CCS hook
255
- });
256
- if (hooks.PreToolUse.length === originalLength) {
257
- return true; // Nothing changed
258
- }
259
- // Clean up empty hooks object
260
- if (hooks.PreToolUse.length === 0) {
261
- delete hooks.PreToolUse;
262
- }
263
- if (Object.keys(hooks).length === 0) {
264
- delete settings.hooks;
265
- }
266
- fs.writeFileSync(getClaudeSettingsPath(), JSON.stringify(settings, null, 2), 'utf8');
267
- if (process.env.CCS_DEBUG) {
268
- console.error((0, ui_1.info)('Removed WebSearch hook from settings.json'));
269
- }
270
- return true;
271
- }
272
- catch (error) {
273
- if (process.env.CCS_DEBUG) {
274
- console.error((0, ui_1.warn)(`Failed to remove hook config: ${error.message}`));
275
- }
276
- return false;
277
- }
278
- }
279
- exports.removeHookConfig = removeHookConfig;
280
- //# sourceMappingURL=hook-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-config.js","sourceRoot":"","sources":["../../../src/utils/websearch/hook-config.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * WebSearch Hook Environment Variables
3
- *
4
- * Provides environment variables for WebSearch hook configuration.
5
- *
6
- * @module utils/websearch/hook-env
7
- */
8
- /**
9
- * Get environment variables for WebSearch hook configuration.
10
- *
11
- * Simple env vars - hook reads these to control behavior.
12
- *
13
- * @returns Record of environment variables to set before spawning Claude
14
- */
15
- export declare function getWebSearchHookEnv(): Record<string, string>;
16
- //# sourceMappingURL=hook-env.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-env.d.ts","sourceRoot":"","sources":["../../../src/utils/websearch/hook-env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgD5D"}
@@ -1,62 +0,0 @@
1
- "use strict";
2
- /**
3
- * WebSearch Hook Environment Variables
4
- *
5
- * Provides environment variables for WebSearch hook configuration.
6
- *
7
- * @module utils/websearch/hook-env
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.getWebSearchHookEnv = void 0;
11
- const unified_config_loader_1 = require("../../config/unified-config-loader");
12
- /**
13
- * Get environment variables for WebSearch hook configuration.
14
- *
15
- * Simple env vars - hook reads these to control behavior.
16
- *
17
- * @returns Record of environment variables to set before spawning Claude
18
- */
19
- function getWebSearchHookEnv() {
20
- const wsConfig = (0, unified_config_loader_1.getWebSearchConfig)();
21
- const env = {};
22
- // Skip hook entirely if disabled
23
- if (!wsConfig.enabled) {
24
- env.CCS_WEBSEARCH_SKIP = '1';
25
- return env;
26
- }
27
- // Pass master switch
28
- env.CCS_WEBSEARCH_ENABLED = '1';
29
- // Pass individual provider enabled states
30
- // Hook will only use providers that are BOTH enabled AND installed
31
- if (wsConfig.providers?.gemini?.enabled) {
32
- env.CCS_WEBSEARCH_GEMINI = '1';
33
- if (wsConfig.providers.gemini.model) {
34
- env.CCS_WEBSEARCH_GEMINI_MODEL = wsConfig.providers.gemini.model;
35
- }
36
- env.CCS_WEBSEARCH_TIMEOUT = String(wsConfig.providers.gemini.timeout || 55);
37
- }
38
- if (wsConfig.providers?.opencode?.enabled) {
39
- env.CCS_WEBSEARCH_OPENCODE = '1';
40
- if (wsConfig.providers.opencode.model) {
41
- env.CCS_WEBSEARCH_OPENCODE_MODEL = wsConfig.providers.opencode.model;
42
- }
43
- // Use opencode timeout if no gemini timeout set
44
- if (!env.CCS_WEBSEARCH_TIMEOUT) {
45
- env.CCS_WEBSEARCH_TIMEOUT = String(wsConfig.providers.opencode.timeout || 90);
46
- }
47
- }
48
- if (wsConfig.providers?.grok?.enabled) {
49
- env.CCS_WEBSEARCH_GROK = '1';
50
- // Use grok timeout if no other timeout set
51
- if (!env.CCS_WEBSEARCH_TIMEOUT) {
52
- env.CCS_WEBSEARCH_TIMEOUT = String(wsConfig.providers.grok.timeout || 55);
53
- }
54
- }
55
- // Default timeout if none set
56
- if (!env.CCS_WEBSEARCH_TIMEOUT) {
57
- env.CCS_WEBSEARCH_TIMEOUT = '55';
58
- }
59
- return env;
60
- }
61
- exports.getWebSearchHookEnv = getWebSearchHookEnv;
62
- //# sourceMappingURL=hook-env.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-env.js","sourceRoot":"","sources":["../../../src/utils/websearch/hook-env.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,8EAAwE;AAExE;;;;;;GAMG;AACH,SAAgB,mBAAmB;IACjC,MAAM,QAAQ,GAAG,IAAA,0CAAkB,GAAE,CAAC;IACtC,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,iCAAiC;IACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QAC7B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,qBAAqB;IACrB,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;IAEhC,0CAA0C;IAC1C,mEAAmE;IACnE,IAAI,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACxC,GAAG,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAC/B,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,GAAG,CAAC,0BAA0B,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;QACnE,CAAC;QACD,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC1C,GAAG,CAAC,sBAAsB,GAAG,GAAG,CAAC;QACjC,IAAI,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtC,GAAG,CAAC,4BAA4B,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvE,CAAC;QACD,gDAAgD;QAChD,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;YAC/B,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACtC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QAC7B,2CAA2C;QAC3C,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;YAC/B,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC/B,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAhDD,kDAgDC"}
@@ -1,30 +0,0 @@
1
- /**
2
- * WebSearch Hook Installer
3
- *
4
- * Manages installation and uninstallation of the WebSearch hook.
5
- *
6
- * @module utils/websearch/hook-installer
7
- */
8
- export { getHookPath, getWebSearchHookConfig } from './hook-config';
9
- /**
10
- * Check if WebSearch hook is installed
11
- */
12
- export declare function hasWebSearchHook(): boolean;
13
- /**
14
- * Install WebSearch hook to ~/.ccs/hooks/
15
- *
16
- * This hook intercepts WebSearch and executes via Gemini CLI.
17
- *
18
- * @returns true if hook installed successfully
19
- */
20
- export declare function installWebSearchHook(): boolean;
21
- /**
22
- * Uninstall WebSearch hook from ~/.ccs/hooks/
23
- *
24
- * Note: Does NOT touch global ~/.claude/settings.json.
25
- * Profile-specific hooks are removed when ~/.ccs/ is deleted.
26
- *
27
- * @returns true if hook uninstalled successfully
28
- */
29
- export declare function uninstallWebSearchHook(): boolean;
30
- //# sourceMappingURL=hook-installer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-installer.d.ts","sourceRoot":"","sources":["../../../src/utils/websearch/hook-installer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAKpE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CA+D9C;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAwBhD"}
@@ -1,148 +0,0 @@
1
- "use strict";
2
- /**
3
- * WebSearch Hook Installer
4
- *
5
- * Manages installation and uninstallation of the WebSearch hook.
6
- *
7
- * @module utils/websearch/hook-installer
8
- */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || function (mod) {
26
- if (mod && mod.__esModule) return mod;
27
- var result = {};
28
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
- __setModuleDefault(result, mod);
30
- return result;
31
- };
32
- Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.uninstallWebSearchHook = exports.installWebSearchHook = exports.hasWebSearchHook = exports.getWebSearchHookConfig = exports.getHookPath = void 0;
34
- const fs = __importStar(require("fs"));
35
- const path = __importStar(require("path"));
36
- const ui_1 = require("../ui");
37
- const unified_config_loader_1 = require("../../config/unified-config-loader");
38
- const config_manager_1 = require("../config-manager");
39
- const hook_config_1 = require("./hook-config");
40
- const profile_hook_injector_1 = require("./profile-hook-injector");
41
- // Re-export from hook-config for backward compatibility
42
- var hook_config_2 = require("./hook-config");
43
- Object.defineProperty(exports, "getHookPath", { enumerable: true, get: function () { return hook_config_2.getHookPath; } });
44
- Object.defineProperty(exports, "getWebSearchHookConfig", { enumerable: true, get: function () { return hook_config_2.getWebSearchHookConfig; } });
45
- // Hook file name
46
- const WEBSEARCH_HOOK = 'websearch-transformer.cjs';
47
- /**
48
- * Check if WebSearch hook is installed
49
- */
50
- function hasWebSearchHook() {
51
- return fs.existsSync((0, hook_config_1.getHookPath)());
52
- }
53
- exports.hasWebSearchHook = hasWebSearchHook;
54
- /**
55
- * Install WebSearch hook to ~/.ccs/hooks/
56
- *
57
- * This hook intercepts WebSearch and executes via Gemini CLI.
58
- *
59
- * @returns true if hook installed successfully
60
- */
61
- function installWebSearchHook() {
62
- try {
63
- const wsConfig = (0, unified_config_loader_1.getWebSearchConfig)();
64
- // Skip if disabled
65
- if (!wsConfig.enabled) {
66
- if (process.env.CCS_DEBUG) {
67
- console.error((0, ui_1.info)('WebSearch disabled - skipping hook install'));
68
- }
69
- return false;
70
- }
71
- // Ensure hooks directory exists
72
- const hooksDir = (0, config_manager_1.getCcsHooksDir)();
73
- if (!fs.existsSync(hooksDir)) {
74
- fs.mkdirSync(hooksDir, { recursive: true, mode: 0o700 });
75
- }
76
- const hookPath = (0, hook_config_1.getHookPath)();
77
- // Find the bundled hook script
78
- // In npm package: node_modules/ccs/lib/hooks/
79
- // In development: lib/hooks/
80
- const possiblePaths = [
81
- path.join(__dirname, '..', '..', '..', 'lib', 'hooks', WEBSEARCH_HOOK),
82
- path.join(__dirname, '..', '..', 'lib', 'hooks', WEBSEARCH_HOOK),
83
- path.join(__dirname, '..', 'lib', 'hooks', WEBSEARCH_HOOK),
84
- ];
85
- let sourcePath = null;
86
- for (const p of possiblePaths) {
87
- if (fs.existsSync(p)) {
88
- sourcePath = p;
89
- break;
90
- }
91
- }
92
- if (!sourcePath) {
93
- if (process.env.CCS_DEBUG) {
94
- console.error((0, ui_1.warn)(`WebSearch hook source not found: ${WEBSEARCH_HOOK}`));
95
- }
96
- return false;
97
- }
98
- // Copy hook to ~/.ccs/hooks/
99
- fs.copyFileSync(sourcePath, hookPath);
100
- fs.chmodSync(hookPath, 0o755);
101
- if (process.env.CCS_DEBUG) {
102
- console.error((0, ui_1.info)(`Installed WebSearch hook: ${hookPath}`));
103
- }
104
- // Note: Hook registration is handled by ensureProfileHooks() in profile-hook-injector.ts
105
- // which writes to per-profile settings (~/.ccs/<profile>.settings.json)
106
- // Global settings (~/.claude/settings.json) are NOT modified here
107
- return true;
108
- }
109
- catch (error) {
110
- if (process.env.CCS_DEBUG) {
111
- console.error((0, ui_1.warn)(`Failed to install WebSearch hook: ${error.message}`));
112
- }
113
- return false;
114
- }
115
- }
116
- exports.installWebSearchHook = installWebSearchHook;
117
- /**
118
- * Uninstall WebSearch hook from ~/.ccs/hooks/
119
- *
120
- * Note: Does NOT touch global ~/.claude/settings.json.
121
- * Profile-specific hooks are removed when ~/.ccs/ is deleted.
122
- *
123
- * @returns true if hook uninstalled successfully
124
- */
125
- function uninstallWebSearchHook() {
126
- try {
127
- const hookPath = (0, hook_config_1.getHookPath)();
128
- if (fs.existsSync(hookPath)) {
129
- fs.unlinkSync(hookPath);
130
- if (process.env.CCS_DEBUG) {
131
- console.error((0, ui_1.info)(`Uninstalled WebSearch hook: ${hookPath}`));
132
- }
133
- }
134
- // Remove migration marker (so fresh install re-runs migration)
135
- (0, profile_hook_injector_1.removeMigrationMarker)();
136
- // Note: Do NOT call removeHookConfig() - global settings should not be touched.
137
- // Per-profile hooks in ~/.ccs/*.settings.json are cleaned up when ~/.ccs/ is deleted.
138
- return true;
139
- }
140
- catch (error) {
141
- if (process.env.CCS_DEBUG) {
142
- console.error((0, ui_1.warn)(`Failed to uninstall WebSearch hook: ${error.message}`));
143
- }
144
- return false;
145
- }
146
- }
147
- exports.uninstallWebSearchHook = uninstallWebSearchHook;
148
- //# sourceMappingURL=hook-installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-installer.js","sourceRoot":"","sources":["../../../src/utils/websearch/hook-installer.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * WebSearch Hook Utilities
3
- *
4
- * Shared helper functions for WebSearch hook detection and deduplication.
5
- *
6
- * @module utils/websearch/hook-utils
7
- */
8
- /**
9
- * Check if a hook entry is a CCS WebSearch hook
10
- * Normalizes path separators for cross-platform matching (Windows uses backslashes)
11
- */
12
- export declare function isCcsWebSearchHook(hook: Record<string, unknown>): boolean;
13
- /**
14
- * Remove duplicate CCS WebSearch hooks from settings, keeping only the first one
15
- * Returns true if duplicates were removed
16
- */
17
- export declare function deduplicateCcsHooks(settings: Record<string, unknown>): boolean;
18
- //# sourceMappingURL=hook-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-utils.d.ts","sourceRoot":"","sources":["../../../src/utils/websearch/hook-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAczE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAyB9E"}
@@ -1,59 +0,0 @@
1
- "use strict";
2
- /**
3
- * WebSearch Hook Utilities
4
- *
5
- * Shared helper functions for WebSearch hook detection and deduplication.
6
- *
7
- * @module utils/websearch/hook-utils
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.deduplicateCcsHooks = exports.isCcsWebSearchHook = void 0;
11
- /**
12
- * Check if a hook entry is a CCS WebSearch hook
13
- * Normalizes path separators for cross-platform matching (Windows uses backslashes)
14
- */
15
- function isCcsWebSearchHook(hook) {
16
- if (hook.matcher !== 'WebSearch')
17
- return false;
18
- const hookArray = hook.hooks;
19
- if (!hookArray?.[0]?.command)
20
- return false;
21
- const command = hookArray[0].command;
22
- if (typeof command !== 'string')
23
- return false;
24
- // Normalize path separators for cross-platform matching
25
- const normalizedCommand = command
26
- .replace(/\\/g, '/') // Windows backslashes
27
- .replace(/\/+/g, '/'); // Collapse multiple slashes
28
- return normalizedCommand.includes('.ccs/hooks/websearch-transformer');
29
- }
30
- exports.isCcsWebSearchHook = isCcsWebSearchHook;
31
- /**
32
- * Remove duplicate CCS WebSearch hooks from settings, keeping only the first one
33
- * Returns true if duplicates were removed
34
- */
35
- function deduplicateCcsHooks(settings) {
36
- const hooks = settings.hooks;
37
- if (!hooks?.PreToolUse)
38
- return false;
39
- let foundFirst = false;
40
- const originalLength = hooks.PreToolUse.length;
41
- hooks.PreToolUse = hooks.PreToolUse.filter((h) => {
42
- const hook = h;
43
- if (!isCcsWebSearchHook(hook))
44
- return true; // Keep non-CCS hooks
45
- if (!foundFirst) {
46
- foundFirst = true;
47
- return true; // Keep first CCS hook
48
- }
49
- return false; // Remove subsequent duplicates
50
- });
51
- const newLength = hooks.PreToolUse.length;
52
- if (process.env.CCS_DEBUG && newLength < originalLength) {
53
- const removedCount = originalLength - newLength;
54
- console.error(`Removed ${removedCount} duplicate CCS WebSearch hook(s)`);
55
- }
56
- return newLength < originalLength;
57
- }
58
- exports.deduplicateCcsHooks = deduplicateCcsHooks;
59
- //# sourceMappingURL=hook-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook-utils.js","sourceRoot":"","sources":["../../../src/utils/websearch/hook-utils.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,IAA6B;IAC9D,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAmD,CAAC;IAC3E,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACrC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE9C,wDAAwD;IACxD,MAAM,iBAAiB,GAAG,OAAO;SAC9B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,sBAAsB;SAC1C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;IACrD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;AACxE,CAAC;AAdD,gDAcC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,QAAiC;IACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAA8C,CAAC;IACtE,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,KAAK,CAAC;IAErC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;IAE/C,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,CAA4B,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,qBAAqB;QAEjE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,IAAI,CAAC,CAAC,sBAAsB;QACrC,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,+BAA+B;IAC/C,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,GAAG,cAAc,EAAE,CAAC;QACxD,MAAM,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,WAAW,YAAY,kCAAkC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,SAAS,GAAG,cAAc,CAAC;AACpC,CAAC;AAzBD,kDAyBC"}