@kaitranntt/ccs 8.3.0 → 8.4.0-dev.10

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 (190) hide show
  1. package/README.md +1 -1
  2. package/config/base-claude.settings.json +1 -1
  3. package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
  4. package/dist/api/services/cliproxy-profile-bridge.js +20 -9
  5. package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
  6. package/dist/cliproxy/binary/platform-detector.d.ts.map +1 -1
  7. package/dist/cliproxy/binary/platform-detector.js +34 -1
  8. package/dist/cliproxy/binary/platform-detector.js.map +1 -1
  9. package/dist/cliproxy/binary/types.d.ts +3 -0
  10. package/dist/cliproxy/binary/types.d.ts.map +1 -1
  11. package/dist/cliproxy/binary/types.js +7 -2
  12. package/dist/cliproxy/binary/types.js.map +1 -1
  13. package/dist/cliproxy/binary/version-cache.d.ts.map +1 -1
  14. package/dist/cliproxy/binary/version-cache.js +4 -0
  15. package/dist/cliproxy/binary/version-cache.js.map +1 -1
  16. package/dist/cliproxy/config/env-builder.d.ts +19 -2
  17. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  18. package/dist/cliproxy/config/env-builder.js +58 -9
  19. package/dist/cliproxy/config/env-builder.js.map +1 -1
  20. package/dist/cliproxy/executor/browser-launch-setup.d.ts.map +1 -1
  21. package/dist/cliproxy/executor/browser-launch-setup.js +6 -2
  22. package/dist/cliproxy/executor/browser-launch-setup.js.map +1 -1
  23. package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
  24. package/dist/cliproxy/quota/quota-manager.js +7 -3
  25. package/dist/cliproxy/quota/quota-manager.js.map +1 -1
  26. package/dist/commands/bar/bar-paths.d.ts +32 -0
  27. package/dist/commands/bar/bar-paths.d.ts.map +1 -0
  28. package/dist/commands/bar/bar-paths.js +62 -0
  29. package/dist/commands/bar/bar-paths.js.map +1 -0
  30. package/dist/commands/bar/bar-server-probe.d.ts +40 -0
  31. package/dist/commands/bar/bar-server-probe.d.ts.map +1 -0
  32. package/dist/commands/bar/bar-server-probe.js +159 -0
  33. package/dist/commands/bar/bar-server-probe.js.map +1 -0
  34. package/dist/commands/bar/help-subcommand.d.ts.map +1 -1
  35. package/dist/commands/bar/help-subcommand.js +10 -4
  36. package/dist/commands/bar/help-subcommand.js.map +1 -1
  37. package/dist/commands/bar/index.d.ts +5 -1
  38. package/dist/commands/bar/index.d.ts.map +1 -1
  39. package/dist/commands/bar/index.js +18 -3
  40. package/dist/commands/bar/index.js.map +1 -1
  41. package/dist/commands/bar/install-subcommand.d.ts +12 -10
  42. package/dist/commands/bar/install-subcommand.d.ts.map +1 -1
  43. package/dist/commands/bar/install-subcommand.js +67 -52
  44. package/dist/commands/bar/install-subcommand.js.map +1 -1
  45. package/dist/commands/bar/launch-subcommand.d.ts +44 -32
  46. package/dist/commands/bar/launch-subcommand.d.ts.map +1 -1
  47. package/dist/commands/bar/launch-subcommand.js +216 -128
  48. package/dist/commands/bar/launch-subcommand.js.map +1 -1
  49. package/dist/commands/bar/serve-subcommand.d.ts +47 -0
  50. package/dist/commands/bar/serve-subcommand.d.ts.map +1 -0
  51. package/dist/commands/bar/serve-subcommand.js +192 -0
  52. package/dist/commands/bar/serve-subcommand.js.map +1 -0
  53. package/dist/commands/bar/status-subcommand.d.ts +32 -0
  54. package/dist/commands/bar/status-subcommand.d.ts.map +1 -0
  55. package/dist/commands/bar/status-subcommand.js +128 -0
  56. package/dist/commands/bar/status-subcommand.js.map +1 -0
  57. package/dist/commands/bar/stop-subcommand.d.ts +24 -0
  58. package/dist/commands/bar/stop-subcommand.d.ts.map +1 -0
  59. package/dist/commands/bar/stop-subcommand.js +107 -0
  60. package/dist/commands/bar/stop-subcommand.js.map +1 -0
  61. package/dist/commands/config-channels-command.d.ts +1 -1
  62. package/dist/commands/config-channels-command.d.ts.map +1 -1
  63. package/dist/commands/config-channels-command.js +3 -3
  64. package/dist/commands/config-channels-command.js.map +1 -1
  65. package/dist/commands/config-command-options.d.ts.map +1 -1
  66. package/dist/commands/config-command-options.js +11 -2
  67. package/dist/commands/config-command-options.js.map +1 -1
  68. package/dist/config/config-loader-facade.d.ts +1 -1
  69. package/dist/config/config-loader-facade.d.ts.map +1 -1
  70. package/dist/config/config-loader-facade.js +3 -1
  71. package/dist/config/config-loader-facade.js.map +1 -1
  72. package/dist/config/loader/config-getters.d.ts +16 -0
  73. package/dist/config/loader/config-getters.d.ts.map +1 -1
  74. package/dist/config/loader/config-getters.js +33 -1
  75. package/dist/config/loader/config-getters.js.map +1 -1
  76. package/dist/config/loader/defaults-merger.d.ts.map +1 -1
  77. package/dist/config/loader/defaults-merger.js +4 -0
  78. package/dist/config/loader/defaults-merger.js.map +1 -1
  79. package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
  80. package/dist/config/loader/yaml-serializer.js +13 -0
  81. package/dist/config/loader/yaml-serializer.js.map +1 -1
  82. package/dist/config/schemas/index.d.ts +2 -0
  83. package/dist/config/schemas/index.d.ts.map +1 -1
  84. package/dist/config/schemas/index.js +5 -1
  85. package/dist/config/schemas/index.js.map +1 -1
  86. package/dist/config/schemas/runtime.d.ts +57 -0
  87. package/dist/config/schemas/runtime.d.ts.map +1 -0
  88. package/dist/config/schemas/runtime.js +51 -0
  89. package/dist/config/schemas/runtime.js.map +1 -0
  90. package/dist/config/schemas/unified-config.d.ts +3 -0
  91. package/dist/config/schemas/unified-config.d.ts.map +1 -1
  92. package/dist/config/schemas/unified-config.js.map +1 -1
  93. package/dist/config/unified-config-loader.d.ts +1 -1
  94. package/dist/config/unified-config-loader.d.ts.map +1 -1
  95. package/dist/config/unified-config-loader.js +3 -1
  96. package/dist/config/unified-config-loader.js.map +1 -1
  97. package/dist/dispatcher/profile-resolver.d.ts +1 -1
  98. package/dist/dispatcher/profile-resolver.d.ts.map +1 -1
  99. package/dist/dispatcher/profile-resolver.js +20 -7
  100. package/dist/dispatcher/profile-resolver.js.map +1 -1
  101. package/dist/proxy/server/messages-route.d.ts +10 -0
  102. package/dist/proxy/server/messages-route.d.ts.map +1 -1
  103. package/dist/proxy/server/messages-route.js +34 -7
  104. package/dist/proxy/server/messages-route.js.map +1 -1
  105. package/dist/proxy/server/proxy-server.d.ts.map +1 -1
  106. package/dist/proxy/server/proxy-server.js +1 -1
  107. package/dist/proxy/server/proxy-server.js.map +1 -1
  108. package/dist/shared/provider-preset-catalog.d.ts +1 -1
  109. package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
  110. package/dist/shared/provider-preset-catalog.js +14 -0
  111. package/dist/shared/provider-preset-catalog.js.map +1 -1
  112. package/dist/targets/claude-adapter.d.ts.map +1 -1
  113. package/dist/targets/claude-adapter.js +5 -0
  114. package/dist/targets/claude-adapter.js.map +1 -1
  115. package/dist/targets/codex-detector.d.ts.map +1 -1
  116. package/dist/targets/codex-detector.js +14 -0
  117. package/dist/targets/codex-detector.js.map +1 -1
  118. package/dist/ui/assets/{Trans-RG_sMDEu.js → Trans-BXjW_Rw3.js} +1 -1
  119. package/dist/ui/assets/{accounts-yTXURc-q.js → accounts-C7JMc-UL.js} +1 -1
  120. package/dist/ui/assets/{alert-dialog-DjvPgzFs.js → alert-dialog-BSSHnWG_.js} +1 -1
  121. package/dist/ui/assets/{api-Ck1dtNEM.js → api-GzEZNvOJ.js} +1 -1
  122. package/dist/ui/assets/{auth-section-DBnY_LPz.js → auth-section-B6k7LWIq.js} +1 -1
  123. package/dist/ui/assets/{backups-section-Ci-uL4Of.js → backups-section-Cr3g01YN.js} +1 -1
  124. package/dist/ui/assets/{channels-BeS9O5q0.js → channels-CMyh1yhN.js} +1 -1
  125. package/dist/ui/assets/{checkbox-DFeFDZBp.js → checkbox-BkqYXiER.js} +1 -1
  126. package/dist/ui/assets/{claude-extension-DS5qN19Z.js → claude-extension-BzYl3zcz.js} +1 -1
  127. package/dist/ui/assets/{cliproxy-D7HJH4mZ.js → cliproxy-DwzKzuZI.js} +1 -1
  128. package/dist/ui/assets/{cliproxy-ai-providers-oJQZXrtc.js → cliproxy-ai-providers-DL95SYNa.js} +1 -1
  129. package/dist/ui/assets/{cliproxy-control-panel-2mRPEcRj.js → cliproxy-control-panel-Ba2Rgzdo.js} +1 -1
  130. package/dist/ui/assets/{codex-D0AUQ6jA.js → codex-ClTEGCnr.js} +1 -1
  131. package/dist/ui/assets/{confirm-dialog-B37-CVuq.js → confirm-dialog-BPAO4ILr.js} +1 -1
  132. package/dist/ui/assets/{copilot-KaaW-mko.js → copilot-CymHD4gl.js} +1 -1
  133. package/dist/ui/assets/{cursor-BKiTgYi5.js → cursor-DAiPXs8h.js} +1 -1
  134. package/dist/ui/assets/{droid-DHdqGnFw.js → droid-CAhLWDOj.js} +1 -1
  135. package/dist/ui/assets/{globalenv-section-SfZO97nU.js → globalenv-section-BK5x_uXG.js} +1 -1
  136. package/dist/ui/assets/{health-CSRS9O0D.js → health-D_ErMvYv.js} +1 -1
  137. package/dist/ui/assets/{index-Cu_F55_O.js → index-B4cUkPwc.js} +1 -1
  138. package/dist/ui/assets/{index-DWUuSBUe.js → index-BZMyk4bI.js} +1 -1
  139. package/dist/ui/assets/{index-CGgavq2X.js → index-BcfwoMDm.js} +3 -3
  140. package/dist/ui/assets/{index-iQuEEGbH.js → index-BmbKPprT.js} +1 -1
  141. package/dist/ui/assets/{index-ChTYEBCZ.js → index-CEjVNSjg.js} +1 -1
  142. package/dist/ui/assets/{index-DJ66NrBH.js → index-CFDjAXOB.js} +1 -1
  143. package/dist/ui/assets/{index-DycwEe96.js → index-DCC80SZ0.js} +1 -1
  144. package/dist/ui/assets/{logs-tiZ_51mo.js → logs-DwhXr-9Y.js} +1 -1
  145. package/dist/ui/assets/{masked-input-D9FVoeMA.js → masked-input-DWJTe7jh.js} +1 -1
  146. package/dist/ui/assets/{proxy-status-widget-2k26d8pS.js → proxy-status-widget-CJXi8yui.js} +1 -1
  147. package/dist/ui/assets/{raw-json-settings-editor-panel-CguBh93H.js → raw-json-settings-editor-panel-DWhAi0kI.js} +1 -1
  148. package/dist/ui/assets/{searchable-select-C4wShshD.js → searchable-select-CYC4Y8pS.js} +1 -1
  149. package/dist/ui/assets/{separator-mvGlDdEW.js → separator-JhuNwVKE.js} +1 -1
  150. package/dist/ui/assets/{shared-Ck0yAwbs.js → shared-Hpgs7l5G.js} +1 -1
  151. package/dist/ui/assets/{table-DrUJOxKL.js → table-DDJTZfyL.js} +1 -1
  152. package/dist/ui/assets/{updates-BVHBFcq8.js → updates-CtygOHUO.js} +1 -1
  153. package/dist/ui/assets/{use-accounts-DLtuaniS.js → use-accounts-CaptC8AS.js} +1 -1
  154. package/dist/ui/index.html +1 -1
  155. package/dist/utils/bar-auth-token.d.ts +4 -0
  156. package/dist/utils/bar-auth-token.d.ts.map +1 -0
  157. package/dist/utils/bar-auth-token.js +60 -0
  158. package/dist/utils/bar-auth-token.js.map +1 -0
  159. package/dist/utils/browser/browser-settings.d.ts +3 -1
  160. package/dist/utils/browser/browser-settings.d.ts.map +1 -1
  161. package/dist/utils/browser/browser-settings.js +2 -2
  162. package/dist/utils/browser/browser-settings.js.map +1 -1
  163. package/dist/utils/browser/browser-setup.d.ts.map +1 -1
  164. package/dist/utils/browser/browser-setup.js +3 -1
  165. package/dist/utils/browser/browser-setup.js.map +1 -1
  166. package/dist/utils/browser/browser-status.d.ts.map +1 -1
  167. package/dist/utils/browser/browser-status.js +4 -2
  168. package/dist/utils/browser/browser-status.js.map +1 -1
  169. package/dist/utils/fetch-proxy-setup.d.ts +3 -2
  170. package/dist/utils/fetch-proxy-setup.d.ts.map +1 -1
  171. package/dist/utils/fetch-proxy-setup.js +10 -6
  172. package/dist/utils/fetch-proxy-setup.js.map +1 -1
  173. package/dist/web-server/routes/cursor-routes.d.ts.map +1 -1
  174. package/dist/web-server/routes/cursor-routes.js +3 -1
  175. package/dist/web-server/routes/cursor-routes.js.map +1 -1
  176. package/dist/web-server/routes/index.d.ts.map +1 -1
  177. package/dist/web-server/routes/index.js +6 -0
  178. package/dist/web-server/routes/index.js.map +1 -1
  179. package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
  180. package/dist/web-server/routes/route-helpers.js +8 -0
  181. package/dist/web-server/routes/route-helpers.js.map +1 -1
  182. package/dist/web-server/usage/cliproxy-usage-transformer.d.ts.map +1 -1
  183. package/dist/web-server/usage/cliproxy-usage-transformer.js +9 -4
  184. package/dist/web-server/usage/cliproxy-usage-transformer.js.map +1 -1
  185. package/dist/web-server/usage/codex-local-quota-collector.d.ts +2 -2
  186. package/dist/web-server/usage/codex-local-quota-collector.d.ts.map +1 -1
  187. package/dist/web-server/usage/codex-local-quota-collector.js +39 -11
  188. package/dist/web-server/usage/codex-local-quota-collector.js.map +1 -1
  189. package/package.json +1 -1
  190. package/scripts/github/stable-release-issue-cleanup-lib.mjs +51 -11
@@ -1,16 +1,20 @@
1
1
  "use strict";
2
2
  /**
3
- * `ccs bar launch` — ensure web-server is up, write ~/.ccs/bar.json, open the app.
3
+ * `ccs bar launch` — start the CCS Bar server detached, write bar.json, open the app.
4
4
  *
5
5
  * bar.json shape (v1):
6
6
  * { baseUrl: string, port: number, authMode: "loopback" }
7
7
  *
8
- * authMode is always "loopback" for v1 (auth-enabled unsupported until v1.1).
8
+ * Detached model (replaces the old in-process model):
9
+ * 1. Probe candidate ports (bar.json port first, then 3000/3001/3002/8000/8080).
10
+ * 2. If a live server is found → reuse it, write bar.json, open app, return.
11
+ * 3. Else → refresh launch.json, getPort to pick a free port, spawn
12
+ * `ccs bar serve --port N` detached with stdio → serve.log, poll
13
+ * /api/bar/summary until 200 (timeout ~10 s), write bar.json, open app,
14
+ * return. The CLI process exits; the server continues as a detached child.
9
15
  *
10
- * Reuse-first behavior: before starting a new server, launch probes the candidate
11
- * ports (bar.json port first, then 3000, 3001, 3002, 8000, 8080) for a live CCS
12
- * server at GET /api/bar/summary. A 200 response means the server is already
13
- * running; launch reuses it without attempting to bind a new one.
16
+ * All side-effectful deps are injectable so tests can run without real
17
+ * servers, ports, or file-system writes.
14
18
  */
15
19
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
20
  if (k2 === undefined) k2 = k;
@@ -36,111 +40,127 @@ var __importStar = (this && this.__importStar) || function (mod) {
36
40
  return result;
37
41
  };
38
42
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.handleBarLaunch = exports.defaultFindRunningServer = exports.resolveBarPort = void 0;
43
+ exports.handleBarLaunch = exports.defaultWaitForServerLive = exports.BarServerAuthRequiredError = exports.resolveBarPort = exports.defaultFindRunningServer = void 0;
40
44
  const fs = __importStar(require("fs"));
41
45
  const os = __importStar(require("os"));
42
46
  const path = __importStar(require("path"));
43
47
  const config_loader_facade_1 = require("../../config/config-loader-facade");
48
+ const bar_auth_token_1 = require("../../utils/bar-auth-token");
49
+ const bar_paths_1 = require("./bar-paths");
50
+ const bar_server_probe_1 = require("./bar-server-probe");
51
+ Object.defineProperty(exports, "defaultFindRunningServer", { enumerable: true, get: function () { return bar_server_probe_1.defaultFindRunningServer; } });
52
+ Object.defineProperty(exports, "resolveBarPort", { enumerable: true, get: function () { return bar_server_probe_1.resolveBarPort; } });
44
53
  // ---------------------------------------------------------------------------
45
- // Port discovery helpers (exported for unit tests)
54
+ // Default production dependencies
46
55
  // ---------------------------------------------------------------------------
56
+ async function defaultGetPort(opts) {
57
+ const getPort = (await Promise.resolve().then(() => __importStar(require('get-port')))).default;
58
+ return getPort(opts);
59
+ }
47
60
  /**
48
- * Read the port recorded in an existing bar.json.
49
- * Returns null when the file is absent or malformed.
61
+ * Spawn `ccs bar serve --port N` detached so it outlives this CLI process.
62
+ *
63
+ * stdio is redirected to serve.log so server output is preserved for
64
+ * debugging without a terminal. unref() lets the launcher exit immediately.
50
65
  */
51
- function resolveBarPort(ccsDir) {
52
- const barJsonPath = path.join(ccsDir, 'bar.json');
53
- try {
54
- const raw = fs.readFileSync(barJsonPath, 'utf8');
55
- const parsed = JSON.parse(raw);
56
- return typeof parsed.port === 'number' ? parsed.port : null;
57
- }
58
- catch {
59
- return null;
60
- }
66
+ function defaultSpawnDetachedServer(port, logPath) {
67
+ const { spawn } = require('child_process');
68
+ // Open (or create) the log file for appending.
69
+ const logFd = fs.openSync(logPath, 'a');
70
+ const child = spawn(process.execPath, [process.argv[1], 'bar', 'serve', '--port', String(port)], {
71
+ detached: true,
72
+ stdio: ['ignore', logFd, logFd],
73
+ cwd: os.homedir(),
74
+ env: process.env,
75
+ });
76
+ child.unref();
77
+ // Close our copy of the fd — the child has its own reference.
78
+ fs.closeSync(logFd);
79
+ return child;
61
80
  }
62
- exports.resolveBarPort = resolveBarPort;
63
- // ---------------------------------------------------------------------------
64
- // Default production dependencies
65
- // ---------------------------------------------------------------------------
66
81
  /**
67
- * Probe candidate ports for a running CCS server.
68
- *
69
- * Both IPv4 (127.0.0.1) and IPv6 (::1) loopback addresses are probed for
70
- * each port. This is necessary because `ccs config` starts the server with
71
- * host 'localhost', which macOS resolves to ::1 — an IPv4-only probe would
72
- * miss that server and start a redundant second instance.
73
- *
74
- * All probes are fired concurrently (cheap loopback requests) so worst-case
75
- * latency is ~1.5 s (one timeout) rather than N × 1.5 s sequentially.
76
- * Priority selection is still applied after all results are in: the bar.json
77
- * port is preferred over the defaults (3000, 3001, 3002, 8000, 8080), and
78
- * within a port 127.0.0.1 is preferred over [::1].
82
+ * Poll GET {baseUrl}/api/bar/summary every 250 ms until HTTP 200 or ~10 s.
83
+ * Resolves when the server is live. Rejects on timeout.
79
84
  */
80
- async function defaultFindRunningServer(ccsDir) {
81
- const { request } = await Promise.resolve().then(() => __importStar(require('undici')));
82
- /**
83
- * Probe a single URL. Resolves to { ok: true } on HTTP 200, { ok: false }
84
- * on any other status or error (connection refused, timeout, etc.).
85
- * Never rejects — all errors are absorbed so Promise.all never short-circuits.
86
- */
87
- async function probe(url) {
88
- try {
89
- const { statusCode, body } = await request(url, {
90
- method: 'GET',
91
- headersTimeout: 1500,
92
- bodyTimeout: 1500,
85
+ class BarServerAuthRequiredError extends Error {
86
+ constructor(baseUrl, statusCode) {
87
+ super(`CCS Bar server at ${baseUrl} requires dashboard authentication (HTTP ${statusCode})`);
88
+ this.name = 'BarServerAuthRequiredError';
89
+ }
90
+ }
91
+ exports.BarServerAuthRequiredError = BarServerAuthRequiredError;
92
+ function isAuthRequiredStatus(statusCode) {
93
+ return statusCode === 401 || statusCode === 403;
94
+ }
95
+ async function defaultWaitForServerLive(baseUrl) {
96
+ const net = await Promise.resolve().then(() => __importStar(require('net')));
97
+ const token = (0, bar_auth_token_1.getOrCreateBarAuthToken)();
98
+ const INTERVAL_MS = 250;
99
+ const TIMEOUT_MS = 10000;
100
+ const deadline = Date.now() + TIMEOUT_MS;
101
+ async function probe() {
102
+ const url = new URL(`${baseUrl}/api/bar/summary`);
103
+ return new Promise((resolve) => {
104
+ let rawResponse = '';
105
+ let settled = false;
106
+ const finish = (statusCode = null, headerSection = '') => {
107
+ if (settled)
108
+ return;
109
+ settled = true;
110
+ socket.destroy();
111
+ if (statusCode === 200) {
112
+ const echoMatch = headerSection.match(new RegExp(`${bar_auth_token_1.BAR_AUTH_TOKEN_HEADER}:\\s*([^\\r\\n]+)`, 'i'));
113
+ const echoedToken = echoMatch ? echoMatch[1].trim() : '';
114
+ resolve({ statusCode, tokenMatched: echoedToken === token });
115
+ return;
116
+ }
117
+ resolve({ statusCode, tokenMatched: false });
118
+ };
119
+ const socket = net.connect({ host: url.hostname.replace(/^\[|\]$/g, ''), port: Number(url.port) }, () => {
120
+ // Do NOT include the token in the request — sending the secret to the
121
+ // party being authenticated lets any reflector trivially pass the check.
122
+ socket.write(`GET ${url.pathname}${url.search} HTTP/1.1\r\nHost: ${url.host}\r\nConnection: close\r\n\r\n`);
93
123
  });
94
- // Drain the body to avoid hanging sockets regardless of status.
95
- // body.dump() is not available in Bun's undici shim; body.text() works
96
- // cross-runtime and fully consumes the response stream.
97
- await body.text();
98
- return { ok: statusCode === 200 };
99
- }
100
- catch {
101
- return { ok: false };
102
- }
124
+ socket.setTimeout(1500, () => finish());
125
+ socket.on('data', (chunk) => {
126
+ rawResponse += chunk.toString('utf8');
127
+ const statusMatch = rawResponse.match(/^HTTP\/\d(?:\.\d)?\s+(\d{3})/);
128
+ if (statusMatch) {
129
+ const code = Number(statusMatch[1]);
130
+ if (code !== 200) {
131
+ finish(code, rawResponse);
132
+ return;
133
+ }
134
+ if (rawResponse.includes('\r\n\r\n')) {
135
+ finish(code, rawResponse.split('\r\n\r\n')[0]);
136
+ }
137
+ }
138
+ });
139
+ socket.on('error', () => finish());
140
+ socket.on('end', () => {
141
+ const statusMatch = rawResponse.match(/^HTTP\/\d(?:\.\d)?\s+(\d{3})/);
142
+ if (statusMatch)
143
+ finish(Number(statusMatch[1]), rawResponse);
144
+ else
145
+ finish();
146
+ });
147
+ });
103
148
  }
104
- const barJsonPort = resolveBarPort(ccsDir);
105
- const base = [3000, 3001, 3002, 8000, 8080];
106
- const candidates = barJsonPort !== null ? [barJsonPort, ...base.filter((p) => p !== barJsonPort)] : base;
107
- // Build the ordered list of (port, host, baseUrl) tuples. Within each port,
108
- // IPv4 comes before IPv6 to preserve the existing priority semantics.
109
- const probeTargets = candidates.flatMap((port) => [
110
- { port, baseUrl: `http://127.0.0.1:${port}`, url: `http://127.0.0.1:${port}/api/bar/summary` },
111
- { port, baseUrl: `http://[::1]:${port}`, url: `http://[::1]:${port}/api/bar/summary` },
112
- ]);
113
- // Fire all probes concurrently. Each probe resolves (never rejects), so
114
- // Promise.all collects all results without short-circuiting on failure.
115
- const results = await Promise.all(probeTargets.map((t) => probe(t.url)));
116
- // Walk the results in priority order and return the first successful hit.
117
- for (let i = 0; i < probeTargets.length; i++) {
118
- if (results[i].ok) {
119
- const { port, baseUrl } = probeTargets[i];
120
- return { port, baseUrl };
149
+ while (Date.now() < deadline) {
150
+ const { statusCode, tokenMatched } = await probe();
151
+ if (statusCode === 200 && tokenMatched)
152
+ return;
153
+ if (statusCode !== null && isAuthRequiredStatus(statusCode)) {
154
+ throw new BarServerAuthRequiredError(baseUrl, statusCode);
121
155
  }
156
+ await new Promise((resolve) => setTimeout(resolve, INTERVAL_MS));
122
157
  }
123
- return null;
158
+ throw new Error(`CCS Bar server did not become live at ${baseUrl} within ${TIMEOUT_MS / 1000}s`);
124
159
  }
125
- exports.defaultFindRunningServer = defaultFindRunningServer;
126
- async function defaultEnsureDashboard() {
127
- // Reuse the same startup path as `ccs config`:
128
- // find a free port then start the web-server via startServer().
129
- const getPort = (await Promise.resolve().then(() => __importStar(require('get-port')))).default;
130
- const { startServer } = await Promise.resolve().then(() => __importStar(require('../../web-server')));
131
- // Pass host: '127.0.0.1' so getPort probes the same address that startServer
132
- // will bind. On macOS, a wildcard bind and a specific 127.0.0.1 bind are
133
- // independent: getPort without a host can return 3000 "free" while a live
134
- // CCS server already holds 127.0.0.1:3000, causing EADDRINUSE on startServer.
135
- const port = await getPort({ port: [3000, 3001, 3002, 8000, 8080], host: '127.0.0.1' });
136
- // Bind IPv4 loopback explicitly. Without a host, startServer defaults to
137
- // 'localhost', which on macOS resolves to ::1 (IPv6) — but bar.json's baseUrl
138
- // (and the Swift app) use 127.0.0.1, so the app could not reach its own server.
139
- const { server } = await startServer({ port, host: '127.0.0.1' });
140
- const addr = server.address();
141
- const resolvedPort = addr && typeof addr === 'object' ? addr.port : port;
142
- const baseUrl = `http://127.0.0.1:${resolvedPort}`;
143
- return { port: resolvedPort, baseUrl };
160
+ exports.defaultWaitForServerLive = defaultWaitForServerLive;
161
+ function defaultWriteLaunchDescriptor(jsonPath, descriptor) {
162
+ fs.mkdirSync(path.dirname(jsonPath), { recursive: true });
163
+ fs.writeFileSync(jsonPath, JSON.stringify(descriptor, null, 2));
144
164
  }
145
165
  async function defaultOpenApp(appPath) {
146
166
  const { execFile } = await Promise.resolve().then(() => __importStar(require('child_process')));
@@ -152,75 +172,144 @@ function defaultGetCcsDir() {
152
172
  return (0, config_loader_facade_1.getCcsDir)();
153
173
  }
154
174
  // Fix #5: use os.homedir() to match install-subcommand.ts and uninstall-subcommand.ts.
155
- // process.env.HOME may be unset in restricted environments, and CCS_HOME is the CCS
156
- // data directory (~/.ccs), not the user's home — neither is a safe fallback here.
157
175
  const DEFAULT_APP_INSTALL_PATH = path.join(os.homedir(), 'Applications', 'CCS Bar.app');
158
176
  // ---------------------------------------------------------------------------
159
177
  // Implementation
160
178
  // ---------------------------------------------------------------------------
161
179
  async function handleBarLaunch(_args, deps = {}) {
162
- const ensureDashboard = deps.ensureDashboard ?? defaultEnsureDashboard;
163
- const openApp = deps.openApp ?? defaultOpenApp;
164
180
  const ccsDir = (deps.getCcsDir ?? defaultGetCcsDir)();
181
+ const openApp = deps.openApp ?? defaultOpenApp;
165
182
  const appInstallPath = deps.appInstallPath ?? DEFAULT_APP_INSTALL_PATH;
166
- // Wire findRunningServer after ccsDir is resolved so the default impl can
167
- // read bar.json from the correct directory.
168
- const findRunningServer = deps.findRunningServer ?? (() => defaultFindRunningServer(ccsDir));
169
- // 1. Try to reuse an already-running CCS server; fall back to starting one.
170
- // Probe errors are treated as "not found" — they never abort the launch flow.
183
+ const getPortFn = deps.getPort ?? defaultGetPort;
184
+ const spawnDetachedServer = deps.spawnDetachedServer ?? defaultSpawnDetachedServer;
185
+ const waitForServerLive = deps.waitForServerLive ?? defaultWaitForServerLive;
186
+ const writeLaunchDescriptor = deps.writeLaunchDescriptor ?? defaultWriteLaunchDescriptor;
187
+ // Wire findRunningServer after ccsDir is resolved.
188
+ const findRunningServer = deps.findRunningServer ?? (() => (0, bar_server_probe_1.defaultFindRunningServer)(ccsDir));
189
+ const barJsonPath = (0, bar_paths_1.getBarJsonPath)(ccsDir);
190
+ const launchJsonPath = (0, bar_paths_1.getLaunchJsonPath)(ccsDir);
191
+ // 1. Probe for an already-running server.
171
192
  let running = null;
172
193
  try {
173
194
  running = await findRunningServer();
174
195
  }
175
196
  catch {
176
- // Any probe error counts as null; ensureDashboard() is the fallback.
197
+ /* any probe error counts as null */
177
198
  }
178
- let dashboardInfo;
179
- let reused = false;
180
199
  if (running !== null) {
181
- dashboardInfo = running;
182
- reused = true;
183
- }
184
- else {
200
+ if (running.authRequired) {
201
+ console.error(`[X] CCS Bar cannot launch while dashboard authentication protects ${running.baseUrl}.`);
202
+ console.error('[i] Disable dashboard authentication for CCS Bar or start the dashboard manually.');
203
+ return;
204
+ }
205
+ // Reuse the live server — write bar.json and open the app.
206
+ const barJson = {
207
+ baseUrl: running.baseUrl,
208
+ port: running.port,
209
+ authMode: 'loopback',
210
+ };
185
211
  try {
186
- dashboardInfo = await ensureDashboard();
212
+ fs.mkdirSync(ccsDir, { recursive: true });
213
+ fs.writeFileSync(barJsonPath, JSON.stringify(barJson, null, 2));
187
214
  }
188
215
  catch (err) {
189
216
  const msg = err instanceof Error ? err.message : String(err);
190
- console.error(`[X] Could not start CCS web-server: ${msg}`);
191
- console.error('[i] Run `ccs config` to start the dashboard manually.');
217
+ console.error(`[X] Failed to write bar.json: ${msg}`);
218
+ return;
219
+ }
220
+ console.log(`[OK] Reusing running CCS web-server at ${running.baseUrl}`);
221
+ console.log(`[i] Discovery file written: ${barJsonPath}`);
222
+ await _openAppWithFallback(appInstallPath, openApp);
223
+ return;
224
+ }
225
+ // 2. No live server — pick a port, write/refresh launch.json, spawn detached.
226
+ // 2a. Pick a free port.
227
+ let port;
228
+ try {
229
+ port = await getPortFn({ port: [3000, 3001, 3002, 8000, 8080], host: '127.0.0.1' });
230
+ }
231
+ catch (err) {
232
+ const msg = err instanceof Error ? err.message : String(err);
233
+ console.error(`[X] Could not find a free port: ${msg}`);
234
+ return;
235
+ }
236
+ // 2b. Write/refresh launch.json so the Swift app can self-start next time.
237
+ const launchDescriptor = {
238
+ schema: bar_paths_1.LAUNCH_JSON_SCHEMA,
239
+ runtime: process.execPath,
240
+ args: [process.argv[1], 'bar', 'serve'],
241
+ home: os.homedir(),
242
+ ...(process.env.CCS_HOME ? { ccsHome: process.env.CCS_HOME } : {}),
243
+ };
244
+ try {
245
+ writeLaunchDescriptor(launchJsonPath, launchDescriptor);
246
+ }
247
+ catch (err) {
248
+ // Non-fatal — the Swift app falls back to resolving `ccs` via PATH.
249
+ const msg = err instanceof Error ? err.message : String(err);
250
+ console.error(`[!] Could not write launch.json: ${msg}`);
251
+ }
252
+ // 2c. Spawn the detached server.
253
+ const serveLogPath = (0, bar_paths_1.getServeLogPath)(ccsDir);
254
+ const baseUrl = `http://127.0.0.1:${port}`;
255
+ let spawnedChild;
256
+ try {
257
+ fs.mkdirSync((0, bar_paths_1.getBarDir)(ccsDir), { recursive: true });
258
+ spawnedChild = spawnDetachedServer(port, serveLogPath);
259
+ }
260
+ catch (err) {
261
+ const msg = err instanceof Error ? err.message : String(err);
262
+ console.error(`[X] Could not start CCS web-server: ${msg}`);
263
+ console.error('[i] Run `ccs config` to start the dashboard manually.');
264
+ return;
265
+ }
266
+ console.log('[i] Starting CCS Bar server...');
267
+ // 2d. Poll until live or timeout.
268
+ try {
269
+ await waitForServerLive(baseUrl);
270
+ }
271
+ catch (err) {
272
+ if (err instanceof BarServerAuthRequiredError) {
273
+ spawnedChild?.kill();
274
+ console.error(`[X] CCS Bar cannot launch while dashboard authentication protects ${baseUrl}.`);
275
+ console.error('[i] Disable dashboard authentication for CCS Bar or start the dashboard manually.');
192
276
  return;
193
277
  }
278
+ const msg = err instanceof Error ? err.message : String(err);
279
+ console.error(`[X] Could not connect to CCS web-server: ${msg}`);
280
+ console.error(`[i] Check logs at ${serveLogPath}`);
281
+ return;
194
282
  }
195
- // 2. Write bar.json — this is the single source of discovery for the Swift app.
283
+ // 2e. Write bar.json.
196
284
  const barJson = {
197
- baseUrl: dashboardInfo.baseUrl,
198
- port: dashboardInfo.port,
285
+ baseUrl,
286
+ port,
199
287
  authMode: 'loopback',
200
288
  };
201
289
  try {
202
290
  fs.mkdirSync(ccsDir, { recursive: true });
203
- fs.writeFileSync(path.join(ccsDir, 'bar.json'), JSON.stringify(barJson, null, 2));
291
+ fs.writeFileSync(barJsonPath, JSON.stringify(barJson, null, 2));
204
292
  }
205
293
  catch (err) {
206
294
  const msg = err instanceof Error ? err.message : String(err);
207
295
  console.error(`[X] Failed to write bar.json: ${msg}`);
208
296
  return;
209
297
  }
210
- if (reused) {
211
- console.log(`[OK] Reusing running CCS web-server at ${dashboardInfo.baseUrl}`);
212
- }
213
- else {
214
- console.log(`[OK] CCS web-server running at ${dashboardInfo.baseUrl}`);
215
- }
216
- console.log(`[i] Discovery file written: ${path.join(ccsDir, 'bar.json')}`);
217
- // 3. Open the app.
298
+ console.log(`[OK] CCS web-server running at ${baseUrl}`);
299
+ console.log(`[i] Discovery file written: ${barJsonPath}`);
300
+ // 3. Open the app — then return (process exits; server continues detached).
301
+ await _openAppWithFallback(appInstallPath, openApp);
302
+ }
303
+ exports.handleBarLaunch = handleBarLaunch;
304
+ // ---------------------------------------------------------------------------
305
+ // Internal helper open app with graceful degraded path
306
+ // ---------------------------------------------------------------------------
307
+ async function _openAppWithFallback(appInstallPath, openApp) {
218
308
  try {
219
309
  await openApp(appInstallPath);
220
310
  console.log('[OK] CCS Bar launched.');
221
311
  }
222
312
  catch {
223
- // Degraded path: app not installed or open failed.
224
313
  if (!fs.existsSync(appInstallPath)) {
225
314
  console.log('[!] CCS Bar app is not installed.');
226
315
  console.log('[i] Run `ccs bar install` to install it.');
@@ -232,5 +321,4 @@ async function handleBarLaunch(_args, deps = {}) {
232
321
  }
233
322
  }
234
323
  }
235
- exports.handleBarLaunch = handleBarLaunch;
236
324
  //# sourceMappingURL=launch-subcommand.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"launch-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/launch-subcommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `ccs bar serve` — long-lived server host for CCS Bar.
3
+ *
4
+ * Reuse-or-start: probe candidate ports first. If a live server exists,
5
+ * write bar.json pointing at it and exit 0 (no double-start). Otherwise
6
+ * pick a free port, call startServer(), write bar.json + server.pid,
7
+ * then stay alive until SIGINT/SIGTERM.
8
+ *
9
+ * This is the process that `ccs bar launch` spawns detached. The Swift
10
+ * app also spawns it directly via launch.json.
11
+ *
12
+ * Accepts: --port N (honours a port the launcher pre-selected via getPort).
13
+ */
14
+ import type { DashboardInfo } from './bar-server-probe';
15
+ export interface ServeDeps {
16
+ /** Probe candidate ports for a running CCS server. Never throws. */
17
+ findRunningServer: () => Promise<DashboardInfo | null>;
18
+ /**
19
+ * Start the CCS web-server on the given port.
20
+ * Returns { port, baseUrl } of the bound server.
21
+ * The returned server keeps the process event loop alive while listening.
22
+ */
23
+ startServer: (opts: {
24
+ port: number;
25
+ host: string;
26
+ }) => Promise<DashboardInfo>;
27
+ /**
28
+ * Find a free port from the candidate list.
29
+ * Returns one of the candidates or another free port.
30
+ */
31
+ getPort: (opts: {
32
+ port: number[];
33
+ host: string;
34
+ }) => Promise<number>;
35
+ /** Returns ~/.ccs dir (respects CCS_HOME). */
36
+ getCcsDir: () => string;
37
+ /** Write a file, creating parent dirs as needed. */
38
+ writeFile: (filePath: string, content: string) => void;
39
+ /** Remove a file if it exists (for cleanup on exit). */
40
+ removeFile: (filePath: string) => void;
41
+ /** Register process signal handlers. */
42
+ onSignal: (signal: 'SIGINT' | 'SIGTERM', handler: () => void) => void;
43
+ /** Exit the process. */
44
+ exit: (code: number) => never;
45
+ }
46
+ export declare function handleBarServe(args: string[], deps?: Partial<ServeDeps>): Promise<void>;
47
+ //# sourceMappingURL=serve-subcommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/serve-subcommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACvD;;;;OAIG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9E;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,8CAA8C;IAC9C,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,oDAAoD;IACpD,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,wDAAwD;IACxD,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,wCAAwC;IACxC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACtE,wBAAwB;IACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAC/B;AA8DD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,OAAO,CAAC,SAAS,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGjG"}