multi-ccp 0.1.0 → 0.1.2
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/CHANGELOG.md +4 -0
- package/README.md +218 -45
- package/README.zh-CN.md +277 -0
- package/dist/cli/program.js +158 -10
- package/dist/cli/program.js.map +1 -1
- package/dist/core/ccr.d.ts +40 -3
- package/dist/core/ccr.js +313 -3
- package/dist/core/ccr.js.map +1 -1
- package/dist/core/launcher.js +2 -5
- package/dist/core/launcher.js.map +1 -1
- package/dist/core/profiles.d.ts +3 -1
- package/dist/core/profiles.js +35 -2
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/sessions.d.ts +72 -0
- package/dist/core/sessions.js +324 -0
- package/dist/core/sessions.js.map +1 -0
- package/dist/core/types.d.ts +5 -0
- package/package.json +3 -2
package/dist/core/launcher.js
CHANGED
|
@@ -4,7 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { CcpError } from "./errors.js";
|
|
5
5
|
import { getHomeDir, getHomeWorkDir, getMainClaudeDir } from "./paths.js";
|
|
6
6
|
import { resolveConfigDir } from "./profiles.js";
|
|
7
|
-
import {
|
|
7
|
+
import { ensureCcrProfileGateway } from "./ccr.js";
|
|
8
8
|
const MODEL_ENV_NAMES = [
|
|
9
9
|
"ANTHROPIC_MODEL",
|
|
10
10
|
"ANTHROPIC_SMALL_FAST_MODEL",
|
|
@@ -44,10 +44,7 @@ async function resolveLaunchCwd(options) {
|
|
|
44
44
|
}
|
|
45
45
|
export async function prepareClaudeLaunch(options) {
|
|
46
46
|
const config = await resolveConfigDir(options.name, { allowMain: false, context: options.context });
|
|
47
|
-
|
|
48
|
-
if (meta?.type === "ccr") {
|
|
49
|
-
throw new CcpError("CCR profiles are not implemented in the TypeScript CLI yet. Use the legacy ccp.ps1 for this profile for now.");
|
|
50
|
-
}
|
|
47
|
+
await ensureCcrProfileGateway(config.dir, options.name, options.context);
|
|
51
48
|
return {
|
|
52
49
|
command: "claude",
|
|
53
50
|
args: options.claudeArgs ?? [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/core/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/core/launcher.ts"],"names":[],"mappings":"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"}
|
package/dist/core/profiles.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type PathContext } from "./paths.js";
|
|
2
|
-
import type { ClaudeSettings, CreateApiProfileInput, CreateLoginProfileInput, ProfileMeta, ProfileSummary, ProfileType } from "./types.js";
|
|
2
|
+
import type { ClaudeSettings, CreateApiProfileInput, CreateLoginProfileInput, CreateCcrProfileInput, ProfileMeta, ProfileSummary, ProfileType } from "./types.js";
|
|
3
3
|
export declare function getProfileDir(name: string, context?: PathContext): string;
|
|
4
|
+
export declare function profileExists(name: string, context?: PathContext): Promise<boolean>;
|
|
4
5
|
export declare function resolveConfigDir(name: string, options?: {
|
|
5
6
|
allowMain?: boolean;
|
|
6
7
|
context?: PathContext;
|
|
@@ -14,4 +15,5 @@ export declare function summarizeProfile(name: string, dir: string): Promise<Pro
|
|
|
14
15
|
export declare function listProfiles(context?: PathContext): Promise<ProfileSummary[]>;
|
|
15
16
|
export declare function createApiProfile(input: CreateApiProfileInput, context?: PathContext): Promise<ProfileSummary>;
|
|
16
17
|
export declare function createLoginProfile(input: CreateLoginProfileInput, context?: PathContext): Promise<ProfileSummary>;
|
|
18
|
+
export declare function createCcrProfile(input: CreateCcrProfileInput, context?: PathContext): Promise<ProfileSummary>;
|
|
17
19
|
export declare function removeProfile(name: string, context?: PathContext): Promise<string>;
|
package/dist/core/profiles.js
CHANGED
|
@@ -2,6 +2,7 @@ import { access, mkdir, readdir } from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { assertProfileName, CcpError } from "./errors.js";
|
|
4
4
|
import { getMainClaudeDir, getProfilesRoot } from "./paths.js";
|
|
5
|
+
import { ensureCcrPreset, getCcrPresetEndpoint } from "./ccr.js";
|
|
5
6
|
import { getSettingsPath, readMeta, readSettings, removeProfileDir, writeMeta, writeSettings } from "./settings.js";
|
|
6
7
|
async function exists(target) {
|
|
7
8
|
try {
|
|
@@ -15,6 +16,10 @@ async function exists(target) {
|
|
|
15
16
|
export function getProfileDir(name, context = {}) {
|
|
16
17
|
return path.join(getProfilesRoot(context), name);
|
|
17
18
|
}
|
|
19
|
+
export async function profileExists(name, context = {}) {
|
|
20
|
+
assertProfileName(name);
|
|
21
|
+
return exists(getProfileDir(name, context));
|
|
22
|
+
}
|
|
18
23
|
export async function resolveConfigDir(name, options = {}) {
|
|
19
24
|
const allowMain = options.allowMain ?? true;
|
|
20
25
|
const context = options.context ?? {};
|
|
@@ -113,9 +118,7 @@ export async function createApiProfile(input, context = {}) {
|
|
|
113
118
|
ANTHROPIC_BASE_URL: input.baseUrl.trim(),
|
|
114
119
|
ANTHROPIC_DEFAULT_HAIKU_MODEL: input.model.trim(),
|
|
115
120
|
ANTHROPIC_DEFAULT_OPUS_MODEL: input.model.trim(),
|
|
116
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL_NAME: input.model.trim(),
|
|
117
121
|
ANTHROPIC_DEFAULT_SONNET_MODEL: input.model.trim(),
|
|
118
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL_NAME: input.model.trim(),
|
|
119
122
|
ANTHROPIC_MODEL: input.model.trim()
|
|
120
123
|
}
|
|
121
124
|
});
|
|
@@ -129,6 +132,36 @@ export async function createLoginProfile(input, context = {}) {
|
|
|
129
132
|
await writeMeta(profileDir, { version: 1, type: "login", createdAt: new Date().toISOString() });
|
|
130
133
|
return summarizeProfile(input.name, profileDir);
|
|
131
134
|
}
|
|
135
|
+
export async function createCcrProfile(input, context = {}) {
|
|
136
|
+
const profileDir = await assertNewProfile(input.name, context);
|
|
137
|
+
if (!input.route.trim()) {
|
|
138
|
+
throw new CcpError("CCR route is required for a preset-bound CCR profile.");
|
|
139
|
+
}
|
|
140
|
+
const endpoint = await getCcrPresetEndpoint(input.name, context);
|
|
141
|
+
await mkdir(profileDir, { recursive: true });
|
|
142
|
+
await writeSettings(profileDir, {
|
|
143
|
+
theme: "dark",
|
|
144
|
+
env: {
|
|
145
|
+
ANTHROPIC_BASE_URL: endpoint,
|
|
146
|
+
ANTHROPIC_AUTH_TOKEN: input.token.trim() || "ccr-local-secret",
|
|
147
|
+
NO_PROXY: "127.0.0.1,localhost",
|
|
148
|
+
DISABLE_TELEMETRY: "1",
|
|
149
|
+
DISABLE_COST_WARNINGS: "1",
|
|
150
|
+
API_TIMEOUT_MS: "600000"
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
await writeMeta(profileDir, {
|
|
154
|
+
version: 1,
|
|
155
|
+
type: "ccr",
|
|
156
|
+
endpoint,
|
|
157
|
+
autoStart: true,
|
|
158
|
+
ccrPreset: input.name,
|
|
159
|
+
ccrRoute: input.route.trim(),
|
|
160
|
+
createdAt: new Date().toISOString()
|
|
161
|
+
});
|
|
162
|
+
await ensureCcrPreset(input.name, input.route.trim(), context);
|
|
163
|
+
return summarizeProfile(input.name, profileDir);
|
|
164
|
+
}
|
|
132
165
|
export async function removeProfile(name, context = {}) {
|
|
133
166
|
assertProfileName(name);
|
|
134
167
|
const profileDir = getProfileDir(name, context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAWpH,KAAK,UAAU,MAAM,CAAC,MAAc;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAAuB,EAAE;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,UAAuB,EAAE;IACzE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,UAA0D,EAAE;IAE5D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAEtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,QAAQ,CAAC,iEAAiE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,QAAQ,CAAC,gDAAgD,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,YAAY,IAAI,qBAAqB,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAyB,EAAE,IAAkB;IAC5E,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,QAAQ,EAAE,GAAG,EAAE,kBAAkB,IAAI,QAAQ,EAAE,GAAG,EAAE,oBAAoB,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,GAAW;IAC9D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;IAC7C,IAAI,KAAK,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAE7C,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;QACrC,KAAK,GAAG,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;SAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;SAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,KAAK,GAAG,OAAO,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,OAAO;QACP,KAAK;QACL,WAAW,EAAE,KAAK,IAAI,KAAK,KAAK,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC7E,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC;QAClC,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAuB,EAAE;IAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAoB;IAChE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,YAAY,IAAI,qBAAqB,UAAU,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAA4B,EAAE,UAAuB,EAAE;IAC5F,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAAC,iCAAiC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,aAAa,CAAC,UAAU,EAAE;QAC9B,KAAK,EAAE,MAAM;QACb,GAAG,EAAE;YACH,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,yBAAyB;YACrE,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;YACxC,6BAA6B,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YACjD,4BAA4B,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YAChD,8BAA8B,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YAClD,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;SACpC;KACF,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9F,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAA8B,EAAE,UAAuB,EAAE;IAChG,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,aAAa,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAChG,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAA4B,EAAE,UAAuB,EAAE;IAC5F,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC,uDAAuD,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,aAAa,CAAC,UAAU,EAAE;QAC9B,KAAK,EAAE,MAAM;QACb,GAAG,EAAE;YACH,kBAAkB,EAAE,QAAQ;YAC5B,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,kBAAkB;YAC9D,QAAQ,EAAE,qBAAqB;YAC/B,iBAAiB,EAAE,GAAG;YACtB,qBAAqB,EAAE,GAAG;YAC1B,cAAc,EAAE,QAAQ;SACzB;KACF,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,UAAU,EAAE;QAC1B,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,KAAK;QACX,QAAQ;QACR,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,MAAM,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,UAAuB,EAAE;IACzE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAAC,YAAY,IAAI,qBAAqB,UAAU,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type PathContext } from "./paths.js";
|
|
2
|
+
export type SyncStatus = "copied" | "updated" | "unchanged" | "overwritten" | "conflict";
|
|
3
|
+
export interface SessionDisplayInfo {
|
|
4
|
+
filePath: string;
|
|
5
|
+
name: string;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
title: string;
|
|
8
|
+
lastWriteTime: Date;
|
|
9
|
+
relativeTime: string;
|
|
10
|
+
sizeKb: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SyncMetaRecord {
|
|
13
|
+
source: string;
|
|
14
|
+
file: string;
|
|
15
|
+
lastSyncedHash: string;
|
|
16
|
+
syncedAt: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SyncMeta {
|
|
19
|
+
version: number;
|
|
20
|
+
projectKey: string;
|
|
21
|
+
updatedAt?: string;
|
|
22
|
+
records: Record<string, SyncMetaRecord>;
|
|
23
|
+
}
|
|
24
|
+
export interface SyncCounts {
|
|
25
|
+
copied: number;
|
|
26
|
+
updated: number;
|
|
27
|
+
unchanged: number;
|
|
28
|
+
overwritten: number;
|
|
29
|
+
conflict: number;
|
|
30
|
+
}
|
|
31
|
+
export interface SyncSessionPlan {
|
|
32
|
+
source: {
|
|
33
|
+
name: string;
|
|
34
|
+
dir: string;
|
|
35
|
+
isMain: boolean;
|
|
36
|
+
};
|
|
37
|
+
target: {
|
|
38
|
+
name: string;
|
|
39
|
+
dir: string;
|
|
40
|
+
isMain: boolean;
|
|
41
|
+
};
|
|
42
|
+
projectKey: string;
|
|
43
|
+
sourceProjectDir: string;
|
|
44
|
+
targetProjectDir: string;
|
|
45
|
+
sessionFiles: SessionDisplayInfo[];
|
|
46
|
+
}
|
|
47
|
+
export interface SyncSessionOptions {
|
|
48
|
+
first: string;
|
|
49
|
+
args: string[];
|
|
50
|
+
cwd?: string;
|
|
51
|
+
context?: PathContext;
|
|
52
|
+
selectSessions?: (sessions: SessionDisplayInfo[]) => Promise<SessionDisplayInfo[]>;
|
|
53
|
+
confirmOverwrite?: (details: {
|
|
54
|
+
sourceFile: string;
|
|
55
|
+
targetFile: string;
|
|
56
|
+
}) => Promise<"yes" | "no" | "all" | "quit">;
|
|
57
|
+
}
|
|
58
|
+
export interface SyncSessionResult {
|
|
59
|
+
projectKey: string;
|
|
60
|
+
sourceName: string;
|
|
61
|
+
targetName: string;
|
|
62
|
+
sourceProjectDir: string;
|
|
63
|
+
targetProjectDir: string;
|
|
64
|
+
selected: number;
|
|
65
|
+
counts: SyncCounts;
|
|
66
|
+
conflicts: string[];
|
|
67
|
+
}
|
|
68
|
+
export declare function parseSelectionText(text: string, max: number): number[];
|
|
69
|
+
export declare function planSyncSession(options: SyncSessionOptions): Promise<SyncSessionPlan & {
|
|
70
|
+
syncAll: boolean;
|
|
71
|
+
}>;
|
|
72
|
+
export declare function syncSessions(options: SyncSessionOptions): Promise<SyncSessionResult | undefined>;
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { cp, mkdir, readdir, readFile, stat, writeFile, copyFile } from "node:fs/promises";
|
|
2
|
+
import crypto from "node:crypto";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { CcpError } from "./errors.js";
|
|
5
|
+
import { getProjectDir, getProjectKey } from "./paths.js";
|
|
6
|
+
import { resolveConfigDir } from "./profiles.js";
|
|
7
|
+
function parseSyncArgs(first, args) {
|
|
8
|
+
if (!first?.trim()) {
|
|
9
|
+
throw new CcpError("Missing sync target. Use 'ccp sync-session <target-profile>' or 'ccp sync-session <source> to <target>'.");
|
|
10
|
+
}
|
|
11
|
+
const syncArgs = [];
|
|
12
|
+
let syncAll = false;
|
|
13
|
+
for (const arg of args) {
|
|
14
|
+
if (arg === "--all") {
|
|
15
|
+
syncAll = true;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
syncArgs.push(arg);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (syncArgs.length === 0) {
|
|
22
|
+
return { sourceName: "main", targetName: first, syncAll };
|
|
23
|
+
}
|
|
24
|
+
if (syncArgs.length === 2 && syncArgs[0].toLowerCase() === "to") {
|
|
25
|
+
return { sourceName: first, targetName: syncArgs[1], syncAll };
|
|
26
|
+
}
|
|
27
|
+
throw new CcpError("Invalid sync syntax. Use 'ccp sync-session <target-profile>' or 'ccp sync-session <source> to <target>'.");
|
|
28
|
+
}
|
|
29
|
+
async function exists(target) {
|
|
30
|
+
try {
|
|
31
|
+
await stat(target);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function fileSha256(filePath) {
|
|
39
|
+
const hash = crypto.createHash("sha256");
|
|
40
|
+
hash.update(await readFile(filePath));
|
|
41
|
+
return hash.digest("hex");
|
|
42
|
+
}
|
|
43
|
+
function syncMetaPath(targetConfigDir, projectKey) {
|
|
44
|
+
return path.join(targetConfigDir, ".ccp-sync", `${projectKey}.json`);
|
|
45
|
+
}
|
|
46
|
+
async function readSyncMeta(metaPath, projectKey) {
|
|
47
|
+
if (!(await exists(metaPath))) {
|
|
48
|
+
return { version: 1, projectKey, records: {} };
|
|
49
|
+
}
|
|
50
|
+
const raw = JSON.parse((await readFile(metaPath, "utf8")).replace(/^/, ""));
|
|
51
|
+
return {
|
|
52
|
+
version: 1,
|
|
53
|
+
projectKey,
|
|
54
|
+
updatedAt: raw.updatedAt,
|
|
55
|
+
records: raw.records ?? {}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function writeSyncMeta(metaPath, meta) {
|
|
59
|
+
const records = Object.fromEntries(Object.entries(meta.records).sort(([a], [b]) => a.localeCompare(b)));
|
|
60
|
+
const data = {
|
|
61
|
+
version: 1,
|
|
62
|
+
projectKey: meta.projectKey,
|
|
63
|
+
updatedAt: new Date().toISOString(),
|
|
64
|
+
records
|
|
65
|
+
};
|
|
66
|
+
await mkdir(path.dirname(metaPath), { recursive: true });
|
|
67
|
+
await writeFile(metaPath, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
68
|
+
}
|
|
69
|
+
async function copySessionAssetsMissingOnly(sourceProjectDir, targetProjectDir, sessionName) {
|
|
70
|
+
const sourceAssetDir = path.join(sourceProjectDir, sessionName);
|
|
71
|
+
if (!(await exists(sourceAssetDir))) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const targetAssetDir = path.join(targetProjectDir, sessionName);
|
|
75
|
+
await cp(sourceAssetDir, targetAssetDir, {
|
|
76
|
+
recursive: true,
|
|
77
|
+
force: false,
|
|
78
|
+
errorOnExist: false
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async function syncSessionFile(sourceFile, targetFile, meta, metaKey, sourceName, forceOverwrite = false) {
|
|
82
|
+
const sourceHash = await fileSha256(sourceFile);
|
|
83
|
+
const sourceNameOnly = path.basename(sourceFile);
|
|
84
|
+
const record = () => {
|
|
85
|
+
meta.records[metaKey] = {
|
|
86
|
+
source: sourceName,
|
|
87
|
+
file: sourceNameOnly,
|
|
88
|
+
lastSyncedHash: sourceHash,
|
|
89
|
+
syncedAt: new Date().toISOString()
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
if (!(await exists(targetFile))) {
|
|
93
|
+
await copyFile(sourceFile, targetFile);
|
|
94
|
+
record();
|
|
95
|
+
return "copied";
|
|
96
|
+
}
|
|
97
|
+
const targetHash = await fileSha256(targetFile);
|
|
98
|
+
const existingRecord = meta.records[metaKey];
|
|
99
|
+
if (sourceHash === targetHash) {
|
|
100
|
+
record();
|
|
101
|
+
return "unchanged";
|
|
102
|
+
}
|
|
103
|
+
if (forceOverwrite) {
|
|
104
|
+
await copyFile(sourceFile, targetFile);
|
|
105
|
+
record();
|
|
106
|
+
return "overwritten";
|
|
107
|
+
}
|
|
108
|
+
if (!existingRecord?.lastSyncedHash) {
|
|
109
|
+
return "conflict";
|
|
110
|
+
}
|
|
111
|
+
if (targetHash === existingRecord.lastSyncedHash) {
|
|
112
|
+
await copyFile(sourceFile, targetFile);
|
|
113
|
+
record();
|
|
114
|
+
return "updated";
|
|
115
|
+
}
|
|
116
|
+
return "conflict";
|
|
117
|
+
}
|
|
118
|
+
function getPlainSessionText(text) {
|
|
119
|
+
return text.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
120
|
+
}
|
|
121
|
+
function getSessionUserTitleCandidate(content) {
|
|
122
|
+
if (typeof content !== "string") {
|
|
123
|
+
return "";
|
|
124
|
+
}
|
|
125
|
+
if (content.includes("<local-command-caveat>") || content.includes("<local-command-stdout>")) {
|
|
126
|
+
return "";
|
|
127
|
+
}
|
|
128
|
+
const commandName = content.match(/<command-name>\s*([\s\S]*?)\s*<\/command-name>/);
|
|
129
|
+
if (commandName) {
|
|
130
|
+
return getPlainSessionText(commandName[1]);
|
|
131
|
+
}
|
|
132
|
+
return getPlainSessionText(content);
|
|
133
|
+
}
|
|
134
|
+
function limitSessionTitle(title) {
|
|
135
|
+
const plain = getPlainSessionText(title);
|
|
136
|
+
if (!plain)
|
|
137
|
+
return "";
|
|
138
|
+
return plain.length <= 120 ? plain : `${plain.slice(0, 120)}...`;
|
|
139
|
+
}
|
|
140
|
+
function relativeTime(time) {
|
|
141
|
+
const seconds = Math.max(0, Math.floor((Date.now() - time.getTime()) / 1000));
|
|
142
|
+
if (seconds < 60)
|
|
143
|
+
return "just now";
|
|
144
|
+
const minutes = Math.floor(seconds / 60);
|
|
145
|
+
if (minutes < 60)
|
|
146
|
+
return minutes === 1 ? "1 minute ago" : `${minutes} minutes ago`;
|
|
147
|
+
const hours = Math.floor(minutes / 60);
|
|
148
|
+
if (hours < 24)
|
|
149
|
+
return hours === 1 ? "1 hour ago" : `${hours} hours ago`;
|
|
150
|
+
const days = Math.floor(hours / 24);
|
|
151
|
+
if (days < 30)
|
|
152
|
+
return days === 1 ? "1 day ago" : `${days} days ago`;
|
|
153
|
+
const months = Math.floor(days / 30);
|
|
154
|
+
return months === 1 ? "1 month ago" : `${months} months ago`;
|
|
155
|
+
}
|
|
156
|
+
async function getSessionDisplayInfo(filePath) {
|
|
157
|
+
const fileStat = await stat(filePath);
|
|
158
|
+
let aiTitle = "";
|
|
159
|
+
let lastPrompt = "";
|
|
160
|
+
let firstUserTitle = "";
|
|
161
|
+
try {
|
|
162
|
+
const lines = (await readFile(filePath, "utf8")).split(/\r?\n/);
|
|
163
|
+
for (const line of lines) {
|
|
164
|
+
if (!line.trim())
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
const obj = JSON.parse(line);
|
|
168
|
+
if (obj.type === "ai-title" && obj.aiTitle) {
|
|
169
|
+
aiTitle = limitSessionTitle(obj.aiTitle);
|
|
170
|
+
}
|
|
171
|
+
else if (obj.type === "last-prompt" && obj.lastPrompt) {
|
|
172
|
+
lastPrompt = limitSessionTitle(obj.lastPrompt);
|
|
173
|
+
}
|
|
174
|
+
else if (obj.type === "user" && obj.message?.content && !firstUserTitle) {
|
|
175
|
+
firstUserTitle = limitSessionTitle(getSessionUserTitleCandidate(obj.message.content));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// Ignore malformed lines in session logs.
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Fall back to generic title if the log cannot be read.
|
|
185
|
+
}
|
|
186
|
+
const title = aiTitle || lastPrompt || firstUserTitle || "(session)";
|
|
187
|
+
const name = path.basename(filePath);
|
|
188
|
+
const sessionId = path.basename(filePath, path.extname(filePath));
|
|
189
|
+
return {
|
|
190
|
+
filePath,
|
|
191
|
+
name,
|
|
192
|
+
sessionId,
|
|
193
|
+
title,
|
|
194
|
+
lastWriteTime: fileStat.mtime,
|
|
195
|
+
relativeTime: relativeTime(fileStat.mtime),
|
|
196
|
+
sizeKb: Math.round((fileStat.size / 1024) * 10) / 10
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
export function parseSelectionText(text, max) {
|
|
200
|
+
const indexes = [];
|
|
201
|
+
const tokens = text.split(/[,\s]+/).filter(Boolean);
|
|
202
|
+
for (const token of tokens) {
|
|
203
|
+
const range = token.match(/^(\d+)-(\d+)$/);
|
|
204
|
+
if (range) {
|
|
205
|
+
const start = Number(range[1]);
|
|
206
|
+
const end = Number(range[2]);
|
|
207
|
+
if (start > end)
|
|
208
|
+
throw new CcpError(`Invalid range '${token}'.`);
|
|
209
|
+
for (let i = start; i <= end; i++) {
|
|
210
|
+
if (i < 1 || i > max)
|
|
211
|
+
throw new CcpError(`Selection '${i}' is out of range.`);
|
|
212
|
+
if (!indexes.includes(i - 1))
|
|
213
|
+
indexes.push(i - 1);
|
|
214
|
+
}
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (!/^\d+$/.test(token)) {
|
|
218
|
+
throw new CcpError(`Invalid selection token '${token}'.`);
|
|
219
|
+
}
|
|
220
|
+
const index = Number(token);
|
|
221
|
+
if (index < 1 || index > max)
|
|
222
|
+
throw new CcpError(`Selection '${index}' is out of range.`);
|
|
223
|
+
if (!indexes.includes(index - 1))
|
|
224
|
+
indexes.push(index - 1);
|
|
225
|
+
}
|
|
226
|
+
return indexes;
|
|
227
|
+
}
|
|
228
|
+
export async function planSyncSession(options) {
|
|
229
|
+
const parsed = parseSyncArgs(options.first, options.args);
|
|
230
|
+
const source = await resolveConfigDir(parsed.sourceName, { allowMain: true, context: options.context });
|
|
231
|
+
const target = await resolveConfigDir(parsed.targetName, { allowMain: true, context: options.context });
|
|
232
|
+
if (source.dir.toLowerCase() === target.dir.toLowerCase()) {
|
|
233
|
+
return {
|
|
234
|
+
source,
|
|
235
|
+
target,
|
|
236
|
+
projectKey: getProjectKey(options.cwd ?? options.context?.cwd ?? process.cwd()),
|
|
237
|
+
sourceProjectDir: "",
|
|
238
|
+
targetProjectDir: "",
|
|
239
|
+
sessionFiles: [],
|
|
240
|
+
syncAll: parsed.syncAll
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const projectKey = getProjectKey(options.cwd ?? options.context?.cwd ?? process.cwd());
|
|
244
|
+
const sourceProjectDir = getProjectDir(source.dir, projectKey);
|
|
245
|
+
const targetProjectDir = getProjectDir(target.dir, projectKey);
|
|
246
|
+
if (!(await exists(sourceProjectDir))) {
|
|
247
|
+
return { source, target, projectKey, sourceProjectDir, targetProjectDir, sessionFiles: [], syncAll: parsed.syncAll };
|
|
248
|
+
}
|
|
249
|
+
const entries = await readdir(sourceProjectDir, { withFileTypes: true });
|
|
250
|
+
const jsonlFiles = entries
|
|
251
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl"))
|
|
252
|
+
.map((entry) => path.join(sourceProjectDir, entry.name))
|
|
253
|
+
.sort((a, b) => a.localeCompare(b));
|
|
254
|
+
const sessionFiles = await Promise.all(jsonlFiles.map(getSessionDisplayInfo));
|
|
255
|
+
sessionFiles.sort((a, b) => b.lastWriteTime.getTime() - a.lastWriteTime.getTime());
|
|
256
|
+
return { source, target, projectKey, sourceProjectDir, targetProjectDir, sessionFiles, syncAll: parsed.syncAll };
|
|
257
|
+
}
|
|
258
|
+
export async function syncSessions(options) {
|
|
259
|
+
const plan = await planSyncSession(options);
|
|
260
|
+
if (plan.source.dir.toLowerCase() === plan.target.dir.toLowerCase()) {
|
|
261
|
+
console.log(`Source and target are the same config: ${plan.source.name}. Nothing to sync.`);
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
if (!plan.sourceProjectDir || plan.sessionFiles.length === 0) {
|
|
265
|
+
console.log("No source session logs for current project.");
|
|
266
|
+
console.log(`Project: ${plan.projectKey}`);
|
|
267
|
+
console.log(`Source: ${plan.sourceProjectDir}`);
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
const selectedFiles = plan.syncAll
|
|
271
|
+
? plan.sessionFiles
|
|
272
|
+
: await options.selectSessions?.(plan.sessionFiles) ?? [];
|
|
273
|
+
if (selectedFiles.length === 0) {
|
|
274
|
+
console.log("Sync cancelled.");
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
await mkdir(plan.targetProjectDir, { recursive: true });
|
|
278
|
+
const metaPath = syncMetaPath(plan.target.dir, plan.projectKey);
|
|
279
|
+
const meta = await readSyncMeta(metaPath, plan.projectKey);
|
|
280
|
+
const counts = { copied: 0, updated: 0, unchanged: 0, overwritten: 0, conflict: 0 };
|
|
281
|
+
const conflicts = [];
|
|
282
|
+
let overwriteAll = false;
|
|
283
|
+
for (const session of [...selectedFiles].sort((a, b) => a.name.localeCompare(b.name))) {
|
|
284
|
+
const targetFile = path.join(plan.targetProjectDir, session.name);
|
|
285
|
+
const metaKey = `${plan.source.name}|${session.name}`;
|
|
286
|
+
let status = await syncSessionFile(session.filePath, targetFile, meta, metaKey, plan.source.name);
|
|
287
|
+
if (status === "conflict") {
|
|
288
|
+
if (!overwriteAll) {
|
|
289
|
+
const answer = await options.confirmOverwrite?.({ sourceFile: session.filePath, targetFile }) ?? "no";
|
|
290
|
+
if (answer === "quit") {
|
|
291
|
+
throw new CcpError("Sync cancelled by user.");
|
|
292
|
+
}
|
|
293
|
+
if (answer === "all") {
|
|
294
|
+
overwriteAll = true;
|
|
295
|
+
}
|
|
296
|
+
if (answer === "yes" || answer === "all") {
|
|
297
|
+
status = await syncSessionFile(session.filePath, targetFile, meta, metaKey, plan.source.name, true);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
status = await syncSessionFile(session.filePath, targetFile, meta, metaKey, plan.source.name, true);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
counts[status]++;
|
|
305
|
+
if (status !== "conflict") {
|
|
306
|
+
await copySessionAssetsMissingOnly(plan.sourceProjectDir, plan.targetProjectDir, session.sessionId);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
conflicts.push(session.name);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
await writeSyncMeta(metaPath, meta);
|
|
313
|
+
return {
|
|
314
|
+
projectKey: plan.projectKey,
|
|
315
|
+
sourceName: plan.source.name,
|
|
316
|
+
targetName: plan.target.name,
|
|
317
|
+
sourceProjectDir: plan.sourceProjectDir,
|
|
318
|
+
targetProjectDir: plan.targetProjectDir,
|
|
319
|
+
selected: selectedFiles.length,
|
|
320
|
+
counts,
|
|
321
|
+
conflicts
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/core/sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "multi-ccp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Cross-platform Claude Code profile manager for API, login, and router workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
11
|
"README.md",
|
|
12
|
+
"README.zh-CN.md",
|
|
12
13
|
"LICENSE",
|
|
13
14
|
"CHANGELOG.md"
|
|
14
15
|
],
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
"cli",
|
|
27
28
|
"anthropic"
|
|
28
29
|
],
|
|
29
|
-
"author": "",
|
|
30
|
+
"author": "asoutherncat",
|
|
30
31
|
"license": "MIT",
|
|
31
32
|
"engines": {
|
|
32
33
|
"node": ">=20"
|