okit-cli 0.0.1 → 2.1.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/dist/commands/auth.d.ts +4 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +134 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/check.d.ts +2 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +122 -29
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +5 -0
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/profile.d.ts +18 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +409 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/relay.d.ts +13 -0
- package/dist/commands/relay.d.ts.map +1 -0
- package/dist/commands/relay.js +208 -0
- package/dist/commands/relay.js.map +1 -0
- package/dist/commands/repo.js +0 -16
- package/dist/commands/repo.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +21 -72
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/upgrade.d.ts +1 -3
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +45 -110
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/vault.d.ts +14 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +255 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/config/i18n.d.ts +71 -0
- package/dist/config/i18n.d.ts.map +1 -1
- package/dist/config/i18n.js +150 -0
- package/dist/config/i18n.js.map +1 -1
- package/dist/config/registry.d.ts +14 -6
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +638 -68
- package/dist/config/registry.js.map +1 -1
- package/dist/config/user.d.ts +4 -0
- package/dist/config/user.d.ts.map +1 -1
- package/dist/config/user.js +1 -0
- package/dist/config/user.js.map +1 -1
- package/dist/executor/deps/BrewDependencyProvider.d.ts.map +1 -1
- package/dist/executor/deps/BrewDependencyProvider.js +4 -2
- package/dist/executor/deps/BrewDependencyProvider.js.map +1 -1
- package/dist/executor/deps/NpmDependencyProvider.d.ts.map +1 -1
- package/dist/executor/deps/NpmDependencyProvider.js +4 -2
- package/dist/executor/deps/NpmDependencyProvider.js.map +1 -1
- package/dist/executor/deps/PipxDependencyProvider.d.ts.map +1 -1
- package/dist/executor/deps/PipxDependencyProvider.js +4 -2
- package/dist/executor/deps/PipxDependencyProvider.js.map +1 -1
- package/dist/executor/deps/UvToolDependencyProvider.d.ts.map +1 -1
- package/dist/executor/deps/UvToolDependencyProvider.js +4 -2
- package/dist/executor/deps/UvToolDependencyProvider.js.map +1 -1
- package/dist/executor/plan/registryDeps.d.ts.map +1 -1
- package/dist/executor/plan/registryDeps.js +13 -5
- package/dist/executor/plan/registryDeps.js.map +1 -1
- package/dist/executor/runner.d.ts.map +1 -1
- package/dist/executor/runner.js +11 -9
- package/dist/executor/runner.js.map +1 -1
- package/dist/main.js +188 -4
- package/dist/main.js.map +1 -1
- package/dist/utils/semver.d.ts +12 -0
- package/dist/utils/semver.d.ts.map +1 -0
- package/dist/utils/semver.js +71 -0
- package/dist/utils/semver.js.map +1 -0
- package/dist/vault/store.d.ts +51 -0
- package/dist/vault/store.d.ts.map +1 -0
- package/dist/vault/store.js +260 -0
- package/dist/vault/store.js.map +1 -0
- package/package.json +8 -3
package/dist/main.js
CHANGED
|
@@ -46,6 +46,10 @@ const upgrade_1 = require("./commands/upgrade");
|
|
|
46
46
|
const uninstall_1 = require("./commands/uninstall");
|
|
47
47
|
const repo_1 = require("./commands/repo");
|
|
48
48
|
const check_1 = require("./commands/check");
|
|
49
|
+
const auth_1 = require("./commands/auth");
|
|
50
|
+
const relay_1 = require("./commands/relay");
|
|
51
|
+
const vault_1 = require("./commands/vault");
|
|
52
|
+
const profile_1 = require("./commands/profile");
|
|
49
53
|
const registry_1 = require("./config/registry");
|
|
50
54
|
const i18n_1 = require("./config/i18n");
|
|
51
55
|
const user_1 = require("./config/user");
|
|
@@ -61,11 +65,11 @@ function showBanner() {
|
|
|
61
65
|
╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
|
|
62
66
|
`;
|
|
63
67
|
console.log(kleur_1.default.cyan(banner));
|
|
64
|
-
console.log(kleur_1.default.gray(
|
|
68
|
+
console.log(kleur_1.default.gray(` OKIT v${package_json_1.default.version} - macOS 开发工具管理器\n`));
|
|
65
69
|
}
|
|
66
70
|
program
|
|
67
71
|
.name("okit")
|
|
68
|
-
.description("OKIT
|
|
72
|
+
.description("OKIT - Agent 基础设施管理工具")
|
|
69
73
|
.version(package_json_1.default.version);
|
|
70
74
|
function getUnknownSubcommand() {
|
|
71
75
|
const argv = process.argv.slice(2);
|
|
@@ -198,6 +202,185 @@ program
|
|
|
198
202
|
await selectLanguageIfNeeded();
|
|
199
203
|
await (0, check_1.runCheck)({ json: options.json });
|
|
200
204
|
});
|
|
205
|
+
// profile 子命令
|
|
206
|
+
const profile = program
|
|
207
|
+
.command("profile")
|
|
208
|
+
.description("管理工具 Profile(一键安装预设工具集)")
|
|
209
|
+
.action(async () => {
|
|
210
|
+
checkPlatform();
|
|
211
|
+
await selectLanguageIfNeeded();
|
|
212
|
+
configurePrompts((0, i18n_1.getLanguage)());
|
|
213
|
+
await (0, profile_1.showProfileMenu)();
|
|
214
|
+
});
|
|
215
|
+
profile
|
|
216
|
+
.command("create")
|
|
217
|
+
.description("创建新 Profile")
|
|
218
|
+
.action(async () => {
|
|
219
|
+
checkPlatform();
|
|
220
|
+
await selectLanguageIfNeeded();
|
|
221
|
+
configurePrompts((0, i18n_1.getLanguage)());
|
|
222
|
+
await (0, profile_1.createProfile)();
|
|
223
|
+
});
|
|
224
|
+
profile
|
|
225
|
+
.command("apply [name]")
|
|
226
|
+
.description("应用 Profile(安装所有工具)")
|
|
227
|
+
.action(async (name) => {
|
|
228
|
+
checkPlatform();
|
|
229
|
+
await selectLanguageIfNeeded();
|
|
230
|
+
configurePrompts((0, i18n_1.getLanguage)());
|
|
231
|
+
await (0, profile_1.applyProfile)(name);
|
|
232
|
+
});
|
|
233
|
+
profile
|
|
234
|
+
.command("list")
|
|
235
|
+
.description("列出所有 Profile")
|
|
236
|
+
.action(async () => {
|
|
237
|
+
checkPlatform();
|
|
238
|
+
await selectLanguageIfNeeded();
|
|
239
|
+
await (0, profile_1.showProfiles)();
|
|
240
|
+
});
|
|
241
|
+
profile
|
|
242
|
+
.command("show <name>")
|
|
243
|
+
.description("查看 Profile 详情及安装状态")
|
|
244
|
+
.action(async (name) => {
|
|
245
|
+
checkPlatform();
|
|
246
|
+
await selectLanguageIfNeeded();
|
|
247
|
+
await (0, profile_1.showProfileDetail)(name);
|
|
248
|
+
});
|
|
249
|
+
profile
|
|
250
|
+
.command("delete [name]")
|
|
251
|
+
.description("删除 Profile")
|
|
252
|
+
.action(async (name) => {
|
|
253
|
+
checkPlatform();
|
|
254
|
+
await selectLanguageIfNeeded();
|
|
255
|
+
configurePrompts((0, i18n_1.getLanguage)());
|
|
256
|
+
await (0, profile_1.removeProfile)(name);
|
|
257
|
+
});
|
|
258
|
+
profile
|
|
259
|
+
.command("export [name]")
|
|
260
|
+
.description("导出 Profile 为 JSON 文件")
|
|
261
|
+
.option("-o, --output <path>", "输出路径")
|
|
262
|
+
.action(async (name, options) => {
|
|
263
|
+
checkPlatform();
|
|
264
|
+
await selectLanguageIfNeeded();
|
|
265
|
+
configurePrompts((0, i18n_1.getLanguage)());
|
|
266
|
+
await (0, profile_1.exportProfile)(name, options?.output);
|
|
267
|
+
});
|
|
268
|
+
profile
|
|
269
|
+
.command("import <file>")
|
|
270
|
+
.description("从 JSON 文件导入 Profile")
|
|
271
|
+
.action(async (file) => {
|
|
272
|
+
checkPlatform();
|
|
273
|
+
await selectLanguageIfNeeded();
|
|
274
|
+
configurePrompts((0, i18n_1.getLanguage)());
|
|
275
|
+
await (0, profile_1.importProfile)(file);
|
|
276
|
+
});
|
|
277
|
+
// auth 子命令 - 授权生命周期管理
|
|
278
|
+
program
|
|
279
|
+
.command("auth")
|
|
280
|
+
.description("检查并修复工具授权状态")
|
|
281
|
+
.option("--fix", "尝试自动修复授权问题")
|
|
282
|
+
.action(async (options) => {
|
|
283
|
+
checkPlatform();
|
|
284
|
+
await selectLanguageIfNeeded();
|
|
285
|
+
await (0, auth_1.runAuth)({ fix: options.fix });
|
|
286
|
+
});
|
|
287
|
+
// vault 子命令 - 密钥管理
|
|
288
|
+
const vault = program
|
|
289
|
+
.command("vault")
|
|
290
|
+
.description("密钥管理(加密存储、按需注入、项目关联)")
|
|
291
|
+
.action(async () => {
|
|
292
|
+
await (0, vault_1.vaultList)();
|
|
293
|
+
});
|
|
294
|
+
vault
|
|
295
|
+
.command("set <key> <value>")
|
|
296
|
+
.description("存储密钥(支持 KEY/alias 格式,如 GITHUB_TOKEN/company)")
|
|
297
|
+
.action(async (key, value) => {
|
|
298
|
+
await (0, vault_1.vaultSet)(key, value);
|
|
299
|
+
});
|
|
300
|
+
vault
|
|
301
|
+
.command("get <key>")
|
|
302
|
+
.description("获取密钥明文(支持 KEY/alias 格式)")
|
|
303
|
+
.action(async (key) => {
|
|
304
|
+
await (0, vault_1.vaultGet)(key);
|
|
305
|
+
});
|
|
306
|
+
vault
|
|
307
|
+
.command("list")
|
|
308
|
+
.description("列出所有密钥(脱敏显示)")
|
|
309
|
+
.action(async () => {
|
|
310
|
+
await (0, vault_1.vaultList)();
|
|
311
|
+
});
|
|
312
|
+
vault
|
|
313
|
+
.command("delete <key>")
|
|
314
|
+
.description("删除密钥")
|
|
315
|
+
.action(async (key) => {
|
|
316
|
+
await (0, vault_1.vaultDelete)(key);
|
|
317
|
+
});
|
|
318
|
+
vault
|
|
319
|
+
.command("inject")
|
|
320
|
+
.description("输出 shell export 语句(配合 eval 使用)")
|
|
321
|
+
.option("--keys <keys>", "手动指定 key 列表(逗号分隔)")
|
|
322
|
+
.option("--dir <dir>", "指定项目目录")
|
|
323
|
+
.action(async (options) => {
|
|
324
|
+
await (0, vault_1.vaultInject)(options);
|
|
325
|
+
});
|
|
326
|
+
vault
|
|
327
|
+
.command("env [file]")
|
|
328
|
+
.description("根据 .okitenv 生成 .env 文件并注册关联")
|
|
329
|
+
.option("--dir <dir>", "指定项目目录")
|
|
330
|
+
.action(async (file, options) => {
|
|
331
|
+
await (0, vault_1.vaultEnv)(file, options);
|
|
332
|
+
});
|
|
333
|
+
vault
|
|
334
|
+
.command("where <key>")
|
|
335
|
+
.description("查看密钥在哪些项目中使用")
|
|
336
|
+
.action(async (key) => {
|
|
337
|
+
await (0, vault_1.vaultWhere)(key);
|
|
338
|
+
});
|
|
339
|
+
vault
|
|
340
|
+
.command("sync")
|
|
341
|
+
.description("同步所有关联文件(更新密钥后自动刷新)")
|
|
342
|
+
.action(async () => {
|
|
343
|
+
await (0, vault_1.vaultSync)();
|
|
344
|
+
});
|
|
345
|
+
// relay 子命令 - 中继服务器
|
|
346
|
+
const relay = program
|
|
347
|
+
.command("relay")
|
|
348
|
+
.description("中继服务器(本地服务安全暴露到外网)");
|
|
349
|
+
relay
|
|
350
|
+
.command("config")
|
|
351
|
+
.description("配置中继服务器地址和认证 token")
|
|
352
|
+
.option("--url <url>", "中继服务器 URL")
|
|
353
|
+
.option("--token <token>", "认证 token")
|
|
354
|
+
.action(async (options) => {
|
|
355
|
+
await (0, relay_1.relayConfig)(options);
|
|
356
|
+
});
|
|
357
|
+
relay
|
|
358
|
+
.command("connect")
|
|
359
|
+
.description("连接本地服务到中继")
|
|
360
|
+
.requiredOption("--tunnel <id>", "隧道 ID")
|
|
361
|
+
.requiredOption("--agent <name>", "Agent 名称(用于注册和路由)")
|
|
362
|
+
.option("--target <url>", "本地目标地址", "http://localhost:3000")
|
|
363
|
+
.action(async (options) => {
|
|
364
|
+
await (0, relay_1.relayConnect)(options);
|
|
365
|
+
});
|
|
366
|
+
relay
|
|
367
|
+
.command("status <tunnel>")
|
|
368
|
+
.description("查看隧道状态")
|
|
369
|
+
.action(async (tunnel) => {
|
|
370
|
+
await (0, relay_1.relayStatus)(tunnel);
|
|
371
|
+
});
|
|
372
|
+
relay
|
|
373
|
+
.command("create [tunnel]")
|
|
374
|
+
.description("创建隧道")
|
|
375
|
+
.action(async (tunnel) => {
|
|
376
|
+
await (0, relay_1.relayCreate)(tunnel);
|
|
377
|
+
});
|
|
378
|
+
relay
|
|
379
|
+
.command("agents")
|
|
380
|
+
.description("列出所有在线 Agent")
|
|
381
|
+
.action(async () => {
|
|
382
|
+
await (0, relay_1.relayAgents)();
|
|
383
|
+
});
|
|
201
384
|
// reset 子命令 - 不需要选择语言
|
|
202
385
|
program
|
|
203
386
|
.command("reset")
|
|
@@ -228,8 +411,9 @@ program
|
|
|
228
411
|
startServer(port);
|
|
229
412
|
});
|
|
230
413
|
function checkPlatform() {
|
|
231
|
-
|
|
232
|
-
|
|
414
|
+
const supported = ["darwin", "linux"];
|
|
415
|
+
if (!supported.includes(process.platform)) {
|
|
416
|
+
console.log(kleur_1.default.red(`✗ 当前不支持 ${process.platform} 平台 (支持: macOS, Linux)`));
|
|
233
417
|
process.exit(1);
|
|
234
418
|
}
|
|
235
419
|
}
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface SemVer {
|
|
2
|
+
major: number;
|
|
3
|
+
minor: number;
|
|
4
|
+
patch: number;
|
|
5
|
+
raw: string;
|
|
6
|
+
}
|
|
7
|
+
export type UpgradeLevel = "patch" | "minor" | "major" | "unknown";
|
|
8
|
+
export declare function parseSemVer(raw: string): SemVer | null;
|
|
9
|
+
export declare function compareVersions(current: SemVer, available: SemVer): UpgradeLevel;
|
|
10
|
+
export declare function upgradeLevelLabel(level: UpgradeLevel, lang?: "zh" | "en"): string;
|
|
11
|
+
export declare function upgradeAdvice(level: UpgradeLevel, lang?: "zh" | "en"): string;
|
|
12
|
+
//# sourceMappingURL=semver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/utils/semver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAQnE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtD;AAGD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAShF;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAQvF;AAGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAoBnF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseSemVer = parseSemVer;
|
|
4
|
+
exports.compareVersions = compareVersions;
|
|
5
|
+
exports.upgradeLevelLabel = upgradeLevelLabel;
|
|
6
|
+
exports.upgradeAdvice = upgradeAdvice;
|
|
7
|
+
// 从杂乱的版本字符串中提取 semver
|
|
8
|
+
// 例: "git version 2.50.1 (Apple Git-155)" → { major: 2, minor: 50, patch: 1 }
|
|
9
|
+
// 例: "v24.13.0" → { major: 24, minor: 13, patch: 0 }
|
|
10
|
+
// 例: "Homebrew 5.1.3" → { major: 5, minor: 1, patch: 3 }
|
|
11
|
+
// 例: "0.67.0 (Homebrew)" → { major: 0, minor: 67, patch: 0 }
|
|
12
|
+
// 例: "8.0.1" → { major: 8, minor: 0, patch: 1 }
|
|
13
|
+
function parseSemVer(raw) {
|
|
14
|
+
if (!raw)
|
|
15
|
+
return null;
|
|
16
|
+
// 匹配 x.y.z 或 x.y 格式的版本号
|
|
17
|
+
const match = raw.match(/(\d+)\.(\d+)(?:\.(\d+))?/);
|
|
18
|
+
if (!match)
|
|
19
|
+
return null;
|
|
20
|
+
return {
|
|
21
|
+
major: parseInt(match[1], 10),
|
|
22
|
+
minor: parseInt(match[2], 10),
|
|
23
|
+
patch: match[3] !== undefined ? parseInt(match[3], 10) : 0,
|
|
24
|
+
raw,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// 比较两个版本,返回升级级别
|
|
28
|
+
function compareVersions(current, available) {
|
|
29
|
+
if (available.major > current.major)
|
|
30
|
+
return "major";
|
|
31
|
+
if (available.major === current.major && available.minor > current.minor)
|
|
32
|
+
return "minor";
|
|
33
|
+
if (available.major === current.major &&
|
|
34
|
+
available.minor === current.minor &&
|
|
35
|
+
available.patch > current.patch)
|
|
36
|
+
return "patch";
|
|
37
|
+
return "unknown";
|
|
38
|
+
}
|
|
39
|
+
// 获取升级级别的风险描述
|
|
40
|
+
function upgradeLevelLabel(level, lang = "zh") {
|
|
41
|
+
const labels = {
|
|
42
|
+
patch: { zh: "补丁", en: "patch" },
|
|
43
|
+
minor: { zh: "次版本", en: "minor" },
|
|
44
|
+
major: { zh: "主版本", en: "major" },
|
|
45
|
+
unknown: { zh: "未知", en: "unknown" },
|
|
46
|
+
};
|
|
47
|
+
return labels[level][lang] || labels[level].en;
|
|
48
|
+
}
|
|
49
|
+
// 获取升级建议
|
|
50
|
+
function upgradeAdvice(level, lang = "zh") {
|
|
51
|
+
const advice = {
|
|
52
|
+
patch: {
|
|
53
|
+
zh: "安全升级,建议自动执行",
|
|
54
|
+
en: "Safe to auto-upgrade",
|
|
55
|
+
},
|
|
56
|
+
minor: {
|
|
57
|
+
zh: "一般安全,建议检查 changelog",
|
|
58
|
+
en: "Generally safe, check changelog",
|
|
59
|
+
},
|
|
60
|
+
major: {
|
|
61
|
+
zh: "可能有 breaking changes,需评估影响",
|
|
62
|
+
en: "May have breaking changes, assess impact",
|
|
63
|
+
},
|
|
64
|
+
unknown: {
|
|
65
|
+
zh: "无法判断,建议手动检查",
|
|
66
|
+
en: "Cannot determine, check manually",
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
return advice[level][lang] || advice[level].en;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=semver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/utils/semver.ts"],"names":[],"mappings":";;AAeA,kCAWC;AAGD,0CASC;AAGD,8CAQC;AAGD,sCAoBC;AA/DD,sBAAsB;AACtB,8EAA8E;AAC9E,qDAAqD;AACrD,yDAAyD;AACzD,6DAA6D;AAC7D,gDAAgD;AAChD,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,wBAAwB;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,SAAgB,eAAe,CAAC,OAAe,EAAE,SAAiB;IAChE,IAAI,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACpD,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACzF,IACE,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QACjC,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QACjC,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;QAC/B,OAAO,OAAO,CAAC;IACjB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,cAAc;AACd,SAAgB,iBAAiB,CAAC,KAAmB,EAAE,OAAoB,IAAI;IAC7E,MAAM,MAAM,GAAiD;QAC3D,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE;QAChC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE;QACjC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE;QACjC,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE;KACrC,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS;AACT,SAAgB,aAAa,CAAC,KAAmB,EAAE,OAAoB,IAAI;IACzE,MAAM,MAAM,GAAiD;QAC3D,KAAK,EAAE;YACL,EAAE,EAAE,aAAa;YACjB,EAAE,EAAE,sBAAsB;SAC3B;QACD,KAAK,EAAE;YACL,EAAE,EAAE,qBAAqB;YACzB,EAAE,EAAE,iCAAiC;SACtC;QACD,KAAK,EAAE;YACL,EAAE,EAAE,4BAA4B;YAChC,EAAE,EAAE,0CAA0C;SAC/C;QACD,OAAO,EAAE;YACP,EAAE,EAAE,aAAa;YACjB,EAAE,EAAE,kCAAkC;SACvC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface SecretEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
alias: string;
|
|
4
|
+
value: string;
|
|
5
|
+
createdAt: string;
|
|
6
|
+
updatedAt: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ProjectBinding {
|
|
9
|
+
projectPath: string;
|
|
10
|
+
file: string;
|
|
11
|
+
key: string;
|
|
12
|
+
alias: string;
|
|
13
|
+
envName?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface VaultData {
|
|
16
|
+
secrets: SecretEntry[];
|
|
17
|
+
bindings: ProjectBinding[];
|
|
18
|
+
}
|
|
19
|
+
export declare class VaultStore {
|
|
20
|
+
private key;
|
|
21
|
+
private data;
|
|
22
|
+
constructor();
|
|
23
|
+
private load;
|
|
24
|
+
reload(): Promise<void>;
|
|
25
|
+
private save;
|
|
26
|
+
static parseKeyAlias(input: string): {
|
|
27
|
+
key: string;
|
|
28
|
+
alias: string;
|
|
29
|
+
};
|
|
30
|
+
set(keyAlias: string, value: string): Promise<void>;
|
|
31
|
+
get(keyAlias: string): Promise<string | null>;
|
|
32
|
+
delete(keyAlias: string): Promise<boolean>;
|
|
33
|
+
list(): Promise<Array<{
|
|
34
|
+
key: string;
|
|
35
|
+
alias: string;
|
|
36
|
+
masked: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}>>;
|
|
39
|
+
getAliases(key: string): Promise<string[]>;
|
|
40
|
+
resolve(key: string, alias?: string): Promise<string | null>;
|
|
41
|
+
addBinding(binding: ProjectBinding): Promise<void>;
|
|
42
|
+
getBindings(keyAlias?: string): Promise<ProjectBinding[]>;
|
|
43
|
+
removeBindingsForProject(projectPath: string): Promise<void>;
|
|
44
|
+
sync(): Promise<Array<{
|
|
45
|
+
file: string;
|
|
46
|
+
key: string;
|
|
47
|
+
success: boolean;
|
|
48
|
+
error?: string;
|
|
49
|
+
}>>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/vault/store.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AA8CD,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAA0B;;YAOxB,IAAI;IAsBZ,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAKf,IAAI;IAalB,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAQ7D,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO7C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAWzF,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM1C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgB5D,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlD,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IASzD,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5D,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CA+D9F"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VaultStore = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const registry_1 = require("../config/registry");
|
|
12
|
+
const VAULT_DIR = path_1.default.join(registry_1.OKIT_DIR, "vault");
|
|
13
|
+
const SECRETS_FILE = path_1.default.join(VAULT_DIR, "secrets.enc");
|
|
14
|
+
const MASTER_KEY_FILE = path_1.default.join(VAULT_DIR, "master.key");
|
|
15
|
+
const REGISTRY_FILE = path_1.default.join(VAULT_DIR, "registry.json");
|
|
16
|
+
const ALGORITHM = "aes-256-gcm";
|
|
17
|
+
const KEY_LENGTH = 32;
|
|
18
|
+
const IV_LENGTH = 16;
|
|
19
|
+
const TAG_LENGTH = 16;
|
|
20
|
+
// Derive encryption key from machine fingerprint
|
|
21
|
+
function deriveMasterKey() {
|
|
22
|
+
const fp = path_1.default.join(VAULT_DIR, "master.key");
|
|
23
|
+
if (fs_extra_1.default.existsSync(fp)) {
|
|
24
|
+
return Buffer.from(fs_extra_1.default.readFileSync(fp, "utf-8"), "hex");
|
|
25
|
+
}
|
|
26
|
+
// Generate from machine identity
|
|
27
|
+
const identity = `${os_1.default.hostname()}:${os_1.default.userInfo().username}:okit-vault`;
|
|
28
|
+
const key = crypto_1.default.pbkdf2Sync(identity, "okit-vault-salt", 100000, KEY_LENGTH, "sha256");
|
|
29
|
+
fs_extra_1.default.ensureDirSync(VAULT_DIR);
|
|
30
|
+
fs_extra_1.default.writeFileSync(fp, key.toString("hex"), { mode: 0o600 });
|
|
31
|
+
return key;
|
|
32
|
+
}
|
|
33
|
+
function encrypt(plaintext, key) {
|
|
34
|
+
const iv = crypto_1.default.randomBytes(IV_LENGTH);
|
|
35
|
+
const cipher = crypto_1.default.createCipheriv(ALGORITHM, key, iv);
|
|
36
|
+
let encrypted = cipher.update(plaintext, "utf8");
|
|
37
|
+
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
38
|
+
const tag = cipher.getAuthTag();
|
|
39
|
+
// Format: iv:tag:ciphertext (all hex)
|
|
40
|
+
return `${iv.toString("hex")}:${tag.toString("hex")}:${encrypted.toString("hex")}`;
|
|
41
|
+
}
|
|
42
|
+
function decrypt(data, key) {
|
|
43
|
+
const parts = data.split(":");
|
|
44
|
+
if (parts.length !== 3)
|
|
45
|
+
throw new Error("Invalid encrypted data format");
|
|
46
|
+
const iv = Buffer.from(parts[0], "hex");
|
|
47
|
+
const tag = Buffer.from(parts[1], "hex");
|
|
48
|
+
const encrypted = Buffer.from(parts[2], "hex");
|
|
49
|
+
const decipher = crypto_1.default.createDecipheriv(ALGORITHM, key, iv);
|
|
50
|
+
decipher.setAuthTag(tag);
|
|
51
|
+
let decrypted = decipher.update(encrypted);
|
|
52
|
+
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
53
|
+
return decrypted.toString("utf8");
|
|
54
|
+
}
|
|
55
|
+
function maskValue(value) {
|
|
56
|
+
if (value.length <= 6)
|
|
57
|
+
return "***";
|
|
58
|
+
return value.slice(0, 3) + "***" + value.slice(-3);
|
|
59
|
+
}
|
|
60
|
+
class VaultStore {
|
|
61
|
+
constructor() {
|
|
62
|
+
this.data = null;
|
|
63
|
+
fs_extra_1.default.ensureDirSync(VAULT_DIR);
|
|
64
|
+
this.key = deriveMasterKey();
|
|
65
|
+
}
|
|
66
|
+
async load() {
|
|
67
|
+
if (this.data)
|
|
68
|
+
return this.data;
|
|
69
|
+
let secrets = [];
|
|
70
|
+
let bindings = [];
|
|
71
|
+
if (await fs_extra_1.default.pathExists(SECRETS_FILE)) {
|
|
72
|
+
const raw = await fs_extra_1.default.readFile(SECRETS_FILE, "utf-8");
|
|
73
|
+
const decrypted = decrypt(raw, this.key);
|
|
74
|
+
secrets = JSON.parse(decrypted);
|
|
75
|
+
}
|
|
76
|
+
if (await fs_extra_1.default.pathExists(REGISTRY_FILE)) {
|
|
77
|
+
const reg = await fs_extra_1.default.readFile(REGISTRY_FILE, "utf-8");
|
|
78
|
+
bindings = JSON.parse(reg);
|
|
79
|
+
}
|
|
80
|
+
this.data = { secrets, bindings };
|
|
81
|
+
return this.data;
|
|
82
|
+
}
|
|
83
|
+
async reload() {
|
|
84
|
+
this.data = null;
|
|
85
|
+
await this.load();
|
|
86
|
+
}
|
|
87
|
+
async save() {
|
|
88
|
+
if (!this.data)
|
|
89
|
+
return;
|
|
90
|
+
// Encrypt secrets
|
|
91
|
+
const secretsJson = JSON.stringify(this.data.secrets);
|
|
92
|
+
const encrypted = encrypt(secretsJson, this.key);
|
|
93
|
+
await fs_extra_1.default.writeFile(SECRETS_FILE, encrypted, { mode: 0o600 });
|
|
94
|
+
// Save bindings separately (unencrypted, just paths)
|
|
95
|
+
await fs_extra_1.default.writeFile(REGISTRY_FILE, JSON.stringify(this.data.bindings, null, 2));
|
|
96
|
+
}
|
|
97
|
+
// Parse "KEY/alias" format, default alias is "default"
|
|
98
|
+
static parseKeyAlias(input) {
|
|
99
|
+
const slashIdx = input.indexOf("/");
|
|
100
|
+
if (slashIdx === -1) {
|
|
101
|
+
return { key: input, alias: "default" };
|
|
102
|
+
}
|
|
103
|
+
return { key: input.slice(0, slashIdx), alias: input.slice(slashIdx + 1) };
|
|
104
|
+
}
|
|
105
|
+
async set(keyAlias, value) {
|
|
106
|
+
const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
|
|
107
|
+
const data = await this.load();
|
|
108
|
+
const now = new Date().toISOString();
|
|
109
|
+
const existing = data.secrets.find((s) => s.key === key && s.alias === alias);
|
|
110
|
+
if (existing) {
|
|
111
|
+
existing.value = value;
|
|
112
|
+
existing.updatedAt = now;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
data.secrets.push({ key, alias, value, createdAt: now, updatedAt: now });
|
|
116
|
+
}
|
|
117
|
+
await this.save();
|
|
118
|
+
}
|
|
119
|
+
async get(keyAlias) {
|
|
120
|
+
const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
|
|
121
|
+
const data = await this.load();
|
|
122
|
+
const entry = data.secrets.find((s) => s.key === key && s.alias === alias);
|
|
123
|
+
return entry?.value ?? null;
|
|
124
|
+
}
|
|
125
|
+
async delete(keyAlias) {
|
|
126
|
+
const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
|
|
127
|
+
const data = await this.load();
|
|
128
|
+
const idx = data.secrets.findIndex((s) => s.key === key && s.alias === alias);
|
|
129
|
+
if (idx === -1)
|
|
130
|
+
return false;
|
|
131
|
+
data.secrets.splice(idx, 1);
|
|
132
|
+
// Remove related bindings
|
|
133
|
+
data.bindings = data.bindings.filter((b) => !(b.key === key && b.alias === alias));
|
|
134
|
+
await this.save();
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
async list() {
|
|
138
|
+
const data = await this.load();
|
|
139
|
+
return data.secrets.map((s) => ({
|
|
140
|
+
key: s.key,
|
|
141
|
+
alias: s.alias,
|
|
142
|
+
masked: maskValue(s.value),
|
|
143
|
+
updatedAt: s.updatedAt,
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
// Get all aliases for a key
|
|
147
|
+
async getAliases(key) {
|
|
148
|
+
const data = await this.load();
|
|
149
|
+
return data.secrets.filter((s) => s.key === key).map((s) => s.alias);
|
|
150
|
+
}
|
|
151
|
+
// Resolve a key for a project: look up .okitenv mapping, fall back to "default"
|
|
152
|
+
async resolve(key, alias) {
|
|
153
|
+
const data = await this.load();
|
|
154
|
+
const targetAlias = alias || "default";
|
|
155
|
+
const entry = data.secrets.find((s) => s.key === key && s.alias === targetAlias);
|
|
156
|
+
if (entry)
|
|
157
|
+
return entry.value;
|
|
158
|
+
// Fall back to default if specific alias not found
|
|
159
|
+
if (targetAlias !== "default") {
|
|
160
|
+
const def = data.secrets.find((s) => s.key === key && s.alias === "default");
|
|
161
|
+
return def?.value ?? null;
|
|
162
|
+
}
|
|
163
|
+
// Fall back to first available alias
|
|
164
|
+
const any = data.secrets.find((s) => s.key === key);
|
|
165
|
+
return any?.value ?? null;
|
|
166
|
+
}
|
|
167
|
+
// Project binding management
|
|
168
|
+
async addBinding(binding) {
|
|
169
|
+
const data = await this.load();
|
|
170
|
+
// Deduplicate by project + file + envName
|
|
171
|
+
const targetEnvName = binding.envName || binding.key;
|
|
172
|
+
const exists = data.bindings.find((b) => b.projectPath === binding.projectPath &&
|
|
173
|
+
b.file === binding.file &&
|
|
174
|
+
(b.envName || b.key) === targetEnvName);
|
|
175
|
+
if (exists) {
|
|
176
|
+
exists.key = binding.key;
|
|
177
|
+
exists.alias = binding.alias;
|
|
178
|
+
exists.envName = binding.envName;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
data.bindings.push(binding);
|
|
182
|
+
}
|
|
183
|
+
await this.save();
|
|
184
|
+
}
|
|
185
|
+
async getBindings(keyAlias) {
|
|
186
|
+
const data = await this.load();
|
|
187
|
+
if (!keyAlias)
|
|
188
|
+
return data.bindings;
|
|
189
|
+
const { key, alias } = VaultStore.parseKeyAlias(keyAlias);
|
|
190
|
+
return data.bindings.filter((b) => b.key === key && (alias === "default" || b.alias === alias));
|
|
191
|
+
}
|
|
192
|
+
async removeBindingsForProject(projectPath) {
|
|
193
|
+
const data = await this.load();
|
|
194
|
+
data.bindings = data.bindings.filter((b) => b.projectPath !== projectPath);
|
|
195
|
+
await this.save();
|
|
196
|
+
}
|
|
197
|
+
// Sync: update all bound files with current secret values
|
|
198
|
+
async sync() {
|
|
199
|
+
const data = await this.load();
|
|
200
|
+
const results = [];
|
|
201
|
+
// Group bindings by target file
|
|
202
|
+
const fileMap = new Map();
|
|
203
|
+
for (const b of data.bindings) {
|
|
204
|
+
const fullPath = path_1.default.join(b.projectPath, b.file);
|
|
205
|
+
const existing = fileMap.get(fullPath) || [];
|
|
206
|
+
existing.push(b);
|
|
207
|
+
fileMap.set(fullPath, existing);
|
|
208
|
+
}
|
|
209
|
+
for (const [filePath, bindings] of fileMap) {
|
|
210
|
+
try {
|
|
211
|
+
// Read existing file or start empty
|
|
212
|
+
let content = "";
|
|
213
|
+
if (await fs_extra_1.default.pathExists(filePath)) {
|
|
214
|
+
content = await fs_extra_1.default.readFile(filePath, "utf-8");
|
|
215
|
+
}
|
|
216
|
+
for (const binding of bindings) {
|
|
217
|
+
const value = await this.resolve(binding.key, binding.alias);
|
|
218
|
+
if (value === null) {
|
|
219
|
+
results.push({
|
|
220
|
+
file: filePath,
|
|
221
|
+
key: binding.envName || binding.key,
|
|
222
|
+
success: false,
|
|
223
|
+
error: "Secret not found in vault",
|
|
224
|
+
});
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
// Use envName if set, otherwise vault key
|
|
228
|
+
const envKey = binding.envName || binding.key;
|
|
229
|
+
const regex = new RegExp(`^${escapeRegex(envKey)}=.*$`, "m");
|
|
230
|
+
const newLine = `${envKey}=${value}`;
|
|
231
|
+
if (regex.test(content)) {
|
|
232
|
+
content = content.replace(regex, newLine);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
content = content.trimEnd() + (content.length > 0 ? "\n" : "") + newLine + "\n";
|
|
236
|
+
}
|
|
237
|
+
results.push({ file: filePath, key: binding.key, success: true });
|
|
238
|
+
}
|
|
239
|
+
await fs_extra_1.default.ensureDir(path_1.default.dirname(filePath));
|
|
240
|
+
await fs_extra_1.default.writeFile(filePath, content);
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
for (const binding of bindings) {
|
|
244
|
+
results.push({
|
|
245
|
+
file: filePath,
|
|
246
|
+
key: binding.key,
|
|
247
|
+
success: false,
|
|
248
|
+
error: err.message,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return results;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.VaultStore = VaultStore;
|
|
257
|
+
function escapeRegex(str) {
|
|
258
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=store.js.map
|