@swttch/extend-kit 0.4.0 → 0.5.0
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 +13 -0
- package/dist/battery/auth/keychain.d.ts +1 -1
- package/dist/battery/auth/keychain.js +3 -2
- package/dist/battery/auth/keychain.js.map +1 -1
- package/dist/cli/account-credentials.d.ts +3 -0
- package/dist/cli/account-credentials.js +43 -0
- package/dist/cli/account-credentials.js.map +1 -0
- package/dist/cli/index.js +12 -1
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -504,3 +504,16 @@ MIT
|
|
|
504
504
|
## Author
|
|
505
505
|
|
|
506
506
|
yhk1038
|
|
507
|
+
|
|
508
|
+
## Saved-account usage (CLI)
|
|
509
|
+
|
|
510
|
+
`ccb --capabilities --json` reports `oauth.usage.account-file` when supported.
|
|
511
|
+
`ccb oauth usage --account-file="/path/to/account-snapshot.json" --json` reads a
|
|
512
|
+
CCG account snapshot (`credentials` is a JSON string, `oauthAccount.emailAddress`
|
|
513
|
+
identifies the account) and queries that account without switching the live login.
|
|
514
|
+
Credential values are never command arguments or CLI output. The CLI may use a
|
|
515
|
+
newer live credential when the live email matches the selected snapshot; otherwise
|
|
516
|
+
it uses the snapshot. Expired tokens return `token_expired`. No token refresh,
|
|
517
|
+
credential writes, caching, retries or automatic account switching are performed.
|
|
518
|
+
The caller owns process timeout and recovery policy. Plain `ccb oauth usage`
|
|
519
|
+
retains its existing behaviour.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { ClaudeCredentials } from './types.js';
|
|
2
|
-
export declare function readKeychainCredentials(): Promise<ClaudeCredentials>;
|
|
2
|
+
export declare function readKeychainCredentials(configDir?: string): Promise<ClaudeCredentials>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
2
3
|
import { promisify } from 'node:util';
|
|
3
4
|
const execFileAsync = promisify(execFile);
|
|
4
5
|
const SERVICE_NAME = 'Claude Code-credentials';
|
|
@@ -6,11 +7,11 @@ async function getOsUsername() {
|
|
|
6
7
|
const { stdout } = await execFileAsync('whoami');
|
|
7
8
|
return stdout.trim();
|
|
8
9
|
}
|
|
9
|
-
export async function readKeychainCredentials() {
|
|
10
|
+
export async function readKeychainCredentials(configDir) {
|
|
10
11
|
const account = await getOsUsername();
|
|
11
12
|
const { stdout } = await execFileAsync('security', [
|
|
12
13
|
'find-generic-password',
|
|
13
|
-
'-s', SERVICE_NAME,
|
|
14
|
+
'-s', configDir ? `${SERVICE_NAME}-${createHash('sha256').update(configDir).digest('hex').slice(0, 8)}` : SERVICE_NAME,
|
|
14
15
|
'-a', account,
|
|
15
16
|
'-w',
|
|
16
17
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/battery/auth/keychain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAE/C,KAAK,UAAU,aAAa;IAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/battery/auth/keychain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,YAAY,GAAG,yBAAyB,CAAC;AAE/C,KAAK,UAAU,aAAa;IAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAAkB;IAC9D,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;QACjD,uBAAuB;QACvB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;QACtH,IAAI,EAAE,OAAO;QACb,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { getCredentials } from '../battery/auth/index.js';
|
|
5
|
+
import { readKeychainCredentials } from '../battery/auth/keychain.js';
|
|
6
|
+
import { CcbError } from '../battery/errors.js';
|
|
7
|
+
/** Read a CCG saved-account snapshot without replacing the active credential slot. */
|
|
8
|
+
export async function getAccountCredentials(file) {
|
|
9
|
+
let snapshot;
|
|
10
|
+
let credentials;
|
|
11
|
+
try {
|
|
12
|
+
snapshot = JSON.parse(await readFile(file, 'utf8'));
|
|
13
|
+
credentials = JSON.parse(snapshot.credentials ?? '');
|
|
14
|
+
if (!credentials.claudeAiOauth?.accessToken)
|
|
15
|
+
throw new Error('Missing access token');
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Parsing errors must never echo a credential blob in stderr.
|
|
19
|
+
throw new CcbError('Saved account credentials are unavailable or invalid.', 'credentials_not_found');
|
|
20
|
+
}
|
|
21
|
+
const email = snapshot.oauthAccount?.emailAddress;
|
|
22
|
+
const configDir = process.env.CLAUDE_CONFIG_DIR;
|
|
23
|
+
const liveEmail = async () => {
|
|
24
|
+
const metadata = JSON.parse(await readFile(join(configDir ?? homedir(), '.claude.json'), 'utf8'));
|
|
25
|
+
return metadata.oauthAccount?.emailAddress;
|
|
26
|
+
};
|
|
27
|
+
// A currently active account can have a newer token than its saved snapshot.
|
|
28
|
+
// Never use the live slot for a different account. No writes or token refresh.
|
|
29
|
+
try {
|
|
30
|
+
if (email && await liveEmail() === email) {
|
|
31
|
+
const live = process.platform === 'darwin'
|
|
32
|
+
? await readKeychainCredentials(configDir) : await getCredentials();
|
|
33
|
+
if (await liveEmail() === email && live.claudeAiOauth?.accessToken)
|
|
34
|
+
credentials = live;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch { /* The saved snapshot remains the fallback. */ }
|
|
38
|
+
if (Number.isFinite(credentials.claudeAiOauth.expiresAt) && Date.now() >= credentials.claudeAiOauth.expiresAt) {
|
|
39
|
+
throw new CcbError('Saved account token has expired. Log in to this account again.', 'token_expired');
|
|
40
|
+
}
|
|
41
|
+
return credentials;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=account-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-credentials.js","sourceRoot":"","sources":["../../src/cli/account-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,IAAI,QAA4E,CAAC;IACjF,IAAI,WAA8B,CAAC;IACnC,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;QAC9D,MAAM,IAAI,QAAQ,CAAC,uDAAuD,EAAE,uBAAuB,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,IAAiC,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE/F,CAAC;QACF,OAAO,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAC7C,CAAC,CAAC;IACF,6EAA6E;IAC7E,+EAA+E;IAC/E,IAAI,CAAC;QACH,IAAI,KAAK,IAAI,MAAM,SAAS,EAAE,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ;gBACxC,CAAC,CAAC,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,cAAc,EAAE,CAAC;YACtE,IAAI,MAAM,SAAS,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,WAAW;gBAAE,WAAW,GAAG,IAAI,CAAC;QACzF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,8CAA8C,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC9G,MAAM,IAAI,QAAQ,CAAC,gEAAgE,EAAE,eAAe,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { getCredentials, getAccessToken } from '../battery/auth/index.js';
|
|
3
3
|
import { ClaudeCodeClient } from '../battery/api/index.js';
|
|
4
4
|
import { oauthCommand } from './oauth.js';
|
|
5
|
+
import { getAccountCredentials } from './account-credentials.js';
|
|
5
6
|
import { CcbError } from '../battery/errors.js';
|
|
6
7
|
import { readFileSync } from 'node:fs';
|
|
7
8
|
import { fileURLToPath } from 'node:url';
|
|
@@ -13,13 +14,21 @@ const args = process.argv.slice(2);
|
|
|
13
14
|
const command = args.filter((a) => !a.startsWith('-'));
|
|
14
15
|
const flags = new Set(args.filter((a) => a.startsWith('-')));
|
|
15
16
|
const jsonOutput = flags.has('--json');
|
|
17
|
+
const accountFile = args.find(arg => arg.startsWith('--account-file='))?.slice('--account-file='.length);
|
|
16
18
|
async function createClient() {
|
|
17
|
-
const credentials = await getCredentials();
|
|
19
|
+
const credentials = accountFile ? await getAccountCredentials(accountFile) : await getCredentials();
|
|
18
20
|
const token = getAccessToken(credentials);
|
|
19
21
|
return new ClaudeCodeClient(token);
|
|
20
22
|
}
|
|
21
23
|
async function run() {
|
|
22
24
|
const [module, ...subcommand] = command;
|
|
25
|
+
if (flags.has('--capabilities')) {
|
|
26
|
+
console.log(JSON.stringify({ capabilities: ['oauth.usage.account-file'] }));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (args.some(arg => arg.startsWith('--account-file')) && (!accountFile || module !== 'oauth' || subcommand[0] !== 'usage')) {
|
|
30
|
+
throw new CcbError('Use oauth usage --account-file=<snapshot path>.', 'invalid_argument');
|
|
31
|
+
}
|
|
23
32
|
if (flags.has('-v') || flags.has('--version')) {
|
|
24
33
|
console.log(VERSION);
|
|
25
34
|
return;
|
|
@@ -34,6 +43,8 @@ Commands:
|
|
|
34
43
|
oauth profile Show account profile
|
|
35
44
|
|
|
36
45
|
Options:
|
|
46
|
+
--account-file=<path> Read usage for a CCG saved-account snapshot (no account switch)
|
|
47
|
+
--capabilities Output supported CLI capabilities as JSON
|
|
37
48
|
--json Output as JSON
|
|
38
49
|
-h, --help Show help
|
|
39
50
|
-v, --version Show version`);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACxF,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC;AAEpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACxF,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC;AAEpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAEzG,KAAK,UAAU,YAAY;IACzB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,cAAc,EAAE,CAAC;IACpG,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC;IAExC,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,KAAK,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;QAC5H,MAAM,IAAI,QAAQ,CAAC,iDAAiD,EAAE,kBAAkB,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO;;;;;;;;;;;;;gCAaC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IAEpC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YACnD,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAClB,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC3B,KAAK,EAAE;oBACL,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBAC1D;aACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swttch/extend-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Companion tools for Swttch that live outside the plugin bundle: Claude Code account/usage SDK, the ccb CLI, and speech-to-text.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|