vskill 0.5.102 → 0.5.103
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/agents.json +1 -1
- package/dist/eval/skill-scanner.d.ts +5 -0
- package/dist/eval/skill-scanner.js +12 -0
- package/dist/eval/skill-scanner.js.map +1 -1
- package/dist/eval-server/api-routes.js +23 -14
- package/dist/eval-server/api-routes.js.map +1 -1
- package/dist/eval-server/authoring-routes.d.ts +1 -0
- package/dist/eval-server/authoring-routes.js +42 -0
- package/dist/eval-server/authoring-routes.js.map +1 -1
- package/dist/eval-server/boot-preflight.d.ts +1 -0
- package/dist/eval-server/boot-preflight.js +17 -0
- package/dist/eval-server/boot-preflight.js.map +1 -0
- package/dist/eval-server/providers.d.ts +16 -0
- package/dist/eval-server/providers.js +45 -0
- package/dist/eval-server/providers.js.map +1 -0
- package/dist/eval-server/settings-store.d.ts +33 -26
- package/dist/eval-server/settings-store.js +245 -145
- package/dist/eval-server/settings-store.js.map +1 -1
- package/dist/eval-ui/assets/{CommandPalette-BSGTaiI4.js → CommandPalette-6cLEufX0.js} +1 -1
- package/dist/eval-ui/assets/CreateSkillPage-kn7xDaAP.js +12 -0
- package/dist/eval-ui/assets/{UpdateDropdown-stNmCWki.js → UpdateDropdown-9qR5NxTi.js} +1 -1
- package/dist/eval-ui/assets/index-4LdVR3Lo.js +102 -0
- package/dist/eval-ui/assets/index-C0Gc_4KC.css +1 -0
- package/dist/eval-ui/index.html +2 -2
- package/dist/studio/lib/ops-log.js +4 -1
- package/dist/studio/lib/ops-log.js.map +1 -1
- package/dist/studio/lib/scope-transfer.d.ts +10 -0
- package/dist/studio/lib/scope-transfer.js +116 -13
- package/dist/studio/lib/scope-transfer.js.map +1 -1
- package/dist/studio/routes/ops.js +26 -3
- package/dist/studio/routes/ops.js.map +1 -1
- package/dist/studio/routes/promote.js +9 -15
- package/dist/studio/routes/promote.js.map +1 -1
- package/dist/studio/routes/test-install.js +4 -11
- package/dist/studio/routes/test-install.js.map +1 -1
- package/package.json +1 -1
- package/dist/eval-ui/assets/index-BoCK_s7q.js +0 -91
- package/dist/eval-ui/assets/index-D5FxVeoM.css +0 -1
|
@@ -1,39 +1,46 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export type
|
|
1
|
+
import * as nodeFs from "node:fs";
|
|
2
|
+
import { type ProviderId } from "./providers.js";
|
|
3
|
+
/** @deprecated Retained for type-compat at consumer call sites; use ProviderId. */
|
|
4
|
+
export type Provider = ProviderId;
|
|
5
5
|
export interface KeyMetadata {
|
|
6
6
|
stored: boolean;
|
|
7
7
|
updatedAt: string | null;
|
|
8
|
-
tier: Tier;
|
|
9
8
|
}
|
|
10
9
|
export interface ListKeysResponse {
|
|
11
10
|
anthropic: KeyMetadata;
|
|
11
|
+
openai: KeyMetadata;
|
|
12
12
|
openrouter: KeyMetadata;
|
|
13
13
|
}
|
|
14
|
-
export
|
|
15
|
-
constructor(message: string);
|
|
16
|
-
}
|
|
17
|
-
export declare function redactKey(key: string): string;
|
|
18
|
-
type Logger = {
|
|
14
|
+
export interface Logger {
|
|
19
15
|
warn: (msg: string) => void;
|
|
20
16
|
error: (msg: string) => void;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
export
|
|
24
|
-
export declare function _setPlatformOverride(p: NodeJS.Platform | null): void;
|
|
25
|
-
export declare function resetSettingsStore(): void;
|
|
26
|
-
export declare function getTier(): Tier;
|
|
27
|
-
export declare function setTier(tier: Tier): Promise<void>;
|
|
28
|
-
export declare function saveKey(provider: Provider, key: string, tier?: Tier): Promise<{
|
|
17
|
+
info?: (msg: string) => void;
|
|
18
|
+
}
|
|
19
|
+
export interface SaveKeyResult {
|
|
29
20
|
updatedAt: string;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
21
|
+
}
|
|
22
|
+
export declare function redactKey(key: string): string;
|
|
23
|
+
interface FsApi {
|
|
24
|
+
readFileSync: typeof nodeFs.readFileSync;
|
|
25
|
+
writeFileSync: typeof nodeFs.writeFileSync;
|
|
26
|
+
renameSync: typeof nodeFs.renameSync;
|
|
27
|
+
unlinkSync: typeof nodeFs.unlinkSync;
|
|
28
|
+
chmodSync: typeof nodeFs.chmodSync;
|
|
29
|
+
existsSync: typeof nodeFs.existsSync;
|
|
30
|
+
mkdirSync: typeof nodeFs.mkdirSync;
|
|
31
|
+
statSync: typeof nodeFs.statSync;
|
|
32
|
+
}
|
|
33
|
+
export declare function getKeysFilePath(): string;
|
|
34
|
+
export declare function saveKey(provider: ProviderId | string, key: string): Promise<SaveKeyResult>;
|
|
35
|
+
export declare function readKey(provider: ProviderId | string): Promise<string | null>;
|
|
36
|
+
export declare function readKeySync(provider: ProviderId | string): string | null;
|
|
37
|
+
export declare function hasKeySync(provider: ProviderId | string): boolean;
|
|
38
|
+
export declare function removeKey(provider: ProviderId | string): Promise<void>;
|
|
38
39
|
export declare function listKeys(): ListKeysResponse;
|
|
40
|
+
export declare function mergeStoredKeysIntoEnv(): void;
|
|
41
|
+
export declare function resetSettingsStore(opts?: {
|
|
42
|
+
logger?: Logger;
|
|
43
|
+
fs?: Partial<FsApi>;
|
|
44
|
+
}): void;
|
|
45
|
+
export declare function _internalMapSize(): number;
|
|
39
46
|
export {};
|
|
@@ -1,195 +1,295 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// settings-store.ts —
|
|
2
|
+
// settings-store.ts — File-backed API key storage (increment 0702).
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// store under `vskill-<provider>`. No native-module dep.
|
|
4
|
+
// Replaces the prior two-backend credential store with a single
|
|
5
|
+
// FileBackedStore persisting to `$VSKILL_CONFIG_DIR/keys.env` (default
|
|
6
|
+
// `~/.vskill/keys.env`). Keys are merged into `process.env` at boot via
|
|
7
|
+
// `mergeStoredKeysIntoEnv(...)` so provider SDKs that read env vars
|
|
8
|
+
// directly (e.g. createAnthropicClient) see them without any wiring changes.
|
|
10
9
|
//
|
|
11
10
|
// Contract:
|
|
12
11
|
// - Keys NEVER appear in any log, error, toast, network URL, or stdout.
|
|
13
|
-
//
|
|
14
|
-
// -
|
|
15
|
-
//
|
|
16
|
-
// -
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
import * as
|
|
23
|
-
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
export class UnsupportedTierError extends Error {
|
|
28
|
-
constructor(message) {
|
|
29
|
-
super(message);
|
|
30
|
-
this.name = "UnsupportedTierError";
|
|
31
|
-
}
|
|
32
|
-
}
|
|
12
|
+
// Only `redactKey()` output (`****<last-4>`) is ever emitted.
|
|
13
|
+
// - Writes are atomic: write tmp → chmod 0600 (POSIX) → rename. A failed
|
|
14
|
+
// rename leaves the original file untouched and removes the tmp file.
|
|
15
|
+
// - Parser is lenient: malformed lines are logged once (aggregated) and
|
|
16
|
+
// skipped. Never throws from construction.
|
|
17
|
+
// - Real env vars ALWAYS win over stored keys during merge.
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
import * as nodeFs from "node:fs";
|
|
20
|
+
import * as os from "node:os";
|
|
21
|
+
import * as path from "node:path";
|
|
22
|
+
import { PROVIDERS } from "./providers.js";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Redaction — the ONLY way raw keys should ever reach a sink.
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
33
26
|
export function redactKey(key) {
|
|
34
27
|
if (!key || key.length <= 4)
|
|
35
28
|
return "****";
|
|
36
29
|
return "****" + key.slice(-4);
|
|
37
30
|
}
|
|
38
|
-
const
|
|
39
|
-
let currentTier = "browser";
|
|
40
|
-
let logger = {
|
|
31
|
+
const defaultLogger = {
|
|
41
32
|
warn: (m) => console.warn(m),
|
|
42
33
|
error: (m) => console.error(m),
|
|
34
|
+
info: (m) => console.info(m),
|
|
43
35
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
currentTier = "browser";
|
|
58
|
-
platformOverride = null;
|
|
59
|
-
logger = {
|
|
60
|
-
warn: (m) => console.warn(m),
|
|
61
|
-
error: (m) => console.error(m),
|
|
36
|
+
// The default `fs` object reads functions lazily from `nodeFs` at call time so
|
|
37
|
+
// that test spies such as `vi.spyOn(fs, 'renameSync')` are honored without
|
|
38
|
+
// needing explicit DI.
|
|
39
|
+
function defaultFs() {
|
|
40
|
+
return {
|
|
41
|
+
readFileSync: (...a) => nodeFs.readFileSync(...a),
|
|
42
|
+
writeFileSync: (...a) => nodeFs.writeFileSync(...a),
|
|
43
|
+
renameSync: (...a) => nodeFs.renameSync(...a),
|
|
44
|
+
unlinkSync: (...a) => nodeFs.unlinkSync(...a),
|
|
45
|
+
chmodSync: (...a) => nodeFs.chmodSync(...a),
|
|
46
|
+
existsSync: (...a) => nodeFs.existsSync(...a),
|
|
47
|
+
mkdirSync: (...a) => nodeFs.mkdirSync(...a),
|
|
48
|
+
statSync: (...a) => nodeFs.statSync(...a),
|
|
62
49
|
};
|
|
63
|
-
spawn = realSpawn;
|
|
64
|
-
}
|
|
65
|
-
function getPlatform() {
|
|
66
|
-
return platformOverride ?? process.platform;
|
|
67
50
|
}
|
|
51
|
+
const memoryMap = new Map();
|
|
52
|
+
let loadedForPath = null;
|
|
53
|
+
let logger = defaultLogger;
|
|
54
|
+
let fsApi = defaultFs();
|
|
68
55
|
// ---------------------------------------------------------------------------
|
|
69
|
-
//
|
|
56
|
+
// Path resolution
|
|
70
57
|
// ---------------------------------------------------------------------------
|
|
71
|
-
|
|
72
|
-
return
|
|
58
|
+
function resolveConfigDir() {
|
|
59
|
+
return process.env.VSKILL_CONFIG_DIR ?? path.join(os.homedir(), ".vskill");
|
|
73
60
|
}
|
|
74
|
-
export
|
|
75
|
-
|
|
76
|
-
|
|
61
|
+
export function getKeysFilePath() {
|
|
62
|
+
return path.join(resolveConfigDir(), "keys.env");
|
|
63
|
+
}
|
|
64
|
+
const ENV_VAR_TO_PROVIDER = new Map(PROVIDERS.map((p) => [p.envVarName, p.id]));
|
|
65
|
+
function parseKeysEnv(content, fileMtime) {
|
|
66
|
+
// Strip BOM if present.
|
|
67
|
+
const body = content.replace(/^\uFEFF/, "");
|
|
68
|
+
const lines = body.split(/\r?\n/);
|
|
69
|
+
const entries = new Map();
|
|
70
|
+
let malformedCount = 0;
|
|
71
|
+
for (const raw of lines) {
|
|
72
|
+
const line = raw.trim();
|
|
73
|
+
// Skip blanks and comments silently — NOT malformed.
|
|
74
|
+
if (line.length === 0 || line.startsWith("#"))
|
|
75
|
+
continue;
|
|
76
|
+
const eqIdx = line.indexOf("=");
|
|
77
|
+
if (eqIdx <= 0) {
|
|
78
|
+
malformedCount++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const key = line.slice(0, eqIdx).trim();
|
|
82
|
+
const value = line.slice(eqIdx + 1).trim();
|
|
83
|
+
if (key.length === 0 || value.length === 0) {
|
|
84
|
+
malformedCount++;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Only accept known provider env var names — anything else is malformed.
|
|
88
|
+
const providerId = ENV_VAR_TO_PROVIDER.get(key);
|
|
89
|
+
if (!providerId) {
|
|
90
|
+
malformedCount++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
entries.set(providerId, { key: value, updatedAt: fileMtime });
|
|
94
|
+
}
|
|
95
|
+
return { entries, malformedCount };
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Internal: load from disk into the memory map (idempotent per path).
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
function loadFromDisk() {
|
|
101
|
+
const filePath = getKeysFilePath();
|
|
102
|
+
if (loadedForPath === filePath)
|
|
103
|
+
return;
|
|
104
|
+
memoryMap.clear();
|
|
105
|
+
loadedForPath = filePath;
|
|
106
|
+
if (!fsApi.existsSync(filePath))
|
|
107
|
+
return;
|
|
108
|
+
let content;
|
|
109
|
+
let mtime;
|
|
110
|
+
try {
|
|
111
|
+
content = String(fsApi.readFileSync(filePath, "utf8"));
|
|
112
|
+
const stat = fsApi.statSync(filePath);
|
|
113
|
+
mtime = stat.mtime.toISOString();
|
|
77
114
|
}
|
|
78
|
-
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.warn(`[settings-store] could not read keys file: ${err.message}`);
|
|
79
117
|
return;
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
for (const [
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
118
|
+
}
|
|
119
|
+
const parsed = parseKeysEnv(content, mtime);
|
|
120
|
+
for (const [id, entry] of parsed.entries) {
|
|
121
|
+
memoryMap.set(id, entry);
|
|
122
|
+
}
|
|
123
|
+
if (parsed.malformedCount > 0) {
|
|
124
|
+
logger.warn(`[settings-store] ${parsed.malformedCount} malformed line(s) in ${filePath} were skipped`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Internal: serialize the current memory map back to disk atomically.
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
function writeToDisk() {
|
|
131
|
+
const filePath = getKeysFilePath();
|
|
132
|
+
const dir = path.dirname(filePath);
|
|
133
|
+
// Ensure the config directory exists.
|
|
134
|
+
try {
|
|
135
|
+
if (!fsApi.existsSync(dir)) {
|
|
136
|
+
fsApi.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
86
137
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
logger.error(`[settings-store] could not create config dir: ${err.message}`);
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
// Build the file body in PROVIDERS order for stable output.
|
|
144
|
+
const lines = [
|
|
145
|
+
"# vskill credentials — do not commit. Managed by `vskill keys` or Skill Studio Settings.",
|
|
146
|
+
];
|
|
147
|
+
for (const p of PROVIDERS) {
|
|
148
|
+
const entry = memoryMap.get(p.id);
|
|
149
|
+
if (!entry)
|
|
150
|
+
continue;
|
|
151
|
+
lines.push(`${p.envVarName}=${entry.key}`);
|
|
152
|
+
}
|
|
153
|
+
const body = lines.join("\n") + "\n";
|
|
154
|
+
const tmpPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
155
|
+
try {
|
|
156
|
+
fsApi.writeFileSync(tmpPath, body, { mode: 0o600 });
|
|
157
|
+
if (process.platform !== "win32") {
|
|
158
|
+
try {
|
|
159
|
+
fsApi.chmodSync(tmpPath, 0o600);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Windows and some exotic FSs don't support chmod — swallow.
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
fsApi.renameSync(tmpPath, filePath);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
// Cleanup tmp on any failure.
|
|
169
|
+
try {
|
|
170
|
+
if (fsApi.existsSync(tmpPath))
|
|
171
|
+
fsApi.unlinkSync(tmpPath);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
/* best-effort */
|
|
92
175
|
}
|
|
176
|
+
// Never include the raw key in the error. Re-throw a sanitized error.
|
|
177
|
+
const sanitized = new Error(`[settings-store] atomic write to ${filePath} failed: ${err.message}`);
|
|
178
|
+
logger.error(sanitized.message);
|
|
179
|
+
throw sanitized;
|
|
93
180
|
}
|
|
94
|
-
currentTier = tier;
|
|
95
181
|
}
|
|
96
182
|
// ---------------------------------------------------------------------------
|
|
97
183
|
// Public API — save / read / remove / list
|
|
98
184
|
// ---------------------------------------------------------------------------
|
|
99
|
-
|
|
185
|
+
function assertProvider(provider) {
|
|
186
|
+
if (!PROVIDERS.some((p) => p.id === provider)) {
|
|
187
|
+
throw new Error(`unknown provider: ${String(provider)}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export async function saveKey(provider, key) {
|
|
100
191
|
if (!key || typeof key !== "string" || key.trim().length === 0) {
|
|
101
192
|
throw new Error("key must be non-empty string");
|
|
102
193
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
194
|
+
assertProvider(provider);
|
|
195
|
+
loadFromDisk();
|
|
106
196
|
const updatedAt = new Date().toISOString();
|
|
197
|
+
memoryMap.set(provider, { key, updatedAt });
|
|
107
198
|
try {
|
|
108
|
-
|
|
109
|
-
await keychainAdd(provider, key);
|
|
110
|
-
}
|
|
111
|
-
store.set(provider, { key, updatedAt, tier });
|
|
112
|
-
currentTier = tier;
|
|
113
|
-
return { updatedAt, tier };
|
|
199
|
+
writeToDisk();
|
|
114
200
|
}
|
|
115
201
|
catch (err) {
|
|
116
|
-
//
|
|
117
|
-
|
|
202
|
+
// Roll back the in-memory mutation so the store stays consistent with disk.
|
|
203
|
+
memoryMap.delete(provider);
|
|
204
|
+
// loadFromDisk will re-populate on next access if needed.
|
|
205
|
+
loadedForPath = null;
|
|
118
206
|
throw err;
|
|
119
207
|
}
|
|
208
|
+
return { updatedAt };
|
|
120
209
|
}
|
|
121
|
-
export function readKey(provider) {
|
|
122
|
-
|
|
210
|
+
export async function readKey(provider) {
|
|
211
|
+
assertProvider(provider);
|
|
212
|
+
loadFromDisk();
|
|
213
|
+
// Favor the live process.env if it has been populated (e.g. after merge).
|
|
214
|
+
const p = PROVIDERS.find((x) => x.id === provider);
|
|
215
|
+
const envVal = process.env[p.envVarName];
|
|
216
|
+
if (envVal && envVal.length > 0)
|
|
217
|
+
return envVal;
|
|
218
|
+
return memoryMap.get(provider)?.key ?? null;
|
|
123
219
|
}
|
|
124
|
-
/** Synchronous accessor used by detectAvailableProviders — safe, same semantics. */
|
|
125
220
|
export function readKeySync(provider) {
|
|
126
|
-
|
|
221
|
+
assertProvider(provider);
|
|
222
|
+
loadFromDisk();
|
|
223
|
+
const p = PROVIDERS.find((x) => x.id === provider);
|
|
224
|
+
const envVal = process.env[p.envVarName];
|
|
225
|
+
if (envVal && envVal.length > 0)
|
|
226
|
+
return envVal;
|
|
227
|
+
return memoryMap.get(provider)?.key ?? null;
|
|
127
228
|
}
|
|
128
|
-
/** Has-key predicate exposed for synchronous availability checks. */
|
|
129
229
|
export function hasKeySync(provider) {
|
|
130
|
-
|
|
230
|
+
assertProvider(provider);
|
|
231
|
+
loadFromDisk();
|
|
232
|
+
const p = PROVIDERS.find((x) => x.id === provider);
|
|
233
|
+
if (process.env[p.envVarName])
|
|
234
|
+
return true;
|
|
235
|
+
return memoryMap.has(provider);
|
|
131
236
|
}
|
|
132
237
|
export async function removeKey(provider) {
|
|
133
|
-
|
|
134
|
-
|
|
238
|
+
assertProvider(provider);
|
|
239
|
+
loadFromDisk();
|
|
240
|
+
if (!memoryMap.has(provider))
|
|
135
241
|
return;
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
await keychainDelete(provider);
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
logger.warn(`[settings-store] keychain remove for ${provider} failed: ${err.message}`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
store.delete(provider);
|
|
242
|
+
memoryMap.delete(provider);
|
|
243
|
+
writeToDisk();
|
|
145
244
|
}
|
|
146
245
|
export function listKeys() {
|
|
147
|
-
|
|
148
|
-
|
|
246
|
+
loadFromDisk();
|
|
247
|
+
const read = (id) => {
|
|
248
|
+
const e = memoryMap.get(id);
|
|
149
249
|
return e
|
|
150
|
-
? { stored: true, updatedAt: e.updatedAt
|
|
151
|
-
: { stored: false, updatedAt: null
|
|
250
|
+
? { stored: true, updatedAt: e.updatedAt }
|
|
251
|
+
: { stored: false, updatedAt: null };
|
|
252
|
+
};
|
|
253
|
+
return {
|
|
254
|
+
anthropic: read("anthropic"),
|
|
255
|
+
openai: read("openai"),
|
|
256
|
+
openrouter: read("openrouter"),
|
|
152
257
|
};
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
resolve(); // 44 = not found, idempotent
|
|
190
|
-
else
|
|
191
|
-
resolve(); // be lenient — delete must not block removeKey
|
|
192
|
-
});
|
|
193
|
-
});
|
|
258
|
+
}
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
// mergeStoredKeysIntoEnv — called ONCE at server boot before provider imports.
|
|
261
|
+
// Real env vars WIN; only missing env vars are populated. After merge the
|
|
262
|
+
// in-memory map is cleared to shrink the plaintext dwell window.
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
export function mergeStoredKeysIntoEnv() {
|
|
265
|
+
loadFromDisk();
|
|
266
|
+
for (const p of PROVIDERS) {
|
|
267
|
+
const stored = memoryMap.get(p.id);
|
|
268
|
+
if (!stored)
|
|
269
|
+
continue;
|
|
270
|
+
const current = process.env[p.envVarName];
|
|
271
|
+
if (current && current.length > 0) {
|
|
272
|
+
// Real env var wins — do not overwrite.
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
process.env[p.envVarName] = stored.key;
|
|
276
|
+
}
|
|
277
|
+
// Shrink plaintext dwell: drop the in-memory map.
|
|
278
|
+
memoryMap.clear();
|
|
279
|
+
// Keep loadedForPath so subsequent listKeys()/readKey() re-read from disk
|
|
280
|
+
// on demand rather than returning a stale empty map.
|
|
281
|
+
loadedForPath = null;
|
|
282
|
+
}
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
// Test hooks
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
export function resetSettingsStore(opts) {
|
|
287
|
+
memoryMap.clear();
|
|
288
|
+
loadedForPath = null;
|
|
289
|
+
logger = opts?.logger ?? defaultLogger;
|
|
290
|
+
fsApi = { ...defaultFs(), ...(opts?.fs ?? {}) };
|
|
291
|
+
}
|
|
292
|
+
export function _internalMapSize() {
|
|
293
|
+
return memoryMap.size;
|
|
194
294
|
}
|
|
195
295
|
//# sourceMappingURL=settings-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../../src/eval-server/settings-store.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,
|
|
1
|
+
{"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../../src/eval-server/settings-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a,j as o,s as g}from"./index-
|
|
1
|
+
import{r as a,j as o,s as g}from"./index-4LdVR3Lo.js";/* empty css */function h(r,i){if(!i)return 1;const n=i.toLowerCase(),c=[r.label,r.description??"",...r.keywords??[]].join(" ").toLowerCase();if(c.startsWith(n))return 100;const s=r.label.toLowerCase();if(s.startsWith(n))return 90;if(s.includes(n))return 80;if(c.includes(n))return 60;let l=0;for(const u of c)if(u===n[l]&&l++,l===n.length)return 40;return 0}function j({open:r,onClose:i,commands:n,placeholder:c=g.palette.inputPlaceholder}){const[s,l]=a.useState(""),[u,f]=a.useState(0),m=a.useRef(null),v=a.useRef(null),b=a.useRef(null),p=a.useMemo(()=>n.map(e=>({c:e,s:h(e,s)})).filter(e=>e.s>0).sort((e,x)=>x.s-e.s).map(e=>e.c),[n,s]);if(a.useEffect(()=>{if(r)return m.current=document.activeElement??null,l(""),f(0),requestAnimationFrame(()=>{var t;return(t=v.current)==null?void 0:t.focus()}),()=>{var t,e;(e=(t=m.current)==null?void 0:t.focus)==null||e.call(t),m.current=null}},[r]),a.useEffect(()=>{f(0)},[s]),a.useEffect(()=>{if(!r)return;function t(e){var x;if(e.key==="Escape"){e.preventDefault(),i();return}if(e.key==="ArrowDown"){e.preventDefault(),f(d=>Math.min(d+1,Math.max(p.length-1,0)));return}if(e.key==="ArrowUp"){e.preventDefault(),f(d=>Math.max(d-1,0));return}if(e.key==="Enter"){const d=p[u];d&&(e.preventDefault(),d.onInvoke(),i());return}e.key==="Tab"&&(e.preventDefault(),(x=v.current)==null||x.focus())}return window.addEventListener("keydown",t,!0),()=>window.removeEventListener("keydown",t,!0)},[r,i,p,u]),!r)return null;const y="command-palette-listbox";return o.jsx("div",{"data-testid":"command-palette",role:"presentation",onClick:t=>{t.target===t.currentTarget&&i()},style:{position:"fixed",inset:0,background:"color-mix(in srgb, var(--bg-canvas) 70%, transparent)",display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"12vh",zIndex:60},children:o.jsxs("div",{ref:b,role:"dialog","aria-modal":"true","aria-label":"Command palette",style:{width:"min(560px, 92vw)",background:"var(--bg-canvas)",border:"1px solid var(--border-default)",borderRadius:8,boxShadow:"0 24px 64px rgba(0,0,0,0.2)",overflow:"hidden",fontFamily:"var(--font-sans)",color:"var(--text-primary)"},children:[o.jsx("div",{role:"combobox","aria-expanded":"true","aria-controls":y,"aria-haspopup":"listbox",style:{padding:"8px 12px",borderBottom:"1px solid var(--border-default)"},children:o.jsx("input",{ref:v,type:"text",value:s,onChange:t=>l(t.currentTarget.value),"aria-label":"Command","aria-autocomplete":"list","aria-controls":y,placeholder:c,style:{width:"100%",border:"none",outline:"none",background:"transparent",color:"var(--text-primary)",fontFamily:"var(--font-sans)",fontSize:14,padding:"6px 0"}})}),o.jsxs("ul",{id:y,role:"listbox",style:{listStyle:"none",margin:0,padding:"4px 0",maxHeight:320,overflow:"auto"},children:[p.length===0&&o.jsx("li",{role:"option","aria-selected":"false",style:{padding:"10px 12px",color:"var(--text-secondary)",fontSize:12},children:g.palette.emptyResults}),p.map((t,e)=>o.jsxs("li",{role:"option","aria-selected":e===u,onMouseEnter:()=>f(e),onClick:()=>{t.onInvoke(),i()},style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"8px 12px",background:e===u?"color-mix(in srgb, var(--accent-surface) 10%, transparent)":"transparent",cursor:"pointer",fontSize:13},children:[o.jsx("span",{children:t.label}),t.description&&o.jsx("span",{style:{fontSize:11,color:"var(--text-secondary)",marginLeft:12},children:t.description})]},t.id))]})]})})}export{j as CommandPalette,j as default,h as scoreCommand};
|