@kaitranntt/ccs 7.50.0-dev.2 → 7.50.0-dev.4
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 +3 -0
- package/dist/ccs.js +31 -7
- package/dist/ccs.js.map +1 -1
- package/dist/targets/droid-adapter.d.ts.map +1 -1
- package/dist/targets/droid-adapter.js +1 -0
- package/dist/targets/droid-adapter.js.map +1 -1
- package/dist/targets/droid-config-manager.d.ts +1 -0
- package/dist/targets/droid-config-manager.d.ts.map +1 -1
- package/dist/targets/droid-config-manager.js +106 -3
- package/dist/targets/droid-config-manager.js.map +1 -1
- package/dist/targets/droid-reasoning-runtime.d.ts +14 -0
- package/dist/targets/droid-reasoning-runtime.d.ts.map +1 -0
- package/dist/targets/droid-reasoning-runtime.js +42 -0
- package/dist/targets/droid-reasoning-runtime.js.map +1 -0
- package/dist/targets/target-adapter.d.ts +6 -0
- package/dist/targets/target-adapter.d.ts.map +1 -1
- package/dist/ui/assets/accounts-B3RlymZc.js +1 -0
- package/dist/ui/assets/{alert-dialog-DmrIcJav.js → alert-dialog-CuEMPUz1.js} +1 -1
- package/dist/ui/assets/api-B2ICvWzi.js +1 -0
- package/dist/ui/assets/{auth-section-CP_2r8oJ.js → auth-section-47vsG_g9.js} +1 -1
- package/dist/ui/assets/{backups-section-jwtuA5Ay.js → backups-section-D-sat7Ti.js} +1 -1
- package/dist/ui/assets/{checkbox-CNqHZx7Z.js → checkbox-C-12mTDT.js} +1 -1
- package/dist/ui/assets/{cliproxy-CtO9BwgG.js → cliproxy-CAR-zTil.js} +1 -1
- package/dist/ui/assets/{cliproxy-control-panel--WUVyBIk.js → cliproxy-control-panel-3uthxEI-.js} +1 -1
- package/dist/ui/assets/{confirm-dialog-CQNxkz9X.js → confirm-dialog-BfiBvMqW.js} +1 -1
- package/dist/ui/assets/{copilot-DLxxmnsW.js → copilot-Dz0B1ZUz.js} +1 -1
- package/dist/ui/assets/{cursor-YRIza7sP.js → cursor-DdPXjHsr.js} +1 -1
- package/dist/ui/assets/droid-DE-zbt4u.js +2 -0
- package/dist/ui/assets/globalenv-section-BKbOddIv.js +1 -0
- package/dist/ui/assets/{health-BWPd6F4h.js → health-Bu6uaf__.js} +1 -1
- package/dist/ui/assets/icons-ErRLeJ3U.js +1 -0
- package/dist/ui/assets/index-CjJDhkhP.css +1 -0
- package/dist/ui/assets/{index-D244tv89.js → index-Cl-418Sf.js} +1 -1
- package/dist/ui/assets/{index-BlldLmNl.js → index-D1DFI7Lj.js} +1 -1
- package/dist/ui/assets/{index-BZdHAol5.js → index-DNyQOJ27.js} +1 -1
- package/dist/ui/assets/index-Dzby9K4O.js +1 -0
- package/dist/ui/assets/{index-PWMOllOf.js → index-zgEA-GkK.js} +11 -11
- package/dist/ui/assets/{proxy-status-widget-MlyNgoPh.js → proxy-status-widget-BtL-jVdm.js} +1 -1
- package/dist/ui/assets/{separator-OcJLDgYQ.js → separator-sNDYgSUT.js} +1 -1
- package/dist/ui/assets/{shared-LxAdbm4g.js → shared-qWuCxx8B.js} +1 -1
- package/dist/ui/assets/{switch-s8pp-m8L.js → switch-BdRPtxoo.js} +1 -1
- package/dist/ui/assets/{updates-BQRhDVbP.js → updates-BIpeiM6l.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/web-server/routes/droid-routes.d.ts +3 -0
- package/dist/web-server/routes/droid-routes.d.ts.map +1 -0
- package/dist/web-server/routes/droid-routes.js +61 -0
- package/dist/web-server/routes/droid-routes.js.map +1 -0
- package/dist/web-server/routes/index.d.ts.map +1 -1
- package/dist/web-server/routes/index.js +3 -0
- package/dist/web-server/routes/index.js.map +1 -1
- package/dist/web-server/services/compatible-cli-docs-registry.d.ts +23 -0
- package/dist/web-server/services/compatible-cli-docs-registry.d.ts.map +1 -0
- package/dist/web-server/services/compatible-cli-docs-registry.js +81 -0
- package/dist/web-server/services/compatible-cli-docs-registry.js.map +1 -0
- package/dist/web-server/services/compatible-cli-json-file-service.d.ts +41 -0
- package/dist/web-server/services/compatible-cli-json-file-service.d.ts.map +1 -0
- package/dist/web-server/services/compatible-cli-json-file-service.js +205 -0
- package/dist/web-server/services/compatible-cli-json-file-service.js.map +1 -0
- package/dist/web-server/services/compatible-cli-types.d.ts +82 -0
- package/dist/web-server/services/compatible-cli-types.d.ts.map +1 -0
- package/dist/web-server/services/compatible-cli-types.js +3 -0
- package/dist/web-server/services/compatible-cli-types.js.map +1 -0
- package/dist/web-server/services/droid-dashboard-service.d.ts +29 -0
- package/dist/web-server/services/droid-dashboard-service.d.ts.map +1 -0
- package/dist/web-server/services/droid-dashboard-service.js +238 -0
- package/dist/web-server/services/droid-dashboard-service.js.map +1 -0
- package/package.json +1 -1
- package/dist/ui/assets/accounts-BKK-Lc16.js +0 -1
- package/dist/ui/assets/api-DzTwRtww.js +0 -1
- package/dist/ui/assets/globalenv-section-vUSIK5rf.js +0 -1
- package/dist/ui/assets/icons-Dk2sL3Mr.js +0 -1
- package/dist/ui/assets/index-B9dJZNls.js +0 -1
- package/dist/ui/assets/index-DEDy1J8t.css +0 -1
|
@@ -0,0 +1,205 @@
|
|
|
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.writeJsonObjectFileAtomic = exports.parseJsonObjectText = exports.probeJsonObjectFile = exports.JsonFileConflictError = exports.JsonFileValidationError = void 0;
|
|
27
|
+
const fs_1 = require("fs");
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
class JsonFileValidationError extends Error {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = 'JsonFileValidationError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.JsonFileValidationError = JsonFileValidationError;
|
|
36
|
+
class JsonFileConflictError extends Error {
|
|
37
|
+
constructor(message, mtime) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.code = 'CONFLICT';
|
|
40
|
+
this.name = 'JsonFileConflictError';
|
|
41
|
+
this.mtime = mtime;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.JsonFileConflictError = JsonFileConflictError;
|
|
45
|
+
function isObject(value) {
|
|
46
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
47
|
+
}
|
|
48
|
+
async function statPath(filePath) {
|
|
49
|
+
try {
|
|
50
|
+
return await fs_1.promises.lstat(filePath);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error.code === 'ENOENT') {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function probeJsonObjectFile(filePath, label, displayPath) {
|
|
60
|
+
const stat = await statPath(filePath);
|
|
61
|
+
if (!stat) {
|
|
62
|
+
return {
|
|
63
|
+
diagnostics: {
|
|
64
|
+
label,
|
|
65
|
+
path: displayPath,
|
|
66
|
+
resolvedPath: filePath,
|
|
67
|
+
exists: false,
|
|
68
|
+
isSymlink: false,
|
|
69
|
+
isRegularFile: false,
|
|
70
|
+
sizeBytes: null,
|
|
71
|
+
mtimeMs: null,
|
|
72
|
+
parseError: null,
|
|
73
|
+
readError: null,
|
|
74
|
+
},
|
|
75
|
+
json: null,
|
|
76
|
+
rawText: '{}',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const diagnostics = {
|
|
80
|
+
label,
|
|
81
|
+
path: displayPath,
|
|
82
|
+
resolvedPath: filePath,
|
|
83
|
+
exists: true,
|
|
84
|
+
isSymlink: stat.isSymbolicLink(),
|
|
85
|
+
isRegularFile: stat.isFile(),
|
|
86
|
+
sizeBytes: stat.size,
|
|
87
|
+
mtimeMs: stat.mtimeMs,
|
|
88
|
+
parseError: null,
|
|
89
|
+
readError: null,
|
|
90
|
+
};
|
|
91
|
+
if (diagnostics.isSymlink) {
|
|
92
|
+
diagnostics.readError = 'Refusing symlink file for safety.';
|
|
93
|
+
return { diagnostics, json: null, rawText: '{}' };
|
|
94
|
+
}
|
|
95
|
+
if (!diagnostics.isRegularFile) {
|
|
96
|
+
diagnostics.readError = 'Target is not a regular file.';
|
|
97
|
+
return { diagnostics, json: null, rawText: '{}' };
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const rawText = await fs_1.promises.readFile(filePath, 'utf8');
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(rawText);
|
|
103
|
+
if (!isObject(parsed)) {
|
|
104
|
+
diagnostics.parseError = 'JSON root must be an object.';
|
|
105
|
+
return { diagnostics, json: null, rawText };
|
|
106
|
+
}
|
|
107
|
+
return { diagnostics, json: parsed, rawText };
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
diagnostics.parseError = error.message;
|
|
111
|
+
return { diagnostics, json: null, rawText };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
diagnostics.readError = error.message;
|
|
116
|
+
return { diagnostics, json: null, rawText: '{}' };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.probeJsonObjectFile = probeJsonObjectFile;
|
|
120
|
+
function parseJsonObjectText(rawText, fieldName = 'rawText') {
|
|
121
|
+
let parsed;
|
|
122
|
+
try {
|
|
123
|
+
parsed = JSON.parse(rawText);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw new JsonFileValidationError(`Invalid JSON in ${fieldName}: ${error.message}`);
|
|
127
|
+
}
|
|
128
|
+
if (!isObject(parsed)) {
|
|
129
|
+
throw new JsonFileValidationError(`${fieldName} JSON root must be an object.`);
|
|
130
|
+
}
|
|
131
|
+
return parsed;
|
|
132
|
+
}
|
|
133
|
+
exports.parseJsonObjectText = parseJsonObjectText;
|
|
134
|
+
async function writeJsonObjectFileAtomic(input) {
|
|
135
|
+
const fileLabel = input.fileLabel || path.basename(input.filePath);
|
|
136
|
+
const parsed = parseJsonObjectText(input.rawText, fileLabel);
|
|
137
|
+
const targetPath = input.filePath;
|
|
138
|
+
const targetDir = path.dirname(targetPath);
|
|
139
|
+
const tempPath = targetPath + '.tmp';
|
|
140
|
+
const dirMode = input.dirMode ?? 0o700;
|
|
141
|
+
const fileMode = input.fileMode ?? 0o600;
|
|
142
|
+
await fs_1.promises.mkdir(targetDir, { recursive: true, mode: dirMode });
|
|
143
|
+
const targetStat = await statPath(targetPath);
|
|
144
|
+
if (targetStat) {
|
|
145
|
+
const stat = targetStat;
|
|
146
|
+
if (stat.isSymbolicLink()) {
|
|
147
|
+
throw new Error(`Refusing to write: ${fileLabel} is a symlink.`);
|
|
148
|
+
}
|
|
149
|
+
if (!stat.isFile()) {
|
|
150
|
+
throw new Error(`Refusing to write: ${fileLabel} is not a regular file.`);
|
|
151
|
+
}
|
|
152
|
+
if (typeof input.expectedMtime !== 'number' || !Number.isFinite(input.expectedMtime)) {
|
|
153
|
+
throw new JsonFileConflictError('File metadata not loaded. Refresh and retry.', stat.mtimeMs);
|
|
154
|
+
}
|
|
155
|
+
if (Math.abs(stat.mtimeMs - input.expectedMtime) > 1000) {
|
|
156
|
+
throw new JsonFileConflictError('File modified externally.', stat.mtimeMs);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
let wroteTemp = false;
|
|
160
|
+
try {
|
|
161
|
+
const existingTempStat = await statPath(tempPath);
|
|
162
|
+
if (existingTempStat) {
|
|
163
|
+
const tempStat = existingTempStat;
|
|
164
|
+
if (tempStat.isSymbolicLink()) {
|
|
165
|
+
throw new Error(`Refusing to write: ${fileLabel}.tmp is a symlink.`);
|
|
166
|
+
}
|
|
167
|
+
if (!tempStat.isFile()) {
|
|
168
|
+
throw new Error(`Refusing to write: ${fileLabel}.tmp is not a regular file.`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await fs_1.promises.writeFile(tempPath, JSON.stringify(parsed, null, 2) + '\n', { mode: fileMode });
|
|
172
|
+
wroteTemp = true;
|
|
173
|
+
const tempStat = await fs_1.promises.lstat(tempPath);
|
|
174
|
+
if (tempStat.isSymbolicLink()) {
|
|
175
|
+
throw new Error(`Refusing to write: ${fileLabel}.tmp is a symlink.`);
|
|
176
|
+
}
|
|
177
|
+
if (!tempStat.isFile()) {
|
|
178
|
+
throw new Error(`Refusing to write: ${fileLabel}.tmp is not a regular file.`);
|
|
179
|
+
}
|
|
180
|
+
await fs_1.promises.rename(tempPath, targetPath);
|
|
181
|
+
wroteTemp = false;
|
|
182
|
+
try {
|
|
183
|
+
await fs_1.promises.chmod(targetPath, fileMode);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Best-effort permission hardening.
|
|
187
|
+
}
|
|
188
|
+
const stat = await fs_1.promises.stat(targetPath);
|
|
189
|
+
return { mtime: stat.mtimeMs };
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
if (wroteTemp) {
|
|
193
|
+
try {
|
|
194
|
+
await fs_1.promises.unlink(tempPath);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
if (error.code !== 'ENOENT') {
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.writeJsonObjectFileAtomic = writeJsonObjectFileAtomic;
|
|
205
|
+
//# sourceMappingURL=compatible-cli-json-file-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatible-cli-json-file-service.js","sourceRoot":"","sources":["../../../src/web-server/services/compatible-cli-json-file-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export type DroidBinarySource = 'CCS_DROID_PATH' | 'PATH' | 'missing';
|
|
2
|
+
export interface DroidBinaryDiagnostics {
|
|
3
|
+
installed: boolean;
|
|
4
|
+
path: string | null;
|
|
5
|
+
installDir: string | null;
|
|
6
|
+
source: DroidBinarySource;
|
|
7
|
+
version: string | null;
|
|
8
|
+
overridePath: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface DroidConfigFileDiagnostics {
|
|
11
|
+
label: string;
|
|
12
|
+
path: string;
|
|
13
|
+
resolvedPath: string;
|
|
14
|
+
exists: boolean;
|
|
15
|
+
isSymlink: boolean;
|
|
16
|
+
isRegularFile: boolean;
|
|
17
|
+
sizeBytes: number | null;
|
|
18
|
+
mtimeMs: number | null;
|
|
19
|
+
parseError: string | null;
|
|
20
|
+
readError: string | null;
|
|
21
|
+
}
|
|
22
|
+
export interface DroidCustomModelDiagnostics {
|
|
23
|
+
displayName: string;
|
|
24
|
+
model: string;
|
|
25
|
+
provider: string;
|
|
26
|
+
baseUrl: string;
|
|
27
|
+
host: string | null;
|
|
28
|
+
maxOutputTokens: number | null;
|
|
29
|
+
isCcsManaged: boolean;
|
|
30
|
+
apiKeyState: 'set' | 'missing';
|
|
31
|
+
apiKeyPreview: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface DroidByokDiagnostics {
|
|
34
|
+
activeModelSelector: string | null;
|
|
35
|
+
customModelCount: number;
|
|
36
|
+
ccsManagedCount: number;
|
|
37
|
+
userManagedCount: number;
|
|
38
|
+
invalidModelEntryCount: number;
|
|
39
|
+
providerBreakdown: Record<string, number>;
|
|
40
|
+
customModels: DroidCustomModelDiagnostics[];
|
|
41
|
+
}
|
|
42
|
+
export interface CompatibleCliDocLink {
|
|
43
|
+
id: string;
|
|
44
|
+
label: string;
|
|
45
|
+
url: string;
|
|
46
|
+
category: 'overview' | 'configuration' | 'byok' | 'reference';
|
|
47
|
+
source: 'factory' | 'provider';
|
|
48
|
+
description: string;
|
|
49
|
+
}
|
|
50
|
+
export interface CompatibleCliProviderDocLink {
|
|
51
|
+
provider: string;
|
|
52
|
+
label: string;
|
|
53
|
+
apiFormat: string;
|
|
54
|
+
url: string;
|
|
55
|
+
}
|
|
56
|
+
export interface CompatibleCliDocsReference {
|
|
57
|
+
providerValues: string[];
|
|
58
|
+
settingsHierarchy: string[];
|
|
59
|
+
notes: string[];
|
|
60
|
+
links: CompatibleCliDocLink[];
|
|
61
|
+
providerDocs: CompatibleCliProviderDocLink[];
|
|
62
|
+
}
|
|
63
|
+
export interface DroidDashboardDiagnostics {
|
|
64
|
+
binary: DroidBinaryDiagnostics;
|
|
65
|
+
files: {
|
|
66
|
+
settings: DroidConfigFileDiagnostics;
|
|
67
|
+
legacyConfig: DroidConfigFileDiagnostics;
|
|
68
|
+
};
|
|
69
|
+
byok: DroidByokDiagnostics;
|
|
70
|
+
warnings: string[];
|
|
71
|
+
docsReference: CompatibleCliDocsReference;
|
|
72
|
+
}
|
|
73
|
+
export interface DroidRawSettingsResponse {
|
|
74
|
+
path: string;
|
|
75
|
+
resolvedPath: string;
|
|
76
|
+
exists: boolean;
|
|
77
|
+
mtime: number;
|
|
78
|
+
rawText: string;
|
|
79
|
+
settings: Record<string, unknown> | null;
|
|
80
|
+
parseError: string | null;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=compatible-cli-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatible-cli-types.d.ts","sourceRoot":"","sources":["../../../src/web-server/services/compatible-cli-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compatible-cli-types.js","sourceRoot":"","sources":["../../../src/web-server/services/compatible-cli-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { DroidByokDiagnostics, DroidDashboardDiagnostics, DroidRawSettingsResponse } from './compatible-cli-types';
|
|
3
|
+
import { JsonFileConflictError, JsonFileValidationError } from './compatible-cli-json-file-service';
|
|
4
|
+
interface DroidConfigPaths {
|
|
5
|
+
settingsPath: string;
|
|
6
|
+
settingsDisplayPath: string;
|
|
7
|
+
legacyConfigPath: string;
|
|
8
|
+
legacyConfigDisplayPath: string;
|
|
9
|
+
}
|
|
10
|
+
interface SaveDroidRawSettingsInput {
|
|
11
|
+
rawText: string;
|
|
12
|
+
expectedMtime?: number;
|
|
13
|
+
}
|
|
14
|
+
interface SaveDroidRawSettingsResult {
|
|
15
|
+
success: true;
|
|
16
|
+
mtime: number;
|
|
17
|
+
}
|
|
18
|
+
export { JsonFileConflictError as DroidRawSettingsConflictError, JsonFileValidationError as DroidRawSettingsValidationError, };
|
|
19
|
+
export declare function maskApiKeyPreview(value: string): string;
|
|
20
|
+
export declare function resolveDroidConfigPaths(options?: {
|
|
21
|
+
platform?: NodeJS.Platform;
|
|
22
|
+
env?: NodeJS.ProcessEnv;
|
|
23
|
+
homeDir?: string;
|
|
24
|
+
}): DroidConfigPaths;
|
|
25
|
+
export declare function summarizeDroidCustomModels(customModelsValue: unknown): DroidByokDiagnostics;
|
|
26
|
+
export declare function getDroidDashboardDiagnostics(): Promise<DroidDashboardDiagnostics>;
|
|
27
|
+
export declare function getDroidRawSettings(): Promise<DroidRawSettingsResponse>;
|
|
28
|
+
export declare function saveDroidRawSettings(input: SaveDroidRawSettingsInput): Promise<SaveDroidRawSettingsResult>;
|
|
29
|
+
//# sourceMappingURL=droid-dashboard-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"droid-dashboard-service.d.ts","sourceRoot":"","sources":["../../../src/web-server/services/droid-dashboard-service.ts"],"names":[],"mappings":";AAIA,OAAO,KAAK,EACV,oBAAoB,EAEpB,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EAGxB,MAAM,oCAAoC,CAAC;AAG5C,UAAU,gBAAgB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,UAAU,yBAAyB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,0BAA0B;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,OAAO,EACL,qBAAqB,IAAI,6BAA6B,EACtD,uBAAuB,IAAI,+BAA+B,GAC3D,CAAC;AA0BF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvD;AAMD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,gBAAgB,CAclB;AAiBD,wBAAgB,0BAA0B,CAAC,iBAAiB,EAAE,OAAO,GAAG,oBAAoB,CAuD3F;AAqBD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,yBAAyB,CAAC,CA2DvF;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAiB7E;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAarC"}
|
|
@@ -0,0 +1,238 @@
|
|
|
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.saveDroidRawSettings = exports.getDroidRawSettings = exports.getDroidDashboardDiagnostics = exports.summarizeDroidCustomModels = exports.resolveDroidConfigPaths = exports.maskApiKeyPreview = exports.DroidRawSettingsValidationError = exports.DroidRawSettingsConflictError = void 0;
|
|
27
|
+
const os = __importStar(require("os"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
const child_process_1 = require("child_process");
|
|
30
|
+
const droid_detector_1 = require("../../targets/droid-detector");
|
|
31
|
+
const compatible_cli_json_file_service_1 = require("./compatible-cli-json-file-service");
|
|
32
|
+
Object.defineProperty(exports, "DroidRawSettingsConflictError", { enumerable: true, get: function () { return compatible_cli_json_file_service_1.JsonFileConflictError; } });
|
|
33
|
+
Object.defineProperty(exports, "DroidRawSettingsValidationError", { enumerable: true, get: function () { return compatible_cli_json_file_service_1.JsonFileValidationError; } });
|
|
34
|
+
const compatible_cli_docs_registry_1 = require("./compatible-cli-docs-registry");
|
|
35
|
+
function isObject(value) {
|
|
36
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
37
|
+
}
|
|
38
|
+
function asObject(value) {
|
|
39
|
+
return isObject(value) ? value : null;
|
|
40
|
+
}
|
|
41
|
+
function asString(value) {
|
|
42
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;
|
|
43
|
+
}
|
|
44
|
+
function asNumber(value) {
|
|
45
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
46
|
+
}
|
|
47
|
+
function parseHost(value) {
|
|
48
|
+
try {
|
|
49
|
+
return new URL(value).host || null;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function maskApiKeyPreview(value) {
|
|
56
|
+
if (!value)
|
|
57
|
+
return '';
|
|
58
|
+
const suffix = value.slice(-4);
|
|
59
|
+
return `***${suffix}`;
|
|
60
|
+
}
|
|
61
|
+
exports.maskApiKeyPreview = maskApiKeyPreview;
|
|
62
|
+
function isCcsManagedDisplayName(displayName) {
|
|
63
|
+
return displayName.startsWith('CCS ') || displayName.startsWith('ccs-');
|
|
64
|
+
}
|
|
65
|
+
function resolveDroidConfigPaths(options = {}) {
|
|
66
|
+
const env = options.env ?? process.env;
|
|
67
|
+
const homeDir = options.homeDir ?? os.homedir();
|
|
68
|
+
const byokBase = env.CCS_HOME || homeDir;
|
|
69
|
+
const settingsPath = path.join(byokBase, '.factory', 'settings.json');
|
|
70
|
+
const legacyConfigPath = path.join(byokBase, '.factory', 'config.json');
|
|
71
|
+
return {
|
|
72
|
+
settingsPath,
|
|
73
|
+
settingsDisplayPath: '~/.factory/settings.json',
|
|
74
|
+
legacyConfigPath,
|
|
75
|
+
legacyConfigDisplayPath: '~/.factory/config.json',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
exports.resolveDroidConfigPaths = resolveDroidConfigPaths;
|
|
79
|
+
function getBinaryVersion(binaryPath) {
|
|
80
|
+
try {
|
|
81
|
+
return (0, child_process_1.execFileSync)(binaryPath, ['--version'], {
|
|
82
|
+
encoding: 'utf8',
|
|
83
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
84
|
+
timeout: 5000,
|
|
85
|
+
})
|
|
86
|
+
.trim()
|
|
87
|
+
.split('\n')[0]
|
|
88
|
+
.trim();
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function summarizeDroidCustomModels(customModelsValue) {
|
|
95
|
+
const rows = [];
|
|
96
|
+
const providerBreakdown = {};
|
|
97
|
+
let invalidModelEntryCount = 0;
|
|
98
|
+
const source = Array.isArray(customModelsValue)
|
|
99
|
+
? customModelsValue
|
|
100
|
+
: isObject(customModelsValue)
|
|
101
|
+
? Object.values(customModelsValue)
|
|
102
|
+
: [];
|
|
103
|
+
for (const item of source) {
|
|
104
|
+
if (!isObject(item)) {
|
|
105
|
+
invalidModelEntryCount += 1;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const displayName = asString(item.displayName) ?? asString(item.model_display_name);
|
|
109
|
+
const model = asString(item.model);
|
|
110
|
+
const baseUrl = asString(item.baseUrl) ?? asString(item.base_url);
|
|
111
|
+
const providerRaw = asString(item.provider);
|
|
112
|
+
const apiKey = asString(item.apiKey) ?? asString(item.api_key);
|
|
113
|
+
if (!displayName || !model || !baseUrl || !providerRaw) {
|
|
114
|
+
invalidModelEntryCount += 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const provider = providerRaw.toLowerCase();
|
|
118
|
+
providerBreakdown[provider] = (providerBreakdown[provider] ?? 0) + 1;
|
|
119
|
+
rows.push({
|
|
120
|
+
displayName,
|
|
121
|
+
model,
|
|
122
|
+
provider,
|
|
123
|
+
baseUrl,
|
|
124
|
+
host: parseHost(baseUrl),
|
|
125
|
+
maxOutputTokens: asNumber(item.maxOutputTokens) ?? asNumber(item.max_tokens),
|
|
126
|
+
isCcsManaged: isCcsManagedDisplayName(displayName),
|
|
127
|
+
apiKeyState: apiKey ? 'set' : 'missing',
|
|
128
|
+
apiKeyPreview: apiKey ? maskApiKeyPreview(apiKey) : null,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const ccsManagedCount = rows.filter((row) => row.isCcsManaged).length;
|
|
132
|
+
return {
|
|
133
|
+
activeModelSelector: null,
|
|
134
|
+
customModelCount: rows.length,
|
|
135
|
+
ccsManagedCount,
|
|
136
|
+
userManagedCount: rows.length - ccsManagedCount,
|
|
137
|
+
invalidModelEntryCount,
|
|
138
|
+
providerBreakdown,
|
|
139
|
+
customModels: rows,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
exports.summarizeDroidCustomModels = summarizeDroidCustomModels;
|
|
143
|
+
function resolveCustomModelsValue(settings) {
|
|
144
|
+
if (!settings)
|
|
145
|
+
return undefined;
|
|
146
|
+
const modern = settings.customModels;
|
|
147
|
+
if (Array.isArray(modern) || isObject(modern))
|
|
148
|
+
return modern;
|
|
149
|
+
const legacy = settings.custom_models;
|
|
150
|
+
if (Array.isArray(legacy) || isObject(legacy))
|
|
151
|
+
return legacy;
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
function usesLegacyCustomModelsKey(settings) {
|
|
155
|
+
if (!settings)
|
|
156
|
+
return false;
|
|
157
|
+
const modern = settings.customModels;
|
|
158
|
+
if (Array.isArray(modern) || isObject(modern))
|
|
159
|
+
return false;
|
|
160
|
+
const legacy = settings.custom_models;
|
|
161
|
+
return Array.isArray(legacy) || isObject(legacy);
|
|
162
|
+
}
|
|
163
|
+
async function getDroidDashboardDiagnostics() {
|
|
164
|
+
const paths = resolveDroidConfigPaths();
|
|
165
|
+
const binaryPath = (0, droid_detector_1.detectDroidCli)();
|
|
166
|
+
const docsReference = (0, compatible_cli_docs_registry_1.getCompatibleCliDocsReference)('droid');
|
|
167
|
+
const source = process.env.CCS_DROID_PATH ? 'CCS_DROID_PATH' : binaryPath ? 'PATH' : 'missing';
|
|
168
|
+
const settingsProbe = await (0, compatible_cli_json_file_service_1.probeJsonObjectFile)(paths.settingsPath, 'BYOK settings', paths.settingsDisplayPath);
|
|
169
|
+
const legacyConfigProbe = await (0, compatible_cli_json_file_service_1.probeJsonObjectFile)(paths.legacyConfigPath, 'Legacy config', paths.legacyConfigDisplayPath);
|
|
170
|
+
const settingsJson = asObject(settingsProbe.json);
|
|
171
|
+
const legacyJson = asObject(legacyConfigProbe.json);
|
|
172
|
+
const settingsCustomModels = resolveCustomModelsValue(settingsJson);
|
|
173
|
+
const legacyCustomModels = resolveCustomModelsValue(legacyJson);
|
|
174
|
+
const byok = summarizeDroidCustomModels(settingsCustomModels ?? legacyCustomModels);
|
|
175
|
+
byok.activeModelSelector = asString(settingsProbe.json?.model);
|
|
176
|
+
const warnings = [];
|
|
177
|
+
if (!binaryPath)
|
|
178
|
+
warnings.push('Droid binary is not detected in PATH or CCS_DROID_PATH.');
|
|
179
|
+
if (settingsProbe.diagnostics.parseError) {
|
|
180
|
+
warnings.push('~/.factory/settings.json contains invalid JSON.');
|
|
181
|
+
}
|
|
182
|
+
if (byok.invalidModelEntryCount > 0) {
|
|
183
|
+
warnings.push(`${byok.invalidModelEntryCount} customModels entries are malformed.`);
|
|
184
|
+
}
|
|
185
|
+
if (legacyConfigProbe.diagnostics.parseError) {
|
|
186
|
+
warnings.push('Legacy Droid config (~/.factory/config.json) JSON is invalid.');
|
|
187
|
+
}
|
|
188
|
+
if (usesLegacyCustomModelsKey(settingsJson)) {
|
|
189
|
+
warnings.push('settings.json uses legacy "custom_models" key; prefer "customModels" for forward compatibility.');
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
binary: {
|
|
193
|
+
installed: !!binaryPath,
|
|
194
|
+
path: binaryPath,
|
|
195
|
+
installDir: binaryPath ? path.dirname(binaryPath) : null,
|
|
196
|
+
source,
|
|
197
|
+
version: binaryPath ? getBinaryVersion(binaryPath) : null,
|
|
198
|
+
overridePath: process.env.CCS_DROID_PATH || null,
|
|
199
|
+
},
|
|
200
|
+
files: {
|
|
201
|
+
settings: settingsProbe.diagnostics,
|
|
202
|
+
legacyConfig: legacyConfigProbe.diagnostics,
|
|
203
|
+
},
|
|
204
|
+
byok,
|
|
205
|
+
warnings,
|
|
206
|
+
docsReference,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
exports.getDroidDashboardDiagnostics = getDroidDashboardDiagnostics;
|
|
210
|
+
async function getDroidRawSettings() {
|
|
211
|
+
const paths = resolveDroidConfigPaths();
|
|
212
|
+
const settingsProbe = await (0, compatible_cli_json_file_service_1.probeJsonObjectFile)(paths.settingsPath, 'BYOK settings', paths.settingsDisplayPath);
|
|
213
|
+
return {
|
|
214
|
+
path: paths.settingsDisplayPath,
|
|
215
|
+
resolvedPath: paths.settingsPath,
|
|
216
|
+
exists: settingsProbe.diagnostics.exists,
|
|
217
|
+
mtime: settingsProbe.diagnostics.mtimeMs ?? Date.now(),
|
|
218
|
+
rawText: settingsProbe.rawText,
|
|
219
|
+
settings: settingsProbe.json,
|
|
220
|
+
parseError: settingsProbe.diagnostics.parseError,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
exports.getDroidRawSettings = getDroidRawSettings;
|
|
224
|
+
async function saveDroidRawSettings(input) {
|
|
225
|
+
const paths = resolveDroidConfigPaths();
|
|
226
|
+
if (typeof input.rawText !== 'string') {
|
|
227
|
+
throw new compatible_cli_json_file_service_1.JsonFileValidationError('rawText must be a string.');
|
|
228
|
+
}
|
|
229
|
+
const saved = await (0, compatible_cli_json_file_service_1.writeJsonObjectFileAtomic)({
|
|
230
|
+
filePath: paths.settingsPath,
|
|
231
|
+
rawText: input.rawText,
|
|
232
|
+
expectedMtime: input.expectedMtime,
|
|
233
|
+
fileLabel: 'settings.json',
|
|
234
|
+
});
|
|
235
|
+
return { success: true, mtime: saved.mtime };
|
|
236
|
+
}
|
|
237
|
+
exports.saveDroidRawSettings = saveDroidRawSettings;
|
|
238
|
+
//# sourceMappingURL=droid-dashboard-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"droid-dashboard-service.js","sourceRoot":"","sources":["../../../src/web-server/services/droid-dashboard-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./radix-ui-DIWAxjEp.js";import{r as x}from"./react-vendor-CNOkPC89.js";import{u as R,a as b,b as v,d as _,f as k,g as F}from"./tanstack-Hn82hibe.js";import{c as p,W as C,b as m,a5 as L,a6 as P,a7 as q,a8 as K,a9 as M,L as j,I as T}from"./index-PWMOllOf.js";import{A as $,a as G,b as E,c as H,d as Q,e as O,f as Z,g as B}from"./alert-dialog-DmrIcJav.js";import{t as h}from"./notifications-B2HqRBj7.js";import{v as I,j as y,ag as V,y as U,l as S,$ as W}from"./icons-Dk2sL3Mr.js";import{C as J}from"./checkbox-CNqHZx7Z.js";import"./utils-CzKF5WmX.js";import"./form-utils-Cn_Uld6y.js";import"./code-highlight-BRUf_pqB.js";function X({className:n,...t}){return e.jsx("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:e.jsx("table",{"data-slot":"table",className:p("w-full caption-bottom text-sm",n),...t})})}function Y({className:n,...t}){return e.jsx("thead",{"data-slot":"table-header",className:p("[&_tr]:border-b",n),...t})}function ee({className:n,...t}){return e.jsx("tbody",{"data-slot":"table-body",className:p("[&_tr:last-child]:border-0",n),...t})}function z({className:n,...t}){return e.jsx("tr",{"data-slot":"table-row",className:p("hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",n),...t})}function te({className:n,...t}){return e.jsx("th",{"data-slot":"table-head",className:p("text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",n),...t})}function se({className:n,...t}){return e.jsx("td",{"data-slot":"table-cell",className:p("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",n),...t})}function ae(){return R({queryKey:["accounts"],queryFn:()=>C.accounts.list()})}function ne(){const n=b();return v({mutationFn:t=>C.accounts.setDefault(t),onSuccess:(t,r)=>{n.invalidateQueries({queryKey:["accounts"]}),h.success(`Default account set to "${r}"`)},onError:t=>{h.error(t.message)}})}function re(){const n=b();return v({mutationFn:()=>C.accounts.resetDefault(),onSuccess:()=>{n.invalidateQueries({queryKey:["accounts"]}),h.success("Default account reset to CCS")},onError:t=>{h.error(t.message)}})}function le(){const n=b();return v({mutationFn:t=>C.accounts.delete(t),onSuccess:(t,r)=>{n.invalidateQueries({queryKey:["accounts"]}),h.success(`Account "${r}" deleted`)},onError:t=>{h.error(t.message)}})}function oe({data:n,defaultAccount:t}){const r=ne(),c=le(),l=re(),[i,d]=x.useState(null),g=_({data:n,columns:[{accessorKey:"name",header:"Name",size:200,cell:({row:s})=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium",children:s.original.name}),s.original.name===t&&e.jsx("span",{className:"text-xs bg-primary/10 text-primary px-1.5 py-0.5 rounded border border-primary/20",children:"default"})]})},{accessorKey:"type",header:"Type",size:100,cell:({row:s})=>e.jsx("span",{className:"capitalize text-muted-foreground",children:s.original.type||"oauth"})},{accessorKey:"created",header:"Created",size:150,cell:({row:s})=>{const a=new Date(s.original.created);return e.jsx("span",{className:"text-muted-foreground",children:a.toLocaleDateString()})}},{accessorKey:"last_used",header:"Last Used",size:150,cell:({row:s})=>{if(!s.original.last_used)return e.jsx("span",{className:"text-muted-foreground/50",children:"-"});const a=new Date(s.original.last_used);return e.jsx("span",{className:"text-muted-foreground",children:a.toLocaleDateString()})}},{id:"context",header:"Context",size:170,cell:({row:s})=>{if(s.original.type==="cliproxy")return e.jsx("span",{className:"text-muted-foreground/50",children:"-"});if((s.original.context_mode||"isolated")==="shared"){const o=s.original.context_group||"default";return e.jsxs("span",{className:"text-muted-foreground",children:["shared (",o,")"]})}return e.jsx("span",{className:"text-muted-foreground",children:"isolated"})}},{id:"actions",header:"Actions",size:180,cell:({row:s})=>{const a=s.original.name===t,o=r.isPending||c.isPending;return e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs(m,{variant:a?"secondary":"default",size:"sm",className:"h-8 px-2",disabled:a||o,onClick:()=>r.mutate(s.original.name),children:[e.jsx(y,{className:`w-3 h-3 mr-1 ${a?"opacity-50":""}`}),a?"Active":"Set Default"]}),e.jsx(m,{variant:"ghost",size:"sm",className:"h-8 px-2 text-destructive hover:text-destructive hover:bg-destructive/10",disabled:a||o,onClick:()=>d(s.original.name),title:a?"Cannot delete default account":"Delete account",children:e.jsx(V,{className:"w-4 h-4"})})]})}}],getCoreRowModel:F()});return n.length===0?e.jsxs("div",{className:"text-center py-8 text-muted-foreground",children:["No accounts found. Use"," ",e.jsx("code",{className:"text-sm bg-muted px-1 rounded",children:"ccs auth create"})," to add accounts."]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"border rounded-md",children:e.jsxs(X,{children:[e.jsx(Y,{children:g.getHeaderGroups().map(s=>e.jsx(z,{children:s.headers.map(a=>{const o={name:"w-[200px]",type:"w-[100px]",created:"w-[150px]",last_used:"w-[150px]",context:"w-[170px]",actions:"w-[180px]"}[a.id]||"w-auto";return e.jsx(te,{className:o,children:a.isPlaceholder?null:k(a.column.columnDef.header,a.getContext())},a.id)})},s.id))}),e.jsx(ee,{children:g.getRowModel().rows.map(s=>e.jsx(z,{children:s.getVisibleCells().map(a=>e.jsx(se,{children:k(a.column.columnDef.cell,a.getContext())},a.id))},s.id))})]})}),t&&e.jsx("div",{className:"flex justify-end",children:e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>l.mutate(),disabled:l.isPending,children:[e.jsx(I,{className:"w-4 h-4 mr-2"}),"Reset to CCS Default"]})})]}),e.jsx($,{open:!!i,onOpenChange:s=>!s&&d(null),children:e.jsxs(G,{children:[e.jsxs(E,{children:[e.jsx(H,{children:"Delete Account"}),e.jsxs(Q,{children:['Are you sure you want to delete the account "',i,'"? This will remove the profile and all its session data. This action cannot be undone.']})]}),e.jsxs(O,{children:[e.jsx(Z,{children:"Cancel"}),e.jsx(B,{className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",onClick:()=>{i&&(c.mutate(i),d(null))},children:"Delete"})]})]})})]})}function ce({open:n,onClose:t}){const[r,c]=x.useState(""),[l,i]=x.useState(!1),[d,N]=x.useState(""),[g,s]=x.useState(!1),a=/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(r),o=d.trim().toLowerCase(),f=o.length===0||/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(o),w=r&&a?[`ccs auth create ${r}`,l?o.length>0?`--context-group ${o}`:"--share-context":""].filter(Boolean).join(" "):"ccs auth create <name>",D=async()=>{!a||l&&!f||(await navigator.clipboard.writeText(w),s(!0),setTimeout(()=>s(!1),2e3))},A=()=>{c(""),i(!1),N(""),s(!1),t()};return e.jsx(L,{open:n,onOpenChange:u=>!u&&A(),children:e.jsxs(P,{className:"sm:max-w-md",children:[e.jsxs(q,{children:[e.jsx(K,{children:"Create New Account"}),e.jsx(M,{children:"Auth profiles require Claude CLI login. Run the command below in your terminal."})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{htmlFor:"profile-name",children:"Profile Name"}),e.jsx(T,{id:"profile-name",value:r,onChange:u=>c(u.target.value),placeholder:"e.g., work, personal, client",autoComplete:"off"}),r&&!a&&e.jsx("p",{className:"text-xs text-destructive",children:"Name must start with a letter and contain only letters, numbers, dashes, or underscores."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(J,{id:"share-context",checked:l,onCheckedChange:u=>i(u===!0)}),e.jsx(j,{htmlFor:"share-context",className:"cursor-pointer",children:"Share project context with other accounts"})]}),l&&e.jsxs("div",{className:"space-y-2 pl-6",children:[e.jsx(j,{htmlFor:"context-group",children:"Context Group (optional)"}),e.jsx(T,{id:"context-group",value:d,onChange:u=>N(u.target.value),placeholder:"default, sprint-a, client-x",autoComplete:"off"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Leave empty to use the default shared group."}),d.trim().length>0&&!f&&e.jsx("p",{className:"text-xs text-destructive",children:"Group must start with a letter and use only letters, numbers, dashes, or underscores."})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(j,{children:"Command"}),e.jsxs("div",{className:"flex items-center gap-2 p-3 bg-muted rounded-md font-mono text-sm",children:[e.jsx(U,{className:"w-4 h-4 text-muted-foreground shrink-0"}),e.jsx("code",{className:"flex-1 break-all",children:w}),e.jsx(m,{variant:"ghost",size:"sm",className:"shrink-0 h-8 px-2",onClick:D,disabled:!a||l&&!f,children:g?e.jsx(y,{className:"w-4 h-4 text-green-500"}):e.jsx(S,{className:"w-4 h-4"})})]})]}),e.jsxs("div",{className:"text-sm text-muted-foreground space-y-1",children:[e.jsx("p",{children:"After running the command:"}),e.jsxs("ol",{className:"list-decimal list-inside pl-2 space-y-0.5",children:[e.jsx("li",{children:"Complete the Claude login in your browser"}),e.jsx("li",{children:"Return here and refresh to see the new account"})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[e.jsx(m,{variant:"ghost",onClick:A,children:"Close"}),e.jsx(m,{onClick:D,disabled:!a||l&&!f,children:g?e.jsxs(e.Fragment,{children:[e.jsx(y,{className:"w-4 h-4 mr-2"}),"Copied!"]}):e.jsxs(e.Fragment,{children:[e.jsx(S,{className:"w-4 h-4 mr-2"}),"Copy Command"]})})]})]})]})})}function Ne(){const{data:n,isLoading:t,refetch:r}=ae(),[c,l]=x.useState(!1);return e.jsxs("div",{className:"p-6 max-w-6xl mx-auto space-y-8",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"Accounts"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"Manage multi-account Claude sessions (profiles.json)"})]}),e.jsxs(m,{onClick:()=>l(!0),children:[e.jsx(W,{className:"w-4 h-4 mr-2"}),"Create Account"]})]}),t?e.jsx("div",{className:"text-muted-foreground",children:"Loading accounts..."}):e.jsx(oe,{data:n?.accounts||[],defaultAccount:n?.default??null,onRefresh:r}),e.jsx(ce,{open:c,onClose:()=>l(!1)})]})}export{Ne as AccountsPage};
|