@funny-booth/agent-core 0.1.51 → 0.1.53
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/selfUpdate.js +1 -0
- 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 _0x52bd1d=_0x5b29;(function(_0x3e72a2,_0x3013ab){const _0x1248bb=_0x5b29,_0x57475a=_0x3e72a2();while(!![]){try{const _0x5b3e75=parseInt(_0x1248bb(0x1a0))/0x1*(-parseInt(_0x1248bb(0x177))/0x2)+-parseInt(_0x1248bb(0x162))/0x3+parseInt(_0x1248bb(0x1aa))/0x4*(-parseInt(_0x1248bb(0x151))/0x5)+parseInt(_0x1248bb(0x1ea))/0x6*(parseInt(_0x1248bb(0x1c1))/0x7)+parseInt(_0x1248bb(0x170))/0x8+parseInt(_0x1248bb(0x193))/0x9*(-parseInt(_0x1248bb(0x1cb))/0xa)+parseInt(_0x1248bb(0x146))/0xb;if(_0x5b3e75===_0x3013ab)break;else _0x57475a['push'](_0x57475a['shift']());}catch(_0x2532b4){_0x57475a['push'](_0x57475a['shift']());}}}(_0x180d,0x62998));Object[_0x52bd1d(0x1bd)](exports,_0x52bd1d(0x152),{'value':!![]}),exports[_0x52bd1d(0x13d)]=exports['META_KEY']=exports['VaultError']=void 0x0,exports[_0x52bd1d(0x1c3)]=_0x3904e0,exports[_0x52bd1d(0x13b)]=_0x559d4b,exports[_0x52bd1d(0x131)]=_0x447412,exports['encrypt']=_0x3413af,exports[_0x52bd1d(0x149)]=_0x586e3b,exports[_0x52bd1d(0x1d5)]=_0x5b1ca9,exports[_0x52bd1d(0x1ba)]=_0x1931ba,exports['readSecrets']=_0x1ead4f,exports['humanSecretNames']=_0x35348b,exports[_0x52bd1d(0x16c)]=_0xfc4d55,exports['deleteSecret']=_0x3aaa6d,exports[_0x52bd1d(0x1e5)]=_0x54826b,exports[_0x52bd1d(0x1e2)]=_0x270bcf,exports[_0x52bd1d(0x171)]=_0x5bba85,exports['readHumanSteps']=_0x445f7f,exports[_0x52bd1d(0x168)]=_0x333dc8,exports[_0x52bd1d(0x1b0)]=_0x338280,exports[_0x52bd1d(0x16f)]=_0x5533c7,exports['readTokens']=_0x1da34f,exports[_0x52bd1d(0x166)]=_0x3b5dc4,exports[_0x52bd1d(0x1ab)]=_0x5749e8,exports['mergeSecrets']=_0x25da92,exports[_0x52bd1d(0x135)]=_0x575c3b,exports[_0x52bd1d(0x1dc)]=_0x1b2fc1;const _0x534f8a=require(_0x52bd1d(0x1e8)),_0x1fa1f=require('fs'),_0x2dbab1=require('os'),_0x4c2d44=require(_0x52bd1d(0x1d9));function _0x3904e0(_0x5b3ce2){const _0x1342b4=_0x52bd1d;return(0x0,_0x4c2d44[_0x1342b4(0x15d)])((0x0,_0x2dbab1['homedir'])(),'.'+_0x5b3ce2['toLowerCase']());}function _0x559d4b(_0x53a682){const _0x124962=_0x52bd1d;if(!(0x0,_0x1fa1f[_0x124962(0x167)])(_0x53a682))(0x0,_0x1fa1f[_0x124962(0x1c2)])(_0x53a682,{'recursive':!![],'mode':0x1c0});}const _0x2a1439=_0x52bd1d(0x164);function _0x447412(){const _0x5523c9=_0x52bd1d,_0x2c540c={'HSdzI':'vault'};return(0x0,_0x4c2d44[_0x5523c9(0x15d)])((0x0,_0x2dbab1[_0x5523c9(0x1bc)])(),'.funny-booth',_0x2c540c[_0x5523c9(0x183)]);}function _0x3413af(_0x1171a6,_0xaf9044){const _0x22e36a=_0x52bd1d,_0x3c4cd7={'ssviR':_0x22e36a(0x16d),'KLWQN':function(_0x798ec6,_0x3e1bf0){return _0x798ec6+_0x3e1bf0;},'PPjFs':_0x22e36a(0x165)},_0xb687cf=(0x0,_0x534f8a[_0x22e36a(0x187)])(0x10),_0x556c24=(0x0,_0x534f8a['createCipheriv'])(_0x3c4cd7['ssviR'],_0xaf9044,_0xb687cf),_0x13ed8f=Buffer['concat']([_0x556c24[_0x22e36a(0x1e9)](_0x1171a6,_0x22e36a(0x176)),_0x556c24[_0x22e36a(0x190)]()]);return _0x3c4cd7['KLWQN'](_0xb687cf[_0x22e36a(0x13a)]('hex')+':',_0x13ed8f[_0x22e36a(0x13a)](_0x3c4cd7['PPjFs']));}function _0x586e3b(_0x15aa9b,_0x2d4cf8){const _0x323366=_0x52bd1d,_0x5a7d1c={'sqKgv':_0x323366(0x16d)};try{const [_0x1dcdad,_0x42f827]=_0x15aa9b[_0x323366(0x140)](':');if(!_0x1dcdad||!_0x42f827)return null;const _0x286a34=(0x0,_0x534f8a[_0x323366(0x1ce)])(_0x5a7d1c['sqKgv'],_0x2d4cf8,Buffer[_0x323366(0x14b)](_0x1dcdad,'hex')),_0x473751=Buffer[_0x323366(0x153)]([_0x286a34[_0x323366(0x1e9)](Buffer[_0x323366(0x14b)](_0x42f827,'hex')),_0x286a34[_0x323366(0x190)]()]);return _0x473751[_0x323366(0x13a)](_0x323366(0x176));}catch{return null;}}class _0x4a8b62 extends Error{}exports[_0x52bd1d(0x1cf)]=_0x4a8b62;const _0x62b9a3=_0x52bd1d(0x1b2)+_0x52bd1d(0x150);function _0x2cd43f(_0x47ed51,_0x3999c7){const _0x16e8b3=_0x52bd1d,_0x55fba2={'DvcUq':_0x16e8b3(0x165)},_0x3cf82e=_0x47ed51+'.'+process[_0x16e8b3(0x1df)]+'.'+(0x0,_0x534f8a[_0x16e8b3(0x187)])(0x4)[_0x16e8b3(0x13a)](_0x55fba2['DvcUq'])+_0x16e8b3(0x17c),_0x42eb1d=(0x0,_0x1fa1f[_0x16e8b3(0x19a)])(_0x3cf82e,'w',0x180);try{(0x0,_0x1fa1f[_0x16e8b3(0x137)])(_0x42eb1d,_0x3999c7),(0x0,_0x1fa1f[_0x16e8b3(0x1dd)])(_0x42eb1d);}finally{(0x0,_0x1fa1f[_0x16e8b3(0x1e4)])(_0x42eb1d);}(0x0,_0x1fa1f[_0x16e8b3(0x15f)])(_0x3cf82e,_0x47ed51);try{(0x0,_0x1fa1f[_0x16e8b3(0x186)])(_0x47ed51,0x180);}catch{}}function _0x1c23e2(_0x24e328){const _0x246ecb=_0x52bd1d;Atomics[_0x246ecb(0x12e)](new Int32Array(new SharedArrayBuffer(0x4)),0x0,0x0,_0x24e328);}function _0x4308b8(_0x226c73){const _0x50ad73=_0x52bd1d,_0x97b723={'hubZB':_0x50ad73(0x1e1)};try{return process[_0x50ad73(0x19d)](_0x226c73,0x0),!![];}catch(_0x4c4205){return _0x4c4205[_0x50ad73(0x1a7)]===_0x97b723[_0x50ad73(0x1b1)];}}function _0x332f1f(_0xb69040){const _0x1b806c=_0x52bd1d,_0x88fd09={'RppMB':function(_0x4f4b32){return _0x4f4b32();},'EloAz':function(_0x212115){return _0x212115();},'iODSY':'hex','NxNlz':function(_0x1e431e,_0xe93f4e){return _0x1e431e(_0xe93f4e);},'UdKhp':function(_0x2ad4ab,_0x5cddb7){return _0x2ad4ab-_0x5cddb7;},'OHKSR':function(_0x5190a4,_0x284bde){return _0x5190a4||_0x284bde;}};(0x0,_0x1fa1f['mkdirSync'])(_0x88fd09[_0x1b806c(0x158)](_0x447412),{'recursive':!![],'mode':0x1c0});const _0x484699=(0x0,_0x4c2d44[_0x1b806c(0x15d)])(_0x88fd09[_0x1b806c(0x18f)](_0x447412),_0x1b806c(0x13f)),_0x45be66=process[_0x1b806c(0x1df)]+'\x20'+(0x0,_0x534f8a[_0x1b806c(0x187)])(0x8)[_0x1b806c(0x13a)](_0x88fd09[_0x1b806c(0x17f)]),_0x51e34f=Date[_0x1b806c(0x1de)]();for(;;){try{const _0x11ab45=(0x0,_0x1fa1f['openSync'])(_0x484699,'wx',0x180);try{(0x0,_0x1fa1f[_0x1b806c(0x137)])(_0x11ab45,_0x45be66);}finally{(0x0,_0x1fa1f[_0x1b806c(0x1e4)])(_0x11ab45);}break;}catch{let _0x43af47='';try{_0x43af47=(0x0,_0x1fa1f[_0x1b806c(0x169)])(_0x484699,'utf-8');}catch{continue;}const _0x593d64=_0x88fd09[_0x1b806c(0x1cd)](Number,_0x43af47[_0x1b806c(0x140)]('\x20')[0x0]);if(_0x43af47&&Number['isInteger'](_0x593d64)&&_0x593d64>0x0&&!_0x88fd09[_0x1b806c(0x1cd)](_0x4308b8,_0x593d64)){try{if((0x0,_0x1fa1f['readFileSync'])(_0x484699,_0x1b806c(0x15b))===_0x43af47)(0x0,_0x1fa1f[_0x1b806c(0x184)])(_0x484699);}catch{}continue;}if(_0x88fd09[_0x1b806c(0x1a5)](Date[_0x1b806c(0x1de)](),_0x51e34f)>0x7530)throw new _0x4a8b62(_0x1b806c(0x1e7)+_0x484699+_0x1b806c(0x195)+_0x88fd09[_0x1b806c(0x19b)](_0x593d64,'?')+_0x1b806c(0x161));_0x1c23e2(0x32);}}try{return _0x88fd09['RppMB'](_0xb69040);}finally{try{if((0x0,_0x1fa1f[_0x1b806c(0x169)])(_0x484699,_0x1b806c(0x15b))===_0x45be66)(0x0,_0x1fa1f[_0x1b806c(0x184)])(_0x484699);}catch{}}}const _0x1226bf=_0x52bd1d(0x1b4),_0x52e60e=_0x52bd1d(0x1a2),_0x2cc2c8=_0x52bd1d(0x133);function _0x53c4f7(){const _0x51e2bd=_0x52bd1d,_0x20780f={'tPbwY':function(_0x51b5ed,_0x5f1da0){return _0x51b5ed!==_0x5f1da0;},'mujtj':_0x51e2bd(0x1e6),'nDyGF':function(_0x5ca800,_0x396d1a){return _0x5ca800!==_0x396d1a;}},_0x2c1c64=(0x0,_0x4c2d44[_0x51e2bd(0x15d)])(_0x447412(),_0x2cc2c8);if(!(0x0,_0x1fa1f[_0x51e2bd(0x167)])(_0x2c1c64))return null;const _0x100393=JSON[_0x51e2bd(0x1ac)]((0x0,_0x1fa1f[_0x51e2bd(0x169)])(_0x2c1c64,'utf-8'))['store'];if(_0x20780f['tPbwY'](_0x100393,_0x20780f['mujtj'])&&_0x20780f[_0x51e2bd(0x12a)](_0x100393,_0x51e2bd(0x188)))throw new _0x4a8b62('金庫の設定が壊れています('+_0x2c1c64+')。'+_0x62b9a3);return _0x100393;}function _0x13e965(){const _0x3775b1=_0x52bd1d,_0x15d467={'mYDTI':function(_0x347aaf){return _0x347aaf();},'oQDAI':_0x3775b1(0x188)},_0x4d1dd2=(0x0,_0x4c2d44[_0x3775b1(0x15d)])(_0x15d467[_0x3775b1(0x1a1)](_0x447412),_0x3775b1(0x14a));return{'kind':_0x15d467['oQDAI'],'get':()=>(0x0,_0x1fa1f['existsSync'])(_0x4d1dd2)?(0x0,_0x1fa1f['readFileSync'])(_0x4d1dd2,'utf-8')['trim']():null,'set':_0x7338e5=>_0x2cd43f(_0x4d1dd2,_0x7338e5),'remove':()=>{const _0x2d13e8=_0x3775b1;if((0x0,_0x1fa1f[_0x2d13e8(0x167)])(_0x4d1dd2))(0x0,_0x1fa1f[_0x2d13e8(0x184)])(_0x4d1dd2);}};}let _0x1dfb72=null,_0x951c00=null;try{_0x1dfb72=require(_0x52bd1d(0x173));}catch(_0x2b02f8){_0x951c00=_0x2b02f8;}function _0x343a66(_0xc8dfb9){const _0x2ddf8f=_0x52bd1d,_0x5cb6a1={'aroZu':function(_0xf97025,_0x3cf963){return _0xf97025===_0x3cf963;},'erffW':_0x2ddf8f(0x136),'tQMjO':function(_0x36468e,_0x4f3568){return _0x36468e(_0x4f3568);}};return _0x5cb6a1[_0x2ddf8f(0x14f)](_0xc8dfb9?.[_0x2ddf8f(0x1a7)],_0x5cb6a1[_0x2ddf8f(0x1b5)])||/Cannot find module/[_0x2ddf8f(0x1c0)](_0x5cb6a1[_0x2ddf8f(0x12b)](String,_0xc8dfb9?.[_0x2ddf8f(0x15c)]));}const _0x2150ec=_0x52bd1d(0x18a);function _0x5ec2f3(){const _0x3b9c35=_0x52bd1d,_0x5dd911={'acZvP':_0x3b9c35(0x1a3),'HfJNK':_0x3b9c35(0x1e6)};if(!_0x1dfb72)throw _0x951c00??new Error('@napi-rs/keyring\x20を読めません');const {Entry:_0xada6a7}=_0x1dfb72,_0x1bdae7=new _0xada6a7(_0x1226bf,_0x52e60e,{'linux':{'store':_0x5dd911['acZvP']}});return _0x1bdae7[_0x3b9c35(0x145)](),{'kind':_0x5dd911[_0x3b9c35(0x159)],'get':()=>_0x1bdae7[_0x3b9c35(0x145)]()??null,'set':_0x3e7fe8=>_0x1bdae7[_0x3b9c35(0x1af)](_0x3e7fe8),'remove':()=>{const _0x2a721a=_0x3b9c35;_0x1bdae7[_0x2a721a(0x1d6)]();}};}function _0x113307(){const _0x563675=_0x52bd1d,_0x504196={'PGTQR':function(_0xb3ec9f,_0x556eb4){return _0xb3ec9f===_0x556eb4;},'QTTyM':function(_0x103d3e){return _0x103d3e();},'eyZFx':function(_0x58f350){return _0x58f350();},'TrAZS':function(_0x1a8f69){return _0x1a8f69();},'tZnPp':function(_0x3515ed,_0x2187b4){return _0x3515ed(_0x2187b4);},'kGBlU':function(_0x1ca98b,_0xff3a0c){return _0x1ca98b+_0xff3a0c;},'Chzaw':function(_0x82e3ed){return _0x82e3ed();},'ucEGg':_0x563675(0x14a)};if(_0x504196[_0x563675(0x172)](process.env.FB_VAULT_STORE,_0x563675(0x188)))return _0x13e965();const _0x861f1f=_0x504196[_0x563675(0x17a)](_0x53c4f7);if(_0x861f1f===_0x563675(0x188))return _0x504196['eyZFx'](_0x13e965);if(_0x504196[_0x563675(0x172)](_0x861f1f,_0x563675(0x1e6)))try{return _0x504196['TrAZS'](_0x5ec2f3);}catch(_0x16eb03){if(_0x504196[_0x563675(0x1be)](_0x343a66,_0x16eb03))throw new _0x4a8b62(_0x2150ec);throw new _0x4a8b62(_0x504196['kGBlU'](_0x563675(0x178)+_0x16eb03[_0x563675(0x15c)]+'。','キーチェーンのロック解除や、アクセス許可(「常に許可」)を確認してください。')+_0x62b9a3);}try{return _0x504196['Chzaw'](_0x5ec2f3);}catch(_0x126ee9){return process['stderr'][_0x563675(0x13e)](_0x563675(0x19e)+(0x0,_0x4c2d44['join'])(_0x447412(),_0x504196[_0x563675(0x1db)])+_0x563675(0x181)+_0x126ee9[_0x563675(0x15c)]+'\x0a'),_0x13e965();}}function _0x180d(){const _0x5a6739=['C3bSAxq','AgfZt3DUuhjVCgvYDhK','tg5Azu8','C3LQAeK','wvDTq1m','z2v0ugfZC3DVCMq','mty3ody1nJfiseL4sNm','A0D0AvC','Bwf4','zgvJCNLWDa','DMf1BhqUA2v5','zNjVBq','y2fSBa','Cg9YDgfSlxrVA2vUlG','teftD04','yxjVwNu','5l+D5A2y44gx44gM44ge44gF56Ey5A+g44gV5AsX44kp44km44cb44oT44kW44kK44oZ44gx55U044gx44gR44gQ44kk44g+44gz77Yi6yca6yg/44gx44gF44ov44kH44kK44oR44gV5Q6l44kk44g+44gz77Yj44cc','ndu3nwDtzgfRCW','x19LC01VzhvSzq','y29Uy2f0','qunxDhC','77Yj44cc5PEN44ge6yEr5BQR44gV5Q6l44gx44gM44ge44g+44gz','CuPXD0u','zw50CMLLCW','uNbWtui','sgzktKS','DNbUtxC','DxrMltG','BwvZC2fNzq','AM9PBG','AwXTC00','CMvUyw1Lu3LUyW','77Yj44cc6y2144gm5Asj44kp44gJ44gF5y+V6io95OcN44gm44gc44kk44g+44gz44cc','77Yj44cc44gx44gW44kj44gp5B6f44gJ44gM44gl44kj44ke44kk55U044gx44gM44gp44gG44gv44ge','mJe3mtG4ouDms1jOBG','Cg9YDgfSlxrVA2vUlMvUyW','C2vJCMv0CY5LBMm','Agv4','C2f2zvrVA2vUCW','zxHPC3rZu3LUyW','C2v0shvTyw5tDgvW','CMvHzezPBgvtEw5J','CMvTB3zL','BMDxC0S','C2v0u2vJCMv0','ywvZlti1nI1JyMm','rgrVC3q','BgLZDfnLy3jLDe5HBwvZ','ndC4nJKWne53uur5rq','C2v0u2vJCMv0u2L0zxm','ueDuuvi','qg5HCgKTCNmVA2v5CMLUzW','ChvZAa','CMvWBgfJzq','DxrMoa','nti0zNLqEwzJ','t1mG44gU6y215l+D566H5BQR44gl44kj6yEr5BQR44gU6y2144ks6kQT44kb44g+44gB44ktoIa','CgPzzfm','uvruEu0','A2v5CW','lNrTCa','s25PqKm','s1f3t0S','Au9eu1K','lMvUyW','77YjoIa','C3rYAw5NAwz5','sfnKEKK','Dw5SAw5Ru3LUyW','A2LUza','y2HTB2rtEw5J','CMfUzg9TqNL0zxm','zMLSzq','6yEr5BQR44gU6y2144gm5Aok44km44gM44ge44g+44gz77YimZiG44oq44kK44oi44gN44gV44gc44kk44g+44gB44kt77Yj44cc','44oe44o844oR44gm5PU05PAW44gv44km44gF44gQ44gP44gN44cb6yEr5BQR44ks6zAl44gp6yoO5zob44ks6kQT44kb44g+44gB44kt44cckIRJG4tJG7ZJG6VJGPlOTBFLI5xJGzFNM7tJGzFJGABJGy/JGAdJGzxJGyqQkU+8IoMhKEw6Q+obRUs4REI6Q+obR+A2IoobIoobPUobHoobVUobM+ocK+oaGNnLy3jLDcbYzxnLDcdJGA/JGzFJGARJGytJGAFJGy/JGAdJGzxJGytVViNJGii','A0LzBeS','yKjbBKq','AND0','ywrK','rwXVqxO','zMLUywW','C2XPy2u','ChjVDg90ExbL','ovrmEK9Arq','BgfZDeLUzgv4t2y','44cbCgLKia','BwLZC2LUzW','CwzvEfm','C2vJCMv0lxnPDgvZlMPZB24','44oT44kW44kK44oZ5Oof5AcX44gU56E76kgm44ks56k644gl44kb44kj44km44g+44gB44kt44gN44gx44gF44cc5PEN44ge6yEr5BQR44gV5Q6l44gx44gM44ge44g+44gz','B3bLBLn5BMm','t0Hlu1i','v0jrzMq','A2LSBa','4Oc7ie9tioobRUMnTEs/NEEUOEw6Q+obJos9V+obIoobQUobHoobN+ocGEoaGEMhKEw6Q+obRUMnTEocKUodLEocOEocPoodQ+obQ+s/NEwTMoobL+obVUobME+8Ia','6yEr5BQR44gU6y2144ks5l+D5A2y44gN44gn44g+44gB44kt44gN44gx44gF77Yi5PU444ge44gF6y2144ks6kQT44g/5OI744gB44g+44gB44kt77Yj','mtKZm0TYEeLYDa','BvLeveK','DMf1BhqTA2v5','C2vJCMv0lxnLCNzPy2u','yMf5sNC','vwrlAha','EujfAu8','y29Kzq','6yEr5BQR44ks5B6P5y+344gN44gn44g+44gB44kt77Yi','AvHpuNi','mZa5mKv2BKLgEG','y2XLyxjuB2TLBNm','CgfYC2u','qurorem','rKjFufjprKLmrsdJGA/OI7hLSi/MLOFLRzFJG7VMLBdLRzFJG7STioobP+ABUoobHoobPUobJ+obOoobLEobHo+8Ios7IJOG','C2v0ugfZC3DVCMq','zMLSBgfIBgvtzwnYzxq','AhvIwKi','6yEr5BQR44ks6yca6yg/44gx44gM5l2C44kk55U044gz44gR44gViga844oe44o844oR44gU44kZ44oE44oZ44ojpIbZzwnYzxqGCMvZzxrG77Yi5l6loIbKzxzHz2vUDcbZzwnYzxqGCMvZzxtVViNJGPlLRP/OOyZJGzFJGABJGy/JGAdJGzxJGytJGii','DLDVCwy','zNvUBNKTyM9VDgG','zxjMzLC','6yEr5BQR44gU56E76kgm44ks56k644gl44kb44kj44km44g+44gB44kt44gN44gx44gF77Yi','BwfW','C3rYAw5N','Bw9KzwW','CMvZzxrwyxvSDa','z2v0','Ag9TzwrPCG','zgvMAw5LuhjVCgvYDhK','DfPUuha','wuPZr1i','DgvZDa','ndq4mdu2n3P6tvDcAW','BwTKAxjtEw5J','y29UzMLNrgLY','CunXvxe','AKjpvhK','DhjPBq','tK9bruu','u01tioobRUEIUUIQJEocS+odVoodIq','C2vJCMv0lwH1BwfUlxn0zxbZlMPZB24','BervEgS','ndiYoti3mentt2HUCW','zKfLEwO','tNHoBhO','y3jLyxrLrgvJAxbOzxjPDG','vMf1BhrfCNjVCG','C2vJCMv0CW','tNLVEhq','yurqDfq','t0HeC08','zNvUBNKTyM9VDgG6Bwv0yq','DMf1BhrlzxK','zgvSzxrLugfZC3DVCMq','B2jQzwn0','CMvMCMvZAa','Cgf0Aa','y2XLCLG','Dwnfr2C','BwLNCMf0zvrVB2XwyxvSDa','zNn5BMntEw5J','BM93','CgLK','AgfZ','rvbfuK0','CMvHzfnLy3jLDfnPDgvZ','C3rHCNrZv2L0Aa','y2XVC2vtEw5J','C2vJCMv0C0zPBgu','A2v5y2HHAw4','6yEr5BQR44ks5l2/44gJ44gM44ge44kl5yIL44gU44ox44oT44k744k544gm57wc44kp44kk44g+44gB44kt77Yi','y3j5ChrV','DxbKyxrL','nLjjugLnsG','BKr5r0y','DffnAK8','wuvkueS','C2v0','D2fPDa','DvnYy2y','zgvSzxrL','DMf1BhreAxi','BgvUz3rO','C3rVCMuUANnVBG','q255rNm','y29UzMXPy3rLzfnLy3jLDe5HBwvZ','tu9evuXfx05pvf9gt1vora','D3jPDgvtEw5J','zMLSDgvY','tuvuqv9lrvK','Dg9tDhjPBMC','zw5ZDxjLq29UzMLNrgLY','AhvTyw4','sfvnqu5Fu1rfufm','D3jPDgu','lMXVy2S'];_0x180d=function(){return _0x5a6739;};return _0x180d();}let _0x4962de=null;function _0x5b1ca9(){const _0x5c6e52=_0x52bd1d,_0x1bc7bd={'vpnMw':function(_0x28f9de,_0x1f33bd){return _0x28f9de(_0x1f33bd);},'PsHGf':function(_0x5eee7a,_0x2b1068){return _0x5eee7a!==_0x2b1068;},'pvweP':_0x5c6e52(0x19f),'NQbYg':_0x5c6e52(0x165),'lDUxk':function(_0x488f48){return _0x488f48();},'clerX':function(_0xcac970){return _0xcac970();}};if(_0x4962de)return _0x4962de;const _0x2d2441=_0x113307(),_0x417bdc=_0x2d2441[_0x5c6e52(0x1bb)]();if(_0x417bdc){_0x4962de=_0x1bc7bd[_0x5c6e52(0x15a)](_0x1f59ef,_0x417bdc);if(!(0x0,_0x1fa1f[_0x5c6e52(0x167)])((0x0,_0x4c2d44['join'])(_0x1bc7bd[_0x5c6e52(0x1ca)](_0x447412),_0x2cc2c8)))_0x2cd43f((0x0,_0x4c2d44['join'])(_0x1bc7bd[_0x5c6e52(0x1da)](_0x447412),_0x2cc2c8),JSON[_0x5c6e52(0x182)]({'store':_0x2d2441[_0x5c6e52(0x185)]}));return _0x4962de;}return _0x332f1f(()=>{const _0xad10=_0x5c6e52,_0x4e739d=_0x2d2441[_0xad10(0x1bb)]();if(_0x4e739d)return _0x4962de=_0x1bc7bd[_0xad10(0x15a)](_0x1f59ef,_0x4e739d);if((0x0,_0x1fa1f['existsSync'])((0x0,_0x4c2d44['join'])(_0x447412(),_0x2a1439)))throw new _0x4a8b62('金庫はあるのに、その鍵が見つかりません(保管先:\x20'+_0x2d2441[_0xad10(0x185)]+')。'+_0x62b9a3);const _0x39cd8d=(0x0,_0x534f8a[_0xad10(0x187)])(0x20)[_0xad10(0x13a)](_0xad10(0x165));_0x2d2441[_0xad10(0x12d)](_0x39cd8d);if(_0x1bc7bd['PsHGf'](_0x2d2441[_0xad10(0x1bb)](),_0x39cd8d))throw new _0x4a8b62(_0x1bc7bd['pvweP']);return _0x2cd43f((0x0,_0x4c2d44['join'])(_0x447412(),_0x2cc2c8),JSON['stringify']({'store':_0x2d2441['kind']})),_0x4962de=Buffer[_0xad10(0x14b)](_0x39cd8d,_0x1bc7bd['NQbYg']);});}function _0x1f59ef(_0x1ebedb){const _0x40e314=_0x52bd1d,_0x2f0ec2=Buffer[_0x40e314(0x14b)](_0x1ebedb,_0x40e314(0x165));if(_0x2f0ec2[_0x40e314(0x132)]!==0x20)throw new _0x4a8b62(_0x40e314(0x189)+_0x62b9a3);return _0x2f0ec2;}function _0x1931ba(){const _0x310147=_0x52bd1d,_0x2dbc3a={'UeRyk':_0x310147(0x14a),'CnyFs':function(_0x39b971){return _0x39b971();},'pRKev':function(_0x51a6ff,_0x19d38f){return _0x51a6ff(_0x19d38f);}};return(0x0,_0x1fa1f[_0x310147(0x1c2)])(_0x447412(),{'recursive':!![],'mode':0x1c0}),_0x2dbc3a['pRKev'](_0x332f1f,()=>{const _0x1a72cd=_0x310147,_0x2b3137=[],_0x40b51d=new Date()['toISOString']()[_0x1a72cd(0x175)](/[:.]/g,'-');for(const _0x1df33d of[_0x2a1439,_0x2cc2c8,_0x2dbc3a['UeRyk']]){const _0x4b06a4=(0x0,_0x4c2d44[_0x1a72cd(0x15d)])(_0x447412(),_0x1df33d);(0x0,_0x1fa1f[_0x1a72cd(0x167)])(_0x4b06a4)&&((0x0,_0x1fa1f['renameSync'])(_0x4b06a4,_0x4b06a4+'.broken-'+_0x40b51d),_0x2b3137[_0x1a72cd(0x174)](_0x4b06a4+'.broken-'+_0x40b51d));}try{_0x2dbc3a[_0x1a72cd(0x134)](_0x5ec2f3)[_0x1a72cd(0x16a)]();}catch{}return _0x4962de=null,_0x2b3137;});}exports[_0x52bd1d(0x139)]=_0x52bd1d(0x1d4);function _0x3595e2(_0x111a01){const _0x469fca=_0x52bd1d,_0xcbc72d={'bBAnD':'string'},{[exports[_0x469fca(0x139)]]:_0x179e46,..._0x3d524d}=_0x111a01;let _0x5ed786=[];if(typeof _0x179e46===_0xcbc72d[_0x469fca(0x18c)]){const _0x53dfb2=JSON[_0x469fca(0x1ac)](_0x179e46);if(Array['isArray'](_0x53dfb2[_0x469fca(0x13c)]))_0x5ed786=_0x53dfb2['human']['filter'](_0x1bb17b=>typeof _0x1bb17b==='string'&&_0x1bb17b in _0x3d524d);}return{'secrets':_0x3d524d,'human':new Set(_0x5ed786)};}function _0x17340b(_0x269119,_0x50ad21){const _0xd87a43=_0x52bd1d,_0xba0684={'xRTOf':function(_0x36704b,_0x5210fe){return _0x36704b===_0x5210fe;},'YEJPK':function(_0x205245,_0x138115){return _0x205245(_0x138115);}};if(!(0x0,_0x1fa1f[_0xd87a43(0x167)])(_0x269119))return{'secrets':{},'human':new Set()};const _0x232f4e=_0x586e3b((0x0,_0x1fa1f[_0xd87a43(0x169)])(_0x269119,_0xd87a43(0x15b))['trim'](),_0x50ad21);if(_0xba0684['xRTOf'](_0x232f4e,null))throw new _0x4a8b62(_0xd87a43(0x1a8)+_0x269119+_0xd87a43(0x160)+_0x62b9a3);const _0xa6bd89=JSON[_0xd87a43(0x1ac)](_0x232f4e);return _0xba0684[_0xd87a43(0x12c)](_0x3595e2,_0xa6bd89&&typeof _0xa6bd89==='object'?_0xa6bd89:{});}function _0x2e817c(){const _0x8baf0=_0x52bd1d,_0x414575={'pjYdS':function(_0x2d8b50){return _0x2d8b50();}};return _0x17340b((0x0,_0x4c2d44['join'])(_0x414575['pjYdS'](_0x447412),_0x2a1439),_0x414575[_0x8baf0(0x179)](_0x5b1ca9));}function _0x4bc4e7(_0x23fc7d){const _0xc6cc5d=_0x52bd1d,_0x32fe5e={'syjhI':function(_0x50f65a){return _0x50f65a();},'kIYlK':function(_0x4b133d,_0x7a7c6,_0x233c26){return _0x4b133d(_0x7a7c6,_0x233c26);},'ACWtw':function(_0x55bfca){return _0x55bfca();}};(0x0,_0x1fa1f[_0xc6cc5d(0x1c2)])(_0x32fe5e[_0xc6cc5d(0x143)](_0x447412),{'recursive':!![],'mode':0x1c0});const _0x2b3609=[..._0x23fc7d[_0xc6cc5d(0x13c)]][_0xc6cc5d(0x138)](_0x22db5b=>_0x22db5b in _0x23fc7d[_0xc6cc5d(0x1d0)]),_0x3c16bd=_0x2b3609[_0xc6cc5d(0x132)]?{..._0x23fc7d['secrets'],[exports[_0xc6cc5d(0x139)]]:JSON[_0xc6cc5d(0x182)]({'human':_0x2b3609})}:_0x23fc7d[_0xc6cc5d(0x1d0)];_0x32fe5e[_0xc6cc5d(0x18b)](_0x2cd43f,(0x0,_0x4c2d44[_0xc6cc5d(0x15d)])(_0x447412(),_0x2a1439),_0x3413af(JSON[_0xc6cc5d(0x182)](_0x3c16bd),_0x32fe5e[_0xc6cc5d(0x154)](_0x5b1ca9)));}function _0x1ead4f(){const _0x1a177a=_0x52bd1d,_0x1e800a={'OHDsO':function(_0x17057d){return _0x17057d();}};return _0x1e800a[_0x1a177a(0x1d3)](_0x2e817c)['secrets'];}function _0x35348b(){const _0xa09d5a=_0x52bd1d,_0x4e87d6={'NOAEE':function(_0x377542){return _0x377542();}};return _0x4e87d6[_0xa09d5a(0x1c7)](_0x2e817c)[_0xa09d5a(0x13c)];}function _0xfc4d55(_0x5e9a08,_0x3a117a,_0x4f8062=_0x52bd1d(0x1b9)){const _0xd383fb=_0x52bd1d,_0x1b6f85={'ngWsK':function(_0x5a6cfa){return _0x5a6cfa();},'kGtiW':function(_0x42c933){return _0x42c933();}};_0x1b6f85[_0xd383fb(0x147)](_0x5b1ca9),_0x332f1f(()=>{const _0x24cffc=_0xd383fb,_0x5d5b0c=_0x1b6f85[_0x24cffc(0x16b)](_0x2e817c);_0x5d5b0c[_0x24cffc(0x1d0)][_0x5e9a08]=_0x3a117a;if(_0x4f8062===_0x24cffc(0x13c))_0x5d5b0c[_0x24cffc(0x13c)][_0x24cffc(0x18e)](_0x5e9a08);else _0x5d5b0c[_0x24cffc(0x13c)][_0x24cffc(0x130)](_0x5e9a08);_0x4bc4e7(_0x5d5b0c);});}function _0x3aaa6d(_0xddc718){const _0x288176=_0x52bd1d,_0x28dbbe={'uSrcf':function(_0x1dcdbd){return _0x1dcdbd();},'DVVlU':function(_0x27d63f,_0x3763cb){return _0x27d63f(_0x3763cb);}};return _0x28dbbe[_0x288176(0x12f)](_0x5b1ca9),_0x28dbbe['DVVlU'](_0x332f1f,()=>{const _0x4a625e=_0x288176,_0x582f9b=_0x2e817c();if(!Object[_0x4a625e(0x192)][_0x4a625e(0x141)]['call'](_0x582f9b[_0x4a625e(0x1d0)],_0xddc718))return![];return delete _0x582f9b[_0x4a625e(0x1d0)][_0xddc718],_0x582f9b[_0x4a625e(0x13c)][_0x4a625e(0x130)](_0xddc718),_0x4bc4e7(_0x582f9b),_0x2b9b8f(_0xddc718,null),_0x4e01c8(_0xddc718,null),!![];});}function _0x54826b(){const _0x291015=_0x52bd1d;return(0x0,_0x4c2d44[_0x291015(0x15d)])(_0x447412(),_0x2a1439);}const _0x5921a7=_0x52bd1d(0x198);function _0x270bcf(){const _0x55245e=_0x52bd1d,_0x3dbd15={'YWmCS':_0x55245e(0x1d7)},_0x1022ef=(0x0,_0x4c2d44[_0x55245e(0x15d)])(_0x447412(),_0x5921a7);if(!(0x0,_0x1fa1f[_0x55245e(0x167)])(_0x1022ef))return{};const _0x3a0df8=JSON[_0x55245e(0x1ac)]((0x0,_0x1fa1f[_0x55245e(0x169)])(_0x1022ef,_0x55245e(0x15b)));return _0x3a0df8&&typeof _0x3a0df8===_0x3dbd15[_0x55245e(0x144)]?_0x3a0df8:{};}function _0x2b9b8f(_0x2ec42d,_0x1985bc){const _0x280861=_0x52bd1d,_0x2dbe16={'ghbKf':function(_0x3f6062){return _0x3f6062();},'Ddost':function(_0x1f6369,_0x35a2ce){return _0x1f6369 in _0x35a2ce;},'WBQfd':function(_0x2b613b,_0x32c106,_0x367c63){return _0x2b613b(_0x32c106,_0x367c63);}},_0x335b0d=_0x2dbe16['ghbKf'](_0x270bcf);if(_0x1985bc&&_0x1985bc[_0x280861(0x132)])_0x335b0d[_0x2ec42d]=_0x1985bc;else{if(_0x2dbe16[_0x280861(0x16e)](_0x2ec42d,_0x335b0d))delete _0x335b0d[_0x2ec42d];else return;}(0x0,_0x1fa1f[_0x280861(0x1c2)])(_0x447412(),{'recursive':!![],'mode':0x1c0}),_0x2dbe16[_0x280861(0x19c)](_0x2cd43f,(0x0,_0x4c2d44[_0x280861(0x15d)])(_0x447412(),_0x5921a7),JSON[_0x280861(0x182)](_0x335b0d,null,0x2));}function _0x5bba85(_0x1af801,_0x4558ae){const _0x5c14ec=_0x52bd1d,_0x24cc80={'Nyoxt':function(_0x14b2af){return _0x14b2af();}};_0x24cc80[_0x5c14ec(0x1d1)](_0x5b1ca9),_0x332f1f(()=>_0x2b9b8f(_0x1af801,_0x4558ae));}function _0x5b29(_0x417873,_0x45f708){_0x417873=_0x417873-0x12a;const _0x180df6=_0x180d();let _0x5b297b=_0x180df6[_0x417873];if(_0x5b29['vsfHiW']===undefined){var _0x390579=function(_0x438097){const _0x194c74='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x190d47='',_0x5c8bf7='';for(let _0x30fdd9=0x0,_0x5d066d,_0x13241a,_0x47a890=0x0;_0x13241a=_0x438097['charAt'](_0x47a890++);~_0x13241a&&(_0x5d066d=_0x30fdd9%0x4?_0x5d066d*0x40+_0x13241a:_0x13241a,_0x30fdd9++%0x4)?_0x190d47+=String['fromCharCode'](0xff&_0x5d066d>>(-0x2*_0x30fdd9&0x6)):0x0){_0x13241a=_0x194c74['indexOf'](_0x13241a);}for(let _0x570dd2=0x0,_0x5a2308=_0x190d47['length'];_0x570dd2<_0x5a2308;_0x570dd2++){_0x5c8bf7+='%'+('00'+_0x190d47['charCodeAt'](_0x570dd2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5c8bf7);};_0x5b29['IUcwna']=_0x390579,_0x5b29['xGiplt']={},_0x5b29['vsfHiW']=!![];}const _0x20b2b0=_0x180df6[0x0],_0x4c9891=_0x417873+_0x20b2b0,_0x4b0d4b=_0x5b29['xGiplt'][_0x4c9891];return!_0x4b0d4b?(_0x5b297b=_0x5b29['IUcwna'](_0x5b297b),_0x5b29['xGiplt'][_0x4c9891]=_0x5b297b):_0x5b297b=_0x4b0d4b,_0x5b297b;}exports[_0x52bd1d(0x13d)]={'captcha':'画像パズル(CAPTCHA)','sms':_0x52bd1d(0x1c8),'other':'その他の人の操作'};const _0x23a586=_0x52bd1d(0x1c9);function _0x445f7f(){const _0x2898cf=_0x52bd1d,_0x32e49a={'MoZIP':_0x2898cf(0x1d7),'YJsGR':function(_0x16e312,_0xa7faf1){return _0x16e312===_0xa7faf1;}},_0x4df0de=(0x0,_0x4c2d44[_0x2898cf(0x15d)])(_0x447412(),_0x23a586);if(!(0x0,_0x1fa1f['existsSync'])(_0x4df0de))return{};const _0x3ffeda=JSON[_0x2898cf(0x1ac)]((0x0,_0x1fa1f['readFileSync'])(_0x4df0de,_0x2898cf(0x15b))),_0x52ee04={};for(const [_0x30018c,_0x45ec30]of Object['entries'](_0x3ffeda&&typeof _0x3ffeda===_0x32e49a['MoZIP']?_0x3ffeda:{})){if(_0x32e49a[_0x2898cf(0x1bf)](typeof _0x45ec30,_0x2898cf(0x1b8))&&Object[_0x2898cf(0x192)][_0x2898cf(0x141)][_0x2898cf(0x14c)](exports[_0x2898cf(0x13d)],_0x45ec30))_0x52ee04[_0x30018c]=_0x45ec30;}return _0x52ee04;}function _0x4e01c8(_0x3eeb32,_0x53d3d0){const _0x37e8db=_0x52bd1d,_0x3f8b94=_0x445f7f();if(_0x53d3d0)_0x3f8b94[_0x3eeb32]=_0x53d3d0;else{if(_0x3eeb32 in _0x3f8b94)delete _0x3f8b94[_0x3eeb32];else return;}(0x0,_0x1fa1f['mkdirSync'])(_0x447412(),{'recursive':!![],'mode':0x1c0}),_0x2cd43f((0x0,_0x4c2d44[_0x37e8db(0x15d)])(_0x447412(),_0x23a586),JSON[_0x37e8db(0x182)](_0x3f8b94,null,0x2));}function _0x333dc8(_0x356b39,_0x5a97cc){const _0xad84be=_0x52bd1d,_0x336791={'bayJw':function(_0x57ccc4){return _0x57ccc4();}};_0x336791[_0xad84be(0x1a4)](_0x5b1ca9),_0x332f1f(()=>_0x4e01c8(_0x356b39,_0x5a97cc));}function _0x338280(_0x5c7a0b){const _0x30cff5=_0x52bd1d,_0x2c9199={'jBOTy':_0x30cff5(0x196),'iXORr':'no_sites'},_0x4b6a96=_0x1ead4f();if(!Object['prototype'][_0x30cff5(0x141)][_0x30cff5(0x14c)](_0x4b6a96,_0x5c7a0b))return{'status':_0x2c9199[_0x30cff5(0x1c5)]};const _0x5a488f=_0x270bcf()[_0x5c7a0b]??[];if(!_0x5a488f[_0x30cff5(0x132)])return{'status':_0x2c9199[_0x30cff5(0x1a9)]};const _0xec08b1=_0x445f7f()[_0x5c7a0b];return{'status':'ok','value':_0x4b6a96[_0x5c7a0b],'sites':_0x5a488f,..._0xec08b1&&{'humanStep':exports[_0x30cff5(0x13d)][_0xec08b1]}};}function _0x5533c7(){const _0x1a767f=_0x52bd1d,_0x568883={'KniBC':function(_0x1d7adc){return _0x1d7adc();}};return Object[_0x1a767f(0x17b)](_0x568883[_0x1a767f(0x17d)](_0x1ead4f));}const _0x1dca32=_0x52bd1d(0x163);function _0x193165(){const _0x47f63e=_0x52bd1d,_0x5b4ea8=process.env.FB_PROFILE;if(!_0x5b4ea8)return _0x1dca32;if(!/^[a-z0-9-]{1,32}$/['test'](_0x5b4ea8))throw new _0x4a8b62(_0x47f63e(0x1ae)+JSON[_0x47f63e(0x182)](_0x5b4ea8)+')');return _0x47f63e(0x14d)+_0x5b4ea8+_0x47f63e(0x180);}function _0x2888e7(_0x476e0b){const _0x534e1e=_0x52bd1d;if(_0x476e0b[_0x534e1e(0x1e3)]('{')){const _0x416e22=JSON[_0x534e1e(0x1ac)](_0x476e0b);return{'jwt':_0x416e22[_0x534e1e(0x18d)],'refresh':_0x416e22['refresh']??null};}return{'jwt':_0x476e0b,'refresh':null};}function _0x1da34f(_0x4fb465){const _0x581919=_0x52bd1d,_0x567010={'HwMOW':function(_0x1f5af7){return _0x1f5af7();},'LnZeO':_0x581919(0x15b),'fAeyj':function(_0x52b0e1){return _0x52b0e1();},'LASwN':function(_0x317b3f,_0x3ea950){return _0x317b3f(_0x3ea950);}},_0x3af03e=(0x0,_0x4c2d44[_0x581919(0x15d)])(_0x3904e0(_0x4fb465),_0x567010['HwMOW'](_0x193165));if(!(0x0,_0x1fa1f[_0x581919(0x167)])(_0x3af03e))return null;const _0x56b3c6=_0x586e3b((0x0,_0x1fa1f[_0x581919(0x169)])(_0x3af03e,_0x567010[_0x581919(0x142)])[_0x581919(0x1c6)](),_0x567010[_0x581919(0x1cc)](_0x5b1ca9));return _0x56b3c6?_0x567010[_0x581919(0x14e)](_0x2888e7,_0x56b3c6):null;}function _0x3b5dc4(_0x24b063,_0x54fa39){const _0x5344c8=_0x52bd1d,_0x1a7f82={'qfUxS':function(_0x5d671e,_0x4aacda){return _0x5d671e(_0x4aacda);},'qCqUq':function(_0x48c06f,_0x514c81){return _0x48c06f(_0x514c81);}},_0x576198=_0x1a7f82[_0x5344c8(0x197)](_0x3904e0,_0x24b063);_0x1a7f82[_0x5344c8(0x1c4)](_0x559d4b,_0x576198),_0x2cd43f((0x0,_0x4c2d44[_0x5344c8(0x15d)])(_0x576198,_0x193165()),_0x3413af(JSON[_0x5344c8(0x182)]({'jwt':_0x54fa39[_0x5344c8(0x18d)],'refresh':_0x54fa39[_0x5344c8(0x1d8)]}),_0x5b1ca9()));}function _0x5749e8(_0x4292b5){const _0x2e0e99=_0x52bd1d,_0x52458f={'aDPtT':function(_0x144414,_0x1c355a){return _0x144414(_0x1c355a);}},_0x124407=(0x0,_0x4c2d44[_0x2e0e99(0x15d)])(_0x52458f[_0x2e0e99(0x1d2)](_0x3904e0,_0x4292b5),_0x193165());if((0x0,_0x1fa1f['existsSync'])(_0x124407))(0x0,_0x1fa1f['unlinkSync'])(_0x124407);}function _0x25da92(_0x3603d8,_0x34585f,_0xafa6a8){const _0x177ac4=_0x52bd1d,_0xdb211c={'vWoqf':function(_0x4c9f55,_0x29fc85){return _0x4c9f55 in _0x29fc85;},'skWjT':function(_0x295ab2,_0x3a3278){return _0x295ab2!==_0x3a3278;}},_0x4060e2={..._0x3603d8},_0x364b39=[];for(const [_0x3ae9cf,_0x391070]of Object['entries'](_0x34585f)){if(!_0xdb211c[_0x177ac4(0x1b3)](_0x3ae9cf,_0x4060e2)||_0x4060e2[_0x3ae9cf]===_0x391070){_0x4060e2[_0x3ae9cf]=_0x391070;continue;}let _0x523518=_0x3ae9cf+'@'+_0xafa6a8;for(let _0x3a0bbf=0x2;_0x523518 in _0x4060e2&&_0xdb211c['skWjT'](_0x4060e2[_0x523518],_0x391070);_0x3a0bbf++)_0x523518=_0x3ae9cf+'@'+_0xafa6a8+'#'+_0x3a0bbf;_0x4060e2[_0x523518]=_0x391070,_0x364b39[_0x177ac4(0x174)](_0x3ae9cf);}return{'merged':_0x4060e2,'conflicts':_0x364b39};}function _0x575c3b(_0x493050){const _0x35f331=_0x52bd1d,_0x4effcd=new Set(_0x493050),_0x4b3adf=_0x493050[_0x35f331(0x1b7)](_0x236b67=>_0x236b67[_0x35f331(0x191)](0x0,Math[_0x35f331(0x148)](_0x236b67[_0x35f331(0x194)]('@'),0x0)))['filter'](_0x291b20=>_0x291b20&&_0x4effcd[_0x35f331(0x1e0)](_0x291b20));return[...new Set(_0x4b3adf)];}function _0x1b2fc1(_0x5b976f){const _0x58627e=_0x52bd1d,_0x126073={'yBEiO':_0x58627e(0x15b),'qJqwE':function(_0x2a008e,_0xfdce32){return _0x2a008e(_0xfdce32);},'KQwOK':function(_0x2697ee,_0x126fa8,_0x544192){return _0x2697ee(_0x126fa8,_0x544192);},'Ughyr':function(_0x58b90d){return _0x58b90d();},'ilmsM':function(_0x9cc2b5,_0x1953f4){return _0x9cc2b5!==_0x1953f4;},'ADNDC':function(_0x332e04,_0x1c393b){return _0x332e04(_0x1c393b);},'NvGJK':_0x58627e(0x199)},_0x1853f3=_0x3904e0(_0x5b976f),_0x2bb6a1=(0x0,_0x4c2d44[_0x58627e(0x15d)])(_0x1853f3,_0x58627e(0x14a));if(!(0x0,_0x1fa1f[_0x58627e(0x167)])(_0x2bb6a1))return{'migrated':![],'conflicts':[]};return _0x5b1ca9(),_0x332f1f(()=>{const _0x5ad93f=_0x58627e;if(!(0x0,_0x1fa1f[_0x5ad93f(0x167)])(_0x2bb6a1))return{'migrated':![],'conflicts':[]};const _0x159dd2=_0x1f59ef((0x0,_0x1fa1f[_0x5ad93f(0x169)])(_0x2bb6a1,_0x126073[_0x5ad93f(0x1a6)])[_0x5ad93f(0x1c6)]()),_0x16b9bb=(0x0,_0x4c2d44[_0x5ad93f(0x15d)])(_0x1853f3,_0x2a1439),_0x313dfb=_0x17340b(_0x16b9bb,_0x159dd2)['secrets'],_0x63f845=(0x0,_0x4c2d44[_0x5ad93f(0x15d)])(_0x1853f3,_0x1dca32),_0x2dd309=(0x0,_0x1fa1f[_0x5ad93f(0x167)])(_0x63f845)?_0x586e3b((0x0,_0x1fa1f[_0x5ad93f(0x169)])(_0x63f845,_0x126073[_0x5ad93f(0x1a6)])[_0x5ad93f(0x1c6)](),_0x159dd2):null,_0x5952b3=_0x2e817c(),{merged:_0x2fa33b,conflicts:_0x56a0ed}=_0x25da92(_0x5952b3[_0x5ad93f(0x1d0)],_0x313dfb,_0x5b976f);_0x126073[_0x5ad93f(0x156)](_0x4bc4e7,{'secrets':_0x2fa33b,'human':_0x5952b3[_0x5ad93f(0x13c)]});if(_0x2dd309)_0x126073[_0x5ad93f(0x17e)](_0x3b5dc4,_0x5b976f,_0x2888e7(_0x2dd309));const _0x5e244c=_0x126073['Ughyr'](_0x1ead4f);for(const [_0x5e5668,_0xfde378]of Object[_0x5ad93f(0x157)](_0x2fa33b)){if(_0x5e244c[_0x5e5668]!==_0xfde378)throw new Error(_0x5ad93f(0x1b6)+_0x5e5668+_0x5ad93f(0x155));}if(_0x2dd309&&_0x126073[_0x5ad93f(0x15e)](JSON[_0x5ad93f(0x182)](_0x126073[_0x5ad93f(0x156)](_0x1da34f,_0x5b976f)),JSON[_0x5ad93f(0x182)](_0x126073[_0x5ad93f(0x1ad)](_0x2888e7,_0x2dd309))))throw new Error(_0x126073['NvGJK']);if((0x0,_0x1fa1f[_0x5ad93f(0x167)])(_0x16b9bb))(0x0,_0x1fa1f[_0x5ad93f(0x184)])(_0x16b9bb);return(0x0,_0x1fa1f['unlinkSync'])(_0x2bb6a1),{'migrated':!![],'conflicts':_0x56a0ed};});}
|