@kaitranntt/ccs 5.15.0 → 5.16.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 +3 -5
- package/VERSION +1 -1
- package/dist/cliproxy/account-manager.d.ts.map +1 -1
- package/dist/cliproxy/account-manager.js +35 -0
- package/dist/cliproxy/account-manager.js.map +1 -1
- package/dist/cliproxy/auth-handler.d.ts.map +1 -1
- package/dist/cliproxy/auth-handler.js +23 -20
- package/dist/cliproxy/auth-handler.js.map +1 -1
- package/dist/cliproxy/binary-manager.d.ts +25 -0
- package/dist/cliproxy/binary-manager.d.ts.map +1 -1
- package/dist/cliproxy/binary-manager.js +86 -5
- package/dist/cliproxy/binary-manager.js.map +1 -1
- package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -1
- package/dist/cliproxy/cliproxy-executor.js +45 -17
- package/dist/cliproxy/cliproxy-executor.js.map +1 -1
- package/dist/cliproxy/config-generator.d.ts +21 -0
- package/dist/cliproxy/config-generator.d.ts.map +1 -1
- package/dist/cliproxy/config-generator.js +127 -18
- package/dist/cliproxy/config-generator.js.map +1 -1
- package/dist/cliproxy/index.d.ts +8 -2
- package/dist/cliproxy/index.d.ts.map +1 -1
- package/dist/cliproxy/index.js +25 -2
- package/dist/cliproxy/index.js.map +1 -1
- package/dist/cliproxy/openai-compat-manager.d.ts +46 -0
- package/dist/cliproxy/openai-compat-manager.d.ts.map +1 -0
- package/dist/cliproxy/openai-compat-manager.js +191 -0
- package/dist/cliproxy/openai-compat-manager.js.map +1 -0
- package/dist/cliproxy/service-manager.d.ts +43 -0
- package/dist/cliproxy/service-manager.d.ts.map +1 -0
- package/dist/cliproxy/service-manager.js +220 -0
- package/dist/cliproxy/service-manager.js.map +1 -0
- package/dist/cliproxy/stats-fetcher.d.ts +59 -0
- package/dist/cliproxy/stats-fetcher.d.ts.map +1 -0
- package/dist/cliproxy/stats-fetcher.js +134 -0
- package/dist/cliproxy/stats-fetcher.js.map +1 -0
- package/dist/commands/cliproxy-command.d.ts.map +1 -1
- package/dist/commands/cliproxy-command.js +50 -19
- package/dist/commands/cliproxy-command.js.map +1 -1
- package/dist/commands/config-command.d.ts +1 -0
- package/dist/commands/config-command.d.ts.map +1 -1
- package/dist/commands/config-command.js +24 -1
- package/dist/commands/config-command.js.map +1 -1
- package/dist/commands/install-command.d.ts +2 -2
- package/dist/commands/install-command.d.ts.map +1 -1
- package/dist/commands/install-command.js +9 -6
- package/dist/commands/install-command.js.map +1 -1
- package/dist/commands/migrate-command.d.ts.map +1 -1
- package/dist/commands/migrate-command.js +20 -20
- package/dist/commands/migrate-command.js.map +1 -1
- package/dist/commands/shell-completion-command.d.ts.map +1 -1
- package/dist/commands/shell-completion-command.js +10 -9
- package/dist/commands/shell-completion-command.js.map +1 -1
- package/dist/commands/sync-command.d.ts.map +1 -1
- package/dist/commands/sync-command.js +5 -4
- package/dist/commands/sync-command.js.map +1 -1
- package/dist/commands/update-command.d.ts.map +1 -1
- package/dist/commands/update-command.js +41 -40
- package/dist/commands/update-command.js.map +1 -1
- package/dist/commands/version-command.d.ts +1 -1
- package/dist/commands/version-command.d.ts.map +1 -1
- package/dist/commands/version-command.js +18 -17
- package/dist/commands/version-command.js.map +1 -1
- package/dist/config/migration-manager.d.ts.map +1 -1
- package/dist/config/migration-manager.js +4 -7
- package/dist/config/migration-manager.js.map +1 -1
- package/dist/config/unified-config-loader.d.ts +1 -0
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +27 -2
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/config/unified-config-types.d.ts +2 -0
- package/dist/config/unified-config-types.d.ts.map +1 -1
- package/dist/config/unified-config-types.js +5 -5
- package/dist/config/unified-config-types.js.map +1 -1
- package/dist/delegation/delegation-handler.d.ts.map +1 -1
- package/dist/delegation/delegation-handler.js +6 -5
- package/dist/delegation/delegation-handler.js.map +1 -1
- package/dist/delegation/headless-executor.d.ts.map +1 -1
- package/dist/delegation/headless-executor.js +14 -14
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/management/doctor.d.ts +6 -2
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +130 -28
- package/dist/management/doctor.js.map +1 -1
- package/dist/management/recovery-manager.d.ts.map +1 -1
- package/dist/management/recovery-manager.js +3 -2
- package/dist/management/recovery-manager.js.map +1 -1
- package/dist/management/shared-manager.d.ts.map +1 -1
- package/dist/management/shared-manager.js +19 -18
- package/dist/management/shared-manager.js.map +1 -1
- package/dist/types/config.d.ts +13 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/ui/assets/accounts-BeL69fgi.js +1 -0
- package/dist/ui/assets/analytics-CAiq9C19.js +64 -0
- package/dist/ui/assets/{api-LYILKXgM.js → api-CvY-Z9t4.js} +1 -1
- package/dist/ui/assets/cliproxy-DbfUkLCy.js +1 -0
- package/dist/ui/assets/cliproxy-control-panel-DTiBzA5u.js +1 -0
- package/dist/ui/assets/{code-editor-HkboCFlD.js → code-editor-xnukAIwJ.js} +11 -11
- package/dist/ui/assets/health-D29me3pE.js +1 -0
- package/dist/ui/assets/icons-Alnq4BWm.js +1 -0
- package/dist/ui/assets/index-CVMaabkX.js +12 -0
- package/dist/ui/assets/index-DMEwxqAV.css +1 -0
- package/dist/ui/assets/providers/agy.png +0 -0
- package/dist/ui/assets/providers/gemini-color.svg +1 -0
- package/dist/ui/assets/providers/openai.svg +1 -0
- package/dist/ui/assets/providers/qwen-color.svg +1 -0
- package/dist/ui/assets/{radix-ui-CgfZoNEt.js → radix-ui-OFtPgiRV.js} +1 -1
- package/dist/ui/assets/{settings-DUCWbKbP.js → settings-C-IIOnQo.js} +1 -1
- package/dist/ui/assets/{shared-Da5f_jsc.js → shared-DRWHGJPD.js} +1 -1
- package/dist/ui/assets/{tanstack-BgSYOn90.js → tanstack-DMWkeNzM.js} +1 -1
- package/dist/ui/index.html +5 -5
- package/dist/utils/claude-dir-installer.js +3 -3
- package/dist/utils/claude-dir-installer.js.map +1 -1
- package/dist/utils/claude-symlink-manager.js +3 -3
- package/dist/utils/claude-symlink-manager.js.map +1 -1
- package/dist/utils/config-manager.js +10 -10
- package/dist/utils/config-manager.js.map +1 -1
- package/dist/utils/error-manager.d.ts.map +1 -1
- package/dist/utils/error-manager.js +11 -4
- package/dist/utils/error-manager.js.map +1 -1
- package/dist/utils/platform-commands.d.ts +53 -0
- package/dist/utils/platform-commands.d.ts.map +1 -0
- package/dist/utils/platform-commands.js +189 -0
- package/dist/utils/platform-commands.js.map +1 -0
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +5 -5
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/web-server/data-aggregator.d.ts +11 -1
- package/dist/web-server/data-aggregator.d.ts.map +1 -1
- package/dist/web-server/data-aggregator.js +87 -1
- package/dist/web-server/data-aggregator.js.map +1 -1
- package/dist/web-server/routes.d.ts.map +1 -1
- package/dist/web-server/routes.js +329 -4
- package/dist/web-server/routes.js.map +1 -1
- package/dist/web-server/shutdown.d.ts.map +1 -1
- package/dist/web-server/shutdown.js +4 -3
- package/dist/web-server/shutdown.js.map +1 -1
- package/dist/web-server/usage-disk-cache.d.ts +3 -2
- package/dist/web-server/usage-disk-cache.d.ts.map +1 -1
- package/dist/web-server/usage-disk-cache.js +11 -9
- package/dist/web-server/usage-disk-cache.js.map +1 -1
- package/dist/web-server/usage-routes.d.ts.map +1 -1
- package/dist/web-server/usage-routes.js +118 -17
- package/dist/web-server/usage-routes.js.map +1 -1
- package/dist/web-server/usage-types.d.ts +13 -0
- package/dist/web-server/usage-types.d.ts.map +1 -1
- package/dist/web-server/websocket.d.ts.map +1 -1
- package/dist/web-server/websocket.js +7 -6
- package/dist/web-server/websocket.js.map +1 -1
- package/package.json +3 -3
- package/scripts/verify-bundle.js +11 -4
- package/dist/ui/assets/accounts-CTh48XsV.js +0 -1
- package/dist/ui/assets/analytics-CeU8ZE3O.js +0 -64
- package/dist/ui/assets/cliproxy-Cy2Bjv-c.js +0 -1
- package/dist/ui/assets/health-DyAiAnv0.js +0 -1
- package/dist/ui/assets/icons-CRbZgamU.js +0 -1
- package/dist/ui/assets/index-BIVAVDH5.js +0 -10
- package/dist/ui/assets/index-vojI8oaQ.css +0 -1
- package/dist/ui/assets/table-BCRYixSo.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/web-server/websocket.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,2BAAgD;AAChD,iDAAoE;
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/web-server/websocket.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaitranntt/ccs",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.16.0-dev.10",
|
|
4
4
|
"description": "Claude Code Switch - Instant profile switching between Claude Sonnet 4.5 and GLM 4.6",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"ui:build": "cd ui && bun run build",
|
|
75
75
|
"ui:preview": "cd ui && bun run preview",
|
|
76
76
|
"ui:validate": "cd ui && bun run validate",
|
|
77
|
-
"prepublishOnly": "
|
|
78
|
-
"prepack": "
|
|
77
|
+
"prepublishOnly": "node scripts/sync-version.js",
|
|
78
|
+
"prepack": "node scripts/sync-version.js",
|
|
79
79
|
"prepare": "husky",
|
|
80
80
|
"postinstall": "node scripts/postinstall.js"
|
|
81
81
|
},
|
package/scripts/verify-bundle.js
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Verify UI bundle size
|
|
5
|
-
*
|
|
4
|
+
* Verify UI bundle size stays reasonable
|
|
5
|
+
*
|
|
6
|
+
* Current stack: React + TanStack Query + Radix UI + shadcn/ui + Recharts
|
|
7
|
+
* Expected range: 800KB - 1.5MB gzipped for full-featured dashboard
|
|
8
|
+
*
|
|
9
|
+
* This is a developer tool, not a public-facing site, so we optimize for
|
|
10
|
+
* features over minimal bundle size. The limit is a sanity check to catch
|
|
11
|
+
* accidental large dependencies, not a hard performance target.
|
|
6
12
|
*/
|
|
7
13
|
|
|
8
14
|
const fs = require('fs');
|
|
@@ -10,7 +16,7 @@ const path = require('path');
|
|
|
10
16
|
const zlib = require('zlib');
|
|
11
17
|
|
|
12
18
|
const UI_DIR = path.join(__dirname, '../dist/ui');
|
|
13
|
-
const MAX_SIZE = 1024 * 1024; //
|
|
19
|
+
const MAX_SIZE = 1.5 * 1024 * 1024; // 1.5MB - reasonable for full-featured React dashboard
|
|
14
20
|
|
|
15
21
|
function getGzipSize(filePath) {
|
|
16
22
|
const content = fs.readFileSync(filePath);
|
|
@@ -40,9 +46,10 @@ if (!fs.existsSync(UI_DIR)) {
|
|
|
40
46
|
|
|
41
47
|
const totalSize = walkDir(UI_DIR);
|
|
42
48
|
const sizeKB = (totalSize / 1024).toFixed(1);
|
|
49
|
+
const maxKB = (MAX_SIZE / 1024).toFixed(0);
|
|
43
50
|
|
|
44
51
|
if (totalSize > MAX_SIZE) {
|
|
45
|
-
console.log(`[X] Bundle too large: ${sizeKB}KB gzipped (max:
|
|
52
|
+
console.log(`[X] Bundle too large: ${sizeKB}KB gzipped (max: ${maxKB}KB)`);
|
|
46
53
|
process.exit(1);
|
|
47
54
|
} else {
|
|
48
55
|
console.log(`[OK] Bundle size: ${sizeKB}KB gzipped`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./radix-ui-CgfZoNEt.js";import{a as m,u as x,b as p,d as f,f as o,g as h}from"./tanstack-BgSYOn90.js";import{T as g,a as j,b as l,c as y,d as b,e as N}from"./table-BCRYixSo.js";import{p as d,t as i,B as w}from"./index-BIVAVDH5.js";import{h as C}from"./icons-CRbZgamU.js";import"./react-vendor-CjrBBxxX.js";import"./form-utils-DKkU3nz7.js";function v(){return m({queryKey:["accounts"],queryFn:()=>d.accounts.list()})}function D(){const n=x();return p({mutationFn:a=>d.accounts.setDefault(a),onSuccess:(a,c)=>{n.invalidateQueries({queryKey:["accounts"]}),i.success(`Default account set to "${c}"`)},onError:a=>{i.error(a.message)}})}function T({data:n,defaultAccount:a}){const c=D(),r=f({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===a&&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 t=new Date(s.original.created);return e.jsx("span",{className:"text-muted-foreground",children:t.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 t=new Date(s.original.last_used);return e.jsx("span",{className:"text-muted-foreground",children:t.toLocaleDateString()})}},{id:"actions",header:"Actions",size:100,cell:({row:s})=>{const t=s.original.name===a;return e.jsxs(w,{variant:t?"secondary":"default",size:"sm",className:"h-8 px-2 w-full",disabled:t||c.isPending,onClick:()=>c.mutate(s.original.name),children:[e.jsx(C,{className:`w-3 h-3 mr-1.5 ${t?"opacity-50":""}`}),t?"Active":"Set Default"]})}}],getCoreRowModel:h()});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 login"})," to add accounts."]}):e.jsx("div",{className:"border rounded-md",children:e.jsxs(g,{children:[e.jsx(j,{children:r.getHeaderGroups().map(s=>e.jsx(l,{children:s.headers.map(t=>{const u={name:"w-[200px]",type:"w-[100px]",created:"w-[150px]",last_used:"w-[150px]",actions:"w-[100px]"}[t.id]||"w-auto";return e.jsx(y,{className:u,children:t.isPlaceholder?null:o(t.column.columnDef.header,t.getContext())},t.id)})},s.id))}),e.jsx(b,{children:r.getRowModel().rows.map(s=>e.jsx(l,{children:s.getVisibleCells().map(t=>e.jsx(N,{children:o(t.column.columnDef.cell,t.getContext())},t.id))},s.id))})]})})}function q(){const{data:n,isLoading:a}=v();return e.jsxs("div",{className:"p-6 max-w-6xl mx-auto space-y-8",children:[e.jsx("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)"})]})}),a?e.jsx("div",{className:"text-muted-foreground",children:"Loading accounts..."}):e.jsx(T,{data:n?.accounts||[],defaultAccount:n?.default??null}),e.jsx("div",{className:"text-sm text-muted-foreground border-t pt-4 mt-4",children:e.jsxs("p",{children:["Accounts are isolated Claude instances with separate sessions.",e.jsx("br",{}),"Use ",e.jsx("code",{className:"bg-muted px-1 rounded",children:"ccs auth create <name>"})," to add new accounts via CLI."]})})]})}export{q as AccountsPage};
|