@funny-booth/agent-core 0.1.51 → 0.1.52
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/LICENSE +39 -0
- package/dist/approval.js +1 -219
- package/dist/extraMcps.js +1 -1
- package/dist/feedback.js +1 -1
- package/dist/fillSecretHelper.js +1 -51
- package/dist/index.js +1 -1
- package/dist/knowledgeForMod.js +1 -31
- package/dist/launcher.js +1 -1
- package/dist/mcpPackages.js +1 -1
- package/dist/mod/hooks/knowledgeText.js +1 -0
- package/dist/mod/hooks/look.js +1 -0
- package/dist/mod/hooks/redact.js +1 -0
- package/dist/mod/hooks/register.js +1 -0
- package/dist/mod/hooks/vaultGate.js +1 -0
- package/dist/mod/hooks/words.js +1 -0
- package/dist/portalClient.d.ts +1 -2
- package/dist/portalClient.js +1 -117
- package/dist/prompt.js +1 -65
- package/dist/secretExec.js +1 -174
- package/dist/secretInput.js +1 -198
- package/dist/secretNames.js +1 -52
- package/dist/secretPrints.js +1 -72
- package/dist/secretSites.js +1 -53
- package/dist/secretTools.js +1 -156
- package/dist/vault.d.ts +1 -15
- package/dist/vault.js +1 -565
- package/dist/waitingHook.js +1 -101
- package/package.json +5 -5
- package/mod/hooks/knowledgeText.js +0 -13
- package/mod/hooks/look.js +0 -81
- package/mod/hooks/redact.js +0 -98
- package/mod/hooks/register.js +0 -340
- package/mod/hooks/vaultGate.js +0 -54
- package/mod/hooks/words.js +0 -125
- package/mod/tsconfig.json +0 -3
- /package/{mod → dist/mod}/.claude-plugin/plugin.json +0 -0
- /package/{mod → dist/mod}/hooks/hooks.json +0 -0
- /package/{mod → dist/mod}/package.json +0 -0
package/dist/vault.js
CHANGED
|
@@ -1,565 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// ============================================================================
|
|
3
|
-
// ローカル暗号金庫(FUNNY BOOTH 共通・要件書 §11.12.15)
|
|
4
|
-
//
|
|
5
|
-
// 同じ PC の全ツール(DevAgent / 経営エージェント / AI-AgentOS …)で1つの金庫を共有する。
|
|
6
|
-
// - 暗号鍵 : OS の鍵保管庫(macOS キーチェーン / Windows 資格情報マネージャー / Linux Secret Service)。
|
|
7
|
-
// 鍵保管庫が無い環境(WSL2・ヘッドレス Linux)では ~/.funny-booth/vault/vault.key に置き、
|
|
8
|
-
// そのことを表示する。最初に決めた保管先は store.json に記録し、以後はそこだけを使う。
|
|
9
|
-
// - 秘密 : ~/.funny-booth/vault/secrets.enc(名前→値の JSON を AES-256-CBC で暗号化。人が入れた秘密の目印も中に持つ=META_KEY)
|
|
10
|
-
// - ログイン: ~/.{toolName}/portal-token.enc(ツールごとにアカウントが違うのでツール別。鍵は共有)
|
|
11
|
-
// - 入れてよいサイト: ~/.funny-booth/vault/secret-sites.json(秘密の名前→ドメインの一覧。値ではないので暗号化しない。
|
|
12
|
-
// ブラウザへ値を見せずに入れる道具が、ここにあるサイトにだけ入れる。secretSites.ts)
|
|
13
|
-
// - 人の手が要るログイン: ~/.funny-booth/vault/secret-human-steps.json(秘密の名前→画像パズル等の種類。値ではないので暗号化しない。
|
|
14
|
-
// 次のログインの前に、AI がそこだけ人に頼むと先に伝えるため。secretTools.ts)
|
|
15
|
-
//
|
|
16
|
-
// 設計方針:
|
|
17
|
-
// - 秘密は「クライアント自身のキー」をクライアントのマシンに置く。運用者のポータル DB には載せない。
|
|
18
|
-
// - 鍵を秘密と同じ場所にファイルで置かない(他のプログラムが鍵ファイルを読んで復号できないようにする)。
|
|
19
|
-
// - 旧形式(~/.{toolName}/vault.key + secrets.enc のツール別金庫)は migrateToolVault で共有金庫へ移す。
|
|
20
|
-
// ============================================================================
|
|
21
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.HUMAN_STEPS = exports.META_KEY = exports.VaultError = void 0;
|
|
23
|
-
exports.configDir = configDir;
|
|
24
|
-
exports.ensureConfigDir = ensureConfigDir;
|
|
25
|
-
exports.vaultDir = vaultDir;
|
|
26
|
-
exports.encrypt = encrypt;
|
|
27
|
-
exports.decrypt = decrypt;
|
|
28
|
-
exports.vaultKey = vaultKey;
|
|
29
|
-
exports.resetVault = resetVault;
|
|
30
|
-
exports.readSecrets = readSecrets;
|
|
31
|
-
exports.humanSecretNames = humanSecretNames;
|
|
32
|
-
exports.setSecret = setSecret;
|
|
33
|
-
exports.deleteSecret = deleteSecret;
|
|
34
|
-
exports.secretsFile = secretsFile;
|
|
35
|
-
exports.readSecretSites = readSecretSites;
|
|
36
|
-
exports.setSecretSites = setSecretSites;
|
|
37
|
-
exports.readHumanSteps = readHumanSteps;
|
|
38
|
-
exports.setHumanStep = setHumanStep;
|
|
39
|
-
exports.fillableSecret = fillableSecret;
|
|
40
|
-
exports.listSecretNames = listSecretNames;
|
|
41
|
-
exports.readTokens = readTokens;
|
|
42
|
-
exports.saveTokens = saveTokens;
|
|
43
|
-
exports.clearTokens = clearTokens;
|
|
44
|
-
exports.mergeSecrets = mergeSecrets;
|
|
45
|
-
exports.conflictedSecretNames = conflictedSecretNames;
|
|
46
|
-
exports.migrateToolVault = migrateToolVault;
|
|
47
|
-
const crypto_1 = require("crypto");
|
|
48
|
-
const fs_1 = require("fs");
|
|
49
|
-
const os_1 = require("os");
|
|
50
|
-
const path_1 = require("path");
|
|
51
|
-
// ~/.{toolName}(小文字、独立名前空間)。ログイン情報の置き場所
|
|
52
|
-
function configDir(toolName) {
|
|
53
|
-
return (0, path_1.join)((0, os_1.homedir)(), "." + toolName.toLowerCase());
|
|
54
|
-
}
|
|
55
|
-
function ensureConfigDir(dir) {
|
|
56
|
-
if (!(0, fs_1.existsSync)(dir))
|
|
57
|
-
(0, fs_1.mkdirSync)(dir, { recursive: true, mode: 0o700 });
|
|
58
|
-
}
|
|
59
|
-
const SECRETS_FILE = "secrets.enc";
|
|
60
|
-
// 共有金庫の置き場所
|
|
61
|
-
function vaultDir() {
|
|
62
|
-
return (0, path_1.join)((0, os_1.homedir)(), ".funny-booth", "vault");
|
|
63
|
-
}
|
|
64
|
-
// ── 暗号 ────────────────────────────────────────────────────────────────────
|
|
65
|
-
function encrypt(plain, key) {
|
|
66
|
-
const iv = (0, crypto_1.randomBytes)(16);
|
|
67
|
-
const cipher = (0, crypto_1.createCipheriv)("aes-256-cbc", key, iv);
|
|
68
|
-
const enc = Buffer.concat([cipher.update(plain, "utf8"), cipher.final()]);
|
|
69
|
-
return iv.toString("hex") + ":" + enc.toString("hex");
|
|
70
|
-
}
|
|
71
|
-
function decrypt(payload, key) {
|
|
72
|
-
try {
|
|
73
|
-
const [ivHex, dataHex] = payload.split(":");
|
|
74
|
-
if (!ivHex || !dataHex)
|
|
75
|
-
return null;
|
|
76
|
-
const decipher = (0, crypto_1.createDecipheriv)("aes-256-cbc", key, Buffer.from(ivHex, "hex"));
|
|
77
|
-
const dec = Buffer.concat([decipher.update(Buffer.from(dataHex, "hex")), decipher.final()]);
|
|
78
|
-
return dec.toString("utf8");
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
// ── 失敗の伝え方 ─────────────────────────────────────────────────────────────
|
|
85
|
-
// 金庫を使えないときのエラー。原因と復旧の方法を必ず添える(黙って空や新しい鍵で続けない)
|
|
86
|
-
class VaultError extends Error {
|
|
87
|
-
}
|
|
88
|
-
exports.VaultError = VaultError;
|
|
89
|
-
const RESET_HINT = "金庫を退避して作り直すには `<ツールのコマンド> secret reset`(例: devagent secret reset)を実行してください。" +
|
|
90
|
-
"保存していた秘密は失われ、ログインし直しになります(退避したファイルは残ります)。";
|
|
91
|
-
// ── 書き込み(途中で切れたファイルを残さない)────────────────────────────────
|
|
92
|
-
function atomicWrite(file, data) {
|
|
93
|
-
const tmp = `${file}.${process.pid}.${(0, crypto_1.randomBytes)(4).toString("hex")}.tmp`;
|
|
94
|
-
const fd = (0, fs_1.openSync)(tmp, "w", 0o600);
|
|
95
|
-
try {
|
|
96
|
-
(0, fs_1.writeSync)(fd, data);
|
|
97
|
-
(0, fs_1.fsyncSync)(fd);
|
|
98
|
-
}
|
|
99
|
-
finally {
|
|
100
|
-
(0, fs_1.closeSync)(fd);
|
|
101
|
-
}
|
|
102
|
-
(0, fs_1.renameSync)(tmp, file);
|
|
103
|
-
try {
|
|
104
|
-
(0, fs_1.chmodSync)(file, 0o600);
|
|
105
|
-
}
|
|
106
|
-
catch { /* Windows では効かない */ }
|
|
107
|
-
}
|
|
108
|
-
// ── 排他(複数ツールの同時起動で鍵の二重作成・金庫の書き込み競合を防ぐ)──────────
|
|
109
|
-
function sleepMs(ms) {
|
|
110
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
111
|
-
}
|
|
112
|
-
function pidAlive(pid) {
|
|
113
|
-
try {
|
|
114
|
-
process.kill(pid, 0);
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
catch (e) {
|
|
118
|
-
return e.code === "EPERM";
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// ロックには持ち主(pid と乱数)を書く。持ち主が終了しているときだけ奪い、解放は自分のものだけ
|
|
122
|
-
function withVaultLock(fn) {
|
|
123
|
-
(0, fs_1.mkdirSync)(vaultDir(), { recursive: true, mode: 0o700 });
|
|
124
|
-
const lock = (0, path_1.join)(vaultDir(), ".lock");
|
|
125
|
-
const mine = `${process.pid} ${(0, crypto_1.randomBytes)(8).toString("hex")}`;
|
|
126
|
-
const start = Date.now();
|
|
127
|
-
for (;;) {
|
|
128
|
-
try {
|
|
129
|
-
const fd = (0, fs_1.openSync)(lock, "wx", 0o600);
|
|
130
|
-
try {
|
|
131
|
-
(0, fs_1.writeSync)(fd, mine);
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
(0, fs_1.closeSync)(fd);
|
|
135
|
-
}
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
let holder = "";
|
|
140
|
-
try {
|
|
141
|
-
holder = (0, fs_1.readFileSync)(lock, "utf-8");
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
continue;
|
|
145
|
-
} // 消えた→再試行
|
|
146
|
-
const pid = Number(holder.split(" ")[0]);
|
|
147
|
-
if (holder && Number.isInteger(pid) && pid > 0 && !pidAlive(pid)) {
|
|
148
|
-
// 持ち主が終了している。読んだ内容のままなら消す(他者が取り直していたら消さない)
|
|
149
|
-
try {
|
|
150
|
-
if ((0, fs_1.readFileSync)(lock, "utf-8") === holder)
|
|
151
|
-
(0, fs_1.unlinkSync)(lock);
|
|
152
|
-
}
|
|
153
|
-
catch { /* 消えた */ }
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
if (Date.now() - start > 30_000) {
|
|
157
|
-
throw new VaultError(`金庫を使っている別のプロセスが終わりません(${lock}、pid ${pid || "?"})。しばらく待ってからやり直してください`);
|
|
158
|
-
}
|
|
159
|
-
sleepMs(50);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
try {
|
|
163
|
-
return fn();
|
|
164
|
-
}
|
|
165
|
-
finally {
|
|
166
|
-
try {
|
|
167
|
-
if ((0, fs_1.readFileSync)(lock, "utf-8") === mine)
|
|
168
|
-
(0, fs_1.unlinkSync)(lock);
|
|
169
|
-
}
|
|
170
|
-
catch { /* noop */ }
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// ── 鍵 ─────────────────────────────────────────────────────────────────────
|
|
174
|
-
const KEYCHAIN_SERVICE = "funny-booth";
|
|
175
|
-
const KEYCHAIN_ACCOUNT = "vault-key";
|
|
176
|
-
// 最初に鍵を作ったときの保管先を記録し、以後はそこだけを使う
|
|
177
|
-
// (鍵保管庫が一時的に使えないときに鍵ファイルへ切り替えて別の鍵を作る=金庫が読めなくなる事故を防ぐ)
|
|
178
|
-
const STORE_FILE = "store.json";
|
|
179
|
-
function recordedStore() {
|
|
180
|
-
const f = (0, path_1.join)(vaultDir(), STORE_FILE);
|
|
181
|
-
if (!(0, fs_1.existsSync)(f))
|
|
182
|
-
return null;
|
|
183
|
-
const kind = JSON.parse((0, fs_1.readFileSync)(f, "utf-8")).store;
|
|
184
|
-
if (kind !== "keychain" && kind !== "file")
|
|
185
|
-
throw new VaultError(`金庫の設定が壊れています(${f})。${RESET_HINT}`);
|
|
186
|
-
return kind;
|
|
187
|
-
}
|
|
188
|
-
function fileStore() {
|
|
189
|
-
const keyFile = (0, path_1.join)(vaultDir(), "vault.key");
|
|
190
|
-
return {
|
|
191
|
-
kind: "file",
|
|
192
|
-
get: () => ((0, fs_1.existsSync)(keyFile) ? (0, fs_1.readFileSync)(keyFile, "utf-8").trim() : null),
|
|
193
|
-
set: (hex) => atomicWrite(keyFile, hex),
|
|
194
|
-
remove: () => { if ((0, fs_1.existsSync)(keyFile))
|
|
195
|
-
(0, fs_1.unlinkSync)(keyFile); },
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
// 鍵保管庫のネイティブモジュールは、この部品を読み込んだ時点で1度だけ読んでおく。
|
|
199
|
-
// 使う瞬間に読むと、セッション中にツールが自動更新されてファイルが入れ替わったあと「Cannot find module」に
|
|
200
|
-
// なる(受付箱 20d07728)。読めない環境では理由を覚えておき、鍵ファイル方式にたどり着けるようにする
|
|
201
|
-
let keyring = null;
|
|
202
|
-
let keyringError = null;
|
|
203
|
-
try {
|
|
204
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
205
|
-
keyring = require("@napi-rs/keyring");
|
|
206
|
-
}
|
|
207
|
-
catch (e) {
|
|
208
|
-
keyringError = e;
|
|
209
|
-
}
|
|
210
|
-
// モジュールが見つからない=金庫が壊れたのではなく、プログラムの入れ替わり。作り直しは勧めない
|
|
211
|
-
function isModuleMissing(e) {
|
|
212
|
-
return e?.code === "MODULE_NOT_FOUND" || /Cannot find module/.test(String(e?.message));
|
|
213
|
-
}
|
|
214
|
-
const RESTART_HINT = "ツールが更新されたなどで、金庫を開く部品を読めません。**ツールを起動し直してください**(金庫の中身は消えていません。secret reset はしないでください)。";
|
|
215
|
-
// OS の鍵保管庫。Linux は Secret Service に固定する(既定の自動選択は、無いと黙って再起動で消える
|
|
216
|
-
// kernel keyutils に落ちるため)。使えなければ理由つきで例外
|
|
217
|
-
function keychainStore() {
|
|
218
|
-
if (!keyring)
|
|
219
|
-
throw keyringError ?? new Error("@napi-rs/keyring を読めません");
|
|
220
|
-
const { Entry } = keyring;
|
|
221
|
-
const entry = new Entry(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, { linux: { store: "secret-service" } });
|
|
222
|
-
entry.getPassword(); // ここで使えるかを確かめる
|
|
223
|
-
return {
|
|
224
|
-
kind: "keychain",
|
|
225
|
-
get: () => entry.getPassword() ?? null,
|
|
226
|
-
set: (hex) => entry.setPassword(hex),
|
|
227
|
-
remove: () => { entry.deletePassword(); },
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
function keyStore() {
|
|
231
|
-
if (process.env.FB_VAULT_STORE === "file")
|
|
232
|
-
return fileStore();
|
|
233
|
-
const recorded = recordedStore();
|
|
234
|
-
if (recorded === "file")
|
|
235
|
-
return fileStore();
|
|
236
|
-
if (recorded === "keychain") {
|
|
237
|
-
try {
|
|
238
|
-
return keychainStore();
|
|
239
|
-
}
|
|
240
|
-
catch (e) {
|
|
241
|
-
if (isModuleMissing(e))
|
|
242
|
-
throw new VaultError(RESTART_HINT);
|
|
243
|
-
throw new VaultError(`OS の鍵保管庫から金庫の鍵を読めません: ${e.message}。` +
|
|
244
|
-
"キーチェーンのロック解除や、アクセス許可(「常に許可」)を確認してください。" + RESET_HINT);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
// まだ鍵が無い: 鍵保管庫が使えればそこ、無ければ鍵ファイル(そのことを表示する。stdout は MCP 通信に使うので stderr)
|
|
248
|
-
try {
|
|
249
|
-
return keychainStore();
|
|
250
|
-
}
|
|
251
|
-
catch (e) {
|
|
252
|
-
process.stderr.write(`※ OS の鍵保管庫が使えないため、金庫の鍵をファイルに保存します(${(0, path_1.join)(vaultDir(), "vault.key")}): ${e.message}\n`);
|
|
253
|
-
return fileStore();
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
let cachedKey = null;
|
|
257
|
-
// 共有金庫の鍵。無ければ作る(ロックの中で作り直しを防ぐ)。金庫があるのに鍵が無いときは作らずに止める
|
|
258
|
-
function vaultKey() {
|
|
259
|
-
if (cachedKey)
|
|
260
|
-
return cachedKey;
|
|
261
|
-
const store = keyStore();
|
|
262
|
-
const existing = store.get();
|
|
263
|
-
if (existing) {
|
|
264
|
-
cachedKey = parseKey(existing);
|
|
265
|
-
// 保管先の記録が無ければ残す(以後、別の保管先で鍵を作り直さないため)
|
|
266
|
-
if (!(0, fs_1.existsSync)((0, path_1.join)(vaultDir(), STORE_FILE)))
|
|
267
|
-
atomicWrite((0, path_1.join)(vaultDir(), STORE_FILE), JSON.stringify({ store: store.kind }));
|
|
268
|
-
return cachedKey;
|
|
269
|
-
}
|
|
270
|
-
return withVaultLock(() => {
|
|
271
|
-
const again = store.get(); // ロック待ちの間に他のプロセスが作ったかもしれない
|
|
272
|
-
if (again)
|
|
273
|
-
return (cachedKey = parseKey(again));
|
|
274
|
-
if ((0, fs_1.existsSync)((0, path_1.join)(vaultDir(), SECRETS_FILE))) {
|
|
275
|
-
throw new VaultError(`金庫はあるのに、その鍵が見つかりません(保管先: ${store.kind})。${RESET_HINT}`);
|
|
276
|
-
}
|
|
277
|
-
const hex = (0, crypto_1.randomBytes)(32).toString("hex");
|
|
278
|
-
store.set(hex);
|
|
279
|
-
if (store.get() !== hex)
|
|
280
|
-
throw new VaultError("金庫の鍵を保存できませんでした(書いた鍵を読み戻せません)");
|
|
281
|
-
atomicWrite((0, path_1.join)(vaultDir(), STORE_FILE), JSON.stringify({ store: store.kind }));
|
|
282
|
-
return (cachedKey = Buffer.from(hex, "hex"));
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
function parseKey(hex) {
|
|
286
|
-
const key = Buffer.from(hex, "hex");
|
|
287
|
-
if (key.length !== 32)
|
|
288
|
-
throw new VaultError(`金庫の鍵が壊れています(32 バイトではありません)。${RESET_HINT}`);
|
|
289
|
-
return key;
|
|
290
|
-
}
|
|
291
|
-
// 金庫を退避して作り直す(ユーザーが明示的に実行する復旧手段)。退避したファイルは消さない
|
|
292
|
-
function resetVault() {
|
|
293
|
-
(0, fs_1.mkdirSync)(vaultDir(), { recursive: true, mode: 0o700 });
|
|
294
|
-
return withVaultLock(() => {
|
|
295
|
-
const moved = [];
|
|
296
|
-
const stamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
297
|
-
for (const f of [SECRETS_FILE, STORE_FILE, "vault.key"]) {
|
|
298
|
-
const p = (0, path_1.join)(vaultDir(), f);
|
|
299
|
-
if ((0, fs_1.existsSync)(p)) {
|
|
300
|
-
(0, fs_1.renameSync)(p, `${p}.broken-${stamp}`);
|
|
301
|
-
moved.push(`${p}.broken-${stamp}`);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
try {
|
|
305
|
-
keychainStore().remove();
|
|
306
|
-
}
|
|
307
|
-
catch { /* 鍵保管庫が無い・鍵が無い */ }
|
|
308
|
-
cachedKey = null;
|
|
309
|
-
return moved;
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
// ── 秘密(全ツール共有)────────────────────────────────────────────────────
|
|
313
|
-
//
|
|
314
|
-
// 復号した中身は「名前→値」の JSON。人が入れた秘密(ask_secret の画面・CLI の secret set・VS Code の「パスワードを保存」)の
|
|
315
|
-
// 目印は、同じ JSON の中の META_KEY に入れる(暗号化の内側なので、AI がファイルを書き換えて目印を外せない)。
|
|
316
|
-
// 形を変えずに1つの項目を足すだけにしたのは、同じ金庫を古い版の agent-core(別のツール)が読み書きしても壊れないため
|
|
317
|
-
// (古い版には META_KEY が名前の1つに見えるだけで、書き込むときもそのまま残る)。
|
|
318
|
-
// 目印の無い秘密(今までに入れたもの・AI が store_secret で入れたもの)は今までどおり。
|
|
319
|
-
/** 人が入れた秘密の目印を入れておく項目。名前の検査(secretNameError)で使えない形にしてあり、秘密の名前とぶつからない。 */
|
|
320
|
-
exports.META_KEY = "funny-booth:meta";
|
|
321
|
-
function parseVault(obj) {
|
|
322
|
-
const { [exports.META_KEY]: metaText, ...secrets } = obj;
|
|
323
|
-
let human = [];
|
|
324
|
-
if (typeof metaText === "string") {
|
|
325
|
-
const meta = JSON.parse(metaText);
|
|
326
|
-
if (Array.isArray(meta.human))
|
|
327
|
-
human = meta.human.filter((n) => typeof n === "string" && n in secrets);
|
|
328
|
-
}
|
|
329
|
-
return { secrets, human: new Set(human) };
|
|
330
|
-
}
|
|
331
|
-
function readVaultFile(file, key) {
|
|
332
|
-
if (!(0, fs_1.existsSync)(file))
|
|
333
|
-
return { secrets: {}, human: new Set() };
|
|
334
|
-
const plain = decrypt((0, fs_1.readFileSync)(file, "utf-8").trim(), key);
|
|
335
|
-
// 復号できない金庫を空として扱うと、次の書き込みで中身を消してしまう。黙らずに止める
|
|
336
|
-
if (plain === null)
|
|
337
|
-
throw new VaultError(`金庫を復号できません(${file})。鍵が変わった可能性があります。${RESET_HINT}`);
|
|
338
|
-
const obj = JSON.parse(plain);
|
|
339
|
-
return parseVault(obj && typeof obj === "object" ? obj : {});
|
|
340
|
-
}
|
|
341
|
-
function readVault() {
|
|
342
|
-
return readVaultFile((0, path_1.join)(vaultDir(), SECRETS_FILE), vaultKey());
|
|
343
|
-
}
|
|
344
|
-
function writeVault(v) {
|
|
345
|
-
(0, fs_1.mkdirSync)(vaultDir(), { recursive: true, mode: 0o700 });
|
|
346
|
-
const human = [...v.human].filter((n) => n in v.secrets);
|
|
347
|
-
const obj = human.length ? { ...v.secrets, [exports.META_KEY]: JSON.stringify({ human }) } : v.secrets;
|
|
348
|
-
atomicWrite((0, path_1.join)(vaultDir(), SECRETS_FILE), encrypt(JSON.stringify(obj), vaultKey()));
|
|
349
|
-
}
|
|
350
|
-
// 金庫全体を復号して名前→値のマップで返す(無ければ空。目印の項目は含めない)
|
|
351
|
-
function readSecrets() {
|
|
352
|
-
return readVault().secrets;
|
|
353
|
-
}
|
|
354
|
-
/** 人が入れた秘密の名前(get_secret が値を返さないもの)。 */
|
|
355
|
-
function humanSecretNames() {
|
|
356
|
-
return readVault().human;
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* 秘密を入れる。origin が human なら人が入れた目印を付け、model なら外す(AI が値を知っている)。
|
|
360
|
-
* 鍵の作成も同じロックを使うため、ロックを取る前に鍵を用意しておく(ロックは再入できない)
|
|
361
|
-
*/
|
|
362
|
-
function setSecret(name, value, origin = "model") {
|
|
363
|
-
vaultKey();
|
|
364
|
-
withVaultLock(() => {
|
|
365
|
-
const v = readVault();
|
|
366
|
-
v.secrets[name] = value;
|
|
367
|
-
if (origin === "human")
|
|
368
|
-
v.human.add(name);
|
|
369
|
-
else
|
|
370
|
-
v.human.delete(name);
|
|
371
|
-
writeVault(v);
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
function deleteSecret(name) {
|
|
375
|
-
vaultKey();
|
|
376
|
-
return withVaultLock(() => {
|
|
377
|
-
const v = readVault();
|
|
378
|
-
if (!Object.prototype.hasOwnProperty.call(v.secrets, name))
|
|
379
|
-
return false;
|
|
380
|
-
delete v.secrets[name];
|
|
381
|
-
v.human.delete(name);
|
|
382
|
-
writeVault(v);
|
|
383
|
-
writeSites(name, null); // 入れてよいサイトも一緒に消す
|
|
384
|
-
writeHumanStep(name, null);
|
|
385
|
-
return true;
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
/** 金庫のファイルの場所(Mod が「書き換わったか」を確かめるため。secretPrints.ts)。 */
|
|
389
|
-
function secretsFile() {
|
|
390
|
-
return (0, path_1.join)(vaultDir(), SECRETS_FILE);
|
|
391
|
-
}
|
|
392
|
-
// ── 入れてよいサイト(秘密の名前 → ドメインの一覧)────────────────────────────
|
|
393
|
-
const SITES_FILE = "secret-sites.json";
|
|
394
|
-
function readSecretSites() {
|
|
395
|
-
const file = (0, path_1.join)(vaultDir(), SITES_FILE);
|
|
396
|
-
if (!(0, fs_1.existsSync)(file))
|
|
397
|
-
return {};
|
|
398
|
-
const obj = JSON.parse((0, fs_1.readFileSync)(file, "utf-8"));
|
|
399
|
-
return obj && typeof obj === "object" ? obj : {};
|
|
400
|
-
}
|
|
401
|
-
function writeSites(name, sites) {
|
|
402
|
-
const all = readSecretSites();
|
|
403
|
-
if (sites && sites.length)
|
|
404
|
-
all[name] = sites;
|
|
405
|
-
else if (name in all)
|
|
406
|
-
delete all[name];
|
|
407
|
-
else
|
|
408
|
-
return;
|
|
409
|
-
(0, fs_1.mkdirSync)(vaultDir(), { recursive: true, mode: 0o700 });
|
|
410
|
-
atomicWrite((0, path_1.join)(vaultDir(), SITES_FILE), JSON.stringify(all, null, 2));
|
|
411
|
-
}
|
|
412
|
-
/** 入れてよいサイトを決め直す(空の配列なら外す)。サイトはドメイン名にそろえたもの(secretSites.normalizeSite)を渡す。 */
|
|
413
|
-
function setSecretSites(name, sites) {
|
|
414
|
-
vaultKey();
|
|
415
|
-
withVaultLock(() => writeSites(name, sites));
|
|
416
|
-
}
|
|
417
|
-
// ── 人の手が要るログイン(秘密の名前 → 種類)──────────────────────────────────
|
|
418
|
-
// 種類は決まった3つだけにする(ページに書かれた文を AI が写して、次の AI に読ませる通り道にしないため)。
|
|
419
|
-
exports.HUMAN_STEPS = { captcha: "画像パズル(CAPTCHA)", sms: "SMS の確認コード", other: "その他の人の操作" };
|
|
420
|
-
const HUMAN_STEPS_FILE = "secret-human-steps.json";
|
|
421
|
-
function readHumanSteps() {
|
|
422
|
-
const file = (0, path_1.join)(vaultDir(), HUMAN_STEPS_FILE);
|
|
423
|
-
if (!(0, fs_1.existsSync)(file))
|
|
424
|
-
return {};
|
|
425
|
-
const obj = JSON.parse((0, fs_1.readFileSync)(file, "utf-8"));
|
|
426
|
-
const out = {};
|
|
427
|
-
for (const [name, step] of Object.entries(obj && typeof obj === "object" ? obj : {})) {
|
|
428
|
-
if (typeof step === "string" && Object.prototype.hasOwnProperty.call(exports.HUMAN_STEPS, step))
|
|
429
|
-
out[name] = step;
|
|
430
|
-
}
|
|
431
|
-
return out;
|
|
432
|
-
}
|
|
433
|
-
function writeHumanStep(name, step) {
|
|
434
|
-
const all = readHumanSteps();
|
|
435
|
-
if (step)
|
|
436
|
-
all[name] = step;
|
|
437
|
-
else if (name in all)
|
|
438
|
-
delete all[name];
|
|
439
|
-
else
|
|
440
|
-
return;
|
|
441
|
-
(0, fs_1.mkdirSync)(vaultDir(), { recursive: true, mode: 0o700 });
|
|
442
|
-
atomicWrite((0, path_1.join)(vaultDir(), HUMAN_STEPS_FILE), JSON.stringify(all, null, 2));
|
|
443
|
-
}
|
|
444
|
-
/** ログインに人の手が要る目印を付ける(null で外す)。 */
|
|
445
|
-
function setHumanStep(name, step) {
|
|
446
|
-
vaultKey();
|
|
447
|
-
withVaultLock(() => writeHumanStep(name, step));
|
|
448
|
-
}
|
|
449
|
-
function fillableSecret(name) {
|
|
450
|
-
const secrets = readSecrets();
|
|
451
|
-
if (!Object.prototype.hasOwnProperty.call(secrets, name))
|
|
452
|
-
return { status: "missing" };
|
|
453
|
-
const sites = readSecretSites()[name] ?? [];
|
|
454
|
-
if (!sites.length)
|
|
455
|
-
return { status: "no_sites" };
|
|
456
|
-
// 人の手が要るなら、その種類の文を添える(browser_fill_secret が結果に出し、AI が先に人に伝える)
|
|
457
|
-
const step = readHumanSteps()[name];
|
|
458
|
-
return { status: "ok", value: secrets[name], sites, ...(step && { humanStep: exports.HUMAN_STEPS[step] }) };
|
|
459
|
-
}
|
|
460
|
-
// 値は返さず名前だけ列挙する(露出を避ける)
|
|
461
|
-
function listSecretNames() {
|
|
462
|
-
return Object.keys(readSecrets());
|
|
463
|
-
}
|
|
464
|
-
const TOKEN_FILE = "portal-token.enc";
|
|
465
|
-
/**
|
|
466
|
-
* ログインの保存先の名前。FB_PROFILE(英小文字・数字・-)があれば別の名前にする(portal-token.<profile>.enc)。
|
|
467
|
-
* 受入試験(mcp-server/scripts/acceptance.mjs)が開発用のポータルにログインしても、本番のログインを上書きしないため。
|
|
468
|
-
*/
|
|
469
|
-
function tokenFile() {
|
|
470
|
-
const profile = process.env.FB_PROFILE;
|
|
471
|
-
if (!profile)
|
|
472
|
-
return TOKEN_FILE;
|
|
473
|
-
if (!/^[a-z0-9-]{1,32}$/.test(profile))
|
|
474
|
-
throw new VaultError(`FB_PROFILE は英小文字・数字・- で書いてください(今: ${JSON.stringify(profile)})`);
|
|
475
|
-
return `portal-token.${profile}.enc`;
|
|
476
|
-
}
|
|
477
|
-
function parseTokens(plain) {
|
|
478
|
-
// 旧形式(生 JWT 保存)との後方互換
|
|
479
|
-
if (plain.startsWith("{")) {
|
|
480
|
-
const obj = JSON.parse(plain);
|
|
481
|
-
return { jwt: obj.jwt, refresh: obj.refresh ?? null };
|
|
482
|
-
}
|
|
483
|
-
return { jwt: plain, refresh: null };
|
|
484
|
-
}
|
|
485
|
-
// 保存済みログインを読む。無い・復号できない(鍵が変わった等)なら null=再ログインさせる
|
|
486
|
-
function readTokens(toolName) {
|
|
487
|
-
const file = (0, path_1.join)(configDir(toolName), tokenFile());
|
|
488
|
-
if (!(0, fs_1.existsSync)(file))
|
|
489
|
-
return null;
|
|
490
|
-
const plain = decrypt((0, fs_1.readFileSync)(file, "utf-8").trim(), vaultKey());
|
|
491
|
-
return plain ? parseTokens(plain) : null;
|
|
492
|
-
}
|
|
493
|
-
function saveTokens(toolName, tokens) {
|
|
494
|
-
const dir = configDir(toolName);
|
|
495
|
-
ensureConfigDir(dir);
|
|
496
|
-
atomicWrite((0, path_1.join)(dir, tokenFile()), encrypt(JSON.stringify({ jwt: tokens.jwt, refresh: tokens.refresh }), vaultKey()));
|
|
497
|
-
}
|
|
498
|
-
function clearTokens(toolName) {
|
|
499
|
-
const file = (0, path_1.join)(configDir(toolName), tokenFile());
|
|
500
|
-
if ((0, fs_1.existsSync)(file))
|
|
501
|
-
(0, fs_1.unlinkSync)(file);
|
|
502
|
-
}
|
|
503
|
-
// ── 旧形式からの移行 ─────────────────────────────────────────────────────────
|
|
504
|
-
// 同名で値が違う秘密は上書きせず、「名前@ツール名」で両方残す(どちらが正しいかは人が決める)
|
|
505
|
-
function mergeSecrets(shared, incoming, toolName) {
|
|
506
|
-
const merged = { ...shared };
|
|
507
|
-
const conflicts = [];
|
|
508
|
-
for (const [name, value] of Object.entries(incoming)) {
|
|
509
|
-
if (!(name in merged) || merged[name] === value) {
|
|
510
|
-
merged[name] = value;
|
|
511
|
-
continue;
|
|
512
|
-
}
|
|
513
|
-
// 退避名が既にあって値が違うなら連番にする(前回退避した値を上書きしない)
|
|
514
|
-
let alt = `${name}@${toolName}`;
|
|
515
|
-
for (let i = 2; alt in merged && merged[alt] !== value; i++)
|
|
516
|
-
alt = `${name}@${toolName}#${i}`;
|
|
517
|
-
merged[alt] = value;
|
|
518
|
-
conflicts.push(name);
|
|
519
|
-
}
|
|
520
|
-
return { merged, conflicts };
|
|
521
|
-
}
|
|
522
|
-
// mergeSecrets が退避した秘密(「名前@ツール名」「名前@ツール名#連番」)のうち、元の名前も残っているものの元の名前。
|
|
523
|
-
// 名前そのものに @ が入っているだけ(メールアドレス等)のものは数えない
|
|
524
|
-
function conflictedSecretNames(names) {
|
|
525
|
-
const all = new Set(names);
|
|
526
|
-
const bases = names.map((n) => n.slice(0, Math.max(n.lastIndexOf("@"), 0))).filter((b) => b && all.has(b));
|
|
527
|
-
return [...new Set(bases)];
|
|
528
|
-
}
|
|
529
|
-
// ~/.{toolName}/vault.key があれば、そのツールの秘密を共有金庫へ移し、ログインを共有鍵で暗号化し直し、
|
|
530
|
-
// 読み戻して一致を確かめてから旧い鍵と旧い金庫を消す。何も無ければ何もしない。
|
|
531
|
-
function migrateToolVault(toolName) {
|
|
532
|
-
const dir = configDir(toolName);
|
|
533
|
-
const oldKeyFile = (0, path_1.join)(dir, "vault.key");
|
|
534
|
-
if (!(0, fs_1.existsSync)(oldKeyFile))
|
|
535
|
-
return { migrated: false, conflicts: [] };
|
|
536
|
-
vaultKey();
|
|
537
|
-
return withVaultLock(() => {
|
|
538
|
-
if (!(0, fs_1.existsSync)(oldKeyFile))
|
|
539
|
-
return { migrated: false, conflicts: [] }; // 別プロセスが先に移した
|
|
540
|
-
const oldKey = parseKey((0, fs_1.readFileSync)(oldKeyFile, "utf-8").trim());
|
|
541
|
-
const oldSecretsFile = (0, path_1.join)(dir, SECRETS_FILE);
|
|
542
|
-
const oldSecrets = readVaultFile(oldSecretsFile, oldKey).secrets;
|
|
543
|
-
const tokenFile = (0, path_1.join)(dir, TOKEN_FILE);
|
|
544
|
-
const oldTokenPlain = (0, fs_1.existsSync)(tokenFile) ? decrypt((0, fs_1.readFileSync)(tokenFile, "utf-8").trim(), oldKey) : null;
|
|
545
|
-
const current = readVault();
|
|
546
|
-
const { merged, conflicts } = mergeSecrets(current.secrets, oldSecrets, toolName);
|
|
547
|
-
writeVault({ secrets: merged, human: current.human });
|
|
548
|
-
if (oldTokenPlain)
|
|
549
|
-
saveTokens(toolName, parseTokens(oldTokenPlain));
|
|
550
|
-
// 読み戻して一致を確かめてから旧いものを消す(確かめられなければ旧いものは残す)
|
|
551
|
-
const after = readSecrets();
|
|
552
|
-
for (const [name, value] of Object.entries(merged)) {
|
|
553
|
-
if (after[name] !== value)
|
|
554
|
-
throw new Error(`金庫の移行を確かめられませんでした(${name})。旧い金庫は残しています`);
|
|
555
|
-
}
|
|
556
|
-
if (oldTokenPlain && JSON.stringify(readTokens(toolName)) !== JSON.stringify(parseTokens(oldTokenPlain))) {
|
|
557
|
-
throw new Error("ログイン情報の移行を確かめられませんでした。旧い金庫は残しています");
|
|
558
|
-
}
|
|
559
|
-
if ((0, fs_1.existsSync)(oldSecretsFile))
|
|
560
|
-
(0, fs_1.unlinkSync)(oldSecretsFile);
|
|
561
|
-
(0, fs_1.unlinkSync)(oldKeyFile);
|
|
562
|
-
return { migrated: true, conflicts };
|
|
563
|
-
});
|
|
564
|
-
}
|
|
565
|
-
//# sourceMappingURL=vault.js.map
|
|
1
|
+
'use strict';const _0x1431eb=_0x21cd;function _0x26e0(){const _0x439a13=['CgfYC2u','A2LSBa','DfnNrw8','zxHPC3rZu3LUyW','t1mG44gU6y215l+D566H5BQR44gl44kj6yEr5BQR44gU6y2144ks6kQT44kb44g+44gB44ktoIa','C2vJCMv0lwH1BwfUlxn0zxbZlMPZB24','DMf1BhrlzxK','CMvZzxrwyxvSDa','6yEr5BQR44ks5l2/44gJ44gM44ge44kl5yIL44gU44ox44oT44k744k544gm57wc44kp44kk44g+44gB44kt77Yi','44oT44kW44kK44oZ5Oof5AcX44gU56E76kgm44ks56k644gl44kb44kj44km44g+44gB44kt44gN44gx44gF44cc5PEN44ge6yEr5BQR44gV5Q6l44gx44gM44ge44g+44gz','zw50CMLLCW','q0Xeyvy','A2v5CW','ufLjtKm','Dg9tDhjPBMC','CMvHzfnLy3jLDfnPDgvZ','A2v5y2HHAw4','AhvTyw4','44gD44gU5lUw44gU5lQ644gU5Pon5l2C','wwzeuMi','y29Kzq','mJvsrfPswvm','CMvHzfrVA2vUCW','6yEr5BQR44gU6y2144ks5l+D5A2y44gN44gn44g+44gB44kt44gN44gx44gF77Yi5PU444ge44gF6y2144ks6kQT44g/5OI744gB44g+44gB44kt77Yj','C2vJCMv0lxnLCNzPy2u','y29Uy2f0','C2v0u2vJCMv0u2L0zxm','zgvJCNLWDa','zNjVBq','C3rKzxjY','x19LC01VzhvSzq','Dg9mB3DLCKnHC2u','mtmYnJC0uvjYwurW','BMndA2i','z3buC0i','zMLSDgvY','zMLUywW','Cg9YDgfSlxrVA2vUlMvUyW','A1vjvLq','C3bSAxq','otCWntiYm1nQveXgwa','77Yj44cc5PEN44ge6yEr5BQR44gV5Q6l44gx44gM44ge44g+44gz','77Yj44cc44gx44gW44kj44gp5B6f44gJ44gM44gl44kj44ke44kk55U044gx44gM44gp44gG44gv44ge','vhrTDNi','sezdqK4','DgvZDa','CMvUyw1Lu3LUyW','AuzrAuC','zgvSzxrLu2vJCMv0','q3LbsM8','CvPLAMy','zNvUBNKTyM9VDgG6Bwv0yq','zMfLBMS','BM93','BhPwsg0','44cbCgLKia','mtaZnMHnCLjLAW','ug1izxK','rKjFufjprKLmrsdJGA/OI7hLSi/MLOFLRzFJG7VMLBdLRzFJG7STioobP+ABUoobHoobPUobJ+obOoobLEobHo+8Ios7IJOG','lMvUyW','qg5HCgKTCNmVA2v5CMLUzYdJGPlOQQ3JGOhJGB7JGzVJGPm','D01iD3O','A1vRBNq','D3jPDgu','t2vrrvi','BM9FC2L0zxm','AhvTyw5tzwnYzxroyw1LCW','C3rVCMu','C3rYAw5N','mJaXmJaYmejzBuXezG','B2jQzwn0','DxrMoa','BwvZC2fNzq','CfvzwLu','q0fusu0','AgfZt3DUuhjVCgvYDhK','sxrRu1y','C3rYAw5NAwz5','4Oc7ie9tioobRUMnTEs/NEEUOEw6Q+obJos9V+obIoobQUobHoobN+ocGEoaGEMhKEw6Q+obRUMnTEocKUodLEocOEocPoodQ+obQ+s/NEwTMoobL+obVUobME+8Ia','y3jLyxrLrgvJAxbOzxjPDG','44kT44o844ob44kN44o844oZ44gU44oT44od44kV6kEJ6zMK44ke44cb44kI44kV44k744k56kIX5y+V77Yi44cm5BI444gR6kIX5y+V44cn77Yj44ks56k66kQn44gx44gM44gp44gG44gv44ge44cc','mte0mJm1nfv3u3vxra','wu1jrve','vhPoEuu','C2v0ugfZC3DVCMq','DMf1BhreAxi','Ag9TzwrPCG','zNn5BMntEw5J','C2vJCMv0lxnPDgvZlMPZB24','vgvkC3e','C2vJCMv0C0zPBgu','CMvMCMvZAa','tu1cAK8','BgvUz3rO','sKrjrKy','lMXVy2S','tuvuqv9lrvK','y2HTB2rtEw5J','6yEr5BQR44gU6kIT5A6A44gm5Aok44km44gM44ge44g+44gz77Yi','CMvWBgfJzq','wejnwKu','zwnzCxK','DxrMltG','s2nLEum','wLjcCM0','y29UzMLNrgLY','z2XZzgu','yuTtrum','DhjPBq','C2v0u2vJCMv0','rMn2rxu','BwzWswO','DMf1BhqTA2v5','zgvSzxrL','BwfW','ChvZAa','BgfZDeLUzgv4t2y','EK5nEKW','Cg9YDgfSlxrVA2vUlG','tLf6sKG','mtjpDK1Mswi','C2vJCMv0CW','Bw9KzwW','y2XVC2vtEw5J','yvnZDwu','CMvHzfnLy3jLDhm','y2fSBa','ntq3ode4zwzHALbj','DNHOBLe','ChjVDg90ExbL','vMf1BhrfCNjVCG','Dxf4v3i','B3bLBLn5BMm','zMLSzq','u3P1CKq','t2Pjy3e','odaXnZzXtLbOCwS','6yEr5BQR44gU6y2144gm5Aok44km44gM44ge44g+44gz77YimZiG44oq44kK44oi44gN44gV44gc44kk44g+44gB44kt77Yj44cc','nJq2nZKXmfHetxjbAG','rKPhuK0','D2fPDa','AM9PBG','AgfZ','v0TeEKK','AxzMv0q','AND0','CMvHzezPBgvtEw5J','tgnMyve','C1vXuvy','u3nkwKu','ywrK','m29dvLLhuG','zgvMAw5LuhjVCgvYDhK','CgLK','Dg9ju09tDhjPBMC','C2XPy2u','AxnjBNrLz2vY','tu9evuXfx05pvf9gt1vora','BMDMwLu','AfPuz0C','rwL1wNK','DxbKyxrL','Dw5SAw5Ru3LUyW','z0T4qu4','44oe44o844oR44gm5PU05PAW44gv44km44gF44gQ44gP44gN44cb6yEr5BQR44ks6zAl44gp6yoO5zob44ks6kQT44kb44g+44gB44kt44cckIRJG4tJG7ZJG6VJGPlOTBFLI5xJGzFNM7tJGzFJGABJGy/JGAdJGzxJGyqQkU+8IoMhKEw6Q+obRUs4REI6Q+obR+A2IoobIoobPUobHoobVUobM+ocK+oaGNnLy3jLDcbYzxnLDcdJGA/JGzFJGARJGytJGAFJGy/JGAdJGzxJGytVViNJGii','DMf1BhqUA2v5','BwvYz2vtzwnYzxrZ','zNvUBNKTyM9VDgG','lMjYB2TLBI0','CM5zzxa','qxPzDMK','BwTKAxjtEw5J','BwLZC2LUzW','BwLNCMf0zvrVB2XwyxvSDa','yxD4veW','CMfUzg9TqNL0zxm','sfvnqu5Fu1rfufm','ANrHtwq','6yEr5BQR44ks5B6P5y+344gN44gn44g+44gB44kt77Yi','CMvTB3zL','owHwAe9OBq','z2v0ugfZC3DVCMq','zMLSBgfIBgvtzwnYzxq','v2TNANm','qLb4Ce8','5l+D5A2y44gx44gM44ge44gF56Ey5A+g44gV5AsX44kp44km44cb44oT44kW44kK44oZ44gx55U044gx44gR44gQ44kk44g+44gz77Yi6yca6yg/44gx44gF44ov44kH44kK44oR44gV5Q6l44kk44g+44gz77Yj44cc','rvbfuK0','Agv4','A2LUza','D3jPDgvtEw5J','C2v0','Chzoteq','ywvZlti1nI1JyMm','C0ntAhq','AxnbCNjHEq'];_0x26e0=function(){return _0x439a13;};return _0x26e0();}(function(_0x27ee6f,_0x2d86b4){const _0x206b6e=_0x21cd,_0x4b7c47=_0x27ee6f();while(!![]){try{const _0x1b9b60=parseInt(_0x206b6e(0x24c))/0x1+parseInt(_0x206b6e(0x21b))/0x2*(parseInt(_0x206b6e(0x1cf))/0x3)+parseInt(_0x206b6e(0x240))/0x4+parseInt(_0x206b6e(0x210))/0x5*(parseInt(_0x206b6e(0x1b7))/0x6)+-parseInt(_0x206b6e(0x233))/0x7*(parseInt(_0x206b6e(0x1c0))/0x8)+parseInt(_0x206b6e(0x1ec))/0x9*(-parseInt(_0x206b6e(0x1c2))/0xa)+-parseInt(_0x206b6e(0x223))/0xb*(-parseInt(_0x206b6e(0x1b0))/0xc);if(_0x1b9b60===_0x2d86b4)break;else _0x4b7c47['push'](_0x4b7c47['shift']());}catch(_0x15c3c3){_0x4b7c47['push'](_0x4b7c47['shift']());}}}(_0x26e0,0xe0b89));Object[_0x1431eb(0x1d0)](exports,_0x1431eb(0x219),{'value':!![]}),exports[_0x1431eb(0x1e8)]=exports[_0x1431eb(0x25b)]=exports[_0x1431eb(0x1ba)]=void 0x0,exports[_0x1431eb(0x1a1)]=_0x570e3a,exports['ensureConfigDir']=_0x5c8789,exports[_0x1431eb(0x250)]=_0x56407e,exports['encrypt']=_0x4b76b0,exports[_0x1431eb(0x216)]=_0x5af7d0,exports[_0x1431eb(0x201)]=_0x4690a4,exports[_0x1431eb(0x202)]=_0x411e37,exports[_0x1431eb(0x1b5)]=_0x272d09,exports[_0x1431eb(0x23d)]=_0x11930b,exports[_0x1431eb(0x1a5)]=_0x243587,exports[_0x1431eb(0x22b)]=_0x3581ef,exports[_0x1431eb(0x255)]=_0x302f23,exports[_0x1431eb(0x20a)]=_0x27b5df,exports[_0x1431eb(0x215)]=_0x7efa22,exports['readHumanSteps']=_0x2ee449,exports['setHumanStep']=_0x1f791c,exports[_0x1431eb(0x1ee)]=_0x5e0f25,exports['listSecretNames']=_0x4a2dda,exports[_0x1431eb(0x211)]=_0x45a4cc,exports['saveTokens']=_0x5f358a,exports['clearTokens']=_0x32b5f7,exports[_0x1431eb(0x1de)]=_0x4ec18d,exports['conflictedSecretNames']=_0x168952,exports[_0x1431eb(0x1e5)]=_0x3e3dcc;const _0x20e62c=require('crypto'),_0x58273a=require('fs'),_0x2aae9f=require('os'),_0x8d4793=require('path');function _0x570e3a(_0x50ed6c){const _0x23a4c9=_0x1431eb;return(0x0,_0x8d4793['join'])((0x0,_0x2aae9f[_0x23a4c9(0x251)])(),'.'+_0x50ed6c[_0x23a4c9(0x21a)]());}function _0x5c8789(_0x49cff9){const _0x40ce2e=_0x1431eb;if(!(0x0,_0x58273a[_0x40ce2e(0x1fe)])(_0x49cff9))(0x0,_0x58273a[_0x40ce2e(0x1e3)])(_0x49cff9,{'recursive':!![],'mode':0x1c0});}const _0x224fe3='secrets.enc';function _0x56407e(){const _0x18bdfa={'RwLiV':'.funny-booth'};return(0x0,_0x8d4793['join'])((0x0,_0x2aae9f['homedir'])(),_0x18bdfa['RwLiV'],'vault');}function _0x4b76b0(_0x36c0b4,_0x127af5){const _0x1d5ec2=_0x1431eb,_0x2a59f9={'qZejf':_0x1d5ec2(0x242),'WKDzI':_0x1d5ec2(0x1f3)},_0x23a402=(0x0,_0x20e62c[_0x1d5ec2(0x1e7)])(0x10),_0x19ecb1=(0x0,_0x20e62c['createCipheriv'])(_0x1d5ec2(0x1f8),_0x127af5,_0x23a402),_0x218e49=Buffer[_0x1d5ec2(0x214)]([_0x19ecb1[_0x1d5ec2(0x1d9)](_0x36c0b4,_0x2a59f9[_0x1d5ec2(0x22d)]),_0x19ecb1[_0x1d5ec2(0x21f)]()]);return _0x23a402[_0x1d5ec2(0x209)](_0x1d5ec2(0x1f3))+':'+_0x218e49[_0x1d5ec2(0x209)](_0x2a59f9[_0x1d5ec2(0x1c7)]);}function _0x5af7d0(_0x20df9b,_0x395a7e){const _0x57b35d=_0x1431eb,_0x5e333a={'zNMzL':_0x57b35d(0x242)};try{const [_0x54c66b,_0x1b05d9]=_0x20df9b[_0x57b35d(0x222)](':');if(!_0x54c66b||!_0x1b05d9)return null;const _0x24cb8d=(0x0,_0x20e62c[_0x57b35d(0x24a)])(_0x57b35d(0x1f8),_0x395a7e,Buffer[_0x57b35d(0x217)](_0x54c66b,_0x57b35d(0x1f3))),_0x4bbf01=Buffer[_0x57b35d(0x214)]([_0x24cb8d[_0x57b35d(0x1d9)](Buffer['from'](_0x1b05d9,_0x57b35d(0x1f3))),_0x24cb8d[_0x57b35d(0x21f)]()]);return _0x4bbf01[_0x57b35d(0x209)](_0x5e333a[_0x57b35d(0x1ad)]);}catch{return null;}}class _0x148f8b extends Error{}exports[_0x1431eb(0x1ba)]=_0x148f8b;const _0x52b462='金庫を退避して作り直すには\x20`<ツールのコマンド>\x20secret\x20reset`(例:\x20devagent\x20secret\x20reset)を実行してください。'+_0x1431eb(0x1f1);function _0x22d444(_0x3e7a2a,_0x32176d){const _0x24dca3=_0x1431eb,_0x3c920e={'aSsue':_0x24dca3(0x1f3)},_0xc5db47=_0x3e7a2a+'.'+process[_0x24dca3(0x1d1)]+'.'+(0x0,_0x20e62c[_0x24dca3(0x1e7)])(0x4)[_0x24dca3(0x209)](_0x3c920e[_0x24dca3(0x1b4)])+'.tmp',_0x393ab9=(0x0,_0x58273a[_0x24dca3(0x1bc)])(_0xc5db47,'w',0x180);try{(0x0,_0x58273a[_0x24dca3(0x1f5)])(_0x393ab9,_0x32176d),(0x0,_0x58273a[_0x24dca3(0x252)])(_0x393ab9);}finally{(0x0,_0x58273a['closeSync'])(_0x393ab9);}(0x0,_0x58273a[_0x24dca3(0x229)])(_0xc5db47,_0x3e7a2a);try{(0x0,_0x58273a[_0x24dca3(0x25c)])(_0x3e7a2a,0x180);}catch{}}function _0x2c778b(_0x5c2876){const _0x5d8ca3=_0x1431eb;Atomics[_0x5d8ca3(0x1c4)](new Int32Array(new SharedArrayBuffer(0x4)),0x0,0x0,_0x5c2876);}function _0x4767d5(_0x15d85c){const _0x514c89=_0x1431eb,_0x3df73a={'OgHOq':_0x514c89(0x1f2)};try{return process[_0x514c89(0x1fc)](_0x15d85c,0x0),!![];}catch(_0xd27466){return _0xd27466[_0x514c89(0x20f)]===_0x3df73a['OgHOq'];}}function _0x4c9b79(_0x415672){const _0x3f25d6=_0x1431eb,_0x103e05={'BPxpO':function(_0x3ba24e){return _0x3ba24e();},'jirkw':_0x3f25d6(0x25a),'SzurD':function(_0x3f96ac,_0x495b38){return _0x3f96ac(_0x495b38);},'JDIFF':function(_0x5c2c83,_0x59b028){return _0x5c2c83===_0x59b028;},'rnYep':_0x3f25d6(0x261)};(0x0,_0x58273a[_0x3f25d6(0x1e3)])(_0x103e05[_0x3f25d6(0x1f0)](_0x56407e),{'recursive':!![],'mode':0x1c0});const _0x5b9269=(0x0,_0x8d4793['join'])(_0x56407e(),_0x103e05['jirkw']),_0x1b0a4d=process[_0x3f25d6(0x1d1)]+'\x20'+(0x0,_0x20e62c[_0x3f25d6(0x1e7)])(0x8)[_0x3f25d6(0x209)](_0x3f25d6(0x1f3)),_0x1c6117=Date[_0x3f25d6(0x230)]();for(;;){try{const _0x5db9e9=(0x0,_0x58273a[_0x3f25d6(0x1bc)])(_0x5b9269,'wx',0x180);try{(0x0,_0x58273a[_0x3f25d6(0x1f5)])(_0x5db9e9,_0x1b0a4d);}finally{(0x0,_0x58273a[_0x3f25d6(0x1b3)])(_0x5db9e9);}break;}catch{let _0x101b12='';try{_0x101b12=(0x0,_0x58273a[_0x3f25d6(0x1ca)])(_0x5b9269,_0x3f25d6(0x261));}catch{continue;}const _0x2574ef=_0x103e05[_0x3f25d6(0x1be)](Number,_0x101b12[_0x3f25d6(0x222)]('\x20')[0x0]);if(_0x101b12&&Number[_0x3f25d6(0x1d4)](_0x2574ef)&&_0x2574ef>0x0&&!_0x4767d5(_0x2574ef)){try{if(_0x103e05[_0x3f25d6(0x259)]((0x0,_0x58273a[_0x3f25d6(0x1ca)])(_0x5b9269,_0x103e05[_0x3f25d6(0x1e1)]),_0x101b12))(0x0,_0x58273a[_0x3f25d6(0x1da)])(_0x5b9269);}catch{}continue;}if(Date[_0x3f25d6(0x230)]()-_0x1c6117>0x7530)throw new _0x148f8b(_0x3f25d6(0x203)+_0x5b9269+_0x3f25d6(0x232)+(_0x2574ef||'?')+_0x3f25d6(0x225));_0x2c778b(0x32);}}try{return _0x415672();}finally{try{if(_0x103e05[_0x3f25d6(0x259)]((0x0,_0x58273a['readFileSync'])(_0x5b9269,_0x103e05[_0x3f25d6(0x1e1)]),_0x1b0a4d))(0x0,_0x58273a['unlinkSync'])(_0x5b9269);}catch{}}}const _0x59be5e=_0x1431eb(0x1df),_0x2a9d2a=_0x1431eb(0x1a8),_0xcde314='store.json';function _0xc712b3(){const _0x55cbb9=_0x1431eb,_0x4e7356={'CATIM':function(_0x5309f5,_0x495970){return _0x5309f5!==_0x495970;},'sCSht':'file'},_0x5add53=(0x0,_0x8d4793[_0x55cbb9(0x1c5)])(_0x56407e(),_0xcde314);if(!(0x0,_0x58273a[_0x55cbb9(0x1fe)])(_0x5add53))return null;const _0x20b2b8=JSON[_0x55cbb9(0x1fb)]((0x0,_0x58273a[_0x55cbb9(0x1ca)])(_0x5add53,_0x55cbb9(0x261)))[_0x55cbb9(0x23e)];if(_0x4e7356[_0x55cbb9(0x245)](_0x20b2b8,_0x55cbb9(0x20b))&&_0x20b2b8!==_0x4e7356[_0x55cbb9(0x1f9)])throw new _0x148f8b(_0x55cbb9(0x25d)+_0x5add53+')。'+_0x52b462);return _0x20b2b8;}function _0x55121c(){const _0x142155=_0x1431eb,_0x287f36={'nEJRY':function(_0x132b35){return _0x132b35();},'OOWGL':'file'},_0x50e737=(0x0,_0x8d4793[_0x142155(0x1c5)])(_0x287f36['nEJRY'](_0x56407e),_0x142155(0x1dd));return{'kind':_0x287f36['OOWGL'],'get':()=>(0x0,_0x58273a[_0x142155(0x1fe)])(_0x50e737)?(0x0,_0x58273a['readFileSync'])(_0x50e737,_0x142155(0x261))[_0x142155(0x1a4)]():null,'set':_0x3c9898=>_0x22d444(_0x50e737,_0x3c9898),'remove':()=>{const _0x349ac1=_0x142155;if((0x0,_0x58273a[_0x349ac1(0x1fe)])(_0x50e737))(0x0,_0x58273a[_0x349ac1(0x1da)])(_0x50e737);}};}let _0x12c749=null,_0x3d2fda=null;try{_0x12c749=require('@napi-rs/keyring');}catch(_0x410632){_0x3d2fda=_0x410632;}function _0x2c6609(_0x41616c){const _0x574b6c=_0x1431eb,_0x10882a={'Wkgjs':function(_0xa5f4ad,_0xae8848){return _0xa5f4ad===_0xae8848;},'FcvEu':_0x574b6c(0x1d5),'kUIVT':function(_0x267ec7,_0x23149f){return _0x267ec7(_0x23149f);}};return _0x10882a[_0x574b6c(0x1ef)](_0x41616c?.[_0x574b6c(0x20f)],_0x10882a[_0x574b6c(0x1a6)])||/Cannot find module/[_0x574b6c(0x228)](_0x10882a[_0x574b6c(0x221)](String,_0x41616c?.[_0x574b6c(0x243)]));}const _0x3c2fb5=_0x1431eb(0x1dc);function _0xafd1fb(){const _0x29f03e=_0x1431eb,_0x336eb8={'tOIVO':_0x29f03e(0x213)};if(!_0x12c749)throw _0x3d2fda??new Error(_0x29f03e(0x237));const {Entry:_0xee34c7}=_0x12c749,_0x256b33=new _0xee34c7(_0x59be5e,_0x2a9d2a,{'linux':{'store':_0x336eb8['tOIVO']}});return _0x256b33['getPassword'](),{'kind':_0x29f03e(0x20b),'get':()=>_0x256b33[_0x29f03e(0x1ed)]()??null,'set':_0x36d835=>_0x256b33[_0x29f03e(0x24f)](_0x36d835),'remove':()=>{_0x256b33['deletePassword']();}};}function _0x24aa4e(){const _0x52acf1=_0x1431eb,_0x3580d1={'vxhnQ':function(_0xf0882b,_0x5935f3){return _0xf0882b===_0x5935f3;},'tSgEo':function(_0x183700){return _0x183700();},'ZRBrm':function(_0x2a0372,_0x3f97f8){return _0x2a0372+_0x3f97f8;},'tdAlb':_0x52acf1(0x24b),'YMIEQ':_0x52acf1(0x1dd)};if(_0x3580d1[_0x52acf1(0x1b8)](process.env.FB_VAULT_STORE,_0x52acf1(0x1bd)))return _0x3580d1[_0x52acf1(0x1fd)](_0x55121c);const _0x3a6753=_0xc712b3();if(_0x3a6753===_0x52acf1(0x1bd))return _0x55121c();if(_0x3580d1[_0x52acf1(0x1b8)](_0x3a6753,_0x52acf1(0x20b)))try{return _0xafd1fb();}catch(_0x55817a){if(_0x2c6609(_0x55817a))throw new _0x148f8b(_0x3c2fb5);throw new _0x148f8b(_0x3580d1['ZRBrm'](_0x3580d1[_0x52acf1(0x1a0)](_0x52acf1(0x1ff)+_0x55817a[_0x52acf1(0x243)]+'。',_0x3580d1['tdAlb']),_0x52b462));}try{return _0x3580d1['tSgEo'](_0xafd1fb);}catch(_0x148e25){return process[_0x52acf1(0x218)][_0x52acf1(0x23a)](_0x52acf1(0x249)+(0x0,_0x8d4793[_0x52acf1(0x1c5)])(_0x3580d1[_0x52acf1(0x1fd)](_0x56407e),_0x3580d1[_0x52acf1(0x24d)])+'):\x20'+_0x148e25[_0x52acf1(0x243)]+'\x0a'),_0x55121c();}}let _0x15bf7a=null;function _0x4690a4(){const _0xe728eb=_0x1431eb,_0x4848b1={'pUYZU':function(_0x1d5fc5){return _0x1d5fc5();},'aKSEC':'hex','ncCkb':_0xe728eb(0x212),'QpaHk':function(_0x25b788,_0x6b410a,_0x17f4cb){return _0x25b788(_0x6b410a,_0x17f4cb);},'kUknt':function(_0x22dcab,_0x1fc95e){return _0x22dcab(_0x1fc95e);}};if(_0x15bf7a)return _0x15bf7a;const _0x14cb1a=_0x24aa4e(),_0x59c515=_0x14cb1a['get']();if(_0x59c515){_0x15bf7a=_0x4848b1[_0xe728eb(0x239)](_0x5d7349,_0x59c515);if(!(0x0,_0x58273a[_0xe728eb(0x1fe)])((0x0,_0x8d4793[_0xe728eb(0x1c5)])(_0x4848b1[_0xe728eb(0x244)](_0x56407e),_0xcde314)))_0x22d444((0x0,_0x8d4793[_0xe728eb(0x1c5)])(_0x4848b1[_0xe728eb(0x244)](_0x56407e),_0xcde314),JSON['stringify']({'store':_0x14cb1a[_0xe728eb(0x1f4)]}));return _0x15bf7a;}return _0x4c9b79(()=>{const _0x5ac30c=_0xe728eb,_0x1dc348=_0x14cb1a['get']();if(_0x1dc348)return _0x15bf7a=_0x5d7349(_0x1dc348);if((0x0,_0x58273a['existsSync'])((0x0,_0x8d4793[_0x5ac30c(0x1c5)])(_0x4848b1['pUYZU'](_0x56407e),_0x224fe3)))throw new _0x148f8b('金庫はあるのに、その鍵が見つかりません(保管先:\x20'+_0x14cb1a['kind']+')。'+_0x52b462);const _0x4178c3=(0x0,_0x20e62c[_0x5ac30c(0x1e7)])(0x20)[_0x5ac30c(0x209)](_0x4848b1[_0x5ac30c(0x1a3)]);_0x14cb1a[_0x5ac30c(0x1f6)](_0x4178c3);if(_0x14cb1a['get']()!==_0x4178c3)throw new _0x148f8b(_0x4848b1[_0x5ac30c(0x21c)]);return _0x4848b1['QpaHk'](_0x22d444,(0x0,_0x8d4793[_0x5ac30c(0x1c5)])(_0x4848b1[_0x5ac30c(0x244)](_0x56407e),_0xcde314),JSON['stringify']({'store':_0x14cb1a[_0x5ac30c(0x1f4)]})),_0x15bf7a=Buffer[_0x5ac30c(0x217)](_0x4178c3,'hex');});}function _0x5d7349(_0xe9c830){const _0x5d8ef4=_0x1431eb,_0x1cb409={'OjIcq':_0x5d8ef4(0x1f3)},_0x98eb0=Buffer[_0x5d8ef4(0x217)](_0xe9c830,_0x1cb409[_0x5d8ef4(0x1bf)]);if(_0x98eb0[_0x5d8ef4(0x258)]!==0x20)throw new _0x148f8b(_0x5d8ef4(0x1c1)+_0x52b462);return _0x98eb0;}function _0x411e37(){const _0x1769aa=_0x1431eb,_0x4d39f2={'jtaMd':_0x1769aa(0x1dd)};return(0x0,_0x58273a[_0x1769aa(0x1e3)])(_0x56407e(),{'recursive':!![],'mode':0x1c0}),_0x4c9b79(()=>{const _0x579dfb=_0x1769aa,_0x33c6a8=[],_0x5ec901=new Date()[_0x579dfb(0x1d2)]()[_0x579dfb(0x25e)](/[:.]/g,'-');for(const _0x44025b of[_0x224fe3,_0xcde314,_0x4d39f2[_0x579dfb(0x1e9)]]){const _0x3d5be8=(0x0,_0x8d4793[_0x579dfb(0x1c5)])(_0x56407e(),_0x44025b);(0x0,_0x58273a['existsSync'])(_0x3d5be8)&&((0x0,_0x58273a['renameSync'])(_0x3d5be8,_0x3d5be8+_0x579dfb(0x1e0)+_0x5ec901),_0x33c6a8[_0x579dfb(0x1ab)](_0x3d5be8+_0x579dfb(0x1e0)+_0x5ec901));}try{_0xafd1fb()[_0x579dfb(0x1eb)]();}catch{}return _0x15bf7a=null,_0x33c6a8;});}exports['META_KEY']=_0x1431eb(0x22e);function _0x4174af(_0x4315c4){const _0x1fc53e=_0x1431eb,_0x7b496f={'sUqQV':'string'},{[exports[_0x1fc53e(0x25b)]]:_0x27b229,..._0x2b90f2}=_0x4315c4;let _0x166e5c=[];if(typeof _0x27b229===_0x7b496f[_0x1fc53e(0x1cc)]){const _0x472584=JSON[_0x1fc53e(0x1fb)](_0x27b229);if(Array[_0x1fc53e(0x1fa)](_0x472584[_0x1fc53e(0x20c)]))_0x166e5c=_0x472584[_0x1fc53e(0x20c)][_0x1fc53e(0x21e)](_0x902a23=>typeof _0x902a23===_0x1fc53e(0x23f)&&_0x902a23 in _0x2b90f2);}return{'secrets':_0x2b90f2,'human':new Set(_0x166e5c)};}function _0x487714(_0x228693,_0x40c65e){const _0x24e37e=_0x1431eb,_0x14736c={'hZTgG':function(_0x3f5803,_0x1d7dd4,_0x5482df){return _0x3f5803(_0x1d7dd4,_0x5482df);},'ivfWD':_0x24e37e(0x261),'RfzcI':function(_0x4dfd72,_0x54af94){return _0x4dfd72===_0x54af94;},'dvHIE':function(_0x213b06,_0x2ef770){return _0x213b06===_0x2ef770;},'Tzggx':_0x24e37e(0x241)};if(!(0x0,_0x58273a['existsSync'])(_0x228693))return{'secrets':{},'human':new Set()};const _0x6d632e=_0x14736c[_0x24e37e(0x1d7)](_0x5af7d0,(0x0,_0x58273a[_0x24e37e(0x1ca)])(_0x228693,_0x14736c[_0x24e37e(0x1c8)])[_0x24e37e(0x1a4)](),_0x40c65e);if(_0x14736c['RfzcI'](_0x6d632e,null))throw new _0x148f8b(_0x24e37e(0x1ea)+_0x228693+')。鍵が変わった可能性があります。'+_0x52b462);const _0x144890=JSON['parse'](_0x6d632e);return _0x4174af(_0x144890&&_0x14736c['dvHIE'](typeof _0x144890,_0x14736c['Tzggx'])?_0x144890:{});}function _0x847090(){const _0x48170a=_0x1431eb,_0x50f101={'awxTL':function(_0x17ee49){return _0x17ee49();}};return _0x487714((0x0,_0x8d4793[_0x48170a(0x1c5)])(_0x50f101['awxTL'](_0x56407e),_0x224fe3),_0x50f101[_0x48170a(0x1e6)](_0x4690a4));}function _0x758f06(_0x5affbb){const _0x366c41=_0x1431eb,_0x1e282c={'wMHwz':function(_0xa04b07){return _0xa04b07();}};(0x0,_0x58273a[_0x366c41(0x1e3)])(_0x56407e(),{'recursive':!![],'mode':0x1c0});const _0x2d2b0c=[..._0x5affbb[_0x366c41(0x20c)]]['filter'](_0x1a5f1e=>_0x1a5f1e in _0x5affbb[_0x366c41(0x1b1)]),_0x4b3dc9=_0x2d2b0c[_0x366c41(0x258)]?{..._0x5affbb[_0x366c41(0x1b1)],[exports[_0x366c41(0x25b)]]:JSON[_0x366c41(0x248)]({'human':_0x2d2b0c})}:_0x5affbb[_0x366c41(0x1b1)];_0x22d444((0x0,_0x8d4793[_0x366c41(0x1c5)])(_0x56407e(),_0x224fe3),_0x4b76b0(JSON[_0x366c41(0x248)](_0x4b3dc9),_0x1e282c[_0x366c41(0x238)](_0x4690a4)));}function _0x272d09(){return _0x847090()['secrets'];}function _0x11930b(){const _0x41718a=_0x1431eb,_0x4de4a3={'TzNyE':function(_0x486af1){return _0x486af1();}};return _0x4de4a3[_0x41718a(0x24e)](_0x847090)[_0x41718a(0x20c)];}function _0x243587(_0x56ceae,_0x396362,_0x576e2e=_0x1431eb(0x1b2)){const _0x25612e=_0x1431eb,_0x462ab3={'AzYvi':function(_0x3f55d1){return _0x3f55d1();},'ecYqy':'human'};_0x462ab3[_0x25612e(0x1e2)](_0x4690a4),_0x4c9b79(()=>{const _0x3e16ba=_0x25612e,_0x315ed2=_0x462ab3['AzYvi'](_0x847090);_0x315ed2[_0x3e16ba(0x1b1)][_0x56ceae]=_0x396362;if(_0x576e2e===_0x462ab3[_0x3e16ba(0x260)])_0x315ed2[_0x3e16ba(0x20c)][_0x3e16ba(0x1ce)](_0x56ceae);else _0x315ed2[_0x3e16ba(0x20c)][_0x3e16ba(0x1a9)](_0x56ceae);_0x758f06(_0x315ed2);});}function _0x3581ef(_0x51c7bf){const _0x20893c={'CyAJo':function(_0x2be4a8){return _0x2be4a8();},'PmHey':function(_0xe8c81a,_0x293de2){return _0xe8c81a(_0x293de2);}};return _0x4690a4(),_0x4c9b79(()=>{const _0x92e284=_0x21cd,_0x3e7bfd=_0x20893c[_0x92e284(0x22c)](_0x847090);if(!Object[_0x92e284(0x1b9)][_0x92e284(0x246)]['call'](_0x3e7bfd[_0x92e284(0x1b1)],_0x51c7bf))return![];return delete _0x3e7bfd[_0x92e284(0x1b1)][_0x51c7bf],_0x3e7bfd['human'][_0x92e284(0x1a9)](_0x51c7bf),_0x20893c[_0x92e284(0x234)](_0x758f06,_0x3e7bfd),_0x3b7f1a(_0x51c7bf,null),_0x27f8be(_0x51c7bf,null),!![];});}function _0x302f23(){const _0x439f1f=_0x1431eb,_0x2eb3c1={'IyYNC':function(_0x3450a8){return _0x3450a8();}};return(0x0,_0x8d4793[_0x439f1f(0x1c5)])(_0x2eb3c1['IyYNC'](_0x56407e),_0x224fe3);}const _0x497b6e=_0x1431eb(0x253);function _0x27b5df(){const _0x1ff2ca=_0x1431eb,_0x2f824c={'gpTsB':function(_0x45628c,_0x5c9557){return _0x45628c===_0x5c9557;},'mfpIj':_0x1ff2ca(0x241)},_0x5861e6=(0x0,_0x8d4793[_0x1ff2ca(0x1c5)])(_0x56407e(),_0x497b6e);if(!(0x0,_0x58273a[_0x1ff2ca(0x1fe)])(_0x5861e6))return{};const _0x1e22e6=JSON['parse']((0x0,_0x58273a[_0x1ff2ca(0x1ca)])(_0x5861e6,'utf-8'));return _0x1e22e6&&_0x2f824c[_0x1ff2ca(0x21d)](typeof _0x1e22e6,_0x2f824c[_0x1ff2ca(0x1a7)])?_0x1e22e6:{};}function _0x3b7f1a(_0x540cc3,_0x37ff7c){const _0x564f7c=_0x1431eb,_0xf1b6b5={'MMBjO':function(_0xcc7114,_0x4f1d75){return _0xcc7114 in _0x4f1d75;}},_0x4af778=_0x27b5df();if(_0x37ff7c&&_0x37ff7c[_0x564f7c(0x258)])_0x4af778[_0x540cc3]=_0x37ff7c;else{if(_0xf1b6b5[_0x564f7c(0x257)](_0x540cc3,_0x4af778))delete _0x4af778[_0x540cc3];else return;}(0x0,_0x58273a[_0x564f7c(0x1e3)])(_0x56407e(),{'recursive':!![],'mode':0x1c0}),_0x22d444((0x0,_0x8d4793[_0x564f7c(0x1c5)])(_0x56407e(),_0x497b6e),JSON['stringify'](_0x4af778,null,0x2));}function _0x7efa22(_0x5247b9,_0x480499){const _0x149046=_0x1431eb,_0x3efdd1={'XBMZE':function(_0x162a08){return _0x162a08();},'uqxWr':function(_0x4af2ae,_0x471446){return _0x4af2ae(_0x471446);}};_0x3efdd1[_0x149046(0x25f)](_0x4690a4),_0x3efdd1[_0x149046(0x1bb)](_0x4c9b79,()=>_0x3b7f1a(_0x5247b9,_0x480499));}exports['HUMAN_STEPS']={'captcha':'画像パズル(CAPTCHA)','sms':'SMS\x20の確認コード','other':_0x1431eb(0x20d)};const _0x5dd2a8=_0x1431eb(0x200);function _0x21cd(_0x42a884,_0x388b3a){_0x42a884=_0x42a884-0x1a0;const _0x26e033=_0x26e0();let _0x21cd8b=_0x26e033[_0x42a884];if(_0x21cd['OnVpwd']===undefined){var _0x39409e=function(_0x3ae5c1){const _0x4aa5f5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x23c593='',_0x37e0c8='';for(let _0x35a8c3=0x0,_0xacc419,_0x175a91,_0x59f455=0x0;_0x175a91=_0x3ae5c1['charAt'](_0x59f455++);~_0x175a91&&(_0xacc419=_0x35a8c3%0x4?_0xacc419*0x40+_0x175a91:_0x175a91,_0x35a8c3++%0x4)?_0x23c593+=String['fromCharCode'](0xff&_0xacc419>>(-0x2*_0x35a8c3&0x6)):0x0){_0x175a91=_0x4aa5f5['indexOf'](_0x175a91);}for(let _0x3d7978=0x0,_0x5753be=_0x23c593['length'];_0x3d7978<_0x5753be;_0x3d7978++){_0x37e0c8+='%'+('00'+_0x23c593['charCodeAt'](_0x3d7978)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x37e0c8);};_0x21cd['NLmxFM']=_0x39409e,_0x21cd['tsqszJ']={},_0x21cd['OnVpwd']=!![];}const _0x34fda3=_0x26e033[0x0],_0x23f436=_0x42a884+_0x34fda3,_0x22b9e1=_0x21cd['tsqszJ'][_0x23f436];return!_0x22b9e1?(_0x21cd8b=_0x21cd['NLmxFM'](_0x21cd8b),_0x21cd['tsqszJ'][_0x23f436]=_0x21cd8b):_0x21cd8b=_0x22b9e1,_0x21cd8b;}function _0x2ee449(){const _0x5e5ece=_0x1431eb,_0x23fbda={'AheXI':function(_0x510cce){return _0x510cce();},'IAkjv':_0x5e5ece(0x261),'ItkSV':function(_0x2be39d,_0x57ff64){return _0x2be39d===_0x57ff64;},'OeQER':_0x5e5ece(0x23f)},_0x1d8101=(0x0,_0x8d4793['join'])(_0x23fbda['AheXI'](_0x56407e),_0x5dd2a8);if(!(0x0,_0x58273a['existsSync'])(_0x1d8101))return{};const _0x26e079=JSON[_0x5e5ece(0x1fb)]((0x0,_0x58273a[_0x5e5ece(0x1ca)])(_0x1d8101,_0x23fbda['IAkjv'])),_0x35b122={};for(const [_0x100603,_0x1db7ac]of Object[_0x5e5ece(0x205)](_0x26e079&&_0x23fbda[_0x5e5ece(0x247)](typeof _0x26e079,_0x5e5ece(0x241))?_0x26e079:{})){if(_0x23fbda[_0x5e5ece(0x247)](typeof _0x1db7ac,_0x23fbda[_0x5e5ece(0x23b)])&&Object[_0x5e5ece(0x1b9)][_0x5e5ece(0x246)]['call'](exports[_0x5e5ece(0x1e8)],_0x1db7ac))_0x35b122[_0x100603]=_0x1db7ac;}return _0x35b122;}function _0x27f8be(_0x5ab8d8,_0x4e55a7){const _0xb06318=_0x1431eb,_0x121e8b={'YfDRb':function(_0x50c60c,_0x127f4e){return _0x50c60c in _0x127f4e;},'LcfaQ':function(_0x23503d,_0xebf348,_0x2788ca){return _0x23503d(_0xebf348,_0x2788ca);},'iFQiG':function(_0x54a151){return _0x54a151();}},_0x3a55f7=_0x2ee449();if(_0x4e55a7)_0x3a55f7[_0x5ab8d8]=_0x4e55a7;else{if(_0x121e8b[_0xb06318(0x20e)](_0x5ab8d8,_0x3a55f7))delete _0x3a55f7[_0x5ab8d8];else return;}(0x0,_0x58273a[_0xb06318(0x1e3)])(_0x56407e(),{'recursive':!![],'mode':0x1c0}),_0x121e8b[_0xb06318(0x1cb)](_0x22d444,(0x0,_0x8d4793[_0xb06318(0x1c5)])(_0x121e8b[_0xb06318(0x22a)](_0x56407e),_0x5dd2a8),JSON['stringify'](_0x3a55f7,null,0x2));}function _0x1f791c(_0x27be72,_0x43cbf0){const _0x540808=_0x1431eb,_0x23bd60={'gKxAN':function(_0x13dede){return _0x13dede();},'lzVHm':function(_0x6b9dcb,_0x2a23d4){return _0x6b9dcb(_0x2a23d4);}};_0x23bd60[_0x540808(0x1db)](_0x4690a4),_0x23bd60[_0x540808(0x231)](_0x4c9b79,()=>_0x27f8be(_0x27be72,_0x43cbf0));}function _0x5e0f25(_0x37147e){const _0x4a3749=_0x1431eb,_0xdec036={'faenk':function(_0x58a843){return _0x58a843();},'SsJZE':_0x4a3749(0x1e4)},_0x486aa0=_0xdec036[_0x4a3749(0x22f)](_0x272d09);if(!Object[_0x4a3749(0x1b9)][_0x4a3749(0x246)][_0x4a3749(0x1b6)](_0x486aa0,_0x37147e))return{'status':_0xdec036[_0x4a3749(0x1cd)]};const _0x3fa197=_0x27b5df()[_0x37147e]??[];if(!_0x3fa197[_0x4a3749(0x258)])return{'status':_0x4a3749(0x23c)};const _0x3768de=_0x2ee449()[_0x37147e];return{'status':'ok','value':_0x486aa0[_0x37147e],'sites':_0x3fa197,..._0x3768de&&{'humanStep':exports[_0x4a3749(0x1e8)][_0x3768de]}};}function _0x4a2dda(){const _0x50e6fc=_0x1431eb,_0x3a920b={'sAeSF':function(_0x33dfd1){return _0x33dfd1();}};return Object[_0x50e6fc(0x207)](_0x3a920b['sAeSF'](_0x272d09));}const _0x1fb012=_0x1431eb(0x220);function _0x4cff91(){const _0x3b8130=_0x1431eb,_0x1addee=process.env.FB_PROFILE;if(!_0x1addee)return _0x1fb012;if(!/^[a-z0-9-]{1,32}$/[_0x3b8130(0x228)](_0x1addee))throw new _0x148f8b(_0x3b8130(0x235)+JSON['stringify'](_0x1addee)+')');return _0x3b8130(0x1ae)+_0x1addee+_0x3b8130(0x236);}function _0x139586(_0x200fb6){const _0x38d230=_0x1431eb;if(_0x200fb6['startsWith']('{')){const _0x2ee192=JSON[_0x38d230(0x1fb)](_0x200fb6);return{'jwt':_0x2ee192[_0x38d230(0x1c9)],'refresh':_0x2ee192[_0x38d230(0x256)]??null};}return{'jwt':_0x200fb6,'refresh':null};}function _0x45a4cc(_0x1fd94a){const _0x502af8=_0x1431eb,_0x2ced17={'PYINC':function(_0x1bfddb){return _0x1bfddb();},'FJGRM':function(_0x3915d5,_0x166e6a){return _0x3915d5(_0x166e6a);}},_0x4fb94d=(0x0,_0x8d4793[_0x502af8(0x1c5)])(_0x570e3a(_0x1fd94a),_0x2ced17[_0x502af8(0x208)](_0x4cff91));if(!(0x0,_0x58273a[_0x502af8(0x1fe)])(_0x4fb94d))return null;const _0x466a92=_0x5af7d0((0x0,_0x58273a[_0x502af8(0x1ca)])(_0x4fb94d,_0x502af8(0x261))[_0x502af8(0x1a4)](),_0x2ced17[_0x502af8(0x208)](_0x4690a4));return _0x466a92?_0x2ced17[_0x502af8(0x1c3)](_0x139586,_0x466a92):null;}function _0x5f358a(_0x38bb37,_0x106512){const _0x5d6c99=_0x1431eb,_0x2768be={'Xfilg':function(_0x173459,_0x4456bc){return _0x173459(_0x4456bc);},'Ttmvr':function(_0x5097ec,_0x18321d,_0x553a73){return _0x5097ec(_0x18321d,_0x553a73);}},_0x355328=_0x570e3a(_0x38bb37);_0x2768be['Xfilg'](_0x5c8789,_0x355328),_0x2768be['Ttmvr'](_0x22d444,(0x0,_0x8d4793[_0x5d6c99(0x1c5)])(_0x355328,_0x4cff91()),_0x2768be[_0x5d6c99(0x226)](_0x4b76b0,JSON[_0x5d6c99(0x248)]({'jwt':_0x106512['jwt'],'refresh':_0x106512[_0x5d6c99(0x256)]}),_0x4690a4()));}function _0x32b5f7(_0x307ce0){const _0x421425=_0x1431eb,_0x5eeb5f=(0x0,_0x8d4793['join'])(_0x570e3a(_0x307ce0),_0x4cff91());if((0x0,_0x58273a[_0x421425(0x1fe)])(_0x5eeb5f))(0x0,_0x58273a['unlinkSync'])(_0x5eeb5f);}function _0x4ec18d(_0x4743dc,_0x63440f,_0x1b92ef){const _0x2bd698=_0x1431eb,_0x5825a8={'EiuZy':function(_0x209ffc,_0x3889a5){return _0x209ffc!==_0x3889a5;}},_0x45ada7={..._0x4743dc},_0x1edad7=[];for(const [_0x42119d,_0x246a5a]of Object['entries'](_0x63440f)){if(!(_0x42119d in _0x45ada7)||_0x45ada7[_0x42119d]===_0x246a5a){_0x45ada7[_0x42119d]=_0x246a5a;continue;}let _0x28c51b=_0x42119d+'@'+_0x1b92ef;for(let _0x310114=0x2;_0x28c51b in _0x45ada7&&_0x5825a8[_0x2bd698(0x1d8)](_0x45ada7[_0x28c51b],_0x246a5a);_0x310114++)_0x28c51b=_0x42119d+'@'+_0x1b92ef+'#'+_0x310114;_0x45ada7[_0x28c51b]=_0x246a5a,_0x1edad7['push'](_0x42119d);}return{'merged':_0x45ada7,'conflicts':_0x1edad7};}function _0x168952(_0x200f3e){const _0x3eb116=_0x1431eb,_0x4e2cb4=new Set(_0x200f3e),_0x2f39a0=_0x200f3e[_0x3eb116(0x1aa)](_0x42017d=>_0x42017d[_0x3eb116(0x1d3)](0x0,Math['max'](_0x42017d[_0x3eb116(0x1ac)]('@'),0x0)))[_0x3eb116(0x21e)](_0x1c6970=>_0x1c6970&&_0x4e2cb4[_0x3eb116(0x1c6)](_0x1c6970));return[...new Set(_0x2f39a0)];}function _0x3e3dcc(_0x325b05){const _0x5a6c36=_0x1431eb,_0x421626={'HFCBN':function(_0xac8cad,_0x4e9cff){return _0xac8cad(_0x4e9cff);},'ngfZU':_0x5a6c36(0x261),'NQzJH':function(_0x34c015,_0x4f3a42,_0x27787b){return _0x34c015(_0x4f3a42,_0x27787b);},'TeJsq':function(_0x4404e3){return _0x4404e3();},'SDRQg':function(_0x1adb34,_0x192908,_0x28c725,_0x32a4f3){return _0x1adb34(_0x192908,_0x28c725,_0x32a4f3);},'CLDaV':function(_0x20c1a6,_0x15992a){return _0x20c1a6!==_0x15992a;},'glsde':_0x5a6c36(0x204),'KceyC':_0x5a6c36(0x1dd),'pvNLD':function(_0x1ea081,_0x121c0d){return _0x1ea081(_0x121c0d);}},_0x28b8d1=_0x570e3a(_0x325b05),_0x227b03=(0x0,_0x8d4793[_0x5a6c36(0x1c5)])(_0x28b8d1,_0x421626[_0x5a6c36(0x262)]);if(!(0x0,_0x58273a[_0x5a6c36(0x1fe)])(_0x227b03))return{'migrated':![],'conflicts':[]};return _0x421626[_0x5a6c36(0x254)](_0x4690a4),_0x421626[_0x5a6c36(0x1f7)](_0x4c9b79,()=>{const _0x49a054=_0x5a6c36;if(!(0x0,_0x58273a[_0x49a054(0x1fe)])(_0x227b03))return{'migrated':![],'conflicts':[]};const _0x376146=_0x421626[_0x49a054(0x227)](_0x5d7349,(0x0,_0x58273a[_0x49a054(0x1ca)])(_0x227b03,_0x421626[_0x49a054(0x1d6)])[_0x49a054(0x1a4)]()),_0x2482d1=(0x0,_0x8d4793[_0x49a054(0x1c5)])(_0x28b8d1,_0x224fe3),_0x5eb8bc=_0x487714(_0x2482d1,_0x376146)[_0x49a054(0x1b1)],_0x1841b8=(0x0,_0x8d4793[_0x49a054(0x1c5)])(_0x28b8d1,_0x1fb012),_0xc8eb63=(0x0,_0x58273a[_0x49a054(0x1fe)])(_0x1841b8)?_0x421626[_0x49a054(0x1af)](_0x5af7d0,(0x0,_0x58273a[_0x49a054(0x1ca)])(_0x1841b8,_0x421626[_0x49a054(0x1d6)])[_0x49a054(0x1a4)](),_0x376146):null,_0x2f1107=_0x421626['TeJsq'](_0x847090),{merged:_0x32563d,conflicts:_0x1b915a}=_0x421626['SDRQg'](_0x4ec18d,_0x2f1107[_0x49a054(0x1b1)],_0x5eb8bc,_0x325b05);_0x421626[_0x49a054(0x227)](_0x758f06,{'secrets':_0x32563d,'human':_0x2f1107['human']});if(_0xc8eb63)_0x5f358a(_0x325b05,_0x139586(_0xc8eb63));const _0x1bc413=_0x272d09();for(const [_0x2d6e15,_0x26b319]of Object[_0x49a054(0x205)](_0x32563d)){if(_0x1bc413[_0x2d6e15]!==_0x26b319)throw new Error('金庫の移行を確かめられませんでした('+_0x2d6e15+_0x49a054(0x224));}if(_0xc8eb63&&_0x421626[_0x49a054(0x206)](JSON['stringify'](_0x421626['HFCBN'](_0x45a4cc,_0x325b05)),JSON[_0x49a054(0x248)](_0x139586(_0xc8eb63))))throw new Error(_0x421626[_0x49a054(0x1a2)]);if((0x0,_0x58273a['existsSync'])(_0x2482d1))(0x0,_0x58273a[_0x49a054(0x1da)])(_0x2482d1);return(0x0,_0x58273a['unlinkSync'])(_0x227b03),{'migrated':!![],'conflicts':_0x1b915a};});}
|