@kaitranntt/ccs 7.63.0-dev.9 → 7.63.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 (166) hide show
  1. package/README.md +3 -10
  2. package/dist/api/services/profile-lifecycle-service.js +4 -4
  3. package/dist/api/services/profile-lifecycle-service.js.map +1 -1
  4. package/dist/api/services/profile-writer.d.ts.map +1 -1
  5. package/dist/api/services/profile-writer.js +5 -3
  6. package/dist/api/services/profile-writer.js.map +1 -1
  7. package/dist/ccs.js +9 -21
  8. package/dist/ccs.js.map +1 -1
  9. package/dist/cliproxy/accounts/query.d.ts.map +1 -1
  10. package/dist/cliproxy/accounts/query.js +8 -15
  11. package/dist/cliproxy/accounts/query.js.map +1 -1
  12. package/dist/cliproxy/accounts/registry.d.ts +0 -6
  13. package/dist/cliproxy/accounts/registry.d.ts.map +1 -1
  14. package/dist/cliproxy/accounts/registry.js +42 -136
  15. package/dist/cliproxy/accounts/registry.js.map +1 -1
  16. package/dist/cliproxy/auth/token-manager.d.ts.map +1 -1
  17. package/dist/cliproxy/auth/token-manager.js +11 -45
  18. package/dist/cliproxy/auth/token-manager.js.map +1 -1
  19. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  20. package/dist/cliproxy/executor/index.js +12 -25
  21. package/dist/cliproxy/executor/index.js.map +1 -1
  22. package/dist/cliproxy/quota-fetcher-codex.d.ts +3 -0
  23. package/dist/cliproxy/quota-fetcher-codex.d.ts.map +1 -1
  24. package/dist/cliproxy/quota-fetcher-codex.js +17 -46
  25. package/dist/cliproxy/quota-fetcher-codex.js.map +1 -1
  26. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
  27. package/dist/cliproxy/services/variant-settings.js +6 -4
  28. package/dist/cliproxy/services/variant-settings.js.map +1 -1
  29. package/dist/cliproxy/stats-transformer.d.ts.map +1 -1
  30. package/dist/cliproxy/stats-transformer.js +3 -26
  31. package/dist/cliproxy/stats-transformer.js.map +1 -1
  32. package/dist/commands/cliproxy/quota-subcommand.d.ts.map +1 -1
  33. package/dist/commands/cliproxy/quota-subcommand.js +22 -25
  34. package/dist/commands/cliproxy/quota-subcommand.js.map +1 -1
  35. package/dist/commands/cliproxy/variant-subcommand.d.ts.map +1 -1
  36. package/dist/commands/cliproxy/variant-subcommand.js +6 -14
  37. package/dist/commands/cliproxy/variant-subcommand.js.map +1 -1
  38. package/dist/commands/install-command.d.ts.map +1 -1
  39. package/dist/commands/install-command.js +2 -8
  40. package/dist/commands/install-command.js.map +1 -1
  41. package/dist/copilot/copilot-executor.d.ts.map +1 -1
  42. package/dist/copilot/copilot-executor.js +2 -11
  43. package/dist/copilot/copilot-executor.js.map +1 -1
  44. package/dist/delegation/executor/result-aggregator.d.ts +1 -2
  45. package/dist/delegation/executor/result-aggregator.d.ts.map +1 -1
  46. package/dist/delegation/executor/result-aggregator.js +1 -21
  47. package/dist/delegation/executor/result-aggregator.js.map +1 -1
  48. package/dist/delegation/executor/types.d.ts +0 -6
  49. package/dist/delegation/executor/types.d.ts.map +1 -1
  50. package/dist/delegation/headless-executor.d.ts.map +1 -1
  51. package/dist/delegation/headless-executor.js +4 -69
  52. package/dist/delegation/headless-executor.js.map +1 -1
  53. package/dist/management/instance-manager.d.ts +1 -1
  54. package/dist/management/instance-manager.d.ts.map +1 -1
  55. package/dist/management/instance-manager.js +2 -10
  56. package/dist/management/instance-manager.js.map +1 -1
  57. package/dist/targets/codex-adapter.d.ts.map +1 -1
  58. package/dist/targets/codex-adapter.js +3 -78
  59. package/dist/targets/codex-adapter.js.map +1 -1
  60. package/dist/targets/codex-detector.d.ts.map +1 -1
  61. package/dist/targets/codex-detector.js +7 -28
  62. package/dist/targets/codex-detector.js.map +1 -1
  63. package/dist/ui/assets/{accounts-D0UZf0nz.js → accounts-DkxZnPJE.js} +1 -1
  64. package/dist/ui/assets/{alert-dialog-Da7R-FpD.js → alert-dialog-CiYMglgR.js} +1 -1
  65. package/dist/ui/assets/{api-DpKfrsn2.js → api-DaOtMRT4.js} +2 -2
  66. package/dist/ui/assets/{auth-section-CH2_H6xn.js → auth-section-BMaKBRA_.js} +1 -1
  67. package/dist/ui/assets/{backups-section-C0k3svHF.js → backups-section-DOpSADoH.js} +1 -1
  68. package/dist/ui/assets/{channels-Cpxagv1M.js → channels-zDFV-BlC.js} +1 -1
  69. package/dist/ui/assets/{checkbox-B_ZY6YZW.js → checkbox-Cb5AZBZL.js} +1 -1
  70. package/dist/ui/assets/{claude-extension-CSnMQC_L.js → claude-extension-B5RngGem.js} +1 -1
  71. package/dist/ui/assets/cliproxy-VYe0Qov1.js +3 -0
  72. package/dist/ui/assets/{cliproxy-ai-providers-DdQZEqoN.js → cliproxy-ai-providers-DVaaS-CT.js} +1 -1
  73. package/dist/ui/assets/cliproxy-control-panel-FVIQcFti.js +1 -0
  74. package/dist/ui/assets/{codex-xj_XJVjB.js → codex-D2yIwOs4.js} +13 -13
  75. package/dist/ui/assets/{confirm-dialog-tjayxZcM.js → confirm-dialog-B9vRgowr.js} +1 -1
  76. package/dist/ui/assets/{copilot-DQ5Dr5Ff.js → copilot-HvsOp6hu.js} +2 -2
  77. package/dist/ui/assets/{cursor-DtFjK37Z.js → cursor-C1XOjAWS.js} +1 -1
  78. package/dist/ui/assets/{droid-C4qduLWT.js → droid-DshEfT1H.js} +1 -1
  79. package/dist/ui/assets/{globalenv-section-B2YBzWoz.js → globalenv-section-CmcMkb6z.js} +1 -1
  80. package/dist/ui/assets/{health-ocBJ9xoH.js → health-CE0VQs6K.js} +1 -1
  81. package/dist/ui/assets/{icons-Cn04FDSc.js → icons-EMBHZkGo.js} +1 -1
  82. package/dist/ui/assets/index-6dNBcNC3.js +1 -0
  83. package/dist/ui/assets/index-BAuT6yuc.css +1 -0
  84. package/dist/ui/assets/{index-9Qv0NQVB.js → index-CesVGA6m.js} +1 -1
  85. package/dist/ui/assets/{index-1TKCj6WA.js → index-CmKclBR1.js} +1 -1
  86. package/dist/ui/assets/{index-C9UUemEw.js → index-CmtSgCxo.js} +1 -1
  87. package/dist/ui/assets/{index-B3D2Pi4S.js → index-DAtuJuGe.js} +35 -35
  88. package/dist/ui/assets/{masked-input-XGpOJSYQ.js → masked-input-B2tcbvAj.js} +1 -1
  89. package/dist/ui/assets/{proxy-status-widget-DwizqfDs.js → proxy-status-widget-BnJD49TF.js} +1 -1
  90. package/dist/ui/assets/{raw-json-settings-editor-panel-DLf0iq8r.js → raw-json-settings-editor-panel-DnUbq1__.js} +1 -1
  91. package/dist/ui/assets/{searchable-select-C2N5ZoC7.js → searchable-select-ULayr5K1.js} +1 -1
  92. package/dist/ui/assets/{separator-CuY8SIhQ.js → separator--ZH5ZM-3.js} +1 -1
  93. package/dist/ui/assets/shared-qizFb9Ye.js +8 -0
  94. package/dist/ui/assets/{switch-Dz4ptkeA.js → switch-DmDIWykO.js} +1 -1
  95. package/dist/ui/assets/{table-CkgTbRUO.js → table-E5IxHhrW.js} +1 -1
  96. package/dist/ui/assets/tanstack-B8i0evp-.js +4 -0
  97. package/dist/ui/assets/updates-2Uu4Mgtg.js +1 -0
  98. package/dist/ui/index.html +4 -4
  99. package/dist/utils/claude-config-path.d.ts +0 -2
  100. package/dist/utils/claude-config-path.d.ts.map +1 -1
  101. package/dist/utils/claude-config-path.js +1 -6
  102. package/dist/utils/claude-config-path.js.map +1 -1
  103. package/dist/utils/websearch/hook-env.d.ts.map +1 -1
  104. package/dist/utils/websearch/hook-env.js +0 -8
  105. package/dist/utils/websearch/hook-env.js.map +1 -1
  106. package/dist/utils/websearch/hook-installer.d.ts +2 -3
  107. package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
  108. package/dist/utils/websearch/hook-installer.js +2 -3
  109. package/dist/utils/websearch/hook-installer.js.map +1 -1
  110. package/dist/utils/websearch/index.d.ts +0 -3
  111. package/dist/utils/websearch/index.d.ts.map +1 -1
  112. package/dist/utils/websearch/index.js +2 -23
  113. package/dist/utils/websearch/index.js.map +1 -1
  114. package/dist/utils/websearch/profile-hook-injector.d.ts +3 -5
  115. package/dist/utils/websearch/profile-hook-injector.d.ts.map +1 -1
  116. package/dist/utils/websearch/profile-hook-injector.js +3 -5
  117. package/dist/utils/websearch/profile-hook-injector.js.map +1 -1
  118. package/dist/utils/websearch/status.d.ts.map +1 -1
  119. package/dist/utils/websearch/status.js +1 -67
  120. package/dist/utils/websearch/status.js.map +1 -1
  121. package/dist/utils/websearch-manager.d.ts +11 -11
  122. package/dist/utils/websearch-manager.d.ts.map +1 -1
  123. package/dist/utils/websearch-manager.js +17 -32
  124. package/dist/utils/websearch-manager.js.map +1 -1
  125. package/dist/web-server/index.d.ts.map +1 -1
  126. package/dist/web-server/index.js +0 -3
  127. package/dist/web-server/index.js.map +1 -1
  128. package/dist/web-server/routes/account-routes.d.ts.map +1 -1
  129. package/dist/web-server/routes/account-routes.js +1 -2
  130. package/dist/web-server/routes/account-routes.js.map +1 -1
  131. package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -1
  132. package/dist/web-server/routes/cliproxy-auth-routes.js +1 -1
  133. package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -1
  134. package/dist/web-server/services/codex-dashboard-service.d.ts.map +1 -1
  135. package/dist/web-server/services/codex-dashboard-service.js +8 -13
  136. package/dist/web-server/services/codex-dashboard-service.js.map +1 -1
  137. package/lib/hooks/websearch-transformer.cjs +96 -660
  138. package/package.json +1 -2
  139. package/dist/cliproxy/accounts/email-account-identity.d.ts +0 -12
  140. package/dist/cliproxy/accounts/email-account-identity.d.ts.map +0 -1
  141. package/dist/cliproxy/accounts/email-account-identity.js +0 -124
  142. package/dist/cliproxy/accounts/email-account-identity.js.map +0 -1
  143. package/dist/ui/assets/cliproxy-D9B-TLY3.js +0 -3
  144. package/dist/ui/assets/cliproxy-control-panel-3Glps_oU.js +0 -1
  145. package/dist/ui/assets/index-BkXZkwWB.js +0 -1
  146. package/dist/ui/assets/index-DGQOg_8Q.css +0 -1
  147. package/dist/ui/assets/shared-CbpV9mUS.js +0 -8
  148. package/dist/ui/assets/tanstack-CkjseTWE.js +0 -4
  149. package/dist/ui/assets/updates-HsQEuJIR.js +0 -1
  150. package/dist/utils/websearch/claude-tool-args.d.ts +0 -5
  151. package/dist/utils/websearch/claude-tool-args.d.ts.map +0 -1
  152. package/dist/utils/websearch/claude-tool-args.js +0 -125
  153. package/dist/utils/websearch/claude-tool-args.js.map +0 -1
  154. package/dist/utils/websearch/mcp-installer.d.ts +0 -14
  155. package/dist/utils/websearch/mcp-installer.d.ts.map +0 -1
  156. package/dist/utils/websearch/mcp-installer.js +0 -351
  157. package/dist/utils/websearch/mcp-installer.js.map +0 -1
  158. package/dist/utils/websearch/trace.d.ts +0 -23
  159. package/dist/utils/websearch/trace.d.ts.map +0 -1
  160. package/dist/utils/websearch/trace.js +0 -206
  161. package/dist/utils/websearch/trace.js.map +0 -1
  162. package/dist/web-server/routes/cliproxy-local-proxy.d.ts +0 -20
  163. package/dist/web-server/routes/cliproxy-local-proxy.d.ts.map +0 -1
  164. package/dist/web-server/routes/cliproxy-local-proxy.js +0 -117
  165. package/dist/web-server/routes/cliproxy-local-proxy.js.map +0 -1
  166. package/lib/mcp/ccs-websearch-server.cjs +0 -339
@@ -1,117 +0,0 @@
1
- "use strict";
2
- /**
3
- * CLIProxy Local Reverse Proxy
4
- *
5
- * Proxies requests from the dashboard to the local CLIProxy service
6
- * running on 127.0.0.1 inside the same host/container.
7
- *
8
- * Mounted at: /api/cliproxy-local/* -> http://127.0.0.1:{port}/*
9
- */
10
- var __importDefault = (this && this.__importDefault) || function (mod) {
11
- return (mod && mod.__esModule) ? mod : { "default": mod };
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.createCliproxyLocalProxyRouter = void 0;
15
- const http_1 = __importDefault(require("http"));
16
- const express_1 = require("express");
17
- const port_manager_1 = require("../../cliproxy/config/port-manager");
18
- const unified_config_loader_1 = require("../../config/unified-config-loader");
19
- const auth_middleware_1 = require("../middleware/auth-middleware");
20
- /** Proxy request timeout in milliseconds (30 seconds) */
21
- const PROXY_TIMEOUT_MS = 30000;
22
- function resolveLocalCliproxyPort() {
23
- try {
24
- const config = (0, unified_config_loader_1.loadOrCreateUnifiedConfig)();
25
- return (0, port_manager_1.validatePort)(config.cliproxy_server?.local?.port ?? port_manager_1.CLIPROXY_DEFAULT_PORT);
26
- }
27
- catch {
28
- return port_manager_1.CLIPROXY_DEFAULT_PORT;
29
- }
30
- }
31
- function isJsonContentType(contentType) {
32
- const values = Array.isArray(contentType) ? contentType : [contentType];
33
- return values.some((value) => value?.toLowerCase().includes('application/json') === true);
34
- }
35
- function buildProxyBody(req) {
36
- // If express.json() parsed the body (content-type is JSON and req.body is populated),
37
- // re-serialize it since the original request stream was consumed by the middleware.
38
- if (!isJsonContentType(req.headers['content-type']) ||
39
- req.body === undefined ||
40
- req.body === null) {
41
- return undefined;
42
- }
43
- // express.json() sets req.body to the parsed value — re-serialize for the proxy target
44
- return Buffer.from(JSON.stringify(req.body));
45
- }
46
- function buildProxyHeaders(headers, port, bodyBuffer) {
47
- const proxyHeaders = {
48
- ...headers,
49
- host: `127.0.0.1:${port}`,
50
- };
51
- delete proxyHeaders.connection;
52
- if (bodyBuffer) {
53
- delete proxyHeaders['transfer-encoding'];
54
- proxyHeaders['content-length'] = String(bodyBuffer.length);
55
- }
56
- return proxyHeaders;
57
- }
58
- function createCliproxyLocalProxyRouter(deps = {}) {
59
- const router = (0, express_1.Router)();
60
- const enforceAccess = deps.enforceAccess ??
61
- ((req, res) => (0, auth_middleware_1.requireLocalAccessWhenAuthDisabled)(req, res, 'CLIProxy local proxy requires localhost access when dashboard auth is disabled.'));
62
- const createRequest = deps.request ?? http_1.default.request;
63
- const resolveTargetPort = deps.resolveTargetPort ?? resolveLocalCliproxyPort;
64
- router.use((req, res, next) => {
65
- if (enforceAccess(req, res)) {
66
- next();
67
- }
68
- });
69
- router.all('/*', (req, res) => {
70
- const targetPort = resolveTargetPort();
71
- const targetPath = req.url || '/';
72
- const bodyBuffer = buildProxyBody(req);
73
- const proxyReq = createRequest({
74
- hostname: '127.0.0.1',
75
- port: targetPort,
76
- path: targetPath,
77
- method: req.method,
78
- headers: buildProxyHeaders(req.headers, targetPort, bodyBuffer),
79
- timeout: PROXY_TIMEOUT_MS,
80
- }, (proxyRes) => {
81
- res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);
82
- // Manual streaming instead of pipe() for Bun runtime compatibility
83
- proxyRes.on('data', (chunk) => res.write(chunk));
84
- proxyRes.on('end', () => res.end());
85
- });
86
- proxyReq.on('timeout', () => proxyReq.destroy());
87
- proxyReq.on('error', () => {
88
- if (!res.headersSent) {
89
- res.status(502).json({ error: 'CLIProxy is not reachable' });
90
- }
91
- });
92
- // Clean up proxy connection when client disconnects.
93
- // Only use res.on('close') — req.on('close') fires with req.destroyed=true
94
- // in Bun after body consumption, which would prematurely kill the proxy.
95
- res.on('close', () => {
96
- if (!res.writableEnded) {
97
- proxyReq.destroy();
98
- }
99
- });
100
- if (bodyBuffer) {
101
- proxyReq.end(bodyBuffer);
102
- return;
103
- }
104
- // For methods without a body (GET, HEAD, etc.) or when express.json()
105
- // has already consumed the stream, end the request immediately.
106
- const hasBody = req.method !== 'GET' && req.method !== 'HEAD' && req.method !== 'OPTIONS';
107
- if (!hasBody) {
108
- proxyReq.end();
109
- return;
110
- }
111
- req.pipe(proxyReq, { end: true });
112
- });
113
- return router;
114
- }
115
- exports.createCliproxyLocalProxyRouter = createCliproxyLocalProxyRouter;
116
- exports.default = createCliproxyLocalProxyRouter();
117
- //# sourceMappingURL=cliproxy-local-proxy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cliproxy-local-proxy.js","sourceRoot":"","sources":["../../../src/web-server/routes/cliproxy-local-proxy.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;AAEH,gDAAwB;AACxB,qCAAoD;AACpD,qEAAyF;AACzF,8EAA+E;AAC/E,mEAAmF;AAQnF,yDAAyD;AACzD,MAAM,gBAAgB,GAAG,KAAM,CAAC;AAEhC,SAAS,wBAAwB;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,iDAAyB,GAAE,CAAC;QAC3C,OAAO,IAAA,2BAAY,EAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,IAAI,oCAAqB,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,oCAAqB,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,WAA0C;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,sFAAsF;IACtF,oFAAoF;IACpF,IACE,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,KAAK,SAAS;QACtB,GAAG,CAAC,IAAI,KAAK,IAAI,EACjB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uFAAuF;IACvF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAiC,EACjC,IAAY,EACZ,UAAmB;IAEnB,MAAM,YAAY,GAA6B;QAC7C,GAAG,OAAO;QACV,IAAI,EAAE,aAAa,IAAI,EAAE;KAC1B,CAAC;IAEF,OAAO,YAAY,CAAC,UAAU,CAAC;IAE/B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACzC,YAAY,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAgB,8BAA8B,CAAC,OAA+B,EAAE;IAC9E,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IACxB,MAAM,aAAa,GACjB,IAAI,CAAC,aAAa;QAClB,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE,CAC/B,IAAA,oDAAkC,EAChC,GAAG,EACH,GAAG,EACH,iFAAiF,CAClF,CAAC,CAAC;IACP,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,cAAI,CAAC,OAAO,CAAC;IACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,wBAAwB,CAAC;IAE7E,MAAM,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAI,EAAE,EAAE;QAC/C,IAAI,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC/C,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAClC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,aAAa,CAC5B;YACE,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;YAC/D,OAAO,EAAE,gBAAgB;SAC1B,EACD,CAAC,QAAQ,EAAE,EAAE;YACX,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5D,mEAAmE;YACnE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC,CACF,CAAC;QAEF,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEjD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,2EAA2E;QAC3E,yEAAyE;QACzE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACvB,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,sEAAsE;QACtE,gEAAgE;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;QAC1F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AA3ED,wEA2EC;AAED,kBAAe,8BAA8B,EAAE,CAAC"}
@@ -1,339 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const {
4
- getActiveProviderIds,
5
- getQueryFingerprint,
6
- getSkipReason,
7
- hasAnyActiveProviders,
8
- runLocalWebSearch,
9
- shouldSkipHook,
10
- traceWebSearchEvent,
11
- } = require('../hooks/websearch-transformer.cjs');
12
-
13
- const PROTOCOL_VERSION = '2024-11-05';
14
- const SERVER_NAME = 'ccs-websearch';
15
- const SERVER_VERSION = '1.0.0';
16
- const TOOL_NAME = 'WebSearch';
17
- const TOOL_ALIASES = ['search'];
18
- const TOOL_DESCRIPTION =
19
- 'Third-party WebSearch replacement for CCS-managed Claude launches. Use this instead of Bash/curl/http fetches for web lookups. Provider order: Exa, Tavily, Brave Search, DuckDuckGo, then optional legacy CLI fallback.';
20
-
21
- function isSupportedToolName(name) {
22
- return name === TOOL_NAME || TOOL_ALIASES.includes(name);
23
- }
24
-
25
- let inputBuffer = Buffer.alloc(0);
26
- const sessionState = {
27
- initializeCount: 0,
28
- toolsListCount: 0,
29
- exposed: false,
30
- toolCalls: 0,
31
- };
32
- let sessionSummaryWritten = false;
33
-
34
- function shouldExposeTools() {
35
- return !shouldSkipHook() && hasAnyActiveProviders();
36
- }
37
-
38
- function getTools() {
39
- if (!shouldExposeTools()) {
40
- return [];
41
- }
42
-
43
- return [
44
- {
45
- name: TOOL_NAME,
46
- description: TOOL_DESCRIPTION,
47
- inputSchema: {
48
- type: 'object',
49
- properties: {
50
- query: {
51
- type: 'string',
52
- description:
53
- 'Web query to resolve through CCS providers. Prefer this tool over ad hoc Bash/curl lookups when you need current web information.',
54
- },
55
- },
56
- required: ['query'],
57
- additionalProperties: false,
58
- },
59
- },
60
- ];
61
- }
62
-
63
- function writeMessage(message) {
64
- process.stdout.write(`${JSON.stringify(message)}\n`);
65
- }
66
-
67
- function writeResponse(id, result) {
68
- writeMessage({
69
- jsonrpc: '2.0',
70
- id,
71
- result,
72
- });
73
- }
74
-
75
- function writeError(id, code, message) {
76
- writeMessage({
77
- jsonrpc: '2.0',
78
- id,
79
- error: {
80
- code,
81
- message,
82
- },
83
- });
84
- }
85
-
86
- async function handleToolCall(message) {
87
- const id = message.id;
88
- const params = message.params || {};
89
- const toolArgs = params.arguments || {};
90
- const toolName = params.name || '<missing>';
91
- const query = typeof toolArgs.query === 'string' ? toolArgs.query.trim() : '';
92
- const fingerprint = getQueryFingerprint(query);
93
-
94
- if (!isSupportedToolName(toolName)) {
95
- traceWebSearchEvent('mcp_tool_call_rejected', {
96
- source: 'mcp',
97
- reason: 'unknown_tool',
98
- toolName,
99
- });
100
- writeError(id, -32602, `Unknown tool: ${toolName}`);
101
- return;
102
- }
103
-
104
- sessionState.toolCalls += 1;
105
- traceWebSearchEvent('mcp_tool_call_received', {
106
- source: 'mcp',
107
- toolName,
108
- ...fingerprint,
109
- });
110
-
111
- if (!shouldExposeTools()) {
112
- traceWebSearchEvent('mcp_tool_call_unavailable', {
113
- source: 'mcp',
114
- toolName,
115
- exposed: false,
116
- skipReason: getSkipReason(),
117
- activeProviderIds: getActiveProviderIds(),
118
- ...fingerprint,
119
- });
120
- writeResponse(id, {
121
- content: [
122
- {
123
- type: 'text',
124
- text: 'CCS WebSearch is unavailable for this profile or no providers are ready.',
125
- },
126
- ],
127
- isError: true,
128
- });
129
- return;
130
- }
131
-
132
- if (!query) {
133
- traceWebSearchEvent('mcp_tool_call_rejected', {
134
- source: 'mcp',
135
- reason: 'empty_query',
136
- toolName,
137
- });
138
- writeError(id, -32602, `Tool "${TOOL_NAME}" requires a non-empty string query.`);
139
- return;
140
- }
141
-
142
- const result = await runLocalWebSearch(query);
143
- if (result.success) {
144
- traceWebSearchEvent('mcp_tool_call_result', {
145
- source: 'mcp',
146
- toolName,
147
- success: true,
148
- providerId: result.providerId,
149
- providerName: result.providerName,
150
- ...fingerprint,
151
- });
152
- writeResponse(id, {
153
- content: [{ type: 'text', text: result.content }],
154
- });
155
- return;
156
- }
157
-
158
- traceWebSearchEvent('mcp_tool_call_result', {
159
- source: 'mcp',
160
- toolName,
161
- success: false,
162
- noActiveProviders: Boolean(result.noActiveProviders),
163
- errorCount: result.errors.length,
164
- ...fingerprint,
165
- });
166
-
167
- const errorDetail =
168
- result.noActiveProviders || result.errors.length === 0
169
- ? 'No active WebSearch providers are ready.'
170
- : result.errors.map((entry) => `${entry.provider}: ${entry.error}`).join(' | ');
171
-
172
- writeResponse(id, {
173
- content: [
174
- {
175
- type: 'text',
176
- text: `CCS local WebSearch failed for "${query}". ${errorDetail}`,
177
- },
178
- ],
179
- isError: true,
180
- });
181
- }
182
-
183
- async function handleMessage(message) {
184
- if (!message || message.jsonrpc !== '2.0' || typeof message.method !== 'string') {
185
- return;
186
- }
187
-
188
- switch (message.method) {
189
- case 'initialize':
190
- sessionState.initializeCount += 1;
191
- sessionState.exposed = sessionState.exposed || shouldExposeTools();
192
- traceWebSearchEvent('mcp_initialize', {
193
- source: 'mcp',
194
- exposed: shouldExposeTools(),
195
- skipReason: getSkipReason(),
196
- activeProviderIds: getActiveProviderIds(),
197
- });
198
- writeResponse(message.id, {
199
- protocolVersion: PROTOCOL_VERSION,
200
- capabilities: {
201
- tools: {},
202
- },
203
- serverInfo: {
204
- name: SERVER_NAME,
205
- version: SERVER_VERSION,
206
- },
207
- });
208
- return;
209
- case 'notifications/initialized':
210
- return;
211
- case 'ping':
212
- writeResponse(message.id, {});
213
- return;
214
- case 'tools/list':
215
- sessionState.toolsListCount += 1;
216
- {
217
- const tools = getTools();
218
- const exposed = tools.length > 0;
219
- sessionState.exposed = sessionState.exposed || exposed;
220
- traceWebSearchEvent('mcp_tools_list', {
221
- source: 'mcp',
222
- exposed,
223
- toolNames: tools.map((tool) => tool.name),
224
- activeProviderIds: getActiveProviderIds(),
225
- skipReason: getSkipReason(),
226
- });
227
- writeResponse(message.id, { tools });
228
- }
229
- return;
230
- case 'tools/call':
231
- await handleToolCall(message);
232
- return;
233
- default:
234
- if (message.id !== undefined) {
235
- writeError(message.id, -32601, `Method not found: ${message.method}`);
236
- }
237
- }
238
- }
239
-
240
- function writeSessionSummary(exitCodeOrSignal) {
241
- if (sessionSummaryWritten) {
242
- return;
243
- }
244
-
245
- sessionSummaryWritten = true;
246
- traceWebSearchEvent('mcp_session_summary', {
247
- source: 'mcp',
248
- initializeCount: sessionState.initializeCount,
249
- toolsListCount: sessionState.toolsListCount,
250
- exposed: sessionState.exposed,
251
- toolCalls: sessionState.toolCalls,
252
- calledWebSearch: sessionState.toolCalls > 0,
253
- likelyBypassed: sessionState.exposed && sessionState.toolCalls === 0 ? 'unknown' : false,
254
- activeProviderIds: getActiveProviderIds(),
255
- skipReason: getSkipReason(),
256
- exitCode: typeof exitCodeOrSignal === 'number' ? exitCodeOrSignal : null,
257
- exitSignal: typeof exitCodeOrSignal === 'string' ? exitCodeOrSignal : null,
258
- });
259
- }
260
-
261
- function parseMessages() {
262
- while (true) {
263
- let body;
264
- const startsWithLegacyHeaders = inputBuffer
265
- .slice(0, Math.min(inputBuffer.length, 32))
266
- .toString('utf8')
267
- .toLowerCase()
268
- .startsWith('content-length:');
269
-
270
- if (startsWithLegacyHeaders) {
271
- const headerEnd = inputBuffer.indexOf('\r\n\r\n');
272
- if (headerEnd === -1) {
273
- return;
274
- }
275
-
276
- const headerText = inputBuffer.slice(0, headerEnd).toString('utf8');
277
- const contentLengthMatch = headerText.match(/content-length:\s*(\d+)/i);
278
- if (!contentLengthMatch) {
279
- inputBuffer = Buffer.alloc(0);
280
- return;
281
- }
282
-
283
- const contentLength = Number.parseInt(contentLengthMatch[1], 10);
284
- const messageEnd = headerEnd + 4 + contentLength;
285
- if (inputBuffer.length < messageEnd) {
286
- return;
287
- }
288
-
289
- body = inputBuffer.slice(headerEnd + 4, messageEnd).toString('utf8');
290
- inputBuffer = inputBuffer.slice(messageEnd);
291
- } else {
292
- const newlineIndex = inputBuffer.indexOf('\n');
293
- if (newlineIndex === -1) {
294
- return;
295
- }
296
-
297
- body = inputBuffer.slice(0, newlineIndex).toString('utf8').replace(/\r$/, '').trim();
298
- inputBuffer = inputBuffer.slice(newlineIndex + 1);
299
- if (!body) {
300
- continue;
301
- }
302
- }
303
-
304
- let message;
305
- try {
306
- message = JSON.parse(body);
307
- } catch {
308
- continue;
309
- }
310
-
311
- Promise.resolve(handleMessage(message)).catch((error) => {
312
- if (message && message.id !== undefined) {
313
- writeError(message.id, -32603, (error && error.message) || 'Internal error');
314
- }
315
- });
316
- }
317
- }
318
-
319
- process.stdin.on('data', (chunk) => {
320
- inputBuffer = Buffer.concat([inputBuffer, chunk]);
321
- parseMessages();
322
- });
323
-
324
- process.stdin.on('error', () => {
325
- process.exit(0);
326
- });
327
-
328
- process.on('exit', (code) => {
329
- writeSessionSummary(code);
330
- });
331
-
332
- ['SIGINT', 'SIGTERM', 'SIGHUP'].forEach((signal) => {
333
- process.on(signal, () => {
334
- writeSessionSummary(signal);
335
- process.exit(0);
336
- });
337
- });
338
-
339
- process.stdin.resume();