@kaitranntt/ccs 8.8.1-dev.18 → 8.8.1-dev.19
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/dist/commands/bar/bar-process-control.d.ts +43 -0
- package/dist/commands/bar/bar-process-control.d.ts.map +1 -0
- package/dist/commands/bar/bar-process-control.js +255 -0
- package/dist/commands/bar/bar-process-control.js.map +1 -0
- package/dist/commands/bar/bar-server-probe.d.ts +5 -2
- package/dist/commands/bar/bar-server-probe.d.ts.map +1 -1
- package/dist/commands/bar/bar-server-probe.js +38 -12
- package/dist/commands/bar/bar-server-probe.js.map +1 -1
- package/dist/commands/bar/help-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/help-subcommand.js +2 -0
- package/dist/commands/bar/help-subcommand.js.map +1 -1
- package/dist/commands/bar/index.d.ts.map +1 -1
- package/dist/commands/bar/index.js +13 -3
- package/dist/commands/bar/index.js.map +1 -1
- package/dist/commands/bar/launch-descriptor.d.ts +2 -0
- package/dist/commands/bar/launch-descriptor.d.ts.map +1 -1
- package/dist/commands/bar/launch-descriptor.js +6 -1
- package/dist/commands/bar/launch-descriptor.js.map +1 -1
- package/dist/commands/bar/launch-subcommand.d.ts +18 -1
- package/dist/commands/bar/launch-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/launch-subcommand.js +149 -45
- package/dist/commands/bar/launch-subcommand.js.map +1 -1
- package/dist/commands/bar/port-arg.d.ts +16 -0
- package/dist/commands/bar/port-arg.d.ts.map +1 -0
- package/dist/commands/bar/port-arg.js +41 -0
- package/dist/commands/bar/port-arg.js.map +1 -0
- package/dist/commands/bar/serve-subcommand.d.ts +5 -0
- package/dist/commands/bar/serve-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/serve-subcommand.js +47 -29
- package/dist/commands/bar/serve-subcommand.js.map +1 -1
- package/dist/commands/bar/status-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/status-subcommand.js +11 -2
- package/dist/commands/bar/status-subcommand.js.map +1 -1
- package/dist/commands/bar/stop-subcommand.d.ts +5 -0
- package/dist/commands/bar/stop-subcommand.d.ts.map +1 -1
- package/dist/commands/bar/stop-subcommand.js +71 -27
- package/dist/commands/bar/stop-subcommand.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface BarServerProcessRecord {
|
|
2
|
+
pid: number;
|
|
3
|
+
birthIdentity: string;
|
|
4
|
+
}
|
|
5
|
+
export type BarServerStopResult = 'stopped' | 'stale' | 'legacy-record' | 'invalid-record' | 'identity-mismatch' | 'permission-denied' | 'signal-failed' | 'timeout';
|
|
6
|
+
export interface BarServerStopDeps {
|
|
7
|
+
getProcessBirthIdentity: (pid: number) => string | null;
|
|
8
|
+
killProcess: (pid: number, signal: 'SIGTERM') => void;
|
|
9
|
+
waitForProcessExit: (pid: number, birthIdentity: string, timeoutMs: number) => Promise<'exited' | 'identity-mismatch' | 'timeout'>;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseBarServerProcessRecord(raw: string): BarServerProcessRecord | null;
|
|
12
|
+
export declare function parseLegacyServerPid(raw: string): number | null;
|
|
13
|
+
export declare function serializeBarServerProcessRecord(record: BarServerProcessRecord): string;
|
|
14
|
+
/**
|
|
15
|
+
* Return the OS process birth marker for PID reuse protection. CCS Bar is a
|
|
16
|
+
* macOS app, where `ps lstart` is stable for a process lifetime. Linux uses the
|
|
17
|
+
* same portable ps surface in development and CI.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getProcessBirthIdentity(pid: number): string | null;
|
|
20
|
+
export declare function waitForProcessExit(pid: number, birthIdentity: string, timeoutMs: number): Promise<'exited' | 'identity-mismatch' | 'timeout'>;
|
|
21
|
+
export declare function stopRecordedBarServer(rawRecord: string, deps?: Partial<BarServerStopDeps>): Promise<{
|
|
22
|
+
result: BarServerStopResult;
|
|
23
|
+
record: BarServerProcessRecord | null;
|
|
24
|
+
error?: Error;
|
|
25
|
+
}>;
|
|
26
|
+
export interface ClaimedBarServerStopOutcome {
|
|
27
|
+
result: BarServerStopResult | 'no-record';
|
|
28
|
+
record: BarServerProcessRecord | null;
|
|
29
|
+
legacyPid?: number;
|
|
30
|
+
error?: Error;
|
|
31
|
+
recoveryPath?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Atomically claim server.pid before signaling. The serve process therefore
|
|
35
|
+
* sees ENOENT during its signal handler and cannot unlink a new owner's record.
|
|
36
|
+
*/
|
|
37
|
+
export declare function stopBarServerProcessFile(pidPath: string, deps?: Partial<BarServerStopDeps>): Promise<ClaimedBarServerStopOutcome>;
|
|
38
|
+
/** Remove server.pid only when it still belongs to this exact serve process. */
|
|
39
|
+
export declare function removeBarServerProcessRecordIfOwned(pidPath: string, expectedRecord: BarServerProcessRecord): void;
|
|
40
|
+
/** Claim stale discovery state so a replacement write can never be unlinked. */
|
|
41
|
+
export declare function removeBarDiscoveryIfNoProcess(barJsonPath: string, pidPath: string): boolean;
|
|
42
|
+
export declare function stopDetachedBarServer(ccsDir: string): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=bar-process-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bar-process-control.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/bar-process-control.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,OAAO,GACP,eAAe,GACf,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,eAAe,GACf,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,uBAAuB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACxD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACtD,kBAAkB,EAAE,CAClB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,QAAQ,GAAG,mBAAmB,GAAG,SAAS,CAAC,CAAC;CAC1D;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAUtF;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK/D;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAEtF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWlE;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,GAAG,mBAAmB,GAAG,SAAS,CAAC,CASrD;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAiChG;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,mBAAmB,GAAG,WAAW,CAAC;IAC1C,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4BD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAqCtC;AAED,gFAAgF;AAChF,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,sBAAsB,GACrC,IAAI,CAwBN;AAED,gFAAgF;AAChF,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAc3F;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.stopDetachedBarServer = exports.removeBarDiscoveryIfNoProcess = exports.removeBarServerProcessRecordIfOwned = exports.stopBarServerProcessFile = exports.stopRecordedBarServer = exports.waitForProcessExit = exports.getProcessBirthIdentity = exports.serializeBarServerProcessRecord = exports.parseLegacyServerPid = exports.parseBarServerProcessRecord = void 0;
|
|
27
|
+
const child_process_1 = require("child_process");
|
|
28
|
+
const fs = __importStar(require("fs"));
|
|
29
|
+
const error_types_1 = require("../../errors/error-types");
|
|
30
|
+
const bar_paths_1 = require("./bar-paths");
|
|
31
|
+
function parseBarServerProcessRecord(raw) {
|
|
32
|
+
try {
|
|
33
|
+
const parsed = JSON.parse(raw);
|
|
34
|
+
const pid = parsed.pid;
|
|
35
|
+
if (!Number.isSafeInteger(pid) || (pid ?? 0) <= 0)
|
|
36
|
+
return null;
|
|
37
|
+
if (typeof parsed.birthIdentity !== 'string' || parsed.birthIdentity.trim() === '')
|
|
38
|
+
return null;
|
|
39
|
+
return { pid: pid, birthIdentity: parsed.birthIdentity };
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.parseBarServerProcessRecord = parseBarServerProcessRecord;
|
|
46
|
+
function parseLegacyServerPid(raw) {
|
|
47
|
+
const trimmed = raw.trim();
|
|
48
|
+
if (!/^[1-9]\d*$/.test(trimmed))
|
|
49
|
+
return null;
|
|
50
|
+
const pid = Number(trimmed);
|
|
51
|
+
return Number.isSafeInteger(pid) ? pid : null;
|
|
52
|
+
}
|
|
53
|
+
exports.parseLegacyServerPid = parseLegacyServerPid;
|
|
54
|
+
function serializeBarServerProcessRecord(record) {
|
|
55
|
+
return JSON.stringify(record, null, 2);
|
|
56
|
+
}
|
|
57
|
+
exports.serializeBarServerProcessRecord = serializeBarServerProcessRecord;
|
|
58
|
+
/**
|
|
59
|
+
* Return the OS process birth marker for PID reuse protection. CCS Bar is a
|
|
60
|
+
* macOS app, where `ps lstart` is stable for a process lifetime. Linux uses the
|
|
61
|
+
* same portable ps surface in development and CI.
|
|
62
|
+
*/
|
|
63
|
+
function getProcessBirthIdentity(pid) {
|
|
64
|
+
if (!Number.isSafeInteger(pid) || pid <= 0)
|
|
65
|
+
return null;
|
|
66
|
+
try {
|
|
67
|
+
const output = (0, child_process_1.execFileSync)('ps', ['-p', String(pid), '-o', 'lstart='], {
|
|
68
|
+
encoding: 'utf8',
|
|
69
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
70
|
+
}).trim();
|
|
71
|
+
return output || null;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.getProcessBirthIdentity = getProcessBirthIdentity;
|
|
78
|
+
async function waitForProcessExit(pid, birthIdentity, timeoutMs) {
|
|
79
|
+
const deadline = Date.now() + timeoutMs;
|
|
80
|
+
while (Date.now() < deadline) {
|
|
81
|
+
const currentIdentity = getProcessBirthIdentity(pid);
|
|
82
|
+
if (currentIdentity === null)
|
|
83
|
+
return 'exited';
|
|
84
|
+
if (currentIdentity !== birthIdentity)
|
|
85
|
+
return 'identity-mismatch';
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
87
|
+
}
|
|
88
|
+
return 'timeout';
|
|
89
|
+
}
|
|
90
|
+
exports.waitForProcessExit = waitForProcessExit;
|
|
91
|
+
async function stopRecordedBarServer(rawRecord, deps = {}) {
|
|
92
|
+
const record = parseBarServerProcessRecord(rawRecord);
|
|
93
|
+
if (record === null) {
|
|
94
|
+
return {
|
|
95
|
+
result: parseLegacyServerPid(rawRecord) === null ? 'invalid-record' : 'legacy-record',
|
|
96
|
+
record: null,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const getIdentity = deps.getProcessBirthIdentity ?? getProcessBirthIdentity;
|
|
100
|
+
const killProcess = deps.killProcess ?? ((pid, signal) => process.kill(pid, signal));
|
|
101
|
+
const waitForExit = deps.waitForProcessExit ?? waitForProcessExit;
|
|
102
|
+
// Revalidate immediately before SIGTERM. A PID alone is unsafe because the OS
|
|
103
|
+
// can reuse it after the recorded CCS Bar process exits.
|
|
104
|
+
const currentIdentity = getIdentity(record.pid);
|
|
105
|
+
if (currentIdentity === null)
|
|
106
|
+
return { result: 'stale', record };
|
|
107
|
+
if (currentIdentity !== record.birthIdentity)
|
|
108
|
+
return { result: 'identity-mismatch', record };
|
|
109
|
+
try {
|
|
110
|
+
killProcess(record.pid, 'SIGTERM');
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
114
|
+
const code = err.code;
|
|
115
|
+
if (code === 'ESRCH')
|
|
116
|
+
return { result: 'stale', record };
|
|
117
|
+
if (code === 'EPERM')
|
|
118
|
+
return { result: 'permission-denied', record, error };
|
|
119
|
+
return { result: 'signal-failed', record, error };
|
|
120
|
+
}
|
|
121
|
+
const waitResult = await waitForExit(record.pid, record.birthIdentity, 3000);
|
|
122
|
+
if (waitResult === 'exited')
|
|
123
|
+
return { result: 'stopped', record };
|
|
124
|
+
if (waitResult === 'identity-mismatch')
|
|
125
|
+
return { result: 'identity-mismatch', record };
|
|
126
|
+
return { result: 'timeout', record };
|
|
127
|
+
}
|
|
128
|
+
exports.stopRecordedBarServer = stopRecordedBarServer;
|
|
129
|
+
function isErrno(err, code) {
|
|
130
|
+
return err.code === code;
|
|
131
|
+
}
|
|
132
|
+
function unlinkIfPresent(filePath) {
|
|
133
|
+
try {
|
|
134
|
+
fs.unlinkSync(filePath);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
if (!isErrno(err, 'ENOENT'))
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function restoreClaimWithoutOverwrite(claimPath, canonicalPath) {
|
|
142
|
+
try {
|
|
143
|
+
fs.linkSync(claimPath, canonicalPath);
|
|
144
|
+
unlinkIfPresent(claimPath);
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (isErrno(err, 'EEXIST'))
|
|
149
|
+
return claimPath;
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Atomically claim server.pid before signaling. The serve process therefore
|
|
155
|
+
* sees ENOENT during its signal handler and cannot unlink a new owner's record.
|
|
156
|
+
*/
|
|
157
|
+
async function stopBarServerProcessFile(pidPath, deps = {}) {
|
|
158
|
+
const claimPath = `${pidPath}.claim-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
159
|
+
try {
|
|
160
|
+
fs.renameSync(pidPath, claimPath);
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
if (isErrno(err, 'ENOENT'))
|
|
164
|
+
return { result: 'no-record', record: null };
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
let rawRecord;
|
|
168
|
+
try {
|
|
169
|
+
rawRecord = fs.readFileSync(claimPath, 'utf8').trim();
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
const recoveryPath = restoreClaimWithoutOverwrite(claimPath, pidPath);
|
|
173
|
+
return {
|
|
174
|
+
result: 'invalid-record',
|
|
175
|
+
record: null,
|
|
176
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
177
|
+
recoveryPath,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const outcome = await stopRecordedBarServer(rawRecord, deps);
|
|
181
|
+
if (outcome.result === 'stopped' || outcome.result === 'stale') {
|
|
182
|
+
unlinkIfPresent(claimPath);
|
|
183
|
+
return outcome;
|
|
184
|
+
}
|
|
185
|
+
const recoveryPath = restoreClaimWithoutOverwrite(claimPath, pidPath);
|
|
186
|
+
return {
|
|
187
|
+
...outcome,
|
|
188
|
+
legacyPid: outcome.result === 'legacy-record'
|
|
189
|
+
? (parseLegacyServerPid(rawRecord) ?? undefined)
|
|
190
|
+
: undefined,
|
|
191
|
+
recoveryPath,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
exports.stopBarServerProcessFile = stopBarServerProcessFile;
|
|
195
|
+
/** Remove server.pid only when it still belongs to this exact serve process. */
|
|
196
|
+
function removeBarServerProcessRecordIfOwned(pidPath, expectedRecord) {
|
|
197
|
+
const claimPath = `${pidPath}.cleanup-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
198
|
+
try {
|
|
199
|
+
fs.renameSync(pidPath, claimPath);
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
if (isErrno(err, 'ENOENT'))
|
|
203
|
+
return;
|
|
204
|
+
throw err;
|
|
205
|
+
}
|
|
206
|
+
let claimedRecord = null;
|
|
207
|
+
try {
|
|
208
|
+
claimedRecord = parseBarServerProcessRecord(fs.readFileSync(claimPath, 'utf8'));
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// Preserve unreadable state below.
|
|
212
|
+
}
|
|
213
|
+
if (claimedRecord?.pid === expectedRecord.pid &&
|
|
214
|
+
claimedRecord.birthIdentity === expectedRecord.birthIdentity) {
|
|
215
|
+
unlinkIfPresent(claimPath);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
restoreClaimWithoutOverwrite(claimPath, pidPath);
|
|
219
|
+
}
|
|
220
|
+
exports.removeBarServerProcessRecordIfOwned = removeBarServerProcessRecordIfOwned;
|
|
221
|
+
/** Claim stale discovery state so a replacement write can never be unlinked. */
|
|
222
|
+
function removeBarDiscoveryIfNoProcess(barJsonPath, pidPath) {
|
|
223
|
+
const claimPath = `${barJsonPath}.cleanup-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
224
|
+
try {
|
|
225
|
+
fs.renameSync(barJsonPath, claimPath);
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
if (isErrno(err, 'ENOENT'))
|
|
229
|
+
return true;
|
|
230
|
+
throw err;
|
|
231
|
+
}
|
|
232
|
+
if (fs.existsSync(pidPath)) {
|
|
233
|
+
restoreClaimWithoutOverwrite(claimPath, barJsonPath);
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
unlinkIfPresent(claimPath);
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
exports.removeBarDiscoveryIfNoProcess = removeBarDiscoveryIfNoProcess;
|
|
240
|
+
async function stopDetachedBarServer(ccsDir) {
|
|
241
|
+
const pidPath = (0, bar_paths_1.getServerPidPath)(ccsDir);
|
|
242
|
+
try {
|
|
243
|
+
const outcome = await stopBarServerProcessFile(pidPath);
|
|
244
|
+
if (outcome.result !== 'stopped' && outcome.result !== 'stale') {
|
|
245
|
+
throw new error_types_1.ConfigError(`Safe CCS Bar stop aborted (${outcome.result}); recovery state was preserved`, outcome.recoveryPath ?? pidPath);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
if (err instanceof error_types_1.ConfigError)
|
|
250
|
+
throw err;
|
|
251
|
+
throw new error_types_1.ConfigError(`Cannot safely stop CCS Bar process: ${err instanceof Error ? err.message : String(err)}`, pidPath);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
exports.stopDetachedBarServer = stopDetachedBarServer;
|
|
255
|
+
//# sourceMappingURL=bar-process-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bar-process-control.js","sourceRoot":"","sources":["../../../src/commands/bar/bar-process-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,11 @@ export interface DashboardInfo {
|
|
|
11
11
|
authRequired?: boolean;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Read the port recorded in an existing bar.json
|
|
15
|
-
*
|
|
14
|
+
* Read the port recorded in an existing bar.json, falling back to the --port
|
|
15
|
+
* in launch.json's args. `ccs bar stop` deletes bar.json but leaves
|
|
16
|
+
* launch.json, so the fallback is what keeps the sticky port (and the probe's
|
|
17
|
+
* ability to find a server on a non-default port) across a stop/start cycle.
|
|
18
|
+
* Returns null when neither file records a port.
|
|
16
19
|
*/
|
|
17
20
|
export declare function resolveBarPort(ccsDir: string): number | null;
|
|
18
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar-server-probe.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/bar-server-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"bar-server-probe.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/bar-server-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;GAMG;AAEH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2B5D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiG5F"}
|
|
@@ -36,20 +36,46 @@ const path = __importStar(require("path"));
|
|
|
36
36
|
const bar_auth_token_1 = require("../../utils/bar-auth-token");
|
|
37
37
|
const PROBE_TIMEOUT_MS = 1500;
|
|
38
38
|
const MAX_PROBE_RESPONSE_BYTES = 8192;
|
|
39
|
+
function isValidPort(value) {
|
|
40
|
+
return Number.isSafeInteger(value) && value >= 1 && value <= 65535;
|
|
41
|
+
}
|
|
39
42
|
/**
|
|
40
|
-
* Read the port recorded in an existing bar.json
|
|
41
|
-
*
|
|
43
|
+
* Read the port recorded in an existing bar.json, falling back to the --port
|
|
44
|
+
* in launch.json's args. `ccs bar stop` deletes bar.json but leaves
|
|
45
|
+
* launch.json, so the fallback is what keeps the sticky port (and the probe's
|
|
46
|
+
* ability to find a server on a non-default port) across a stop/start cycle.
|
|
47
|
+
* Returns null when neither file records a port.
|
|
42
48
|
*/
|
|
43
49
|
function resolveBarPort(ccsDir) {
|
|
44
50
|
const barJsonPath = path.join(ccsDir, 'bar.json');
|
|
45
51
|
try {
|
|
46
52
|
const raw = fs.readFileSync(barJsonPath, 'utf8');
|
|
47
53
|
const parsed = JSON.parse(raw);
|
|
48
|
-
|
|
54
|
+
if (isValidPort(parsed.port))
|
|
55
|
+
return parsed.port;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* fall through to launch.json */
|
|
59
|
+
}
|
|
60
|
+
const launchJsonPath = path.join(ccsDir, 'bar', 'launch.json');
|
|
61
|
+
try {
|
|
62
|
+
const raw = fs.readFileSync(launchJsonPath, 'utf8');
|
|
63
|
+
const parsed = JSON.parse(raw);
|
|
64
|
+
const args = Array.isArray(parsed.args) ? parsed.args : [];
|
|
65
|
+
const idx = args.indexOf('--port');
|
|
66
|
+
if (idx !== -1 && idx + 1 < args.length) {
|
|
67
|
+
const rawPort = args[idx + 1];
|
|
68
|
+
if (typeof rawPort === 'string' && /^[1-9]\d{0,4}$/.test(rawPort)) {
|
|
69
|
+
const n = Number(rawPort);
|
|
70
|
+
if (isValidPort(n))
|
|
71
|
+
return n;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
49
74
|
}
|
|
50
75
|
catch {
|
|
51
|
-
|
|
76
|
+
/* absent or malformed -> null */
|
|
52
77
|
}
|
|
78
|
+
return null;
|
|
53
79
|
}
|
|
54
80
|
exports.resolveBarPort = resolveBarPort;
|
|
55
81
|
/**
|
|
@@ -94,16 +120,16 @@ async function defaultFindRunningServer(ccsDir) {
|
|
|
94
120
|
// loopback service that streams forever cannot block discovery from
|
|
95
121
|
// returning a higher-priority hit.
|
|
96
122
|
socket.destroy();
|
|
97
|
-
const
|
|
123
|
+
const proofMatch = headerSection.match(new RegExp(`${bar_auth_token_1.BAR_AUTH_TOKEN_HEADER}:\\s*([^\\r\\n]+)`, 'i'));
|
|
124
|
+
const proof = proofMatch ? proofMatch[1].trim() : '';
|
|
125
|
+
const tokenMatched = (0, bar_auth_token_1.isMatchingBarAuthProof)(token, nonce, proof);
|
|
126
|
+
const authRequired = (statusCode === 401 || statusCode === 403) && tokenMatched;
|
|
98
127
|
if (authRequired) {
|
|
99
128
|
resolve({ ok: true, authRequired: true });
|
|
100
129
|
return;
|
|
101
130
|
}
|
|
102
131
|
if (statusCode === 200) {
|
|
103
|
-
|
|
104
|
-
const echoMatch = headerSection.match(new RegExp(`${bar_auth_token_1.BAR_AUTH_TOKEN_HEADER}:\\s*([^\\r\\n]+)`, 'i'));
|
|
105
|
-
const proof = echoMatch ? echoMatch[1].trim() : '';
|
|
106
|
-
resolve({ ok: (0, bar_auth_token_1.isMatchingBarAuthProof)(token, nonce, proof), authRequired: false });
|
|
132
|
+
resolve({ ok: tokenMatched, authRequired: false });
|
|
107
133
|
return;
|
|
108
134
|
}
|
|
109
135
|
resolve({ ok: false, authRequired: false });
|
|
@@ -123,12 +149,12 @@ async function defaultFindRunningServer(ccsDir) {
|
|
|
123
149
|
const statusMatch = rawResponse.match(/^HTTP\/\d(?:\.\d)?\s+(\d{3})/);
|
|
124
150
|
if (statusMatch) {
|
|
125
151
|
const code = Number(statusMatch[1]);
|
|
126
|
-
//
|
|
127
|
-
|
|
152
|
+
// CCS-authenticated 401/403 responses also carry the nonce proof, so
|
|
153
|
+
// wait for their complete headers before deciding identity.
|
|
154
|
+
if (code !== 200 && code !== 401 && code !== 403) {
|
|
128
155
|
finish(code, rawResponse);
|
|
129
156
|
return;
|
|
130
157
|
}
|
|
131
|
-
// For 200 we need the headers section to extract the token.
|
|
132
158
|
if (rawResponse.includes('\r\n\r\n')) {
|
|
133
159
|
finish(code, rawResponse.split('\r\n\r\n')[0]);
|
|
134
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar-server-probe.js","sourceRoot":"","sources":["../../../src/commands/bar/bar-server-probe.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,+DAMoC;AAEpC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAQtC
|
|
1
|
+
{"version":3,"file":"bar-server-probe.js","sourceRoot":"","sources":["../../../src/commands/bar/bar-server-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/help-subcommand.ts"],"names":[],"mappings":"AAEA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"help-subcommand.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/help-subcommand.ts"],"names":[],"mappings":"AAEA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA4E9C"}
|
|
@@ -26,6 +26,7 @@ async function showHelp() {
|
|
|
26
26
|
[
|
|
27
27
|
'Options:',
|
|
28
28
|
[
|
|
29
|
+
['--port <n>', 'Run the server on this port (persists; later launches keep the same port)'],
|
|
29
30
|
['--help, -h', 'Show this help message'],
|
|
30
31
|
['--version', 'Show CLI and installed app versions'],
|
|
31
32
|
],
|
|
@@ -45,6 +46,7 @@ async function showHelp() {
|
|
|
45
46
|
'Examples:',
|
|
46
47
|
[
|
|
47
48
|
['ccs bar', 'Start the server detached and open CCS Bar'],
|
|
49
|
+
['ccs bar --port 3999', 'Start (or move) the server on port 3999 instead of 3000'],
|
|
48
50
|
['ccs bar stop', 'Stop the detached CCS Bar server'],
|
|
49
51
|
['ccs bar status', 'Show server running state and PID'],
|
|
50
52
|
['ccs bar install', 'Download and install CCS Bar, then prompt to launch'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/help-subcommand.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"help-subcommand.js","sourceRoot":"","sources":["../../../src/commands/bar/help-subcommand.ts"],"names":[],"mappings":";;;AAAA,uCAAuE;AAEhE,KAAK,UAAU,QAAQ;IAC5B,MAAM,IAAA,WAAM,GAAE,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAA,WAAM,EAAC,8BAA8B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,IAAA,cAAS,EAAC,QAAQ,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAK,EAAC,SAAS,EAAE,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAmC;QAC/C;YACE,WAAW;YACX;gBACE,CAAC,QAAQ,EAAE,0EAA0E,CAAC;gBACtF,CAAC,OAAO,EAAE,sEAAsE,CAAC;gBACjF,CAAC,MAAM,EAAE,kCAAkC,CAAC;gBAC5C,CAAC,QAAQ,EAAE,4CAA4C,CAAC;gBACxD,CAAC,SAAS,EAAE,6EAA6E,CAAC;gBAC1F,CAAC,WAAW,EAAE,gCAAgC,CAAC;gBAC/C,CAAC,SAAS,EAAE,qCAAqC,CAAC;aACnD;SACF;QACD;YACE,UAAU;YACV;gBACE,CAAC,YAAY,EAAE,2EAA2E,CAAC;gBAC3F,CAAC,YAAY,EAAE,wBAAwB,CAAC;gBACxC,CAAC,WAAW,EAAE,qCAAqC,CAAC;aACrD;SACF;QACD;YACE,kBAAkB;YAClB;gBACE,CAAC,UAAU,EAAE,4DAA4D,CAAC;gBAC1E,CAAC,aAAa,EAAE,sCAAsC,CAAC;gBACvD;oBACE,cAAc;oBACd,yFAAyF;iBAC1F;aACF;SACF;QACD;YACE,WAAW;YACX;gBACE,CAAC,SAAS,EAAE,4CAA4C,CAAC;gBACzD,CAAC,qBAAqB,EAAE,yDAAyD,CAAC;gBAClF,CAAC,cAAc,EAAE,kCAAkC,CAAC;gBACpD,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;gBACvD,CAAC,iBAAiB,EAAE,qDAAqD,CAAC;gBAC1E,CAAC,0BAA0B,EAAE,4CAA4C,CAAC;gBAC1E,CAAC,6BAA6B,EAAE,2BAA2B,CAAC;gBAC5D,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;gBAC1D,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;aAC5D;SACF;KACF,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,IAAA,cAAS,EAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAK,EAAC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAA,QAAG,EAAC,+EAA+E,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,IAAA,QAAG,EAAC,+EAA+E,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CACT,IAAA,QAAG,EAAC,oFAAoF,CAAC,CAC1F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAA,QAAG,EAAC,2EAA2E,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CACT,IAAA,QAAG,EAAC,mFAAmF,CAAC,CACzF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AA5ED,4BA4EC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEpE"}
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.handleBarCommand = void 0;
|
|
37
37
|
const arg_extractor_1 = require("../arg-extractor");
|
|
38
|
+
const port_arg_1 = require("./port-arg");
|
|
38
39
|
async function handleBarCommand(args) {
|
|
39
40
|
const subcommand = args[0];
|
|
40
41
|
// --help / -h anywhere in args (e.g. `ccs bar install --help`) → show help.
|
|
@@ -76,9 +77,18 @@ async function handleBarCommand(args) {
|
|
|
76
77
|
await handleBarUninstall(subArgs);
|
|
77
78
|
},
|
|
78
79
|
};
|
|
79
|
-
// Bare `ccs bar` → launch
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
// Bare `ccs bar` → launch. Bare flags (e.g. `ccs bar --port 3999`) also go to
|
|
81
|
+
// launch with the full arg list preserved (--help/--version were handled above).
|
|
82
|
+
if (!subcommand || subcommand === 'launch' || subcommand.startsWith('-')) {
|
|
83
|
+
const launchArgs = subcommand === 'launch' ? args.slice(1) : args;
|
|
84
|
+
const argError = (0, port_arg_1.validatePortArgs)(launchArgs);
|
|
85
|
+
if (argError !== null) {
|
|
86
|
+
console.error(`[X] ${argError}`);
|
|
87
|
+
console.error('[i] Usage: ccs bar [--port N]');
|
|
88
|
+
process.exitCode = 1;
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await commandHandlers.launch(launchArgs);
|
|
82
92
|
return;
|
|
83
93
|
}
|
|
84
94
|
const handler = commandHandlers[subcommand];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/bar/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,oDAA8C;AAEvC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,4EAA4E;IAC5E,qDAAqD;IACrD,IAAI,IAAA,0BAAU,EAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;QACvD,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,6DAA6D;IAC7D,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,EAAE,gBAAgB,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;QAClE,MAAM,gBAAgB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAyD;QAC5E,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,EAAE,eAAe,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;YAChE,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACvB,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,oBAAoB,GAAC,CAAC;YAC9D,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtB,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;YAC5D,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,EAAE,eAAe,EAAE,GAAG,wDAAa,qBAAqB,GAAC,CAAC;YAChE,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzB,MAAM,EAAE,gBAAgB,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;YAClE,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC3B,MAAM,EAAE,kBAAkB,EAAE,GAAG,wDAAa,wBAAwB,GAAC,CAAC;YACtE,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;IAEF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/bar/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,8 @@ export interface LaunchDescriptorOptions {
|
|
|
13
13
|
runtime?: string;
|
|
14
14
|
home?: string;
|
|
15
15
|
ccsHome?: string;
|
|
16
|
+
/** Server port; recorded in args so the Swift app self-starts on the same port. */
|
|
17
|
+
port?: number;
|
|
16
18
|
}
|
|
17
19
|
export declare function getLaunchShimPath(home?: string): string;
|
|
18
20
|
export declare function writeLaunchShim(home: string, entrypointPath?: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-descriptor.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/launch-descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"launch-descriptor.d.ts","sourceRoot":"","sources":["../../../src/commands/bar/launch-descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAqB,GAAG,MAAM,CAErE;AAUD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAkC7E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CAgB3F"}
|
|
@@ -95,7 +95,12 @@ function createBarLaunchDescriptor(options = {}) {
|
|
|
95
95
|
return {
|
|
96
96
|
schema: bar_paths_1.LAUNCH_JSON_SCHEMA,
|
|
97
97
|
runtime: options.runtime ?? process.execPath,
|
|
98
|
-
args: [
|
|
98
|
+
args: [
|
|
99
|
+
entrypoint,
|
|
100
|
+
'bar',
|
|
101
|
+
'serve',
|
|
102
|
+
...(options.port !== undefined ? ['--port', String(options.port)] : []),
|
|
103
|
+
],
|
|
99
104
|
home,
|
|
100
105
|
...(ccsHome ? { ccsHome } : {}),
|
|
101
106
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-descriptor.js","sourceRoot":"","sources":["../../../src/commands/bar/launch-descriptor.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,+CAAiC;AACjC,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,0DAAuD;AACvD,2CAAiD;AAGjD,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrF,CAAC;
|
|
1
|
+
{"version":3,"file":"launch-descriptor.js","sourceRoot":"","sources":["../../../src/commands/bar/launch-descriptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,11 @@
|
|
|
7
7
|
* Detached model (replaces the old in-process model):
|
|
8
8
|
* 1. Probe candidate ports (bar.json port first, then 3000/3001/3002/8000/8080).
|
|
9
9
|
* 2. If a live server is found → reuse it, write bar.json, open app, return.
|
|
10
|
-
*
|
|
10
|
+
* With an explicit --port that differs from the running server's port,
|
|
11
|
+
* stop that server first and fall through to a fresh start instead.
|
|
12
|
+
* 3. Else → pick a port (--port exactly when given; otherwise bar.json's
|
|
13
|
+
* recorded port first, then the default candidates), refresh launch.json
|
|
14
|
+
* (including --port so the Swift app self-starts on the same port), spawn
|
|
11
15
|
* `ccs bar serve --port N` detached with stdio → serve.log, poll
|
|
12
16
|
* /api/bar/summary until 200 (timeout ~10 s), write bar.json, open app,
|
|
13
17
|
* return. The CLI process exits; the server continues as a detached child.
|
|
@@ -53,10 +57,23 @@ export interface LaunchDeps {
|
|
|
53
57
|
* Returns the live baseUrl on success, throws on timeout.
|
|
54
58
|
*/
|
|
55
59
|
waitForServerLive: (baseUrl: string) => Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Build the launch.json descriptor (includes the chosen --port so the Swift
|
|
62
|
+
* app self-starts the server on the same port).
|
|
63
|
+
*/
|
|
64
|
+
createLaunchDescriptor: (opts?: {
|
|
65
|
+
port?: number;
|
|
66
|
+
}) => LaunchJson;
|
|
56
67
|
/**
|
|
57
68
|
* Write launch.json so the Swift app can spawn the server independently.
|
|
58
69
|
*/
|
|
59
70
|
writeLaunchDescriptor: (jsonPath: string, descriptor: LaunchJson) => void;
|
|
71
|
+
/**
|
|
72
|
+
* Stop the detached CCS Bar server recorded in server.pid and wait briefly
|
|
73
|
+
* for the port to free. Used when an explicit --port differs from the port
|
|
74
|
+
* the running server occupies.
|
|
75
|
+
*/
|
|
76
|
+
stopDetachedServer: (ccsDir: string) => Promise<void>;
|
|
60
77
|
/** Open the installed .app bundle. Throws if the app is not found. */
|
|
61
78
|
openApp: (appPath: string) => Promise<void>;
|
|
62
79
|
/** Returns path to ~/.ccs (respects CCS_HOME for test isolation). */
|