@kaitranntt/ccs 7.34.1 → 7.35.1-dev.1

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 (149) hide show
  1. package/dist/ccs.js +11 -0
  2. package/dist/ccs.js.map +1 -1
  3. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -1
  4. package/dist/cliproxy/cliproxy-executor.js +26 -4
  5. package/dist/cliproxy/cliproxy-executor.js.map +1 -1
  6. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
  7. package/dist/cliproxy/services/variant-settings.js +5 -0
  8. package/dist/cliproxy/services/variant-settings.js.map +1 -1
  9. package/dist/commands/config-command.d.ts.map +1 -1
  10. package/dist/commands/config-command.js +14 -0
  11. package/dist/commands/config-command.js.map +1 -1
  12. package/dist/commands/config-image-analysis-command.d.ts +8 -0
  13. package/dist/commands/config-image-analysis-command.d.ts.map +1 -0
  14. package/dist/commands/config-image-analysis-command.js +174 -0
  15. package/dist/commands/config-image-analysis-command.js.map +1 -0
  16. package/dist/commands/help-command.d.ts.map +1 -1
  17. package/dist/commands/help-command.js +14 -0
  18. package/dist/commands/help-command.js.map +1 -1
  19. package/dist/commands/index.d.ts +1 -0
  20. package/dist/commands/index.d.ts.map +1 -1
  21. package/dist/commands/index.js +3 -1
  22. package/dist/commands/index.js.map +1 -1
  23. package/dist/commands/update-command.js +15 -5
  24. package/dist/commands/update-command.js.map +1 -1
  25. package/dist/config/unified-config-loader.d.ts +7 -1
  26. package/dist/config/unified-config-loader.d.ts.map +1 -1
  27. package/dist/config/unified-config-loader.js +157 -24
  28. package/dist/config/unified-config-loader.js.map +1 -1
  29. package/dist/config/unified-config-types.d.ts +19 -0
  30. package/dist/config/unified-config-types.d.ts.map +1 -1
  31. package/dist/config/unified-config-types.js +21 -1
  32. package/dist/config/unified-config-types.js.map +1 -1
  33. package/dist/delegation/headless-executor.d.ts.map +1 -1
  34. package/dist/delegation/headless-executor.js +1 -1
  35. package/dist/delegation/headless-executor.js.map +1 -1
  36. package/dist/delegation/result-formatter.d.ts +0 -4
  37. package/dist/delegation/result-formatter.d.ts.map +1 -1
  38. package/dist/delegation/result-formatter.js +5 -16
  39. package/dist/delegation/result-formatter.js.map +1 -1
  40. package/dist/glmt/glmt-proxy.d.ts.map +1 -1
  41. package/dist/glmt/glmt-proxy.js +6 -2
  42. package/dist/glmt/glmt-proxy.js.map +1 -1
  43. package/dist/management/checks/image-analysis-check.d.ts +16 -0
  44. package/dist/management/checks/image-analysis-check.d.ts.map +1 -0
  45. package/dist/management/checks/image-analysis-check.js +140 -0
  46. package/dist/management/checks/image-analysis-check.js.map +1 -0
  47. package/dist/management/checks/index.d.ts +1 -0
  48. package/dist/management/checks/index.d.ts.map +1 -1
  49. package/dist/management/checks/index.js +5 -1
  50. package/dist/management/checks/index.js.map +1 -1
  51. package/dist/management/doctor.d.ts.map +1 -1
  52. package/dist/management/doctor.js +4 -0
  53. package/dist/management/doctor.js.map +1 -1
  54. package/dist/management/repair/auto-repair.d.ts.map +1 -1
  55. package/dist/management/repair/auto-repair.js +16 -0
  56. package/dist/management/repair/auto-repair.js.map +1 -1
  57. package/dist/ui/assets/{accounts-BROl36rt.js → accounts-BBpXWvSH.js} +1 -1
  58. package/dist/ui/assets/{alert-dialog-Bc0CRwpK.js → alert-dialog-vAfEWTTx.js} +1 -1
  59. package/dist/ui/assets/{api-BTvodZ9c.js → api-DZ5UMkSM.js} +1 -1
  60. package/dist/ui/assets/auth-section-CaMKkkvu.js +1 -0
  61. package/dist/ui/assets/backups-section-WHuXhsOd.js +1 -0
  62. package/dist/ui/assets/{cliproxy-CL-Lk791.js → cliproxy-BJ4pL9JG.js} +2 -2
  63. package/dist/ui/assets/cliproxy-control-panel-RfbZRHh8.js +1 -0
  64. package/dist/ui/assets/{confirm-dialog-B0UGiTIr.js → confirm-dialog-DflEMDZr.js} +1 -1
  65. package/dist/ui/assets/{copilot-DoojagGr.js → copilot-qDXWR1GO.js} +2 -2
  66. package/dist/ui/assets/globalenv-section-f_BGs9T6.js +1 -0
  67. package/dist/ui/assets/health-C8g76Gw9.js +1 -0
  68. package/dist/ui/assets/{icons-B_4flurP.js → icons-D5eAI-GR.js} +1 -1
  69. package/dist/ui/assets/{index-C8D32oPF.js → index-BgcyV-uV.js} +19 -19
  70. package/dist/ui/assets/index-DFnuP2Pl.js +1 -0
  71. package/dist/ui/assets/index-DZpRED6o.js +1 -0
  72. package/dist/ui/assets/index-QvMpU4Lc.css +1 -0
  73. package/dist/ui/assets/index-lueAmZoj.js +1 -0
  74. package/dist/ui/assets/{index-Dhj9QHKA.js → index-mYPtkHHX.js} +1 -1
  75. package/dist/ui/assets/proxy-status-widget-B4pFTeam.js +1 -0
  76. package/dist/ui/assets/shared-DBOiFFnj.js +1 -0
  77. package/dist/ui/assets/{switch-l6toeZhu.js → switch-DtGK4jP3.js} +1 -1
  78. package/dist/ui/index.html +3 -3
  79. package/dist/utils/claude-detector.d.ts.map +1 -1
  80. package/dist/utils/claude-detector.js +42 -2
  81. package/dist/utils/claude-detector.js.map +1 -1
  82. package/dist/utils/config-manager.d.ts +11 -0
  83. package/dist/utils/config-manager.d.ts.map +1 -1
  84. package/dist/utils/config-manager.js +40 -1
  85. package/dist/utils/config-manager.js.map +1 -1
  86. package/dist/utils/error-manager.d.ts.map +1 -1
  87. package/dist/utils/error-manager.js +19 -6
  88. package/dist/utils/error-manager.js.map +1 -1
  89. package/dist/utils/hooks/get-image-analysis-hook-env.d.ts +17 -0
  90. package/dist/utils/hooks/get-image-analysis-hook-env.d.ts.map +1 -0
  91. package/dist/utils/hooks/get-image-analysis-hook-env.js +42 -0
  92. package/dist/utils/hooks/get-image-analysis-hook-env.js.map +1 -0
  93. package/dist/utils/hooks/image-analyzer-hook-configuration.d.ts +17 -0
  94. package/dist/utils/hooks/image-analyzer-hook-configuration.d.ts.map +1 -0
  95. package/dist/utils/hooks/image-analyzer-hook-configuration.js +71 -0
  96. package/dist/utils/hooks/image-analyzer-hook-configuration.js.map +1 -0
  97. package/dist/utils/hooks/image-analyzer-hook-installer.d.ts +31 -0
  98. package/dist/utils/hooks/image-analyzer-hook-installer.d.ts.map +1 -0
  99. package/dist/utils/hooks/image-analyzer-hook-installer.js +149 -0
  100. package/dist/utils/hooks/image-analyzer-hook-installer.js.map +1 -0
  101. package/dist/utils/hooks/image-analyzer-profile-hook-injector.d.ts +24 -0
  102. package/dist/utils/hooks/image-analyzer-profile-hook-injector.d.ts.map +1 -0
  103. package/dist/utils/hooks/image-analyzer-profile-hook-injector.js +251 -0
  104. package/dist/utils/hooks/image-analyzer-profile-hook-injector.js.map +1 -0
  105. package/dist/utils/hooks/index.d.ts +11 -0
  106. package/dist/utils/hooks/index.d.ts.map +1 -0
  107. package/dist/utils/hooks/index.js +21 -0
  108. package/dist/utils/hooks/index.js.map +1 -0
  109. package/dist/utils/image-analysis/hook-installer.d.ts +19 -0
  110. package/dist/utils/image-analysis/hook-installer.d.ts.map +1 -0
  111. package/dist/utils/image-analysis/hook-installer.js +112 -0
  112. package/dist/utils/image-analysis/hook-installer.js.map +1 -0
  113. package/dist/utils/image-analysis/index.d.ts +7 -0
  114. package/dist/utils/image-analysis/index.d.ts.map +1 -0
  115. package/dist/utils/image-analysis/index.js +12 -0
  116. package/dist/utils/image-analysis/index.js.map +1 -0
  117. package/dist/utils/shell-executor.d.ts +1 -0
  118. package/dist/utils/shell-executor.d.ts.map +1 -1
  119. package/dist/utils/shell-executor.js +24 -1
  120. package/dist/utils/shell-executor.js.map +1 -1
  121. package/dist/utils/websearch/hook-config.d.ts +0 -4
  122. package/dist/utils/websearch/hook-config.d.ts.map +1 -1
  123. package/dist/utils/websearch/hook-config.js +2 -9
  124. package/dist/utils/websearch/hook-config.js.map +1 -1
  125. package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
  126. package/dist/utils/websearch/hook-installer.js +2 -1
  127. package/dist/utils/websearch/hook-installer.js.map +1 -1
  128. package/dist/utils/websearch/profile-hook-injector.d.ts.map +1 -1
  129. package/dist/utils/websearch/profile-hook-injector.js +9 -3
  130. package/dist/utils/websearch/profile-hook-injector.js.map +1 -1
  131. package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
  132. package/dist/web-server/routes/settings-routes.js +13 -8
  133. package/dist/web-server/routes/settings-routes.js.map +1 -1
  134. package/lib/hooks/image-analyzer-transformer.cjs +880 -0
  135. package/lib/prompts/image-analysis-default.txt +12 -0
  136. package/lib/prompts/image-analysis-document.txt +13 -0
  137. package/lib/prompts/image-analysis-screenshot.txt +13 -0
  138. package/package.json +3 -2
  139. package/dist/ui/assets/auth-section-CdJfwuku.js +0 -1
  140. package/dist/ui/assets/backups-section-C1QbR4iU.js +0 -1
  141. package/dist/ui/assets/cliproxy-control-panel-C67g3-lG.js +0 -1
  142. package/dist/ui/assets/globalenv-section-DWvTHsju.js +0 -1
  143. package/dist/ui/assets/health-kyBi8s6g.js +0 -1
  144. package/dist/ui/assets/index-8_6THoWM.css +0 -1
  145. package/dist/ui/assets/index-Br2-kfvk.js +0 -1
  146. package/dist/ui/assets/index-CaHIXCeK.js +0 -1
  147. package/dist/ui/assets/index-DaeRFGpX.js +0 -1
  148. package/dist/ui/assets/proxy-status-widget-CRQnzDjM.js +0 -1
  149. package/dist/ui/assets/shared-CjMwFBIs.js +0 -1
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Image Analysis Hook Environment Variables
4
+ *
5
+ * Provides environment variables for image analysis hook configuration.
6
+ * Hook routes image/PDF files through CLIProxy for vision analysis.
7
+ *
8
+ * @module utils/hooks/image-analysis-hook-env
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.getImageAnalysisHookEnv = void 0;
12
+ const unified_config_loader_1 = require("../../config/unified-config-loader");
13
+ /**
14
+ * Serialize provider_models map to env var format: provider:model,provider:model
15
+ */
16
+ function serializeProviderModels(providerModels) {
17
+ return Object.entries(providerModels)
18
+ .map(([provider, model]) => `${provider}:${model}`)
19
+ .join(',');
20
+ }
21
+ /**
22
+ * Get image analysis hook environment variables.
23
+ * These env vars control the hook's behavior via Claude Code hook system.
24
+ *
25
+ * @param provider - Current CLIProxy provider (e.g., 'agy', 'gemini', 'codex')
26
+ * @returns Environment variables for image analysis hook
27
+ */
28
+ function getImageAnalysisHookEnv(provider) {
29
+ const config = (0, unified_config_loader_1.getImageAnalysisConfig)();
30
+ // Check if current provider has a vision model configured
31
+ const hasVisionModel = provider && config.provider_models[provider];
32
+ const skipImageAnalysis = !config.enabled || !hasVisionModel;
33
+ return {
34
+ CCS_IMAGE_ANALYSIS_ENABLED: config.enabled ? '1' : '0',
35
+ CCS_IMAGE_ANALYSIS_TIMEOUT: String(Number(config.timeout) || 60),
36
+ CCS_IMAGE_ANALYSIS_PROVIDER_MODELS: serializeProviderModels(config.provider_models),
37
+ CCS_CURRENT_PROVIDER: provider || '',
38
+ CCS_IMAGE_ANALYSIS_SKIP: skipImageAnalysis ? '1' : '0',
39
+ };
40
+ }
41
+ exports.getImageAnalysisHookEnv = getImageAnalysisHookEnv;
42
+ //# sourceMappingURL=get-image-analysis-hook-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-image-analysis-hook-env.js","sourceRoot":"","sources":["../../../src/utils/hooks/get-image-analysis-hook-env.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,8EAA4E;AAE5E;;GAEG;AACH,SAAS,uBAAuB,CAAC,cAAsC;IACrE,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,uBAAuB,CAAC,QAAiB;IACvD,MAAM,MAAM,GAAG,IAAA,8CAAsB,GAAE,CAAC;IAExC,0DAA0D;IAC1D,MAAM,cAAc,GAAG,QAAQ,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACpE,MAAM,iBAAiB,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC;IAE7D,OAAO;QACL,0BAA0B,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QACtD,0BAA0B,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChE,kCAAkC,EAAE,uBAAuB,CAAC,MAAM,CAAC,eAAe,CAAC;QACnF,oBAAoB,EAAE,QAAQ,IAAI,EAAE;QACpC,uBAAuB,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;KACvD,CAAC;AACJ,CAAC;AAdD,0DAcC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Image Analyzer Hook Configuration
3
+ *
4
+ * Manages hook configuration for image analysis in Claude settings.
5
+ *
6
+ * @module utils/hooks/image-analyzer-hook-config
7
+ */
8
+ /**
9
+ * Get path to image analyzer hook
10
+ */
11
+ export declare function getImageAnalyzerHookPath(): string;
12
+ /**
13
+ * Get hook config for settings.json injection
14
+ * Timeout includes buffer for CLI overhead
15
+ */
16
+ export declare function getImageAnalyzerHookConfig(): Record<string, unknown>;
17
+ //# sourceMappingURL=image-analyzer-hook-configuration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-analyzer-hook-configuration.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/image-analyzer-hook-configuration.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBpE"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ /**
3
+ * Image Analyzer Hook Configuration
4
+ *
5
+ * Manages hook configuration for image analysis in Claude settings.
6
+ *
7
+ * @module utils/hooks/image-analyzer-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.getImageAnalyzerHookConfig = exports.getImageAnalyzerHookPath = void 0;
34
+ const path = __importStar(require("path"));
35
+ const unified_config_loader_1 = require("../../config/unified-config-loader");
36
+ const config_manager_1 = require("../config-manager");
37
+ // Hook file name
38
+ const IMAGE_ANALYZER_HOOK = 'image-analyzer-transformer.cjs';
39
+ /**
40
+ * Get path to image analyzer hook
41
+ */
42
+ function getImageAnalyzerHookPath() {
43
+ return path.join((0, config_manager_1.getCcsHooksDir)(), IMAGE_ANALYZER_HOOK);
44
+ }
45
+ exports.getImageAnalyzerHookPath = getImageAnalyzerHookPath;
46
+ /**
47
+ * Get hook config for settings.json injection
48
+ * Timeout includes buffer for CLI overhead
49
+ */
50
+ function getImageAnalyzerHookConfig() {
51
+ const hookPath = getImageAnalyzerHookPath();
52
+ const imageConfig = (0, unified_config_loader_1.getImageAnalysisConfig)();
53
+ // Add 5 second buffer to analysis timeout for hook execution overhead
54
+ const hookTimeout = imageConfig.timeout * 1000 + 5000;
55
+ return {
56
+ PreToolUse: [
57
+ {
58
+ matcher: 'Read',
59
+ hooks: [
60
+ {
61
+ type: 'command',
62
+ command: `node "${hookPath}"`,
63
+ timeout: hookTimeout,
64
+ },
65
+ ],
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ exports.getImageAnalyzerHookConfig = getImageAnalyzerHookConfig;
71
+ //# sourceMappingURL=image-analyzer-hook-configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-analyzer-hook-configuration.js","sourceRoot":"","sources":["../../../src/utils/hooks/image-analyzer-hook-configuration.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,8EAA4E;AAC5E,sDAAmD;AAEnD,iBAAiB;AACjB,MAAM,mBAAmB,GAAG,gCAAgC,CAAC;AAE7D;;GAEG;AACH,SAAgB,wBAAwB;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,+BAAc,GAAE,EAAE,mBAAmB,CAAC,CAAC;AAC1D,CAAC;AAFD,4DAEC;AAED;;;GAGG;AACH,SAAgB,0BAA0B;IACxC,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAA,8CAAsB,GAAE,CAAC;IAE7C,sEAAsE;IACtE,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IAEtD,OAAO;QACL,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,SAAS,QAAQ,GAAG;wBAC7B,OAAO,EAAE,WAAW;qBACrB;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AArBD,gEAqBC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Image Analyzer Hook Installer
3
+ *
4
+ * Manages installation and uninstallation of the image analyzer hook.
5
+ * This hook intercepts Read tool calls and analyzes image files via CLIProxy.
6
+ *
7
+ * @module utils/hooks/image-analyzer-hook-installer
8
+ */
9
+ export { getImageAnalyzerHookPath, getImageAnalyzerHookConfig, } from './image-analyzer-hook-configuration';
10
+ /**
11
+ * Check if image analyzer hook is installed
12
+ */
13
+ export declare function hasImageAnalyzerHook(): boolean;
14
+ /**
15
+ * Install image analyzer hook to ~/.ccs/hooks/
16
+ *
17
+ * This hook intercepts Read calls and analyzes images via CLIProxy.
18
+ *
19
+ * @returns true if hook installed successfully
20
+ */
21
+ export declare function installImageAnalyzerHook(): boolean;
22
+ /**
23
+ * Uninstall image analyzer hook from ~/.ccs/hooks/
24
+ *
25
+ * Note: Does NOT touch global ~/.claude/settings.json.
26
+ * Profile-specific hooks are removed when ~/.ccs/ is deleted.
27
+ *
28
+ * @returns true if hook uninstalled successfully
29
+ */
30
+ export declare function uninstallImageAnalyzerHook(): boolean;
31
+ //# sourceMappingURL=image-analyzer-hook-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-analyzer-hook-installer.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/image-analyzer-hook-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qCAAqC,CAAC;AAK7C;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CA+DlD;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAwBpD"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Image Analyzer Hook Installer
4
+ *
5
+ * Manages installation and uninstallation of the image analyzer hook.
6
+ * This hook intercepts Read tool calls and analyzes image files via CLIProxy.
7
+ *
8
+ * @module utils/hooks/image-analyzer-hook-installer
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || function (mod) {
27
+ if (mod && mod.__esModule) return mod;
28
+ var result = {};
29
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
30
+ __setModuleDefault(result, mod);
31
+ return result;
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.uninstallImageAnalyzerHook = exports.installImageAnalyzerHook = exports.hasImageAnalyzerHook = exports.getImageAnalyzerHookConfig = exports.getImageAnalyzerHookPath = void 0;
35
+ const fs = __importStar(require("fs"));
36
+ const path = __importStar(require("path"));
37
+ const ui_1 = require("../ui");
38
+ const image_analyzer_hook_configuration_1 = require("./image-analyzer-hook-configuration");
39
+ const config_manager_1 = require("../config-manager");
40
+ const unified_config_loader_1 = require("../../config/unified-config-loader");
41
+ const image_analyzer_profile_hook_injector_1 = require("./image-analyzer-profile-hook-injector");
42
+ // Re-export from hook-configuration for backward compatibility
43
+ var image_analyzer_hook_configuration_2 = require("./image-analyzer-hook-configuration");
44
+ Object.defineProperty(exports, "getImageAnalyzerHookPath", { enumerable: true, get: function () { return image_analyzer_hook_configuration_2.getImageAnalyzerHookPath; } });
45
+ Object.defineProperty(exports, "getImageAnalyzerHookConfig", { enumerable: true, get: function () { return image_analyzer_hook_configuration_2.getImageAnalyzerHookConfig; } });
46
+ // Hook file name
47
+ const IMAGE_ANALYZER_HOOK = 'image-analyzer-transformer.cjs';
48
+ /**
49
+ * Check if image analyzer hook is installed
50
+ */
51
+ function hasImageAnalyzerHook() {
52
+ return fs.existsSync((0, image_analyzer_hook_configuration_1.getImageAnalyzerHookPath)());
53
+ }
54
+ exports.hasImageAnalyzerHook = hasImageAnalyzerHook;
55
+ /**
56
+ * Install image analyzer hook to ~/.ccs/hooks/
57
+ *
58
+ * This hook intercepts Read calls and analyzes images via CLIProxy.
59
+ *
60
+ * @returns true if hook installed successfully
61
+ */
62
+ function installImageAnalyzerHook() {
63
+ try {
64
+ const imageConfig = (0, unified_config_loader_1.getImageAnalysisConfig)();
65
+ // Skip if disabled
66
+ if (!imageConfig.enabled) {
67
+ if (process.env.CCS_DEBUG) {
68
+ console.error((0, ui_1.info)('Image analysis disabled - skipping hook install'));
69
+ }
70
+ return false;
71
+ }
72
+ // Ensure hooks directory exists
73
+ const hooksDir = (0, config_manager_1.getCcsHooksDir)();
74
+ if (!fs.existsSync(hooksDir)) {
75
+ fs.mkdirSync(hooksDir, { recursive: true, mode: 0o700 });
76
+ }
77
+ const hookPath = (0, image_analyzer_hook_configuration_1.getImageAnalyzerHookPath)();
78
+ // Find the bundled hook script
79
+ // In npm package: node_modules/ccs/lib/hooks/
80
+ // In development: lib/hooks/
81
+ const possiblePaths = [
82
+ path.join(__dirname, '..', '..', '..', 'lib', 'hooks', IMAGE_ANALYZER_HOOK),
83
+ path.join(__dirname, '..', '..', 'lib', 'hooks', IMAGE_ANALYZER_HOOK),
84
+ path.join(__dirname, '..', 'lib', 'hooks', IMAGE_ANALYZER_HOOK),
85
+ ];
86
+ let sourcePath = null;
87
+ for (const p of possiblePaths) {
88
+ if (fs.existsSync(p)) {
89
+ sourcePath = p;
90
+ break;
91
+ }
92
+ }
93
+ if (!sourcePath) {
94
+ if (process.env.CCS_DEBUG) {
95
+ console.error((0, ui_1.warn)(`Image analyzer hook source not found: ${IMAGE_ANALYZER_HOOK}`));
96
+ }
97
+ return false;
98
+ }
99
+ // Copy hook to ~/.ccs/hooks/
100
+ fs.copyFileSync(sourcePath, hookPath);
101
+ fs.chmodSync(hookPath, 0o755);
102
+ if (process.env.CCS_DEBUG) {
103
+ console.error((0, ui_1.info)(`Installed image analyzer hook: ${hookPath}`));
104
+ }
105
+ // Note: Hook registration is handled by ensureProfileHooks() in image-analyzer-profile-injector.ts
106
+ // which writes to per-profile settings (~/.ccs/<profile>.settings.json)
107
+ // Global settings (~/.claude/settings.json) are NOT modified here
108
+ return true;
109
+ }
110
+ catch (error) {
111
+ if (process.env.CCS_DEBUG) {
112
+ console.error((0, ui_1.warn)(`Failed to install image analyzer hook: ${error.message}`));
113
+ }
114
+ return false;
115
+ }
116
+ }
117
+ exports.installImageAnalyzerHook = installImageAnalyzerHook;
118
+ /**
119
+ * Uninstall image analyzer hook from ~/.ccs/hooks/
120
+ *
121
+ * Note: Does NOT touch global ~/.claude/settings.json.
122
+ * Profile-specific hooks are removed when ~/.ccs/ is deleted.
123
+ *
124
+ * @returns true if hook uninstalled successfully
125
+ */
126
+ function uninstallImageAnalyzerHook() {
127
+ try {
128
+ const hookPath = (0, image_analyzer_hook_configuration_1.getImageAnalyzerHookPath)();
129
+ if (fs.existsSync(hookPath)) {
130
+ fs.unlinkSync(hookPath);
131
+ if (process.env.CCS_DEBUG) {
132
+ console.error((0, ui_1.info)(`Uninstalled image analyzer hook: ${hookPath}`));
133
+ }
134
+ }
135
+ // Remove migration marker (so fresh install re-runs migration)
136
+ (0, image_analyzer_profile_hook_injector_1.removeMigrationMarker)();
137
+ // Note: Do NOT call removeHookConfig() - global settings should not be touched.
138
+ // Per-profile hooks in ~/.ccs/*.settings.json are cleaned up when ~/.ccs/ is deleted.
139
+ return true;
140
+ }
141
+ catch (error) {
142
+ if (process.env.CCS_DEBUG) {
143
+ console.error((0, ui_1.warn)(`Failed to uninstall image analyzer hook: ${error.message}`));
144
+ }
145
+ return false;
146
+ }
147
+ }
148
+ exports.uninstallImageAnalyzerHook = uninstallImageAnalyzerHook;
149
+ //# sourceMappingURL=image-analyzer-hook-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-analyzer-hook-installer.js","sourceRoot":"","sources":["../../../src/utils/hooks/image-analyzer-hook-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Image Analyzer Profile Hook Injector
3
+ *
4
+ * Injects image analyzer hooks into per-profile settings files.
5
+ * This replaces the global ~/.claude/settings.json approach.
6
+ *
7
+ * Injects for profiles configured in image_analysis.provider_models.
8
+ *
9
+ * @module utils/hooks/image-analyzer-profile-injector
10
+ */
11
+ /**
12
+ * Ensure image analyzer hook is configured in profile's settings file
13
+ *
14
+ * Only injects for CLIProxy profiles with vision support (agy, gemini).
15
+ *
16
+ * @param profileName - Name of the profile (e.g., 'agy', 'gemini')
17
+ * @returns true if hook is configured (existing or newly added)
18
+ */
19
+ export declare function ensureProfileHooks(profileName: string): boolean;
20
+ /**
21
+ * Remove migration marker (called during uninstall)
22
+ */
23
+ export declare function removeMigrationMarker(): void;
24
+ //# sourceMappingURL=image-analyzer-profile-hook-injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-analyzer-profile-hook-injector.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/image-analyzer-profile-hook-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqEH;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CA0F/D;AA+DD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAW5C"}
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ /**
3
+ * Image Analyzer Profile Hook Injector
4
+ *
5
+ * Injects image analyzer hooks into per-profile settings files.
6
+ * This replaces the global ~/.claude/settings.json approach.
7
+ *
8
+ * Injects for profiles configured in image_analysis.provider_models.
9
+ *
10
+ * @module utils/hooks/image-analyzer-profile-injector
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.removeMigrationMarker = exports.ensureProfileHooks = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const ui_1 = require("../ui");
40
+ const image_analyzer_hook_configuration_1 = require("./image-analyzer-hook-configuration");
41
+ const unified_config_loader_1 = require("../../config/unified-config-loader");
42
+ const config_manager_1 = require("../config-manager");
43
+ // Valid profile name pattern (alphanumeric, dash, underscore only)
44
+ const VALID_PROFILE_NAME = /^[a-zA-Z0-9_-]+$/;
45
+ /**
46
+ * Get migration marker path (respects CCS_HOME for test isolation)
47
+ */
48
+ function getMigrationMarkerPath() {
49
+ return path.join((0, config_manager_1.getCcsDir)(), '.image-analyzer-hook-migrated');
50
+ }
51
+ /**
52
+ * Check if CCS image analyzer hook exists in settings
53
+ */
54
+ function hasCcsHook(settings) {
55
+ const hooks = settings.hooks;
56
+ if (!hooks?.PreToolUse)
57
+ return false;
58
+ return hooks.PreToolUse.some((h) => {
59
+ const hook = h;
60
+ if (hook.matcher !== 'Read')
61
+ return false;
62
+ const hookArray = hook.hooks;
63
+ const command = hookArray?.[0]?.command;
64
+ if (typeof command !== 'string')
65
+ return false;
66
+ const normalized = command
67
+ .replace(/\\/g, '/') // Windows backslashes
68
+ .replace(/\/+/g, '/'); // Collapse multiple slashes
69
+ return normalized.includes('.ccs/hooks/image-analyzer-transformer');
70
+ });
71
+ }
72
+ /**
73
+ * One-time migration marker management
74
+ */
75
+ function migrateGlobalHook() {
76
+ const markerPath = getMigrationMarkerPath();
77
+ if (fs.existsSync(markerPath)) {
78
+ return; // Already migrated
79
+ }
80
+ try {
81
+ // No global hook to migrate (image analyzer is profile-only from the start)
82
+ // Just create marker to prevent future migration attempts
83
+ const ccsDir = (0, config_manager_1.getCcsDir)();
84
+ if (!fs.existsSync(ccsDir)) {
85
+ fs.mkdirSync(ccsDir, { recursive: true, mode: 0o700 });
86
+ }
87
+ // Create marker file atomically (wx = fail if exists, prevents race condition)
88
+ fs.writeFileSync(markerPath, new Date().toISOString(), { encoding: 'utf8', flag: 'wx' });
89
+ }
90
+ catch (error) {
91
+ if (process.env.CCS_DEBUG) {
92
+ console.error((0, ui_1.warn)(`Migration failed: ${error.message}`));
93
+ }
94
+ }
95
+ }
96
+ /**
97
+ * Ensure image analyzer hook is configured in profile's settings file
98
+ *
99
+ * Only injects for CLIProxy profiles with vision support (agy, gemini).
100
+ *
101
+ * @param profileName - Name of the profile (e.g., 'agy', 'gemini')
102
+ * @returns true if hook is configured (existing or newly added)
103
+ */
104
+ function ensureProfileHooks(profileName) {
105
+ try {
106
+ // Validate profile name to prevent path traversal
107
+ if (!VALID_PROFILE_NAME.test(profileName)) {
108
+ if (process.env.CCS_DEBUG) {
109
+ console.error((0, ui_1.warn)(`Invalid profile name: ${profileName}`));
110
+ }
111
+ return false;
112
+ }
113
+ const imageConfig = (0, unified_config_loader_1.getImageAnalysisConfig)();
114
+ // Only inject for profiles that have a model mapping in provider_models
115
+ // This allows dynamic extension without hardcoding profile names
116
+ const configuredProviders = Object.keys(imageConfig.provider_models);
117
+ if (!configuredProviders.includes(profileName)) {
118
+ return false;
119
+ }
120
+ // Skip if image analysis is disabled
121
+ if (!imageConfig.enabled) {
122
+ return false;
123
+ }
124
+ // One-time migration marker
125
+ migrateGlobalHook();
126
+ // Get CCS directory (respects CCS_HOME for test isolation)
127
+ const ccsDir = (0, config_manager_1.getCcsDir)();
128
+ // Ensure CCS dir exists
129
+ if (!fs.existsSync(ccsDir)) {
130
+ fs.mkdirSync(ccsDir, { recursive: true, mode: 0o700 });
131
+ }
132
+ const settingsPath = path.join(ccsDir, `${profileName}.settings.json`);
133
+ // Read existing settings or create empty
134
+ let settings = {};
135
+ if (fs.existsSync(settingsPath)) {
136
+ try {
137
+ const content = fs.readFileSync(settingsPath, 'utf8');
138
+ settings = JSON.parse(content);
139
+ }
140
+ catch (parseError) {
141
+ if (process.env.CCS_DEBUG) {
142
+ console.error((0, ui_1.warn)(`Malformed ${profileName}.settings.json: ${parseError.message}`));
143
+ }
144
+ // Continue with empty settings, will add hooks
145
+ }
146
+ }
147
+ // Check if CCS hook already present
148
+ if (hasCcsHook(settings)) {
149
+ // Update timeout if needed
150
+ return updateHookTimeoutIfNeeded(settings, settingsPath);
151
+ }
152
+ // Get hook config
153
+ const hookConfig = (0, image_analyzer_hook_configuration_1.getImageAnalyzerHookConfig)();
154
+ // Ensure hooks structure exists
155
+ if (!settings.hooks) {
156
+ settings.hooks = {};
157
+ }
158
+ const settingsHooks = settings.hooks;
159
+ if (!settingsHooks.PreToolUse) {
160
+ settingsHooks.PreToolUse = [];
161
+ }
162
+ // Add CCS hook
163
+ const preToolUseHooks = hookConfig.PreToolUse;
164
+ settingsHooks.PreToolUse.push(...preToolUseHooks);
165
+ // Write updated settings
166
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
167
+ if (process.env.CCS_DEBUG) {
168
+ console.error((0, ui_1.info)(`Added image analyzer hook to ${profileName}.settings.json`));
169
+ }
170
+ return true;
171
+ }
172
+ catch (error) {
173
+ if (process.env.CCS_DEBUG) {
174
+ console.error((0, ui_1.warn)(`Failed to inject hook: ${error.message}`));
175
+ }
176
+ return false;
177
+ }
178
+ }
179
+ exports.ensureProfileHooks = ensureProfileHooks;
180
+ /**
181
+ * Update hook timeout if it differs from current config
182
+ */
183
+ function updateHookTimeoutIfNeeded(settings, settingsPath) {
184
+ try {
185
+ const hooks = settings.hooks;
186
+ const hookConfig = (0, image_analyzer_hook_configuration_1.getImageAnalyzerHookConfig)();
187
+ const expectedHookPath = (0, image_analyzer_hook_configuration_1.getImageAnalyzerHookPath)();
188
+ const expectedCommand = `node "${expectedHookPath}"`;
189
+ const expectedHooks = hookConfig.PreToolUse[0]
190
+ .hooks;
191
+ const expectedTimeout = expectedHooks[0].timeout;
192
+ let needsUpdate = false;
193
+ for (const h of hooks.PreToolUse) {
194
+ const hook = h;
195
+ if (hook.matcher !== 'Read')
196
+ continue;
197
+ const hookArray = hook.hooks;
198
+ if (!hookArray?.[0]?.command)
199
+ continue;
200
+ const command = hookArray[0].command;
201
+ if (typeof command !== 'string')
202
+ continue;
203
+ // Normalize path separators for cross-platform matching (Windows uses backslashes)
204
+ const normalizedCommand = command
205
+ .replace(/\\/g, '/') // Windows backslashes
206
+ .replace(/\/+/g, '/'); // Collapse multiple slashes
207
+ if (!normalizedCommand.includes('.ccs/hooks/image-analyzer-transformer'))
208
+ continue;
209
+ // Found CCS hook - check if needs update
210
+ if (hookArray[0].command !== expectedCommand) {
211
+ hookArray[0].command = expectedCommand;
212
+ needsUpdate = true;
213
+ }
214
+ if (hookArray[0].timeout !== expectedTimeout) {
215
+ hookArray[0].timeout = expectedTimeout;
216
+ needsUpdate = true;
217
+ }
218
+ }
219
+ if (needsUpdate) {
220
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
221
+ if (process.env.CCS_DEBUG) {
222
+ console.error((0, ui_1.info)('Updated image analyzer hook timeout in profile settings'));
223
+ }
224
+ }
225
+ return true;
226
+ }
227
+ catch (error) {
228
+ if (process.env.CCS_DEBUG) {
229
+ console.error((0, ui_1.warn)(`updateHookTimeoutIfNeeded failed: ${error.message}`));
230
+ }
231
+ return false;
232
+ }
233
+ }
234
+ /**
235
+ * Remove migration marker (called during uninstall)
236
+ */
237
+ function removeMigrationMarker() {
238
+ try {
239
+ const markerPath = getMigrationMarkerPath();
240
+ if (fs.existsSync(markerPath)) {
241
+ fs.unlinkSync(markerPath);
242
+ }
243
+ }
244
+ catch (error) {
245
+ if (process.env.CCS_DEBUG) {
246
+ console.error((0, ui_1.warn)(`removeMigrationMarker failed: ${error.message}`));
247
+ }
248
+ }
249
+ }
250
+ exports.removeMigrationMarker = removeMigrationMarker;
251
+ //# sourceMappingURL=image-analyzer-profile-hook-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-analyzer-profile-hook-injector.js","sourceRoot":"","sources":["../../../src/utils/hooks/image-analyzer-profile-hook-injector.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,8BAAmC;AACnC,2FAG6C;AAC7C,8EAA4E;AAC5E,sDAA8C;AAE9C,mEAAmE;AACnE,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAE9C;;GAEG;AACH,SAAS,sBAAsB;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,0BAAS,GAAE,EAAE,+BAA+B,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAiC;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAA8C,CAAC;IACtE,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,KAAK,CAAC;IAErC,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,CAA4B,CAAC;QAC1C,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAmD,CAAC;QAC3E,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACxC,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE9C,MAAM,UAAU,GAAG,OAAO;aACvB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,sBAAsB;aAC1C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;QACrD,OAAO,UAAU,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,MAAM,UAAU,GAAG,sBAAsB,EAAE,CAAC;IAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,mBAAmB;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,4EAA4E;QAC5E,0DAA0D;QAC1D,MAAM,MAAM,GAAG,IAAA,0BAAS,GAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,+EAA+E;QAC/E,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,SAAI,EAAC,qBAAsB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,kDAAkD;QAClD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,SAAI,EAAC,yBAAyB,WAAW,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,IAAA,8CAAsB,GAAE,CAAC;QAE7C,wEAAwE;QACxE,iEAAiE;QACjE,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QACrE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,4BAA4B;QAC5B,iBAAiB,EAAE,CAAC;QAEpB,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAA,0BAAS,GAAE,CAAC;QAE3B,wBAAwB;QACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,gBAAgB,CAAC,CAAC;QAEvE,yCAAyC;QACzC,IAAI,QAAQ,GAA4B,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBACtD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;oBAC1B,OAAO,CAAC,KAAK,CACX,IAAA,SAAI,EAAC,aAAa,WAAW,mBAAoB,UAAoB,CAAC,OAAO,EAAE,CAAC,CACjF,CAAC;gBACJ,CAAC;gBACD,+CAA+C;YACjD,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,2BAA2B;YAC3B,OAAO,yBAAyB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC3D,CAAC;QAED,kBAAkB;QAClB,MAAM,UAAU,GAAG,IAAA,8DAA0B,GAAE,CAAC;QAEhD,gCAAgC;QAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;QACtB,CAAC;QAED,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAkC,CAAC;QAClE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YAC9B,aAAa,CAAC,UAAU,GAAG,EAAE,CAAC;QAChC,CAAC;QAED,eAAe;QACf,MAAM,eAAe,GAAG,UAAU,CAAC,UAAuB,CAAC;QAC3D,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QAElD,yBAAyB;QACzB,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE1E,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,SAAI,EAAC,gCAAgC,WAAW,gBAAgB,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,SAAI,EAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AA1FD,gDA0FC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAChC,QAAiC,EACjC,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAkC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAA,8DAA0B,GAAE,CAAC;QAChD,MAAM,gBAAgB,GAAG,IAAA,4DAAwB,GAAE,CAAC;QACpD,MAAM,eAAe,GAAG,SAAS,gBAAgB,GAAG,CAAC;QACrD,MAAM,aAAa,GAAI,UAAU,CAAC,UAA6C,CAAC,CAAC,CAAC;aAC/E,KAAuC,CAAC;QAC3C,MAAM,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,OAAiB,CAAC;QAE3D,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,CAA4B,CAAC;YAC1C,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM;gBAAE,SAAS;YAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAuC,CAAC;YAC/D,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO;gBAAE,SAAS;YAEvC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACrC,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,SAAS;YAC1C,mFAAmF;YACnF,MAAM,iBAAiB,GAAG,OAAO;iBAC9B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,sBAAsB;iBAC1C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;YACrD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,uCAAuC,CAAC;gBAAE,SAAS;YAEnF,yCAAyC;YACzC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;gBAC7C,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,eAAe,CAAC;gBACvC,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YAED,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;gBAC7C,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,eAAe,CAAC;gBACvC,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,SAAI,EAAC,yDAAyD,CAAC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,SAAI,EAAC,qCAAsC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB;IACnC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,sBAAsB,EAAE,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,IAAA,SAAI,EAAC,iCAAkC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;AACH,CAAC;AAXD,sDAWC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hooks Utilities Index
3
+ *
4
+ * Centralized exports for all hook-related utilities.
5
+ *
6
+ * @module utils/hooks
7
+ */
8
+ export { getImageAnalysisHookEnv } from './get-image-analysis-hook-env';
9
+ export { getImageAnalyzerHookPath, getImageAnalyzerHookConfig, hasImageAnalyzerHook, installImageAnalyzerHook, uninstallImageAnalyzerHook, } from './image-analyzer-hook-installer';
10
+ export { ensureProfileHooks as ensureImageAnalyzerProfileHooks } from './image-analyzer-profile-hook-injector';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,kBAAkB,IAAI,+BAA+B,EAAE,MAAM,wCAAwC,CAAC"}