@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.
- package/README.md +1 -1
- package/config/base-claude.settings.json +1 -1
- package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
- package/dist/api/services/cliproxy-profile-bridge.js +20 -9
- package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
- package/dist/cliproxy/binary/platform-detector.d.ts.map +1 -1
- package/dist/cliproxy/binary/platform-detector.js +34 -1
- package/dist/cliproxy/binary/platform-detector.js.map +1 -1
- package/dist/cliproxy/binary/types.d.ts +3 -0
- package/dist/cliproxy/binary/types.d.ts.map +1 -1
- package/dist/cliproxy/binary/types.js +7 -2
- package/dist/cliproxy/binary/types.js.map +1 -1
- package/dist/cliproxy/binary/version-cache.d.ts.map +1 -1
- package/dist/cliproxy/binary/version-cache.js +4 -0
- package/dist/cliproxy/binary/version-cache.js.map +1 -1
- package/dist/cliproxy/config/env-builder.d.ts +19 -2
- package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
- package/dist/cliproxy/config/env-builder.js +58 -9
- package/dist/cliproxy/config/env-builder.js.map +1 -1
- package/dist/cliproxy/executor/browser-launch-setup.d.ts.map +1 -1
- package/dist/cliproxy/executor/browser-launch-setup.js +6 -2
- package/dist/cliproxy/executor/browser-launch-setup.js.map +1 -1
- package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
- package/dist/cliproxy/quota/quota-manager.js +7 -3
- package/dist/cliproxy/quota/quota-manager.js.map +1 -1
- package/dist/commands/bar/bar-paths.d.ts +32 -0
- package/dist/commands/bar/bar-paths.d.ts.map +1 -0
- package/dist/commands/bar/bar-paths.js +62 -0
- package/dist/commands/bar/bar-paths.js.map +1 -0
- package/dist/commands/bar/bar-server-probe.d.ts +40 -0
- package/dist/commands/bar/bar-server-probe.d.ts.map +1 -0
- package/dist/commands/bar/bar-server-probe.js +159 -0
- package/dist/commands/bar/bar-server-probe.js.map +1 -0
- package/dist/commands/bar/help-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/help-subcommand.js +10 -4
- package/dist/commands/bar/help-subcommand.js.map +1 -1
- package/dist/commands/bar/index.d.ts +5 -1
- package/dist/commands/bar/index.d.ts.map +1 -1
- package/dist/commands/bar/index.js +18 -3
- package/dist/commands/bar/index.js.map +1 -1
- package/dist/commands/bar/install-subcommand.d.ts +12 -10
- package/dist/commands/bar/install-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/install-subcommand.js +67 -52
- package/dist/commands/bar/install-subcommand.js.map +1 -1
- package/dist/commands/bar/launch-subcommand.d.ts +44 -32
- package/dist/commands/bar/launch-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/launch-subcommand.js +216 -128
- package/dist/commands/bar/launch-subcommand.js.map +1 -1
- package/dist/commands/bar/serve-subcommand.d.ts +47 -0
- package/dist/commands/bar/serve-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/serve-subcommand.js +192 -0
- package/dist/commands/bar/serve-subcommand.js.map +1 -0
- package/dist/commands/bar/status-subcommand.d.ts +32 -0
- package/dist/commands/bar/status-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/status-subcommand.js +128 -0
- package/dist/commands/bar/status-subcommand.js.map +1 -0
- package/dist/commands/bar/stop-subcommand.d.ts +24 -0
- package/dist/commands/bar/stop-subcommand.d.ts.map +1 -0
- package/dist/commands/bar/stop-subcommand.js +107 -0
- package/dist/commands/bar/stop-subcommand.js.map +1 -0
- package/dist/commands/config-channels-command.d.ts +1 -1
- package/dist/commands/config-channels-command.d.ts.map +1 -1
- package/dist/commands/config-channels-command.js +3 -3
- package/dist/commands/config-channels-command.js.map +1 -1
- package/dist/commands/config-command-options.d.ts.map +1 -1
- package/dist/commands/config-command-options.js +11 -2
- package/dist/commands/config-command-options.js.map +1 -1
- package/dist/config/config-loader-facade.d.ts +1 -1
- package/dist/config/config-loader-facade.d.ts.map +1 -1
- package/dist/config/config-loader-facade.js +3 -1
- package/dist/config/config-loader-facade.js.map +1 -1
- package/dist/config/loader/config-getters.d.ts +16 -0
- package/dist/config/loader/config-getters.d.ts.map +1 -1
- package/dist/config/loader/config-getters.js +33 -1
- package/dist/config/loader/config-getters.js.map +1 -1
- package/dist/config/loader/defaults-merger.d.ts.map +1 -1
- package/dist/config/loader/defaults-merger.js +4 -0
- package/dist/config/loader/defaults-merger.js.map +1 -1
- package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
- package/dist/config/loader/yaml-serializer.js +13 -0
- package/dist/config/loader/yaml-serializer.js.map +1 -1
- package/dist/config/schemas/index.d.ts +2 -0
- package/dist/config/schemas/index.d.ts.map +1 -1
- package/dist/config/schemas/index.js +5 -1
- package/dist/config/schemas/index.js.map +1 -1
- package/dist/config/schemas/runtime.d.ts +57 -0
- package/dist/config/schemas/runtime.d.ts.map +1 -0
- package/dist/config/schemas/runtime.js +51 -0
- package/dist/config/schemas/runtime.js.map +1 -0
- package/dist/config/schemas/unified-config.d.ts +3 -0
- package/dist/config/schemas/unified-config.d.ts.map +1 -1
- package/dist/config/schemas/unified-config.js.map +1 -1
- package/dist/config/unified-config-loader.d.ts +1 -1
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +3 -1
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/dispatcher/profile-resolver.d.ts +1 -1
- package/dist/dispatcher/profile-resolver.d.ts.map +1 -1
- package/dist/dispatcher/profile-resolver.js +20 -7
- package/dist/dispatcher/profile-resolver.js.map +1 -1
- package/dist/proxy/server/messages-route.d.ts +10 -0
- package/dist/proxy/server/messages-route.d.ts.map +1 -1
- package/dist/proxy/server/messages-route.js +34 -7
- package/dist/proxy/server/messages-route.js.map +1 -1
- package/dist/proxy/server/proxy-server.d.ts.map +1 -1
- package/dist/proxy/server/proxy-server.js +1 -1
- package/dist/proxy/server/proxy-server.js.map +1 -1
- package/dist/shared/provider-preset-catalog.d.ts +1 -1
- package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
- package/dist/shared/provider-preset-catalog.js +14 -0
- package/dist/shared/provider-preset-catalog.js.map +1 -1
- package/dist/targets/claude-adapter.d.ts.map +1 -1
- package/dist/targets/claude-adapter.js +5 -0
- package/dist/targets/claude-adapter.js.map +1 -1
- package/dist/targets/codex-detector.d.ts.map +1 -1
- package/dist/targets/codex-detector.js +14 -0
- package/dist/targets/codex-detector.js.map +1 -1
- package/dist/ui/assets/{Trans-RG_sMDEu.js → Trans-BXjW_Rw3.js} +1 -1
- package/dist/ui/assets/{accounts-yTXURc-q.js → accounts-C7JMc-UL.js} +1 -1
- package/dist/ui/assets/{alert-dialog-DjvPgzFs.js → alert-dialog-BSSHnWG_.js} +1 -1
- package/dist/ui/assets/{api-Ck1dtNEM.js → api-GzEZNvOJ.js} +1 -1
- package/dist/ui/assets/{auth-section-DBnY_LPz.js → auth-section-B6k7LWIq.js} +1 -1
- package/dist/ui/assets/{backups-section-Ci-uL4Of.js → backups-section-Cr3g01YN.js} +1 -1
- package/dist/ui/assets/{channels-BeS9O5q0.js → channels-CMyh1yhN.js} +1 -1
- package/dist/ui/assets/{checkbox-DFeFDZBp.js → checkbox-BkqYXiER.js} +1 -1
- package/dist/ui/assets/{claude-extension-DS5qN19Z.js → claude-extension-BzYl3zcz.js} +1 -1
- package/dist/ui/assets/{cliproxy-D7HJH4mZ.js → cliproxy-DwzKzuZI.js} +1 -1
- package/dist/ui/assets/{cliproxy-ai-providers-oJQZXrtc.js → cliproxy-ai-providers-DL95SYNa.js} +1 -1
- package/dist/ui/assets/{cliproxy-control-panel-2mRPEcRj.js → cliproxy-control-panel-Ba2Rgzdo.js} +1 -1
- package/dist/ui/assets/{codex-D0AUQ6jA.js → codex-ClTEGCnr.js} +1 -1
- package/dist/ui/assets/{confirm-dialog-B37-CVuq.js → confirm-dialog-BPAO4ILr.js} +1 -1
- package/dist/ui/assets/{copilot-KaaW-mko.js → copilot-CymHD4gl.js} +1 -1
- package/dist/ui/assets/{cursor-BKiTgYi5.js → cursor-DAiPXs8h.js} +1 -1
- package/dist/ui/assets/{droid-DHdqGnFw.js → droid-CAhLWDOj.js} +1 -1
- package/dist/ui/assets/{globalenv-section-SfZO97nU.js → globalenv-section-BK5x_uXG.js} +1 -1
- package/dist/ui/assets/{health-CSRS9O0D.js → health-D_ErMvYv.js} +1 -1
- package/dist/ui/assets/{index-Cu_F55_O.js → index-B4cUkPwc.js} +1 -1
- package/dist/ui/assets/{index-DWUuSBUe.js → index-BZMyk4bI.js} +1 -1
- package/dist/ui/assets/{index-CGgavq2X.js → index-BcfwoMDm.js} +3 -3
- package/dist/ui/assets/{index-iQuEEGbH.js → index-BmbKPprT.js} +1 -1
- package/dist/ui/assets/{index-ChTYEBCZ.js → index-CEjVNSjg.js} +1 -1
- package/dist/ui/assets/{index-DJ66NrBH.js → index-CFDjAXOB.js} +1 -1
- package/dist/ui/assets/{index-DycwEe96.js → index-DCC80SZ0.js} +1 -1
- package/dist/ui/assets/{logs-tiZ_51mo.js → logs-DwhXr-9Y.js} +1 -1
- package/dist/ui/assets/{masked-input-D9FVoeMA.js → masked-input-DWJTe7jh.js} +1 -1
- package/dist/ui/assets/{proxy-status-widget-2k26d8pS.js → proxy-status-widget-CJXi8yui.js} +1 -1
- package/dist/ui/assets/{raw-json-settings-editor-panel-CguBh93H.js → raw-json-settings-editor-panel-DWhAi0kI.js} +1 -1
- package/dist/ui/assets/{searchable-select-C4wShshD.js → searchable-select-CYC4Y8pS.js} +1 -1
- package/dist/ui/assets/{separator-mvGlDdEW.js → separator-JhuNwVKE.js} +1 -1
- package/dist/ui/assets/{shared-Ck0yAwbs.js → shared-Hpgs7l5G.js} +1 -1
- package/dist/ui/assets/{table-DrUJOxKL.js → table-DDJTZfyL.js} +1 -1
- package/dist/ui/assets/{updates-BVHBFcq8.js → updates-CtygOHUO.js} +1 -1
- package/dist/ui/assets/{use-accounts-DLtuaniS.js → use-accounts-CaptC8AS.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/dist/utils/bar-auth-token.d.ts +4 -0
- package/dist/utils/bar-auth-token.d.ts.map +1 -0
- package/dist/utils/bar-auth-token.js +60 -0
- package/dist/utils/bar-auth-token.js.map +1 -0
- package/dist/utils/browser/browser-settings.d.ts +3 -1
- package/dist/utils/browser/browser-settings.d.ts.map +1 -1
- package/dist/utils/browser/browser-settings.js +2 -2
- package/dist/utils/browser/browser-settings.js.map +1 -1
- package/dist/utils/browser/browser-setup.d.ts.map +1 -1
- package/dist/utils/browser/browser-setup.js +3 -1
- package/dist/utils/browser/browser-setup.js.map +1 -1
- package/dist/utils/browser/browser-status.d.ts.map +1 -1
- package/dist/utils/browser/browser-status.js +4 -2
- package/dist/utils/browser/browser-status.js.map +1 -1
- package/dist/utils/fetch-proxy-setup.d.ts +3 -2
- package/dist/utils/fetch-proxy-setup.d.ts.map +1 -1
- package/dist/utils/fetch-proxy-setup.js +10 -6
- package/dist/utils/fetch-proxy-setup.js.map +1 -1
- package/dist/web-server/routes/cursor-routes.d.ts.map +1 -1
- package/dist/web-server/routes/cursor-routes.js +3 -1
- package/dist/web-server/routes/cursor-routes.js.map +1 -1
- package/dist/web-server/routes/index.d.ts.map +1 -1
- package/dist/web-server/routes/index.js +6 -0
- package/dist/web-server/routes/index.js.map +1 -1
- package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
- package/dist/web-server/routes/route-helpers.js +8 -0
- package/dist/web-server/routes/route-helpers.js.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.d.ts.map +1 -1
- package/dist/web-server/usage/cliproxy-usage-transformer.js +9 -4
- package/dist/web-server/usage/cliproxy-usage-transformer.js.map +1 -1
- package/dist/web-server/usage/codex-local-quota-collector.d.ts +2 -2
- package/dist/web-server/usage/codex-local-quota-collector.d.ts.map +1 -1
- package/dist/web-server/usage/codex-local-quota-collector.js +39 -11
- package/dist/web-server/usage/codex-local-quota-collector.js.map +1 -1
- package/package.json +1 -1
- 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` —
|
|
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
|
-
*
|
|
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
|
-
*
|
|
11
|
-
*
|
|
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.
|
|
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
|
-
//
|
|
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
|
-
*
|
|
49
|
-
*
|
|
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
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
158
|
+
throw new Error(`CCS Bar server did not become live at ${baseUrl} within ${TIMEOUT_MS / 1000}s`);
|
|
124
159
|
}
|
|
125
|
-
exports.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
//
|
|
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
|
-
|
|
197
|
+
/* any probe error counts as null */
|
|
177
198
|
}
|
|
178
|
-
let dashboardInfo;
|
|
179
|
-
let reused = false;
|
|
180
199
|
if (running !== null) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
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]
|
|
191
|
-
|
|
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
|
-
//
|
|
283
|
+
// 2e. Write bar.json.
|
|
196
284
|
const barJson = {
|
|
197
|
-
baseUrl
|
|
198
|
-
port
|
|
285
|
+
baseUrl,
|
|
286
|
+
port,
|
|
199
287
|
authMode: 'loopback',
|
|
200
288
|
};
|
|
201
289
|
try {
|
|
202
290
|
fs.mkdirSync(ccsDir, { recursive: true });
|
|
203
|
-
fs.writeFileSync(
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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":";AAAA
|
|
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"}
|