@kodycodes/cli 1.2.0 → 1.2.1

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 CHANGED
@@ -74,7 +74,7 @@ CLI credentials are stored in the OS secret store:
74
74
 
75
75
  - macOS: Keychain
76
76
  - Windows: Credential Manager
77
- - Linux: Secret Service / libsecret
77
+ - Linux: Secret Service / libsecret (not the in-memory kernel keyring)
78
78
 
79
79
  If the keychain is unavailable (common on headless Linux), the CLI writes a
80
80
  `0600` file under `$XDG_CONFIG_HOME/kody` (or `%APPDATA%\kody` on Windows,
package/dist/store.d.ts CHANGED
@@ -18,17 +18,27 @@ export type SecretBackend = {
18
18
  set(value: string): void;
19
19
  delete(): boolean;
20
20
  };
21
+ /** Linux-only: require Secret Service. Ignored on macOS and Windows. */
22
+ export declare const secretServiceKeyringOptions: {
23
+ readonly linux: {
24
+ readonly store: "secret-service";
25
+ };
26
+ };
27
+ export type StoreResolution = {
28
+ createKeyring?: (mcpUrl: string) => SecretBackend;
29
+ fileStorePath?: (mcpUrl: string) => string;
30
+ };
21
31
  export declare function accountForMcpUrl(mcpUrl: string): string;
22
32
  export declare function fileStorePath(mcpUrl: string, home?: string): string;
23
33
  export declare function createFileBackend(path: string): SecretBackend;
24
34
  export declare function createKeyringBackend(mcpUrl: string): SecretBackend;
25
- export declare function resolveBackend(mcpUrl: string, preferred?: SecretBackend): SecretBackend;
35
+ export declare function resolveBackend(mcpUrl: string, preferred?: SecretBackend, resolution?: StoreResolution): SecretBackend;
26
36
  export declare function parseCredentials(raw: string): StoredCredentials;
27
- export declare function loadCredentials(mcpUrl?: string, backend?: SecretBackend): StoredCredentials | null;
28
- export declare function saveCredentials(credentials: StoredCredentials, backend?: SecretBackend): {
37
+ export declare function loadCredentials(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution): StoredCredentials | null;
38
+ export declare function saveCredentials(credentials: StoredCredentials, backend?: SecretBackend, resolution?: StoreResolution): {
29
39
  backend: SecretBackend;
30
40
  };
31
- export declare function deleteCredentials(mcpUrl?: string, backend?: SecretBackend): {
41
+ export declare function deleteCredentials(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution): {
32
42
  deleted: boolean;
33
43
  backend: SecretBackend;
34
44
  };
package/dist/store.js CHANGED
@@ -3,6 +3,10 @@ import { dirname, join } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { Entry } from '@napi-rs/keyring';
5
5
  import { defaultMcpUrl, keyringService } from './defaults.js';
6
+ /** Linux-only: require Secret Service. Ignored on macOS and Windows. */
7
+ export const secretServiceKeyringOptions = {
8
+ linux: { store: 'secret-service' },
9
+ };
6
10
  export function accountForMcpUrl(mcpUrl) {
7
11
  return `cli:${new URL(mcpUrl).origin}`;
8
12
  }
@@ -49,7 +53,7 @@ export function createFileBackend(path) {
49
53
  };
50
54
  }
51
55
  export function createKeyringBackend(mcpUrl) {
52
- const entry = new Entry(keyringService, accountForMcpUrl(mcpUrl));
56
+ const entry = new Entry(keyringService, accountForMcpUrl(mcpUrl), secretServiceKeyringOptions);
53
57
  return {
54
58
  kind: 'keyring',
55
59
  get() {
@@ -73,14 +77,18 @@ export function createKeyringBackend(mcpUrl) {
73
77
  },
74
78
  };
75
79
  }
76
- export function resolveBackend(mcpUrl, preferred) {
80
+ function fileBackendFor(mcpUrl, resolution) {
81
+ const path = resolution?.fileStorePath?.(mcpUrl) ?? fileStorePath(mcpUrl);
82
+ return createFileBackend(path);
83
+ }
84
+ export function resolveBackend(mcpUrl, preferred, resolution) {
77
85
  if (preferred)
78
86
  return preferred;
79
87
  try {
80
- return createKeyringBackend(mcpUrl);
88
+ return (resolution?.createKeyring ?? createKeyringBackend)(mcpUrl);
81
89
  }
82
90
  catch {
83
- return createFileBackend(fileStorePath(mcpUrl));
91
+ return fileBackendFor(mcpUrl, resolution);
84
92
  }
85
93
  }
86
94
  export function parseCredentials(raw) {
@@ -90,40 +98,45 @@ export function parseCredentials(raw) {
90
98
  }
91
99
  return parsed;
92
100
  }
93
- export function loadCredentials(mcpUrl = defaultMcpUrl, backend) {
94
- const store = resolveBackend(mcpUrl, backend);
101
+ function readParsed(store) {
102
+ const raw = store.get();
103
+ if (!raw)
104
+ return null;
105
+ return parseCredentials(raw);
106
+ }
107
+ export function loadCredentials(mcpUrl = defaultMcpUrl, backend, resolution) {
108
+ const store = resolveBackend(mcpUrl, backend, resolution);
95
109
  try {
96
- const raw = store.get();
97
- if (!raw)
98
- return null;
99
- return parseCredentials(raw);
110
+ const loaded = readParsed(store);
111
+ if (loaded)
112
+ return loaded;
100
113
  }
101
114
  catch (error) {
102
- if (store.kind === 'keyring' && !backend) {
103
- const fallback = createFileBackend(fileStorePath(mcpUrl));
104
- const raw = fallback.get();
105
- return raw ? parseCredentials(raw) : null;
106
- }
107
- throw error;
115
+ if (!(store.kind === 'keyring' && !backend))
116
+ throw error;
117
+ }
118
+ if (store.kind === 'keyring' && !backend) {
119
+ return readParsed(fileBackendFor(mcpUrl, resolution));
108
120
  }
121
+ return null;
109
122
  }
110
- export function saveCredentials(credentials, backend) {
111
- const store = resolveBackend(credentials.mcpUrl, backend);
123
+ export function saveCredentials(credentials, backend, resolution) {
124
+ const store = resolveBackend(credentials.mcpUrl, backend, resolution);
112
125
  try {
113
126
  store.set(JSON.stringify(credentials));
114
127
  return { backend: store };
115
128
  }
116
129
  catch (error) {
117
130
  if (store.kind === 'keyring' && !backend) {
118
- const fallback = createFileBackend(fileStorePath(credentials.mcpUrl));
131
+ const fallback = fileBackendFor(credentials.mcpUrl, resolution);
119
132
  fallback.set(JSON.stringify(credentials));
120
133
  return { backend: fallback };
121
134
  }
122
135
  throw error;
123
136
  }
124
137
  }
125
- export function deleteCredentials(mcpUrl = defaultMcpUrl, backend) {
126
- const store = resolveBackend(mcpUrl, backend);
138
+ export function deleteCredentials(mcpUrl = defaultMcpUrl, backend, resolution) {
139
+ const store = resolveBackend(mcpUrl, backend, resolution);
127
140
  let deleted = false;
128
141
  try {
129
142
  deleted = store.delete();
@@ -132,7 +145,7 @@ export function deleteCredentials(mcpUrl = defaultMcpUrl, backend) {
132
145
  deleted = false;
133
146
  }
134
147
  if (store.kind === 'keyring' && !backend) {
135
- const file = createFileBackend(fileStorePath(mcpUrl));
148
+ const file = fileBackendFor(mcpUrl, resolution);
136
149
  deleted = file.delete() || deleted;
137
150
  }
138
151
  return { deleted, backend: store };
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodycodes/cli",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Official Kody MCP client CLI: login, secure token storage, search, and execute.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -49,7 +49,7 @@
49
49
  "dependencies": {
50
50
  "@inquirer/checkbox": "^5.2.2",
51
51
  "@modelcontextprotocol/client": "2.0.0",
52
- "@napi-rs/keyring": "^1.3.0",
52
+ "@napi-rs/keyring": "^2.1.0",
53
53
  "add-mcp": "^2.4.0",
54
54
  "ps-list": "^9.0.0"
55
55
  },
@@ -60,8 +60,10 @@ kody logout
60
60
 
61
61
  The CLI opens a browser for Kody OAuth (PKCE + Client ID Metadata Documents).
62
62
  If a browser cannot open, it prints the URL. Tokens (access + refresh) are
63
- stored in the OS keychain on macOS, Windows, and Linux. Linux without Secret
64
- Service falls back to a `0600` file under `$XDG_CONFIG_HOME/kody`.
63
+ stored in the OS keychain on macOS, Windows, and Linux (Secret Service).
64
+ Linux without Secret Service — including headless machines that only have an
65
+ in-memory kernel keyring — falls back to a `0600` file under
66
+ `$XDG_CONFIG_HOME/kody`.
65
67
 
66
68
  Never ask the user to paste tokens into chat.
67
69